From ed444b0615078266120f78cc6a9e02d5ff2d823a Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 21 Nov 2024 15:04:10 +0800 Subject: [PATCH] feature!: This is a breaking change needed to fully implement instancing and stencil highlighting. Previously, users would work directly with entities (on the Dart side, ThermionEntity), e.g. final entity = await viewer.loadGlb("some.glb"); However, Filament "entities" are a lower-level abstraction. Loading a glTF file, for example, inserts multiple entities into the scene. For example, each mesh, light, and camera within a glTF asset will be assigned an entity. A top-level (non-renderable) entity will also be created for the glTF asset, which can be used to transform the entire hierarchy. "Asset" is a better representation for loading/inserting objects into the scene; think of this as a bundle of entities. Unless you need to work directly with transforms, instancing, materials and renderables, you can work directly with ThermionAsset. --- examples/flutter/materials/.gitignore | 45 + examples/flutter/materials/.metadata | 30 + examples/flutter/materials/README.md | 16 + .../flutter/materials/analysis_options.yaml | 28 + examples/flutter/materials/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../materials/ios/Flutter/Debug.xcconfig | 2 + .../materials/ios/Flutter/Release.xcconfig | 2 + examples/flutter/materials/ios/Podfile | 44 + examples/flutter/materials/ios/Podfile.lock | 22 + .../ios/Runner.xcodeproj/project.pbxproj | 716 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../materials/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../flutter/materials/ios/Runner/Info.plist | 49 + .../ios/Runner/Runner-Bridging-Header.h | 1 + .../ios/RunnerTests/RunnerTests.swift | 12 + examples/flutter/materials/lib/main.dart | 80 + examples/flutter/materials/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 2 + .../macos/Flutter/Flutter-Release.xcconfig | 2 + .../Flutter/GeneratedPluginRegistrant.swift | 12 + examples/flutter/materials/macos/Podfile | 43 + examples/flutter/materials/macos/Podfile.lock | 22 + .../macos/Runner.xcodeproj/project.pbxproj | 805 ++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../materials/macos/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 343 ++ .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + .../flutter/materials/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../macos/Runner/Release.entitlements | 8 + .../macos/Runner/RunnerDebug.entitlements | 8 + .../macos/RunnerTests/RunnerTests.swift | 12 + examples/flutter/materials/pubspec.yaml | 40 + .../flutter/materials/test/widget_test.dart | 30 + materials/grid.mat | 12 +- materials/unlit_fixed_size.mat | 6 +- thermion_dart/ffigen/native.yaml | 14 +- thermion_dart/lib/src/input/input.dart | 2 + .../src/input/src/delegate_input_handler.dart | 13 +- .../lib/src/input/src/delegates.dart | 1 + .../default_pick_delegate.dart | 15 +- .../free_flight_camera_delegate.dart | 17 +- .../implementations/gizmo_input_handler.dart | 238 + .../implementations/gizmo_pick_delegate.dart | 41 + .../picking_camera_gesture_handler.dart | 487 +- thermion_dart/lib/src/utils/src/axis.dart | 33 +- thermion_dart/lib/src/utils/src/gizmo.dart | 191 +- thermion_dart/lib/src/viewer/src/events.dart | 85 - .../lib/src/viewer/src/ffi/src/ffi_asset.dart | 186 + .../src/viewer/src/ffi/src/ffi_camera.dart | 5 +- .../lib/src/viewer/src/ffi/src/ffi_gizmo.dart | 89 +- .../src/ffi/src/ffi_material_instance.dart | 116 + .../lib/src/viewer/src/ffi/src/ffi_view.dart | 15 +- .../viewer/src/ffi/src/thermion_dart.g.dart | 2427 +++++----- .../src/ffi/src/thermion_viewer_ffi.dart | 761 ++-- .../src/viewer/src/shared_types/entities.dart | 76 +- .../src/viewer/src/shared_types/material.dart | 104 +- .../lib/src/viewer/src/shared_types/view.dart | 4 +- .../src/viewer/src/thermion_viewer_base.dart | 239 +- .../src/viewer/src/thermion_viewer_stub.dart | 380 +- .../src/web_wasm/src/material_instance.dart | 71 +- .../native/include/FilamentViewer.hpp | 14 +- thermion_dart/native/include/Gizmo.hpp | 111 - .../{ThermionDartAPIUtils.h => MathUtils.hpp} | 2 +- thermion_dart/native/include/SceneManager.hpp | 365 -- thermion_dart/native/include/TGizmo.h | 18 - .../native/include/TMaterialInstance.h | 78 - thermion_dart/native/include/TSceneManager.h | 54 - .../native/include/ThermionDartApi.h | 216 - .../include/ThermionDartRenderThreadApi.h | 116 - .../native/include/UnprojectTexture.hpp | 2 +- .../include/{ => c_api}/APIBoundaryTypes.h | 10 +- .../native/include/{ => c_api}/APIExport.h | 0 .../native/include/c_api/TAnimationManager.h | 136 + .../native/include/{ => c_api}/TCamera.h | 0 thermion_dart/native/include/c_api/TGizmo.h | 25 + .../native/include/c_api/TMaterialInstance.h | 103 + .../native/include/c_api/TMaterialProvider.h | 14 + .../include/c_api/TNameComponentManager.h | 16 + .../native/include/c_api/TRenderableManager.h | 17 + .../native/include/c_api/TSceneAsset.h | 27 + .../native/include/c_api/TSceneManager.h | 66 + .../native/include/c_api/TTransformManager.h | 23 + .../native/include/{ => c_api}/TView.h | 8 +- .../native/include/c_api/ThermionDartApi.h | 115 + .../c_api/ThermionDartRenderThreadApi.h | 115 + .../components/AnimationComponentManager.hpp | 11 +- thermion_dart/native/include/material/grid.S | 2 +- .../native/include/material/grid.apple.S | 2 +- .../native/include/material/grid.bin | Bin 43432 -> 44564 bytes thermion_dart/native/include/material/grid.c | 3903 +++++++++-------- .../include/material/unlit_fixed_size.S | 2 +- .../include/material/unlit_fixed_size.apple.S | 2 +- .../include/material/unlit_fixed_size.bin | Bin 39924 -> 41110 bytes .../include/material/unlit_fixed_size.c | 3499 +++++++-------- .../native/include/scene/AnimationManager.hpp | 172 + .../include/{ => scene}/CustomGeometry.hpp | 6 +- .../include/scene/GeometrySceneAsset.hpp | 143 + .../scene/GeometrySceneAssetBuilder.hpp | 308 ++ thermion_dart/native/include/scene/Gizmo.hpp | 201 + .../native/include/scene/GizmoSceneAsset.hpp | 0 .../native/include/scene/GltfSceneAsset.hpp | 163 + .../include/scene/GltfSceneAssetInstance.hpp | 143 + .../include/{ => scene}/GridOverlay.hpp | 0 .../native/include/scene/SceneAsset.hpp | 53 + .../native/include/scene/SceneManager.hpp | 350 ++ thermion_dart/native/src/FilamentViewer.cpp | 49 +- thermion_dart/native/src/Gizmo.cpp | 345 -- thermion_dart/native/src/GridOverlay.cpp | 346 +- thermion_dart/native/src/HighlightOverlay.cpp | 292 +- thermion_dart/native/src/SceneManager.cpp | 2584 ----------- thermion_dart/native/src/TGizmo.cpp | 31 - .../native/src/TMaterialInstance.cpp | 57 - thermion_dart/native/src/TSceneManager.cpp | 140 - thermion_dart/native/src/ThermionDartApi.cpp | 952 ---- thermion_dart/native/src/UnprojectTexture.cpp | 2 +- .../native/src/c_api/TAnimationManager.cpp | 300 ++ .../native/src/{ => c_api}/TCamera.cpp | 8 +- thermion_dart/native/src/c_api/TGizmo.cpp | 41 + .../native/src/c_api/TMaterialInstance.cpp | 136 + .../native/src/c_api/TMaterialProvider.cpp | 57 + .../src/c_api/TNameComponentManager.cpp | 20 + .../native/src/c_api/TRenderableManager.cpp | 44 + .../native/src/c_api/TSceneAsset.cpp | 108 + .../native/src/c_api/TSceneManager.cpp | 219 + .../native/src/c_api/TTransformManager.cpp | 155 + .../native/src/{ => c_api}/TView.cpp | 23 +- .../native/src/c_api/ThermionDartApi.cpp | 511 +++ .../ThermionDartRenderThreadApi.cpp | 380 +- .../native/src/scene/AnimationManager.cpp | 521 +++ .../native/src/{ => scene}/CustomGeometry.cpp | 6 +- .../native/src/scene/GeometrySceneAsset.cpp | 125 + thermion_dart/native/src/scene/Gizmo.cpp | 367 ++ .../native/src/scene/GltfSceneAsset.cpp | 61 + .../src/scene/GltfSceneAssetInstance.cpp | 14 + .../native/src/scene/RotationGizmo.cpp | 349 ++ .../native/src/scene/SceneManager.cpp | 946 ++++ thermion_dart/test/animation_tests.dart | 29 +- thermion_dart/test/camera_tests.dart | 400 +- thermion_dart/test/geometry_tests.dart | 279 +- thermion_dart/test/gizmo_tests.dart | 309 +- thermion_dart/test/gltf_tests.dart | 101 +- thermion_dart/test/helpers.dart | 47 +- thermion_dart/test/material_tests.dart | 509 +-- thermion_dart/test/overlay_tests.dart | 268 ++ .../lib/src/thermion_flutter_plugin.dart | 2 + .../widgets/src/thermion_listener_widget.dart | 38 +- .../thermion_flutter/test/Makefile | 10 - .../thermion_flutter/test/cpp/test.cpp | 94 - .../test/frustum_unit_test.dart | 66 - 195 files changed, 18061 insertions(+), 12628 deletions(-) create mode 100644 examples/flutter/materials/.gitignore create mode 100644 examples/flutter/materials/.metadata create mode 100644 examples/flutter/materials/README.md create mode 100644 examples/flutter/materials/analysis_options.yaml create mode 100644 examples/flutter/materials/ios/.gitignore create mode 100644 examples/flutter/materials/ios/Flutter/AppFrameworkInfo.plist create mode 100644 examples/flutter/materials/ios/Flutter/Debug.xcconfig create mode 100644 examples/flutter/materials/ios/Flutter/Release.xcconfig create mode 100644 examples/flutter/materials/ios/Podfile create mode 100644 examples/flutter/materials/ios/Podfile.lock create mode 100644 examples/flutter/materials/ios/Runner.xcodeproj/project.pbxproj create mode 100644 examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 examples/flutter/materials/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 examples/flutter/materials/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 examples/flutter/materials/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 examples/flutter/materials/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 examples/flutter/materials/ios/Runner/AppDelegate.swift create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 examples/flutter/materials/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 examples/flutter/materials/ios/Runner/Base.lproj/Main.storyboard create mode 100644 examples/flutter/materials/ios/Runner/Info.plist create mode 100644 examples/flutter/materials/ios/Runner/Runner-Bridging-Header.h create mode 100644 examples/flutter/materials/ios/RunnerTests/RunnerTests.swift create mode 100644 examples/flutter/materials/lib/main.dart create mode 100644 examples/flutter/materials/macos/.gitignore create mode 100644 examples/flutter/materials/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 examples/flutter/materials/macos/Flutter/Flutter-Release.xcconfig create mode 100644 examples/flutter/materials/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 examples/flutter/materials/macos/Podfile create mode 100644 examples/flutter/materials/macos/Podfile.lock create mode 100644 examples/flutter/materials/macos/Runner.xcodeproj/project.pbxproj create mode 100644 examples/flutter/materials/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 examples/flutter/materials/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 examples/flutter/materials/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 examples/flutter/materials/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 examples/flutter/materials/macos/Runner/AppDelegate.swift create mode 100644 examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 examples/flutter/materials/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 examples/flutter/materials/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 examples/flutter/materials/macos/Runner/Configs/Debug.xcconfig create mode 100644 examples/flutter/materials/macos/Runner/Configs/Release.xcconfig create mode 100644 examples/flutter/materials/macos/Runner/Configs/Warnings.xcconfig create mode 100644 examples/flutter/materials/macos/Runner/DebugProfile.entitlements create mode 100644 examples/flutter/materials/macos/Runner/Info.plist create mode 100644 examples/flutter/materials/macos/Runner/MainFlutterWindow.swift create mode 100644 examples/flutter/materials/macos/Runner/Release.entitlements create mode 100644 examples/flutter/materials/macos/Runner/RunnerDebug.entitlements create mode 100644 examples/flutter/materials/macos/RunnerTests/RunnerTests.swift create mode 100644 examples/flutter/materials/pubspec.yaml create mode 100644 examples/flutter/materials/test/widget_test.dart create mode 100644 thermion_dart/lib/src/input/src/implementations/gizmo_input_handler.dart create mode 100644 thermion_dart/lib/src/input/src/implementations/gizmo_pick_delegate.dart delete mode 100644 thermion_dart/lib/src/viewer/src/events.dart create mode 100644 thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart create mode 100644 thermion_dart/lib/src/viewer/src/ffi/src/ffi_material_instance.dart delete mode 100644 thermion_dart/native/include/Gizmo.hpp rename thermion_dart/native/include/{ThermionDartAPIUtils.h => MathUtils.hpp} (96%) delete mode 100644 thermion_dart/native/include/SceneManager.hpp delete mode 100644 thermion_dart/native/include/TGizmo.h delete mode 100644 thermion_dart/native/include/TMaterialInstance.h delete mode 100644 thermion_dart/native/include/TSceneManager.h delete mode 100644 thermion_dart/native/include/ThermionDartApi.h delete mode 100644 thermion_dart/native/include/ThermionDartRenderThreadApi.h rename thermion_dart/native/include/{ => c_api}/APIBoundaryTypes.h (83%) rename thermion_dart/native/include/{ => c_api}/APIExport.h (100%) create mode 100644 thermion_dart/native/include/c_api/TAnimationManager.h rename thermion_dart/native/include/{ => c_api}/TCamera.h (100%) create mode 100644 thermion_dart/native/include/c_api/TGizmo.h create mode 100644 thermion_dart/native/include/c_api/TMaterialInstance.h create mode 100644 thermion_dart/native/include/c_api/TMaterialProvider.h create mode 100644 thermion_dart/native/include/c_api/TNameComponentManager.h create mode 100644 thermion_dart/native/include/c_api/TRenderableManager.h create mode 100644 thermion_dart/native/include/c_api/TSceneAsset.h create mode 100644 thermion_dart/native/include/c_api/TSceneManager.h create mode 100644 thermion_dart/native/include/c_api/TTransformManager.h rename thermion_dart/native/include/{ => c_api}/TView.h (80%) create mode 100644 thermion_dart/native/include/c_api/ThermionDartApi.h create mode 100644 thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h create mode 100644 thermion_dart/native/include/scene/AnimationManager.hpp rename thermion_dart/native/include/{ => scene}/CustomGeometry.hpp (90%) create mode 100644 thermion_dart/native/include/scene/GeometrySceneAsset.hpp create mode 100644 thermion_dart/native/include/scene/GeometrySceneAssetBuilder.hpp create mode 100644 thermion_dart/native/include/scene/Gizmo.hpp create mode 100644 thermion_dart/native/include/scene/GizmoSceneAsset.hpp create mode 100644 thermion_dart/native/include/scene/GltfSceneAsset.hpp create mode 100644 thermion_dart/native/include/scene/GltfSceneAssetInstance.hpp rename thermion_dart/native/include/{ => scene}/GridOverlay.hpp (100%) create mode 100644 thermion_dart/native/include/scene/SceneAsset.hpp create mode 100644 thermion_dart/native/include/scene/SceneManager.hpp delete mode 100644 thermion_dart/native/src/Gizmo.cpp delete mode 100644 thermion_dart/native/src/SceneManager.cpp delete mode 100644 thermion_dart/native/src/TGizmo.cpp delete mode 100644 thermion_dart/native/src/TMaterialInstance.cpp delete mode 100644 thermion_dart/native/src/TSceneManager.cpp delete mode 100644 thermion_dart/native/src/ThermionDartApi.cpp create mode 100644 thermion_dart/native/src/c_api/TAnimationManager.cpp rename thermion_dart/native/src/{ => c_api}/TCamera.cpp (97%) create mode 100644 thermion_dart/native/src/c_api/TGizmo.cpp create mode 100644 thermion_dart/native/src/c_api/TMaterialInstance.cpp create mode 100644 thermion_dart/native/src/c_api/TMaterialProvider.cpp create mode 100644 thermion_dart/native/src/c_api/TNameComponentManager.cpp create mode 100644 thermion_dart/native/src/c_api/TRenderableManager.cpp create mode 100644 thermion_dart/native/src/c_api/TSceneAsset.cpp create mode 100644 thermion_dart/native/src/c_api/TSceneManager.cpp create mode 100644 thermion_dart/native/src/c_api/TTransformManager.cpp rename thermion_dart/native/src/{ => c_api}/TView.cpp (85%) create mode 100644 thermion_dart/native/src/c_api/ThermionDartApi.cpp rename thermion_dart/native/src/{ => c_api}/ThermionDartRenderThreadApi.cpp (61%) create mode 100644 thermion_dart/native/src/scene/AnimationManager.cpp rename thermion_dart/native/src/{ => scene}/CustomGeometry.cpp (97%) create mode 100644 thermion_dart/native/src/scene/GeometrySceneAsset.cpp create mode 100644 thermion_dart/native/src/scene/Gizmo.cpp create mode 100644 thermion_dart/native/src/scene/GltfSceneAsset.cpp create mode 100644 thermion_dart/native/src/scene/GltfSceneAssetInstance.cpp create mode 100644 thermion_dart/native/src/scene/RotationGizmo.cpp create mode 100644 thermion_dart/native/src/scene/SceneManager.cpp create mode 100644 thermion_dart/test/overlay_tests.dart delete mode 100644 thermion_flutter/thermion_flutter/test/Makefile delete mode 100644 thermion_flutter/thermion_flutter/test/cpp/test.cpp delete mode 100644 thermion_flutter/thermion_flutter/test/frustum_unit_test.dart diff --git a/examples/flutter/materials/.gitignore b/examples/flutter/materials/.gitignore new file mode 100644 index 00000000..79c113f9 --- /dev/null +++ b/examples/flutter/materials/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/examples/flutter/materials/.metadata b/examples/flutter/materials/.metadata new file mode 100644 index 00000000..ea8b9bdd --- /dev/null +++ b/examples/flutter/materials/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "ebc80f01645db271fce658193c5101c9f93d5fb7" + channel: "master" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: ebc80f01645db271fce658193c5101c9f93d5fb7 + base_revision: ebc80f01645db271fce658193c5101c9f93d5fb7 + - platform: ios + create_revision: ebc80f01645db271fce658193c5101c9f93d5fb7 + base_revision: ebc80f01645db271fce658193c5101c9f93d5fb7 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/examples/flutter/materials/README.md b/examples/flutter/materials/README.md new file mode 100644 index 00000000..c9338f30 --- /dev/null +++ b/examples/flutter/materials/README.md @@ -0,0 +1,16 @@ +# materials + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/examples/flutter/materials/analysis_options.yaml b/examples/flutter/materials/analysis_options.yaml new file mode 100644 index 00000000..0d290213 --- /dev/null +++ b/examples/flutter/materials/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/examples/flutter/materials/ios/.gitignore b/examples/flutter/materials/ios/.gitignore new file mode 100644 index 00000000..7a7f9873 --- /dev/null +++ b/examples/flutter/materials/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/examples/flutter/materials/ios/Flutter/AppFrameworkInfo.plist b/examples/flutter/materials/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..7c569640 --- /dev/null +++ b/examples/flutter/materials/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/examples/flutter/materials/ios/Flutter/Debug.xcconfig b/examples/flutter/materials/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..ec97fc6f --- /dev/null +++ b/examples/flutter/materials/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/examples/flutter/materials/ios/Flutter/Release.xcconfig b/examples/flutter/materials/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..c4855bfe --- /dev/null +++ b/examples/flutter/materials/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/examples/flutter/materials/ios/Podfile b/examples/flutter/materials/ios/Podfile new file mode 100644 index 00000000..3e44f9c6 --- /dev/null +++ b/examples/flutter/materials/ios/Podfile @@ -0,0 +1,44 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/examples/flutter/materials/ios/Podfile.lock b/examples/flutter/materials/ios/Podfile.lock new file mode 100644 index 00000000..81dd9d63 --- /dev/null +++ b/examples/flutter/materials/ios/Podfile.lock @@ -0,0 +1,22 @@ +PODS: + - Flutter (1.0.0) + - thermion_flutter (0.0.1): + - Flutter + +DEPENDENCIES: + - Flutter (from `Flutter`) + - thermion_flutter (from `.symlinks/plugins/thermion_flutter/ios`) + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + thermion_flutter: + :path: ".symlinks/plugins/thermion_flutter/ios" + +SPEC CHECKSUMS: + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + thermion_flutter: c965e09831858465a1a8df59ff97e40a4d002773 + +PODFILE CHECKSUM: a57f30d18f102dd3ce366b1d62a55ecbef2158e5 + +COCOAPODS: 1.15.2 diff --git a/examples/flutter/materials/ios/Runner.xcodeproj/project.pbxproj b/examples/flutter/materials/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..538ec174 --- /dev/null +++ b/examples/flutter/materials/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,716 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3C05FC91532454752DA970A0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5D1C546FE645ECAEFCC54A0 /* Pods_RunnerTests.framework */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + BBAE6D8A5A4347F4A6C46C27 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 32F837C9C7BCEF0F9BDD5633 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 32F837C9C7BCEF0F9BDD5633 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 718EDC0EB4D77BC3F7C58668 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 791645A48DD58CAB499064BD /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B5390605A97C0B99644E446B /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + CB2AE1DE0697AD3A0D415EE3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + D392974F01D222426B15AB88 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + D5D1C546FE645ECAEFCC54A0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F03D0A570A764AA9BA0FF638 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BBAE6D8A5A4347F4A6C46C27 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B821284C38801A1A220E3CA6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3C05FC91532454752DA970A0 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 8499E090CD1D69ED5EB6B7D5 /* Pods */ = { + isa = PBXGroup; + children = ( + CB2AE1DE0697AD3A0D415EE3 /* Pods-Runner.debug.xcconfig */, + D392974F01D222426B15AB88 /* Pods-Runner.release.xcconfig */, + 791645A48DD58CAB499064BD /* Pods-Runner.profile.xcconfig */, + 718EDC0EB4D77BC3F7C58668 /* Pods-RunnerTests.debug.xcconfig */, + F03D0A570A764AA9BA0FF638 /* Pods-RunnerTests.release.xcconfig */, + B5390605A97C0B99644E446B /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + 8499E090CD1D69ED5EB6B7D5 /* Pods */, + A94F247D0AAA80B7038EDE79 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + A94F247D0AAA80B7038EDE79 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 32F837C9C7BCEF0F9BDD5633 /* Pods_Runner.framework */, + D5D1C546FE645ECAEFCC54A0 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + DC5ACE78AE5F40133D2811FB /* [CP] Check Pods Manifest.lock */, + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + B821284C38801A1A220E3CA6 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 7EEC0B02EC9E3180CDAD2A79 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 7EEC0B02EC9E3180CDAD2A79 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + DC5ACE78AE5F40133D2811FB /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = TM2B4SJXNJ; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.materials; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 718EDC0EB4D77BC3F7C58668 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.materials.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F03D0A570A764AA9BA0FF638 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.materials.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B5390605A97C0B99644E446B /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.materials.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = TM2B4SJXNJ; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.materials; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = TM2B4SJXNJ; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.materials; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/examples/flutter/materials/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/examples/flutter/materials/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/flutter/materials/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..8e3ca5df --- /dev/null +++ b/examples/flutter/materials/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/flutter/materials/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/flutter/materials/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/examples/flutter/materials/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/flutter/materials/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/flutter/materials/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/examples/flutter/materials/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/flutter/materials/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/flutter/materials/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/examples/flutter/materials/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/examples/flutter/materials/ios/Runner/AppDelegate.swift b/examples/flutter/materials/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..62666446 --- /dev/null +++ b/examples/flutter/materials/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 zcmV;526g#~P){YQnis^a@{&-nmRmq)<&%Mztj67_#M}W?l>kYSliK<%xAp;0j{!}J0!o7b zE>q9${Lb$D&h7k=+4=!ek^n+`0zq>LL1O?lVyea53S5x`Nqqo2YyeuIrQrJj9XjOp z{;T5qbj3}&1vg1VK~#9!?b~^C5-}JC@Pyrv-6dSEqJqT}#j9#dJ@GzT@B8}x zU&J@bBI>f6w6en+CeI)3^kC*U?}X%OD8$Fd$H&LV$H&LV$H&LV#|K5~mLYf|VqzOc zkc7qL~0sOYuM{tG`rYEDV{DWY`Z8&)kW*hc2VkBuY+^Yx&92j&StN}Wp=LD zxoGxXw6f&8sB^u})h@b@z0RBeD`K7RMR9deyL(ZJu#39Z>rT)^>v}Khq8U-IbIvT> z?4pV9qGj=2)TNH3d)=De<+^w;>S7m_eFKTvzeaBeir45xY!^m!FmxnljbSS_3o=g( z->^wC9%qkR{kbGnW8MfFew_o9h3(r55Is`L$8KI@d+*%{=Nx+FXJ98L0PjFIu;rGnnfY zn1R5Qnp<{Jq0M1vX=X&F8gtLmcWv$1*M@4ZfF^9``()#hGTeKeP`1!iED ztNE(TN}M5}3Bbc*d=FIv`DNv&@|C6yYj{sSqUj5oo$#*0$7pu|Dd2TLI>t5%I zIa4Dvr(iayb+5x=j*Vum9&irk)xV1`t509lnPO0%skL8_1c#Xbamh(2@f?4yUI zhhuT5<#8RJhGz4%b$`PJwKPAudsm|at?u;*hGgnA zU1;9gnxVBC)wA(BsB`AW54N{|qmikJR*%x0c`{LGsSfa|NK61pYH(r-UQ4_JXd!Rsz)=k zL{GMc5{h138)fF5CzHEDM>+FqY)$pdN3}Ml+riTgJOLN0F*Vh?{9ESR{SVVg>*>=# zix;VJHPtvFFCRY$Ks*F;VX~%*r9F)W`PmPE9F!(&s#x07n2<}?S{(ygpXgX-&B&OM zONY&BRQ(#%0%jeQs?oJ4P!p*R98>qCy5p8w>_gpuh39NcOlp)(wOoz0sY-Qz55eB~ z7OC-fKBaD1sE3$l-6QgBJO!n?QOTza`!S_YK z_v-lm^7{VO^8Q@M_^8F)09Ki6%=s?2_5eupee(w1FB%aqSweusQ-T+CH0Xt{` zFjMvW{@C&TB)k25()nh~_yJ9coBRL(0oO@HK~z}7?bm5j;y@69;bvlHb2tf!$ReA~x{22wTq550 z?f?Hnw(;m3ip30;QzdV~7pi!wyMYhDtXW#cO7T>|f=bdFhu+F!zMZ2UFj;GUKX7tI z;hv3{q~!*pMj75WP_c}>6)IWvg5_yyg<9Op()eD1hWC19M@?_9_MHec{Z8n3FaF{8 z;u`Mw0ly(uE>*CgQYv{be6ab2LWhlaH1^iLIM{olnag$78^Fd}%dR7;JECQ+hmk|o z!u2&!3MqPfP5ChDSkFSH8F2WVOEf0(E_M(JL17G}Y+fg0_IuW%WQ zG(mG&u?|->YSdk0;8rc{yw2@2Z&GA}z{Wb91Ooz9VhA{b2DYE7RmG zjL}?eq#iX%3#k;JWMx_{^2nNax`xPhByFiDX+a7uTGU|otOvIAUy|dEKkXOm-`aWS z27pUzD{a)Ct<6p{{3)+lq@i`t@%>-wT4r?*S}k)58e09WZYP0{{R3FC5Sl00039P)t-s|Ns9~ z#rP?<_5oL$Q^olD{r_0T`27C={r>*`|Nj71npVa5OTzc(_WfbW_({R{p56NV{r*M2 z_xt?)2V0#0NsfV0u>{42ctGP(8vQj-Btk1n|O0ZD=YLwd&R{Ko41Gr9H= zY@z@@bOAMB5Ltl$E>bJJ{>JP30ZxkmI%?eW{k`b?Wy<&gOo;dS`~CR$Vwb@XWtR|N zi~t=w02?-0&j0TD{>bb6sNwsK*!p?V`RMQUl(*DVjk-9Cx+-z1KXab|Ka2oXhX5f% z`$|e!000AhNklrxs)5QTeTVRiEmz~MKK1WAjCw(c-JK6eox;2O)?`? zTG`AHia671e^vgmp!llKp|=5sVHk#C7=~epA~VAf-~%aPC=%Qw01h8mnSZ|p?hz91 z7p83F3%LVu9;S$tSI$C^%^yud1dfTM_6p2|+5Ejp$bd`GDvbR|xit>i!ZD&F>@CJrPmu*UjD&?DfZs=$@e3FQA(vNiU+$A*%a} z?`XcG2jDxJ_ZQ#Md`H{4Lpf6QBDp81_KWZ6Tk#yCy1)32zO#3<7>b`eT7UyYH1eGz z;O(rH$=QR*L%%ZcBpc=eGua?N55nD^K(8<#gl2+pN_j~b2MHs4#mcLmv%DkspS-3< zpI1F=^9siI0s-;IN_IrA;5xm~3?3!StX}pUv0vkxMaqm+zxrg7X7(I&*N~&dEd0kD z-FRV|g=|QuUsuh>-xCI}vD2imzYIOIdcCVV=$Bz@*u0+Bs<|L^)32nN*=wu3n%Ynw z@1|eLG>!8ruU1pFXUfb`j>(=Gy~?Rn4QJ-c3%3T|(Frd!bI`9u&zAnyFYTqlG#&J7 zAkD(jpw|oZLNiA>;>hgp1KX7-wxC~31II47gc zHcehD6Uxlf%+M^^uN5Wc*G%^;>D5qT{>=uxUhX%WJu^Z*(_Wq9y}npFO{Hhb>s6<9 zNi0pHXWFaVZnb)1+RS&F)xOv6&aeILcI)`k#0YE+?e)5&#r7J#c`3Z7x!LpTc01dx zrdC3{Z;joZ^KN&))zB_i)I9fWedoN>Zl-6_Iz+^G&*ak2jpF07*qoM6N<$f;w%0(f|Me literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 00000000..0bedcf2f --- /dev/null +++ b/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/examples/flutter/materials/ios/Runner/Base.lproj/LaunchScreen.storyboard b/examples/flutter/materials/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/examples/flutter/materials/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/flutter/materials/ios/Runner/Base.lproj/Main.storyboard b/examples/flutter/materials/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/examples/flutter/materials/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/flutter/materials/ios/Runner/Info.plist b/examples/flutter/materials/ios/Runner/Info.plist new file mode 100644 index 00000000..c8831e9b --- /dev/null +++ b/examples/flutter/materials/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Materials + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + materials + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/examples/flutter/materials/ios/Runner/Runner-Bridging-Header.h b/examples/flutter/materials/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/examples/flutter/materials/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/examples/flutter/materials/ios/RunnerTests/RunnerTests.swift b/examples/flutter/materials/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 00000000..86a7c3b1 --- /dev/null +++ b/examples/flutter/materials/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/examples/flutter/materials/lib/main.dart b/examples/flutter/materials/lib/main.dart new file mode 100644 index 00000000..183e8d27 --- /dev/null +++ b/examples/flutter/materials/lib/main.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:thermion_flutter/thermion_flutter.dart'; +import 'package:vector_math/vector_math_64.dart' hide Colors; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + useMaterial3: true, + ), + home: const MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({super.key, required this.title}); + + final String title; + + @override + State createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + ThermionViewer? _viewer; + late ThermionAsset _asset; + late MaterialInstance _materialInstance; + + @override + void initState() { + super.initState(); + ThermionFlutterPlugin.createViewer().then((viewer) async { + _viewer = viewer; + await _viewer!.setPostProcessing(true); + _materialInstance = await _viewer!.createUnlitMaterialInstance(); + _asset = await _viewer!.createGeometry( + GeometryHelper.cube(normals: false, uvs: false), + materialInstances: [_materialInstance]); + + await _viewer! + .setTransform(_asset.entity, Matrix4.translation(Vector3.all(2))); + await _materialInstance.setParameterFloat4( + "baseColorFactor", 0.0, 1.0, 0.0, 1.0); + await _viewer!.setCameraPosition(0, 0, 10); + await _viewer!.setRendering(true); + setState(() {}); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack(children: [ + if (_viewer == null) CircularProgressIndicator(), + if (_viewer != null) ...[ + Positioned.fill(child: ThermionWidget(viewer: _viewer!)), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: EdgeInsets.all(12), + child: ElevatedButton( + onPressed: () async { + await _materialInstance.setParameterFloat4( + "baseColorFactor", 1.0, 0.0, 0.0, 1.0); + }, + child: Text("Set material property (baseColorFactor)")))) + ] + ])); + } +} diff --git a/examples/flutter/materials/macos/.gitignore b/examples/flutter/materials/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/examples/flutter/materials/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/examples/flutter/materials/macos/Flutter/Flutter-Debug.xcconfig b/examples/flutter/materials/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..4b81f9b2 --- /dev/null +++ b/examples/flutter/materials/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/examples/flutter/materials/macos/Flutter/Flutter-Release.xcconfig b/examples/flutter/materials/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..5caa9d15 --- /dev/null +++ b/examples/flutter/materials/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/examples/flutter/materials/macos/Flutter/GeneratedPluginRegistrant.swift b/examples/flutter/materials/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..b6c27f96 --- /dev/null +++ b/examples/flutter/materials/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,12 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import thermion_flutter + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + SwiftThermionFlutterPlugin.register(with: registry.registrar(forPlugin: "SwiftThermionFlutterPlugin")) +} diff --git a/examples/flutter/materials/macos/Podfile b/examples/flutter/materials/macos/Podfile new file mode 100644 index 00000000..90de47d4 --- /dev/null +++ b/examples/flutter/materials/macos/Podfile @@ -0,0 +1,43 @@ +platform :osx, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/examples/flutter/materials/macos/Podfile.lock b/examples/flutter/materials/macos/Podfile.lock new file mode 100644 index 00000000..1a5a471c --- /dev/null +++ b/examples/flutter/materials/macos/Podfile.lock @@ -0,0 +1,22 @@ +PODS: + - FlutterMacOS (1.0.0) + - thermion_flutter (0.0.1): + - FlutterMacOS + +DEPENDENCIES: + - FlutterMacOS (from `Flutter/ephemeral`) + - thermion_flutter (from `Flutter/ephemeral/.symlinks/plugins/thermion_flutter/macos`) + +EXTERNAL SOURCES: + FlutterMacOS: + :path: Flutter/ephemeral + thermion_flutter: + :path: Flutter/ephemeral/.symlinks/plugins/thermion_flutter/macos + +SPEC CHECKSUMS: + FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 + thermion_flutter: debb51a861788780ce40e11e4400c2e5a8681fdf + +PODFILE CHECKSUM: 1888651be91a8ad58692c1add9ce24279fd4e950 + +COCOAPODS: 1.15.2 diff --git a/examples/flutter/materials/macos/Runner.xcodeproj/project.pbxproj b/examples/flutter/materials/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..99c43306 --- /dev/null +++ b/examples/flutter/materials/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,805 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 4AB4F40CC65F888819072BE6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C505FE3DB707C86AF9913AD7 /* Pods_Runner.framework */; }; + 93EC5655976CC7F426F62D89 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7814D0414F513654523B2A00 /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 2C4F4B405D8499A8F6230032 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* materials.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = materials.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7814D0414F513654523B2A00 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 800DCD12E68562D91EFF5505 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 83F145D8BF1F2C6749541C10 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 90485F2A7C8C5BA9B5A77138 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + AC490E258D1B51F762273BA7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + C505FE3DB707C86AF9913AD7 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DBC6BFDD2CF481FD0068AD10 /* RunnerDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerDebug.entitlements; sourceTree = ""; }; + E29213550CF19283101BE77B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 93EC5655976CC7F426F62D89 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4AB4F40CC65F888819072BE6 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2878036B528A06D7BA6D9105 /* Pods */ = { + isa = PBXGroup; + children = ( + 800DCD12E68562D91EFF5505 /* Pods-Runner.debug.xcconfig */, + 83F145D8BF1F2C6749541C10 /* Pods-Runner.release.xcconfig */, + AC490E258D1B51F762273BA7 /* Pods-Runner.profile.xcconfig */, + E29213550CF19283101BE77B /* Pods-RunnerTests.debug.xcconfig */, + 2C4F4B405D8499A8F6230032 /* Pods-RunnerTests.release.xcconfig */, + 90485F2A7C8C5BA9B5A77138 /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + 2878036B528A06D7BA6D9105 /* Pods */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* materials.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + DBC6BFDD2CF481FD0068AD10 /* RunnerDebug.entitlements */, + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C505FE3DB707C86AF9913AD7 /* Pods_Runner.framework */, + 7814D0414F513654523B2A00 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 39BE6D37AD0921325E489D79 /* [CP] Check Pods Manifest.lock */, + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 8F42C172EB7B29923C969BF6 /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + 22C42D8A22FF076B7FE135E1 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* materials.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 22C42D8A22FF076B7FE135E1 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; + 39BE6D37AD0921325E489D79 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 8F42C172EB7B29923C969BF6 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E29213550CF19283101BE77B /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.materials.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/materials.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/materials"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2C4F4B405D8499A8F6230032 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.materials.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/materials.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/materials"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 90485F2A7C8C5BA9B5A77138 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.materials.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/materials.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/materials"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 13.0; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/RunnerDebug.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 13.0; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 13.0; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/examples/flutter/materials/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/flutter/materials/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/examples/flutter/materials/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/flutter/materials/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/flutter/materials/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..1626a842 --- /dev/null +++ b/examples/flutter/materials/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/flutter/materials/macos/Runner.xcworkspace/contents.xcworkspacedata b/examples/flutter/materials/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/examples/flutter/materials/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/flutter/materials/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/flutter/materials/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/examples/flutter/materials/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/flutter/materials/macos/Runner/AppDelegate.swift b/examples/flutter/materials/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..b3c17614 --- /dev/null +++ b/examples/flutter/materials/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? zgxkP+ytd)OMWe7QvTf8yj4;V=?m172!BEt@6*TPUT4m3)yir}esnIodFGatGnsSfJ z**;;yw=1VCb2J|A7cBz-F5QFOQh2JDQFLarE>;4ZMzQ$s^)fOscIVv2-o{?ct3~Zv zy{0zU>3`+-PluS|ADraI9n~=3#Tvfx{pDr^5i$^-h5tL*CV@AeQFLxv4Y<$xI{9y< zZ}li*WIQ+XS!IK;?IVD0)C?pNBA(DMxqozMy1L#j+ba1Cd+2w&{^d-OEWSSHmNH>9 z%1Ldo(}5*>a8rjQF&@%Ka`-M|HM+m<^E#bJtVg&YM}uMb7UVJ|OVQI-zt-*BqQ zG&mq`Bn7EY;;+b%Obs9i{gC^%>kUz`{Qnc=ps7ra_UxEP$!?f&|5fHnU(rr?7?)D z$3m9e{&;Zu6yfa1ixTr;80IP7KLgkKCbgv1%f_weZK6b7tY+AS%fyjf6dR(wQa9TD zYG9`#!N4DqpMim|{uViKVf0B+Vmsr7p)Y+;*T~-2HFr!IOedrpiXXz+BDppd5BTf3 ztsg4U?0wR?9@~`iV*nwGmtYFGnq`X< zf?G%=o!t50?gk^qN#J(~!sxi=_yeg?Vio04*w<2iBT+NYX>V#CFuQGLsX^u8dPIkP zPraQK?ro`rqA4t7yUbGYk;pw6Z})Bv=!l-a5^R5Ra^TjoXI?=Qdup)rtyhwo<(c9_ zF>6P%-6Aqxb8gf?wY1z!4*hagIch)&A4treifFk=E9v@kRXyMm?V*~^LEu%Y%0u(| z52VvVF?P^D<|fG)_au(!iqo~1<5eF$Sc5?)*$4P3MAlSircZ|F+9T66-$)0VUD6>e zl2zlSl_QQ?>ULUA~H?QbWazYeh61%B!!u;c(cs`;J|l z=7?q+vo^T#kzddr>C;VZ5h*;De8^F2y{iA#9|(|5@zYh4^FZ-3r)xej=GghMN3K2Y z=(xE`TM%V8UHc4`6Cdhz4%i0OY^%DSguLUXQ?Y3LP+5x3jyN)-UDVhEC}AI5wImt; zHY|*=UW}^bS3va-@L$-fJz2P2LbCl)XybkY)p%2MjPJd-FzkdyWW~NBC@NlPJkz{v z+6k6#nif`E>>KCGaP34oY*c#nBFm#G8a0^px1S6mm6Cs+d}E8{J;DX=NEHb|{fZm0 z@Ors@ebTgbf^Jg&DzVS|h&Or)56$+;%&sh0)`&6VkS@QxQ=#6WxF5g+FWSr7Lp9uF zV#rc`yLe?f*u6oZoi3WpOkKFf^>lHb2GC6t!)dyGaQbK7&BNZ7oyP)hUX1Y(LdW-I z6LI2$i%+g!zsjT(5l}5ROLb)8`9kkldbklcq6tfLSrAyh#s(C1U2Sz9`h3#T9eX#Hryi1AU^!uv*&6I~qdM_B7-@`~8#O^jN&t7+S zTKI6;T$1@`Kky-;;$rU1*TdY;cUyg$JXalGc&3-Rh zJ&7kx=}~4lEx*%NUJA??g8eIeavDIDC7hTvojgRIT$=MlpU}ff0BTTTvjsZ0=wR)8 z?{xmc((XLburb0!&SA&fc%%46KU0e&QkA%_?9ZrZU%9Wt{*5DCUbqIBR%T#Ksp?)3 z%qL(XlnM!>F!=q@jE>x_P?EU=J!{G!BQq3k#mvFR%lJO2EU2M8egD?0r!2s*lL2Y} zdrmy`XvEarM&qTUz4c@>Zn}39Xi2h?n#)r3C4wosel_RUiL8$t;FSuga{9}-%FuOU z!R9L$Q!njtyY!^070-)|#E8My)w*~4k#hi%Y77)c5zfs6o(0zaj~nla0Vt&7bUqfD zrZmH~A50GOvk73qiyfXX6R9x3Qh)K=>#g^^D65<$5wbZjtrtWxfG4w1f<2CzsKj@e zvdsQ$$f6N=-%GJk~N7G(+-29R)Cbz8SIn_u|(VYVSAnlWZhPp8z6qm5=hvS$Y zULkbE?8HQ}vkwD!V*wW7BDBOGc|75qLVkyIWo~3<#nAT6?H_YSsvS+%l_X$}aUj7o z>A9&3f2i-`__#MiM#|ORNbK!HZ|N&jKNL<-pFkqAwuMJi=(jlv5zAN6EW`ex#;d^Z z<;gldpFcVD&mpfJ1d7><79BnCn~z8U*4qo0-{i@1$CCaw+<$T{29l1S2A|8n9ccx0!1Pyf;)aGWQ15lwEEyU35_Y zQS8y~9j9ZiByE-#BV7eknm>ba75<_d1^*% zB_xp#q`bpV1f9o6C(vbhN((A-K+f#~3EJtjWVhRm+g$1$f2scX!eZkfa%EIZd2ZVG z6sbBo@~`iwZQC4rH9w84rlHjd!|fHc9~12Il&?-FldyN50A`jzt~?_4`OWmc$qkgI zD_@7^L@cwg4WdL(sWrBYmkH;OjZGE^0*^iWZM3HBfYNw(hxh5>k@MH>AerLNqUg*Og9LiYmTgPw zX9IiqU)s?_obULF(#f~YeK#6P>;21x+cJ$KTL}|$xeG?i`zO;dAk0{Uj6GhT-p-=f zP2NJUcRJ{fZy=bbsN1Jk3q}(!&|Fkt_~GYdcBd7^JIt)Q!!7L8`3@so@|GM9b(D$+ zlD&69JhPnT>;xlr(W#x`JJvf*DPX(4^OQ%1{t@)Lkw5nc5zLVmRt|s+v zn(25v*1Z(c8RP@=3l_c6j{{=M$=*aO^ zPMUbbEKO7m2Q$4Xn>GIdwm#P_P4`or_w0+J+joK&qIP#uEiCo&RdOaP_7Z;PvfMh@ zsXUTn>ppdoEINmmq5T1BO&57*?QNLolW-8iz-jv7VAIgoV&o<<-vbD)--SD%FFOLd z>T$u+V>)4Dl6?A24xd1vgm}MovrQjf-@YH7cIk6tP^eq-xYFymnoSxcw}{lsbCP1g zE_sX|c_nq(+INR3iq+Oj^TwkjhbdOo}FmpPS2*#NGxNgl98|H0M*lu)Cu0TrA|*t=i`KIqoUl(Q7jN zb6!H-rO*!&_>-t)vG5jG>WR6z#O9O&IvA-4ho9g;as~hSnt!oF5 z6w(4pxz|WpO?HO<>sC_OB4MW)l`-E9DZJ$!=ytzO}fWXwnP>`8yWm5tYw`b1KDdg zp@oD;g===H+sj+^v6DCpEu7R?fh7>@pz>f74V5&#PvBN+95?28`mIdGR@f*L@j2%% z%;Rz5R>l#1U zYCS_5_)zUjgq#0SdO#)xEfYJ)JrHLXfe8^GK3F*CA(Y)jsSPJ{j&Ae!SeWN%Ev727 zxdd3Y0n^OBOtBSKdglEBL)i5=NdKfqK=1n~6LX`ja;#Tr!II$AAH{Z#sp%`rwNGT5 zvHT%(LJB+kD{5N}7c_Rk6}@tikIeq%@MqxX%$P!(238YD(H<_d;xxo*oMiv^1io>g zt5z&6`}cjci90q2r0hutQXr!UA~|4e*u=k81D(Cp7n{4LVCa+u0%-8Uha+sqI#Om~ z!&)KN(#Zone^~&@Ja{|l?X64Dxk)q>tLRv{=0|t$`Kdaj z#{AJr>{_BtpS|XEgTVJ4WMvBRk-(mk@ZYGdY1VwI z81;z(MBGV|2j*Cj%dvl8?b2{{B#e0B7&7wfv+>g`R2^Ai5C_WUx|CnTrHm+RFGXrt zs<~zBtk@?Niu%|o6IEL+y60Q>zJlv``ePCa07C%*O~lj?74|}&A0!uA)3V7ST8b_- z6CBP1;x+S@xTzgOY2#s%@=bhZ@i@BwmS)neQG&=9KUtRf^K=MvjC5JnqLqykCE_P0 zjf#V4SdH2#%2EuDb!>FLHK7j;nd6VLW|$3gJuegpEl3DZ`BpJU$<}}A(rW?<6OB@9 zKP9G3An?T5BztrLdlximA;{>Tr7GAeSU=^<*y;%RHj+7;v+tonyh(8d;Izn}2{oz& zW)fsZ9gHYpI?B|uekS3zHUue3mI zb7?0+&Zm>Kq(F>~%VYEn)0b32I3~O^?Wx-HI|Zu?1-OA2yfyJ;gWygLOeU;)vRm3u z5J4vDIQYztnEm=QauX2(WJO{yzI0HUFl+oO&isMf!Yh2pu@p}65)|0EdWRbg(@J6qo5_Els>#|_2a1p0&y&UP z8x#Z69q=d663NPPi>DHx3|QhJl5Ka$Cfqbvl*oRLYYXiH>g8*vriy!0XgmT~&jh3l z+!|~l=oCj<*PD>1EY*#+^a{rVk3T(66rJ^DxGt|~XTNnJf$vix1v1qdYu+d@Jn~bh z!7`a`y+IEcS#O*fSzA;I`e_T~XYzpW7alC%&?1nr);tSkNwO&J`JnX+7X1Q8fRh_d zx%)Xh_YjI3hwTCmGUeq_Z@H#ovkk_b(`osa$`aNmt`9A#t&<^jvuf z1E1DrW(%7PpAOQGwURz@luEW9-)L!`Jy*aC*4mcD?Si~mb=3Kn#M#1il9%`C0wkZ` zbpJ-qEPaOE5Y5iv_z%Wr{y4jh#U+o^KtP{pPCq-Qf&!=Uu)cEE(Iu9`uT#oHwHj+w z_R=kr7vmr~{^5sxXkj|WzNhAlXkW^oB4V)BZ{({~4ylOcM#O>DR)ZhD;RWwmf|(}y zDn)>%iwCE=*82>zP0db>I4jN#uxcYWod+<;#RtdMGPDpQW;riE;3cu``1toL|FaWa zK)MVA%ogXt3q55(Q&q+sjOG`?h=UJE9P;8i#gI*#f}@JbV(DuGEkee;La*9{p&Z?;~lE!&-kUFCtoDHY*MS zzj+S$L9+aTs(F^4ufZe6>SBg;m@>0&+kEZMFmD*~p~sx?rx=!>Ge;KYw<33y#*&77 zFZI`YE(Iz?+tH;Fq;y=MaSqT{Ayh*HFv0(z{_?Q+7@nE%p?S8%X6c!+y;!0NLXwJV8Co_}R3*7>n+oMsQpv8}8ZS-P@(Rg|gmxZHzf=nMOUAAY}AZGfWVzZjE@4$=7xkIrs8BE%606aVU%kxz_04ipig51k& z(>c9rJL2q%xvU%Zj#GR9C9)HLCR;#zQBB@x;e_9$ayn(JmSg_*0G?+wOF?&iu@}S{ zt$;TPf*Lj$3=d<}Q3o!Hq@3~lFxoiCyeEt}o3fihIn{x2s1)e2@3##&GYDq~YO|!q zUs0P-zy)+ohl-VQ`bhvUpC{-d$lkpML_M%Kl6@#_@A}w{jWCDsPa#cSbWA#C4Sf|*C*&Z{ zz?hOU7Cc`?>H$WGqITA2P~fYudnQHxB8^;0ZFKC;19F#~n_2P@{cE{Czq-#K5L_8| zc3aOEwq4%zL5>YU_mc9fc-p~{fBTWUkxTiZvxt9FOqC{s#TBp(#dWc+{Ee{dZ#B!g zHnaOJ8;KO1G;QU2ciodE+#Z$Wuz*Hc6NRO!AUMi|gov=>=cwcZeL&`>Jfn!35hV1J z;B2@0!bIR853w%T*m6)gQ?DPnQ)o6EtKaN3L;o?*q<83d&lG&U=A|6hcT?f0)4h6{ zGIZ0|!}-?*n{zr}-}cC}qWxEN%g60+{my)o^57{QEn(tSrmD7o)|r0+HVpQPopFu; z0<S}pW8W2vXzSxEqGD+qePj^x?R$e2LO&*ewsLo{+_Z)Wl|Z1K47j zsKoNRlX)h2z^ls_>IZ0!2X5t&irUs%RAO$Dr>0o$-D+$!Kb9puSgpoWza1jnX6(eG zTg-U z6|kf1atI!_>#@|=d01Ro@Rg)BD?mY3XBsG7U9%lmq>4;Gf&2k3_oyEOdEN&X6Hl5K zCz^hyt67G;IE&@w1n~%ji_{sob_ssP#Ke|qd!Xx?J&+|2K=^`WfwZ-zt|sklFouxC zXZeDgluD2a?Zd3e{MtE$gQfAY9eO@KLX;@8N`(?1-m`?AWp!a8bA%UN>QTntIcJX zvbY+C-GD&F?>E?jo$xhyKa@ps9$Dnwq>&)GB=W~2V3m)k;GNR$JoPRk%#f3#hgVdZ zhW3?cSQ*((Fog26jiEeNvum-6ID-fbfJ?q1ZU#)dgnJ^FCm`+sdP?g;d4VD$3XKx{ zs|Y4ePJp|93fpu)RL+#lIN9Ormd;<_5|oN!k5CENnpO>{60X;DN>vgHCX$QZYtgrj z*1{bEA1LKi8#U%oa!4W-4G+458~`5O4S1&tuyv>%H9DjLip7cC~RRS@HvdJ<|c z$TxEL=)r)XTfTgVxaG!gtZhLL`$#=gz1X=j|I@n~eHDUCW39r=o_ml@B z0cDx$5;3OA2l)&41kiKY^z7sO_U%1=)Ka4gV(P#(<^ z_zhThw=}tRG|2|1m4EP|p{Swfq#eNzDdi&QcVWwP+7920UQB*DpO0(tZHvLVMIGJl zdZ5;2J%a!N1lzxFwAkq05DPUg2*6SxcLRsSNI6dLiK0&JRuYAqwL}Z!YVJ$?mdnDF z82)J_t=jbY&le6Hq$Qs}@AOZGpB1}$Ah#i;&SzD1QQNwi6&1ddUf7UG0*@kX?E zDCbHypPZ9+H~KnDwBeOXZ-W-Y80wpoGB*A) z_;26Z`#s0tKrf~QBi2rl2=>;CS1w)rcD3-sB!8NI*1iQo59PJ>OLnqeV4iK7`RBi^ zFW{*6;nlD&cSunmU3v4JKj|K4xeN(q>H%;SsY8yDdw5BJ75q8>Ov)&D5OPZ`XiRHl z;)mAA0Woy6f!xCK(9H2rq?qzp83liZAIpBPl-dQ&$2=&H?Im~%g;vnIw1I+8q|kr! z36&^9}CMmR(U2rf|j12oG=vb%Ypsq8u9Kq}U*ANX*)9uK}fAi8;V_7Z;0_4*iydDxN-? zv?qJ=T*{MzL~-xUv{_Kh_q9#F{8gPV!yPUUS8pEq*=}2-#1d=sC_|U-rX~F0 zBLawgCWy#?#ax{~DAnDvh^`}wyUO`ioMK~jgh%L7^}#h?beSyvQ_g>+`2`}`-1h7# zg*?qJdm=53hwN8~B=^|LPmYtOVrQ(W{sNm4uofq=4P@dUA%$onWbw_m-KWia&n9iv zi)!9#OJ#^}eg8tE{wSb9(c0D^PS1 z9EBS5*ypSiVRS_G0v?$hyoZOS7hFWlp4qbYkf9Y&{%OzhsIdHskLptn96@k6@^K@U zszd8POehITDK+AyW#JKpnWY;ju#MC$JjB1Y*~(E6N%{p#kO+bVxG3X<34n3fW=k{A zCZt|KP%x^GQ9%mU)KE0{LA=vaZvRQbxSlK~eAkwWo2Z<{j5eS5NVTMe`m%re8%~7K zZLtU&b~YDN%~uA9wPf>x2=PI=MA6_oVe>Ek$s5&&Z=8vvF5EODP4Av(b|dlNgF1O8 zy83W0WRdzjz2iNA~t1piEqlyU&`$yZtqR`6X_PmuP>W+D|8iH;FQ zN{JuU#Tz9mV=4R_IewROL1|mK^`lLat#LcIBfggzM(iO$pQT*-c_ z94^LUWw#5B9~sp2W1p`c)Y(xfR<{O^9n4E6vDDw{#-R4UMBKo{>Hqlqn*a9rl_>+0 zS5MwJC~nCC`1X%VCyWFsiDX;bfAJQAUkU#105f_s5U-8rqO}n8fA1{b>Fr6Q|Ea(V z5B11Lo^ooWF?`^{-U#?iatokWI-e$632frzY?Yzzx(xJc@LFM4A~-eg!u|tl{)8Nx ztZLXsSC*68g%9TFu(f&J9nmc^9hgyy#uUOMJFCaifSaDcyQ&6=8e9=t zIFEAQ{EK{|73{($!a4=!wj4ABcQrUQp#+gGM?wEUp(w@+Fzi{!lt}|3`PM%&d-seeR zB$}BrFGD3R10CE>Hsb>;PrP}pd` zaY4}6+Wu(`#uAV+E5SV7VIT7ES#b(U0%%DgN1}USJH>)mm;CHPv>}B18&0F~Kj@1= z&^Jyo+z-E)GRT4U*7$8wJO1OibWg0Jw>C$%Ge|=YwV@Y1(4fR>cV#6aGtRoF@I`*w_V4;)V231NzNqb6g@jdpjmjv*<2j02yU$F8ZS$fTvCC`%|Yn#x< zXUnP&b!GLpOY-TY3d?<-Hhxom_LM9`JC9LEX2{t1P-Nj%nG+0Vq)vQwvO^}coPH-> zAo8w#s>Je^Yy*#PlK=XDxpVS~pFe-j#jN-(As&LRewOf(kN-aKF(H+s*{*!0xrlZw zchJu@XAvQWX7DI1E8?F}Wc8m46eT+C<0eXVB+Z^(g=Kl@FG-cn@u$suj)1V2(KNg_ zh29ws6&6(q~+sOAoHY^o86A<#n*?Pg2)cK$+y;cY$hJLq4)4V84=j+3ShSr##Tk5kgmxB zkW+8A1GtceEx~^Ebhwm36U?oA)h)!mt=eg0QE$D1QsLNZ_T3NH?=B&0j~#298!6iv zhc0|-{46*3`Rx&nKSXnf1&w-Rs>#PGAGuY@cBTU-j|Fxbn3z49S#6KBaP^Lx*AOXxIibr z!1ysMi(&kr!1wwQB5w`BDH2~>T4bI`T1}A2RM0zd7ikC&kuBRsB`Z2@J!Udm{AmSN zrr0k6_qCZL**=)xRW`MFu(OY=OT;3G8eF~ z2mmkXZ9X(sjuKmq+_<=LSjphB$~R1o^Yb=rO!j!(4ErIox^x55o{pXSE9X$!76^*$ zoKhlAX6y%n^U=C~@!vIlEgXQGD@>oOU=_(aXF-Sjas*$AKESfRzxQ8#3yOj|y0OCU z>6Z-0%LCcjla&7I+CXm&caKp@@jQ!5M`(_{CL=@4#JJ}cHeZw>^b6fpv269LSV?gV5Q{kk?4;;y9RIsy5vk%DIRiL(9xe1aA@4!VX zDh2}xgUd5X?6nji%&7-%QuyKSYA-Z{PwJijUQ}In+EJl|x@dF1P<5bPa5W3&&?^h$ zZCo8LepKo0a(Fsln*cHL;D(gu9MMkoiM0*n31u)jHqX5x^F95tnI&^}^yKx3YwEm@ zo8?EZ710ykx@19{=yz5IXb8w4yjdveWb{IVL6Z(Cs>!a_0X^1E27o!4e&b43+J*u2Gb(59k2uK0goLwhO{ujLS ziI9LA9`&x~Y$6JNX!aEXR``}LUI}Gr#=<^wBHmg%v<)zRWDVtq)kT$-P7iU1R)2XZ zi~bYhV@EZ`@prgK(cs{>2jn$pxg$<|KjJ7%26Km>%KcXh^bU@y@V_Lf@=j1x%R4{v zOcQn{I}!2W<~08FOVnoV>zOTH=+>v9!jFo|q)ucqIe!N4{U5_G`>>*sVD{8I~4FqyU8imZ**-Gy`~Xd z4w35GMf%7^i65HdX{Iz|f2Kg193#KhPIeR)-=eYx3Z!%RM=JjwLrdk^B#6rg!ym2w zPbFqYyO4>W_Z6PonAwiu7?!h=x%sR-T+_*xZOGh2wWhWr%}%2^$$ zQvACIB~pi=m|`hXIMvoq`TOCx=J_D2>pi6$NPy3&8#vy|oX)=kM0Z}$BR$r0G}MzOk-OqG+VmZtOZoj6x4(tLh|5h) zBv64Y{DPHsy&_H(5_l(&Y}FhVvr9m_*_Q~Zy-}V9+VmGnvndEjYW4qt4K~N&Y&6g| zfpz*V=A#^mVmuOAz)(KVI<%v5NY0%Goy!{9&o41upsPWk(yFuRP|A4q6NMnX%V~MT zi_Rb-Bno2kI+j0Cw`@ydy{e%ARS#Z%b6I%_yfo_ZKXr4BLVoHzBKJ^ZG z-2>2IzU)55@9C|?_P$ew^-7zEiAKG1XAi{!3h%1m#9s%^pGy6S9wKFYY4<$djeoJP z{GI}Vd%idY$4_fh(7NXm7#;cC!DS&-{tGr!Qze{^%bUx2jgG@-kMta^q-EwrKB}d8 z{%FT>rFk_bzW<{lc%eYlrsiYTZXGgzD1&lmRyp+c1O=0=zAX=KV62bx-a~JP{cPF4 zU$-XT#(9&T>l@bMu3nSr{)%-5lV+0t&bxip4DVJ~vlL$J2P6X~ zd{FS8vm{Lhrieul*7&(AgPuXhjpGila%6_?-+k#b)cdk#M1jB*nE>G6NGOr+Ek{`= z9b%S1`$`=g0CC$>0$Db;l_szReLYVmce*(()9%Zz1`*fNXhI*oRlerWHarD(v^W^c zuc1Vuw6Gbp7ZsoRH>QGt#&lv;5G~Ovt$%7VFd*-rN2>UjbOWBFGNGO`bru7CFB4tn zL`^?69Lj_g_TA&`9`dSI8s|)K|QM0 zybvV7!>xDY|6c6y;Q}qs`){1+WQu_5Dgd8Qe|q}}bxjH+joQQtqs1IVZn6{e7T{ia zF|=^xa%eWO%(x<7j*QZbcU_;aVaVP!arexOLOtoSNt*hvsRL%}%)jPetSich(`b-^ zMZ$PM9%s@%*jPVz0Z^W*cK_>G4f}+eEVX`HOaHg#!B`<4v;x}zDLMR*M27`kNfp!! zOfdt(>k-g>7jf^{Se@3$8<+;R*cYtw+wD_Z8Pl~!JDCUEPq{Ea*!J9`%ihyNJZ30i zmfve}S5<$Uso}_?SuI$ks|{-ddGLu9WR9`^9)Kdi@Vs;x#SY-xp}wHPU0|vEA7234 z@BN1z7OF=OOQtPF$4twn3!HTVlUVD_)ubMM7PEPoiC6lQgL2q9PK4~e8v-OuH%lie z?NgBLkIdPMG$QBq(>r^AOHB`|*1#*!2Z? zuU8H|FD`OBRu^(R?Z-Vhr0j;FLpS~a34KREnd}B=EYHS*>Hm+f%tgJt!4J8Q`qn^4 z9F=tO#JRJ}tzA`vx$nZ)O%wC?Uiv0+_nz}5Lj4ki*&=K&*#U`=rv z`Q@Q{+IhAj@6lrNK2B=8Yln!O2%zomfRehFT~;!O@(@Xy|1Jlw*uOB-M$#6K^)QBm z_7%#QVUDPwnW{iOV-grMQQU|3{=BQMh}c5(yMGdoQf*)k9-B zMQ(^GdJh+y)>qJprknS!%WxqM>HlHOP#7UVdy>%PW$!l72J`n-p7j(DBKoGxXWh(Y z>BFDZl|7knU_jg_SSbvFk8)39%2)Hu5W0}HKlh>EaqvFoXI&56Yy)3) zQkE4X^P0QnPn?iUUVHJZXzPp`s5uv?pG{K9IgGoHvcmlBxubi|iF7n{)mhenIcxGs zgr0OpQy#Y#u=5lOyiECfE_Sn?Fj1LyoRKcbTgX{p<T*v!CGkPc)pcA2D=4Ekp0Gb*wpy7S88C%Ywsbr?MI(3UdsCM?XJ1X%*hNjB)XqZ*W(qDdtSb z<3XN74ARXL3=c^bfW~F%NM^5*Zx92>Wq`&M625p~j$8mYwLbk%Kf)jbn#<2z$%vP5 zy#b>-tF-S2_AB4;R^K&^-1LJrUmi@9rB^FLF)-k&YHK8P+k@RCJ1qSTZ@=kHxA3l$ zmK_ZG)l6(nmCR1a8|;QF-B5e_ELnjJ1$m-;4UXX?WytF_wz7#&AjwZYTMVieLbq@R z3t-q|G4^BB#EpNu4uyfDebB+-uu_$9>y-dzB30Y9F=R zrW-Heqnj*InPTWHgR9v^R7~hokldh&h8=HDhMW(EFfim1*{)5Lc1-+eBVkK-2!u=N zuZKABgJs3I--NbjE;>Undg6uK`^U>AQ6V zhc!RhYgvrmeGNsftr+(C<_MtuV$`5RZTf#5r=DR?gWG->#})#=(td%C3`oO+2B7im zUqY}&a_QNTn?s+?=mNXiREN%x_=(H)L|DtYPY>SR3pQfBOel7G_jR_{!9`dSj8Up-`JgcB;=Oor)U=_EVjF3C5{Sqh8cq=~bRjoBpoc$kJCgtTyZGSpQ4= zYi$6b$-dGmuTDF&@amhV?cU05g(AZV&v2$4m&j_~GZk;&keSO(@LRESRZ&p`dV*6w z2$em~p*8yM6j;SYorw`M5K2mluJq7P5Yn$VtZj8DEs2Zk=O@4T&Q}>~f31Z{uk}`E z{Dp{KObh1kk~~MfLUod72{Pk6G@T$_0_N??lOrdR=Z;VV#m0l)&@hz{Z?)@sgImi-&i1@95g53rON83v!yVPDHRU*Mzc4yZ(-Fr z{8{WXmIJf7jeswk$;6s~Qac6QyM3W&`}m#gRt=rr95A+Ad&wSAgvXZ|F))rBJVJ5W1CsjN`QaOzct2ocq#0!v zmj#075)C!3oS>&N;aHS@<+c>RHL)8j^p)k(8#7$LEx!1g_1^02!4_qA=;uhKW=+ix zGX%+vBMiRiF^^jm{mdO(?GdWJ#unO#_F^7mhT8)s(z_WlwFyJ#Xh)k5+RG2f;LC*K**1dr`#}~6A=0B=I&V;%zDA1)d@G!X#Rng)7G*2k8Kg447r0ox> z5NK`d(H-afBwo9feDOUi>;BbPsu!2|=@g=3j*PY}@YrOb+SX6?#Yb2xaaK!?>SX1J z_!VsB`2n1=wwSftkydm!39|-1?c%Epx?TO<(#GO~I&{f4+)XwRk<7RQ1~5>QcKH|D z?!}j1ueO0Lk;FZ{k4FA_(S`Ot0w~tl&m0duID*f6RY#bkw||o;kZ# zISYNTb|{~|X$m$Q-Jv#uxyw)eM0gIv`V#wOAp&Vv@>X4_tSZ&L#juM@$S9 zx_X_tLh<_^-F;LAQ09s@sPb%PMTrcw*HUV0P=RYSlM&AXEOI&&R&YCm_S<7DRBx^L zA^R^iwW+LMk(r*$Pq-fKU5X@=mQ=`ErO30H@@&qqnI7zJcrbSh+H<V ze&7Uli0xj@WrW#&-9%*FP~kPYF_YYM_hs5~|ExMynQ%qvq`leRB6W0yhC@pCb8>_P zlf=F~WMv_u*-DV=UaVu#2rlzK{q8D95VwZrfV?gj@rSNWXFvktUq)V5+YrlxwX302ae(;aG4e>L-M@3J+-f3IT{b9l!kg*2M zC1+ND9}6m^()LE87Mt+^Q|)!y#suc&v26C=0W88%a{?)E8Yvo@kM&KNMaOst#|-_CbUTm}WS@-c>nRb;&z^ zYr)+IE$1=jov(CZ%3uR+`~NI>1&Gs6W(jaamjcN$a`2!*nO}l|b%?)Q%%UWzw>A`C zR@px(P*7j$TK?jbv*%x)e^|jcLsv}aF(Z0=7(%Oa7+1wY>{B>d+i&ZA$}k(qgZPZY z;VkW~8eWnU&HPIAbco?&tc2O1$6=7n{u|^Y*nXoac{o1W-6aXfy~KlNbJfLoq~6;+ zDYmnv--Fhqrl+UV#k@_(1=gWNtqhyVKN=9CZ-{Ohi>e=~bm4IKbhM%%W zW8oXE!rGpV7Wt(_^4nndH1_imheaWzDi|I})9ZVZ9>pN+P%dVc5wG`Ze*4`@rjn1^ z`ln(;vPBHQUb}y8S>=8q__r7g+=z$>!pReVB0@XKchAvyGjLQs-u>+w%`frV4FeIG zj=7n~hGrwx*&5aHy(7X$bDZ7YhcP%(*>G^lAYMK;qG~V8Jz@b7oNg;IA1z$9@TbzW z;@I51@Ekef#qbxnG$Y8Z%bm~ibZ=4#%yKr%#b)CDrfKN`ujIY?tA4h9)i~dZ4E;ZM znvb$n2)zn$Wx&zlW%mJZDh28ox$@%`w3i7YFepXUChw}$UXKI=-TM51`M#FH=tdr*mQ!c=aB1296Lu>iTTKZWss0f z5~ihdImPN$aTle_AdbYC^31}_^EK|9R&l#%3hbx;8vJ+Gp^tm{9JDILu*1PW!rh^Dn9p<)h#Sl4kKM%nm<+!ESSk* zC;lLNT$fgr-!+{aBsSx$41b}yy6o>r3F#1&iv3cfY2N<+`0qJ+>=&Qxs}JOEkD?^l-F5i`t5+zNuvJf z3Fh4$mNqiFXL-aq4U4K@Ae$fq-TDT`rvrx;gqx96w^*@s=mcthCaIyPe(w)6kI{EqV10tcShHU9eeAPs)s?6#vrq}>y3FeTJu$Udha+z zs7}rmA@yR(L&>35sNjQqrw}o^)UitMU!5g6nnG)(tgst!^`FKJEzI1(d@j_w@;^hr zgYxlIRYjho4U$bhczfq&YySCqCE(5_d>l(4tk1v9!V7PB%Vx{QO=G2NC@c1%3rEzw zN<6i?h;CJX>h)kn49Sr)g#Em6km6ESP`1qc5C3ZHizN>r>V-fSS=X1nT{+Thh@kC! z(H=PlqDt7V6gOYezXUK-dretz!1?IUD6&eL2b!4=9h+HUO&DYZKMM>|YhlEEg?q?S z^XT4$2Fd|zT=x3U#L1|F;-#`to-Y6hiYkWdO=rRC)meY72pIfl`3zEGDU8($iWR^K zI$nq80aSJII<;#W5Pj>^_T&013BJ*O89Uoq z5>;Paa^E}xar^r=!pexg&OTM8wluk4R~Ru=)Hgk`Y#i_$jk{jc8hx}?(dW*X!l4vs z6_%$s#duJJFmaFc-5#>v6Yea=I~)s_pXGS>Tkz?s+WS}>Qp<9MappMLXpkXpSM~SmH6u)`Z5>o02kJs;w@KhdiZ3}29y*xr|6tMo zBHzGic+b+dTd!xOJ;p{Rguh^corJ;K?R6daayQKm+0rf7|AXg0qs!R9eS7t4{G=fs z1$=?kK1Ih=gEkI>@jgXDWHZt*C7FUEWs|u^pE3Z``^K|1KEC^sbN*4nQUfRc_AyE0 zn)?RrGjgPkzfE~_s!rDB!fDsV+*|kEX4+DyS#8%!cshn;s8svwBXSsDGX2ZRa0={* z=`p1F{zD17*Rk>Uk_cw3t5j=9-d6$}MoM~z{v{t^M!g75-+o8_XkP@CZWUQ2z!^26 zCNOu~hgrrK)y>bgqb{`Q_1^zrG4;cGarP!nb4E~(ZKWc`LVeEq;IewVneLp^ZU2+% z95PgN*M5v7Q;ZlGvM#`&u2NdHm%&gZ{bZM5wBCp&?HeZhwU87wyT_z!n4z+1?=RvXZ^72d*%+R1s1$KbAFtR|= zw;MEq=O7pMIKpFwKH6$OOszJAf<_Z<1)36cB>D>|Z6$gJL~jH`n3MMou$#Si%rDAu z4pSkJspG|^CJ86vg6kkfXsA_`8@8iOryOe!Qhn8SV6}mPlof3=WJRVqAr_b;e->`Z zMR(p|K|$L0^6;u~USxg#B6-ZNc%E1dv*^P=|2k*^NOBni#G%9Y?##{=)8KZwh85OL zSBG9|gb|hdmY^gn(ziY&O5#@I?W)W;361Yb^VQNpz0A7&^(7HRAsUvw#)fvhocvja zLxV65J0_$>&cVRctJFsn^qLos^tG`+B0_gQ{NeOwKt-!C^gGFufdtPT*Vi>l#X1|V z2XxsAcixN)Ekq=a##_^=k_^BFH5_zpvPDRP>u6+3$}i&b zy0@FdzAHw?i9OqnlTts_w5D@Nd#eM)KKEuN#m{|AJyscxa}(eA?z4&4yvXo{OBS65 z-?gW;<+;+ntM}U_yTmHm6*2zj0Imj<&ZgE9Wj|gfsXhrVH-c0p$7HXnR8bxDYOi z=_r3FA~u`L&2;Vir8}P3)k|@c?sK1U@&iWo{HEXcoy>6wQSuJ+b4l%aTBuigs&k@Y<2c=S3Ef?p zH>ki4yDuXdo_eu>X1{E$g(Q-u#zVXN^&%70guoizo7x(kQ0OZ}H$O9UB}(FaX8Ct1 zFpx~}EbHf2r6V;x=@8GH$C2|6*?K~?LrtMYd^bw*WYXhA z_))@RMH;nZedW3+qfWbv<|_#BYOxX^rhbN+!za)|!|8K*LRs(R$O*2SDM{g9k7e{u zN4VIdi}e#0&h?sBxu$>Yy%)j(k1V2fuhp8r!}gfF@b;F?U`6}YnnMh1&sSU&lR^?# zu!61+lGsuFEfDraX3+$QZibCbKzc{75G^T7@WZSQ)j5898G1AOXB*H*TSd`f<`IK# zm1%&t?i|2Z-a&r!pJehzg@!awNp)R)aa?q_SqGrxE5u+T#f?K2;GAHV?O&>!W@Q*k)7=g2vDW+7K zbyY9i{|nOF*SbMYoRQSAbSH2y$bE5(@d6xKxcF#@TE~X#3o=;`0sc!RupdRmQsML? z&>SCwS{FOpSr+@6Uuz3m`hj}(^g`Jz|6?({!%WVJn$H|ugxW+x-GEA?J&U^ugj3Nb z;65~)W<}iH2PJ@st8LtLfSOLXYgj=9<;?ih7rq$bXW9J#!B8!Wu6#U`A$wlcoC*&` z_9Js~7%m79#+edeT&P`@_Ng@e&5J+pqpx%31tAF71)pcz~-yJ>P5yX(nuM4;bUHDa8E(~~l{j~JeCGkX>nHJDpgSf&bTHEf)qw8{Q~CBPEVen|MW2P3vmf`8X9-g|>>ddp zcgfjbl~(?3Wa*NzQH>4nsM$3}Ul>pX1xC0oF3TZXe7=V!9!n?WgvH|R zpbruczmB%z=zkZ>=1R|gXwGThLELqD5KCUhtiRGT*JwKIvzbzV%ZU!e!VcNHSSX3> zObH|oohc8nvQZ2}q??C}@>!fe3gH+HF@4(qWqi>;ag~md#D;cl8&gQb^?2a@5cikT z=7r78@&5gV3Ggc9f=<<8v~yz`NcEGvbX1V_`IL(&+Z>LB zM~$ok2qXzod@1$TEl*U~H$V5g$er{Uj^($sWb7Nr{gsIbE(`$LRGECTOraXiU%=uq z0zvpi1S%)RxTjzoVcR4#10)fs()4Mtsa@e?9j)Bk!LsYyXIZga2q7d%`vQE!V@<1Y zmkpH3LeXJNO9f7l>F84g;huc=4nk(UnU}RLZmYk2TtB#lv34K(?8~gyx-mN%g=U44 zOPdr_!j-;IEbe|l9-buuKEy^Q9MLjSKG$S6dz)!U_32{1)N}L)3+COmlg=nY1@od$ zJ<0z-B%sisAR1yh>z-RfQQb6M4i-d#vxvb~f69M{JLPZv1JSCh1$gQ*LxOF-tH9!k zbQ0ZW)S7)qCSF|=2`q_A3}OHBNBueZwTTz^ar~gz#2KA74&&D)KHt~m4F_nK<^*7_ z!!pN@xiGkq%>1N(rNxw$zu-=1t*IpAy$ z4~dD0w%9;E?(greVWZ3(o9ux`elM>Rek#0 zO=#-(4p5B+wFzlEU7^k{3EdL6sIp|K*>xrriI`}E8ze|z-$YpN`^_teL_7P`%e>IN z7tNiH619P+0Q1hBR|W#POOta)1|LkIRtgz zMJ9VOxXN#o)mlXS=u%`Q>~PBuKEmOWsIuQRp{y%!ty{fEyL0gV)$LQeL#pqX3L@SR zJ2Gb^E9+KVd?;joVOXlGie3?z6>(>u(i!(qGz(W( ze~^xj&IRF<98ypEis{Y_FoHn%C0bW(XeF#Lj=2WUEBqKNPPFppEH?_a3}-h906X}C zSYKcZFU`Om5YlWhh@ogzCn3NvuM~F9jOX|xe-X*!YL+#ceh_tJoHXz`aTnvSrOAZ| zOtdGz?QdT!oAJr3(XL2G(p%2X4{xEohU&vd_zQ(U%ihHOlKPWnb$&YYhx48?|R++>`5?sxvM?!;ru|9 zZ#nwuTK^S%ce<+ggdJBE&fRrXN7O!{nu`%q`M{2Ef_+IRad2cf01P9pST9AOK>y75c!9}~)Et^6$`&Nm{wzWcm4c0j9DF!xJTpGrMp3esI4D_iiDe`sswXSu{dQZE_`^A11 z?Z@Hw=65mVu^%X`>;$mciK}XiZ{xw7I_!t)S00^JuxdCXhIRO~S*lPS(S^je`DH4E zxbKNs8RL`N?gCQ@YSOU=>0FE#Ku#DRO7JA&fu-X8b;3!^#{=7`WsDXUxfUsE(FKSQ z&=N`A7IwLq%+vt(F;z+T=uZNl=@K4|E%p{p^o5(BGjsE|WOR`%8+XgGW8xJTFJc4L zVY#L`OdnSM{HyS$fX1)3_JuNNH1aDsDqi>CzCT5=kY5zV<~29bX)c^I8R5n&ymHkx zj(QC4t#mDK;2xi8O%V;C{HqDQeM64=b4@sa*N_K0a&ro4+8LY6cFHz< ze|!g}zF|tDrP=`+U7KwKl20gdW1%!iN>1=uxA|NZJ2peruBOj?RBPb~8G;s6xIi6- z?_odhafsxoxiBf zwZZ)c*)FLc0#wE~bXw0TPBYl+h9hs|DYr_B4LR_YL@S1hQs=p zNEh%_fUvWZCbJtaF#kP5=(O#{8|g&Kmz1&8{@Lufw^DhtvKx955~aqxi2C=)Z-!Kd z+m-u+#^U4(HYn6a1w652kO0bYBt&goyx(n?MR^kI+{Q?0Y{G~W2) z0dS3fuJ?SU(6ZDp=kUley%PK}K_;YQyK|U|?7t9SHiyIfpT4a_kUVIhH4PSaj@3mo z`z}|mHhx1Pq?@(3vTBb5HTXuFAzFZEt0D-fw_kd=XvwIUh3VXTm{wbDA~cESd5cI1 zd>6=&AvG3yu+)`9oxmfrDQ(1fzv(_0l?bp{a364dXLRRBI8kBv!KsL;brY)#E3`o{ z3TlWUsS0{Voci?6MejccG9x_KiqN>So*1{25r6BSl9jUyR}1TgXBLL7Pr6Wv~Nu47;fbiU7TbL}>qmtl36YSZ() zVf@nqW(As~#`@bIC+AxSw!O5Pocf&rYaCFm?Jd?XR)p#@{!|5^Ws@wd855)mI^8y{ zws+VvGXW6%xoj@JkGb=~%oJ~7m6+uhOv?bH+jJJ~eFgp+}~*^C+3>R-MY!IZQoabCh( zN(T+z@Oyc^C)WqQESmh{d!!T8zS(!wX=R#hEKxMXy(eg zZ+Cwm1a%?;RH$h2_ws|nRjn8ZY!>3gn+6Ep4xT|AeFox7!rac2Lw?jsz}JqPE?5JG zok0}q1P;cuzs%Yrze|&d$oTr<`Lx{fbq2OV=!3v-ODq(n?|WxuhtmwJBIoW^^FB+D z-?Ok9HBKc5@)L(W&vmI{prL?4^OE9TR)bELS=<>*w%&aKjzi*@;5#P3moG@dm{Eke zhE#Is;&=o|{2GWai}7LYEI+gmc^Kj4K7w7n)+9godg?yB2?xs}pF1<*!Sv?D~Uvbkgs9xx9s#6zBv9l@ox>d#H6eqw^KZO;Vg}h!q zI33^$4}yF*q+q{DsJsa(SsV!YQ#zi^IF9MQV6i{SiN4dWWCi%YQ+hNc1r!^+<(YnB zG62-D`M3w3Q2;@X{S`n`{QO>migDpz0FK`->sYDOESs6u>-~<}_XN_6><2g7U#XC{ z$#Ig;n{_yEMnlvx-lP*;ts#DHV0r8j518>~33?Ak#jocW>uk>6V||p7{4rov#RS9c zdPD6r`qF1om9r!zS4Jk1>7fn#GCnmD=JIt1Na`X)=*LP7R!3XATgk`;&U*P<(0d z9p<0T&eYqQ9jot39FxpfuPSPYlfQ$s-*;+c1KL+cHIVcG5`H~^Ryu1Hk7%Nf$TCwR!SzG31@NHpm`mcp8v!wyWM49TjTxASJ-8JP*MTHLC}hF==PUOh8kaaXeGFGd<|e29vSDaS ztPeu&zv0^wN}Hahi`$pcDs~FVt2F;K!q}q*Y@{7i#stWfU`u2La4aerBKhV`^zG~j zJWvtZpcHIP7x*tfLSQcng6D(`HVp4=LWp_0Xt=2wEHjK)!DSz_Z?5J@>awRyk?azj zU-kdSs~cp))*pfJ_q7u`IsCq8F|OShB~D56S(Mwwlt?{yURE7#eI&WcpVq(@9Fd~g zeUiD!a4w51Nj(YzLnau+O3MDub|?loF0=<#jLztAM>PruE7yNDD0L}y=Ayuc?^?Ni zf~%GK=iEhn2}xKp7GonJx!JpDmDsco$|$XtRdUDwbM9$9s7x9-of2nKNj~?b@UOKz z9{`=Irz^ba-c&1vSQxSh;I2`cKc8-4)aCy%#bam;3_8vSJ-jw`_}lyukEC~z00EbC zI*dU3F21A)dSZr{qA5QF+{a%D`h#?8o%M?)*hWxuqnQD(TpcmfNq&UN$BmB)0!r8) zxno@Q?$_D&*4(rW6b+?-Y^5|*P`DHmJ%pI<6*yP)o}2^?>d7P#bd2j=vvx2mfLW@R zQLD`%buR*}nzNYNf%68w-D$7%v|=bXg1mYrdZy~}(@RRZ-U+Gx=nmCjVxr5Ag# zLw3R29-MHJl|`mRxj#sv@EfyR#-q>BE-XFEENbV$#dWM?!VjU8~kKZsd@G=HPrI{HiqN&j<92*-3$^M*;n@rG*i! zvi#?j;lc5w>@+r!6*CVUrN9as=S3?(ZBT979$5R#ZpPm?2VjIyQcEFp9orGR>f;G? zK<~FiYY6ow-&}|v7k?+03TC++so$)2~rN``u z>N%j$AbNQLX_!evzG8abf=15260vIXdz7K^a$YS)iw{@x5<|Rr#ii|ov=LJ{eu>dZYe_ip$ZuzvRu1dpjQK1BvP zH~m#t=2_wy>9+YkdNF-z` zQ*#7=^r%R*pIi2AI`>n9>(QJVE1k8?Ilav<)NUjW^O$}^yZZ{_Uwn!4Fq1`aslX;Y zj`XDIm`E1sz|wShA=?a@ZGKDSMU#Z3$E!1nZ)g^Eg3ZDoSN6@RXrGVCHvMIauS7d> zuJltXf9)LdTWdF!n%-iA9b#2$W#i??K)zYho^((ZqluvhAr@{H{diy0%@-~VW zKYC|2Ma)2^=skdLT@ZVqJfiCDqS@~qIGexL(BKy6Aw9ch0hoHN&E+m3*uka9+AIh3gTWdSe~W({-&^oFw`!j7$DcsF$7`pO?kRMK<9h=SV?cmyJIe`$4|zoI(6u9#qY9zM?#zNe^!Dl2>Z^dH`>`wSY# ztU;V*+g0R0DH6EnJA$U{QL&T~&s{`smeC2I-5mzv=v$l@iF;yN0hMibU=CG^e>J;+9k`Si9PzLaj$>}QKI6lWmO_o+_( zmhxA*0|-Na`+*J1qEMIXZf9rb#;pcOw>EDeDjb!|GumQ2!1ac;YqU|X;F@l1_lemzTN0J|U zFJF(kO21aHg)*KfuKT=BA{VDkOvlx(b{f|A9D69_BHUm#S$F>~`Mt@GesjLp3;reY zP~q>6Tt;`XkjqV?i7lqPbWGh`y<7dq<}pDHl-dDA4QG6`QDq)+vq_&HfW!}P6Cp4d zt>Qnli5ri*I1ILEOGD~3Y!@2^Jmcy1xDXmKolC?at}_6;neEfca0rLHT}NLpoUYh` zDbCtfZnYN&>}m-(F{5d1=)bBuZ?OcP`GmsQV@kn%JMJUIep`Avon#8=ATpEo-@hg& z12f-)R=HCD%pUjvbWa|P!}u)=wInpZG*LHKrZDMeC>Qils^IyY)x;kDRs4c3!DDOG zAptSsf#1X>kSli|Qka@S)6O4un-2aKL?bcV;$*>KSxHovjrfZ^-+c#>;(42yj71K| zzRyFiLrwv$rPcNA{mtv=o(*JDA0kS93>OE0D{KMJzLk$cc_5dCLWnJcFJd6_>BpE< z?aW9;^!;arQcIjloW&YL+~MkNO&a>N=pmhg>{SM<@`a&VeUA`ay*P@R$_+WS2%r?_ zs&Z%c`>ie+%!I=Lz>$9$7a`-`hoc&*dl60^whsaQ;~9~@JYn1Oc_bmgVVyAzUOYgZ z#j{`#D_YZ)(wa5;qzR#zo4a|-ANJjBB90r4Iun3*BkMxw_Ti>SjhktsmR|BPCLt>9 zZ_3eQjweI*-8+HNt)$9^s|+10w@sU!PY{`#BnF!ULS=#{k0Zr5`yOS?p8PfWbKT`6 z@T+PeRJ4`fj5t8bMs)0>o9|C>mBTlfQ*nFG#Rri-Q7}E}+eaz`LmO!`Y_pHkoAruu z`&!5VNnA3IG$}Pz)V&pt&AF!$E{J-;or3vWv3&Sl&9KzG+ae73Zf}=aP*SCI1{?0T z9SAC)W(?DSKOkcmW$(K5Bl?c@(5#>J#j@eq#ctX~$TIjkl>Wrfv%Ey+bl1Z-v?NxJ zwZ9!ae-MsHPUx&_W22?9$mCE%&~lzVG?hDXM%~gXGk+Q!Jf0BspkMWxy;^!n<6JIrSYjv z6F%~$8)0^qbUho9Sdf97b_n({$;|XH9-RHrohHuPcro@03KEPFejN&q?&nJFoIQY; zSI#uL6>2^^yOR!51OLO65xGas55dPG;3=uQ35ZYW04#+~byXQf^7Vq`G z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 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 literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 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 literal 0 HcmV?d00001 diff --git a/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1632cfddf3d9dade342351e627a0a75609fb46 GIT binary patch literal 2218 zcmV;b2vzrqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuE6iGxuRCodHTWf3-RTMruyW6Fu zQYeUM04eX6D5c0FCjKKPrco1(K`<0SL=crI{PC3-^hZU0kQie$gh-5!7z6SH6Q0J% zqot*`H1q{R5fHFYS}dje@;kG=v$L0(yY0?wY2%*c?A&{2?!D*x?m71{of2gv!$5|C z3>qG_BW}7K_yUcT3A5C6QD<+{aq?x;MAUyAiJn#Jv8_zZtQ{P zTRzbL3U9!qVuZzS$xKU10KiW~Bgdcv1-!uAhQxf3a7q+dU6lj?yoO4Lq4TUN4}h{N z*fIM=SS8|C2$(T>w$`t@3Tka!(r!7W`x z-isCVgQD^mG-MJ;XtJuK3V{Vy72GQ83KRWsHU?e*wrhKk=ApIYeDqLi;JI1e zuvv}5^Dc=k7F7?nm3nIw$NVmU-+R>> zyqOR$-2SDpJ}Pt;^RkJytDVXNTsu|mI1`~G7yw`EJR?VkGfNdqK9^^8P`JdtTV&tX4CNcV4 z&N06nZa??Fw1AgQOUSE2AmPE@WO(Fvo`%m`cDgiv(fAeRA%3AGXUbsGw{7Q`cY;1BI#ac3iN$$Hw z0LT0;xc%=q)me?Y*$xI@GRAw?+}>=9D+KTk??-HJ4=A>`V&vKFS75@MKdSF1JTq{S zc1!^8?YA|t+uKigaq!sT;Z!&0F2=k7F0PIU;F$leJLaw2UI6FL^w}OG&!;+b%ya1c z1n+6-inU<0VM-Y_s5iTElq)ThyF?StVcebpGI znw#+zLx2@ah{$_2jn+@}(zJZ{+}_N9BM;z)0yr|gF-4=Iyu@hI*Lk=-A8f#bAzc9f z`Kd6K--x@t04swJVC3JK1cHY-Hq+=|PN-VO;?^_C#;coU6TDP7Bt`;{JTG;!+jj(` zw5cLQ-(Cz-Tlb`A^w7|R56Ce;Wmr0)$KWOUZ6ai0PhzPeHwdl0H(etP zUV`va_i0s-4#DkNM8lUlqI7>YQLf)(lz9Q3Uw`)nc(z3{m5ZE77Ul$V%m)E}3&8L0 z-XaU|eB~Is08eORPk;=<>!1w)Kf}FOVS2l&9~A+@R#koFJ$Czd%Y(ENTV&A~U(IPI z;UY+gf+&6ioZ=roly<0Yst8ck>(M=S?B-ys3mLdM&)ex!hbt+ol|T6CTS+Sc0jv(& z7ijdvFwBq;0a{%3GGwkDKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U z@~$z0V`OVtIbEx5pa|Tct|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-M2 z@O~lQ0OiKQp}o9I;?uxCgYVV?FH|?Riri*U$Zi_`V2eiA>l zdSm6;SEm6#T+SpcE8Ro_f2AwxzI z44hfe^WE3!h@W3RDyA_H440cpmYkv*)6m1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/flutter/materials/macos/Runner/Configs/AppInfo.xcconfig b/examples/flutter/materials/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..e8c179bc --- /dev/null +++ b/examples/flutter/materials/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = materials + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.materials + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. diff --git a/examples/flutter/materials/macos/Runner/Configs/Debug.xcconfig b/examples/flutter/materials/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/examples/flutter/materials/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/examples/flutter/materials/macos/Runner/Configs/Release.xcconfig b/examples/flutter/materials/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/examples/flutter/materials/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/examples/flutter/materials/macos/Runner/Configs/Warnings.xcconfig b/examples/flutter/materials/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/examples/flutter/materials/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/examples/flutter/materials/macos/Runner/DebugProfile.entitlements b/examples/flutter/materials/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/examples/flutter/materials/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/examples/flutter/materials/macos/Runner/Info.plist b/examples/flutter/materials/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/examples/flutter/materials/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/examples/flutter/materials/macos/Runner/MainFlutterWindow.swift b/examples/flutter/materials/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..3cc05eb2 --- /dev/null +++ b/examples/flutter/materials/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/examples/flutter/materials/macos/Runner/Release.entitlements b/examples/flutter/materials/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/examples/flutter/materials/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/examples/flutter/materials/macos/Runner/RunnerDebug.entitlements b/examples/flutter/materials/macos/Runner/RunnerDebug.entitlements new file mode 100644 index 00000000..d35e43ae --- /dev/null +++ b/examples/flutter/materials/macos/Runner/RunnerDebug.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.cs.allow-jit + + + diff --git a/examples/flutter/materials/macos/RunnerTests/RunnerTests.swift b/examples/flutter/materials/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 00000000..61f3bd1f --- /dev/null +++ b/examples/flutter/materials/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/examples/flutter/materials/pubspec.yaml b/examples/flutter/materials/pubspec.yaml new file mode 100644 index 00000000..938b335b --- /dev/null +++ b/examples/flutter/materials/pubspec.yaml @@ -0,0 +1,40 @@ +name: materials +description: "A new Flutter project." +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +version: 1.0.0+1 + +environment: + sdk: ^3.7.0-78.0.dev + +dependencies: + flutter: + sdk: flutter + cupertino_icons: ^1.0.8 + thermion_dart: + path: ../../../thermion_dart + thermion_flutter: + path: ../../../thermion_flutter/thermion_flutter + thermion_flutter_ffi: + path: ../../../thermion_flutter/thermion_flutter_ffi + thermion_flutter_platform_interface: + path: ../../../thermion_flutter/thermion_flutter_platform_interface + +dev_dependencies: + flutter_test: + sdk: flutter + + flutter_lints: ^5.0.0 + +dependency_overrides: + thermion_dart: + path: ../../../thermion_dart + thermion_flutter: + path: ../../../thermion_flutter/thermion_flutter + thermion_flutter_ffi: + path: ../../../thermion_flutter/thermion_flutter_ffi + thermion_flutter_platform_interface: + path: ../../../thermion_flutter/thermion_flutter_platform_interface + +flutter: + uses-material-design: true diff --git a/examples/flutter/materials/test/widget_test.dart b/examples/flutter/materials/test/widget_test.dart new file mode 100644 index 00000000..deb698ef --- /dev/null +++ b/examples/flutter/materials/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:materials/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/materials/grid.mat b/materials/grid.mat index cf3faf25..e41174f2 100644 --- a/materials/grid.mat +++ b/materials/grid.mat @@ -10,10 +10,10 @@ material { name : color } ], - depthWrite : true, - depthCulling : false, + depthWrite : false, + depthCulling : true, shadingModel : unlit, - blending: transparent, + blending: opaque, variantFilter : [ skinning, shadowReceiver, vsm ], culling: none, instanced: false, @@ -22,7 +22,11 @@ material { vertex { void materialVertex(inout MaterialVertexInputs material) { - material.worldPosition = getWorldFromModelMatrix() * getPosition(); + vec4 modelSpace = getPosition(); + vec4 worldSpace = getWorldFromModelMatrix() * modelSpace; + vec4 clipSpace = getClipFromWorldMatrix() * worldSpace; + clipSpace.z = 0.01f; + material.worldPosition = getWorldFromClipMatrix() * clipSpace; } } diff --git a/materials/unlit_fixed_size.mat b/materials/unlit_fixed_size.mat index 6444abaa..46ade86f 100644 --- a/materials/unlit_fixed_size.mat +++ b/materials/unlit_fixed_size.mat @@ -39,9 +39,9 @@ worldSpace = getWorldFromModelMatrix() * modelSpace; material.worldPosition = worldSpace; - //vec4 clipSpace = getClipFromWorldMatrix() * worldSpace; - //clipSpace.z = 0.99f; - //material.worldPosition = getWorldFromClipMatrix() * clipSpace; + vec4 clipSpace = getClipFromWorldMatrix() * worldSpace; + clipSpace.z = 0.99f; + material.worldPosition = getWorldFromClipMatrix() * clipSpace; } } diff --git a/thermion_dart/ffigen/native.yaml b/thermion_dart/ffigen/native.yaml index d848b9f5..ab383dbd 100644 --- a/thermion_dart/ffigen/native.yaml +++ b/thermion_dart/ffigen/native.yaml @@ -1,21 +1,11 @@ output: '../lib/src/viewer/src/ffi/src/thermion_dart.g.dart' headers: entry-points: - - '../native/include/ThermionDartRenderThreadApi.h' - - '../native/include/ThermionDartApi.h' - - '../native/include/TView.h' - - '../native/include/TCamera.h' - - '../native/include/TGizmo.h' + - '../native/include/c_api/*.h' - '../native/include/ResourceBuffer.h' include-directives: - - '../native/include/ThermionDartRenderThreadApi.h' - - '../native/include/ThermionDartApi.h' - - '../native/include/TView.h' - - '../native/include/TCamera.h' - - '../native/include/TGizmo.h' - - '../native/include/TMaterialInstance.h' + - '../native/include/c_api/*.h' - '../native/include/ResourceBuffer.h' - - '../native/include/APIBoundaryTypes.h' ffi-native: assetId: package:thermion_dart/thermion_dart.dart ignore-source-errors: true diff --git a/thermion_dart/lib/src/input/input.dart b/thermion_dart/lib/src/input/input.dart index 6a8072f8..9f9bbc4a 100644 --- a/thermion_dart/lib/src/input/input.dart +++ b/thermion_dart/lib/src/input/input.dart @@ -4,4 +4,6 @@ export 'src/input_handler.dart'; export 'src/delegates.dart'; export 'src/delegate_input_handler.dart'; export 'src/implementations/default_pick_delegate.dart'; +export 'src/implementations/gizmo_pick_delegate.dart'; +export 'src/implementations/gizmo_input_handler.dart'; export 'src/implementations/third_person_camera_delegate.dart'; diff --git a/thermion_dart/lib/src/input/src/delegate_input_handler.dart b/thermion_dart/lib/src/input/src/delegate_input_handler.dart index e100152f..72cc75c6 100644 --- a/thermion_dart/lib/src/input/src/delegate_input_handler.dart +++ b/thermion_dart/lib/src/input/src/delegate_input_handler.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:math'; import 'package:logging/logging.dart'; import 'package:thermion_dart/thermion_dart.dart'; import 'package:vector_math/vector_math_64.dart'; @@ -54,6 +53,13 @@ class DelegateInputHandler implements InputHandler { _actions = actions; } + if (pickDelegate != null) { + if (_actions[InputType.LMB_DOWN] != null) { + throw Exception(); + } + _actions[InputType.LMB_DOWN] = InputAction.PICK; + } + for (var gestureType in InputType.values) { _inputDeltas[gestureType] = Vector3.zero(); } @@ -94,7 +100,7 @@ class DelegateInputHandler implements InputHandler { clampY: clampY, entity: entity, rotationSensitivity: rotateSensitivity, - zoomSensitivity:zoomSensitivity, + zoomSensitivity: zoomSensitivity, panSensitivity: panSensitivity, movementSensitivity: movementSensitivity), actions: { @@ -265,7 +271,8 @@ class DelegateInputHandler implements InputHandler { Future onScaleEnd(int pointerCount, double velocity) async {} @override - Future onScaleStart(Vector2 localPosition, int pointerCount, Duration? sourceTimestamp ) async { + Future onScaleStart(Vector2 localPosition, int pointerCount, + Duration? sourceTimestamp) async { // noop } diff --git a/thermion_dart/lib/src/input/src/delegates.dart b/thermion_dart/lib/src/input/src/delegates.dart index c2cdb2f1..fc1909bd 100644 --- a/thermion_dart/lib/src/input/src/delegates.dart +++ b/thermion_dart/lib/src/input/src/delegates.dart @@ -24,4 +24,5 @@ abstract class VelocityDelegate { abstract class PickDelegate { const PickDelegate(); void pick(Vector2 location); + Future dispose(); } diff --git a/thermion_dart/lib/src/input/src/implementations/default_pick_delegate.dart b/thermion_dart/lib/src/input/src/implementations/default_pick_delegate.dart index 73835163..35074414 100644 --- a/thermion_dart/lib/src/input/src/implementations/default_pick_delegate.dart +++ b/thermion_dart/lib/src/input/src/implementations/default_pick_delegate.dart @@ -1,13 +1,24 @@ +import 'dart:async'; + import 'package:thermion_dart/thermion_dart.dart'; import 'package:vector_math/vector_math_64.dart'; class DefaultPickDelegate extends PickDelegate { final ThermionViewer viewer; - const DefaultPickDelegate(this.viewer); + DefaultPickDelegate(this.viewer); + + final _picked = StreamController(); + Stream get picked => _picked.stream; + + Future dispose() async { + _picked.close(); + } @override void pick(Vector2 location) { - viewer.pick(location.x.toInt(), location.y.toInt()); + viewer.pick(location.x.toInt(), location.y.toInt(), (result) { + _picked.sink.add(result.entity); + }); } } diff --git a/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate.dart b/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate.dart index 6ea8e4e4..73de7af1 100644 --- a/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate.dart +++ b/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate.dart @@ -86,13 +86,14 @@ class FreeFlightInputHandlerDelegate implements InputHandlerDelegate { if (_queuedRotationDelta.length2 > 0.0) { double deltaX = _queuedRotationDelta.x * rotationSensitivity; double deltaY = _queuedRotationDelta.y * rotationSensitivity; - relativeRotation = Quaternion.axisAngle(current.up, -deltaX) * Quaternion.axisAngle(current.right, -deltaY); + relativeRotation = Quaternion.axisAngle(current.up, -deltaX) * + Quaternion.axisAngle(current.right, -deltaY); _queuedRotationDelta = Vector2.zero(); } // Apply (mouse) pan if (_queuedTranslateDelta.length2 > 0.0) { - double deltaX = _queuedTranslateDelta.x * panSensitivity; + double deltaX = -_queuedTranslateDelta.x * panSensitivity; double deltaY = _queuedTranslateDelta.y * panSensitivity; double deltaZ = -_queuedTranslateDelta.z * panSensitivity; @@ -104,8 +105,9 @@ class FreeFlightInputHandlerDelegate implements InputHandlerDelegate { // Apply zoom if (_queuedZoomDelta != 0.0) { - relativeTranslation += current.forward - ..scaled(_queuedZoomDelta * zoomSensitivity); + var zoomTranslation = current.forward..scaled(zoomSensitivity); + zoomTranslation.scale(_queuedZoomDelta); + relativeTranslation += zoomTranslation; _queuedZoomDelta = 0.0; } @@ -128,11 +130,10 @@ class FreeFlightInputHandlerDelegate implements InputHandlerDelegate { await viewer.setTransform( await entity, - - Matrix4.compose( - relativeTranslation, relativeRotation, Vector3(1, 1, 1)) * current ); + Matrix4.compose( + relativeTranslation, relativeRotation, Vector3(1, 1, 1)) * + current); _executing = false; } - } diff --git a/thermion_dart/lib/src/input/src/implementations/gizmo_input_handler.dart b/thermion_dart/lib/src/input/src/implementations/gizmo_input_handler.dart new file mode 100644 index 00000000..05fd0025 --- /dev/null +++ b/thermion_dart/lib/src/input/src/implementations/gizmo_input_handler.dart @@ -0,0 +1,238 @@ +import 'dart:async'; +import 'package:thermion_dart/thermion_dart.dart'; +import 'package:vector_math/vector_math_64.dart'; + +class _Gizmo { + bool isVisible = false; + + final ThermionViewer viewer; + final nonPickable = {}; + final GizmoAsset _asset; + + _Gizmo(this._asset, this.viewer); + + Axis? _active; + Axis? get active => _active; + + Vector3? _activeCords; + + void checkHover(int x, int y) async { + _asset.pick(x, y, handler: (result, coords) async { + switch (result) { + case GizmoPickResultType.None: + await _asset.unhighlight(); + _active = null; + break; + case GizmoPickResultType.AxisX: + _active = Axis.X; + _activeCords = coords; + + case GizmoPickResultType.AxisY: + _active = Axis.Y; + _activeCords = coords; + + case GizmoPickResultType.AxisZ: + _active = Axis.Z; + _activeCords = coords; + + default: + } + }); + } + + Matrix4? gizmoTransform; + + Future attach(ThermionEntity entity) async { + if (_asset.nonPickableEntities.contains(entity)) { + return; + } + final transform = await viewer.getWorldTransform(entity); + transform.setRotation(Matrix3.identity()); + transform.setDiagonal(Vector4.all(1.0)); + await viewer.setTransform(_asset.entity, transform); + await viewer.setParent(entity, _asset.entity); + if (!isVisible) { + await _asset.addToScene(); + isVisible = true; + } + gizmoTransform = await viewer.getWorldTransform(_asset.entity); + } + + Future detach() async { + await _asset.removeFromScene(); + _active = null; + isVisible = false; + } + + void _updateTransform(Vector2 currentPosition, Vector2 delta) async { + if (gizmoTransform == null) { + return; + } + + var view = await viewer.getViewAt(0); + var camera = await viewer.getActiveCamera(); + + var viewport = await view.getViewport(); + + var projectionMatrix = await viewer.getCameraProjectionMatrix(); + var viewMatrix = await camera.getViewMatrix(); + var inverseViewMatrix = await camera.getModelMatrix(); + var inverseProjectionMatrix = projectionMatrix.clone()..invert(); + + // get gizmo position in screenspace + var gizmoPositionWorldSpace = gizmoTransform!.getTranslation(); + Vector4 gizmoClipSpace = projectionMatrix * + viewMatrix * + Vector4(gizmoPositionWorldSpace.x, gizmoPositionWorldSpace.y, + gizmoPositionWorldSpace.z, 1.0); + + var gizmoNdc = gizmoClipSpace / gizmoClipSpace.w; + + var gizmoScreenSpace = Vector2(((gizmoNdc.x / 2) + 0.5) * viewport.width, + viewport.height - (((gizmoNdc.y / 2) + 0.5) * viewport.height)); + + gizmoScreenSpace += delta; + + gizmoNdc = Vector4(((gizmoScreenSpace.x / viewport.width) - 0.5) * 2, + (((gizmoScreenSpace.y / viewport.height)) - 0.5) * -2, gizmoNdc.z, 1.0); + + var gizmoViewSpace = inverseProjectionMatrix * gizmoNdc; + gizmoViewSpace /= gizmoViewSpace.w; + + var newPosition = (inverseViewMatrix * gizmoViewSpace).xyz; + + Vector3 worldSpaceDelta = newPosition - gizmoTransform!.getTranslation(); + worldSpaceDelta.multiply(_active!.asVector()); + + gizmoTransform!.setTranslation(gizmoTransform!.getTranslation() + worldSpaceDelta); + + await viewer.setTransform(_asset.entity, gizmoTransform!); + } +} + +class GizmoInputHandler extends InputHandler { + final InputHandler wrapped; + final ThermionViewer viewer; + late final _Gizmo translationGizmo; + + GizmoInputHandler({required this.wrapped, required this.viewer}) { + initialize(); + } + + final _initialized = Completer(); + Future initialize() async { + if (_initialized.isCompleted) { + throw Exception("Already initialized"); + } + await viewer.initialized; + final view = await viewer.getViewAt(0); + var translationGizmoAsset = + await viewer.createGizmo(view, GizmoType.translation); + this.translationGizmo = _Gizmo(translationGizmoAsset, viewer); + _initialized.complete(true); + } + + @override + Stream get cameraUpdated => throw UnimplementedError(); + + @override + Future dispose() async { + await viewer.removeEntity(translationGizmo._asset); + } + + @override + InputAction? getActionForType(InputType gestureType) { + if (gestureType == InputType.LMB_DOWN) { + return InputAction.PICK; + } + throw UnimplementedError(); + } + + @override + Future get initialized => _initialized.future; + + @override + void keyDown(PhysicalKey key) { + wrapped.keyDown(key); + } + + @override + void keyUp(PhysicalKey key) { + wrapped.keyDown(key); + } + + @override + Future onPointerDown(Vector2 localPosition, bool isMiddle) async { + if (!_initialized.isCompleted) { + return; + } + await viewer.pick(localPosition.x.toInt(), localPosition.y.toInt(), + (result) { + translationGizmo.attach(result.entity); + }); + } + + @override + Future onPointerHover(Vector2 localPosition, Vector2 delta) async { + if (!_initialized.isCompleted) { + return; + } + translationGizmo.checkHover( + localPosition.x.floor(), localPosition.y.floor()); + } + + @override + Future onPointerMove( + Vector2 localPosition, Vector2 delta, bool isMiddle) async { + if (!isMiddle && translationGizmo._active != null) { + final scaledDelta = Vector2( + delta.x, + delta.y, + ); + translationGizmo._updateTransform(localPosition, scaledDelta); + return; + } + return wrapped.onPointerMove(localPosition, delta, isMiddle); + } + + @override + Future onPointerScroll( + Vector2 localPosition, double scrollDelta) async { + return wrapped.onPointerScroll(localPosition, scrollDelta); + } + + @override + Future onPointerUp(bool isMiddle) async { + await wrapped.onPointerUp(isMiddle); + } + + @override + Future onScaleEnd(int pointerCount, double velocity) { + return wrapped.onScaleEnd(pointerCount, velocity); + } + + @override + Future onScaleStart( + Vector2 focalPoint, int pointerCount, Duration? sourceTimestamp) { + return wrapped.onScaleStart(focalPoint, pointerCount, sourceTimestamp); + } + + @override + Future onScaleUpdate( + Vector2 focalPoint, + Vector2 focalPointDelta, + double horizontalScale, + double verticalScale, + double scale, + int pointerCount, + double rotation, + Duration? sourceTimestamp) { + return wrapped.onScaleUpdate(focalPoint, focalPointDelta, horizontalScale, + verticalScale, scale, pointerCount, rotation, sourceTimestamp); + } + + @override + void setActionForType(InputType gestureType, InputAction gestureAction) { + throw UnimplementedError(); + } +} diff --git a/thermion_dart/lib/src/input/src/implementations/gizmo_pick_delegate.dart b/thermion_dart/lib/src/input/src/implementations/gizmo_pick_delegate.dart new file mode 100644 index 00000000..18db23d8 --- /dev/null +++ b/thermion_dart/lib/src/input/src/implementations/gizmo_pick_delegate.dart @@ -0,0 +1,41 @@ +// import 'dart:async'; + +// import 'package:thermion_dart/thermion_dart.dart'; +// import 'package:vector_math/vector_math_64.dart'; + +// class GizmoPickDelegate extends PickDelegate { +// final ThermionViewer viewer; +// late final GizmoAsset translationGizmo; + +// GizmoPickDelegate(this.viewer) { +// initialize(); +// } + +// bool _initialized = false; +// Future initialize() async { +// if (_initialized) { +// throw Exception("Already initialized"); +// } +// final view = await viewer.getViewAt(0); +// translationGizmo = await viewer.createGizmo(view, GizmoType.translation); +// await translationGizmo.addToScene(); +// _initialized = true; +// } + +// final _picked = StreamController(); +// Stream get picked => _picked.stream; + +// Future dispose() async { +// _picked.close(); +// } + +// @override +// void pick(Vector2 location) { +// if (!_initialized) { +// return; +// } +// viewer.pick(location.x.toInt(), location.y.toInt(), (result) { +// translationGizmo.attach(result.entity); +// }); +// } +// } diff --git a/thermion_dart/lib/src/input/src/implementations/picking_camera_gesture_handler.dart b/thermion_dart/lib/src/input/src/implementations/picking_camera_gesture_handler.dart index f3056f20..5a4f88e5 100644 --- a/thermion_dart/lib/src/input/src/implementations/picking_camera_gesture_handler.dart +++ b/thermion_dart/lib/src/input/src/implementations/picking_camera_gesture_handler.dart @@ -1,230 +1,329 @@ // 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_dart/thermion_dart/input/input_handler.dart'; +// import 'package:thermion_dart/thermion_dart.dart'; +// import 'package:vector_math/vector_math_64.dart'; -// // Renamed implementation -// class PickingCameraGestureHandler implements InputHandler { +// import '../input_handler.dart'; + +// class GizmoPickingHandler implements InputHandler { // final ThermionViewer viewer; -// final bool enableCamera; -// final bool enablePicking; -// final Logger _logger = Logger("PickingCameraGestureHandler"); +// late final GizmoAsset _translationGizmo; -// AbstractGizmo? _gizmo; -// Timer? _scrollTimer; -// ThermionEntity? _highlightedEntity; -// StreamSubscription? _pickResultSubscription; +// GizmoPickingHandler(this.viewer) {} -// bool _gizmoAttached = false; +// final _initialized = Completer(); -// 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"); +// Future initialize() async { +// if (_initialized.isCompleted) { +// throw Exception("Already initialized"); // } +// final view = await viewer.getViewAt(0); +// _translationGizmo = await viewer.createGizmo(view, GizmoType.translation); +// _initialized.complete(true); +// } -// _pickResultSubscription = viewer.pickResult.listen(_onPickResult); - -// // Add keyboard listener -// RawKeyboard.instance.addListener(_handleKeyEvent); +// Future dispose() async { +// await viewer.removeEntity(_translationGizmo); // } // @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!); -// _gizmo?.attach(_highlightedEntity!); -// } -// } -// } +// Stream get cameraUpdated => throw UnimplementedError(); // @override -// Future onPointerHover(Offset localPosition, Offset delta) 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 -// InputAction getActionForType(InputType type) { -// // TODO: implement getActionForType +// InputAction? getActionForType(InputType gestureType) { // throw UnimplementedError(); // } // @override -// Future onScaleEnd() { +// Future get initialized => _initialized.future; + +// @override +// void keyDown(PhysicalKey key) {} + +// @override +// void keyUp(PhysicalKey key) {} + +// @override +// Future onPointerDown(Vector2 localPosition, bool isMiddle) { +// viewer.pick(localPosition.x.floor(), localPosition.y.floor(), (axis) { + +// }) +// // _translationGizmo.pick( +// // localPosition.x.floor(), localPosition.y.floor(), (axis) {}); +// } + +// @override +// Future onPointerHover(Vector2 localPosition, Vector2 delta) { +// // TODO: implement onPointerHover +// throw UnimplementedError(); +// } + +// @override +// Future onPointerMove( +// Vector2 localPosition, Vector2 delta, bool isMiddle) { +// // TODO: implement onPointerMove +// throw UnimplementedError(); +// } + +// @override +// Future onPointerScroll(Vector2 localPosition, double scrollDelta) { +// // TODO: implement onPointerScroll +// throw UnimplementedError(); +// } + +// @override +// Future onPointerUp(bool isMiddle) { +// // TODO: implement onPointerUp +// throw UnimplementedError(); +// } + +// @override +// Future onScaleEnd(int pointerCount, double velocity) { // // TODO: implement onScaleEnd // throw UnimplementedError(); // } // @override -// Future onScaleStart() { +// Future onScaleStart( +// Vector2 focalPoint, int pointerCount, Duration? sourceTimestamp) { // // TODO: implement onScaleStart // throw UnimplementedError(); // } // @override -// Future onScaleUpdate() { +// Future onScaleUpdate( +// Vector2 focalPoint, +// Vector2 focalPointDelta, +// double horizontalScale, +// double verticalScale, +// double scale, +// int pointerCount, +// double rotation, +// Duration? sourceTimestamp) { // // TODO: implement onScaleUpdate // throw UnimplementedError(); // } // @override -// void setActionForType(InputType type, InputAction action) { +// void setActionForType(InputType gestureType, InputAction gestureAction) { // // TODO: implement setActionForType // } // } +// // final ThermionViewer viewer; +// // final bool enableCamera; +// // final bool enablePicking; +// // final Logger _logger = Logger("PickingCameraGestureHandler"); + +// // 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!); +// // _gizmo?.attach(_highlightedEntity!); +// // } +// // } +// // } + +// // @override +// // Future onPointerHover(Offset localPosition, Offset delta) 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 +// // InputAction getActionForType(InputType 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(InputType type, InputAction action) { +// // // TODO: implement setActionForType +// // } +// // } diff --git a/thermion_dart/lib/src/utils/src/axis.dart b/thermion_dart/lib/src/utils/src/axis.dart index 6c9226e4..f4e7a34d 100644 --- a/thermion_dart/lib/src/utils/src/axis.dart +++ b/thermion_dart/lib/src/utils/src/axis.dart @@ -4,41 +4,40 @@ import 'package:vector_math/vector_math_64.dart'; import '../../viewer/viewer.dart'; -class Axis { +class AxisWidget { final ThermionViewer _viewer; final ThermionEntity xAxis; final ThermionEntity yAxis; final ThermionEntity zAxis; - Axis._(this.xAxis, this.yAxis, this.zAxis, this._viewer); + AxisWidget._(this.xAxis, this.yAxis, this.zAxis, this._viewer); static Future create(ThermionViewer viewer) async { - final xAxis = await viewer!.createGeometry( + final xAxis = await viewer.createGeometry( Geometry(Float32List.fromList([0, 0, 0, 10, 0, 0]), [0, 1], primitiveType: PrimitiveType.LINES), - materialInstance: await viewer!.createUnlitMaterialInstance()); - final yAxis = await viewer!.createGeometry( + materialInstances: [await viewer.createUnlitMaterialInstance()]); + final yAxis = await viewer.createGeometry( Geometry(Float32List.fromList([0, 0, 0, 0, 10, 0]), [0, 1], primitiveType: PrimitiveType.LINES), - materialInstance: await viewer!.createUnlitMaterialInstance()); - final zAxis = await viewer!.createGeometry( + materialInstances: [await viewer.createUnlitMaterialInstance()]); + final zAxis = await viewer.createGeometry( Geometry(Float32List.fromList([0, 0, 0, 0, 0, 10]), [0, 1], primitiveType: PrimitiveType.LINES), - materialInstance: await viewer!.createUnlitMaterialInstance()); - - await viewer!.setMaterialPropertyFloat4( - xAxis, "baseColorFactor", 0, 1.0, 0.0, 0.0, 1.0); - await viewer!.setMaterialPropertyFloat4( - yAxis, "baseColorFactor", 0, 0.0, 1.0, 0.0, 1.0); - await viewer!.setMaterialPropertyFloat4( - zAxis, "baseColorFactor", 0, 0.0, 0.0, 1.0, 1.0); - return Axis._(xAxis, yAxis, zAxis, viewer); + materialInstances: [await viewer.createUnlitMaterialInstance()]); + throw Exception("TODO"); + // await viewer!.setMaterialPropertyFloat4( + // xAxis, "baseColorFactor", 0, 1.0, 0.0, 0.0, 1.0); + // await viewer!.setMaterialPropertyFloat4( + // yAxis, "baseColorFactor", 0, 0.0, 1.0, 0.0, 1.0); + // await viewer!.setMaterialPropertyFloat4( + // zAxis, "baseColorFactor", 0, 0.0, 0.0, 1.0, 1.0); + // return Axis._(xAxis, yAxis, zAxis, viewer); } Future setTransform(Matrix4 transform) async { await _viewer.setTransform(xAxis, transform); await _viewer.setTransform(yAxis, transform); await _viewer.setTransform(zAxis, transform); - } } diff --git a/thermion_dart/lib/src/utils/src/gizmo.dart b/thermion_dart/lib/src/utils/src/gizmo.dart index ad023f0c..5de06146 100644 --- a/thermion_dart/lib/src/utils/src/gizmo.dart +++ b/thermion_dart/lib/src/utils/src/gizmo.dart @@ -1,127 +1,120 @@ import 'dart:async'; - import 'package:thermion_dart/src/viewer/viewer.dart'; -import 'package:vector_math/vector_math_64.dart'; -abstract class Gizmo { - bool get isVisible; - bool get isHovered; - void reset(); - Future attach(ThermionEntity entity); - Future detach(); +// abstract class BaseGizmo extends Gizmo { +// final ThermionEntity x; +// final ThermionEntity y; +// final ThermionEntity z; +// final ThermionEntity center; - Stream get boundingBox; +// ThermionEntity? _activeAxis; +// ThermionEntity? _activeEntity; +// ThermionViewer viewer; - void checkHover(int x, int y); -} +// bool _visible = false; +// bool get isVisible => _visible; -abstract class BaseGizmo extends Gizmo { - final ThermionEntity x; - final ThermionEntity y; - final ThermionEntity z; - final ThermionEntity center; +// bool _isHovered = false; +// bool get isHovered => _isHovered; - ThermionEntity? _activeAxis; - ThermionEntity? _activeEntity; - ThermionViewer viewer; +// final Set ignore; - bool _visible = false; - bool get isVisible => _visible; +// Stream get boundingBox => _boundingBoxController.stream; +// final _boundingBoxController = StreamController.broadcast(); - bool _isHovered = false; - bool get isHovered => _isHovered; +// ThermionEntity get entity => center; - final Set ignore; +// BaseGizmo( +// {required this.x, +// required this.y, +// required this.z, +// required this.center, +// required this.viewer, +// this.ignore = const {}}) { +// onPick(_onGizmoPickResult); +// } - Stream get boundingBox => _boundingBoxController.stream; - final _boundingBoxController = StreamController.broadcast(); +// final _stopwatch = Stopwatch(); - BaseGizmo({required this.x, required this.y, required this.z, required this.center, required this.viewer, - this.ignore = const {}}) { - onPick(_onGizmoPickResult); - } +// double _transX = 0.0; +// double _transY = 0.0; - final _stopwatch = Stopwatch(); +// Future translate(double transX, double transY) async { +// if (!_stopwatch.isRunning) { +// _stopwatch.start(); +// } - double _transX = 0.0; - double _transY = 0.0; +// _transX += transX; +// _transY += transY; - Future translate(double transX, double transY) async { - if (!_stopwatch.isRunning) { - _stopwatch.start(); - } +// if (_stopwatch.elapsedMilliseconds < 16) { +// return; +// } - _transX += transX; - _transY += transY; +// final axis = Vector3(_activeAxis == x ? 1.0 : 0.0, +// _activeAxis == y ? 1.0 : 0.0, _activeAxis == z ? 1.0 : 0.0); - if (_stopwatch.elapsedMilliseconds < 16) { - return; - } +// await viewer.queueRelativePositionUpdateWorldAxis( +// _activeEntity!, +// _transX, +// -_transY, // 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(); +// } - final axis = Vector3(_activeAxis == x ? 1.0 : 0.0, - _activeAxis == y ? 1.0 : 0.0, _activeAxis == z ? 1.0 : 0.0); +// void reset() { +// _activeAxis = null; +// } - await viewer.queueRelativePositionUpdateWorldAxis( - _activeEntity!, - _transX, - -_transY, // 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(); - } +// void _onGizmoPickResult(FilamentPickResult result) async { +// if (result.entity == x || result.entity == y || result.entity == z) { +// _activeAxis = result.entity; +// _isHovered = true; +// } else if (result.entity == 0) { +// _activeAxis = null; +// _isHovered = false; +// } else { +// throw Exception("Unexpected gizmo pick result"); +// } +// } - void reset() { - _activeAxis = null; - } +// Future attach(ThermionEntity entity) async { +// _activeAxis = null; +// if (entity == _activeEntity) { +// return; +// } +// if (entity == center) { +// _activeEntity = null; +// return; +// } +// _visible = true; - void _onGizmoPickResult(FilamentPickResult result) async { - if (result.entity == x || result.entity == y || result.entity == z) { - _activeAxis = result.entity; - _isHovered = true; - } else if (result.entity == 0) { - _activeAxis = null; - _isHovered = false; - } else { - throw Exception("Unexpected gizmo pick result"); - } - } +// if (_activeEntity != null) { +// // await viewer.removeStencilHighlight(_activeEntity!); +// } +// _activeEntity = entity; - Future attach(ThermionEntity entity) async { - _activeAxis = null; - if (entity == _activeEntity) { - return; - } - if (entity == center) { - _activeEntity = null; - return; - } - _visible = true; +// await viewer.setParent(center, entity, preserveScaling: false); +// _boundingBoxController.sink.add(await viewer.getViewportBoundingBox(x)); +// } - if (_activeEntity != null) { - await viewer.removeStencilHighlight(_activeEntity!); - } - _activeEntity = entity; +// Future detach() async { +// await setVisibility(false); +// } - await viewer.setParent(center, entity, preserveScaling: false); - _boundingBoxController.sink.add(await viewer.getViewportBoundingBox(x)); - } +// @override +// void checkHover(int x, int y) { +// pick(x, y); +// } - Future detach() async { - await setVisibility(false); - } +// Future pick(int x, int y); - @override - void checkHover(int x, int y) { - pick(x, y); - } - - Future pick(int x, int y); - - Future setVisibility(bool visible); - void onPick(void Function(PickResult result) callback); -} +// Future setVisibility(bool visible); +// void onPick(void Function(PickResult result) callback); +// } diff --git a/thermion_dart/lib/src/viewer/src/events.dart b/thermion_dart/lib/src/viewer/src/events.dart deleted file mode 100644 index 0180ef1d..00000000 --- a/thermion_dart/lib/src/viewer/src/events.dart +++ /dev/null @@ -1,85 +0,0 @@ -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/src/viewer/src/ffi/src/ffi_asset.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart new file mode 100644 index 00000000..fceaa67a --- /dev/null +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart @@ -0,0 +1,186 @@ +import 'dart:typed_data'; + +import 'package:thermion_dart/src/viewer/src/ffi/src/callbacks.dart'; +import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_viewer_ffi.dart'; +import 'package:thermion_dart/thermion_dart.dart'; + +import 'ffi_material_instance.dart'; + +class FFIAsset extends ThermionAsset { + final Pointer pointer; + final Pointer sceneManager; + Pointer get renderableManager => + Engine_getRenderableManager(engine); + final Pointer engine; + FFIAsset? _highlight; + final Pointer _unlitMaterialProvider; + final bool isInstance; + + late final ThermionEntity entity; + + FFIAsset( + this.pointer, this.sceneManager, this.engine, this._unlitMaterialProvider, + {this.isInstance = false}) { + entity = SceneAsset_getEntity(pointer); + } + + @override + Future> getChildEntities() async { + var count = SceneAsset_getChildEntityCount(pointer); + var children = Int32List(count); + SceneAsset_getChildEntities(pointer, children.address); + return children; + } + + @override + Future getInstance(int index) async { + if (isInstance) { + throw Exception( + "This is itself an instance. Call getInstance on the original asset that this instance was created from"); + } + var instance = SceneAsset_getInstance(pointer, index); + if (instance == nullptr) { + throw Exception("No instance available at index $index"); + } + return FFIAsset(instance, sceneManager, engine, _unlitMaterialProvider); + } + + /// + /// + /// + @override + Future createInstance( + {covariant List? materialInstances = null}) async { + var created = await withPointerCallback((cb) { + var ptrList = Int64List(materialInstances?.length ?? 0); + if (materialInstances != null && materialInstances.isNotEmpty) { + ptrList.setRange( + 0, + materialInstances.length, + materialInstances + .cast() + .map((mi) => mi.pointer.address) + .toList()); + } + + SceneAsset_createInstanceRenderThread( + pointer, + ptrList.address.cast>(), + materialInstances?.length ?? 0, + cb); + }); + if (created == FILAMENT_ASSET_ERROR) { + throw Exception("Failed to create instance"); + } + return FFIAsset(created, sceneManager, engine, _unlitMaterialProvider); + } + + /// + /// + /// + @override + Future getInstanceCount() async { + return SceneAsset_getInstanceCount(pointer); + } + + /// + /// + /// + @override + Future> getInstances() async { + var count = await getInstanceCount(); + final result = List.generate(count, (i) { + return FFIAsset(SceneAsset_getInstance(pointer, i), sceneManager, engine, + _unlitMaterialProvider); + }); + + return result; + } + + @override + Future removeStencilHighlight() async { + if (_highlight != null) { + SceneManager_removeFromScene(sceneManager, _highlight!.entity); + final childEntities = await _highlight!.getChildEntities(); + for (final child in childEntities) { + SceneManager_removeFromScene(sceneManager, child); + } + } + } + + @override + Future setStencilHighlight( + {double r = 1.0, + double g = 0.0, + double b = 0.0, + int? entityIndex}) async { + if (_highlight == null) { + var targetEntity = this.entity; + if (entityIndex != null) { + final childEntities = await this.getChildEntities(); + targetEntity = childEntities[entityIndex!]; + } + var sourceMaterialInstance = ThermionFFIMaterialInstance( + RenderableManager_getMaterialInstanceAt( + renderableManager, targetEntity, 0)); + + await sourceMaterialInstance.setStencilWriteEnabled(true); + await sourceMaterialInstance.setDepthWriteEnabled(true); + await sourceMaterialInstance + .setStencilOpDepthStencilPass(StencilOperation.REPLACE); + + await sourceMaterialInstance.setStencilReferenceValue(1); + + final materialInstancePtr = + await withPointerCallback((cb) { + final key = Struct.create(); + MaterialProvider_createMaterialInstanceRenderThread( + _unlitMaterialProvider, key.address, cb); + }); + final highlightMaterialInstance = + ThermionFFIMaterialInstance(materialInstancePtr); + await highlightMaterialInstance + .setStencilCompareFunction(SamplerCompareFunction.NE); + await highlightMaterialInstance.setStencilReferenceValue(1); + + await highlightMaterialInstance.setDepthCullingEnabled(false); + + await highlightMaterialInstance.setParameterFloat("vertexScale", 1.03); + await highlightMaterialInstance.setParameterFloat4( + "baseColorFactor", r, g, b, 1.0); + + var highlightInstance = await this + .createInstance(materialInstances: [highlightMaterialInstance]); + _highlight = highlightInstance; + + var targetHighlightEntity = _highlight!.entity; + + if (entityIndex != null) { + var highlightChildEntities = await _highlight!.getChildEntities(); + targetHighlightEntity = highlightChildEntities[entityIndex!]; + } + + RenderableManager_setPriority( + renderableManager, targetHighlightEntity, 7); + RenderableManager_setPriority(renderableManager, targetEntity, 0); + + await highlightMaterialInstance.setStencilReferenceValue(1); + + SceneManager_addToScene(sceneManager, targetHighlightEntity); + } + } + + @override + Future addToScene() async { + SceneAsset_addToScene(pointer, SceneManager_getScene(sceneManager)); + + } + + @override + Future removeFromScene() async { + SceneManager_removeFromScene(sceneManager, entity); + for (final child in await getChildEntities()) { + SceneManager_removeFromScene(sceneManager, child); + } + } +} diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_camera.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_camera.dart index 365fe9fd..38c91a56 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_camera.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_camera.dart @@ -9,9 +9,10 @@ import 'thermion_dart.g.dart' as g; class FFICamera extends Camera { final Pointer camera; final Pointer engine; + final Pointer transformManager; late ThermionEntity _entity; - FFICamera(this.camera, this.engine) { + FFICamera(this.camera, this.engine, this.transformManager) { _entity = g.Camera_getEntity(camera); } @@ -29,7 +30,7 @@ class FFICamera extends Camera { @override Future setTransform(Matrix4 transform) async { var entity = g.Camera_getEntity(camera); - g.Engine_setTransform(engine, entity, matrix4ToDouble4x4(transform)); + g.TransformManager_setTransform(transformManager, entity, matrix4ToDouble4x4(transform)); } @override diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_gizmo.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_gizmo.dart index 872a689f..c858e537 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_gizmo.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_gizmo.dart @@ -1,50 +1,69 @@ import 'dart:async'; -import 'dart:ffi'; +import 'package:thermion_dart/src/viewer/src/ffi/src/callbacks.dart'; +import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_asset.dart'; +import 'package:thermion_dart/src/viewer/src/shared_types/entities.dart'; +import 'package:thermion_dart/thermion_dart.dart'; +import 'package:vector_math/vector_math_64.dart'; -import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_dart.g.dart'; - -import '../../../../utils/src/gizmo.dart'; -import '../../../viewer.dart'; - -class FFIGizmo extends BaseGizmo { - Pointer pointer; +import 'ffi_view.dart'; +class FFIGizmo extends FFIAsset implements GizmoAsset { + final Set nonPickableEntities; late NativeCallable _nativeCallback; + + void Function(GizmoPickResultType axis, Vector3 coords)? _callback; + + late FFIView _view; + + void _onPickResult(int resultType, double x, double y, double z) { + _callback?.call(GizmoPickResultType.values[resultType], Vector3(x, y, z)); + } + FFIGizmo( - this.pointer, ThermionViewer viewer) : super(x: 0, y: 0, z: 0, center: 0, viewer: viewer) { + this._view, + super.pointer, + super.sceneManager, + super.renderableManager, + super.unlitMaterialProvider, + this.nonPickableEntities + ) { _nativeCallback = NativeCallable.listener(_onPickResult); } - /// - /// The result(s) of calling [pickGizmo] (see below). - /// - // Stream get onPick => _pickResultController.stream; - // final _pickResultController = StreamController.broadcast(); - - void Function(PickResult)? _callback; - - void onPick(void Function(PickResult) callback) { - _callback = callback; - } - - void _onPickResult(DartEntityId entityId, int x, int y, Pointer view) { - _callback?.call((entity: entityId, x: x, y: y, depth: 0, fragX: 0, fragY: 0, fragZ: 0)); - } - - /// - /// 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). - /// @override - Future pick(int x, int y) async { - Gizmo_pick(pointer, x.toInt(), y, _nativeCallback.nativeFunction); + Future removeStencilHighlight() async { + throw Exception("Not supported for gizmo"); } @override - Future setVisibility(bool visible) async { - Gizmo_setVisibility(pointer, visible); + Future setStencilHighlight( + {double r = 1.0, + double g = 0.0, + double b = 0.0, + int? entityIndex}) async { + throw Exception("Not supported for gizmo"); + } + + @override + Future pick(int x, int y, + {Future Function(GizmoPickResultType result, Vector3 coords)? + handler}) async { + _callback = handler; + final viewport = await _view.getViewport(); + y = viewport.height - y; + + Gizmo_pick(pointer.cast(), x, y, _nativeCallback.nativeFunction); + } + + @override + Future highlight(Axis axis) async { + Gizmo_unhighlight(pointer.cast()); + Gizmo_highlight(pointer.cast(), TGizmoAxis.values[axis.index]); + } + + @override + Future unhighlight() async { + Gizmo_unhighlight(pointer.cast()); } } diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_material_instance.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_material_instance.dart new file mode 100644 index 00000000..7d918935 --- /dev/null +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_material_instance.dart @@ -0,0 +1,116 @@ +import 'dart:ffi'; + +import 'package:ffi/ffi.dart'; +import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_dart.g.dart'; +import 'package:thermion_dart/thermion_dart.dart'; + +class ThermionFFIMaterialInstance extends MaterialInstance { + final Pointer pointer; + + ThermionFFIMaterialInstance(this.pointer) { + if (pointer == nullptr) { + throw Exception("MaterialInstance not found"); + } + } + + @override + Future setDepthCullingEnabled(bool enabled) async { + MaterialInstance_setDepthCulling(this.pointer, enabled); + } + + @override + Future setDepthWriteEnabled(bool enabled) async { + MaterialInstance_setDepthWrite(this.pointer, enabled); + } + + @override + Future setParameterFloat4( + String name, double x, double y, double z, double w) async { + MaterialInstance_setParameterFloat4( + pointer, name.toNativeUtf8().cast(), x, y, z, w); + } + + @override + Future setParameterFloat2(String name, double x, double y) async { + MaterialInstance_setParameterFloat2( + pointer, name.toNativeUtf8().cast(), x, y); + } + + @override + Future setParameterFloat(String name, double value) async { + MaterialInstance_setParameterFloat( + pointer, name.toNativeUtf8().cast(), value); + } + + @override + Future setParameterInt(String name, int value) async { + MaterialInstance_setParameterInt( + pointer, name.toNativeUtf8().cast(), value); + } + + @override + Future setDepthFunc(SamplerCompareFunction depthFunc) async { + MaterialInstance_setDepthFunc(pointer, TSamplerCompareFunc.values[depthFunc.index]); + } + + @override + Future setStencilCompareFunction(SamplerCompareFunction func, + [StencilFace face = StencilFace.FRONT_AND_BACK]) async { + MaterialInstance_setStencilCompareFunction( + pointer, TSamplerCompareFunc.values[func.index], TStencilFace.values[face.index]); + } + + @override + Future setStencilOpDepthFail(StencilOperation op, + [StencilFace face = StencilFace.FRONT_AND_BACK]) async { + MaterialInstance_setStencilOpDepthFail(pointer, + TStencilOperation.values[op.index], TStencilFace.values[face.index]); + } + + @override + Future setStencilOpDepthStencilPass(StencilOperation op, + [StencilFace face = StencilFace.FRONT_AND_BACK]) async { + MaterialInstance_setStencilOpDepthStencilPass(pointer, + TStencilOperation.values[op.index], TStencilFace.values[face.index]); + } + + @override + Future setStencilOpStencilFail(StencilOperation op, + [StencilFace face = StencilFace.FRONT_AND_BACK]) async { + MaterialInstance_setStencilOpStencilFail(pointer, + TStencilOperation.values[op.index], TStencilFace.values[face.index]); + } + + @override + Future setStencilReferenceValue(int value, + [StencilFace face = StencilFace.FRONT_AND_BACK]) async { + MaterialInstance_setStencilReferenceValue( + pointer, value, TStencilFace.values[face.index]); + } + + @override + Future setStencilWriteEnabled(bool enabled) async { + MaterialInstance_setStencilWrite(pointer, enabled); + } + + @override + Future setCullingMode(CullingMode cullingMode) async { + MaterialInstance_setCullingMode( + pointer, TCullingMode.values[cullingMode.index]); + } + + @override + Future isStencilWriteEnabled() async { + return MaterialInstance_isStencilWriteEnabled(pointer); + } + + @override + Future setStencilReadMask(int mask) async { + MaterialInstance_setStencilReadMask(pointer, mask); + } + + @override + Future setStencilWriteMask(int mask) async { + MaterialInstance_setStencilWriteMask(pointer, mask); + } +} diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart index 442c6d4b..d737ef15 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart @@ -18,7 +18,7 @@ class FFIView extends View { @override Future setRenderTarget(covariant FFIRenderTarget? renderTarget) async { - if(renderTarget != null) { + if (renderTarget != null) { View_setRenderTarget(view, renderTarget.renderTarget); } else { View_setRenderTarget(view, nullptr); @@ -39,8 +39,9 @@ class FFIView extends View { @override Future getCamera() async { final engine = Viewer_getEngine(viewer); - final cameraPtr = View_getCamera(view); - return FFICamera(cameraPtr, engine); + final transformManager = Engine_getTransformManager(engine); + final cameraPtr = View_getCamera(view); + return FFICamera(cameraPtr, engine, transformManager); } @override @@ -72,4 +73,12 @@ class FFIView extends View { final engine = await Viewer_getEngine(viewer); View_setToneMappingRenderThread(view, engine, mapper.index); } + + Future setStencilBufferEnabled(bool enabled) async { + return View_setStencilBufferEnabled(view, enabled); + } + + Future isStencilBufferEnabled() async { + return View_isStencilBufferEnabled(view); + } } diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart index 6c0d5e20..d24933dd 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart @@ -7,6 +7,34 @@ library; import 'dart:ffi' as ffi; +@ffi.Native)>(isLeaf: true) +external bool MaterialInstance_isStencilWriteEnabled( + ffi.Pointer materialInstance, +); + +@ffi.Native, ffi.Bool)>( + isLeaf: true) +external void MaterialInstance_setStencilWrite( + ffi.Pointer materialInstance, + bool enabled, +); + +@ffi.Native, ffi.UnsignedInt)>( + symbol: "MaterialInstance_setCullingMode", isLeaf: true) +external void _MaterialInstance_setCullingMode( + ffi.Pointer materialInstance, + int culling, +); + +void MaterialInstance_setCullingMode( + ffi.Pointer materialInstance, + TCullingMode culling, +) => + _MaterialInstance_setCullingMode( + materialInstance, + culling.value, + ); + @ffi.Native, ffi.Bool)>( isLeaf: true) external void MaterialInstance_setDepthWrite( @@ -70,7 +98,7 @@ external void _MaterialInstance_setDepthFunc( void MaterialInstance_setDepthFunc( ffi.Pointer materialInstance, - TDepthFunc depthFunc, + TSamplerCompareFunc depthFunc, ) => _MaterialInstance_setDepthFunc( materialInstance, @@ -78,12 +106,132 @@ void MaterialInstance_setDepthFunc( ); @ffi.Native< - ffi.Pointer Function(LoadFilamentResourceFromOwner, - FreeFilamentResourceFromOwner, ffi.Pointer)>(isLeaf: true) -external ffi.Pointer make_resource_loader( - LoadFilamentResourceFromOwner loadFn, - FreeFilamentResourceFromOwner freeFn, - ffi.Pointer owner, + ffi.Void Function( + ffi.Pointer, ffi.UnsignedInt, ffi.UnsignedInt)>( + symbol: "MaterialInstance_setStencilOpStencilFail", isLeaf: true) +external void _MaterialInstance_setStencilOpStencilFail( + ffi.Pointer materialInstance, + int op, + int face, +); + +void MaterialInstance_setStencilOpStencilFail( + ffi.Pointer materialInstance, + TStencilOperation op, + TStencilFace face, +) => + _MaterialInstance_setStencilOpStencilFail( + materialInstance, + op.value, + face.value, + ); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.UnsignedInt, ffi.UnsignedInt)>( + symbol: "MaterialInstance_setStencilOpDepthFail", isLeaf: true) +external void _MaterialInstance_setStencilOpDepthFail( + ffi.Pointer materialInstance, + int op, + int face, +); + +void MaterialInstance_setStencilOpDepthFail( + ffi.Pointer materialInstance, + TStencilOperation op, + TStencilFace face, +) => + _MaterialInstance_setStencilOpDepthFail( + materialInstance, + op.value, + face.value, + ); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.UnsignedInt, ffi.UnsignedInt)>( + symbol: "MaterialInstance_setStencilOpDepthStencilPass", isLeaf: true) +external void _MaterialInstance_setStencilOpDepthStencilPass( + ffi.Pointer materialInstance, + int op, + int face, +); + +void MaterialInstance_setStencilOpDepthStencilPass( + ffi.Pointer materialInstance, + TStencilOperation op, + TStencilFace face, +) => + _MaterialInstance_setStencilOpDepthStencilPass( + materialInstance, + op.value, + face.value, + ); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.UnsignedInt, ffi.UnsignedInt)>( + symbol: "MaterialInstance_setStencilCompareFunction", isLeaf: true) +external void _MaterialInstance_setStencilCompareFunction( + ffi.Pointer materialInstance, + int func, + int face, +); + +void MaterialInstance_setStencilCompareFunction( + ffi.Pointer materialInstance, + TSamplerCompareFunc func, + TStencilFace face, +) => + _MaterialInstance_setStencilCompareFunction( + materialInstance, + func.value, + face.value, + ); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Uint8, ffi.UnsignedInt)>( + symbol: "MaterialInstance_setStencilReferenceValue", isLeaf: true) +external void _MaterialInstance_setStencilReferenceValue( + ffi.Pointer materialInstance, + int value, + int face, +); + +void MaterialInstance_setStencilReferenceValue( + ffi.Pointer materialInstance, + int value, + TStencilFace face, +) => + _MaterialInstance_setStencilReferenceValue( + materialInstance, + value, + face.value, + ); + +@ffi.Native, ffi.Uint8)>( + isLeaf: true) +external void MaterialInstance_setStencilReadMask( + ffi.Pointer materialInstance, + int mask, +); + +@ffi.Native, ffi.Uint8)>( + isLeaf: true) +external void MaterialInstance_setStencilWriteMask( + ffi.Pointer materialInstance, + int mask, +); + +@ffi.Native< + ffi.Pointer Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(isLeaf: true) +external ffi.Pointer Viewer_create( + ffi.Pointer context, + ffi.Pointer loader, + ffi.Pointer platform, + ffi.Pointer uberArchivePath, ); @ffi.Native)>(isLeaf: true) @@ -212,48 +360,6 @@ external void Viewer_setViewRenderable( bool renderable, ); -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function( - EntityId entityId, - ffi.Int x, - ffi.Int y, - ffi.Pointer tView, - ffi.Float depth, - ffi.Float fragX, - ffi.Float fragY, - ffi.Float fragZ)>>)>(isLeaf: true) -external void Viewer_pick( - ffi.Pointer viewer, - ffi.Pointer tView, - int x, - int y, - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function( - EntityId entityId, - ffi.Int x, - ffi.Int y, - ffi.Pointer tView, - ffi.Float depth, - ffi.Float fragX, - ffi.Float fragY, - ffi.Float fragZ)>> - callback, -); - -@ffi.Native, EntityId)>(isLeaf: true) -external bool Viewer_isNonPickableEntity( - ffi.Pointer viewer, - int entityId, -); - @ffi.Native Function(ffi.Pointer)>(isLeaf: true) external ffi.Pointer Viewer_getEngine( ffi.Pointer viewer, @@ -266,14 +372,6 @@ external ffi.Pointer Engine_getCameraComponent( int entityId, ); -@ffi.Native, EntityId, double4x4)>( - isLeaf: true) -external void Engine_setTransform( - ffi.Pointer tEngine, - int entity, - double4x4 transform, -); - @ffi.Native)>(isLeaf: true) external void clear_background_image( ffi.Pointer viewer, @@ -425,49 +523,6 @@ external void set_light_direction( double z, ); -@ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, - ffi.Int, ffi.Bool)>(isLeaf: true) -external int load_glb( - ffi.Pointer sceneManager, - ffi.Pointer assetPath, - int numInstances, - bool keepData, -); - -@ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer, ffi.Bool)>(isLeaf: true) -external int load_gltf( - ffi.Pointer sceneManager, - ffi.Pointer assetPath, - ffi.Pointer relativePath, - bool keepData, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -external int create_instance( - ffi.Pointer sceneManager, - int id, -); - -@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)>(isLeaf: true) -external void get_instances( - ffi.Pointer sceneManager, - int entityId, - ffi.Pointer out, -); - @ffi.Native)>(isLeaf: true) external int get_main_camera( ffi.Pointer viewer, @@ -479,411 +534,6 @@ external void set_frame_interval( double interval, ); -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer, ffi.Pointer, ffi.Int)>(isLeaf: true) -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)>(isLeaf: true) -external bool set_morph_target_weights( - ffi.Pointer sceneManager, - int entity, - ffi.Pointer morphData, - int numWeights, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer, TMaterialKey)>(isLeaf: true) -external ffi.Pointer create_material_instance( - ffi.Pointer sceneManager, - TMaterialKey materialConfig, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>(isLeaf: true) -external void SceneManager_destroyMaterialInstance( - ffi.Pointer sceneManager, - ffi.Pointer instance, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -external void clear_morph_animation( - ffi.Pointer sceneManager, - int entity, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -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)>(isLeaf: true) -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)>(isLeaf: true) -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)>(isLeaf: true) -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)>(isLeaf: true) -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)>(isLeaf: true) -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)>(isLeaf: true) -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, ffi.Float)>(isLeaf: true) -external void play_animation( - ffi.Pointer sceneManager, - int entity, - int index, - bool loop, - bool reverse, - bool replaceActive, - double crossfade, - double startOffset, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Int, ffi.Int)>(isLeaf: true) -external void set_animation_frame( - ffi.Pointer sceneManager, - int entity, - int animationIndex, - int animationFrame, -); - -@ffi.Native, EntityId, ffi.Int)>( - isLeaf: true) -external void stop_animation( - ffi.Pointer sceneManager, - int entity, - int index, -); - -@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)>(isLeaf: true) -external void get_animation_name( - ffi.Pointer sceneManager, - int entity, - ffi.Pointer outPtr, - int index, -); - -@ffi.Native, EntityId, ffi.Int)>( - isLeaf: true) -external double get_animation_duration( - ffi.Pointer sceneManager, - int entity, - int index, -); - -@ffi.Native, EntityId, ffi.Int)>( - isLeaf: true) -external int get_bone_count( - ffi.Pointer sceneManager, - int assetEntity, - int skinIndex, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>, ffi.Int)>(isLeaf: true) -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)>(isLeaf: true) -external int get_bone( - ffi.Pointer sceneManager, - int entityId, - int skinIndex, - int boneIndex, -); - -@ffi.Native< - ffi.Pointer Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer)>(isLeaf: true) -external ffi.Pointer SceneManager_createGizmo( - ffi.Pointer tSceneManager, - ffi.Pointer tView, - ffi.Pointer tScene, -); - -@ffi.Native< - EntityId Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Pointer, - ffi.Bool)>(isLeaf: true) -external int SceneManager_createGeometry( - 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, - ffi.Pointer materialInstance, - bool keepData, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer)>(isLeaf: true) -external ffi.Pointer - SceneManager_createUnlitMaterialInstance( - ffi.Pointer sceneManager, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer)>(isLeaf: true) -external ffi.Pointer - SceneManager_createUnlitFixedSizeMaterialInstance( - ffi.Pointer sceneManager, -); - -@ffi.Native< - ffi.Bool Function(ffi.Pointer, EntityId, - ffi.Pointer)>(isLeaf: true) -external bool SceneManager_setTransform( - ffi.Pointer sceneManager, - int entityId, - ffi.Pointer transform, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer, ffi.Int)>(isLeaf: true) -external void SceneManager_queueTransformUpdates( - ffi.Pointer sceneManager, - ffi.Pointer entities, - ffi.Pointer transforms, - int numEntities, -); - -@ffi.Native< - ffi.Pointer Function(ffi.Pointer, EntityId, - ffi.Pointer)>(isLeaf: true) -external ffi.Pointer SceneManager_findCameraByName( - ffi.Pointer tSceneManager, - int entity, - ffi.Pointer name, -); - -@ffi.Native, EntityId, ffi.Int)>( - isLeaf: true) -external void SceneManager_setVisibilityLayer( - ffi.Pointer tSceneManager, - int entity, - int layer, -); - -@ffi.Native Function(ffi.Pointer)>( - isLeaf: true) -external ffi.Pointer SceneManager_getScene( - ffi.Pointer tSceneManager, -); - -@ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, - ffi.Size, ffi.Bool, ffi.Int, ffi.Int, ffi.Bool)>(isLeaf: true) -external int SceneManager_loadGlbFromBuffer( - ffi.Pointer sceneManager, - ffi.Pointer arg1, - int length, - bool keepData, - int priority, - int layer, - bool loadResourcesAsync, -); - -@ffi.Native< - ffi.Bool Function( - ffi.Pointer, - EntityId, - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Float)>(isLeaf: true) -external bool SceneManager_setMorphAnimation( - ffi.Pointer sceneManager, - int entity, - ffi.Pointer morphData, - ffi.Pointer morphIndices, - int numMorphTargets, - int numFrames, - double frameLengthInMs, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -external bool update_bone_matrices( - ffi.Pointer sceneManager, - int entityId, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, EntityId, - ffi.Pointer, ffi.Int)>(isLeaf: true) -external void get_morph_target_name( - ffi.Pointer sceneManager, - int assetEntity, - int childEntity, - ffi.Pointer outPtr, - int index, -); - -@ffi.Native, EntityId, EntityId)>( - isLeaf: true) -external int get_morph_target_name_count( - ffi.Pointer sceneManager, - int assetEntity, - int childEntity, -); - -@ffi.Native, EntityId)>(isLeaf: true) -external void remove_entity( - ffi.Pointer viewer, - int asset, -); - -@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)>(isLeaf: true) -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)>( - isLeaf: true) -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.Float, ffi.Float)>(isLeaf: true) @@ -908,36 +558,16 @@ external void queue_position_update_from_viewport_coords( double viewportY, ); -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, - ffi.Float, ffi.Float)>(isLeaf: true) -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)>(isLeaf: true) -external void set_rotation( - ffi.Pointer sceneManager, - int entity, - double rads, - double x, - double y, - double z, - double w, -); - -@ffi.Native, EntityId, ffi.Float)>( +@ffi.Native Function(ffi.Pointer)>( isLeaf: true) -external void set_scale( - ffi.Pointer sceneManager, - int entity, - double scale, +external ffi.Pointer Engine_getTransformManager( + ffi.Pointer engine, +); + +@ffi.Native Function(ffi.Pointer)>( + isLeaf: true) +external ffi.Pointer Engine_getRenderableManager( + ffi.Pointer engine, ); @ffi.Native Function(ffi.Pointer)>( @@ -946,96 +576,6 @@ external ffi.Pointer Engine_getEntityManager( ffi.Pointer engine, ); -@ffi.Native Function(ffi.Pointer)>( - isLeaf: true) -external ffi.Pointer SceneManager_createCamera( - ffi.Pointer sceneManager, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Pointer)>(isLeaf: true) -external void SceneManager_destroyCamera( - ffi.Pointer sceneManager, - ffi.Pointer camera, -); - -@ffi.Native)>(isLeaf: true) -external int SceneManager_getCameraCount( - ffi.Pointer sceneManager, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer, ffi.Size)>(isLeaf: true) -external ffi.Pointer SceneManager_getCameraAt( - ffi.Pointer sceneManager, - int index, -); - -@ffi.Native< - ffi.Int Function(ffi.Pointer, EntityId, - ffi.Pointer)>(isLeaf: true) -external int hide_mesh( - ffi.Pointer sceneManager, - int entity, - ffi.Pointer meshName, -); - -@ffi.Native< - 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.Pointer 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)>(isLeaf: true) -external int find_child_entity_by_name( - ffi.Pointer sceneManager, - int parent, - ffi.Pointer name, -); - -@ffi.Native, EntityId, ffi.Bool)>( - isLeaf: true) -external int get_entity_count( - ffi.Pointer sceneManager, - int target, - bool renderableOnly, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Bool, - ffi.Pointer)>(isLeaf: true) -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)>(isLeaf: true) -external ffi.Pointer get_entity_name_at( - ffi.Pointer sceneManager, - int target, - int index, - bool renderableOnly, -); - @ffi.Native(isLeaf: true) external void ios_dummy(); @@ -1069,44 +609,6 @@ external void remove_collision_component( int entityId, ); -@ffi.Native, EntityId)>( - isLeaf: true) -external bool add_animation_component( - ffi.Pointer sceneManager, - int entityId, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -external void remove_animation_component( - ffi.Pointer sceneManager, - int entityId, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -external int get_parent( - ffi.Pointer sceneManager, - int child, -); - -@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)>(isLeaf: true) -external void set_parent( - ffi.Pointer sceneManager, - int child, - int parent, - bool preserveScaling, -); - @ffi.Native, EntityId)>( isLeaf: true) external void test_collisions( @@ -1114,20 +616,6 @@ external void test_collisions( int entity, ); -@ffi.Native, EntityId, ffi.Int)>( - isLeaf: true) -external void set_priority( - ffi.Pointer sceneManager, - int entityId, - int priority, -); - -@ffi.Native, EntityId)>(isLeaf: true) -external Aabb3 SceneManager_getRenderableBoundingBox( - ffi.Pointer sceneManager, - int entity, -); - @ffi.Native< Aabb2 Function( ffi.Pointer, ffi.Pointer, EntityId)>(isLeaf: true) @@ -1156,67 +644,6 @@ external void get_bounding_box_to_out( ffi.Pointer maxY, ); -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, - ffi.Float, ffi.Float)>(isLeaf: true) -external void set_stencil_highlight( - ffi.Pointer sceneManager, - int entity, - double r, - double g, - double b, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -external void remove_stencil_highlight( - ffi.Pointer sceneManager, - 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, 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, - 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, @@ -1266,15 +693,6 @@ 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)>(isLeaf: true) external TViewport View_getViewport( ffi.Pointer view, @@ -1388,6 +806,326 @@ external ffi.Pointer View_getCamera( ffi.Pointer tView, ); +@ffi.Native, ffi.Bool)>(isLeaf: true) +external void View_setStencilBufferEnabled( + ffi.Pointer tView, + bool enabled, +); + +@ffi.Native)>(isLeaf: true) +external bool View_isStencilBufferEnabled( + ffi.Pointer tView, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Uint32, ffi.Uint32, ffi.Uint32, + PickCallback)>(isLeaf: true) +external void View_pick( + ffi.Pointer tView, + int requestId, + int x, + int y, + PickCallback callback, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, EntityId)>(isLeaf: true) +external ffi.Pointer NameComponentManager_getName( + ffi.Pointer tNameComponentManager, + int entity, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Uint32, ffi.Uint32, + GizmoPickCallback)>(isLeaf: true) +external void Gizmo_pick( + ffi.Pointer tGizmo, + int x, + int y, + GizmoPickCallback callback, +); + +@ffi.Native, ffi.UnsignedInt)>( + symbol: "Gizmo_highlight", isLeaf: true) +external void _Gizmo_highlight( + ffi.Pointer tGizmo, + int axis, +); + +void Gizmo_highlight( + ffi.Pointer tGizmo, + TGizmoAxis axis, +) => + _Gizmo_highlight( + tGizmo, + axis.value, + ); + +@ffi.Native)>(isLeaf: true) +external void Gizmo_unhighlight( + ffi.Pointer tGizmo, +); + +@ffi.Native< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer)>(isLeaf: true) +external ffi.Pointer MaterialProvider_createMaterialInstance( + ffi.Pointer provider, + ffi.Pointer key, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) +external void set_camera_exposure( + ffi.Pointer camera, + double aperture, + double shutterSpeed, + double sensitivity, +); + +@ffi.Native, double4x4)>(isLeaf: true) +external void set_camera_model_matrix( + ffi.Pointer camera, + double4x4 matrix, +); + +@ffi.Native Function(ffi.Pointer, EntityId)>( + isLeaf: true) +external ffi.Pointer get_camera( + ffi.Pointer viewer, + int entity, +); + +@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, double4x4, ffi.Double, ffi.Double)>(isLeaf: true) +external void set_camera_projection_matrix( + ffi.Pointer camera, + double4x4 matrix, + double near, + double far, +); + +@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)>(isLeaf: true) +external double get_camera_focal_length( + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external double Camera_getFocalLength( + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external double Camera_getNear( + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external double Camera_getCullingFar( + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external double4x4 Camera_getViewMatrix( + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external double4x4 Camera_getModelMatrix( + ffi.Pointer camera, +); + +@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.Float)>(isLeaf: true) +external void set_camera_focus_distance( + ffi.Pointer camera, + double focusDistance, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, double4x4, ffi.Double, ffi.Double)>(isLeaf: true) +external void Camera_setCustomProjectionWithCulling( + ffi.Pointer camera, + double4x4 projectionMatrix, + double near, + double far, +); + +@ffi.Native, double4x4)>(isLeaf: true) +external void Camera_setModelMatrix( + ffi.Pointer camera, + double4x4 modelMatrix, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, + ffi.Double)>(isLeaf: true) +external void Camera_setLensProjection( + ffi.Pointer camera, + double near, + double far, + double aspect, + double focalLength, +); + +@ffi.Native)>(isLeaf: true) +external int Camera_getEntity( + ffi.Pointer camera, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.UnsignedInt, + ffi.Double, + ffi.Double, + ffi.Double, + ffi.Double, + ffi.Double, + ffi.Double)>(symbol: "Camera_setProjection", isLeaf: true) +external void _Camera_setProjection( + ffi.Pointer tCamera, + int projection, + double left, + double right, + double bottom, + double top, + double near, + double far, +); + +void Camera_setProjection( + ffi.Pointer tCamera, + Projection projection, + double left, + double right, + double bottom, + double top, + double near, + double far, +) => + _Camera_setProjection( + tCamera, + projection.value, + left, + right, + bottom, + top, + near, + far, + ); + +@ffi.Native, EntityId)>( + isLeaf: true) +external double4x4 TransformManager_getLocalTransform( + ffi.Pointer tTransformManager, + int entityId, +); + +@ffi.Native, EntityId)>( + isLeaf: true) +external double4x4 TransformManager_getWorldTransform( + ffi.Pointer tTransformManager, + int entityId, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, double4x4)>(isLeaf: true) +external void TransformManager_setTransform( + ffi.Pointer tTransformManager, + int entityId, + double4x4 transform, +); + +@ffi.Native, EntityId)>( + isLeaf: true) +external void TransformManager_transformToUnitCube( + ffi.Pointer tTransformManager, + int entityId, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, EntityId, + ffi.Bool)>(isLeaf: true) +external void TransformManager_setParent( + ffi.Pointer tTransformManager, + int child, + int parent, + bool preserveScaling, +); + +@ffi.Native, EntityId)>( + isLeaf: true) +external int TransformManager_getParent( + ffi.Pointer tTransformManager, + int child, +); + +@ffi.Native, EntityId)>( + isLeaf: true) +external int TransformManager_getAncestor( + ffi.Pointer tTransformManager, + int childEntityId, +); + @ffi.Native< ffi.Void Function( ffi.Pointer, @@ -1637,9 +1375,12 @@ external void remove_skybox_render_thread( ffi.Pointer, ffi.Int, ffi.Int, - ffi.Pointer, + ffi.Pointer>, + ffi.Int, ffi.Bool, - ffi.Pointer>)>( + ffi.Pointer< + ffi + .NativeFunction)>>)>( isLeaf: true) external void SceneManager_createGeometryRenderThread( ffi.Pointer sceneManager, @@ -1652,9 +1393,11 @@ external void SceneManager_createGeometryRenderThread( ffi.Pointer indices, int numIndices, int primitiveType, - ffi.Pointer materialInstance, + ffi.Pointer> materialInstances, + int materialInstanceCount, bool keepData, - ffi.Pointer> callback, + ffi.Pointer)>> + callback, ); @ffi.Native< @@ -1667,7 +1410,9 @@ external void SceneManager_createGeometryRenderThread( ffi.Int, ffi.Int, ffi.Bool, - ffi.Pointer>)>( + ffi.Pointer< + ffi + .NativeFunction)>>)>( isLeaf: true) external void SceneManager_loadGlbFromBufferRenderThread( ffi.Pointer sceneManager, @@ -1678,7 +1423,8 @@ external void SceneManager_loadGlbFromBufferRenderThread( int priority, int layer, bool loadResourcesAsync, - ffi.Pointer> callback, + ffi.Pointer)>> + callback, ); @ffi.Native< @@ -1715,14 +1461,17 @@ external void SceneManager_createUnlitFixedSizeMaterialInstanceRenderThread( ffi.Pointer, ffi.Int, ffi.Bool, - ffi.Pointer>)>( + ffi.Pointer< + ffi + .NativeFunction)>>)>( isLeaf: true) -external void load_glb_render_thread( +external void SceneManager_loadGlbRenderThread( ffi.Pointer sceneManager, ffi.Pointer assetPath, int numInstances, bool keepData, - ffi.Pointer> callback, + ffi.Pointer)>> + callback, ); @ffi.Native< @@ -1731,136 +1480,94 @@ external void load_glb_render_thread( ffi.Pointer, ffi.Pointer, ffi.Bool, - ffi.Pointer>)>( + ffi.Pointer< + ffi + .NativeFunction)>>)>( isLeaf: true) -external void load_gltf_render_thread( +external void SceneManager_loadGltfRenderThread( ffi.Pointer sceneManager, ffi.Pointer assetPath, ffi.Pointer relativePath, bool keepData, - ffi.Pointer> callback, + ffi.Pointer)>> + callback, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>( - isLeaf: true) -external void create_instance_render_thread( - ffi.Pointer sceneManager, - int entityId, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer Function(ffi.Pointer, ffi.Pointer>)>(isLeaf: true) -external void remove_entity_render_thread( - ffi.Pointer viewer, - int asset, +external ffi.Pointer SceneManager_destroyAllRenderThread( + ffi.Pointer tSceneManager, ffi.Pointer> callback, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, - ffi.Pointer>)>(isLeaf: true) -external void clear_entities_render_thread( - ffi.Pointer viewer, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer, ffi.Pointer, ffi.Int)>(isLeaf: true) -external void apply_weights_render_thread( - 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)>(isLeaf: true) -external void set_animation_frame_render_thread( - ffi.Pointer sceneManager, - int asset, - int animationIndex, - int animationFrame, -); - -@ffi.Native, EntityId, ffi.Int)>( - isLeaf: true) -external void stop_animation_render_thread( - ffi.Pointer sceneManager, - int asset, - int index, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>( - isLeaf: true) -external void get_animation_count_render_thread( - ffi.Pointer sceneManager, - int asset, - ffi.Pointer> callback, -); - -@ffi.Native< - ffi.Void Function( + ffi.Pointer Function( ffi.Pointer, - EntityId, - ffi.Pointer, - ffi.Int, + ffi.Pointer, ffi.Pointer>)>(isLeaf: true) -external void get_animation_name_render_thread( - ffi.Pointer sceneManager, - int asset, - ffi.Pointer outPtr, - int index, +external ffi.Pointer SceneManager_destroyAssetRenderThread( + ffi.Pointer tSceneManager, + ffi.Pointer sceneAsset, ffi.Pointer> callback, ); -@ffi.Native< - ffi.Void Function( - ffi.Pointer, - EntityId, - EntityId, - ffi.Pointer, - ffi.Int, - ffi.Pointer>)>(isLeaf: true) -external void get_morph_target_name_render_thread( - 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>)>( - isLeaf: true) -external void get_morph_target_name_count_render_thread( - ffi.Pointer sceneManager, - int asset, - int childEntity, - ffi.Pointer> callback, -); - @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Pointer< + ffi + .NativeFunction)>>)>( + isLeaf: true) +external void SceneAsset_createInstanceRenderThread( + ffi.Pointer asset, + ffi.Pointer> tMaterialInstances, + int materialInstanceCount, + ffi.Pointer)>> + callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer)>>)>(isLeaf: true) +external void MaterialProvider_createMaterialInstanceRenderThread( + ffi.Pointer tMaterialProvider, + ffi.Pointer tKey, + ffi.Pointer< + ffi.NativeFunction)>> + callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>( + isLeaf: true) +external void AnimationManager_updateBoneMatricesRenderThread( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Pointer, ffi.Int, ffi.Pointer>)>( isLeaf: true) -external void set_morph_target_weights_render_thread( - ffi.Pointer sceneManager, - int asset, +external void AnimationManager_setMorphTargetWeightsRenderThread( + ffi.Pointer tAnimationManager, + int entityId, ffi.Pointer morphData, int numWeights, ffi.Pointer> callback, @@ -1933,260 +1640,575 @@ external void unproject_texture_render_thread( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) -external void set_camera_exposure( - ffi.Pointer camera, - double aperture, - double shutterSpeed, - double sensitivity, + ffi.Pointer Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(isLeaf: true) +external ffi.Pointer SceneManager_createGizmo( + ffi.Pointer tSceneManager, + ffi.Pointer tView, + ffi.Pointer tScene, ); -@ffi.Native, double4x4)>(isLeaf: true) -external void set_camera_model_matrix( - ffi.Pointer camera, - double4x4 matrix, +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer>, + ffi.Int, + ffi.Bool)>(isLeaf: true) +external ffi.Pointer SceneManager_createGeometry( + 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, + ffi.Pointer> materialInstances, + int materialInstanceCount, + bool keepData, ); -@ffi.Native Function(ffi.Pointer, EntityId)>( +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer)>(isLeaf: true) +external ffi.Pointer + SceneManager_getUbershaderMaterialProvider( + ffi.Pointer sceneManager, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer)>(isLeaf: true) +external ffi.Pointer SceneManager_getUnlitMaterialProvider( + ffi.Pointer sceneManager, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer)>(isLeaf: true) +external ffi.Pointer + SceneManager_createUnlitMaterialInstance( + ffi.Pointer sceneManager, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer)>(isLeaf: true) +external ffi.Pointer + SceneManager_createUnlitFixedSizeMaterialInstance( + ffi.Pointer sceneManager, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Int)>(isLeaf: true) +external void SceneManager_queueTransformUpdates( + ffi.Pointer sceneManager, + ffi.Pointer entities, + ffi.Pointer transforms, + int numEntities, +); + +@ffi.Native< + ffi.Pointer Function(ffi.Pointer, EntityId, + ffi.Pointer)>(isLeaf: true) +external ffi.Pointer SceneManager_findCameraByName( + ffi.Pointer tSceneManager, + int entity, + ffi.Pointer name, +); + +@ffi.Native, EntityId, ffi.Int)>( isLeaf: true) -external ffi.Pointer get_camera( - ffi.Pointer viewer, +external void SceneManager_setVisibilityLayer( + ffi.Pointer tSceneManager, + int entity, + int layer, +); + +@ffi.Native Function(ffi.Pointer)>( + isLeaf: true) +external ffi.Pointer SceneManager_getScene( + ffi.Pointer tSceneManager, +); + +@ffi.Native Function(ffi.Pointer)>( + isLeaf: true) +external ffi.Pointer SceneManager_createCamera( + ffi.Pointer sceneManager, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Pointer)>(isLeaf: true) +external void SceneManager_destroyCamera( + ffi.Pointer sceneManager, + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external int SceneManager_getCameraCount( + ffi.Pointer sceneManager, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, ffi.Size)>(isLeaf: true) +external ffi.Pointer SceneManager_getCameraAt( + ffi.Pointer sceneManager, + int index, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, + ffi.Pointer)>(isLeaf: true) +external void SceneManager_destroyMaterialInstance( + ffi.Pointer sceneManager, + ffi.Pointer instance, +); + +@ffi.Native, EntityId)>(isLeaf: true) +external Aabb3 SceneManager_getRenderableBoundingBox( + ffi.Pointer tSceneManager, int entity, ); -@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)>( +@ffi.Native, EntityId)>( isLeaf: true) -external ffi.Pointer get_camera_frustum( - ffi.Pointer camera, +external int SceneManager_addToScene( + ffi.Pointer tSceneManager, + int entity, +); + +@ffi.Native, EntityId)>( + isLeaf: true) +external int SceneManager_removeFromScene( + ffi.Pointer tSceneManager, + int entity, +); + +@ffi.Native, EntityId)>( + isLeaf: true) +external void SceneManager_transformToUnitCube( + ffi.Pointer sceneManager, + int asset, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Size, + ffi.Bool, + ffi.Int, + ffi.Int, + ffi.Bool)>(isLeaf: true) +external ffi.Pointer SceneManager_loadGlbFromBuffer( + ffi.Pointer tSceneManager, + ffi.Pointer arg1, + int length, + bool keepData, + int priority, + int layer, + bool loadResourcesAsync, +); + +@ffi.Native< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int, ffi.Bool)>(isLeaf: true) +external ffi.Pointer SceneManager_loadGlb( + ffi.Pointer sceneManager, + ffi.Pointer assetPath, + int numInstances, + bool keepData, +); + +@ffi.Native< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, ffi.Bool)>(isLeaf: true) +external ffi.Pointer SceneManager_loadGltf( + ffi.Pointer sceneManager, + ffi.Pointer assetPath, + ffi.Pointer relativePath, + bool keepData, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer)>(isLeaf: true) +external ffi.Pointer SceneManager_getAnimationManager( + ffi.Pointer tSceneManager, +); + +@ffi.Native Function(ffi.Pointer)>( + isLeaf: true) +external ffi.Pointer SceneManager_destroyAll( + ffi.Pointer tSceneManager, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(isLeaf: true) +external ffi.Pointer SceneManager_destroyAsset( + ffi.Pointer tSceneManager, + ffi.Pointer sceneAsset, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer)>(isLeaf: true) +external ffi.Pointer + SceneManager_getNameComponentManager( + ffi.Pointer tSceneManager, +); + +@ffi.Native)>(isLeaf: true) +external int SceneManager_getOverlayEntityCount( + ffi.Pointer tSceneManager, +); + +@ffi.Native, ffi.Size)>( + isLeaf: true) +external int SceneManager_getOverlayEntityAt( + ffi.Pointer tSceneManager, + int index, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, + ffi.Pointer)>(isLeaf: true) +external void RenderableManager_setMaterialInstanceAt( + ffi.Pointer tRenderableManager, + int entityId, + int primitiveIndex, + ffi.Pointer tMaterialInstance, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, double4x4, ffi.Double, ffi.Double)>(isLeaf: true) -external void set_camera_projection_matrix( - ffi.Pointer camera, - double4x4 matrix, - double near, - double far, + ffi.Pointer, EntityId, ffi.Int)>(isLeaf: true) +external void RenderableManager_setPriority( + ffi.Pointer tRenderableManager, + int entityId, + int priority, ); @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.Pointer Function( + ffi.Pointer, EntityId, ffi.Int)>(isLeaf: true) +external ffi.Pointer RenderableManager_getMaterialInstanceAt( + ffi.Pointer tRenderableManager, + int entityId, + int primitiveIndex, ); -@ffi.Native)>(isLeaf: true) -external double get_camera_focal_length( - ffi.Pointer camera, +@ffi.Native, ffi.Pointer)>( + isLeaf: true) +external void SceneAsset_addToScene( + ffi.Pointer tSceneAsset, + ffi.Pointer tScene, ); -@ffi.Native)>(isLeaf: true) -external double Camera_getFocalLength( - ffi.Pointer camera, +@ffi.Native)>(isLeaf: true) +external int SceneAsset_getEntity( + ffi.Pointer tSceneAsset, ); -@ffi.Native)>(isLeaf: true) -external double Camera_getNear( - ffi.Pointer camera, +@ffi.Native)>(isLeaf: true) +external int SceneAsset_getChildEntityCount( + ffi.Pointer tSceneAsset, ); -@ffi.Native)>(isLeaf: true) -external double Camera_getCullingFar( - ffi.Pointer camera, +@ffi.Native, ffi.Pointer)>( + isLeaf: true) +external void SceneAsset_getChildEntities( + ffi.Pointer tSceneAsset, + ffi.Pointer out, ); -@ffi.Native)>(isLeaf: true) -external double4x4 Camera_getViewMatrix( - ffi.Pointer camera, +@ffi.Native() +external final int utils; + +@ffi.Native)>(isLeaf: true) +external int SceneAsset_getCameraEntityCount( + ffi.Pointer tSceneAsset, ); -@ffi.Native)>(isLeaf: true) -external double4x4 Camera_getModelMatrix( - ffi.Pointer camera, +@ffi.Native)>(isLeaf: true) +external int SceneAsset_getLightEntityCount( + ffi.Pointer tSceneAsset, ); -@ffi.Native)>(isLeaf: true) -external double get_camera_near( - ffi.Pointer camera, +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, ffi.Int)>(isLeaf: true) +external ffi.Pointer SceneAsset_getInstance( + ffi.Pointer tSceneAsset, + int index, ); -@ffi.Native)>(isLeaf: true) -external double get_camera_culling_far( - ffi.Pointer camera, +@ffi.Native)>(isLeaf: true) +external int SceneAsset_getInstanceCount( + ffi.Pointer tSceneAsset, ); -@ffi.Native, ffi.Bool)>(isLeaf: true) -external double get_camera_fov( - ffi.Pointer camera, - bool horizontal, +@ffi.Native< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer>, ffi.Int)>(isLeaf: true) +external ffi.Pointer SceneAsset_createInstance( + ffi.Pointer asset, + ffi.Pointer> materialInstances, + int materialInstanceCount, ); -@ffi.Native, ffi.Float)>(isLeaf: true) -external void set_camera_focus_distance( - ffi.Pointer camera, - double focusDistance, +@ffi.Native, EntityId)>( + isLeaf: true) +external void AnimationManager_addAnimationComponent( + ffi.Pointer tAnimationManager, + int entityId, +); + +@ffi.Native, EntityId)>( + isLeaf: true) +external void AnimationManager_removeAnimationComponent( + ffi.Pointer tAnimationManager, + int entityId, +); + +@ffi.Native< + ffi.Bool Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Float)>(isLeaf: true) +external bool AnimationManager_setMorphAnimation( + ffi.Pointer tAnimationManager, + int entityId, + ffi.Pointer morphData, + ffi.Pointer morphIndices, + int numMorphTargets, + int numFrames, + double frameLengthInMs, +); + +@ffi.Native, EntityId)>( + isLeaf: true) +external bool AnimationManager_clearMorphAnimation( + ffi.Pointer tAnimationManager, + int entityId, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, double4x4, ffi.Double, ffi.Double)>(isLeaf: true) -external void Camera_setCustomProjectionWithCulling( - ffi.Pointer camera, - double4x4 projectionMatrix, - double near, - double far, -); - -@ffi.Native, double4x4)>(isLeaf: true) -external void Camera_setModelMatrix( - ffi.Pointer camera, - double4x4 modelMatrix, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, - ffi.Double)>(isLeaf: true) -external void Camera_setLensProjection( - ffi.Pointer camera, - double near, - double far, - double aspect, - double focalLength, -); - -@ffi.Native)>(isLeaf: true) -external int Camera_getEntity( - ffi.Pointer camera, + ffi.Pointer, ffi.Pointer)>(isLeaf: true) +external void AnimationManager_resetToRestPose( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, - ffi.UnsignedInt, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double)>(symbol: "Camera_setProjection", isLeaf: true) -external void _Camera_setProjection( - ffi.Pointer tCamera, - int projection, - double left, - double right, - double bottom, - double top, - double near, - double far, + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float)>(isLeaf: true) +external void AnimationManager_addBoneAnimation( + ffi.Pointer tAnimationManager, + ffi.Pointer tSceneAsset, + int skinIndex, + int boneIndex, + ffi.Pointer frameData, + int numFrames, + double frameLengthInMs, + double fadeOutInSecs, + double fadeInInSecs, + double maxDelta, ); -void Camera_setProjection( - ffi.Pointer tCamera, - Projection projection, - double left, - double right, - double bottom, - double top, - double near, - double far, -) => - _Camera_setProjection( - tCamera, - projection.value, - left, - right, - bottom, - top, - near, - far, - ); - @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Uint32, ffi.Uint32, - GizmoPickCallback)>(isLeaf: true) -external void Gizmo_pick( - ffi.Pointer tGizmo, - int x, - int y, - GizmoPickCallback callback, + EntityId Function(ffi.Pointer, ffi.Pointer, + ffi.Int, ffi.Int)>(isLeaf: true) +external int AnimationManager_getBone( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + int skinIndex, + int boneIndex, ); -@ffi.Native, ffi.Bool)>(isLeaf: true) -external void Gizmo_setVisibility( - ffi.Pointer tGizmo, - bool visible, +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int, ffi.Pointer, ffi.Int)>(isLeaf: true) +external void AnimationManager_getRestLocalTransforms( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + int skinIndex, + ffi.Pointer out, + int numBones, ); -final class TMaterialInstance extends ffi.Opaque {} +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int, ffi.Int, ffi.Pointer)>(isLeaf: true) +external void AnimationManager_getInverseBindMatrix( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + int skinIndex, + int boneIndex, + ffi.Pointer out, +); -enum TDepthFunc { - /// !< Less or equal - LE(0), +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Bool, + ffi.Bool, + ffi.Bool, + ffi.Float, + ffi.Float)>(isLeaf: true) +external void AnimationManager_playAnimation( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + int index, + bool loop, + bool reverse, + bool replaceActive, + double crossfade, + double startOffset, +); - /// !< Greater or equal - GE(1), +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int)>(isLeaf: true) +external void AnimationManager_stopAnimation( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + int index, +); - /// !< Strictly less than - L(2), +@ffi.Native< + ffi.Float Function(ffi.Pointer, ffi.Pointer, + ffi.Int)>(isLeaf: true) +external double AnimationManager_getAnimationDuration( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + int animationIndex, +); - /// !< Strictly greater than - G(3), +@ffi.Native< + ffi.Int Function( + ffi.Pointer, ffi.Pointer)>(isLeaf: true) +external int AnimationManager_getAnimationCount( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, +); - /// !< Equal - E(4), +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Int)>(isLeaf: true) +external void AnimationManager_getAnimationName( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + ffi.Pointer outPtr, + int index, +); - /// !< Not equal - NE(5), +@ffi.Native< + ffi.Int Function(ffi.Pointer, ffi.Pointer, + ffi.Int)>(isLeaf: true) +external int AnimationManager_getBoneCount( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + int skinIndex, +); - /// !< Always. Depth / stencil testing is deactivated. - A(6), +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>, ffi.Int)>(isLeaf: true) +external void AnimationManager_getBoneNames( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + ffi.Pointer> out, + int skinIndex, +); - /// !< Never. The depth / stencil test always fails. - N(7); +@ffi.Native< + ffi.Int Function(ffi.Pointer, ffi.Pointer, + EntityId)>(isLeaf: true) +external int AnimationManager_getMorphTargetNameCount( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + int childEntity, +); - final int value; - const TDepthFunc(this.value); +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + EntityId, ffi.Pointer, ffi.Int)>(isLeaf: true) +external void AnimationManager_getMorphTargetName( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, + int childEntity, + ffi.Pointer outPtr, + int index, +); - static TDepthFunc fromValue(int value) => switch (value) { - 0 => LE, - 1 => GE, - 2 => L, - 3 => G, - 4 => E, - 5 => NE, - 6 => A, - 7 => N, - _ => throw ArgumentError("Unknown value for TDepthFunc: $value"), - }; -} +@ffi.Native< + ffi.Bool Function( + ffi.Pointer, ffi.Pointer)>(isLeaf: true) +external bool AnimationManager_updateBoneMatrices( + ffi.Pointer tAnimationManager, + ffi.Pointer sceneAsset, +); + +@ffi.Native< + ffi.Bool Function(ffi.Pointer, EntityId, + ffi.Pointer, ffi.Int)>(isLeaf: true) +external bool AnimationManager_setMorphTargetWeights( + ffi.Pointer tAnimationManager, + int entityId, + ffi.Pointer morphData, + int numWeights, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int, ffi.Int)>(isLeaf: true) +external void AnimationManager_setGltfAnimationFrame( + ffi.Pointer tAnimationManager, + ffi.Pointer tSceneAsset, + int animationIndex, + int frame, +); + +@ffi.Native< + ffi.Pointer Function(LoadFilamentResourceFromOwner, + FreeFilamentResourceFromOwner, ffi.Pointer)>(isLeaf: true) +external ffi.Pointer make_resource_loader( + LoadFilamentResourceFromOwner loadFn, + FreeFilamentResourceFromOwner freeFn, + ffi.Pointer owner, +); final class TCamera extends ffi.Opaque {} @@ -2208,6 +2230,24 @@ final class TGizmo extends ffi.Opaque {} final class TScene extends ffi.Opaque {} +final class TTransformManager extends ffi.Opaque {} + +final class TAnimationManager extends ffi.Opaque {} + +final class TCollisionComponentManager extends ffi.Opaque {} + +final class TSceneAsset extends ffi.Opaque {} + +final class TNameComponentManager extends ffi.Opaque {} + +final class TMaterialInstance extends ffi.Opaque {} + +final class TMaterialProvider extends ffi.Opaque {} + +final class TRenderableManager extends ffi.Opaque {} + +final class TRenderableInstance extends ffi.Opaque {} + final class TMaterialKey extends ffi.Struct { @ffi.Bool() external bool doubleSided; @@ -2398,6 +2438,222 @@ final class Aabb3 extends ffi.Struct { external double halfExtentZ; } +enum TSamplerCompareFunc { + /// !< Less or equal + LE(0), + + /// !< Greater or equal + GE(1), + + /// !< Strictly less than + L(2), + + /// !< Strictly greater than + G(3), + + /// !< Equal + E(4), + + /// !< Not equal + NE(5), + + /// !< Always. Depth / stencil testing is deactivated. + A(6), + + /// !< Never. The depth / stencil test always fails. + N(7); + + final int value; + const TSamplerCompareFunc(this.value); + + static TSamplerCompareFunc fromValue(int value) => switch (value) { + 0 => LE, + 1 => GE, + 2 => L, + 3 => G, + 4 => E, + 5 => NE, + 6 => A, + 7 => N, + _ => + throw ArgumentError("Unknown value for TSamplerCompareFunc: $value"), + }; +} + +enum TStencilOperation { + KEEP(0), + ZERO(1), + REPLACE(2), + INCR(3), + INCR_WRAP(4), + DECR(5), + DECR_WRAP(6), + INVERT(7); + + final int value; + const TStencilOperation(this.value); + + static TStencilOperation fromValue(int value) => switch (value) { + 0 => KEEP, + 1 => ZERO, + 2 => REPLACE, + 3 => INCR, + 4 => INCR_WRAP, + 5 => DECR, + 6 => DECR_WRAP, + 7 => INVERT, + _ => throw ArgumentError("Unknown value for TStencilOperation: $value"), + }; +} + +enum TStencilFace { + STENCIL_FACE_FRONT(1), + STENCIL_FACE_BACK(2), + STENCIL_FACE_FRONT_AND_BACK(3); + + final int value; + const TStencilFace(this.value); + + static TStencilFace fromValue(int value) => switch (value) { + 1 => STENCIL_FACE_FRONT, + 2 => STENCIL_FACE_BACK, + 3 => STENCIL_FACE_FRONT_AND_BACK, + _ => throw ArgumentError("Unknown value for TStencilFace: $value"), + }; +} + +enum TCullingMode { + CULLING_MODE_NONE(0), + CULLING_MODE_FRONT(1), + CULLING_MODE_BACK(2), + CULLING_MODE_FRONT_AND_BACK(3); + + final int value; + const TCullingMode(this.value); + + static TCullingMode fromValue(int value) => switch (value) { + 0 => CULLING_MODE_NONE, + 1 => CULLING_MODE_FRONT, + 2 => CULLING_MODE_BACK, + 3 => CULLING_MODE_FRONT_AND_BACK, + _ => throw ArgumentError("Unknown value for TCullingMode: $value"), + }; +} + +typedef EntityId = ffi.Int32; +typedef DartEntityId = int; + +final class TViewport extends ffi.Struct { + @ffi.Int32() + external int left; + + @ffi.Int32() + external int bottom; + + @ffi.Uint32() + external int width; + + @ffi.Uint32() + external int height; +} + +enum ToneMapping { + ACES(0), + FILMIC(1), + LINEAR(2); + + final int value; + const ToneMapping(this.value); + + static ToneMapping fromValue(int value) => switch (value) { + 0 => ACES, + 1 => FILMIC, + 2 => LINEAR, + _ => throw ArgumentError("Unknown value for ToneMapping: $value"), + }; +} + +typedef PickCallback = ffi.Pointer>; +typedef PickCallbackFunction = ffi.Void Function( + ffi.Uint32 requestId, + EntityId entityId, + ffi.Float depth, + ffi.Float fragX, + ffi.Float fragY, + ffi.Float fragZ); +typedef DartPickCallbackFunction = void Function( + int requestId, + DartEntityId entityId, + double depth, + double fragX, + double fragY, + double fragZ); + +enum TGizmoAxis { + X(0), + Y(1), + Z(2); + + final int value; + const TGizmoAxis(this.value); + + static TGizmoAxis fromValue(int value) => switch (value) { + 0 => X, + 1 => Y, + 2 => Z, + _ => throw ArgumentError("Unknown value for TGizmoAxis: $value"), + }; +} + +enum TGizmoPickResultType { + AxisX(0), + AxisY(1), + AxisZ(2), + Parent(3), + None(4); + + final int value; + const TGizmoPickResultType(this.value); + + static TGizmoPickResultType fromValue(int value) => switch (value) { + 0 => AxisX, + 1 => AxisY, + 2 => AxisZ, + 3 => Parent, + 4 => None, + _ => + throw ArgumentError("Unknown value for TGizmoPickResultType: $value"), + }; +} + +typedef GizmoPickCallback + = ffi.Pointer>; +typedef GizmoPickCallbackFunction = ffi.Void Function( + ffi.UnsignedInt resultType, ffi.Float x, ffi.Float y, ffi.Float z); +typedef DartGizmoPickCallbackFunction = void Function( + TGizmoPickResultType resultType, double x, double y, double z); + +enum Projection { + Perspective(0), + Orthographic(1); + + final int value; + const Projection(this.value); + + static Projection fromValue(int value) => switch (value) { + 0 => Perspective, + 1 => Orthographic, + _ => throw ArgumentError("Unknown value for Projection: $value"), + }; +} + +typedef FilamentRenderCallback + = ffi.Pointer>; +typedef FilamentRenderCallbackFunction = ffi.Void Function( + ffi.Pointer owner); +typedef DartFilamentRenderCallbackFunction = void Function( + ffi.Pointer owner); + final class ResourceBuffer extends ffi.Struct { external ffi.Pointer data; @@ -2447,71 +2703,6 @@ typedef LoadFilamentResourceIntoOutPointerFunction = ffi.Void Function( typedef DartLoadFilamentResourceIntoOutPointerFunction = void Function( ffi.Pointer uri, ffi.Pointer out); -/// 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; - -final class TViewport extends ffi.Struct { - @ffi.Int32() - external int left; - - @ffi.Int32() - external int bottom; - - @ffi.Uint32() - external int width; - - @ffi.Uint32() - external int height; -} - -enum ToneMapping { - ACES(0), - FILMIC(1), - LINEAR(2); - - final int value; - const ToneMapping(this.value); - - static ToneMapping fromValue(int value) => switch (value) { - 0 => ACES, - 1 => FILMIC, - 2 => LINEAR, - _ => throw ArgumentError("Unknown value for ToneMapping: $value"), - }; -} - -typedef FilamentRenderCallback - = ffi.Pointer>; -typedef FilamentRenderCallbackFunction = ffi.Void Function( - ffi.Pointer owner); -typedef DartFilamentRenderCallbackFunction = void Function( - ffi.Pointer owner); - -enum Projection { - Perspective(0), - Orthographic(1); - - final int value; - const Projection(this.value); - - static Projection fromValue(int value) => switch (value) { - 0 => Perspective, - 1 => Orthographic, - _ => throw ArgumentError("Unknown value for Projection: $value"), - }; -} - -typedef GizmoPickCallback - = ffi.Pointer>; -typedef GizmoPickCallbackFunction = ffi.Void Function( - EntityId entityId, ffi.Uint32 x, ffi.Uint32 y, ffi.Pointer view); -typedef DartGizmoPickCallbackFunction = void Function( - DartEntityId entityId, int x, int y, ffi.Pointer view); - const int __bool_true_false_are_defined = 1; const int true1 = 1; diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart index f1f7254f..3f9d704f 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart @@ -3,21 +3,22 @@ import 'dart:io'; import 'dart:math'; import 'dart:typed_data'; import 'package:animation_tools_dart/animation_tools_dart.dart'; +import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_asset.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_gizmo.dart'; import 'package:vector_math/vector_math_64.dart'; import 'package:vector_math/vector_math_64.dart' as v64; import '../../../../utils/src/gizmo.dart'; import '../../../../utils/src/matrix.dart'; -import '../../events.dart'; import '../../thermion_viewer_base.dart'; import 'package:logging/logging.dart'; import 'callbacks.dart'; import 'ffi_camera.dart'; +import 'ffi_material_instance.dart'; import 'ffi_view.dart'; // ignore: constant_identifier_names -const ThermionEntity _FILAMENT_ASSET_ERROR = 0; +const ThermionEntity FILAMENT_ASSET_ERROR = 0; typedef RenderCallback = Pointer)>>; @@ -25,39 +26,20 @@ class ThermionViewerFFI extends ThermionViewer { final _logger = Logger("ThermionViewerFFI"); Pointer? _sceneManager; - + Pointer? _engine; + Pointer? _unlitMaterialProvider; + Pointer? _ubershaderMaterialProvider; + Pointer? _transformManager; + Pointer? _renderableManager; Pointer? _viewer; + Pointer? _animationManager; + Pointer? _nameComponentManager; final String? uberArchivePath; final _initialized = Completer(); Future get initialized => _initialized.future; - /// - /// - /// - @override - Stream get pickResult => _pickResultController.stream; - 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(); @@ -67,9 +49,10 @@ class ThermionViewerFFI extends ThermionViewer { var _sharedContext = nullptr.cast(); + late NativeCallable _onPickResultCallable; + + /// /// - /// This controller uses platform channels to bridge Dart with the C/C++ code for the Filament API. - /// Setting up the context/texture (since this is platform-specific) and the render ticker are platform-specific; all other methods are passed through by the platform channel to the methods specified in ThermionFlutterApi.h. /// ThermionViewerFFI( {RenderCallback? renderCallback, @@ -83,16 +66,8 @@ class ThermionViewerFFI extends ThermionViewer { this._driver = driver ?? nullptr; this._sharedContext = sharedContext ?? nullptr; - _onPickResultCallable = NativeCallable< - Void Function( - EntityId entityId, - Int x, - Int y, - Pointer view, - Float depth, - Float fragX, - Float fragY, - Float fragZ)>.listener(_onPickResult); + _onPickResultCallable = + NativeCallable.listener(_onPickResult); _initialize(); } @@ -103,9 +78,10 @@ class ThermionViewerFFI extends ThermionViewer { Future createRenderTarget( int width, int height, int textureHandle) async { final renderTarget = await withPointerCallback((cb) { - Viewer_createRenderTargetRenderThread(_viewer!, textureHandle, width, height, cb); + Viewer_createRenderTargetRenderThread( + _viewer!, textureHandle, width, height, cb); }); - + return FFIRenderTarget(renderTarget, _viewer!); } @@ -209,9 +185,6 @@ class ThermionViewerFFI extends ThermionViewer { } } - Gizmo? _gizmo; - Gizmo? get gizmo => _gizmo; - Future _initialize() async { final uberarchivePtr = uberArchivePath?.toNativeUtf8(allocator: allocator).cast() ?? @@ -228,7 +201,16 @@ class ThermionViewerFFI extends ThermionViewer { } _sceneManager = Viewer_getSceneManager(_viewer!); - + _unlitMaterialProvider = + SceneManager_getUnlitMaterialProvider(_sceneManager!); + _ubershaderMaterialProvider = + SceneManager_getUbershaderMaterialProvider(_sceneManager!); + _engine = Viewer_getEngine(_viewer!); + _transformManager = Engine_getTransformManager(_engine!); + _animationManager = SceneManager_getAnimationManager(_sceneManager!); + _nameComponentManager = + SceneManager_getNameComponentManager(_sceneManager!); + _renderableManager = Engine_getRenderableManager(_engine!); this._initialized.complete(true); } @@ -306,17 +288,15 @@ class ThermionViewerFFI extends ThermionViewer { @override Future dispose() async { if (_viewer == null) { - _logger.info("Viewer already disposed, ignoring"); - return; + throw Exception("Viewer has already been disposed."); } _disposing = true; await setRendering(false); await clearEntities(); await clearLights(); - await _pickResultController.close(); - await _gizmoPickResultController.close(); - await _sceneUpdateEventController.close(); + + // await _sceneUpdateEventController.close(); Viewer_destroyOnRenderThread(_viewer!); _sceneManager = null; _viewer = null; @@ -496,11 +476,9 @@ class ThermionViewerFFI extends ThermionViewer { directLight.sunHaloFallof, directLight.castShadows, ); - if (entity == _FILAMENT_ASSET_ERROR) { + if (entity == FILAMENT_ASSET_ERROR) { throw Exception("Failed to add light to scene"); } - _sceneUpdateEventController - .add(SceneUpdateEvent.addDirectLight(entity, directLight)); return entity; } @@ -510,7 +488,6 @@ class ThermionViewerFFI extends ThermionViewer { @override Future removeLight(ThermionEntity entity) async { remove_light(_viewer!, entity); - _sceneUpdateEventController.add(SceneUpdateEvent.remove(entity)); } /// @@ -519,74 +496,38 @@ class ThermionViewerFFI extends ThermionViewer { @override Future clearLights() async { clear_lights(_viewer!); - _sceneUpdateEventController.add(SceneUpdateEvent.clearLights()); } /// /// /// @override - Future createInstance(ThermionEntity entity) async { - var created = create_instance(_sceneManager!, entity); - if (created == _FILAMENT_ASSET_ERROR) { - throw Exception("Failed to create instance"); - } - return created; - } - - /// - /// - /// - @override - Future getInstanceCount(ThermionEntity entity) async { - return get_instance_count(_sceneManager!, entity); - } - - /// - /// - /// - @override - Future> getInstances(ThermionEntity entity) async { - var count = await getInstanceCount(entity); - var out = allocator(count); - get_instances(_sceneManager!, entity, out); - var instances = []; - for (int i = 0; i < count; i++) { - instances.add(out[i]); - } - allocator.free(out); - return instances; - } - - /// - /// - /// - @override - Future loadGlb(String path, + Future loadGlb(String path, {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_render_thread( - _sceneManager!, pathPtr, numInstances, keepData, callback)); + var asset = await withPointerCallback((callback) => + SceneManager_loadGlbRenderThread( + _sceneManager!, pathPtr, numInstances, keepData, callback)); allocator.free(pathPtr); - if (entity == _FILAMENT_ASSET_ERROR) { + if (asset == nullptr) { throw Exception("An error occurred loading the asset at $path"); } - _sceneUpdateEventController - .add(SceneUpdateEvent.addGltf(entity, GLTF(path, numInstances))); + var thermionAsset = + FFIAsset(asset, _sceneManager!, _engine!, _unlitMaterialProvider!); - return entity; + return thermionAsset; } /// /// /// @override - Future loadGlbFromBuffer(Uint8List data, + Future loadGlbFromBuffer(Uint8List data, {bool unlit = false, int numInstances = 1, bool keepData = false, @@ -601,7 +542,7 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("Layer must be between 0 and 6"); } - var entity = await withIntCallback((callback) => + var assetPtr = await withPointerCallback((callback) => SceneManager_loadGlbFromBufferRenderThread( _sceneManager!, data.address, @@ -613,30 +554,33 @@ class ThermionViewerFFI extends ThermionViewer { loadResourcesAsync, callback)); - if (entity == _FILAMENT_ASSET_ERROR) { + if (assetPtr == nullptr) { throw Exception("An error occurred loading GLB from buffer"); } - return entity; + return FFIAsset( + assetPtr, _sceneManager!, _engine!, _unlitMaterialProvider!); } /// /// /// @override - Future loadGltf(String path, String relativeResourcePath, + Future loadGltf(String path, String relativeResourcePath, {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_render_thread( - _sceneManager!, pathPtr, relativeResourcePathPtr, keepData, callback)); + var assetPtr = await withPointerCallback((callback) => + SceneManager_loadGltfRenderThread(_sceneManager!, pathPtr, + relativeResourcePathPtr, keepData, callback)); allocator.free(pathPtr); allocator.free(relativeResourcePathPtr); - if (entity == _FILAMENT_ASSET_ERROR) { + if (assetPtr == nullptr) { throw Exception("An error occurred loading the asset at $path"); } - return entity; + return FFIAsset( + assetPtr, _sceneManager!, _engine!, _unlitMaterialProvider!); } /// @@ -654,8 +598,8 @@ class ThermionViewerFFI extends ThermionViewer { weightsPtr[i] = weights[i]; } var success = await withBoolCallback((cb) { - set_morph_target_weights_render_thread( - _sceneManager!, entity, weightsPtr, weights.length, cb); + AnimationManager_setMorphTargetWeightsRenderThread( + _animationManager!, entity, weightsPtr, weights.length, cb); }); allocator.free(weightsPtr); @@ -670,30 +614,32 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future> getMorphTargetNames( - ThermionEntity entity, ThermionEntity childEntity) async { + covariant FFIAsset asset, ThermionEntity childEntity) async { var names = []; - var count = await withIntCallback((callback) => - get_morph_target_name_count_render_thread( - _sceneManager!, entity, childEntity, callback)); + var count = AnimationManager_getMorphTargetNameCount( + _animationManager!, asset.pointer, childEntity); var outPtr = allocator(255); for (int i = 0; i < count; i++) { - get_morph_target_name(_sceneManager!, entity, childEntity, outPtr, i); + AnimationManager_getMorphTargetName( + _animationManager!, asset.pointer, childEntity, outPtr, i); names.add(outPtr.cast().toDartString()); } allocator.free(outPtr); return names.cast(); } - Future> getBoneNames(ThermionEntity entity, + Future> getBoneNames(covariant FFIAsset asset, {int skinIndex = 0}) async { - var count = get_bone_count(_sceneManager!, entity, skinIndex); + var count = AnimationManager_getBoneCount( + _animationManager!, asset.pointer, skinIndex); var out = allocator>(count); for (int i = 0; i < count; i++) { out[i] = allocator(255); } - get_bone_names(_sceneManager!, entity, out, skinIndex); + AnimationManager_getBoneNames( + _animationManager!, asset.pointer, out, skinIndex); var names = []; for (int i = 0; i < count; i++) { var namePtr = out[i]; @@ -706,12 +652,14 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future> getAnimationNames(ThermionEntity entity) async { - var animationCount = get_animation_count(_sceneManager!, entity); + Future> getAnimationNames(covariant FFIAsset asset) async { + var animationCount = + AnimationManager_getAnimationCount(_animationManager!, asset.pointer); var names = []; var outPtr = allocator(255); for (int i = 0; i < animationCount; i++) { - get_animation_name(_sceneManager!, entity, outPtr, i); + AnimationManager_getAnimationName( + _animationManager!, asset.pointer, outPtr, i); names.add(outPtr.cast().toDartString()); } allocator.free(outPtr); @@ -724,32 +672,26 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future getAnimationDuration( - ThermionEntity entity, int animationIndex) async { - var duration = - get_animation_duration(_sceneManager!, entity, animationIndex); - - return duration; + FFIAsset asset, int animationIndex) async { + return AnimationManager_getAnimationDuration( + _animationManager!, asset.pointer, animationIndex); } /// /// /// - @override - Future getAnimationDurationByName( - ThermionEntity entity, String name) async { - var animations = await getAnimationNames(entity); + Future getAnimationDurationByName(FFIAsset asset, String name) async { + var animations = await getAnimationNames(asset); var index = animations.indexOf(name); if (index == -1) { throw Exception("Failed to find animation $name"); } - return getAnimationDuration(entity, index); + return getAnimationDuration(asset, index); } Future clearMorphAnimationData(ThermionEntity entity) async { - var meshEntities = await getChildEntities(entity, true); - - for (final childEntity in meshEntities) { - clear_morph_animation(_sceneManager!, childEntity); + if (!AnimationManager_clearMorphAnimation(_animationManager!, entity)) { + throw Exception("Failed to clear morph animation"); } } @@ -757,10 +699,11 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future setMorphAnimationData( - ThermionEntity entity, MorphAnimationData animation, + Future setMorphAnimationData(FFIAsset asset, MorphAnimationData animation, {List? targetMeshNames}) async { - var meshNames = await getChildEntityNames(entity, renderableOnly: true); + var meshEntities = await getChildEntities(asset); + + var meshNames = meshEntities.map((e) => getNameForEntity(e)).toList(); if (targetMeshNames != null) { for (final targetMeshName in targetMeshNames) { if (!meshNames.contains(targetMeshName)) { @@ -770,8 +713,6 @@ class ThermionViewerFFI extends ThermionViewer { } } - var meshEntities = await getChildEntities(entity, true); - // Entities are not guaranteed to have the same morph targets (or share the same order), // either from each other, or from those specified in [animation]. // We therefore set morph targets separately for each mesh. @@ -787,7 +728,7 @@ class ThermionViewerFFI extends ThermionViewer { continue; } - var meshMorphTargets = await getMorphTargetNames(entity, meshEntity); + var meshMorphTargets = await getMorphTargetNames(asset, meshEntity); var intersection = animation.morphTargets .toSet() @@ -812,8 +753,8 @@ class ThermionViewerFFI extends ThermionViewer { assert( frameData.data.length == animation.numFrames * intersection.length); - var result = SceneManager_setMorphAnimation( - _sceneManager!, + var result = AnimationManager_setMorphAnimation( + _animationManager!, meshEntity, frameData.data.address, indices.address, @@ -831,7 +772,7 @@ class ThermionViewerFFI extends ThermionViewer { /// Currently, scale is not supported. /// @override - Future addBoneAnimation(ThermionEntity entity, BoneAnimationData animation, + Future addBoneAnimation(covariant FFIAsset asset, BoneAnimationData animation, {int skinIndex = 0, double fadeOutInSecs = 0.0, double fadeInInSecs = 0.0, @@ -843,10 +784,11 @@ class ThermionViewerFFI extends ThermionViewer { if (skinIndex != 0) { throw UnimplementedError("TODO - support skinIndex != 0 "); } - var boneNames = await getBoneNames(entity); + var boneNames = await getBoneNames(asset); var restLocalTransformsRaw = allocator(boneNames.length * 16); - get_rest_local_transforms(_sceneManager!, entity, skinIndex, - restLocalTransformsRaw, boneNames.length); + AnimationManager_getRestLocalTransforms(_animationManager!, asset.pointer, + skinIndex, restLocalTransformsRaw, boneNames.length); + var restLocalTransforms = []; for (int i = 0; i < boneNames.length; i++) { var values = []; @@ -862,7 +804,7 @@ class ThermionViewerFFI extends ThermionViewer { var data = allocator(numFrames * 16); var bones = await Future.wait(List>.generate( - boneNames.length, (i) => getBone(entity, i))); + boneNames.length, (i) => getBone(asset, i))); for (int i = 0; i < animation.bones.length; i++) { var boneName = animation.bones[i]; @@ -907,9 +849,9 @@ class ThermionViewerFFI extends ThermionViewer { } } - add_bone_animation( - _sceneManager!, - entity, + AnimationManager_addBoneAnimation( + _animationManager!, + asset.pointer, skinIndex, entityBoneIndex, data, @@ -926,38 +868,24 @@ class ThermionViewerFFI extends ThermionViewer { /// /// Future getLocalTransform(ThermionEntity entity) async { - final ptr = allocator(16); - - get_local_transform(_sceneManager!, entity, ptr); - var data = List.filled(16, 0.0); - for (int i = 0; i < 16; i++) { - data[i] = ptr[i]; - } - allocator.free(ptr); - return Matrix4.fromList(data); + return double4x4ToMatrix4( + TransformManager_getLocalTransform(_transformManager!, entity)); } /// /// /// Future getWorldTransform(ThermionEntity entity) async { - final ptr = allocator(16); - - get_world_transform(_sceneManager!, entity, ptr); - var data = List.filled(16, 0.0); - for (int i = 0; i < 16; i++) { - data[i] = ptr[i]; - } - allocator.free(ptr); - return Matrix4.fromList(data); + return double4x4ToMatrix4( + TransformManager_getWorldTransform(_transformManager!, entity)); } /// /// /// Future setTransform(ThermionEntity entity, Matrix4 transform) async { - SceneManager_setTransform( - _sceneManager!, entity, transform.storage.address); + TransformManager_setTransform( + _transformManager!, entity, matrix4ToDouble4x4(transform)); } /// @@ -988,28 +916,24 @@ class ThermionViewerFFI extends ThermionViewer { /// /// /// - Future getInverseBindMatrix(ThermionEntity parent, int boneIndex, + Future getInverseBindMatrix(FFIAsset asset, int boneIndex, {int skinIndex = 0}) async { - final ptr = allocator(16); - - get_inverse_bind_matrix(_sceneManager!, parent, skinIndex, boneIndex, ptr); - var data = List.filled(16, 0.0); - for (int i = 0; i < 16; i++) { - data[i] = ptr[i]; - } - allocator.free(ptr); - return Matrix4.fromList(data); + var matrix = Float32List(16); + AnimationManager_getInverseBindMatrix(_animationManager!, asset.pointer, + skinIndex, boneIndex, matrix.address); + return Matrix4.fromList(matrix); } /// /// /// - Future getBone(ThermionEntity parent, int boneIndex, + Future getBone(FFIAsset asset, int boneIndex, {int skinIndex = 0}) async { if (skinIndex != 0) { throw UnimplementedError("TOOD"); } - return get_bone(_sceneManager!, parent, skinIndex, boneIndex); + return AnimationManager_getBone( + _animationManager!, asset.pointer, skinIndex, boneIndex); } /// @@ -1044,13 +968,8 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future resetBones(ThermionEntity entity) async { - if (_viewer == nullptr) { - throw Exception("No viewer available, ignoring"); - } - await withVoidCallback((cb) { - reset_to_rest_pose_render_thread(_sceneManager!, entity, cb); - }); + Future resetBones(covariant FFIAsset asset) async { + AnimationManager_resetToRestPose(_animationManager!, asset.pointer); } /// @@ -1060,10 +979,9 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future removeEntity(ThermionEntity entity) async { - await withVoidCallback( - (callback) => remove_entity_render_thread(_viewer!, entity, callback)); - _sceneUpdateEventController.add(SceneUpdateEvent.remove(entity)); + Future removeEntity(covariant FFIAsset asset) async { + await withVoidCallback((callback) => SceneManager_destroyAssetRenderThread( + _sceneManager!, asset.pointer, callback)); } /// @@ -1075,7 +993,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future clearEntities() async { await withVoidCallback((callback) { - clear_entities_render_thread(_viewer!, callback); + SceneManager_destroyAllRenderThread(_sceneManager!, callback); }); } @@ -1083,47 +1001,48 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future playAnimation(ThermionEntity entity, int index, + Future playAnimation(covariant FFIAsset asset, int index, {bool loop = false, bool reverse = false, bool replaceActive = true, double crossfade = 0.0, double startOffset = 0.0}) async { - play_animation(_sceneManager!, entity, index, loop, reverse, replaceActive, - crossfade, startOffset); + AnimationManager_playAnimation(_animationManager!, asset.pointer, index, + loop, reverse, replaceActive, crossfade, startOffset); } /// /// /// @override - Future stopAnimation(ThermionEntity entity, int animationIndex) async { - stop_animation(_sceneManager!, entity, animationIndex); + Future stopAnimation(FFIAsset asset, int animationIndex) async { + AnimationManager_stopAnimation( + _animationManager!, asset.pointer, animationIndex); } /// /// /// @override - Future stopAnimationByName(ThermionEntity entity, String name) async { - var animations = await getAnimationNames(entity); - await stopAnimation(entity, animations.indexOf(name)); + Future stopAnimationByName(FFIAsset asset, String name) async { + var animations = await getAnimationNames(asset); + await stopAnimation(asset, animations.indexOf(name)); } /// /// /// @override - Future playAnimationByName(ThermionEntity entity, String name, + Future playAnimationByName(FFIAsset asset, String name, {bool loop = false, bool reverse = false, bool replaceActive = true, double crossfade = 0.0, bool wait = false}) async { - var animations = await getAnimationNames(entity); + var animations = await getAnimationNames(asset); var index = animations.indexOf(name); - var duration = await getAnimationDuration(entity, index); - await playAnimation(entity, index, + var duration = await getAnimationDuration(asset, index); + await playAnimation(asset, index, loop: loop, reverse: reverse, replaceActive: replaceActive, @@ -1137,9 +1056,10 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future setAnimationFrame( - ThermionEntity entity, int index, int animationFrame) async { - set_animation_frame(_sceneManager!, entity, index, animationFrame); + Future setGltfAnimationFrame( + FFIAsset asset, int index, int animationFrame) async { + AnimationManager_setGltfAnimationFrame( + _animationManager!, asset.pointer, index, animationFrame); } /// @@ -1169,7 +1089,7 @@ class ThermionViewerFFI extends ThermionViewer { Future getCameraComponent(ThermionEntity cameraEntity) async { var engine = Viewer_getEngine(_viewer!); var camera = Engine_getCameraComponent(engine, cameraEntity); - return FFICamera(camera, engine); + return FFICamera(camera, engine, _transformManager!); } /// @@ -1238,7 +1158,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setAntiAliasing(bool msaa, bool fxaa, bool taa) async { - if(Platform.isWindows && msaa) { + if (Platform.isWindows && msaa) { throw Exception("MSAA is not currently supported on Windows"); } final view = await getViewAt(0) as FFIView; @@ -1384,36 +1304,12 @@ class ThermionViewerFFI extends ThermionViewer { set_camera_model_matrix(mainCamera.camera, out); } - /// - /// - /// - @override - Future setMaterialColor(ThermionEntity entity, String meshName, - int materialIndex, double r, double g, double b, double a) async { - var meshNamePtr = meshName.toNativeUtf8(allocator: allocator).cast(); - var result = set_material_color( - _sceneManager!, entity, meshNamePtr, materialIndex, r, g, b, a); - allocator.free(meshNamePtr); - if (!result) { - throw Exception("Failed to set material color"); - } - } - /// /// /// @override Future transformToUnitCube(ThermionEntity entity) async { - transform_to_unit_cube(_sceneManager!, entity); - } - - /// - /// - /// - @override - Future setPosition( - ThermionEntity entity, double x, double y, double z) async { - set_position(_sceneManager!, entity, x, y, z); + SceneManager_transformToUnitCube(_sceneManager!, entity); } /// @@ -1436,34 +1332,6 @@ class ThermionViewerFFI extends ThermionViewer { _viewer!, lightEntity, direction.x, direction.y, direction.z); } - /// - /// - /// - @override - Future setRotationQuat(ThermionEntity entity, Quaternion rotation, - {bool relative = false}) async { - set_rotation(_sceneManager!, entity, rotation.radians, rotation.x, - rotation.y, rotation.z, rotation.w); - } - - /// - /// - /// - @override - Future setRotation( - ThermionEntity entity, double rads, double x, double y, double z) async { - var quat = Quaternion.axisAngle(Vector3(x, y, z), rads); - await setRotationQuat(entity, quat); - } - - /// - /// - /// - @override - Future setScale(ThermionEntity entity, double scale) async { - set_scale(_sceneManager!, entity, scale); - } - /// /// 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. @@ -1488,24 +1356,19 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future hide(ThermionEntity entity, String? meshName) async { - final meshNamePtr = - meshName?.toNativeUtf8(allocator: allocator).cast() ?? nullptr; - if (hide_mesh(_sceneManager!, entity, meshNamePtr) != 1) {} - allocator.free(meshNamePtr); + Future removeEntityFromScene(ThermionEntity entity) async { + if (SceneManager_removeFromScene(_sceneManager!, entity) != 1) { + throw Exception("Failed to remove entity from scene"); + } } /// /// /// @override - Future reveal(ThermionEntity entity, String? meshName) async { - final meshNamePtr = - meshName?.toNativeUtf8(allocator: allocator).cast() ?? nullptr; - final result = reveal_mesh(_sceneManager!, entity, meshNamePtr) == 1; - allocator.free(meshNamePtr); - if (!result) { - throw Exception("Failed to reveal mesh $meshName"); + Future addEntityToScene(ThermionEntity entity) async { + if (SceneManager_addToScene(_sceneManager!, entity) != 1) { + throw Exception("Failed to add entity to scene"); } } @@ -1514,57 +1377,60 @@ class ThermionViewerFFI extends ThermionViewer { /// @override String? getNameForEntity(ThermionEntity entity) { - final result = get_name_for_entity(_sceneManager!, entity); + final result = NameComponentManager_getName(_nameComponentManager!, entity); if (result == nullptr) { return null; } return result.cast().toDartString(); } - void _onPickResult( - ThermionEntity entityId, - int x, - int y, - Pointer viewPtr, - double depth, - double fragX, - double fragY, - double fragZ) async { - final view = FFIView(viewPtr, _viewer!); + void _onPickResult(int requestId, ThermionEntity entityId, double depth, + double fragX, double fragY, double fragZ) async { + if (!_pickRequests.containsKey(requestId)) { + _logger.severe( + "Warning : pick result received with no matching request ID. This indicates you're clearing the pick cache too quickly"); + return; + } + final (:handler, :x, :y, :view) = _pickRequests[requestId]!; + _pickRequests.remove(requestId); + final viewport = await view.getViewport(); - _pickResultController.add(( + handler.call(( entity: entityId, x: x, - y: (viewport.height - y), + y: y, depth: depth, fragX: fragX, fragY: viewport.height - fragY, - fragZ: fragZ + fragZ: fragZ, )); } - late NativeCallable< - Void Function( - EntityId entityId, - Int x, - Int y, - Pointer view, - Float depth, - Float fragX, - Float fragY, - Float fragZ)> _onPickResultCallable; + int _pickRequestId = -1; + final _pickRequests = {}; /// /// /// @override - Future pick(int x, int y) async { + Future pick(int x, int y, void Function(PickResult) resultHandler) async { + _pickRequestId++; + var pickRequestId = _pickRequestId; final view = (await getViewAt(0)) as FFIView; + _pickRequests[pickRequestId] = + (handler: resultHandler, x: x, y: y, view: view); + var viewport = await view.getViewport(); y = viewport.height - y; - Viewer_pick( - _viewer!, view.view, x, y, _onPickResultCallable.nativeFunction); + + View_pick( + view.view, pickRequestId, x, y, _onPickResultCallable.nativeFunction); + + Future.delayed(Duration(seconds: 1)).then((_) { + _pickRequests.remove(pickRequestId); + }); } /// @@ -1678,48 +1544,23 @@ class ThermionViewerFFI extends ThermionViewer { /// /// @override - Future getChildEntity( - ThermionEntity parent, String childName) async { - var childNamePtr = - childName.toNativeUtf8(allocator: allocator).cast(); - - var childEntity = - find_child_entity_by_name(_sceneManager!, parent, childNamePtr); - allocator.free(childNamePtr); - if (childEntity == _FILAMENT_ASSET_ERROR) { - throw Exception( - "Could not find child ${childName} under the specified entity"); - } - return childEntity; - } - - Future> getChildEntities( - ThermionEntity parent, bool renderableOnly) async { - var count = get_entity_count(_sceneManager!, parent, renderableOnly); - var out = allocator(count); - get_entities(_sceneManager!, parent, renderableOnly, out); - var outList = - List.generate(count, (index) => out[index]).cast(); - allocator.free(out); - return outList; - } - - /// - /// - /// - @override - Future> getChildEntityNames(ThermionEntity entity, - {bool renderableOnly = false}) async { - var count = get_entity_count(_sceneManager!, entity, renderableOnly); - var names = []; - for (int i = 0; i < count; i++) { - var name = get_entity_name_at(_sceneManager!, entity, i, renderableOnly); - if (name == nullptr) { - throw Exception("Failed to find mesh at index $i"); + Future getChildEntity( + FFIAsset asset, String childName) async { + final childEntities = await getChildEntities(asset); + for (final entity in childEntities) { + var name = await getNameForEntity(entity); + if (name == childName) { + return entity; } - names.add(name.cast().toDartString()); } - return names; + return null; + } + + Future> getChildEntities(FFIAsset asset) async { + var count = SceneAsset_getChildEntityCount(asset.pointer); + var out = Int32List(count); + SceneAsset_getChildEntities(asset.pointer, out.address); + return out; } final _collisions = {}; @@ -1731,11 +1572,6 @@ class ThermionViewerFFI extends ThermionViewer { Future addCollisionComponent(ThermionEntity entity, {void Function(int entityId1, int entityId2)? callback, bool affectsTransform = false}) async { - if (_sceneManager == null) { - throw Exception("SceneManager must be non-null"); - } - // ignore: sdk_version_since - if (callback != null) { var ptr = NativeCallable< Void Function( @@ -1762,54 +1598,63 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future addAnimationComponent(ThermionEntity entity) async { - if (!add_animation_component(_sceneManager!, entity)) { - throw Exception("Failed to add animation component"); - } + AnimationManager_addAnimationComponent(_animationManager!, entity); } /// /// /// Future removeAnimationComponent(ThermionEntity entity) async { - remove_animation_component(_sceneManager!, entity); + AnimationManager_removeAnimationComponent(_animationManager!, entity); } /// /// /// @override - Future createGeometry(Geometry geometry, - {MaterialInstance? materialInstance, bool keepData = false}) async { + Future createGeometry(Geometry geometry, + {List? materialInstances, + bool keepData = false}) async { if (_viewer == null) { throw Exception("Viewer must not be null"); } - - var entity = await withIntCallback((callback) => - SceneManager_createGeometryRenderThread( - _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) { + var assetPtr = await withPointerCallback((callback) { + var ptrList = Int64List(materialInstances?.length ?? 0); + if (materialInstances != null && materialInstances.isNotEmpty) { + ptrList.setRange( + 0, + materialInstances.length, + materialInstances + .cast() + .map((mi) => mi.pointer.address) + .toList()); + } + + return SceneManager_createGeometryRenderThread( + _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, + ptrList.address.cast>(), + ptrList.length, + keepData, + callback); + }); + if (assetPtr == nullptr) { throw Exception("Failed to create geometry"); } - _sceneUpdateEventController - .add(SceneUpdateEvent.addGeometry(entity, geometry)); + var asset = + FFIAsset(assetPtr, _sceneManager!, _engine!, _unlitMaterialProvider!); - return entity; + return asset; } /// @@ -1821,7 +1666,8 @@ class ThermionViewerFFI extends ThermionViewer { if (_sceneManager == null) { throw Exception("Asset manager must be non-null"); } - set_parent(_sceneManager!, child, parent, preserveScaling); + TransformManager_setParent( + _transformManager!, child, parent, preserveScaling); } /// @@ -1832,8 +1678,8 @@ class ThermionViewerFFI extends ThermionViewer { if (_sceneManager == null) { throw Exception("Asset manager must be non-null"); } - var parent = get_parent(_sceneManager!, child); - if (parent == _FILAMENT_ASSET_ERROR) { + var parent = TransformManager_getParent(_transformManager!, child); + if (parent == FILAMENT_ASSET_ERROR) { return null; } return parent; @@ -1847,8 +1693,8 @@ class ThermionViewerFFI extends ThermionViewer { if (_sceneManager == null) { throw Exception("Asset manager must be non-null"); } - var parent = get_ancestor(_sceneManager!, child); - if (parent == _FILAMENT_ASSET_ERROR) { + var parent = TransformManager_getAncestor(_transformManager!, child); + if (parent == FILAMENT_ASSET_ERROR) { return null; } return parent; @@ -1867,7 +1713,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setPriority(ThermionEntity entityId, int priority) async { - set_priority(_sceneManager!, entityId, priority); + RenderableManager_setPriority(_renderableManager!, entityId, priority); } /// @@ -1896,58 +1742,17 @@ class ThermionViewerFFI extends ThermionViewer { /// /// /// - Future setLayerVisibility(int layer, bool visible) async { + Future setLayerVisibility(VisibilityLayers layer, bool visible) async { final view = (await getViewAt(0)) as FFIView; - View_setLayerEnabled(view.view, layer, visible); + View_setLayerEnabled(view.view, layer.value, visible); } /// /// /// - Future setVisibilityLayer(ThermionEntity entity, int layer) async { - SceneManager_setVisibilityLayer(_sceneManager!, entity, layer); - } - - /// - /// - /// - 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); - } - - /// - /// - /// - 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); - } - - /// - /// - /// - 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 = f4; - set_material_property_float4( - _sceneManager!, entity, materialIndex, ptr.cast(), struct); - allocator.free(ptr); + Future setVisibilityLayer( + ThermionEntity entity, VisibilityLayers layer) async { + SceneManager_setVisibilityLayer(_sceneManager!, entity, layer.value); } Future unproject(ThermionEntity entity, Uint8List input, @@ -1977,7 +1782,7 @@ class ThermionViewerFFI extends ThermionViewer { 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, + apply_texture_to_material(_sceneManager!, entity, texture.pointer, namePtr.cast(), materialIndex); }); } @@ -1986,9 +1791,12 @@ class ThermionViewerFFI extends ThermionViewer { /// /// Future destroyTexture(ThermionFFITexture texture) async { - destroy_texture(_sceneManager!, texture._pointer); + destroy_texture(_sceneManager!, texture.pointer); } + /// + /// + /// Future createUbershaderMaterialInstance( {bool doubleSided = false, bool unlit = false, @@ -2066,7 +1874,8 @@ class ThermionViewerFFI extends ThermionViewer { key.hasIOR = hasIOR; key.hasVolume = hasVolume; - final materialInstance = create_material_instance(_sceneManager!, key); + final materialInstance = MaterialProvider_createMaterialInstance( + _ubershaderMaterialProvider!, key.address); if (materialInstance == nullptr) { throw Exception("Failed to create material instance"); } @@ -2079,7 +1888,8 @@ class ThermionViewerFFI extends ThermionViewer { /// Future destroyMaterialInstance( ThermionFFIMaterialInstance materialInstance) async { - SceneManager_destroyMaterialInstance(_sceneManager!, materialInstance._pointer); + SceneManager_destroyMaterialInstance( + _sceneManager!, materialInstance.pointer); } /// @@ -2110,24 +1920,15 @@ class ThermionViewerFFI extends ThermionViewer { 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(); - } - /// /// /// - Future getMaterialInstanceAt( + Future getMaterialInstanceAt( ThermionEntity entity, int index) async { - final instance = get_material_instance_at(_sceneManager!, entity, index); + final instance = RenderableManager_getMaterialInstanceAt( + _renderableManager!, entity, index); if (instance == nullptr) { - return null; + throw Exception("Failed to get material instance"); } return ThermionFFIMaterialInstance(instance); } @@ -2155,7 +1956,7 @@ class ThermionViewerFFI extends ThermionViewer { Future createCamera() async { var cameraPtr = SceneManager_createCamera(_sceneManager!); var engine = Viewer_getEngine(_viewer!); - var camera = FFICamera(cameraPtr, engine); + var camera = FFICamera(cameraPtr, engine, _transformManager!); return camera; } @@ -2212,7 +2013,7 @@ class ThermionViewerFFI extends ThermionViewer { if (camera == nullptr) { throw Exception("No camera at index $index"); } - return FFICamera(camera, Viewer_getEngine(_viewer!)); + return FFICamera(camera, Viewer_getEngine(_viewer!), _transformManager!); } @override @@ -2225,65 +2026,25 @@ class ThermionViewerFFI extends ThermionViewer { } @override - Future createGizmo(FFIView view) async { - var view = (await getViewAt(0)) as FFIView; + Future createGizmo(FFIView view, GizmoType gizmoType) async { var scene = View_getScene(view.view); final gizmo = SceneManager_createGizmo(_sceneManager!, view.view, scene); - return FFIGizmo(gizmo, this); + if (gizmo == nullptr) { + throw Exception("Failed to create gizmo"); + } + final overlayEntityCount = + SceneManager_getOverlayEntityCount(_sceneManager!); + final overlayEntities = List.generate(overlayEntityCount, + (i) => SceneManager_getOverlayEntityAt(_sceneManager!, i)).toSet(); + return FFIGizmo( + view, gizmo.cast(), _sceneManager!, _engine!, nullptr, overlayEntities); } } class ThermionFFITexture extends ThermionTexture { - final Pointer _pointer; - - ThermionFFITexture(this._pointer); -} - -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); - } - - @override - Future setParameterFloat4(String name, double x, double y, double z, double w) async { - MaterialInstance_setParameterFloat4( - _pointer, name.toNativeUtf8().cast(), x, y, z, w); - } - - @override - Future setParameterFloat2(String name, double x, double y) async { - MaterialInstance_setParameterFloat2( - _pointer, name.toNativeUtf8().cast(), x, y); - } - - @override - Future setParameterFloat(String name, double value) async { - MaterialInstance_setParameterFloat( - _pointer, name.toNativeUtf8().cast(), value); - } - - @override - Future setParameterInt(String name, int value) async { - MaterialInstance_setParameterInt( - _pointer, name.toNativeUtf8().cast(), value); - } - - @override - Future setDepthFunc(SamplerCompareFunction depthFunc) async { - MaterialInstance_setDepthFunc(_pointer, TDepthFunc.values[depthFunc.index]); - } - + final Pointer pointer; + ThermionFFITexture(this.pointer); } class FFIRenderTarget extends RenderTarget { diff --git a/thermion_dart/lib/src/viewer/src/shared_types/entities.dart b/thermion_dart/lib/src/viewer/src/shared_types/entities.dart index 0de51188..71676d46 100644 --- a/thermion_dart/lib/src/viewer/src/shared_types/entities.dart +++ b/thermion_dart/lib/src/viewer/src/shared_types/entities.dart @@ -1,11 +1,85 @@ library; +import 'package:thermion_dart/thermion_dart.dart'; +import 'package:vector_math/vector_math_64.dart'; + 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 +// repre handle that can be safely passed back to the rendering layer to manipulate an Entity typedef ThermionEntity = int; +abstract class ThermionAsset { + ThermionEntity get entity; + Future> getChildEntities(); + /// + /// Renders an outline around [entity] with the given color. + /// + Future setStencilHighlight( + {double r = 1.0, double g = 0.0, double b = 0.0, int? entityIndex}); + + /// + /// Removes the outline around [entity]. Noop if there was no highlight. + /// + Future removeStencilHighlight(); + + /// + /// + /// + Future getInstance(int index); + + /// + /// Create a new instance of [entity]. + /// Instances are not automatically added to the scene; you must + /// call [addToScene]. + /// + Future createInstance( + {covariant List? materialInstances = null}); + + /// + /// Returns the number of instances associated with this asset. + /// + Future getInstanceCount(); + + /// + /// Returns all instances of associated with this asset. + /// + Future> getInstances(); + + /// + /// Adds all entities (renderable, lights and cameras) under [asset] to the scene. + /// + Future addToScene(); + + /// + /// Removes all entities (renderable, lights and cameras) under [asset] from the scene. + /// + Future removeFromScene(); +} + +enum Axis { + X(const [1.0, 0.0, 0.0]), + Y(const [0.0, 1.0, 0.0]), + Z(const [0.0, 0.0, 1.0]); + + const Axis(this.vector); + + final List vector; + + Vector3 asVector() => Vector3(vector[0], vector[1], vector[2]); +} + +enum GizmoPickResultType { AxisX, AxisY, AxisZ, Parent, None } + +enum GizmoType { translation, rotation } + +abstract class GizmoAsset extends ThermionAsset { + Future pick(int x, int y, + {Future Function(GizmoPickResultType axis, Vector3 coords)? handler}); + Future highlight(Axis axis); + Future unhighlight(); + Set get nonPickableEntities; +} diff --git a/thermion_dart/lib/src/viewer/src/shared_types/material.dart b/thermion_dart/lib/src/viewer/src/shared_types/material.dart index 9b6508e2..333bc4df 100644 --- a/thermion_dart/lib/src/viewer/src/shared_types/material.dart +++ b/thermion_dart/lib/src/viewer/src/shared_types/material.dart @@ -1,32 +1,112 @@ -import 'package:thermion_dart/src/viewer/src/ffi/src/callbacks.dart'; - -enum SamplerCompareFunction { +enum SamplerCompareFunction { /// !< Less or equal LE, + /// !< Greater or equal GE, + /// !< Strictly less than L, + /// !< Strictly greater than G, + /// !< Equal E, + /// !< Not equal NE, + /// !< Always. Depth / stencil testing is deactivated. A, + /// !< Never. The depth / stencil test always fails. N; } -abstract class MaterialInstance { - Future setDepthWriteEnabled(bool enabled); - Future setDepthFunc(SamplerCompareFunction depthFunc); - - Future setDepthCullingEnabled(bool enabled); - Future setParameterFloat4(String name, double x, double y, double z, double w); - Future setParameterFloat2(String name, double x, double y); - Future setParameterFloat(String name, double x); - Future setParameterInt(String name, int value); + +/// Defines stencil operations +enum StencilOperation { + /// Keep the current value + KEEP, + + /// Set the value to zero + ZERO, + + /// Set the value to reference value + REPLACE, + + /// Increment the current value with saturation + INCR, + + /// Increment the current value without saturation + INCR_WRAP, + + /// Decrement the current value with saturation + DECR, + + /// Decrement the current value without saturation + DECR_WRAP, + + /// Invert the current value + INVERT +} + +enum CullingMode { + NONE, // No culling + FRONT, // Cull front faces + BACK, // Cull back faces + FRONT_AND_BACK // Cull both front and back faces +} + +/// Defines which face(s) the stencil operation affects +enum StencilFace { + /// Front face only + FRONT, + + /// Back face only + BACK, + + /// Both front and back faces + FRONT_AND_BACK } enum AlphaMode { OPAQUE, MASK, BLEND } + +abstract class MaterialInstance { + Future isStencilWriteEnabled(); + Future setDepthWriteEnabled(bool enabled); + Future setDepthFunc(SamplerCompareFunction depthFunc); + Future setDepthCullingEnabled(bool enabled); + Future setParameterFloat4( + String name, double x, double y, double z, double w); + Future setParameterFloat2(String name, double x, double y); + Future setParameterFloat(String name, double x); + Future setParameterInt(String name, int value); + + /// Sets the stencil operation to be performed when the stencil test fails + Future setStencilOpStencilFail(StencilOperation op, + [StencilFace face = StencilFace.FRONT_AND_BACK]); + + /// Sets the stencil operation to be performed when the depth test fails + Future setStencilOpDepthFail(StencilOperation op, + [StencilFace face = StencilFace.FRONT_AND_BACK]); + + /// Sets the stencil operation to be performed when both depth and stencil tests pass + Future setStencilOpDepthStencilPass(StencilOperation op, + [StencilFace face = StencilFace.FRONT_AND_BACK]); + + /// Sets the stencil test comparison function + Future setStencilCompareFunction(SamplerCompareFunction func, + [StencilFace face = StencilFace.FRONT_AND_BACK]); + + /// Sets the reference value used for stencil testing + Future setStencilReferenceValue(int value, + [StencilFace face = StencilFace.FRONT_AND_BACK]); + + Future setStencilWriteEnabled(bool enabled); + + Future setCullingMode(CullingMode cullingMode); + + Future setStencilReadMask(int mask); + Future setStencilWriteMask(int mask); +} diff --git a/thermion_dart/lib/src/viewer/src/shared_types/view.dart b/thermion_dart/lib/src/viewer/src/shared_types/view.dart index 37b86cae..97383fb0 100644 --- a/thermion_dart/lib/src/viewer/src/shared_types/view.dart +++ b/thermion_dart/lib/src/viewer/src/shared_types/view.dart @@ -1,5 +1,5 @@ import 'package:thermion_dart/thermion_dart.dart'; -import 'swap_chain.dart'; + /// /// The viewport currently attached to a [View]. @@ -27,4 +27,6 @@ abstract class View { Future setFrustumCullingEnabled(bool enabled); Future setToneMapper(ToneMapper mapper); Future setBloom(double strength); + Future setStencilBufferEnabled(bool enabled); + Future isStencilBufferEnabled(); } diff --git a/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart b/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart index f1490f0b..8f1bc213 100644 --- a/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart +++ b/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart @@ -1,4 +1,3 @@ -import 'package:thermion_dart/src/viewer/src/events.dart'; import '../../utils/src/gizmo.dart'; import 'shared_types/shared_types.dart'; export 'shared_types/shared_types.dart'; @@ -9,30 +8,30 @@ import 'package:vector_math/vector_math_64.dart'; import 'dart:async'; import 'package:animation_tools_dart/animation_tools_dart.dart'; -import 'shared_types/view.dart'; - const double kNear = 0.05; const double kFar = 1000.0; const double kFocalLength = 28.0; +enum VisibilityLayers { + DEFAULT_ASSET(0), + LAYER_1(1), + LAYER_2(2), + LAYER_3(3), + LAYER_4(4), + LAYER_5(5), + BACKGROUND(6), + OVERLAY(7); + + final int value; + const VisibilityLayers(this.value); +} + abstract class ThermionViewer { /// /// A Future that resolves when the underlying rendering context has been successfully created. /// Future get initialized; - /// - /// 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; - - /// - /// A Stream containing entities added/removed to/from to the scene. - /// - Stream get sceneUpdated; - /// /// Whether the controller is currently rendering at [framerate]. /// @@ -74,8 +73,7 @@ abstract class ThermionViewer { /// /// /// - Future destroySwapChain( - covariant SwapChain swapChain); + Future destroySwapChain(covariant SwapChain swapChain); /// /// @@ -86,8 +84,7 @@ abstract class ThermionViewer { /// /// /// - Future destroyRenderTarget( - covariant RenderTarget renderTarget); + Future destroyRenderTarget(covariant RenderTarget renderTarget); /// /// @@ -215,24 +212,24 @@ abstract class ThermionViewer { Future clearLights(); /// - /// Load the .glb asset at the given path and insert into the scene. + /// Load the .glb asset at the given path, adding all entities to 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, + Future loadGlb(String path, {int numInstances = 1, bool keepData = false}); /// - /// Load the .glb asset from the specified buffer and insert into the scene. + /// Load the .glb asset from the specified buffer, adding all entities to 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. - /// If [loadResourcesAsync] is true, resources (textures, materials, etc) will + /// If [loadResourcesAsync] is true, resources (textures, materials, etc) will /// be loaded asynchronously (so expect some material/texture pop-in); /// /// - Future loadGlbFromBuffer(Uint8List data, + Future loadGlbFromBuffer(Uint8List data, {int numInstances = 1, bool keepData = false, int priority = 4, @@ -240,28 +237,13 @@ abstract class ThermionViewer { bool loadResourcesAsync}); /// - /// 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. + /// Load the .gltf asset at the given path, adding all entities to 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, + Future loadGltf(String path, String relativeResourcePath, {bool keepData = false}); /// @@ -277,32 +259,34 @@ abstract class ThermionViewer { /// Gets the names of all morph targets for the child renderable [childEntity] under [entity]. /// Future> getMorphTargetNames( - ThermionEntity entity, ThermionEntity childEntity); + covariant ThermionAsset asset, ThermionEntity childEntity); /// /// Gets the names of all bones for the armature at [skinIndex] under the specified [entity]. /// - Future> getBoneNames(ThermionEntity entity, {int skinIndex = 0}); + Future> getBoneNames(covariant ThermionAsset asset, + {int skinIndex = 0}); /// /// Gets the names of all glTF animations embedded in the specified entity. /// - Future> getAnimationNames(ThermionEntity entity); + Future> getAnimationNames(covariant ThermionAsset asset); /// /// Returns the length (in seconds) of the animation at the given index. /// Future getAnimationDuration( - ThermionEntity entity, int animationIndex); + covariant ThermionAsset asset, int animationIndex); /// - /// Animate the morph targets in [entity]. See [MorphTargetAnimation] for an explanation as to how to construct the animation frame data. + /// Construct animation(s) for every entity under [asset]. If [targetMeshNames] is provided, only entities with matching names will be animated. + /// [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, + covariant ThermionAsset asset, MorphAnimationData animation, {List? targetMeshNames}); /// @@ -314,7 +298,7 @@ abstract class ThermionViewer { /// Resets all bones in the given entity to their rest pose. /// This should be done before every call to addBoneAnimation. /// - Future resetBones(ThermionEntity entity); + Future resetBones(ThermionAsset asset); /// /// Enqueues and plays the [animation] for the specified bone(s). @@ -334,7 +318,7 @@ abstract class ThermionViewer { /// This will be applied in reverse after [fadeOutInSecs]. /// /// - Future addBoneAnimation(ThermionEntity entity, BoneAnimationData animation, + Future addBoneAnimation(ThermionAsset asset, BoneAnimationData animation, {int skinIndex = 0, double fadeInInSecs = 0.0, double fadeOutInSecs = 0.0, @@ -344,7 +328,7 @@ abstract class ThermionViewer { /// 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, + Future getBone(covariant ThermionAsset asset, int boneIndex, {int skinIndex = 0}); /// @@ -362,7 +346,8 @@ abstract class ThermionViewer { /// 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, + Future getInverseBindMatrix( + covariant ThermionAsset asset, int boneIndex, {int skinIndex = 0}); /// @@ -398,7 +383,7 @@ abstract class ThermionViewer { /// 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); + Future removeEntity(ThermionAsset asset); /// /// Removes/destroys all renderable entities from the scene (including cameras). @@ -407,9 +392,9 @@ abstract class ThermionViewer { Future clearEntities(); /// - /// Schedules the glTF animation at [index] in [entity] to start playing on the next frame. + /// Schedules the glTF animation at [index] in [asset] to start playing on the next frame. /// - Future playAnimation(ThermionEntity entity, int index, + Future playAnimation(ThermionAsset asset, int index, {bool loop = false, bool reverse = false, bool replaceActive = true, @@ -419,17 +404,27 @@ abstract class ThermionViewer { /// /// Schedules the glTF animation at [index] in [entity] to start playing on the next frame. /// - Future playAnimationByName(ThermionEntity entity, String name, + Future playAnimationByName(covariant ThermionAsset asset, String name, {bool loop = false, bool reverse = false, bool replaceActive = true, double crossfade = 0.0}); - Future setAnimationFrame( - ThermionEntity entity, int index, int animationFrame); + /// + /// + /// + Future setGltfAnimationFrame( + covariant ThermionAsset asset, int index, int animationFrame); - Future stopAnimation(ThermionEntity entity, int animationIndex); - Future stopAnimationByName(ThermionEntity entity, String name); + /// + /// + /// + Future stopAnimation(covariant ThermionAsset asset, int animationIndex); + + /// + /// + /// + Future stopAnimationByName(covariant ThermionAsset asset, String name); /// /// Sets the current scene camera to the glTF camera under [name] in [entity]. @@ -576,44 +571,11 @@ abstract class ThermionViewer { /// 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); - - /// - /// 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. /// 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. /// @@ -625,17 +587,6 @@ abstract class ThermionViewer { /// 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); - /// /// TODO /// @@ -674,28 +625,22 @@ abstract class ThermionViewer { Future setAntiAliasing(bool msaa, bool fxaa, bool taa); /// - /// Sets the rotation for [entity] to the specified quaternion. + /// Adds a single [entity] to the scene. /// - Future setRotationQuat(ThermionEntity entity, Quaternion rotation); + Future addEntityToScene(ThermionEntity entity); /// - /// Reveal the node [meshName] under [entity]. Only applicable if [hide] had previously been called; this is a no-op otherwise. + /// Removes a single [entity] from the scene. /// - Future reveal(ThermionEntity entity, String? meshName); + Future removeEntityFromScene(ThermionEntity entity); /// - /// 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. + /// Hit test the viewport at the given coordinates. If the coordinates intersect + /// with a renderable entity, [resultHandler] will be called. + /// This is asynchronous and will require 2-3 frames to complete (so ensure you are calling render()) /// [x] and [y] must be in local logical coordinates (i.e. where 0,0 is at top-left of the ThermionWidget). /// - Future pick(int x, int y); + Future pick(int x, int y, void Function(PickResult) resultHandler); /// /// Retrieves the name assigned to the given ThermionEntity (usually corresponds to the glTF mesh name). @@ -703,23 +648,16 @@ abstract class ThermionViewer { String? getNameForEntity(ThermionEntity entity); /// - /// Returns all child entities under [parent]. + /// Returns all child entities under [asset]. /// - Future> getChildEntities( - ThermionEntity parent, bool renderableOnly); + Future> getChildEntities(covariant ThermionAsset asset); /// /// 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}); + Future getChildEntity( + covariant ThermionAsset asset, String childName); /// /// An [entity] will only be animatable after an animation component is attached. @@ -750,8 +688,9 @@ 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, + {covariant List? materialInstances, + bool keepData = false}); /// /// Gets the parent entity of [entity]. Returns null if the entity has no parent. @@ -783,7 +722,8 @@ abstract class ThermionViewer { /// /// The gizmo for translating/rotating objects. Only one gizmo can be active for a given view. /// - Future createGizmo(covariant View view); + Future createGizmo(covariant View view, + GizmoType type); /// /// Register a callback to be invoked when this viewer is disposed. @@ -803,34 +743,23 @@ abstract class ThermionViewer { /// /// Toggles the visibility of the respective layer. /// - Future setLayerVisibility(int layer, bool visible); + Future setLayerVisibility(VisibilityLayers layer, bool visible); /// - /// All renderable entities are assigned a layer mask. - /// - /// By calling [setLayerVisibility], all renderable entities allocated to - /// the given layer can be efficiently hidden/revealed. - /// - /// By default, all renderable entities are assigned to layer 0 (and this - /// layer is enabled by default). Call [setVisibilityLayer] to change the + /// All renderable entities are assigned a layer mask. + /// + /// By calling [setLayerVisibility], all renderable entities allocated to + /// the given layer can be efficiently hidden/revealed. + /// + /// By default, all renderable entities are assigned to layer 0 (and this + /// layer is enabled by default). Call [setVisibilityLayer] to change the /// layer for the specified entity. - /// - /// Note that we currently also assign gizmos to layer 1 (enabled by default) - /// and the world grid to layer 2 (disabled by default). We suggest you avoid + /// + /// Note that we currently also assign gizmos to layer 1 (enabled by default) + /// and the world grid to layer 2 (disabled by default). We suggest you avoid /// using these layers. /// - Future setVisibilityLayer(ThermionEntity entity, int layer); - - /// - /// 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); + Future setVisibilityLayer(ThermionEntity entity, VisibilityLayers layer); /// /// Decodes the specified image data and creates a texture. @@ -908,7 +837,7 @@ abstract class ThermionViewer { /// /// /// - Future getMaterialInstanceAt( + Future getMaterialInstanceAt( ThermionEntity entity, int index); /// diff --git a/thermion_dart/lib/src/viewer/src/thermion_viewer_stub.dart b/thermion_dart/lib/src/viewer/src/thermion_viewer_stub.dart index 8eaf73dc..1a526214 100644 --- a/thermion_dart/lib/src/viewer/src/thermion_viewer_stub.dart +++ b/thermion_dart/lib/src/viewer/src/thermion_viewer_stub.dart @@ -8,7 +8,7 @@ import 'package:thermion_dart/thermion_dart.dart'; import 'package:vector_math/vector_math_64.dart'; import 'dart:async'; import 'package:animation_tools_dart/animation_tools_dart.dart'; -import 'events.dart'; + import 'shared_types/camera.dart'; class ThermionViewerStub extends ThermionViewer { @@ -18,16 +18,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future addBoneAnimation(ThermionEntity entity, BoneAnimationData animation, - {int skinIndex = 0, - double fadeInInSecs = 0.0, - double fadeOutInSecs = 0.0, - double maxDelta = 1.0}) { - // TODO: implement addBoneAnimation - throw UnimplementedError(); - } - @override Future addCollisionComponent(ThermionEntity entity, {void Function(int entityId1, int entityId2)? callback, @@ -77,44 +67,12 @@ class ThermionViewerStub extends ThermionViewer { } - @override - Future createInstance(ThermionEntity entity) { - // TODO: implement createInstance - throw UnimplementedError(); - } - @override Future dispose() { // TODO: implement dispose throw UnimplementedError(); } - @override - Future getAnimationDuration( - ThermionEntity entity, int animationIndex) { - // TODO: implement getAnimationDuration - throw UnimplementedError(); - } - - @override - Future> getAnimationNames(ThermionEntity entity) { - // TODO: implement getAnimationNames - throw UnimplementedError(); - } - - @override - Future getBone(ThermionEntity parent, int boneIndex, - {int skinIndex = 0}) { - // TODO: implement getBone - throw UnimplementedError(); - } - - @override - Future> getBoneNames(ThermionEntity entity, - {int skinIndex = 0}) { - // TODO: implement getBoneNames - throw UnimplementedError(); - } @override Future getCameraCullingFar() { @@ -170,58 +128,12 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future> getChildEntities( - ThermionEntity parent, bool renderableOnly) { - // TODO: implement getChildEntities - throw UnimplementedError(); - } - - @override - Future getChildEntity( - ThermionEntity parent, String childName) { - // TODO: implement getChildEntity - throw UnimplementedError(); - } - - @override - Future> getChildEntityNames(ThermionEntity entity, - {bool renderableOnly = true}) { - // TODO: implement getChildEntityNames - throw UnimplementedError(); - } - - @override - Future getInstanceCount(ThermionEntity entity) { - // TODO: implement getInstanceCount - throw UnimplementedError(); - } - - @override - Future> getInstances(ThermionEntity entity) { - // TODO: implement getInstances - throw UnimplementedError(); - } - - @override - Future getInverseBindMatrix(ThermionEntity parent, int boneIndex, - {int skinIndex = 0}) { - // TODO: implement getInverseBindMatrix - throw UnimplementedError(); - } - @override Future getLocalTransform(ThermionEntity entity) { // TODO: implement getLocalTransform throw UnimplementedError(); } - @override - Future> getMorphTargetNames( - ThermionEntity entity, ThermionEntity childEntity) { - // TODO: implement getMorphTargetNames - throw UnimplementedError(); - } @override String? getNameForEntity(ThermionEntity entity) { @@ -241,11 +153,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future hide(ThermionEntity entity, String? meshName) { - // TODO: implement hide - throw UnimplementedError(); - } @override // TODO: implement initialized @@ -296,27 +203,6 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement pickResult Stream get pickResult => throw UnimplementedError(); - @override - Future playAnimation(ThermionEntity entity, int index, - {bool loop = false, - bool reverse = false, - bool replaceActive = true, - double crossfade = 0.0, - double startOffset=0.0}) { - // TODO: implement playAnimation - throw UnimplementedError(); - } - - @override - Future playAnimationByName(ThermionEntity entity, String name, - {bool loop = false, - bool reverse = false, - bool replaceActive = true, - double crossfade = 0.0}) { - // TODO: implement playAnimationByName - throw UnimplementedError(); - } - @override Future queuePositionUpdate( ThermionEntity entity, double x, double y, double z, @@ -352,12 +238,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future removeEntity(ThermionEntity entity) { - // TODO: implement removeEntity - throw UnimplementedError(); - } - @override Future removeIbl() { // TODO: implement removeIbl @@ -381,17 +261,6 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement rendering bool get rendering => throw UnimplementedError(); - @override - Future resetBones(ThermionEntity entity) { - // TODO: implement resetBones - throw UnimplementedError(); - } - - @override - Future reveal(ThermionEntity entity, String? meshName) { - // TODO: implement reveal - throw UnimplementedError(); - } @override Future rotateEnd() { @@ -417,12 +286,7 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future setAnimationFrame( - ThermionEntity entity, int index, int animationFrame) { - // TODO: implement setAnimationFrame - throw UnimplementedError(); - } + @override Future setAntiAliasing(bool msaa, bool fxaa, bool taa) { @@ -546,24 +410,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future clearMorphAnimationData(ThermionEntity entity) { - throw UnimplementedError(); - } - - @override - Future setMorphAnimationData( - ThermionEntity entity, MorphAnimationData animation, - {List? targetMeshNames}) { - // TODO: implement setMorphAnimationData - throw UnimplementedError(); - } - - @override - Future setMorphTargetWeights(ThermionEntity entity, List weights) { - // TODO: implement setMorphTargetWeights - throw UnimplementedError(); - } @override Future setParent(ThermionEntity child, ThermionEntity parent, { bool preserveScaling = false}) { @@ -644,17 +490,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future stopAnimation(ThermionEntity entity, int animationIndex) { - // TODO: implement stopAnimation - throw UnimplementedError(); - } - - @override - Future stopAnimationByName(ThermionEntity entity, String name) { - // TODO: implement stopAnimationByName - throw UnimplementedError(); - } @override Future testCollisions(ThermionEntity entity) { @@ -811,18 +646,7 @@ class ThermionViewerStub extends ThermionViewer { 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(); - } @override Future setMaterialPropertyFloat(ThermionEntity entity, String propertyName, int materialIndex, double value) { @@ -836,9 +660,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - // TODO: implement sceneUpdated - Stream get sceneUpdated => throw UnimplementedError(); @override Future addDirectLight(DirectLight light) { @@ -882,14 +703,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future createGeometry(Geometry geometry, {MaterialInstance? materialInstance, bool keepData = false}) { - // TODO: implement createGeometry - throw UnimplementedError(); - } - - - @override Future setMaterialPropertyInt(ThermionEntity entity, String propertyName, int materialIndex, int value) { // TODO: implement setMaterialPropertyInt @@ -1052,12 +865,6 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } - @override - Future loadGlbFromBuffer(Uint8List data, {int numInstances = 1, bool keepData = false, int priority = 4, int layer = 0, bool loadResourcesAsync= false}) { - // TODO: implement loadGlbFromBuffer - throw UnimplementedError(); - } - @override Future destroyRenderTarget(covariant RenderTarget renderTarget) { // TODO: implement destroyRenderTarget @@ -1081,6 +888,189 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement getRenderableBoundingBox throw UnimplementedError(); } + + @override + Future pick(int x, int y) { + // TODO: implement pick + throw UnimplementedError(); + } + + + @override + Future createInstance(covariant ThermionAsset asset, {covariant List? materialInstances = null}) { + // TODO: implement createInstance + throw UnimplementedError(); + } + + @override + Future getInstanceCount(covariant ThermionAsset entity) { + // TODO: implement getInstanceCount + throw UnimplementedError(); + } + + @override + Future> getInstances(covariant ThermionAsset entity) { + // TODO: implement getInstances + throw UnimplementedError(); + } + + @override + Future hide(ThermionEntity entity) { + // TODO: implement hide + 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(); + } + + @override + Future reveal(ThermionEntity entity) { + // TODO: implement reveal + throw UnimplementedError(); + } + + @override + Future loadGlbFromBuffer(Uint8List data, {int numInstances = 1, bool keepData = false, int priority = 4, int layer = 0, bool loadResourcesAsync=false}) { + // TODO: implement loadGlbFromBuffer + throw UnimplementedError(); + } + + @override + Future addBoneAnimation(ThermionAsset asset, BoneAnimationData animation, {int skinIndex = 0, double fadeInInSecs = 0.0, double fadeOutInSecs = 0.0, double maxDelta = 1.0}) { + // TODO: implement addBoneAnimation + throw UnimplementedError(); + } + + @override + Future getAnimationDuration(covariant ThermionAsset asset, int animationIndex) { + // TODO: implement getAnimationDuration + throw UnimplementedError(); + } + + @override + Future> getAnimationNames(covariant ThermionAsset asset) { + // TODO: implement getAnimationNames + throw UnimplementedError(); + } + + @override + Future getBone(covariant ThermionAsset asset, int boneIndex, {int skinIndex = 0}) { + // TODO: implement getBone + throw UnimplementedError(); + } + + @override + Future> getBoneNames(covariant ThermionAsset asset, {int skinIndex = 0}) { + // TODO: implement getBoneNames + throw UnimplementedError(); + } + + @override + Future> getChildEntities(covariant ThermionAsset asset) { + // TODO: implement getChildEntities + throw UnimplementedError(); + } + + @override + Future getChildEntity(covariant ThermionAsset asset, String childName) { + // TODO: implement getChildEntity + throw UnimplementedError(); + } + + @override + Future getInverseBindMatrix(covariant ThermionAsset asset, int boneIndex, {int skinIndex = 0}) { + // TODO: implement getInverseBindMatrix + throw UnimplementedError(); + } + + @override + Future> getMorphTargetNames(covariant ThermionAsset asset, ThermionEntity childEntity) { + // TODO: implement getMorphTargetNames + throw UnimplementedError(); + } + + @override + Future playAnimationByName(covariant ThermionAsset asset, String name, {bool loop = false, bool reverse = false, bool replaceActive = true, double crossfade = 0.0}) { + // TODO: implement playAnimationByName + throw UnimplementedError(); + } + + @override + Future setAnimationFrame(covariant ThermionAsset asset, int index, int animationFrame) { + // TODO: implement setAnimationFrame + throw UnimplementedError(); + } + + @override + Future setMorphAnimationData(ThermionAsset asset, MorphAnimationData animation, {List? targetMeshNames}) { + // TODO: implement setMorphAnimationData + throw UnimplementedError(); + } + + + @override + Future stopAnimation(covariant ThermionAsset asset, int animationIndex) { + // TODO: implement stopAnimation + throw UnimplementedError(); + } + + @override + Future stopAnimationByName(covariant ThermionAsset asset, String name) { + // TODO: implement stopAnimationByName + throw UnimplementedError(); + } + + @override + Future playAnimation(ThermionAsset asset, int index, {bool loop = false, bool reverse = false, bool replaceActive = true, double crossfade = 0.0, double startOffset = 0.0}) { + // TODO: implement playAnimation + throw UnimplementedError(); + } + + @override + Future removeEntity(ThermionAsset asset) { + // TODO: implement removeEntity + throw UnimplementedError(); + } + + @override + Future resetBones(ThermionAsset asset) { + // TODO: implement resetBones + throw UnimplementedError(); + } + + @override + Future clearMorphAnimationData(ThermionEntity entity) { + // TODO: implement clearMorphAnimationData + throw UnimplementedError(); + } + + @override + Future createGeometry(Geometry geometry, {covariant List? materialInstances, bool keepData = false}) { + // TODO: implement createGeometry + throw UnimplementedError(); + } + + @override + Future setGltfAnimationFrame(covariant ThermionAsset asset, int index, int animationFrame) { + // TODO: implement setGltfAnimationFrame + throw UnimplementedError(); + } + + @override + Future setMorphTargetWeights(ThermionEntity entity, List weights) { + // TODO: implement setMorphTargetWeights + throw UnimplementedError(); + } } diff --git a/thermion_dart/lib/src/viewer/src/web_wasm/src/material_instance.dart b/thermion_dart/lib/src/viewer/src/web_wasm/src/material_instance.dart index 754dad05..af6ac402 100644 --- a/thermion_dart/lib/src/viewer/src/web_wasm/src/material_instance.dart +++ b/thermion_dart/lib/src/viewer/src/web_wasm/src/material_instance.dart @@ -4,17 +4,6 @@ class ThermionWasmMaterialInstance extends MaterialInstance { final int pointer; ThermionWasmMaterialInstance(this.pointer); - @override - Future setDepthCullingEnabled(bool enabled) { - // TODO: implement setDepthCullingEnabled - throw UnimplementedError(); - } - - @override - Future setDepthWriteEnabled(bool enabled) { - // TODO: implement setDepthWriteEnabled - throw UnimplementedError(); - } @override Future setParameterFloat2(String name, double x, double y) { @@ -45,4 +34,64 @@ class ThermionWasmMaterialInstance extends MaterialInstance { // TODO: implement setParameterInt throw UnimplementedError(); } + + @override + Future setDepthCullingEnabled(enabled) { + // TODO: implement setDepthCullingEnabled + throw UnimplementedError(); + } + + @override + Future setDepthWriteEnabled(enabled) { + // TODO: implement setDepthWriteEnabled + throw UnimplementedError(); + } + + @override + Future setStencilCompareFunction(SamplerCompareFunction func, [StencilFace face = StencilFace.FRONT_AND_BACK]) { + // TODO: implement setStencilCompareFunction + throw UnimplementedError(); + } + + @override + Future setStencilOpDepthFail(StencilOperation op, [StencilFace face = StencilFace.FRONT_AND_BACK]) { + // TODO: implement setStencilOpDepthFail + throw UnimplementedError(); + } + + @override + Future setStencilOpDepthStencilPass(StencilOperation op, [StencilFace face = StencilFace.FRONT_AND_BACK]) { + // TODO: implement setStencilOpDepthStencilPass + throw UnimplementedError(); + } + + @override + Future setStencilOpStencilFail(StencilOperation op, [StencilFace face = StencilFace.FRONT_AND_BACK]) { + // TODO: implement setStencilOpStencilFail + throw UnimplementedError(); + } + + @override + Future setStencilReferenceValue(int value, [StencilFace face = StencilFace.FRONT_AND_BACK]) { + // TODO: implement setStencilReferenceValue + throw UnimplementedError(); + } + + @override + Future isStencilWriteEnabled() { + // TODO: implement isStencilWriteEnabled + throw UnimplementedError(); + } + + @override + Future setCullingMode(CullingMode cullingMode) { + // TODO: implement setCullingMode + throw UnimplementedError(); + } + + @override + Future setStencilWriteEnabled(bool enabled) { + // TODO: implement setStencilWriteEnabled + throw UnimplementedError(); + } } diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index 6ac49c0e..1812166b 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -33,7 +33,7 @@ #include #include "ResourceBuffer.hpp" -#include "SceneManager.hpp" +#include "scene/SceneManager.hpp" #include "ThreadPool.hpp" namespace thermion @@ -65,9 +65,6 @@ namespace thermion void rotateIbl(const math::mat3f &matrix); void createIbl(float r, float g, float b, float intensity); - void removeEntity(EntityId asset); - void clearEntities(); - void render( uint64_t frameTimeInNanos ); @@ -98,15 +95,6 @@ namespace thermion void clearBackgroundImage(); void setBackgroundImagePosition(float x, float y, bool clamp, uint32_t width, uint32_t height); - typedef void (*PickCallback)(EntityId entityId, int x, int y, View *view, float depth, float fragX, float fragY, float fragZ); - - /// - /// Returns true if the specified entity is a gizmo, grid or background image entity. - /// - bool isNonPickableEntity(EntityId entityId); - - void pick(View *view, uint32_t x, uint32_t y, PickCallback callback); - Engine* getEngine() { return _engine; } diff --git a/thermion_dart/native/include/Gizmo.hpp b/thermion_dart/native/include/Gizmo.hpp deleted file mode 100644 index 849503a2..00000000 --- a/thermion_dart/native/include/Gizmo.hpp +++ /dev/null @@ -1,111 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include "ThermionDartApi.h" - -namespace thermion { - -using namespace filament; -using namespace utils; - -class Gizmo { - - enum Axis { X, Y, Z}; - - public: - Gizmo(Engine *engine, View *view, Scene *scene, Material* material); - ~Gizmo(); - - typedef void (*PickCallback)(EntityId entityId, uint32_t x, uint32_t y, View *view); - - Entity x() { - return _entities[0]; - }; - Entity y() { - return _entities[1]; - }; - Entity z() { - return _entities[2]; - }; - Entity center() { - return _entities[3]; - }; - - bool isActive() { - return _isActive; - } - - void pick(uint32_t x, uint32_t y, PickCallback callback); - bool isGizmoEntity(Entity entity); - void setVisibility(bool visible); - - private: - - class PickCallbackHandler { - public: - PickCallbackHandler(Gizmo* gizmo, PickCallback callback) : _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 = 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, _gizmo->_view); - return; - } - } - _gizmo->unhighlight(); - _callback(0, x, y, _gizmo->_view); - delete(this); - } - - private: - Gizmo* _gizmo; - PickCallback _callback; - - }; - void createTransparentRectangles(); - void highlight(Entity entity); - void unhighlight(); - Engine *_engine; - Scene *_scene; - View *_view; - Material* _material; - - utils::Entity _entities[7] = { utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity(), utils::Entity() }; - - MaterialInstance* _materialInstances[7]; - math::float4 inactiveColors[3] { - 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 }, - 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 diff --git a/thermion_dart/native/include/ThermionDartAPIUtils.h b/thermion_dart/native/include/MathUtils.hpp similarity index 96% rename from thermion_dart/native/include/ThermionDartAPIUtils.h rename to thermion_dart/native/include/MathUtils.hpp index 9e8e7858..52c49d7f 100644 --- a/thermion_dart/native/include/ThermionDartAPIUtils.h +++ b/thermion_dart/native/include/MathUtils.hpp @@ -1,6 +1,6 @@ #pragma once #include -#include "APIBoundaryTypes.h" +#include "c_api/APIBoundaryTypes.h" namespace thermion { diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp deleted file mode 100644 index 55306160..00000000 --- a/thermion_dart/native/include/SceneManager.hpp +++ /dev/null @@ -1,365 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include "tsl/robin_map.h" - - -#include "APIBoundaryTypes.h" -#include "CustomGeometry.hpp" -#include "Gizmo.hpp" -#include "GridOverlay.hpp" -#include "ResourceBuffer.hpp" -#include "components/CollisionComponentManager.hpp" -#include "components/AnimationComponentManager.hpp" - - -namespace thermion -{ - typedef int32_t EntityId; - - using namespace filament; - using namespace filament::gltfio; - using namespace utils; - using std::string; - using std::unique_ptr; - using std::vector; - - class SceneManager - { - public: - SceneManager( - const ResourceLoaderWrapperImpl *const loader, - Engine *engine, - Scene *scene, - const char *uberArchivePath, - Camera* mainCamera); - ~SceneManager(); - - enum LAYERS { - DEFAULT_ASSETS = 0, - BACKGROUND = 6, - OVERLAY = 7, - }; - - 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 = nullptr; - bool _isGeometryEntity = false; - bool _isGltfAsset = false; - FilamentInstance* _newInstance = nullptr; - 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); - - //// - /// @brief Load the GLB from the specified path, optionally creating multiple instances. - /// @param uri the path to the asset. Should be either asset:// (representing a Flutter asset), or file:// (representing a filesystem file). - /// @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, bool keepData); - EntityId loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances = 1, bool keepData = false, int priority = 4, int layer = 0, bool loadResourcesAsync = false); - EntityId createInstance(EntityId entityId); - - void remove(EntityId entity); - void destroyAll(); - unique_ptr> getAnimationNames(EntityId entity); - float getAnimationDuration(EntityId entity, int animationIndex); - - unique_ptr> getMorphTargetNames(EntityId assetEntityId, EntityId childEntity); - unique_ptr> getBoneNames(EntityId assetEntityId, EntityId childEntity); - void transformToUnitCube(EntityId e); - inline void updateTransform(EntityId e); - void setScale(EntityId e, float scale); - void setPosition(EntityId e, float x, float y, float z); - void setRotation(EntityId e, float rads, float x, float y, float z, float w); - - void queueTransformUpdates(EntityId* entities, math::mat4* transforms, int numEntities); - void queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z); - void queueRelativePositionUpdateFromViewportVector(View* view, EntityId entityId, float viewportCoordX, float viewportCoordY); - - const utils::Entity *getCameraEntities(EntityId e); - size_t getCameraEntityCount(EntityId e); - const utils::Entity *getLightEntities(EntityId e) noexcept; - size_t getLightEntityCount(EntityId e) noexcept; - - void updateAnimations(); - void updateTransforms(); - void testCollisions(EntityId entity); - bool setMaterialColor(EntityId e, const char *meshName, int materialInstance, const float r, const float g, const float b, const float a); - - bool setMorphAnimationBuffer( - EntityId entityId, - const float *const morphData, - const uint32_t *const morphIndices, - int numMorphTargets, - int numFrames, - float frameLengthInMs); - - void clearMorphAnimationBuffer( - EntityId entityId); - - bool setMorphTargetWeights(EntityId entityId, const float *const weights, int count); - - math::mat4f getLocalTransform(EntityId entityId); - math::mat4f getWorldTransform(EntityId entityId); - EntityId getBone(EntityId entityId, int skinIndex, int boneIndex); - math::mat4f getInverseBindMatrix(EntityId entityId, int skinIndex, int boneIndex); - - /// @brief Set the local transform for the bone at boneIndex/skinIndex in the given entity. - /// @param entityId the parent entity - /// @param entityName the name of the mesh under entityId for which the bone will be set. - /// @param skinIndex the index of the joint skin. Currently only 0 is supported. - /// @param boneName the name of the bone - /// @param transform the 4x4 matrix representing the local transform for the bone - /// @return true if the transform was successfully set, false otherwise - bool setBoneTransform(EntityId entityId, int skinIndex, int boneIndex, math::mat4f transform); - - /// @brief Immediately start animating the bone at [boneIndex] under the parent instance [entity] at skin [skinIndex]. - /// @param entity the mesh entity to animate - /// @param frameData frame data as quaternions - /// @param numFrames the number of frames - /// @param boneName the name of the bone to animate - /// @param frameLengthInMs the length of each frame in ms - /// @return true if the bone animation was successfully enqueued - bool addBoneAnimation( - EntityId parent, - int skinIndex, - int boneIndex, - const float *const frameData, - int numFrames, - float frameLengthInMs, - float fadeOutInSecs, - float fadeInInSecs, - float maxDelta - ); - - std::unique_ptr> getBoneRestTranforms(EntityId entityId, int skinIndex); - void resetBones(EntityId entityId); - - bool setTransform(EntityId entityId, math::mat4f transform); - bool setTransform(EntityId entityId, math::mat4 transform); - - bool updateBoneMatrices(EntityId entityId); - 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); - - 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); - const char *getNameForEntity(EntityId entityId); - utils::Entity findChildEntityByName( - EntityId entityId, - const char *entityName); - int getEntityCount(EntityId entity, bool renderableOnly); - void getEntities(EntityId entity, bool renderableOnly, EntityId *out); - const char *getEntityNameAt(EntityId entity, int index, bool renderableOnly); - 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); - - /// @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 - /// @return the number of instances - int getInstanceCount(EntityId entityId); - - /// @brief returns an array containing all instances of the FilamentAsset represented by the given entity. - /// @param entityId - void getInstances(EntityId entityId, EntityId *out); - - /// - /// Sets the draw priority for the given entity. See RenderableManager.h for more details. - /// - void setPriority(EntityId entity, int priority); - - /// @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 getScreenSpaceBoundingBox(View* view, EntityId entity); - - /// @brief returns the 3D bounding box of the renderable instance for the given entity. - /// @return the bounding box - /// - Aabb3 getRenderableBoundingBox(EntityId entity); - - /// - /// 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, - float *normals, - uint32_t numNormals, - float *uvs, - uint32_t numUvs, - uint16_t *indices, - uint32_t numIndices, - filament::RenderableManager::PrimitiveType primitiveType = RenderableManager::PrimitiveType::TRIANGLES, - MaterialInstance* materialInstance = nullptr, - bool keepData = false - ); - - friend class FilamentViewer; - - gltfio::MaterialProvider * const unlitMaterialProvider() { - return _unlitMaterialProvider; - } - - bool isGeometryInstance(EntityId entity) { - return std::find(_geometryInstances.begin(), _geometryInstances.end(), entity) != _geometryInstances.end(); - } - - bool isGeometryEntity(EntityId entity) { - return _geometry.find(entity) != _geometry.end(); - } - - CustomGeometry* const getGeometry(EntityId entityId) { - return _geometry[entityId].get(); - } - - 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); - } - - 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); - - MaterialInstance* createUbershaderMaterialInstance(MaterialKey key); - void destroy(MaterialInstance* materialInstance); - - gltfio::MaterialProvider* getUbershaderProvider() { - return _ubershaderProvider; - } - - MaterialInstance* createUnlitFixedSizeMaterialInstance(); - - MaterialInstance* createUnlitMaterialInstance(); - - void setVisibilityLayer(EntityId entityId, int layer); - - Camera* createCamera(); - - void destroyCamera(Camera* camera); - - size_t getCameraCount(); - - Camera* getCameraAt(size_t index); - - Gizmo *createGizmo(View *view, Scene *scene); - - bool isGizmoEntity(utils::Entity entity); - - Scene* getScene() { - return _scene; - } - - private: - gltfio::AssetLoader *_assetLoader = nullptr; - const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; - Engine *_engine = nullptr; - Scene *_scene = nullptr; - Camera* _mainCamera; - - gltfio::MaterialProvider *_ubershaderProvider = nullptr; - gltfio::MaterialProvider *_unlitMaterialProvider = nullptr; - gltfio::ResourceLoader *_gltfResourceLoader = nullptr; - gltfio::TextureProvider *_stbDecoder = nullptr; - gltfio::TextureProvider *_ktxDecoder = nullptr; - std::mutex _mutex; - std::mutex _stencilMutex; - std::vector _materialInstances; - - Material* _gizmoMaterial = nullptr; - - utils::NameComponentManager *_ncm; - - tsl::robin_map< - EntityId, - gltfio::FilamentInstance *> - _instances; - tsl::robin_map _assets; - tsl::robin_map> _geometry; - std::vector _geometryInstances; - tsl::robin_map> _highlighted; - tsl::robin_map _transformUpdates; - std::set _textures; - std::vector _cameras; - - AnimationComponentManager *_animationComponentManager = nullptr; - CollisionComponentManager *_collisionComponentManager = nullptr; - - utils::Entity findEntityByName( - const gltfio::FilamentInstance *instance, - const char *entityName); - - GridOverlay* _gridOverlay = nullptr; - - - }; -} diff --git a/thermion_dart/native/include/TGizmo.h b/thermion_dart/native/include/TGizmo.h deleted file mode 100644 index 7180eff4..00000000 --- a/thermion_dart/native/include/TGizmo.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "ThermionDartApi.h" -#include "TGizmo.h" - -typedef void (*GizmoPickCallback)(EntityId entityId, uint32_t x, uint32_t y, TView* view); - -EMSCRIPTEN_KEEPALIVE void Gizmo_pick(TGizmo *tGizmo, uint32_t x, uint32_t y, GizmoPickCallback callback); -EMSCRIPTEN_KEEPALIVE void Gizmo_setVisibility(TGizmo *tGizmo, bool visible); - -#ifdef __cplusplus -} -#endif diff --git a/thermion_dart/native/include/TMaterialInstance.h b/thermion_dart/native/include/TMaterialInstance.h deleted file mode 100644 index dae73f24..00000000 --- a/thermion_dart/native/include/TMaterialInstance.h +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once - -#ifdef _WIN32 -#ifdef IS_DLL -#define EMSCRIPTEN_KEEPALIVE __declspec(dllimport) -#else -#define EMSCRIPTEN_KEEPALIVE __declspec(dllexport) -#endif -#else -#ifndef EMSCRIPTEN_KEEPALIVE -#define EMSCRIPTEN_KEEPALIVE __attribute__((visibility("default"))) -#endif -#endif - -// we copy the LLVM here rather than including, -// because on Windows it's difficult to pin the exact location which confuses dart ffigen - -#ifndef __STDBOOL_H -#define __STDBOOL_H - -#define __bool_true_false_are_defined 1 - -#if defined(__STDC_VERSION__) && __STDC_VERSION__ > 201710L -/* FIXME: We should be issuing a deprecation warning here, but cannot yet due - * to system headers which include this header file unconditionally. - */ -#elif !defined(__cplusplus) -#define bool _Bool -#define true 1 -#define false 0 -#elif defined(__GNUC__) && !defined(__STRICT_ANSI__) -/* Define _Bool as a GNU extension. */ -#define _Bool bool -#if defined(__cplusplus) && __cplusplus < 201103L -/* For C++98, define bool, false, true as a GNU extension. */ -#define bool bool -#define false false -#define true true -#endif -#endif - -#endif /* __STDBOOL_H */ - -#if defined(__APPLE__) || defined(__EMSCRIPTEN__) -#include -#endif - -typedef struct TMaterialInstance TMaterialInstance; - -// copied from SamplerCompareFunc in DriverEnums.h -enum TDepthFunc { - // don't change the enums values - LE = 0, //!< Less or equal - GE, //!< Greater or equal - L, //!< Strictly less than - G, //!< Strictly greater than - E, //!< Equal - NE, //!< Not equal - A, //!< Always. Depth / stencil testing is deactivated. - N //!< Never. The depth / stencil test always fails. -}; - - -#ifdef __cplusplus -extern "C" -{ -#endif - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance* materialInstance, bool enabled); - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance* materialInstance, bool enabled); - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat4(TMaterialInstance* materialInstance, const char* name, double x, double y, double w, double z); - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat2(TMaterialInstance* materialInstance, const char* name, double x, double y); - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat(TMaterialInstance* materialInstance, const char* name, double value); - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance* materialInstance, const char* name, int value); - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthFunc(TMaterialInstance* materialInstance, TDepthFunc depthFunc); - #ifdef __cplusplus -} -#endif - diff --git a/thermion_dart/native/include/TSceneManager.h b/thermion_dart/native/include/TSceneManager.h deleted file mode 100644 index 923b04dd..00000000 --- a/thermion_dart/native/include/TSceneManager.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include "APIBoundaryTypes.h" -#include "ResourceBuffer.hpp" -#include "ThermionDartAPIUtils.h" -#include "TCamera.h" -#include "TMaterialInstance.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - EMSCRIPTEN_KEEPALIVE TGizmo* SceneManager_createGizmo(TSceneManager *tSceneManager, TView *tView, TScene *tScene); - EMSCRIPTEN_KEEPALIVE EntityId SceneManager_createGeometry( - TSceneManager *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 TMaterialInstance *SceneManager_createUnlitMaterialInstance(TSceneManager *sceneManager); - EMSCRIPTEN_KEEPALIVE TMaterialInstance *SceneManager_createUnlitFixedSizeMaterialInstance(TSceneManager *sceneManager); - EMSCRIPTEN_KEEPALIVE bool SceneManager_setTransform(TSceneManager *sceneManager, EntityId entityId, const double *const transform); - EMSCRIPTEN_KEEPALIVE void SceneManager_queueTransformUpdates(TSceneManager *sceneManager, EntityId* entities, const double* const transforms, int numEntities); - EMSCRIPTEN_KEEPALIVE TCamera* SceneManager_findCameraByName(TSceneManager* tSceneManager, EntityId entity, const char* name); - EMSCRIPTEN_KEEPALIVE void SceneManager_setVisibilityLayer(TSceneManager *tSceneManager, EntityId entity, int layer); - EMSCRIPTEN_KEEPALIVE TScene* SceneManager_getScene(TSceneManager *tSceneManager); - EMSCRIPTEN_KEEPALIVE EntityId SceneManager_loadGlbFromBuffer(TSceneManager *sceneManager, const uint8_t *const, size_t length, bool keepData, int priority, int layer, bool loadResourcesAsync); - EMSCRIPTEN_KEEPALIVE bool SceneManager_setMorphAnimation( - TSceneManager *sceneManager, - EntityId entity, - const float *const morphData, - const uint32_t *const morphIndices, - int numMorphTargets, - int numFrames, - float frameLengthInMs); - - EMSCRIPTEN_KEEPALIVE TCamera* SceneManager_createCamera(TSceneManager *sceneManager); - EMSCRIPTEN_KEEPALIVE void SceneManager_destroyCamera(TSceneManager *sceneManager, TCamera* camera); - EMSCRIPTEN_KEEPALIVE size_t SceneManager_getCameraCount(TSceneManager *sceneManager); - EMSCRIPTEN_KEEPALIVE TCamera* SceneManager_getCameraAt(TSceneManager *sceneManager, size_t index); - EMSCRIPTEN_KEEPALIVE void SceneManager_destroyMaterialInstance(TSceneManager *sceneManager, TMaterialInstance *instance); - -#ifdef __cplusplus -} -#endif - diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h deleted file mode 100644 index f7a74336..00000000 --- a/thermion_dart/native/include/ThermionDartApi.h +++ /dev/null @@ -1,216 +0,0 @@ -#ifndef _FLUTTER_FILAMENT_API_H -#define _FLUTTER_FILAMENT_API_H - -#include "APIExport.h" -#include "APIBoundaryTypes.h" -#include "ResourceBuffer.hpp" -#include "ThermionDartAPIUtils.h" -#include "TMaterialInstance.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - EMSCRIPTEN_KEEPALIVE TViewer *Viewer_create(const void *const context, const void *const loader, void *const platform, const char *uberArchivePath); - EMSCRIPTEN_KEEPALIVE void Viewer_destroy(TViewer *viewer); - EMSCRIPTEN_KEEPALIVE TSceneManager *Viewer_getSceneManager(TViewer *viewer); - EMSCRIPTEN_KEEPALIVE TRenderTarget* Viewer_createRenderTarget(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height); - EMSCRIPTEN_KEEPALIVE void Viewer_destroyRenderTarget(TViewer *viewer, TRenderTarget* tRenderTarget); - EMSCRIPTEN_KEEPALIVE TSwapChain *Viewer_createSwapChain(TViewer *viewer, const void *const window); - EMSCRIPTEN_KEEPALIVE TSwapChain *Viewer_createHeadlessSwapChain(TViewer *viewer, uint32_t width, uint32_t height); - EMSCRIPTEN_KEEPALIVE void Viewer_destroySwapChain(TViewer *viewer, TSwapChain* swapChain); - EMSCRIPTEN_KEEPALIVE void Viewer_render( - TViewer *viewer); - EMSCRIPTEN_KEEPALIVE void Viewer_capture( - TViewer *viewer, - TView *view, - TSwapChain *swapChain, - uint8_t *pixelBuffer, - void (*callback)(void)); - EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTarget( - TViewer *viewer, - TView *view, - TSwapChain *swapChain, - TRenderTarget *renderTarget, - uint8_t *pixelBuffer, - void (*callback)(void)); - EMSCRIPTEN_KEEPALIVE TView* Viewer_createView(TViewer *viewer); - EMSCRIPTEN_KEEPALIVE TView* Viewer_getViewAt(TViewer *viewer, int index); - EMSCRIPTEN_KEEPALIVE void Viewer_setMainCamera(TViewer *tViewer, TView *tView); - EMSCRIPTEN_KEEPALIVE TSwapChain* Viewer_getSwapChainAt(TViewer *tViewer, int index); - EMSCRIPTEN_KEEPALIVE void Viewer_setViewRenderable(TViewer *viewer, TSwapChain *swapChain, TView* view, bool renderable); - EMSCRIPTEN_KEEPALIVE void Viewer_pick(TViewer *viewer, TView* tView, int x, int y, void (*callback)(EntityId entityId, int x, int y, TView *tView, float depth, float fragX, float fragY, float fragZ)); - EMSCRIPTEN_KEEPALIVE bool Viewer_isNonPickableEntity(TViewer *viewer, EntityId entityId); - - // Engine - EMSCRIPTEN_KEEPALIVE TEngine *Viewer_getEngine(TViewer* viewer); - EMSCRIPTEN_KEEPALIVE TCamera *Engine_getCameraComponent(TEngine* tEngine, EntityId entityId); - EMSCRIPTEN_KEEPALIVE void Engine_setTransform(TEngine* tEngine, EntityId entity, double4x4 transform); - - 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 load_skybox(TViewer *viewer, const char *skyboxPath); - EMSCRIPTEN_KEEPALIVE void Viewer_loadIbl(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( - TViewer *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); - 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(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData); - EMSCRIPTEN_KEEPALIVE EntityId load_gltf(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData); - EMSCRIPTEN_KEEPALIVE EntityId create_instance(TSceneManager *sceneManager, EntityId id); - EMSCRIPTEN_KEEPALIVE int get_instance_count(TSceneManager *sceneManager, EntityId entityId); - EMSCRIPTEN_KEEPALIVE void get_instances(TSceneManager *sceneManager, EntityId entityId, EntityId *out); - - EMSCRIPTEN_KEEPALIVE EntityId get_main_camera(TViewer *viewer); - - EMSCRIPTEN_KEEPALIVE void set_frame_interval(TViewer *viewer, float interval); - - EMSCRIPTEN_KEEPALIVE void apply_weights( - TSceneManager *sceneManager, - EntityId entity, - const char *const entityName, - float *const weights, - int count); - EMSCRIPTEN_KEEPALIVE bool set_morph_target_weights( - TSceneManager *sceneManager, - EntityId entity, - const float *const morphData, - int numWeights); - - EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_material_instance(TSceneManager *sceneManager, TMaterialKey materialConfig); - - EMSCRIPTEN_KEEPALIVE void clear_morph_animation( - TSceneManager *sceneManager, - EntityId entity); - - EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose( - TSceneManager *sceneManager, - EntityId asset); - EMSCRIPTEN_KEEPALIVE void add_bone_animation( - TSceneManager *sceneManager, - EntityId entity, - int skinIndex, - int boneIndex, - const float *const frameData, - int numFrames, - float frameLengthInMs, - float fadeOutInSecs, - float fadeInInSecs, - float maxDelta); - EMSCRIPTEN_KEEPALIVE void get_local_transform(TSceneManager *sceneManager, - EntityId entityId, float *const); - EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(TSceneManager *sceneManager, - EntityId entityId, int skinIndex, float *const out, int numBones); - EMSCRIPTEN_KEEPALIVE void get_world_transform(TSceneManager *sceneManager, - EntityId entityId, float *const); - EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(TSceneManager *sceneManager, - EntityId entityId, int skinIndex, int boneIndex, float *const); - EMSCRIPTEN_KEEPALIVE bool set_bone_transform( - TSceneManager *sceneManager, - EntityId entity, - int skinIndex, - int boneIndex, - const float *const transform); - EMSCRIPTEN_KEEPALIVE void play_animation(TSceneManager *sceneManager, EntityId entity, int index, bool loop, bool reverse, bool replaceActive, float crossfade, float startOffset); - EMSCRIPTEN_KEEPALIVE void set_animation_frame(TSceneManager *sceneManager, EntityId entity, int animationIndex, int animationFrame); - EMSCRIPTEN_KEEPALIVE void stop_animation(TSceneManager *sceneManager, EntityId entity, int index); - EMSCRIPTEN_KEEPALIVE int get_animation_count(TSceneManager *sceneManager, EntityId asset); - EMSCRIPTEN_KEEPALIVE void get_animation_name(TSceneManager *sceneManager, EntityId entity, char *const outPtr, int index); - EMSCRIPTEN_KEEPALIVE float get_animation_duration(TSceneManager *sceneManager, EntityId entity, int index); - EMSCRIPTEN_KEEPALIVE int get_bone_count(TSceneManager *sceneManager, EntityId assetEntity, int skinIndex); - EMSCRIPTEN_KEEPALIVE void get_bone_names(TSceneManager *sceneManager, EntityId assetEntity, const char **outPtr, int skinIndex); - EMSCRIPTEN_KEEPALIVE EntityId get_bone(TSceneManager *sceneManager, - EntityId entityId, - int skinIndex, - int boneIndex); - - - EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(TSceneManager *sceneManager, EntityId entityId); - EMSCRIPTEN_KEEPALIVE void get_morph_target_name(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index); - EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity); - EMSCRIPTEN_KEEPALIVE void remove_entity(TViewer *viewer, EntityId asset); - EMSCRIPTEN_KEEPALIVE void clear_entities(TViewer *viewer); - EMSCRIPTEN_KEEPALIVE bool set_material_color(TSceneManager *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(TSceneManager *sceneManager, EntityId asset); - - EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(TSceneManager *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z); - EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(TSceneManager *sceneManager, TView *view, EntityId entity, float viewportX, float viewportY); - - EMSCRIPTEN_KEEPALIVE void set_position(TSceneManager *sceneManager, EntityId entity, float x, float y, float z); - EMSCRIPTEN_KEEPALIVE void set_rotation(TSceneManager *sceneManager, EntityId entity, float rads, float x, float y, float z, float w); - EMSCRIPTEN_KEEPALIVE void set_scale(TSceneManager *sceneManager, EntityId entity, float scale); - - EMSCRIPTEN_KEEPALIVE TCamera *Engine_getCameraComponent(TEngine *engine, EntityId entity); - EMSCRIPTEN_KEEPALIVE TEntityManager *Engine_getEntityManager(TEngine *engine); - - EMSCRIPTEN_KEEPALIVE int hide_mesh(TSceneManager *sceneManager, EntityId entity, const char *meshName); - EMSCRIPTEN_KEEPALIVE int reveal_mesh(TSceneManager *sceneManager, EntityId entity, const char *meshName); - - - EMSCRIPTEN_KEEPALIVE const char *get_name_for_entity(TSceneManager *sceneManager, const EntityId entityId); - EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(TSceneManager *sceneManager, const EntityId parent, const char *name); - EMSCRIPTEN_KEEPALIVE int get_entity_count(TSceneManager *sceneManager, const EntityId target, bool renderableOnly); - EMSCRIPTEN_KEEPALIVE void get_entities(TSceneManager *sceneManager, const EntityId target, bool renderableOnly, EntityId *out); - EMSCRIPTEN_KEEPALIVE const char *get_entity_name_at(TSceneManager *sceneManager, const EntityId target, int index, bool renderableOnly); - - EMSCRIPTEN_KEEPALIVE void ios_dummy(); - EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr); - EMSCRIPTEN_KEEPALIVE void add_collision_component(TSceneManager *sceneManager, EntityId entityId, void (*callback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform); - EMSCRIPTEN_KEEPALIVE void remove_collision_component(TSceneManager *sceneManager, EntityId entityId); - EMSCRIPTEN_KEEPALIVE bool add_animation_component(TSceneManager *sceneManager, EntityId entityId); - EMSCRIPTEN_KEEPALIVE void remove_animation_component(TSceneManager *sceneManager, EntityId entityId); - - EMSCRIPTEN_KEEPALIVE EntityId get_parent(TSceneManager *sceneManager, EntityId child); - EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(TSceneManager *sceneManager, EntityId child); - EMSCRIPTEN_KEEPALIVE void set_parent(TSceneManager *sceneManager, EntityId child, EntityId parent, bool preserveScaling); - EMSCRIPTEN_KEEPALIVE void test_collisions(TSceneManager *sceneManager, EntityId entity); - EMSCRIPTEN_KEEPALIVE void set_priority(TSceneManager *sceneManager, EntityId entityId, int priority); - - EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(TSceneManager *sceneManager, TView *view, EntityId entity); - EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(TSceneManager *sceneManager, TView *view, EntityId entity, float *minX, float *minY, float *maxX, float *maxY); - - - EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(TSceneManager *sceneManager, EntityId entity, float r, float g, float b); - EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(TSceneManager *sceneManager, EntityId entity); - EMSCRIPTEN_KEEPALIVE void set_material_property_float(TSceneManager *sceneManager, EntityId entity, int materialIndex, const char *property, float value); - EMSCRIPTEN_KEEPALIVE void set_material_property_int(TSceneManager *sceneManager, EntityId entity, int materialIndex, const char *property, int value); - EMSCRIPTEN_KEEPALIVE void set_material_property_float4(TSceneManager *sceneManager, EntityId entity, int materialIndex, const char *property, double4 value); - EMSCRIPTEN_KEEPALIVE void set_material_depth_write(TSceneManager *sceneManager, EntityId entity, int materialIndex, bool enabled); - 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(TSceneManager *sceneManager, uint8_t *data, size_t length); - EMSCRIPTEN_KEEPALIVE void destroy_texture(TSceneManager *sceneManager, void *const texture); - EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(TSceneManager *sceneManager, EntityId entity, void *const texture, const char *parameterName, int materialIndex); - - EMSCRIPTEN_KEEPALIVE TMaterialInstance* get_material_instance_at(TSceneManager *sceneManager, EntityId entity, int materialIndex); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/thermion_dart/native/include/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/ThermionDartRenderThreadApi.h deleted file mode 100644 index 5d4007e5..00000000 --- a/thermion_dart/native/include/ThermionDartRenderThreadApi.h +++ /dev/null @@ -1,116 +0,0 @@ -#ifndef _DART_FILAMENT_FFI_API_H -#define _DART_FILAMENT_FFI_API_H - -#include "ThermionDartApi.h" -#include "TView.h" - -#ifdef __cplusplus -namespace thermion { -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 Viewer_createOnRenderThread( - void *const context, - void *const platform, - const char *uberArchivePath, - const void *const loader, - void (*renderCallback)(void *const renderCallbackOwner), - void *const renderCallbackOwner, - void (*callback)(TViewer *viewer)); - EMSCRIPTEN_KEEPALIVE void Viewer_destroyOnRenderThread(TViewer *viewer); - EMSCRIPTEN_KEEPALIVE void Viewer_createSwapChainRenderThread(TViewer *viewer, void *const surface, void (*onComplete)(TSwapChain*)); - EMSCRIPTEN_KEEPALIVE void Viewer_createHeadlessSwapChainRenderThread(TViewer *viewer, uint32_t width, uint32_t height, void (*onComplete)(TSwapChain*)); - EMSCRIPTEN_KEEPALIVE void Viewer_destroySwapChainRenderThread(TViewer *viewer, TSwapChain* swapChain, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void Viewer_renderRenderThread(TViewer *viewer, TView* view, TSwapChain* swapChain); - EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderThread(TViewer *viewer, TView* view, TSwapChain* swapChain, uint8_t* out, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTargetRenderThread(TViewer *viewer, TView* view, TSwapChain* swapChain, TRenderTarget* renderTarget, uint8_t* out, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void Viewer_requestFrameRenderThread(TViewer *viewer, void(*onComplete)()); - EMSCRIPTEN_KEEPALIVE void Viewer_loadIblRenderThread(TViewer *viewer, const char *iblPath, float intensity, void(*onComplete)()); - EMSCRIPTEN_KEEPALIVE void Viewer_createRenderTargetRenderThread(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height, void(*onComplete)(TRenderTarget*)); - - EMSCRIPTEN_KEEPALIVE void View_setToneMappingRenderThread(TView *tView, TEngine *tEngine, thermion::ToneMapping toneMapping); - EMSCRIPTEN_KEEPALIVE void View_setBloomRenderThread(TView *tView, double bloom); - - FilamentRenderCallback make_render_callback_fn_pointer(FilamentRenderCallback); - EMSCRIPTEN_KEEPALIVE void set_rendering_render_thread(TViewer *viewer, bool rendering, void(*onComplete)()); - - 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 load_skybox_render_thread(TViewer *viewer, const char *skyboxPath, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(TViewer *viewer); - - EMSCRIPTEN_KEEPALIVE void SceneManager_createGeometryRenderThread( - TSceneManager *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 SceneManager_loadGlbFromBufferRenderThread(TSceneManager *sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, int priority, int layer, bool loadResourcesAsync, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void SceneManager_createUnlitMaterialInstanceRenderThread(TSceneManager *sceneManager, void (*callback)(TMaterialInstance*)); - EMSCRIPTEN_KEEPALIVE void SceneManager_createUnlitFixedSizeMaterialInstanceRenderThread(TSceneManager *sceneManager, void (*callback)(TMaterialInstance*)); - EMSCRIPTEN_KEEPALIVE void load_glb_render_thread(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void load_gltf_render_thread(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void create_instance_render_thread(TSceneManager *sceneManager, EntityId entityId, void (*callback)(EntityId)); - 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 apply_weights_render_thread( - TSceneManager *sceneManager, - EntityId asset, - const char *const entityName, - float *const weights, - int count); - EMSCRIPTEN_KEEPALIVE void set_animation_frame_render_thread(TSceneManager *sceneManager, EntityId asset, int animationIndex, int animationFrame); - EMSCRIPTEN_KEEPALIVE void stop_animation_render_thread(TSceneManager *sceneManager, EntityId asset, int index); - EMSCRIPTEN_KEEPALIVE void get_animation_count_render_thread(TSceneManager *sceneManager, EntityId asset, void (*callback)(int)); - EMSCRIPTEN_KEEPALIVE void get_animation_name_render_thread(TSceneManager *sceneManager, EntityId asset, char *const outPtr, int index, void (*callback)()); - EMSCRIPTEN_KEEPALIVE void get_morph_target_name_render_thread(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index, void (*callback)()); - EMSCRIPTEN_KEEPALIVE void get_morph_target_name_count_render_thread(TSceneManager *sceneManager, EntityId asset, EntityId childEntity, void (*callback)(int32_t)); - EMSCRIPTEN_KEEPALIVE void set_morph_target_weights_render_thread(TSceneManager *sceneManager, - EntityId asset, - const float *const morphData, - int numWeights, - void (*callback)(bool)); - - EMSCRIPTEN_KEEPALIVE void update_bone_matrices_render_thread(TSceneManager *sceneManager, - EntityId asset, void(*callback)(bool)); - EMSCRIPTEN_KEEPALIVE void set_bone_transform_render_thread( - TSceneManager *sceneManager, - EntityId asset, - int skinIndex, - int boneIndex, - const float *const transform, - void (*callback)(bool)); - EMSCRIPTEN_KEEPALIVE void set_post_processing_render_thread(TViewer *viewer, bool enabled); - EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_render_thread(TSceneManager *sceneManager, EntityId entityId, 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 -} -} -#endif - -#endif // _DART_FILAMENT_FFI_API_H diff --git a/thermion_dart/native/include/UnprojectTexture.hpp b/thermion_dart/native/include/UnprojectTexture.hpp index 86bcecdf..cc6ce392 100644 --- a/thermion_dart/native/include/UnprojectTexture.hpp +++ b/thermion_dart/native/include/UnprojectTexture.hpp @@ -15,7 +15,7 @@ #include #include -#include "CustomGeometry.hpp" +#include "scene/CustomGeometry.hpp" namespace thermion { diff --git a/thermion_dart/native/include/APIBoundaryTypes.h b/thermion_dart/native/include/c_api/APIBoundaryTypes.h similarity index 83% rename from thermion_dart/native/include/APIBoundaryTypes.h rename to thermion_dart/native/include/c_api/APIBoundaryTypes.h index 27c599a7..85c61307 100644 --- a/thermion_dart/native/include/APIBoundaryTypes.h +++ b/thermion_dart/native/include/c_api/APIBoundaryTypes.h @@ -6,7 +6,6 @@ extern "C" #endif #include -#include "TMaterialInstance.h" typedef int32_t EntityId; typedef struct TCamera TCamera; @@ -19,6 +18,15 @@ extern "C" typedef struct TView TView; typedef struct TGizmo TGizmo; typedef struct TScene TScene; + typedef struct TTransformManager TTransformManager; + typedef struct TAnimationManager TAnimationManager; + typedef struct TCollisionComponentManager TCollisionComponentManager; + typedef struct TSceneAsset TSceneAsset; + typedef struct TNameComponentManager TNameComponentManager; + typedef struct TMaterialInstance TMaterialInstance; + typedef struct TMaterialProvider TMaterialProvider; + typedef struct TRenderableManager TRenderableManager; + typedef struct TRenderableInstance TRenderableInstance; struct TMaterialKey { bool doubleSided; diff --git a/thermion_dart/native/include/APIExport.h b/thermion_dart/native/include/c_api/APIExport.h similarity index 100% rename from thermion_dart/native/include/APIExport.h rename to thermion_dart/native/include/c_api/APIExport.h diff --git a/thermion_dart/native/include/c_api/TAnimationManager.h b/thermion_dart/native/include/c_api/TAnimationManager.h new file mode 100644 index 00000000..c3ff6f79 --- /dev/null +++ b/thermion_dart/native/include/c_api/TAnimationManager.h @@ -0,0 +1,136 @@ +#pragma once + +#include "APIExport.h" +#include "APIBoundaryTypes.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + EMSCRIPTEN_KEEPALIVE void AnimationManager_addAnimationComponent(TAnimationManager *tAnimationManager, EntityId entityId); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_removeAnimationComponent(TAnimationManager *tAnimationManager, EntityId entityId); + + EMSCRIPTEN_KEEPALIVE bool AnimationManager_setMorphAnimation( + TAnimationManager *tAnimationManager, + EntityId entityId, + const float *const morphData, + const uint32_t *const morphIndices, + int numMorphTargets, + int numFrames, + float frameLengthInMs); + + EMSCRIPTEN_KEEPALIVE bool AnimationManager_clearMorphAnimation(TAnimationManager *tAnimationManager, EntityId entityId); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_resetToRestPose(TAnimationManager *tAnimationManager, TSceneAsset *sceneAsset); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_addBoneAnimation( + TAnimationManager *tAnimationManager, + TSceneAsset *tSceneAsset, + int skinIndex, + int boneIndex, + const float *const frameData, + int numFrames, + float frameLengthInMs, + float fadeOutInSecs, + float fadeInInSecs, + float maxDelta); + + EMSCRIPTEN_KEEPALIVE EntityId AnimationManager_getBone( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int skinIndex, + int boneIndex); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_getRestLocalTransforms( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int skinIndex, + float *const out, + int numBones); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_getInverseBindMatrix( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int skinIndex, + int boneIndex, + float *const out); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_playAnimation( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int index, + bool loop, + bool reverse, + bool replaceActive, + float crossfade, + float startOffset); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_stopAnimation( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int index); + + // Additional methods found in implementation + EMSCRIPTEN_KEEPALIVE float AnimationManager_getAnimationDuration( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int animationIndex); + + EMSCRIPTEN_KEEPALIVE int AnimationManager_getAnimationCount( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_getAnimationName( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + char *const outPtr, + int index); + + EMSCRIPTEN_KEEPALIVE int AnimationManager_getBoneCount( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int skinIndex); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_getBoneNames( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + const char **out, + int skinIndex); + + EMSCRIPTEN_KEEPALIVE int AnimationManager_getMorphTargetNameCount( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + EntityId childEntity); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_getMorphTargetName( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + EntityId childEntity, + char *const outPtr, + int index); + + EMSCRIPTEN_KEEPALIVE bool AnimationManager_updateBoneMatrices( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset); + + + EMSCRIPTEN_KEEPALIVE bool AnimationManager_setMorphTargetWeights( + TAnimationManager *tAnimationManager, + EntityId entityId, + const float *const morphData, + int numWeights); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_setGltfAnimationFrame( + TAnimationManager *tAnimationManager, + TSceneAsset *tSceneAsset, + int animationIndex, + int frame + ); + + + +#ifdef __cplusplus +} +#endif diff --git a/thermion_dart/native/include/TCamera.h b/thermion_dart/native/include/c_api/TCamera.h similarity index 100% rename from thermion_dart/native/include/TCamera.h rename to thermion_dart/native/include/c_api/TCamera.h diff --git a/thermion_dart/native/include/c_api/TGizmo.h b/thermion_dart/native/include/c_api/TGizmo.h new file mode 100644 index 00000000..801b46c2 --- /dev/null +++ b/thermion_dart/native/include/c_api/TGizmo.h @@ -0,0 +1,25 @@ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +#include "APIBoundaryTypes.h" +#include "APIExport.h" +#include "TView.h" + +enum TGizmoAxis { X, Y, Z }; +enum TGizmoPickResultType { AxisX, AxisY, AxisZ, Parent, None }; + +typedef void (*GizmoPickCallback)(TGizmoPickResultType resultType, float x, float y, float z); + +EMSCRIPTEN_KEEPALIVE void Gizmo_pick(TGizmo *tGizmo, uint32_t x, uint32_t y, GizmoPickCallback callback); +EMSCRIPTEN_KEEPALIVE void Gizmo_highlight(TGizmo *tGizmo, TGizmoAxis axis); +EMSCRIPTEN_KEEPALIVE void Gizmo_unhighlight(TGizmo *tGizmo); + +#ifdef __cplusplus +} +#endif diff --git a/thermion_dart/native/include/c_api/TMaterialInstance.h b/thermion_dart/native/include/c_api/TMaterialInstance.h new file mode 100644 index 00000000..50d50809 --- /dev/null +++ b/thermion_dart/native/include/c_api/TMaterialInstance.h @@ -0,0 +1,103 @@ +#pragma once + +#include "APIBoundaryTypes.h" +#include "APIExport.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + // copied from SamplerCompareFunc in DriverEnums.h + enum TSamplerCompareFunc + { + // don't change the enums values + LE = 0, //!< Less or equal + GE, //!< Greater or equal + L, //!< Strictly less than + G, //!< Strictly greater than + E, //!< Equal + NE, //!< Not equal + A, //!< Always. Depth / stencil testing is deactivated. + N //!< Never. The depth / stencil test always fails. + }; + + // StencilOperation equivalent + enum TStencilOperation + { + KEEP = 0, // Keep the current value + ZERO, // Set the value to zero + REPLACE, // Set the value to reference value + INCR, // Increment the current value with saturation + INCR_WRAP, // Increment the current value without saturation + DECR, // Decrement the current value with saturation + DECR_WRAP, // Decrement the current value without saturation + INVERT // Invert the current value + }; + + // StencilFace equivalent + enum TStencilFace + { + STENCIL_FACE_FRONT = 1, + STENCIL_FACE_BACK = 2, + STENCIL_FACE_FRONT_AND_BACK = 3 + }; + + // Add these enum definitions at the top with the other enums + enum TCullingMode + { + CULLING_MODE_NONE = 0, + CULLING_MODE_FRONT, + CULLING_MODE_BACK, + CULLING_MODE_FRONT_AND_BACK + }; + + EMSCRIPTEN_KEEPALIVE bool MaterialInstance_isStencilWriteEnabled(TMaterialInstance *materialInstance); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilWrite(TMaterialInstance *materialInstance, bool enabled); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setCullingMode(TMaterialInstance *materialInstance, TCullingMode culling); + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance *materialInstance, bool enabled); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance *materialInstance, bool enabled); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat4(TMaterialInstance *materialInstance, const char *name, double x, double y, double w, double z); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat2(TMaterialInstance *materialInstance, const char *name, double x, double y); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat(TMaterialInstance *materialInstance, const char *name, double value); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance *materialInstance, const char *name, int value); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthFunc(TMaterialInstance *materialInstance, TSamplerCompareFunc depthFunc); + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilOpStencilFail( + TMaterialInstance *materialInstance, + TStencilOperation op, + TStencilFace face); + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilOpDepthFail( + TMaterialInstance *materialInstance, + TStencilOperation op, + TStencilFace face); + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilOpDepthStencilPass( + TMaterialInstance *materialInstance, + TStencilOperation op, + TStencilFace face); + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilCompareFunction( + TMaterialInstance *materialInstance, + TSamplerCompareFunc func, + TStencilFace face); + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilReferenceValue( + TMaterialInstance *materialInstance, + uint8_t value, + TStencilFace face); + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilReadMask( + TMaterialInstance *materialInstance, + uint8_t mask); + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilWriteMask( + TMaterialInstance *materialInstance, + uint8_t mask); + + +#ifdef __cplusplus +} +#endif diff --git a/thermion_dart/native/include/c_api/TMaterialProvider.h b/thermion_dart/native/include/c_api/TMaterialProvider.h new file mode 100644 index 00000000..9e313466 --- /dev/null +++ b/thermion_dart/native/include/c_api/TMaterialProvider.h @@ -0,0 +1,14 @@ +#pragma once + +#include "APIBoundaryTypes.h" +#include "APIExport.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + EMSCRIPTEN_KEEPALIVE TMaterialInstance *MaterialProvider_createMaterialInstance(TMaterialProvider *provider, TMaterialKey *key); + +#ifdef __cplusplus +} +#endif diff --git a/thermion_dart/native/include/c_api/TNameComponentManager.h b/thermion_dart/native/include/c_api/TNameComponentManager.h new file mode 100644 index 00000000..90c2eb38 --- /dev/null +++ b/thermion_dart/native/include/c_api/TNameComponentManager.h @@ -0,0 +1,16 @@ +#pragma once + +#include "APIBoundaryTypes.h" +#include "APIExport.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + EMSCRIPTEN_KEEPALIVE const char *NameComponentManager_getName(TNameComponentManager *tNameComponentManager, EntityId entity); + + +#ifdef __cplusplus +} +#endif diff --git a/thermion_dart/native/include/c_api/TRenderableManager.h b/thermion_dart/native/include/c_api/TRenderableManager.h new file mode 100644 index 00000000..e9f2b042 --- /dev/null +++ b/thermion_dart/native/include/c_api/TRenderableManager.h @@ -0,0 +1,17 @@ +#pragma once + +#include "APIExport.h" +#include "APIBoundaryTypes.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + EMSCRIPTEN_KEEPALIVE void RenderableManager_setMaterialInstanceAt(TRenderableManager *tRenderableManager, EntityId entityId, int primitiveIndex, TMaterialInstance *tMaterialInstance); + EMSCRIPTEN_KEEPALIVE void RenderableManager_setPriority(TRenderableManager *tRenderableManager, EntityId entityId, int priority); + EMSCRIPTEN_KEEPALIVE TMaterialInstance *RenderableManager_getMaterialInstanceAt(TRenderableManager *tRenderableManager, EntityId entityId, int primitiveIndex); +#ifdef __cplusplus +} +#endif + diff --git a/thermion_dart/native/include/c_api/TSceneAsset.h b/thermion_dart/native/include/c_api/TSceneAsset.h new file mode 100644 index 00000000..e75a2a54 --- /dev/null +++ b/thermion_dart/native/include/c_api/TSceneAsset.h @@ -0,0 +1,27 @@ + +#pragma once + +#include +#include "APIExport.h" +#include "APIBoundaryTypes.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + EMSCRIPTEN_KEEPALIVE void SceneAsset_addToScene(TSceneAsset *tSceneAsset, TScene *tScene); + EMSCRIPTEN_KEEPALIVE EntityId SceneAsset_getEntity(TSceneAsset *tSceneAsset); + EMSCRIPTEN_KEEPALIVE int SceneAsset_getChildEntityCount(TSceneAsset* tSceneAsset); + EMSCRIPTEN_KEEPALIVE void SceneAsset_getChildEntities(TSceneAsset* tSceneAsset, EntityId *out); + EMSCRIPTEN_KEEPALIVE const utils::Entity *SceneAsset_getCameraEntities(TSceneAsset* tSceneAsset); + EMSCRIPTEN_KEEPALIVE size_t SceneAsset_getCameraEntityCount(TSceneAsset *tSceneAsset); + EMSCRIPTEN_KEEPALIVE const utils::Entity *SceneAsset_getLightEntities(TSceneAsset* tSceneAsset); + EMSCRIPTEN_KEEPALIVE size_t SceneAsset_getLightEntityCount(TSceneAsset *tSceneAsset); + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneAsset_getInstance(TSceneAsset *tSceneAsset, int index); + EMSCRIPTEN_KEEPALIVE size_t SceneAsset_getInstanceCount(TSceneAsset *tSceneAsset); + EMSCRIPTEN_KEEPALIVE TSceneAsset * SceneAsset_createInstance(TSceneAsset *asset, TMaterialInstance **materialInstances, int materialInstanceCount); + +#ifdef __cplusplus +} +#endif + diff --git a/thermion_dart/native/include/c_api/TSceneManager.h b/thermion_dart/native/include/c_api/TSceneManager.h new file mode 100644 index 00000000..5b3f17a9 --- /dev/null +++ b/thermion_dart/native/include/c_api/TSceneManager.h @@ -0,0 +1,66 @@ +#pragma once + +#include "APIBoundaryTypes.h" +#include "ResourceBuffer.hpp" +#include "MathUtils.hpp" +#include "TCamera.h" +#include "TMaterialInstance.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + EMSCRIPTEN_KEEPALIVE TGizmo *SceneManager_createGizmo(TSceneManager *tSceneManager, TView *tView, TScene *tScene); + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_createGeometry( + TSceneManager *sceneManager, + float *vertices, + int numVertices, + float *normals, + int numNormals, + float *uvs, + int numUvs, + uint16_t *indices, + int numIndices, + int primitiveType, + TMaterialInstance **materialInstances, + int materialInstanceCount, + bool keepData); + EMSCRIPTEN_KEEPALIVE TMaterialProvider *SceneManager_getUbershaderMaterialProvider(TSceneManager *sceneManager); + EMSCRIPTEN_KEEPALIVE TMaterialProvider *SceneManager_getUnlitMaterialProvider(TSceneManager *sceneManager); + EMSCRIPTEN_KEEPALIVE TMaterialInstance *SceneManager_createUnlitMaterialInstance(TSceneManager *sceneManager); + EMSCRIPTEN_KEEPALIVE TMaterialInstance *SceneManager_createUnlitFixedSizeMaterialInstance(TSceneManager *sceneManager); + + EMSCRIPTEN_KEEPALIVE void SceneManager_queueTransformUpdates(TSceneManager *sceneManager, EntityId *entities, const double *const transforms, int numEntities); + EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_findCameraByName(TSceneManager *tSceneManager, EntityId entity, const char *name); + EMSCRIPTEN_KEEPALIVE void SceneManager_setVisibilityLayer(TSceneManager *tSceneManager, EntityId entity, int layer); + EMSCRIPTEN_KEEPALIVE TScene *SceneManager_getScene(TSceneManager *tSceneManager); + + + EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_createCamera(TSceneManager *sceneManager); + EMSCRIPTEN_KEEPALIVE void SceneManager_destroyCamera(TSceneManager *sceneManager, TCamera *camera); + EMSCRIPTEN_KEEPALIVE size_t SceneManager_getCameraCount(TSceneManager *sceneManager); + EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_getCameraAt(TSceneManager *sceneManager, size_t index); + EMSCRIPTEN_KEEPALIVE void SceneManager_destroyMaterialInstance(TSceneManager *sceneManager, TMaterialInstance *instance); + + EMSCRIPTEN_KEEPALIVE Aabb3 SceneManager_getRenderableBoundingBox(TSceneManager *tSceneManager, EntityId entity); + EMSCRIPTEN_KEEPALIVE int SceneManager_addToScene(TSceneManager *tSceneManager, EntityId entity); + EMSCRIPTEN_KEEPALIVE int SceneManager_removeFromScene(TSceneManager *tSceneManager, EntityId entity); + + EMSCRIPTEN_KEEPALIVE void SceneManager_transformToUnitCube(TSceneManager *sceneManager, EntityId asset); + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlbFromBuffer(TSceneManager *tSceneManager, const uint8_t *const, size_t length, bool keepData, int priority, int layer, bool loadResourcesAsync); + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlb(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData); + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGltf(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData); + + + EMSCRIPTEN_KEEPALIVE TAnimationManager *SceneManager_getAnimationManager(TSceneManager *tSceneManager); + EMSCRIPTEN_KEEPALIVE void *SceneManager_destroyAll(TSceneManager *tSceneManager); + EMSCRIPTEN_KEEPALIVE void *SceneManager_destroyAsset(TSceneManager *tSceneManager, TSceneAsset *sceneAsset); + EMSCRIPTEN_KEEPALIVE TNameComponentManager *SceneManager_getNameComponentManager(TSceneManager *tSceneManager); + EMSCRIPTEN_KEEPALIVE size_t SceneManager_getOverlayEntityCount(TSceneManager *tSceneManager); + EMSCRIPTEN_KEEPALIVE EntityId SceneManager_getOverlayEntityAt(TSceneManager *tSceneManager, size_t index); + + +#ifdef __cplusplus +} +#endif diff --git a/thermion_dart/native/include/c_api/TTransformManager.h b/thermion_dart/native/include/c_api/TTransformManager.h new file mode 100644 index 00000000..db26e0f0 --- /dev/null +++ b/thermion_dart/native/include/c_api/TTransformManager.h @@ -0,0 +1,23 @@ +#pragma once + +#include "APIExport.h" +#include "APIBoundaryTypes.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + EMSCRIPTEN_KEEPALIVE double4x4 TransformManager_getLocalTransform(TTransformManager *tTransformManager, EntityId entityId); + EMSCRIPTEN_KEEPALIVE double4x4 TransformManager_getWorldTransform(TTransformManager *tTransformManager, EntityId entityId); + EMSCRIPTEN_KEEPALIVE void TransformManager_setTransform(TTransformManager *tTransformManager, EntityId entityId, double4x4 transform); + EMSCRIPTEN_KEEPALIVE void TransformManager_transformToUnitCube(TTransformManager *tTransformManager, EntityId entityId); + EMSCRIPTEN_KEEPALIVE void TransformManager_setParent(TTransformManager *tTransformManager, EntityId child, EntityId parent, bool preserveScaling); + EMSCRIPTEN_KEEPALIVE EntityId TransformManager_getParent(TTransformManager *tTransformManager, EntityId child); + EMSCRIPTEN_KEEPALIVE EntityId TransformManager_getAncestor(TTransformManager *tTransformManager, EntityId childEntityId); + + +#ifdef __cplusplus +} +#endif + diff --git a/thermion_dart/native/include/TView.h b/thermion_dart/native/include/c_api/TView.h similarity index 80% rename from thermion_dart/native/include/TView.h rename to thermion_dart/native/include/c_api/TView.h index 563d6fce..c387b14a 100644 --- a/thermion_dart/native/include/TView.h +++ b/thermion_dart/native/include/c_api/TView.h @@ -6,7 +6,8 @@ extern "C" { #endif -#include "ThermionDartApi.h" +#include "APIBoundaryTypes.h" +#include "APIExport.h" struct TViewport { int32_t left; @@ -42,6 +43,11 @@ EMSCRIPTEN_KEEPALIVE void View_setLayerEnabled(TView *tView, int layer, bool vis EMSCRIPTEN_KEEPALIVE void View_setCamera(TView *tView, TCamera *tCamera); EMSCRIPTEN_KEEPALIVE TScene* View_getScene(TView *tView); EMSCRIPTEN_KEEPALIVE TCamera* View_getCamera(TView *tView); +EMSCRIPTEN_KEEPALIVE void View_setStencilBufferEnabled(TView *tView, bool enabled); +EMSCRIPTEN_KEEPALIVE bool View_isStencilBufferEnabled(TView *tView); + +typedef void (*PickCallback)(uint32_t requestId, EntityId entityId, float depth, float fragX, float fragY, float fragZ); +EMSCRIPTEN_KEEPALIVE void View_pick(TView* tView, uint32_t requestId, uint32_t x, uint32_t y, PickCallback callback); #ifdef __cplusplus } diff --git a/thermion_dart/native/include/c_api/ThermionDartApi.h b/thermion_dart/native/include/c_api/ThermionDartApi.h new file mode 100644 index 00000000..a9b06ef2 --- /dev/null +++ b/thermion_dart/native/include/c_api/ThermionDartApi.h @@ -0,0 +1,115 @@ +#ifndef _FLUTTER_FILAMENT_API_H +#define _FLUTTER_FILAMENT_API_H + +#include "APIExport.h" +#include "APIBoundaryTypes.h" +#include "TMaterialInstance.h" + +#include "ResourceBuffer.hpp" +#include "MathUtils.hpp" + +#ifdef __cplusplus +extern "C" +{ +#endif + + EMSCRIPTEN_KEEPALIVE TViewer *Viewer_create(const void *const context, const void *const loader, void *const platform, const char *uberArchivePath); + EMSCRIPTEN_KEEPALIVE void Viewer_destroy(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE TSceneManager *Viewer_getSceneManager(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE TRenderTarget* Viewer_createRenderTarget(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height); + EMSCRIPTEN_KEEPALIVE void Viewer_destroyRenderTarget(TViewer *viewer, TRenderTarget* tRenderTarget); + EMSCRIPTEN_KEEPALIVE TSwapChain *Viewer_createSwapChain(TViewer *viewer, const void *const window); + EMSCRIPTEN_KEEPALIVE TSwapChain *Viewer_createHeadlessSwapChain(TViewer *viewer, uint32_t width, uint32_t height); + EMSCRIPTEN_KEEPALIVE void Viewer_destroySwapChain(TViewer *viewer, TSwapChain* swapChain); + EMSCRIPTEN_KEEPALIVE void Viewer_render( + TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void Viewer_capture( + TViewer *viewer, + TView *view, + TSwapChain *swapChain, + uint8_t *pixelBuffer, + void (*callback)(void)); + EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTarget( + TViewer *viewer, + TView *view, + TSwapChain *swapChain, + TRenderTarget *renderTarget, + uint8_t *pixelBuffer, + void (*callback)(void)); + EMSCRIPTEN_KEEPALIVE TView* Viewer_createView(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE TView* Viewer_getViewAt(TViewer *viewer, int index); + EMSCRIPTEN_KEEPALIVE void Viewer_setMainCamera(TViewer *tViewer, TView *tView); + EMSCRIPTEN_KEEPALIVE TSwapChain* Viewer_getSwapChainAt(TViewer *tViewer, int index); + EMSCRIPTEN_KEEPALIVE void Viewer_setViewRenderable(TViewer *viewer, TSwapChain *swapChain, TView* view, bool renderable); + + + // Engine + EMSCRIPTEN_KEEPALIVE TEngine *Viewer_getEngine(TViewer* viewer); + EMSCRIPTEN_KEEPALIVE TCamera *Engine_getCameraComponent(TEngine* tEngine, EntityId entityId); + + 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 load_skybox(TViewer *viewer, const char *skyboxPath); + EMSCRIPTEN_KEEPALIVE void Viewer_loadIbl(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( + TViewer *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); + 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 get_main_camera(TViewer *viewer); + + EMSCRIPTEN_KEEPALIVE void set_frame_interval(TViewer *viewer, float interval); + + EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(TSceneManager *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z); + EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(TSceneManager *sceneManager, TView *view, EntityId entity, float viewportX, float viewportY); + + EMSCRIPTEN_KEEPALIVE TTransformManager *Engine_getTransformManager(TEngine *engine); + EMSCRIPTEN_KEEPALIVE TRenderableManager *Engine_getRenderableManager(TEngine *engine); + EMSCRIPTEN_KEEPALIVE TCamera *Engine_getCameraComponent(TEngine *engine, EntityId entity); + EMSCRIPTEN_KEEPALIVE TEntityManager *Engine_getEntityManager(TEngine *engine); + + EMSCRIPTEN_KEEPALIVE void ios_dummy(); + EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr); + EMSCRIPTEN_KEEPALIVE void add_collision_component(TSceneManager *sceneManager, EntityId entityId, void (*callback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform); + EMSCRIPTEN_KEEPALIVE void remove_collision_component(TSceneManager *sceneManager, EntityId entityId); + + EMSCRIPTEN_KEEPALIVE void test_collisions(TSceneManager *sceneManager, EntityId entity); + + EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(TSceneManager *sceneManager, TView *view, EntityId entity); + EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(TSceneManager *sceneManager, TView *view, EntityId entity, float *minX, float *minY, float *maxX, float *maxY); + + 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(TSceneManager *sceneManager, uint8_t *data, size_t length); + EMSCRIPTEN_KEEPALIVE void destroy_texture(TSceneManager *sceneManager, void *const texture); + EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(TSceneManager *sceneManager, EntityId entity, void *const texture, const char *parameterName, int materialIndex); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h new file mode 100644 index 00000000..520c23e4 --- /dev/null +++ b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h @@ -0,0 +1,115 @@ +#ifndef _DART_FILAMENT_FFI_API_H +#define _DART_FILAMENT_FFI_API_H + +#include "ThermionDartApi.h" +#include "TView.h" +#include "TMaterialProvider.h" + +#ifdef __cplusplus +namespace thermion +{ + 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 Viewer_createOnRenderThread( + void *const context, + void *const platform, + const char *uberArchivePath, + const void *const loader, + void (*renderCallback)(void *const renderCallbackOwner), + void *const renderCallbackOwner, + void (*callback)(TViewer *viewer)); + EMSCRIPTEN_KEEPALIVE void Viewer_destroyOnRenderThread(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void Viewer_createSwapChainRenderThread(TViewer *viewer, void *const surface, void (*onComplete)(TSwapChain *)); + EMSCRIPTEN_KEEPALIVE void Viewer_createHeadlessSwapChainRenderThread(TViewer *viewer, uint32_t width, uint32_t height, void (*onComplete)(TSwapChain *)); + EMSCRIPTEN_KEEPALIVE void Viewer_destroySwapChainRenderThread(TViewer *viewer, TSwapChain *swapChain, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void Viewer_renderRenderThread(TViewer *viewer, TView *view, TSwapChain *swapChain); + EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderThread(TViewer *viewer, TView *view, TSwapChain *swapChain, uint8_t *out, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTargetRenderThread(TViewer *viewer, TView *view, TSwapChain *swapChain, TRenderTarget *renderTarget, uint8_t *out, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void Viewer_requestFrameRenderThread(TViewer *viewer, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void Viewer_loadIblRenderThread(TViewer *viewer, const char *iblPath, float intensity, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void Viewer_createRenderTargetRenderThread(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height, void (*onComplete)(TRenderTarget *)); + + EMSCRIPTEN_KEEPALIVE void View_setToneMappingRenderThread(TView *tView, TEngine *tEngine, thermion::ToneMapping toneMapping); + EMSCRIPTEN_KEEPALIVE void View_setBloomRenderThread(TView *tView, double bloom); + + FilamentRenderCallback make_render_callback_fn_pointer(FilamentRenderCallback); + EMSCRIPTEN_KEEPALIVE void set_rendering_render_thread(TViewer *viewer, bool rendering, void (*onComplete)()); + + 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 load_skybox_render_thread(TViewer *viewer, const char *skyboxPath, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(TViewer *viewer); + + EMSCRIPTEN_KEEPALIVE void SceneManager_createGeometryRenderThread( + TSceneManager *sceneManager, + float *vertices, + int numVertices, + float *normals, + int numNormals, + float *uvs, + int numUvs, + uint16_t *indices, + int numIndices, + int primitiveType, + TMaterialInstance **materialInstances, + int materialInstanceCount, + bool keepData, + void (*callback)(TSceneAsset *)); + EMSCRIPTEN_KEEPALIVE void SceneManager_loadGlbFromBufferRenderThread(TSceneManager *sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, int priority, int layer, bool loadResourcesAsync, void (*callback)(TSceneAsset *)); + EMSCRIPTEN_KEEPALIVE void SceneManager_createUnlitMaterialInstanceRenderThread(TSceneManager *sceneManager, void (*callback)(TMaterialInstance *)); + EMSCRIPTEN_KEEPALIVE void SceneManager_createUnlitFixedSizeMaterialInstanceRenderThread(TSceneManager *sceneManager, void (*callback)(TMaterialInstance *)); + EMSCRIPTEN_KEEPALIVE void SceneManager_loadGlbRenderThread(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(TSceneAsset *)); + EMSCRIPTEN_KEEPALIVE void SceneManager_loadGltfRenderThread(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(TSceneAsset *)); + EMSCRIPTEN_KEEPALIVE void *SceneManager_destroyAllRenderThread(TSceneManager *tSceneManager, void (*callback)()); + EMSCRIPTEN_KEEPALIVE void *SceneManager_destroyAssetRenderThread(TSceneManager *tSceneManager, TSceneAsset *sceneAsset, void (*callback)()); + + EMSCRIPTEN_KEEPALIVE void SceneAsset_createInstanceRenderThread(TSceneAsset *asset, TMaterialInstance **tMaterialInstances, int materialInstanceCount, void (*callback)(TSceneAsset *)); + + EMSCRIPTEN_KEEPALIVE void MaterialProvider_createMaterialInstanceRenderThread(TMaterialProvider *tMaterialProvider, TMaterialKey *tKey, void (*callback)(TMaterialInstance*)); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_updateBoneMatricesRenderThread( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + void (*callback)(bool)); + + EMSCRIPTEN_KEEPALIVE void AnimationManager_setMorphTargetWeightsRenderThread( + TAnimationManager *tAnimationManager, + EntityId entityId, + const float *const morphData, + int numWeights, + void (*callback)(bool)); + + EMSCRIPTEN_KEEPALIVE void update_bone_matrices_render_thread(TSceneManager *sceneManager, + EntityId asset, void (*callback)(bool)); + EMSCRIPTEN_KEEPALIVE void set_bone_transform_render_thread( + TSceneManager *sceneManager, + EntityId asset, + int skinIndex, + int boneIndex, + const float *const transform, + void (*callback)(bool)); + EMSCRIPTEN_KEEPALIVE void set_post_processing_render_thread(TViewer *viewer, bool enabled); + EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_render_thread(TSceneManager *sceneManager, EntityId entityId, 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 + } +} +#endif + +#endif // _DART_FILAMENT_FFI_API_H diff --git a/thermion_dart/native/include/components/AnimationComponentManager.hpp b/thermion_dart/native/include/components/AnimationComponentManager.hpp index 7153c6ae..ac4e8652 100644 --- a/thermion_dart/native/include/components/AnimationComponentManager.hpp +++ b/thermion_dart/native/include/components/AnimationComponentManager.hpp @@ -1,7 +1,5 @@ #pragma once -#include "Log.hpp" - #include #include @@ -18,10 +16,11 @@ #include #include -#include -#include #include -#include + +#include + +#include "Log.hpp" template class std::vector; namespace thermion @@ -170,7 +169,6 @@ namespace thermion if (std::holds_alternative(animationComponent.target)) { - auto target = std::get(animationComponent.target); auto animator = target->getAnimator(); auto &gltfAnimations = animationComponent.gltfAnimations; @@ -225,7 +223,6 @@ namespace thermion if (elapsedInSecs >= (animationStatus.durationInSecs + animationStatus.fadeInInSecs + animationStatus.fadeOutInSecs)) { if(!animationStatus.loop) { - Log("Bone animation %d finished", i); boneAnimations.erase(boneAnimations.begin() + i); continue; } diff --git a/thermion_dart/native/include/material/grid.S b/thermion_dart/native/include/material/grid.S index 8d348bdd..8250823f 100644 --- a/thermion_dart/native/include/material/grid.S +++ b/thermion_dart/native/include/material/grid.S @@ -8,5 +8,5 @@ GRID_PACKAGE: GRID_GRID_OFFSET: .int 0 GRID_GRID_SIZE: - .int 43432 + .int 44564 diff --git a/thermion_dart/native/include/material/grid.apple.S b/thermion_dart/native/include/material/grid.apple.S index 03c7f3ac..936ce2e2 100644 --- a/thermion_dart/native/include/material/grid.apple.S +++ b/thermion_dart/native/include/material/grid.apple.S @@ -8,5 +8,5 @@ _GRID_PACKAGE: _GRID_GRID_OFFSET: .int 0 _GRID_GRID_SIZE: - .int 43432 + .int 44564 diff --git a/thermion_dart/native/include/material/grid.bin b/thermion_dart/native/include/material/grid.bin index d4d65b4f8f0dd11a5b947ad142bc00deca266bdc..9b9d348fc84c64bcefbc3aaa18374a132d43de9e 100644 GIT binary patch delta 12058 zcmeHLd3;pW^}pxLWM;AuLM92xB!o%AG6_taEi-u_Awbv>0>P!C#DEEgeTk4DGI43$ zmvXJYqSmGDPy4fVsi_~^Vy$RZT5{`yZ}GVi{7 z@44rkd+s^kbKd*jQ+(M=eCst#N?*&(`KoQ^(w6q6(~csg6zO+)scYwb?lX>c-Qd^r zY&T_n(yr9i1Anz$@8n=qkMO#)0w;Rwyn0XWY|muX9u7w9w|l2}1NDL6WVN+(WyISa zjzo1;O=(Hj=8kopN3ZYh+OT=umijKN5^_y>BeO$+1}p-l4*IH`=+*a5R(kJ3kNMn( z=j)~x>*knaIHtBI8Ha)~(IDH@z!Y<9Ua=daPy}~V5uZHiOX@~(Ft)4OXG3qGdf11K z(#T}hwRS^CkGDMy&3K>bA!?8w;tlY46!{(&WaHA0U z+A&q%+qWHd@dfJxUca|J6b;tadM9|>V?n5EE~@V}88$}5Le@xMas+m=M&tzA!M1*T zUV4{-1|4iG(-S-mV*^m9y9*+tuzQntT}Myn=I)NQtsOX_E%hC>sy!Ak^mTbIe5?ZRh?!FE8eCzO}hg=%YsDrhbN zak`USZwNCG=#Ay|a|6aiIhlxgZy0iq*4D4+*wQ&eO!~J8^_%4vP*`uN7*FAWD=Rvf z8uX`?VQ!4Tjiwg+Hmq3Pxw0qap&iTGV-1>4EYsUY=Z}PvVo)fS>Dz|()|3?=!n45> zj-77=WhX{J4i;X#X^F>S1e4A!k7?h|8jfztw}XKYlxk)ppl{7986F71^y}fQ!GJi6 zZeHZmS9`Nd&+;Lr)@4q8^0`8uyT<`W)r01#n$ll72rJ8S(R z<|lZ4xcoR&aY^A4g)oSOi@M>XkW?!%E!?(Yy?(W|cvM1&tWEfI2AQs}8`WY7PZL;- zGj)YDgh2-Hq;hf?LLNeVSHKh@1b7)5G1Zoyj`b@$+q>7F+-XJ(PO`arKbe4WFl1Rs zk$J4)NbK;C6_b-KOF>r5I$I0t1Z*-PDW+S;7wMO41}M0zq)dN*Oty&<&n!8FX9hu%a7`0;8;v2p83`SJ6JU%@6oi5y z@lQ~u9JJgKgj*!h7td)Abqq&0<)NXFgiW(e!~k~-&`5@uGfXAY^GGQNshZ)T7VD&LmWN`@%s`sr_0Yd69nWEJp~+=3m#p@xh@u%xu4IFlK46)E6((8TD( z%pmze5e5FRGTXS=+gORnI9tnaj|? zG$=y&z7Z*P zKdLa!f_a9rO7tV}vLr|YHa}p!%b

BUz_RUNLc61 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 a++tiKx1uC|M_wzp%j@Lza+;iO?fah-d=qj2 diff --git a/thermion_dart/native/include/material/grid.c b/thermion_dart/native/include/material/grid.c index 812c688e..6420afaf 100644 --- a/thermion_dart/native/include/material/grid.c +++ b/thermion_dart/native/include/material/grid.c @@ -36,16 +36,16 @@ const uint8_t GRID_PACKAGE[] = { 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, +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, 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, 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, +0x00, 0x00, 0x44, 0x49, 0x55, 0x55, 0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x7e, 0xc5, 0x13, 0x81, 0x57, 0x08, +0xa7, 0x2d, 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, @@ -53,7 +53,7 @@ const uint8_t GRID_PACKAGE[] = { 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, +0x41, 0x4d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0xfa, 0x5f, 0x00, 0x00, 0x9e, 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, @@ -151,1311 +151,1692 @@ const uint8_t GRID_PACKAGE[] = { 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, +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, 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, +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, 0x30, 0x31, 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, 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, 0x34, 0x3b, +0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x37, 0x35, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x36, +0x37, 0x36, 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, 0x31, 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, 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, 0x32, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2f, 0x20, +0x5f, 0x32, 0x32, 0x31, 0x3b, 0x00, 0x5f, 0x37, 0x31, 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, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, +0x31, 0x31, 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, 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, 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, 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, +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, 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, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 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, 0x36, 0x31, 0x29, 0x3b, +0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x37, 0x31, 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, 0x38, 0x20, 0x3d, 0x20, +0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x37, 0x31, 0x31, 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, 0x34, 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, 0x34, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 0x38, 0x20, 0x3d, 0x20, +0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x33, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x28, +0x5f, 0x33, 0x37, 0x38, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, +0x36, 0x31, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x37, 0x31, 0x34, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, +0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, +0x20, 0x5f, 0x33, 0x38, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x38, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x36, 0x30, 0x35, 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, 0x30, 0x39, 0x3b, 0x00, 0x69, +0x66, 0x20, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x3e, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, +0x72, 0x61, 0x6d, 0x73, 0x2e, 0x61, 0x29, 0x00, 0x5f, 0x37, 0x30, 0x39, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, +0x30, 0x2e, 0x30, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x36, 0x31, 0x38, 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, 0x32, 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, 0x30, 0x3b, 0x00, 0x69, 0x66, 0x20, 0x28, 0x5f, +0x36, 0x30, 0x35, 0x20, 0x3e, 0x20, 0x5f, 0x36, 0x32, 0x32, 0x29, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x37, 0x30, +0x30, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x31, 0x38, 0x3b, 0x00, 0x5f, 0x37, 0x30, 0x30, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, +0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x30, 0x35, 0x20, 0x2d, 0x20, 0x5f, 0x36, 0x32, 0x32, 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, 0x32, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x37, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x30, +0x30, 0x3b, 0x00, 0x5f, 0x37, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x31, 0x38, 0x3b, 0x00, 0x5f, 0x37, 0x30, 0x39, +0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 0x30, 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, 0x30, 0x39, 0x2c, 0x20, 0x5f, 0x36, 0x37, +0x34, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x35, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x35, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x35, 0x2c, +0x20, 0x5f, 0x36, 0x37, 0x36, 0x29, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x36, +0x37, 0x34, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x35, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x35, 0x2c, 0x20, 0x5f, 0x36, 0x37, 0x35, +0x2c, 0x20, 0x5f, 0x36, 0x37, 0x36, 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, 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, 0x35, 0x30, 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, 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, +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, 0x30, 0x31, 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, 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, +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, 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, +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, 0x30, 0x31, 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, 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, 0x31, 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, 0x31, 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, +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, 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, 0x34, 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, 0x31, 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, 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, 0x30, 0x31, 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, 0x30, 0x31, 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, 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, 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, +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, 0x32, 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, 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, +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, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x36, 0x31, +0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x5f, 0x39, 0x30, 0x32, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x39, 0x32, 0x32, 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, 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, +0x65, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x30, 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, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x39, 0x32, 0x37, 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, 0x35, 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, 0x32, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x39, 0x32, 0x38, 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, 0x32, 0x39, 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, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x39, 0x32, 0x32, 0x20, 0x3e, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x28, 0x5f, 0x39, 0x32, 0x38, 0x20, 0x2a, 0x20, 0x5f, 0x39, 0x32, 0x39, 0x29, 0x29, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x5f, 0x39, 0x33, 0x32, 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, 0x38, 0x36, 0x20, 0x3d, 0x20, +0x5f, 0x36, 0x32, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, +0x38, 0x36, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x32, 0x37, 0x20, 0x2d, 0x20, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, +0x39, 0x33, 0x32, 0x2c, 0x20, 0x5f, 0x39, 0x32, 0x39, 0x2c, 0x20, 0x5f, 0x36, 0x31, 0x32, 0x29, 0x20, 0x2f, 0x20, 0x66, +0x6d, 0x61, 0x28, 0x5f, 0x39, 0x33, 0x32, 0x2c, 0x20, 0x5f, 0x39, 0x32, 0x39, 0x2c, 0x20, 0x5f, 0x39, 0x32, 0x38, 0x29, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x30, 0x33, 0x20, +0x3d, 0x20, 0x5f, 0x38, 0x38, 0x36, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x5f, 0x39, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x32, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x39, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x30, 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, 0x39, 0x30, 0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, +0x34, 0x39, 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, 0x39, 0x31, 0x31, 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, 0x34, 0x20, 0x3d, 0x20, 0x6c, +0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x5f, 0x34, 0x39, 0x38, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x37, 0x30, 0x34, 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, 0x31, +0x31, 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, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x39, 0x38, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x32, 0x31, 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, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x39, 0x30, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x62, 0x73, 0x28, 0x5f, 0x37, 0x32, 0x31, 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, 0x30, 0x34, 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, 0x30, 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, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x30, 0x34, 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, 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, 0x37, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x5f, 0x39, +0x34, 0x30, 0x20, 0x2d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x39, 0x30, 0x34, +0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x37, 0x30, 0x34, 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, 0x35, 0x31, 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, 0x30, 0x35, 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, 0x34, 0x33, +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, 0x30, 0x35, 0x20, 0x3d, +0x20, 0x5f, 0x39, 0x35, 0x31, 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, 0x39, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, +0x6d, 0x69, 0x78, 0x28, 0x5f, 0x39, 0x34, 0x33, 0x2e, 0x79, 0x2c, 0x20, 0x5f, 0x39, 0x34, 0x33, 0x2e, 0x78, 0x2c, 0x20, +0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x37, 0x30, 0x34, 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, 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, +0x39, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x35, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x30, 0x35, 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, 0x34, +0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x39, 0x31, +0x30, 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, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x33, 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, 0x39, 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, 0x39, 0x34, 0x30, 0x20, 0x2d, 0x20, +0x68, 0x61, 0x6c, 0x66, 0x28, 0x65, 0x78, 0x70, 0x28, 0x2d, 0x28, 0x5f, 0x39, 0x30, 0x34, 0x20, 0x2a, 0x20, 0x66, 0x61, +0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x37, 0x30, 0x34, 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, 0x30, 0x20, +0x3d, 0x20, 0x5f, 0x38, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, +0x34, 0x20, 0x5f, 0x39, 0x36, 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, 0x68, +0x61, 0x6c, 0x66, 0x33, 0x20, 0x5f, 0x38, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x39, 0x36, 0x30, 0x2e, 0x78, 0x79, +0x7a, 0x20, 0x2a, 0x20, 0x28, 0x5f, 0x39, 0x34, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x37, 0x35, 0x34, 0x29, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x39, 0x31, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, +0x20, 0x5f, 0x38, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x36, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x5f, 0x38, 0x39, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x34, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x39, 0x35, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x34, 0x39, +0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x39, 0x35, 0x2e, 0x7a, 0x20, 0x3d, +0x20, 0x5f, 0x38, 0x34, 0x39, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, +0x31, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x39, 0x35, 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, 0x31, 0x31, 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, 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, +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, 0x30, 0x31, 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, +0x30, 0x31, 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, 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, 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, +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, +0x32, 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, 0x30, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, +0x5f, 0x36, 0x31, 0x32, 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, 0x30, 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, 0x36, +0x32, 0x35, 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, 0x30, 0x33, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x36, 0x31, 0x32, 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, 0x31, 0x32, 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, 0x38, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x32, 0x35, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x38, 0x36, 0x2e, 0x77, +0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, 0x31, 0x32, 0x2c, 0x20, +0x30, 0x2e, 0x38, 0x2c, 0x20, 0x5f, 0x36, 0x31, 0x32, 0x29, 0x20, 0x2f, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x39, 0x31, +0x32, 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, +0x30, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x35, 0x30, 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, 0x39, 0x31, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x30, 0x30, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x37, 0x35, 0x34, 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, 0x30, 0x34, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, +0x37, 0x30, 0x34, 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, 0x30, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x20, 0x5f, 0x39, 0x31, 0x39, 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, 0x30, 0x35, 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, 0x39, 0x38, 0x29, 0x2c, 0x20, 0x6c, 0x65, +0x76, 0x65, 0x6c, 0x28, 0x6d, 0x69, 0x78, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x31, 0x39, 0x2e, 0x79, +0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x39, 0x31, 0x39, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x61, +0x73, 0x74, 0x3a, 0x3a, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x37, 0x30, 0x34, 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, 0x30, 0x35, 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, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x30, 0x35, 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, 0x34, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x39, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 0x33, +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, 0x39, 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, 0x39, 0x30, 0x34, 0x20, 0x2a, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x5f, 0x37, +0x30, 0x34, 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, 0x34, 0x39, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x35, 0x30, 0x30, 0x2e, +0x78, 0x79, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x37, 0x35, 0x34, 0x29, 0x29, 0x20, +0x2b, 0x20, 0x5f, 0x39, 0x31, 0x30, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x34, 0x20, 0x5f, 0x38, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x30, 0x30, 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, 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, 0x30, 0x31, 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, 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, 0x52, 0x49, 0x50, 0x53, 0x5f, 0x43, 0x49, 0x44, 0x08, 0x33, 0x00, 0x00, -0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x2b, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, -0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x12, 0x00, 0x00, +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, 0x9e, 0x0a, 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, 0x92, 0x02, 0x00, 0x00, 0x01, 0x20, 0x01, +0xa6, 0x02, 0x00, 0x00, 0x01, 0x30, 0x01, 0x1c, 0x04, 0x00, 0x00, 0x01, 0x44, 0x01, 0x5e, 0x04, 0x00, 0x00, 0x01, 0x80, +0x00, 0x76, 0x04, 0x00, 0x00, 0x01, 0x90, 0x00, 0x76, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x9e, 0x05, 0x00, 0x00, 0x02, +0x00, 0x01, 0xaa, 0x06, 0x00, 0x00, 0x02, 0x10, 0x00, 0x9e, 0x05, 0x00, 0x00, 0x02, 0x10, 0x01, 0xaa, 0x07, 0x00, 0x00, +0x02, 0x20, 0x01, 0xbc, 0x07, 0x00, 0x00, 0x02, 0x30, 0x01, 0x20, 0x09, 0x00, 0x00, 0x02, 0x44, 0x01, 0x60, 0x09, 0x00, +0x00, 0x02, 0x80, 0x00, 0x76, 0x09, 0x00, 0x00, 0x02, 0x90, 0x00, 0x76, 0x09, 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, 0x66, 0x07, 0x00, 0x00, 0x7d, 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, 0x17, +0x00, 0x02, 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, 0xca, 0x00, 0xcb, 0x00, 0x61, 0x00, 0xcc, 0x00, 0x02, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, +0x00, 0xd0, 0x00, 0xd1, 0x00, 0x66, 0x00, 0x02, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0x02, 0x00, 0xd5, 0x00, 0x69, +0x00, 0x6a, 0x00, 0x02, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x02, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, +0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xdd, 0x00, 0x69, 0x00, 0xde, 0x00, 0x69, 0x00, 0xdf, 0x00, 0x69, 0x00, 0x51, +0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x78, 0x00, 0x66, 0x00, 0x02, 0x00, 0x69, 0x00, 0x03, +0x0e, 0x00, 0x00, 0xb7, 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, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0x17, 0x00, 0x02, +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, 0xca, 0x00, 0xcb, 0x00, 0x61, 0x00, 0xcc, 0x00, 0x02, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xe3, +0x00, 0xd0, 0x00, 0xd1, 0x00, 0xe4, 0x00, 0x02, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0x02, 0x00, 0xe7, 0x00, 0x69, 0x00, 0xe8, +0x00, 0xe9, 0x00, 0xea, 0x00, 0x02, 0x00, 0xeb, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xec, 0x00, 0x69, 0x00, 0xed, +0x00, 0xee, 0x00, 0xef, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x02, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, 0x00, 0x69, +0x00, 0x6a, 0x00, 0x02, 0x00, 0xf6, 0x00, 0x69, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0x02, 0x00, 0xfa, 0x00, 0xfb, +0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xff, 0x00, 0x69, 0x00, 0x00, 0x01, 0x01, +0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x01, 0xe7, 0x00, 0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0x05, 0x01, 0x06, 0x01, 0x07, +0x01, 0x02, 0x00, 0x08, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x09, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x0c, 0x01, 0x02, +0x00, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x10, 0x01, 0x69, 0x00, 0x11, 0x01, 0x69, +0x00, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x69, 0x00, 0xec, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, +0x00, 0x00, 0x00, 0x77, 0x00, 0x78, 0x00, 0x05, 0x00, 0x02, 0x00, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, +0x01, 0x1c, 0x01, 0x1d, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x1e, 0x01, 0x14, 0x00, 0x02, +0x00, 0x15, 0x00, 0x16, 0x00, 0x1f, 0x01, 0x20, 0x01, 0x66, 0x00, 0x02, 0x00, 0x21, 0x01, 0x22, 0x01, 0x69, 0x00, 0x91, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x78, 0x00, 0xd1, 0x00, 0x66, 0x00, 0x02, 0x00, 0x23, +0x01, 0x69, 0x00, 0x48, 0x0c, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 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, 0x25, 0x01, 0x26, 0x01, 0x0f, 0x00, 0x27, 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, 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, 0x69, 0x00, 0xca, +0x08, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x3d, 0x01, 0x3e, 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, 0x92, 0x00, 0x93, +0x00, 0x94, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, +0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0x39, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, +0x00, 0x3d, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0x40, 0x00, 0xac, 0x00, 0xad, 0x00, 0x43, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, +0x00, 0xb2, 0x00, 0x48, 0x00, 0x49, 0x00, 0xb5, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xb9, 0x00, 0xba, 0x00, 0x50, +0x00, 0xbc, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, +0x00, 0x5b, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0x61, 0x00, 0x62, 0x00, 0x3f, 0x01, 0x40, +0x01, 0x41, 0x01, 0x66, 0x00, 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, +0x00, 0x69, 0x00, 0x42, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x46, 0x01, 0x74, +0x00, 0x75, 0x00, 0x76, 0x00, 0x69, 0x00, 0xa4, 0x06, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x3d, 0x01, 0x3e, 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, 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, 0x92, 0x00, 0x93, +0x00, 0x94, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, +0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0x39, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, +0x00, 0x3d, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0x40, 0x00, 0xac, 0x00, 0xad, 0x00, 0x43, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, +0x00, 0xb2, 0x00, 0x48, 0x00, 0x49, 0x00, 0xb5, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xb9, 0x00, 0xba, 0x00, 0x50, +0x00, 0xbc, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, +0x00, 0x5b, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0x61, 0x00, 0xcc, 0x00, 0x02, 0x00, 0xcd, +0x00, 0xce, 0x00, 0xcf, 0x00, 0x47, 0x01, 0xd1, 0x00, 0x66, 0x00, 0x02, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0x02, +0x00, 0xd5, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0x02, 0x00, 0xda, +0x00, 0xdb, 0x00, 0xdc, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xdd, 0x00, 0x69, 0x00, 0xde, 0x00, 0x69, 0x00, 0xdf, +0x00, 0x69, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3d, 0x01, 0x3e, 0x01, 0x66, 0x00, 0x02, 0x00, 0x69, +0x00, 0x2d, 0x0c, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x3d, 0x01, 0x3e, 0x01, 0x79, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x7b, +0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x04, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 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, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x2a, 0x00, 0x2b, +0x00, 0x2c, 0x00, 0x2d, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, +0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0x39, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0x3d, 0x00, 0xa9, 0x00, 0xaa, +0x00, 0x40, 0x00, 0xac, 0x00, 0xad, 0x00, 0x43, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0x48, 0x00, 0x49, +0x00, 0xb5, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xb9, 0x00, 0xba, 0x00, 0x50, 0x00, 0xbc, 0x00, 0x52, 0x00, 0x53, +0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0x5b, 0x00, 0xc7, 0x00, 0xc8, +0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0x61, 0x00, 0xcc, 0x00, 0x02, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0x48, +0x01, 0x47, 0x01, 0xd1, 0x00, 0x49, 0x01, 0x02, 0x00, 0x4a, 0x01, 0xe6, 0x00, 0x02, 0x00, 0xe7, 0x00, 0x69, 0x00, 0x4b, +0x01, 0x4c, 0x01, 0xea, 0x00, 0x02, 0x00, 0xeb, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xec, 0x00, 0x69, 0x00, 0x4d, +0x01, 0xf0, 0x00, 0xf1, 0x00, 0x02, 0x00, 0x4e, 0x01, 0x4f, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xf6, 0x00, 0x69, +0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0x02, 0x00, 0x50, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xff, 0x00, 0x69, +0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x01, 0xe7, 0x00, 0x69, 0x00, 0x66, 0x00, 0x02, 0x00, 0x05, +0x01, 0x06, 0x01, 0x07, 0x01, 0x02, 0x00, 0x08, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x09, 0x01, 0x0a, 0x01, 0x0b, +0x01, 0x0c, 0x01, 0x02, 0x00, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x10, 0x01, 0x69, +0x00, 0x11, 0x01, 0x69, 0x00, 0x12, 0x01, 0x13, 0x01, 0x51, 0x01, 0x15, 0x01, 0x16, 0x01, 0x69, 0x00, 0xcc, 0x02, 0x00, +0x00, 0x1c, 0x00, 0x00, 0x00, 0x3d, 0x01, 0x3e, 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, 0x1e, 0x01, 0x14, +0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x52, 0x01, 0x53, 0x01, 0x66, 0x00, 0x02, 0x00, 0x21, 0x01, 0x22, 0x01, 0x69, +0x00, 0x92, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3d, 0x01, 0x3e, 0x01, 0xd1, 0x00, 0x66, 0x00, 0x02, 0x00, 0x23, +0x01, 0x69, 0x00, 0x66, 0x0b, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x3d, 0x01, 0x3e, 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, 0x25, 0x01, 0x26, 0x01, 0x0f, 0x00, 0x27, 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, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, +0x00, 0x2d, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, +0x00, 0xa2, 0x00, 0xa3, 0x00, 0x39, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0x3d, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0x40, +0x00, 0xac, 0x00, 0xad, 0x00, 0x43, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0x48, 0x00, 0x49, 0x00, 0xb5, +0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xb9, 0x00, 0xba, 0x00, 0x50, 0x00, 0xbc, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, +0x00, 0x55, 0x00, 0x56, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0x5b, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, +0x00, 0xca, 0x00, 0xcb, 0x00, 0x61, 0x00, 0x3f, 0x01, 0x62, 0x00, 0x40, 0x01, 0x41, 0x01, 0x66, 0x00, 0x02, 0x00, 0x67, +0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x69, 0x00, 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, 0x67, 0x01, 0x68, 0x01, 0x69, 0x00, 0x52, +0x49, 0x50, 0x53, 0x5f, 0x43, 0x49, 0x44, 0xc1, 0x33, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x57, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, +0x0b, 0x00, 0x08, 0x00, 0x57, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x12, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, +0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, +0x00, 0x01, 0xaf, 0x0f, 0x00, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x8b, 0x01, 0xb3, 0x01, 0xb5, 0x01, 0xc2, 0x01, +0xd2, 0x01, 0xda, 0x01, 0x10, 0x96, 0x01, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, +0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, +0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, +0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, 0x42, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, +0x04, 0x06, 0x10, 0x37, 0x02, 0x83, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, +0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, +0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, +0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, +0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, +0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, +0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x1e, 0x1e, 0x00, 0x00, 0x50, +0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x04, 0x0b, 0x2b, 0x10, 0x1a, 0x1e, 0x04, 0x10, 0x20, 0x1e, 0x07, 0x47, 0x0c, 0x02, +0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x00, 0x00, 0x02, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, +0x06, 0x20, 0xb7, 0x02, 0x02, 0x06, 0x04, 0xb8, 0x02, 0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, 0x06, 0x03, 0xae, 0x02, 0x28, +0x07, 0xb5, 0x02, 0x1a, 0x20, 0x00, 0xbb, 0x04, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x04, 0x20, 0x01, 0xbb, +0x04, 0x2d, 0x02, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2a, 0x06, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2a, 0x0a, 0x02, +0x00, 0x00, 0x00, 0xb8, 0x02, 0x26, 0x09, 0x03, 0xbb, 0x04, 0x2a, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, +0x4a, 0x8e, 0x03, 0x02, 0x08, 0x49, 0x2d, 0x2d, 0x2d, 0x06, 0x4b, 0xbb, 0x04, 0x2a, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, +0x02, 0x02, 0x4c, 0x4d, 0xae, 0x02, 0x02, 0x4e, 0x3e, 0x02, 0x02, 0x4f, 0x39, 0x50, 0x02, 0x02, 0x3e, 0x04, 0x02, 0x08, +0xbb, 0x04, 0x2d, 0x28, 0x04, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2d, 0x0c, 0x05, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2a, 0x08, +0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x08, 0x71, 0xb7, 0x02, 0x02, 0x06, 0x02, 0xb7, 0x02, 0x02, 0x2a, 0x03, 0xbb, +0x04, 0x2a, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, 0x75, 0xbc, 0x02, 0x02, 0x07, 0x71, 0xbb, 0x04, 0x2a, +0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x78, 0xae, 0x83, 0x80, 0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x72, +0x08, 0x08, 0x07, 0x73, 0x06, 0x06, 0x07, 0x07, 0x73, 0x73, 0x06, 0x06, 0x73, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +0x06, 0x07, 0x74, 0x2d, 0x73, 0x06, 0x06, 0x76, 0x09, 0x06, 0x07, 0x07, 0x73, 0x2d, 0x06, 0x07, 0x2d, 0x06, 0x73, 0x06, +0x06, 0x06, 0x2a, 0x09, 0x06, 0x06, 0x2a, 0x06, 0x06, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x49, 0x08, 0x08, 0x06, 0x06, +0x06, 0x06, 0x77, 0x2d, 0x06, 0x06, 0x06, 0x79, 0x3e, 0x02, 0x02, 0x7a, 0x39, 0x7b, 0x02, 0x02, 0x3e, 0x1c, 0x01, 0x07, +0x39, 0x8a, 0x01, 0x02, 0x01, 0xbb, 0x04, 0x06, 0x40, 0x0a, 0xd7, 0x23, 0x3c, 0x3e, 0x0e, 0x03, 0x2d, 0x39, 0xb2, 0x01, +0x02, 0x03, 0x3e, 0x02, 0x01, 0x2d, 0x39, 0xb4, 0x01, 0x02, 0x01, 0x3e, 0x18, 0x03, 0x07, 0x39, 0xc1, 0x01, 0x02, 0x03, +0x3e, 0x08, 0x03, 0x06, 0x39, 0xc1, 0x01, 0x18, 0x03, 0xbe, 0x02, 0x0c, 0x07, 0x06, 0x3e, 0x02, 0x03, 0xd8, 0x01, 0x39, +0xd9, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xab, 0x03, 0x00, 0x03, 0x18, 0x02, 0x01, 0x2d, 0xe2, 0x02, 0x02, 0x22, 0x06, +0x00, 0x01, 0x2d, 0x02, 0x08, 0x33, 0x53, 0x6c, 0x51, 0x2e, 0xb7, 0x01, 0x2e, 0x01, 0x08, 0x02, 0x02, 0x01, 0x07, 0x8e, +0x01, 0xd4, 0x02, 0xc1, 0x12, 0x07, 0x17, 0x76, 0x17, 0x23, 0x53, 0x26, 0x7c, 0x67, 0x2e, 0x01, 0x08, 0x02, 0x02, 0xc1, +0x12, 0x07, 0x21, 0x21, 0x06, 0xd2, 0x0a, 0x07, 0x4e, 0xd0, 0x02, 0x4e, 0x02, 0x13, 0x53, 0x25, 0x7c, 0x6d, 0x01, 0x08, +0x02, 0x02, 0xc1, 0x12, 0x07, 0x21, 0x21, 0x45, 0xb0, 0x0a, 0x1d, 0x42, 0x42, 0xc1, 0x0a, 0x07, 0x0d, 0x0d, 0x00, 0x3d, +0x09, 0x89, 0x02, 0x89, 0x02, 0x89, 0x02, 0x18, 0x13, 0xc6, 0x01, 0x04, 0xc2, 0x01, 0x2b, 0xc1, 0x0a, 0x06, 0x02, 0x06, +0x00, 0x22, 0x02, 0x00, 0x13, 0xc6, 0x01, 0x02, 0xc2, 0x01, 0x31, 0xc1, 0x0a, 0x06, 0x02, 0x0a, 0x01, 0x22, 0x02, 0x00, +0x13, 0xc6, 0x01, 0x02, 0xc2, 0x01, 0x36, 0xc1, 0x0a, 0x06, 0x02, 0x0e, 0x02, 0x22, 0x02, 0x00, 0xc1, 0x12, 0x07, 0x0a, +0xd7, 0x01, 0xf1, 0x01, 0x22, 0x01, 0x00, 0xc1, 0x0a, 0x06, 0x08, 0x08, 0x01, 0x3f, 0x06, 0x02, 0x02, 0xd2, 0x0a, 0x07, +0x80, 0x02, 0x80, 0x02, 0x8a, 0x02, 0x01, 0x13, 0xc1, 0x01, 0xf3, 0x01, 0xda, 0x01, 0x2e, 0x22, 0x00, 0xf3, 0x01, 0x8d, +0x1e, 0x88, 0x06, 0x00, 0x83, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, +0x0b, 0x00, 0x08, 0x00, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x13, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, +0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, +0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x8e, 0x01, 0x91, 0x02, 0xa0, 0x02, 0x04, 0x07, +0x37, 0x2c, 0x06, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0xae, 0x01, 0x06, 0x40, +0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x83, 0x00, 0x05, 0x00, 0x23, 0x00, +0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, +0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, +0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, +0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, +0x01, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, +0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, +0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, +0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, +0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, +0x00, 0x21, 0x00, 0x10, 0x2e, 0x1e, 0x04, 0x37, 0x68, 0x04, 0x00, 0x00, 0x00, 0x23, 0x00, 0x01, 0x00, 0x00, 0x23, 0x10, +0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x00, 0x9a, 0x01, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x00, +0xd8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, +0x28, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, +0x0a, 0x20, 0xb7, 0x02, 0x02, 0x08, 0x04, 0xb8, 0x02, 0x02, 0x09, 0x04, 0xb7, 0x02, 0x08, 0x08, 0x03, 0x94, 0x02, 0x08, +0xfe, 0x02, 0x08, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0e, 0xb5, 0x02, 0x42, 0x20, 0x01, 0xb8, 0x02, 0x10, 0x0e, 0x03, 0xb5, +0x02, 0x02, 0x20, 0x00, 0xbb, 0x04, 0x37, 0x12, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x04, 0x02, 0x0a, 0xbb, 0x04, 0x37, 0x0c, +0x01, 0x00, 0x00, 0x00, 0x3e, 0x30, 0x02, 0x08, 0xbb, 0x04, 0x40, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x0a, +0x6c, 0xb7, 0x02, 0x02, 0x08, 0x02, 0xb7, 0x02, 0x02, 0x40, 0x03, 0xbb, 0x04, 0x40, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, +0x02, 0x02, 0x0e, 0x70, 0xbc, 0x02, 0x02, 0x09, 0x6c, 0xbb, 0x04, 0x40, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, +0x09, 0x73, 0xae, 0x83, 0x80, 0x02, 0x02, 0x0a, 0x0a, 0x0a, 0x0a, 0x6d, 0x0a, 0x0a, 0x09, 0x6e, 0x08, 0x08, 0x09, 0x09, +0x6e, 0x6e, 0x08, 0x08, 0x6e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x6f, 0x37, 0x6e, 0x08, 0x08, 0x71, +0x0e, 0x08, 0x09, 0x09, 0x6e, 0x37, 0x08, 0x09, 0x37, 0x08, 0x6e, 0x08, 0x08, 0x08, 0x40, 0x0e, 0x08, 0x08, 0x40, 0x08, +0x08, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3f, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x72, 0x37, 0x08, 0x08, 0x08, 0x74, +0x3e, 0x02, 0x02, 0x75, 0x39, 0x76, 0x02, 0x02, 0xbb, 0x04, 0x08, 0x1a, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x08, +0x00, 0x00, 0x80, 0x3f, 0x3e, 0x0a, 0x01, 0x09, 0x39, 0x8d, 0x01, 0x02, 0x01, 0xbe, 0x02, 0x68, 0x08, 0x0e, 0x3e, 0x02, +0x02, 0xc2, 0x01, 0x39, 0xc3, 0x01, 0x02, 0x02, 0xec, 0x04, 0x09, 0x0c, 0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, +0x3e, 0x06, 0x02, 0x0e, 0xbb, 0x04, 0x08, 0x16, 0xcd, 0xcc, 0x4c, 0x3f, 0x3e, 0x70, 0x03, 0x09, 0x39, 0x90, 0x02, 0x02, +0x03, 0xad, 0x06, 0x09, 0xd4, 0x02, 0xad, 0x06, 0x08, 0x02, 0xad, 0x06, 0x0e, 0x02, 0xc6, 0x06, 0x02, 0xf1, 0x06, 0x00, +0x03, 0x18, 0x02, 0x01, 0x09, 0x8e, 0x05, 0xfc, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x13, 0x4b, 0xb0, 0x01, 0x77, +0x49, 0x01, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x5d, 0x54, 0x00, 0xc1, 0x0a, 0x08, 0x02, 0x56, 0x01, 0xc1, 0x0a, 0x08, +0x02, 0x58, 0x02, 0xe0, 0x0a, 0x09, 0x02, 0x06, 0x04, 0x02, 0xe4, 0x03, 0xc1, 0x12, 0x09, 0x02, 0x55, 0x02, 0x2d, 0x6e, +0x04, 0x04, 0x04, 0x20, 0x5c, 0x08, 0x02, 0x01, 0x42, 0xfd, 0x02, 0x13, 0x69, 0x04, 0xc4, 0x01, 0x49, 0x01, 0x08, 0x02, +0x02, 0xca, 0x16, 0x12, 0x02, 0x08, 0x02, 0xa7, 0x1e, 0x3b, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x05, 0x18, 0x02, 0x99, 0x1e, +0x39, 0x18, 0x04, 0x13, 0xcd, 0x01, 0x02, 0xc4, 0x01, 0x51, 0x01, 0x0e, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x02, 0x02, 0x00, +0xc1, 0x0a, 0x08, 0x02, 0x04, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x06, 0x02, 0xe0, 0x0a, 0x09, 0x02, 0x06, 0x04, 0x02, 0x86, +0x04, 0x4a, 0x08, 0x08, 0x1c, 0xee, 0x02, 0xca, 0x16, 0x12, 0x06, 0x28, 0x06, 0xa7, 0x1e, 0x19, 0x00, 0xba, 0x1e, 0x00, +0x01, 0x19, 0x18, 0x02, 0xc3, 0x10, 0x08, 0x06, 0x30, 0x0e, 0xc3, 0x10, 0x08, 0x08, 0x32, 0x16, 0xc8, 0x10, 0x08, 0x02, +0x0a, 0x02, 0xc3, 0x10, 0x08, 0x02, 0xa8, 0x04, 0x02, 0xd2, 0x0a, 0x09, 0x74, 0x74, 0x96, 0x01, 0x03, 0x99, 0x1e, 0x6e, +0x18, 0x6d, 0xe5, 0x1e, 0x09, 0x76, 0x8b, 0x01, 0x00, 0x00, 0x85, 0x01, 0x00, 0x00, 0xd6, 0x01, 0x00, 0x00, 0x93, 0x01, +0x00, 0x00, 0x99, 0x1e, 0x74, 0x18, 0x73, 0xe5, 0x1e, 0x09, 0x72, 0xca, 0x00, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0xda, +0x01, 0x00, 0x00, 0x9f, 0x01, 0x00, 0x00, 0x80, 0x0b, 0x16, 0x0b, 0x0b, 0x30, 0x2e, 0x2e, 0x2e, 0x2c, 0xc1, 0x0a, 0x09, +0x27, 0x27, 0x00, 0x80, 0x0b, 0x16, 0x04, 0x04, 0x0c, 0x0a, 0x0a, 0x0a, 0x08, 0xc1, 0x0a, 0x09, 0x21, 0x21, 0x00, 0x22, +0xbe, 0x02, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x98, 0x00, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, +0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xcf, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, +0xa0, 0x02, 0x04, 0x07, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xc6, 0x06, 0x02, 0x02, 0x00, 0x03, 0x18, 0x02, 0x8d, +0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, +0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x23, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, -0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xaf, 0x0f, 0x00, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x85, 0x01, 0xa0, 0x01, -0xa2, 0x01, 0xaf, 0x01, 0xbf, 0x01, 0xc8, 0x01, 0x10, 0x92, 0x01, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, -0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, -0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, 0x00, -0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, 0x42, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, -0x02, 0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x83, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, -0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, -0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, -0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, -0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x00, -0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, -0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, -0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, -0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, +0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x9c, 0x01, 0xe7, 0x03, +0xa0, 0x02, 0x04, 0x07, 0x37, 0x30, 0x06, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, +0x22, 0x00, 0x00, 0x03, 0x00, 0x10, 0x9c, 0x01, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, +0x06, 0x10, 0x37, 0x02, 0x83, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, +0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, +0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, +0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, +0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, +0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, +0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, +0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x3a, 0x1e, 0x04, 0x00, 0x5a, 0x00, +0x00, 0x70, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x04, +0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x22, 0x00, 0x10, 0x00, 0x22, 0x01, 0x10, 0x00, 0x21, 0x06, 0x00, 0x02, +0x00, 0x00, 0x0a, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, +0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x08, 0x00, +0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, +0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x37, 0x24, 0x04, 0x00, 0x00, 0x00, 0x23, 0x00, 0x01, 0x00, 0x00, 0x23, 0x10, +0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x00, 0x98, 0x01, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x00, +0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0c, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0e, 0x00, 0x00, +0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x28, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x14, 0x00, 0x00, 0x01, 0x00, +0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, 0x20, 0xb7, 0x02, 0x02, +0x08, 0x04, 0xb8, 0x02, 0x02, 0x09, 0x04, 0xb7, 0x02, 0x08, 0x08, 0x03, 0x94, 0x02, 0x0c, 0xfe, 0x02, 0x08, 0x09, 0x09, +0x08, 0x08, 0x08, 0x0e, 0x3e, 0x18, 0x07, 0x09, 0x3e, 0x02, 0x07, 0x0e, 0xc1, 0x04, 0x02, 0x09, 0x24, 0x25, 0xb5, 0x02, +0x32, 0x20, 0x01, 0xb8, 0x02, 0x10, 0x0e, 0x03, 0xb5, 0x02, 0x02, 0x20, 0x00, 0xbb, 0x04, 0x3f, 0x12, 0x00, 0x00, 0x00, +0x00, 0x3e, 0x04, 0x02, 0x0a, 0xbb, 0x04, 0x3f, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x47, 0xbb, 0x04, 0x3f, +0x16, 0x03, 0x00, 0x00, 0x00, 0x3e, 0x18, 0x02, 0x08, 0xbb, 0x04, 0x48, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, +0x0a, 0x74, 0xb7, 0x02, 0x02, 0x08, 0x02, 0xb7, 0x02, 0x02, 0x48, 0x03, 0xbb, 0x04, 0x48, 0x02, 0x09, 0x00, 0x00, 0x00, +0xbc, 0x02, 0x02, 0x0e, 0x78, 0xbc, 0x02, 0x02, 0x09, 0x74, 0xbb, 0x04, 0x48, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, +0x02, 0x09, 0x7b, 0xae, 0x83, 0x80, 0x02, 0x02, 0x0a, 0x0a, 0x0a, 0x0a, 0x75, 0x0a, 0x0a, 0x09, 0x76, 0x08, 0x08, 0x09, +0x09, 0x76, 0x76, 0x08, 0x08, 0x76, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x77, 0x3f, 0x76, 0x08, 0x08, +0x79, 0x0e, 0x08, 0x09, 0x09, 0x76, 0x3f, 0x08, 0x09, 0x3f, 0x08, 0x76, 0x08, 0x08, 0x08, 0x48, 0x0e, 0x08, 0x08, 0x48, +0x08, 0x08, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x47, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x7a, 0x3f, 0x08, 0x08, 0x08, +0x7c, 0x3e, 0x02, 0x02, 0x7d, 0x39, 0x7e, 0x02, 0x02, 0x3e, 0x0a, 0x02, 0x09, 0xbb, 0x04, 0x48, 0x16, 0x03, 0x00, 0x00, +0x00, 0xbb, 0x04, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x08, 0x00, 0x00, 0x80, 0x3f, 0x3e, 0x0a, 0x01, +0x09, 0x39, 0x9b, 0x01, 0x02, 0x01, 0x3e, 0x44, 0x07, 0x08, 0xbb, 0x04, 0x3f, 0x0a, 0x35, 0x00, 0x00, 0x00, 0xbb, 0x04, +0x3f, 0x12, 0x30, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x0e, 0xbb, 0x04, 0x3f, 0x08, 0x34, 0x00, 0x00, 0x00, 0xbb, 0x04, +0x48, 0x08, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x48, 0x0a, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x0c, 0x0a, 0xd7, +0xa3, 0x3a, 0xbb, 0x04, 0x48, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x1e, 0x31, 0x00, 0x00, 0x00, 0xbb, 0x04, +0x3f, 0x1a, 0x32, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x0a, 0x36, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x06, 0x37, 0x00, +0x00, 0x00, 0xbb, 0x04, 0x3f, 0x10, 0x3a, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x08, 0x3b, 0x00, 0x00, 0x00, 0xbb, 0x04, +0x3f, 0x0c, 0x33, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x48, 0xbb, 0x04, 0x3f, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x89, 0x03, +0x16, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0xab, 0x02, 0x02, 0xb6, 0x02, 0x3e, 0x02, 0x00, 0xb7, 0x02, 0x39, 0xb8, +0x02, 0x02, 0x00, 0xbb, 0x04, 0x3f, 0x14, 0x1e, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x0e, 0x39, 0x00, 0x00, 0x00, 0xbb, +0x04, 0x3f, 0x12, 0x38, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x16, 0x23, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x14, 0x21, +0x00, 0x00, 0x00, 0xbe, 0x02, 0x62, 0x08, 0x0e, 0x3e, 0x02, 0x02, 0x99, 0x03, 0x39, 0x9a, 0x03, 0x02, 0x02, 0xec, 0x04, +0x09, 0x0c, 0x9e, 0x04, 0x9e, 0x04, 0x9e, 0x04, 0x9e, 0x04, 0xbb, 0x04, 0x08, 0x1a, 0xcd, 0xcc, 0x4c, 0x3f, 0x3e, 0x70, +0x03, 0x09, 0x39, 0xe6, 0x03, 0x02, 0x03, 0xbb, 0x04, 0x3f, 0x0e, 0x3c, 0x00, 0x00, 0x00, 0xad, 0x06, 0x09, 0xea, 0x02, +0xad, 0x06, 0x08, 0x02, 0xad, 0x06, 0x0e, 0x02, 0xc6, 0x06, 0x02, 0xc1, 0x0a, 0x00, 0x03, 0x18, 0x02, 0x39, 0x24, 0xdc, +0x07, 0x07, 0x39, 0x25, 0x04, 0x07, 0x01, 0x09, 0x6e, 0xa0, 0x06, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x13, 0x53, 0xb0, +0x01, 0x7f, 0x51, 0x01, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x5d, 0x54, 0x00, 0xc1, 0x0a, 0x08, 0x02, 0x56, 0x01, 0xc1, +0x0a, 0x08, 0x02, 0x58, 0x02, 0xe0, 0x0a, 0x09, 0x02, 0x06, 0x04, 0x02, 0x88, 0x07, 0xc1, 0x12, 0x09, 0x02, 0x55, 0x02, +0x2d, 0x76, 0x04, 0x04, 0x04, 0x20, 0x5c, 0x08, 0x02, 0x01, 0x42, 0xdd, 0x04, 0x13, 0x71, 0x04, 0x9b, 0x03, 0x51, 0x01, +0x08, 0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x08, 0x02, 0xa7, 0x1e, 0x3b, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x05, 0x18, 0x02, +0x99, 0x1e, 0x39, 0x18, 0x04, 0x13, 0xcd, 0x01, 0x02, 0x9b, 0x03, 0x59, 0x01, 0x0e, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x02, +0x02, 0x00, 0xc1, 0x0a, 0x08, 0x02, 0x04, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x06, 0x02, 0xe0, 0x0a, 0x09, 0x02, 0x06, 0x04, +0x02, 0xaa, 0x07, 0x4a, 0x08, 0x08, 0x1c, 0x82, 0x03, 0xca, 0x16, 0x14, 0x06, 0x28, 0x06, 0xa7, 0x1e, 0x19, 0x00, 0xba, +0x1e, 0x00, 0x01, 0x19, 0x18, 0x02, 0xc3, 0x10, 0x08, 0x06, 0x30, 0x0e, 0xc3, 0x10, 0x08, 0x08, 0x32, 0x16, 0xc8, 0x10, +0x08, 0x02, 0x0a, 0x02, 0xc3, 0x10, 0x08, 0x02, 0xcc, 0x07, 0x02, 0xd2, 0x0a, 0x09, 0x82, 0x01, 0x82, 0x01, 0xa4, 0x01, +0x03, 0x99, 0x1e, 0x7c, 0x18, 0x7b, 0xe5, 0x1e, 0x09, 0x90, 0x01, 0x6b, 0x02, 0x00, 0x00, 0x65, 0x02, 0x00, 0x00, 0xbd, +0x02, 0x00, 0x00, 0x73, 0x02, 0x00, 0x00, 0x99, 0x1e, 0x8e, 0x01, 0x18, 0x8d, 0x01, 0xe5, 0x1e, 0x09, 0x8c, 0x01, 0xa1, +0x01, 0x00, 0x00, 0x63, 0x02, 0x00, 0x00, 0xc7, 0x02, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0x80, 0x0b, 0x18, 0x17, 0x17, +0x2e, 0x2c, 0x2c, 0x2c, 0x2a, 0xc1, 0x0a, 0x09, 0x25, 0x25, 0x00, 0x80, 0x0b, 0x18, 0x04, 0x04, 0x0c, 0x0a, 0x0a, 0x0a, +0x08, 0xc1, 0x0a, 0x09, 0x31, 0x31, 0x00, 0x22, 0xd2, 0x02, 0x00, 0x23, 0x84, 0x01, 0x1e, 0x7f, 0x59, 0x65, 0x01, 0x09, +0x02, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc3, 0x10, 0x0e, 0xe7, 0x02, 0x7f, 0xe7, 0x02, 0x13, 0x5a, 0x04, 0x7f, +0xee, 0x03, 0x01, 0x47, 0x02, 0x02, 0xc1, 0x12, 0x0e, 0x04, 0x04, 0x0a, 0x01, 0x09, 0x04, 0x1a, 0x22, 0x02, 0x00, 0x22, +0x01, 0x04, 0xd9, 0x06, 0x09, 0x06, 0x9c, 0x07, 0x08, 0x04, 0x22, 0x20, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0xc6, 0x06, 0x09, +0x9b, 0x07, 0x00, 0x26, 0xa7, 0x06, 0x24, 0x03, 0xa7, 0x06, 0x25, 0x02, 0x18, 0x04, 0x01, 0x0e, 0xac, 0x02, 0xb0, 0x02, +0x5c, 0x08, 0x02, 0x01, 0x42, 0xc0, 0x01, 0x13, 0x71, 0x06, 0x7f, 0xc3, 0x01, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x14, +0x02, 0x0a, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x01, 0x09, 0x04, 0xc4, 0x02, 0x9e, +0x1e, 0xc9, 0x00, 0x00, 0x00, 0x18, 0x01, 0x13, 0xcd, 0x01, 0x0c, 0x7f, 0xcc, 0x01, 0x01, 0x0e, 0x02, 0x02, 0x13, 0x71, +0x06, 0x7f, 0xd1, 0x01, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x08, 0x10, 0x02, 0x13, 0xbe, 0x01, 0x08, 0x28, 0xda, +0x01, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x02, 0x14, 0x02, 0x5c, 0x08, 0x04, 0x01, 0x04, 0xdd, 0x01, 0xca, 0x16, 0x14, +0x04, 0x04, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0xc1, 0x0a, 0x08, 0x0c, 0x32, 0x00, +0xc1, 0x0a, 0x08, 0x04, 0x36, 0x01, 0xc3, 0x10, 0x08, 0x04, 0x04, 0x1e, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xec, 0x01, 0x4a, +0x08, 0x02, 0x0c, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x30, 0x02, 0xc8, 0x10, 0x08, 0x04, 0x04, 0x28, 0x99, 0x1e, 0x1c, 0x18, +0x1b, 0xe5, 0x1e, 0x08, 0xca, 0x07, 0xd7, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xe2, 0x00, +0x00, 0x00, 0x13, 0x71, 0xa3, 0x07, 0x7f, 0xf5, 0x01, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x6e, 0x02, 0x6c, +0x08, 0x02, 0x01, 0x28, 0xf8, 0x01, 0x92, 0x01, 0x4a, 0x08, 0x02, 0x9b, 0x07, 0x02, 0x3f, 0x08, 0x06, 0x06, 0x5c, 0x08, +0x02, 0x01, 0x1b, 0xfd, 0x01, 0xc3, 0x10, 0x08, 0x06, 0xd6, 0x01, 0x06, 0x13, 0x71, 0x04, 0x7f, 0x82, 0x02, 0x01, 0x08, +0x02, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x25, 0x81, 0x02, 0x84, 0x02, 0x13, 0xcd, 0x01, 0x06, 0x7f, 0x87, 0x02, 0x01, 0x0e, +0x02, 0x02, 0x13, 0x71, 0x04, 0x7f, 0x8a, 0x02, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x02, 0xf6, 0x01, 0xa7, +0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x13, 0x71, 0x0a, 0x7f, 0x92, 0x02, 0x01, 0x08, 0x02, 0x02, +0x4a, 0x08, 0x02, 0xa8, 0x01, 0x02, 0x13, 0x71, 0x04, 0x7f, 0x96, 0x02, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, +0x08, 0x02, 0x13, 0x9d, 0x02, 0x0a, 0x7f, 0x9c, 0x02, 0x01, 0x48, 0x02, 0x02, 0x5c, 0x76, 0x02, 0x01, 0x3e, 0x9f, 0x02, +0xc1, 0x0a, 0x08, 0x06, 0x06, 0x01, 0xc1, 0x0a, 0x08, 0x04, 0x0a, 0x00, 0x7c, 0x08, 0x04, 0x01, 0x2b, 0x99, 0x02, 0x92, +0x01, 0x96, 0x01, 0x7c, 0x08, 0x02, 0x01, 0x2e, 0xa3, 0x02, 0xa5, 0x02, 0xa7, 0x02, 0x13, 0x53, 0x08, 0x7f, 0xab, 0x02, +0x01, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x09, 0x02, 0x02, 0x00, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, 0x09, 0x02, +0x06, 0x01, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, 0x09, 0x02, 0x0a, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, +0xd0, 0x0a, 0x47, 0x02, 0x0a, 0x06, 0x02, 0xb4, 0x0a, 0x47, 0x02, 0x34, 0x01, 0x00, 0x00, 0x01, 0xb7, 0x02, 0x0a, 0x02, +0x01, 0x0e, 0x04, 0xa8, 0x04, 0xc1, 0x12, 0x0e, 0x02, 0x10, 0x02, 0xe8, 0x0a, 0x09, 0x04, 0x0a, 0x04, 0x02, 0xa8, 0x02, +0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x4a, 0x0e, 0x04, 0x72, 0x04, 0x99, 0x1e, 0x66, 0x18, 0x65, 0xe5, 0x1e, 0x0e, 0xf4, +0x06, 0x09, 0x01, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x13, 0x71, 0x89, +0x06, 0x7f, 0xc3, 0x02, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x04, 0x04, 0x84, 0x01, 0xce, 0x10, 0x0e, 0x04, 0xff, 0x05, +0x04, 0x13, 0x71, 0x04, 0x7f, 0xca, 0x02, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x02, 0xf6, 0x02, 0xa7, 0x1e, +0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x13, 0x71, 0x0c, 0x7f, 0xd3, 0x02, 0x01, 0x08, 0x02, 0x02, 0xc3, +0x10, 0x08, 0x02, 0xaa, 0x02, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x28, 0xd6, 0x02, 0x92, 0x01, 0x4a, 0x08, 0x02, 0xdf, 0x05, +0x02, 0x3f, 0x08, 0x06, 0x06, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xdb, 0x02, 0x13, 0x84, 0x01, 0x06, 0x7f, 0xde, 0x02, 0x01, +0x09, 0x02, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x23, 0x71, 0x02, 0x7f, 0xde, 0x02, 0x8f, 0x01, 0x01, 0x08, 0x02, +0x02, 0xce, 0x10, 0x0e, 0x02, 0x06, 0x02, 0x01, 0x0e, 0x04, 0xfc, 0x04, 0x5c, 0x0e, 0x02, 0x01, 0x45, 0xe6, 0x02, 0x13, +0xcd, 0x01, 0x04, 0x7f, 0xe8, 0x02, 0x01, 0x0e, 0x02, 0x02, 0xc4, 0x12, 0x08, 0x02, 0x08, 0x02, 0x6c, 0x08, 0x02, 0x01, +0x28, 0xeb, 0x02, 0x92, 0x01, 0x6c, 0x08, 0x0a, 0x01, 0x1a, 0xec, 0x02, 0xcc, 0x02, 0xc3, 0x10, 0x08, 0x08, 0xbe, 0x03, +0x32, 0x4a, 0x08, 0x02, 0x0a, 0x02, 0xce, 0x10, 0x0e, 0x02, 0x26, 0x02, 0x4b, 0x0e, 0x04, 0x60, 0x04, 0x99, 0x1e, 0x54, +0x18, 0x53, 0xe5, 0x1e, 0x0e, 0xf8, 0x05, 0x49, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x79, 0x01, 0x00, 0x00, 0x4e, +0x01, 0x00, 0x00, 0x01, 0x09, 0xa1, 0x05, 0xa6, 0x05, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc3, 0x10, 0x08, 0x04, 0xce, +0x03, 0xf0, 0x01, 0xce, 0x10, 0x0e, 0x02, 0x06, 0x02, 0x4b, 0x0e, 0x04, 0x04, 0x95, 0x05, 0x13, 0xbe, 0x01, 0x02, 0x27, +0xe6, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x04, 0x00, 0x22, 0x02, 0x00, 0x13, 0xbe, 0x01, 0x02, 0x27, 0xda, 0x01, 0xc1, 0x0a, +0x08, 0x02, 0x08, 0x01, 0x22, 0x02, 0x00, 0x13, 0xbe, 0x01, 0x02, 0x27, 0xd5, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x0c, 0x02, +0x22, 0x02, 0x00, 0x01, 0x09, 0x02, 0xc0, 0x05, 0x9e, 0x1e, 0x87, 0x01, 0x00, 0x00, 0x88, 0x06, 0x80, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xa7, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, +0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, +0xa5, 0xf3, 0x06, 0x00, 0x53, 0x5a, 0xa0, 0x02, 0x04, 0x07, 0x10, 0x2e, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, +0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, +0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, 0x6c, 0x1e, 0x00, 0x10, 0x0e, 0x1e, 0x07, +0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xb5, 0x02, 0x0a, 0x20, 0x01, 0xa6, 0x02, 0x0c, 0x20, 0xb7, 0x02, 0x02, 0x0e, +0x04, 0xb8, 0x02, 0x02, 0x0f, 0x04, 0xb7, 0x02, 0x06, 0x0e, 0x03, 0xb8, 0x02, 0x02, 0x13, 0x03, 0xb5, 0x02, 0x02, 0x20, +0x00, 0xbb, 0x04, 0x15, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x0f, 0x16, 0x8e, 0x03, 0x02, 0x10, 0x14, 0x08, +0x08, 0x08, 0x0e, 0x17, 0xbb, 0x04, 0x15, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x18, 0x19, 0xae, 0x02, 0x02, +0x1a, 0x3e, 0x02, 0x02, 0x1b, 0x39, 0x1c, 0x02, 0x02, 0xbb, 0x04, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x1e, 0x02, +0x08, 0xbb, 0x04, 0x08, 0x14, 0x04, 0x00, 0x00, 0x00, 0xb7, 0x02, 0x1a, 0x0e, 0x02, 0x3e, 0x1c, 0x03, 0x44, 0x39, 0x52, +0x02, 0x03, 0xbb, 0x04, 0x15, 0x06, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x03, 0x0e, 0x3e, 0x04, 0x01, 0x0f, 0x39, 0x59, +0x02, 0x01, 0xbb, 0x04, 0x15, 0x02, 0x02, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x01, 0x0e, 0xbb, 0x04, 0x15, 0x06, 0x03, 0x00, +0x00, 0x00, 0xbb, 0x04, 0x15, 0x08, 0x01, 0x00, 0x00, 0x00, 0xad, 0x06, 0x08, 0x86, 0x01, 0xc6, 0x06, 0x02, 0xc3, 0x02, +0x00, 0x03, 0x18, 0x02, 0x33, 0x2d, 0xb8, 0x02, 0x1d, 0x1e, 0xa6, 0x01, 0x37, 0x01, 0x08, 0x02, 0x02, 0xbc, 0x0e, 0x0e, +0x99, 0x01, 0x99, 0x01, 0x13, 0x57, 0x06, 0x53, 0x56, 0x22, 0x00, 0x06, 0x13, 0x5c, 0x0a, 0x5a, 0x5b, 0x01, 0x0e, 0x02, +0x02, 0x13, 0x5c, 0x04, 0x5a, 0x5f, 0x01, 0x0e, 0x02, 0x02, 0xc8, 0x10, 0x0e, 0x02, 0x08, 0x02, 0x13, 0x57, 0x04, 0x53, +0x63, 0x22, 0x00, 0x04, 0x8d, 0x1e, 0x88, 0x06, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, +0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, +0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, +0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xdf, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0xfc, 0x01, 0xa0, 0x02, +0x04, 0x07, 0x00, 0xf8, 0x03, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, +0x20, 0xb7, 0x02, 0x02, 0x08, 0x04, 0xbb, 0x04, 0x08, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0xec, 0x04, 0x09, 0x8c, 0x01, +0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0x3e, 0x74, 0x03, 0x09, 0x39, 0xfb, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, +0xef, 0x03, 0x00, 0x03, 0x18, 0x02, 0x22, 0xed, 0x03, 0xf7, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, +0x54, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, +0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x16, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, +0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xbf, 0x0f, +0x00, 0x02, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x24, 0x06, 0x10, 0x37, +0x0d, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, +0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x10, 0x06, 0x80, 0x02, +0x47, 0x0d, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x02, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x00, 0x13, 0x0e, +0x10, 0x00, 0x1e, 0x08, 0x10, 0x16, 0x01, 0x08, 0x10, 0x0c, 0x06, 0x40, 0x10, 0x02, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, +0x10, 0x02, 0x06, 0x10, 0x37, 0x0f, 0x83, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, +0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, +0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, +0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, +0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x08, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, +0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, +0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, +0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, +0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, +0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x16, -0x1e, 0x00, 0x00, 0x36, 0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x04, 0x0b, 0x2b, 0x10, 0x1a, 0x1e, 0x04, 0x10, 0x20, 0x1e, -0x07, 0x47, 0x0e, 0x02, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x00, 0x00, 0x02, 0x93, 0x02, 0x02, 0xa1, 0x04, -0x02, 0x02, 0xa6, 0x02, 0x06, 0x20, 0xb7, 0x02, 0x02, 0x06, 0x04, 0xb8, 0x02, 0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, 0x06, -0x03, 0xae, 0x02, 0x24, 0x07, 0xb5, 0x02, 0x1a, 0x20, 0x00, 0xbb, 0x04, 0x28, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, -0x04, 0x20, 0x01, 0xbb, 0x04, 0x2b, 0x02, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x28, 0x06, 0x01, 0x00, 0x00, 0x00, 0xbb, -0x04, 0x28, 0x0a, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x26, 0x09, 0x03, 0xbb, 0x04, 0x28, 0x02, 0x08, 0x00, 0x00, 0x00, -0xbc, 0x02, 0x02, 0x07, 0x48, 0x8e, 0x03, 0x02, 0x08, 0x47, 0x2b, 0x2b, 0x2b, 0x06, 0x49, 0xbb, 0x04, 0x28, 0x02, 0x40, -0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x4a, 0x4b, 0xae, 0x02, 0x02, 0x4c, 0x3e, 0x02, 0x02, 0x4d, 0x39, 0x4e, 0x02, 0x02, -0x3e, 0x04, 0x02, 0x08, 0xbb, 0x04, 0x2b, 0x28, 0x04, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x28, 0x14, 0x04, 0x00, 0x00, 0x00, -0xbc, 0x02, 0x02, 0x08, 0x6f, 0xb7, 0x02, 0x02, 0x06, 0x02, 0xb7, 0x02, 0x02, 0x28, 0x03, 0xbb, 0x04, 0x28, 0x02, 0x09, -0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, 0x73, 0xbc, 0x02, 0x02, 0x07, 0x6f, 0xbb, 0x04, 0x28, 0x02, 0x28, 0x00, 0x00, -0x00, 0xbc, 0x02, 0x02, 0x07, 0x76, 0xae, 0x83, 0x80, 0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x70, 0x08, 0x08, 0x07, 0x71, -0x06, 0x06, 0x07, 0x07, 0x71, 0x71, 0x06, 0x06, 0x71, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x72, 0x2b, -0x71, 0x06, 0x06, 0x74, 0x09, 0x06, 0x07, 0x07, 0x71, 0x2b, 0x06, 0x07, 0x2b, 0x06, 0x71, 0x06, 0x06, 0x06, 0x28, 0x09, -0x06, 0x06, 0x28, 0x06, 0x06, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x47, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x75, 0x2b, -0x06, 0x06, 0x06, 0x77, 0x3e, 0x02, 0x02, 0x78, 0x39, 0x79, 0x02, 0x02, 0x3e, 0x14, 0x01, 0x07, 0x39, 0x84, 0x01, 0x02, -0x01, 0x3e, 0x34, 0x03, 0x2b, 0x39, 0x9f, 0x01, 0x02, 0x03, 0x3e, 0x02, 0x01, 0x2b, 0x39, 0xa1, 0x01, 0x02, 0x01, 0x3e, -0x18, 0x03, 0x07, 0x39, 0xae, 0x01, 0x02, 0x03, 0x3e, 0x08, 0x03, 0x06, 0x39, 0xae, 0x01, 0x18, 0x03, 0xbe, 0x02, 0x0e, -0x07, 0x06, 0x3e, 0x02, 0x03, 0xc6, 0x01, 0x39, 0xc7, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0x87, 0x03, 0x00, 0x03, 0x18, -0x02, 0x01, 0x2b, 0xbc, 0x02, 0x02, 0x22, 0x06, 0x00, 0x01, 0x2b, 0x02, 0x08, 0x33, 0x51, 0x6e, 0x4f, 0x2c, 0xa4, 0x01, -0x2c, 0x01, 0x08, 0x02, 0x02, 0x01, 0x07, 0x7e, 0xac, 0x02, 0xc1, 0x12, 0x07, 0x0f, 0x6e, 0x0f, 0xb0, 0x0a, 0x1b, 0x32, -0x32, 0xc1, 0x0a, 0x07, 0x0d, 0x0d, 0x00, 0x3d, 0x09, 0xe5, 0x01, 0xe5, 0x01, 0xe5, 0x01, 0x18, 0x13, 0xb3, 0x01, 0x04, -0xaf, 0x01, 0x29, 0xc1, 0x0a, 0x06, 0x02, 0x06, 0x00, 0x22, 0x02, 0x00, 0x13, 0xb3, 0x01, 0x02, 0xaf, 0x01, 0x2f, 0xc1, -0x0a, 0x06, 0x02, 0x0a, 0x01, 0x22, 0x02, 0x00, 0x13, 0xb3, 0x01, 0x02, 0xaf, 0x01, 0x34, 0xc1, 0x0a, 0x06, 0x02, 0x0e, -0x02, 0x22, 0x02, 0x00, 0x23, 0x51, 0xcc, 0x01, 0x7a, 0x65, 0x2c, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0xc3, 0x01, -0xc3, 0x01, 0xcd, 0x01, 0x22, 0x01, 0x00, 0xc1, 0x0a, 0x06, 0x0a, 0x0a, 0x01, 0x3f, 0x06, 0x02, 0x02, 0xd2, 0x0a, 0x07, -0xd6, 0x01, 0xd6, 0x01, 0xe2, 0x01, 0x01, 0x13, 0xae, 0x01, 0xc9, 0x01, 0xc8, 0x01, 0x2c, 0x22, 0x00, 0xc9, 0x01, 0x8d, -0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, -0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x13, 0x00, 0x00, +0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x02, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x17, 0x1e, 0x00, 0x10, +0x02, 0x0b, 0x2b, 0x10, 0x02, 0x1e, 0x04, 0x10, 0x02, 0x1e, 0x07, 0x10, 0x02, 0x0b, 0x03, 0x47, 0x12, 0x02, 0x00, 0x0b, +0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x00, 0x00, 0x02, 0x93, 0x02, 0x2e, 0xa1, 0x04, 0x02, 0x18, 0xa6, 0x02, 0x02, 0x20, +0xb7, 0x02, 0x02, 0x1a, 0x04, 0xb8, 0x02, 0x02, 0x1b, 0x04, 0xb7, 0x02, 0x02, 0x1a, 0x03, 0xae, 0x02, 0x25, 0x1b, 0xb5, +0x02, 0x28, 0x20, 0x00, 0xbb, 0x04, 0x1e, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x02, 0x20, 0x01, 0xbb, 0x04, 0x20, +0x02, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x1e, 0x02, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x20, 0x02, 0x01, 0x00, 0x00, +0x00, 0xbb, 0x04, 0x1e, 0x02, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x02, 0x1d, 0x03, 0xbb, 0x04, 0x1e, 0x02, 0x08, 0x00, +0x00, 0x00, 0xbc, 0x02, 0x27, 0x1b, 0x26, 0x8e, 0x03, 0x0d, 0x1c, 0x25, 0x20, 0x20, 0x20, 0x1a, 0x12, 0xbb, 0x04, 0x1e, +0x38, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x27, 0x0b, 0x27, 0xae, 0x02, 0x0d, 0x13, 0x3e, 0x38, 0x02, 0x0c, 0x39, 0x28, +0x35, 0x02, 0x3e, 0x38, 0x02, 0x1c, 0xbb, 0x04, 0x20, 0x02, 0x04, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x20, 0x02, 0x05, 0x00, +0x00, 0x00, 0x3e, 0x02, 0x03, 0x20, 0x39, 0x2c, 0x51, 0x03, 0xb2, 0x06, 0x20, 0x16, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, +0x1e, 0x3e, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x31, 0x1c, 0x2d, 0xb7, 0x02, 0x34, 0x1a, 0x02, 0xb7, 0x02, 0x02, 0x1e, +0x03, 0xbb, 0x04, 0x1e, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x35, 0x1d, 0x30, 0xbc, 0x02, 0x02, 0x1b, 0x2d, 0xbb, +0x04, 0x1e, 0x36, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x33, 0x1b, 0x31, 0xae, 0x83, 0x80, 0x02, 0x0f, 0x1c, 0x1c, 0x1c, +0x1c, 0x14, 0x1c, 0x1c, 0x1b, 0x2e, 0x1a, 0x1a, 0x1b, 0x1b, 0x2e, 0x2e, 0x1a, 0x1a, 0x2e, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, +0x1a, 0x1a, 0x1a, 0x1b, 0x2f, 0x20, 0x2e, 0x1a, 0x1a, 0x15, 0x1d, 0x1a, 0x1b, 0x1b, 0x2e, 0x20, 0x1a, 0x1b, 0x20, 0x1a, +0x2e, 0x1a, 0x1a, 0x1a, 0x1e, 0x1d, 0x1a, 0x1a, 0x1e, 0x1a, 0x1a, 0x1d, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x25, 0x1c, 0x1c, +0x1a, 0x1a, 0x1a, 0x1a, 0x16, 0x20, 0x1a, 0x1a, 0x1a, 0x17, 0x3e, 0x46, 0x02, 0x0f, 0x39, 0x32, 0x43, 0x02, 0x3e, 0x46, +0x01, 0x1b, 0x39, 0x33, 0x5d, 0x01, 0xbb, 0x04, 0x1a, 0x60, 0x0a, 0xd7, 0x23, 0x3c, 0x3e, 0x02, 0x01, 0x20, 0x39, 0x35, +0x5f, 0x01, 0x3e, 0x62, 0x03, 0x1b, 0x39, 0x36, 0x5f, 0x03, 0x3e, 0x62, 0x03, 0x1a, 0x39, 0x36, 0x5f, 0x03, 0xbb, 0x04, +0x1a, 0x62, 0x00, 0x00, 0x00, 0x40, 0xbb, 0x04, 0x1a, 0x02, 0x00, 0x00, 0x80, 0xbf, 0xbb, 0x04, 0x1a, 0x02, 0x00, 0x00, +0x80, 0x3f, 0xbc, 0x02, 0x02, 0x1a, 0x24, 0x3e, 0x02, 0x03, 0x3b, 0x39, 0x3c, 0x67, 0x03, 0xbe, 0x02, 0x12, 0x1b, 0x1a, +0x3e, 0x58, 0x03, 0x11, 0x39, 0x3d, 0x67, 0x03, 0xc6, 0x06, 0x18, 0x0d, 0x00, 0x19, 0x18, 0x78, 0x01, 0x20, 0x02, 0x74, +0x22, 0x78, 0x00, 0x01, 0x20, 0x02, 0x7a, 0xc7, 0x10, 0x20, 0x02, 0x02, 0x66, 0x33, 0x29, 0x02, 0x0d, 0x21, 0x41, 0x21, +0x01, 0x1c, 0x02, 0x02, 0x01, 0x1b, 0x02, 0x80, 0x01, 0xc1, 0x12, 0x1b, 0x02, 0x04, 0x02, 0x01, 0x20, 0x02, 0x86, 0x01, +0xcb, 0x10, 0x20, 0x02, 0x02, 0x72, 0x23, 0x29, 0x02, 0x10, 0x2a, 0x47, 0x01, 0x1c, 0x02, 0x02, 0xc1, 0x12, 0x1b, 0x02, +0x02, 0x0a, 0xd2, 0x0a, 0x1b, 0x02, 0x2e, 0x02, 0x02, 0x13, 0x29, 0x02, 0x10, 0x2b, 0x01, 0x1c, 0x02, 0x02, 0xc1, 0x12, +0x1b, 0x02, 0x02, 0x06, 0xb0, 0x0a, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x1b, 0x02, 0x02, 0x00, 0x3d, 0x1d, 0x02, 0x02, 0x02, +0x18, 0x13, 0x37, 0x02, 0x06, 0x1f, 0xc1, 0x0a, 0x1a, 0x02, 0x04, 0x00, 0x22, 0x02, 0x00, 0x13, 0x37, 0x02, 0x06, 0x22, +0xc1, 0x0a, 0x1a, 0x02, 0x08, 0x01, 0x22, 0x02, 0x00, 0x13, 0x37, 0x02, 0x06, 0x24, 0xc1, 0x0a, 0x1a, 0x02, 0x0c, 0x02, +0x22, 0x02, 0x00, 0x01, 0x20, 0x02, 0xaa, 0x01, 0xcb, 0x10, 0x20, 0x02, 0x02, 0x96, 0x01, 0x23, 0x29, 0x02, 0x10, 0x2a, +0x59, 0x01, 0x1c, 0x02, 0x02, 0xc1, 0x12, 0x1b, 0x02, 0x02, 0x18, 0x22, 0xaa, 0x01, 0x00, 0x01, 0x20, 0x02, 0xb4, 0x01, +0xcb, 0x10, 0x20, 0x02, 0x02, 0xa0, 0x01, 0xbf, 0x0c, 0x1a, 0x02, 0xa2, 0x01, 0xc8, 0x10, 0x1a, 0x02, 0x50, 0x02, 0xc8, +0x10, 0x1a, 0x02, 0x02, 0x52, 0x4b, 0x1a, 0x02, 0x52, 0x02, 0xbf, 0x0c, 0x1a, 0x02, 0x0a, 0x4a, 0x1a, 0x02, 0x08, 0x02, +0x4b, 0x1a, 0x02, 0x06, 0x02, 0xc8, 0x10, 0x1a, 0x02, 0x58, 0x0e, 0xc1, 0x0a, 0x1a, 0x02, 0x16, 0x00, 0x4a, 0x1a, 0x02, +0x02, 0x04, 0xd2, 0x0a, 0x1b, 0x02, 0x02, 0x1a, 0x00, 0xc1, 0x0a, 0x1a, 0x02, 0x02, 0x03, 0x4a, 0x1a, 0x02, 0x0c, 0x02, +0xc1, 0x0a, 0x1a, 0x02, 0x06, 0x00, 0x4b, 0x1a, 0x02, 0x02, 0x04, 0xd2, 0x0a, 0x1b, 0x02, 0x02, 0x0a, 0x00, 0xc1, 0x0a, +0x1a, 0x02, 0x02, 0x00, 0xc3, 0x10, 0x1a, 0x02, 0x6c, 0x18, 0xc1, 0x0a, 0x1a, 0x02, 0x06, 0x03, 0x4a, 0x1a, 0x02, 0x04, +0x02, 0x4b, 0x1a, 0x02, 0x08, 0x02, 0xc0, 0x10, 0x20, 0x02, 0x2c, 0xa2, 0x01, 0xbf, 0x0c, 0x1a, 0x02, 0x02, 0x4a, 0x1a, +0x02, 0x2c, 0x02, 0xc3, 0x10, 0x1a, 0x02, 0x7a, 0x02, 0x4a, 0x1a, 0x02, 0x02, 0x0e, 0x4b, 0x1a, 0x02, 0x14, 0x02, 0x13, +0x37, 0x02, 0x08, 0x21, 0x22, 0x00, 0x0e, 0x3f, 0x1a, 0x02, 0x04, 0x13, 0x37, 0x02, 0x08, 0x23, 0x22, 0x00, 0x02, 0xc1, +0x0a, 0x1a, 0x02, 0x1e, 0x01, 0x3f, 0x1a, 0x02, 0x02, 0xd2, 0x0a, 0x1b, 0x02, 0x02, 0x22, 0x01, 0x13, 0x36, 0x02, 0x09, +0x21, 0x22, 0x00, 0x02, 0x22, 0xfa, 0x01, 0x7e, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x58, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x58, 0x12, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, +0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xaf, 0x0f, 0x00, 0x04, 0xed, 0xc2, +0xa5, 0xf3, 0x06, 0x00, 0x8b, 0x01, 0xb3, 0x01, 0xb5, 0x01, 0xc2, 0x01, 0xd2, 0x01, 0xdb, 0x01, 0x10, 0x96, 0x01, 0x06, +0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, +0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, +0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, +0x42, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x76, 0x00, 0x05, +0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, +0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, +0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, +0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, +0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, +0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, +0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, +0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, +0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, +0x10, 0x1e, 0x1e, 0x00, 0x00, 0x50, 0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x04, 0x0b, 0x2b, 0x10, 0x1a, 0x1e, 0x04, 0x10, +0x20, 0x1e, 0x07, 0x47, 0x0e, 0x04, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x01, 0x0b, 0x01, 0x03, 0x01, 0x0b, +0x01, 0x04, 0x00, 0x00, 0x02, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x06, 0x20, 0xb7, 0x02, 0x02, 0x06, +0x04, 0xb8, 0x02, 0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, 0x06, 0x03, 0xae, 0x02, 0x28, 0x07, 0xb5, 0x02, 0x1a, 0x20, 0x00, +0xbb, 0x04, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x04, 0x20, 0x01, 0xbb, 0x04, 0x2d, 0x02, 0x00, 0x00, 0x00, +0x00, 0xbb, 0x04, 0x2a, 0x06, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2a, 0x0a, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x26, +0x09, 0x03, 0xbb, 0x04, 0x2a, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x4a, 0x8e, 0x03, 0x02, 0x08, 0x49, +0x2d, 0x2d, 0x2d, 0x06, 0x4b, 0xbb, 0x04, 0x2a, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x4c, 0x4d, 0xae, 0x02, +0x02, 0x4e, 0x3e, 0x02, 0x02, 0x4f, 0x39, 0x50, 0x02, 0x02, 0x3e, 0x04, 0x02, 0x08, 0xbb, 0x04, 0x2d, 0x28, 0x04, 0x00, +0x00, 0x00, 0xbb, 0x04, 0x2d, 0x0c, 0x05, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2a, 0x08, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, +0x02, 0x08, 0x71, 0xb7, 0x02, 0x02, 0x06, 0x02, 0xb7, 0x02, 0x02, 0x2a, 0x03, 0xbb, 0x04, 0x2a, 0x02, 0x09, 0x00, 0x00, +0x00, 0xbc, 0x02, 0x02, 0x09, 0x75, 0xbc, 0x02, 0x02, 0x07, 0x71, 0xbb, 0x04, 0x2a, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, +0x02, 0x02, 0x07, 0x78, 0xae, 0x83, 0x80, 0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x72, 0x08, 0x08, 0x07, 0x73, 0x06, 0x06, +0x07, 0x07, 0x73, 0x73, 0x06, 0x06, 0x73, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x74, 0x2d, 0x73, 0x06, +0x06, 0x76, 0x09, 0x06, 0x07, 0x07, 0x73, 0x2d, 0x06, 0x07, 0x2d, 0x06, 0x73, 0x06, 0x06, 0x06, 0x2a, 0x09, 0x06, 0x06, +0x2a, 0x06, 0x06, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x49, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x77, 0x2d, 0x06, 0x06, +0x06, 0x79, 0x3e, 0x02, 0x02, 0x7a, 0x39, 0x7b, 0x02, 0x02, 0x3e, 0x1c, 0x01, 0x07, 0x39, 0x8a, 0x01, 0x02, 0x01, 0xbb, +0x04, 0x06, 0x40, 0x0a, 0xd7, 0x23, 0x3c, 0x3e, 0x0e, 0x03, 0x2d, 0x39, 0xb2, 0x01, 0x02, 0x03, 0x3e, 0x02, 0x01, 0x2d, +0x39, 0xb4, 0x01, 0x02, 0x01, 0x3e, 0x18, 0x03, 0x07, 0x39, 0xc1, 0x01, 0x02, 0x03, 0x3e, 0x08, 0x03, 0x06, 0x39, 0xc1, +0x01, 0x18, 0x03, 0xbc, 0x02, 0x0c, 0x06, 0x31, 0xde, 0x02, 0x02, 0x07, 0x06, 0xd8, 0x01, 0xd8, 0x01, 0x3e, 0x02, 0x03, +0xd9, 0x01, 0x39, 0xda, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xad, 0x03, 0x00, 0x03, 0x18, 0x02, 0x01, 0x2d, 0xe2, 0x02, +0x02, 0x22, 0x06, 0x00, 0x01, 0x2d, 0x02, 0x08, 0x33, 0x53, 0x6e, 0x51, 0x2e, 0xb7, 0x01, 0x2e, 0x01, 0x08, 0x02, 0x02, +0x01, 0x07, 0x8e, 0x01, 0xd6, 0x02, 0xc1, 0x12, 0x07, 0x17, 0x76, 0x17, 0x23, 0x53, 0x26, 0x7c, 0x67, 0x2e, 0x01, 0x08, +0x02, 0x02, 0xc1, 0x12, 0x07, 0x21, 0x21, 0x06, 0xd2, 0x0a, 0x07, 0x4e, 0xd2, 0x02, 0x4e, 0x02, 0x13, 0x53, 0x25, 0x7c, +0x6d, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x21, 0x21, 0x45, 0xb0, 0x0a, 0x1d, 0x42, 0x42, 0xc1, 0x0a, 0x07, 0x0d, +0x0d, 0x00, 0x3d, 0x09, 0x8b, 0x02, 0x8b, 0x02, 0x8b, 0x02, 0x18, 0x13, 0xc6, 0x01, 0x04, 0xc2, 0x01, 0x2b, 0xc1, 0x0a, +0x06, 0x02, 0x06, 0x00, 0x22, 0x02, 0x00, 0x13, 0xc6, 0x01, 0x02, 0xc2, 0x01, 0x31, 0xc1, 0x0a, 0x06, 0x02, 0x0a, 0x01, +0x22, 0x02, 0x00, 0x13, 0xc6, 0x01, 0x02, 0xc2, 0x01, 0x36, 0xc1, 0x0a, 0x06, 0x02, 0x0e, 0x02, 0x22, 0x02, 0x00, 0xc1, +0x12, 0x07, 0x0a, 0xd9, 0x01, 0xf3, 0x01, 0x22, 0x01, 0x00, 0xc1, 0x0a, 0x06, 0x08, 0x08, 0x01, 0x3f, 0x06, 0x02, 0x02, +0xd2, 0x0a, 0x07, 0x82, 0x02, 0x82, 0x02, 0x8c, 0x02, 0x01, 0x13, 0xc1, 0x01, 0xf3, 0x01, 0xdb, 0x01, 0x2e, 0x22, 0x00, +0xf3, 0x01, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, +0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x11, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x8e, 0x01, 0x91, 0x02, -0xa0, 0x02, 0x04, 0x07, 0x37, 0x2c, 0x06, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, -0xae, 0x01, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x83, 0x00, -0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, -0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, -0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, -0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, -0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, -0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, -0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, -0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, -0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, -0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x2e, 0x1e, 0x04, 0x37, 0x68, 0x04, 0x00, 0x00, 0x00, 0x23, 0x00, 0x01, -0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x00, 0x9a, 0x01, 0x00, 0x10, -0x00, 0x1e, 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x02, 0x00, 0x00, -0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, -0x00, 0x02, 0x00, 0x00, 0x28, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, +0xa0, 0x02, 0x04, 0x07, 0x10, 0xda, 0x01, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, +0x10, 0x37, 0x02, 0x76, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, +0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, +0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, +0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, +0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, +0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, +0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, +0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, +0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x2e, 0x1e, 0x04, 0x47, 0x68, 0x02, 0x00, 0x23, 0x00, 0x01, 0x23, 0x10, 0x00, +0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x10, 0x9a, 0x01, 0x1e, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, 0x20, 0xb7, 0x02, 0x02, 0x08, 0x04, 0xb8, 0x02, 0x02, 0x09, 0x04, 0xb7, 0x02, 0x08, 0x08, 0x03, 0x94, 0x02, 0x08, 0xfe, 0x02, 0x08, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0e, 0xb5, 0x02, 0x42, 0x20, 0x01, 0xb8, 0x02, 0x10, 0x0e, 0x03, 0xb5, 0x02, 0x02, 0x20, 0x00, 0xbb, 0x04, 0x37, 0x12, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x04, 0x02, 0x0a, @@ -1485,453 +1866,124 @@ const uint8_t GRID_PACKAGE[] = { 0x00, 0x00, 0x93, 0x01, 0x00, 0x00, 0x99, 0x1e, 0x74, 0x18, 0x73, 0xe5, 0x1e, 0x09, 0x72, 0xca, 0x00, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0xda, 0x01, 0x00, 0x00, 0x9f, 0x01, 0x00, 0x00, 0x80, 0x0b, 0x16, 0x0b, 0x0b, 0x30, 0x2e, 0x2e, 0x2e, 0x2c, 0xc1, 0x0a, 0x09, 0x27, 0x27, 0x00, 0x80, 0x0b, 0x16, 0x04, 0x04, 0x0c, 0x0a, 0x0a, 0x0a, 0x08, 0xc1, 0x0a, 0x09, -0x21, 0x21, 0x00, 0x22, 0xbe, 0x02, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, -0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xcf, 0x0e, 0x04, 0x04, 0xed, 0xc2, -0xa5, 0xf3, 0x06, 0x00, 0xa0, 0x02, 0x04, 0x07, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xc6, 0x06, 0x02, 0x02, 0x00, -0x03, 0x18, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xd0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x60, 0x23, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, -0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, -0x9c, 0x01, 0xeb, 0x03, 0xa0, 0x02, 0x04, 0x07, 0x37, 0x30, 0x06, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, -0x00, 0x01, 0x00, 0x00, 0x22, 0x00, 0x00, 0x03, 0x00, 0x10, 0x9c, 0x01, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, -0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x83, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, -0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, -0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, -0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, -0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x00, 0x00, -0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, -0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x23, -0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, -0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, -0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, -0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, -0x04, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, -0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x3a, 0x1e, -0x04, 0x00, 0x5a, 0x00, 0x00, 0x70, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, -0x2e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x22, 0x00, 0x10, 0x00, 0x22, 0x01, 0x10, 0x00, -0x21, 0x06, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, -0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1a, -0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, -0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x37, 0x24, 0x04, -0x00, 0x00, 0x00, 0x23, 0x00, 0x01, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, -0x08, 0x00, 0x98, 0x01, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x00, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0xcc, -0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, -0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x28, -0x00, 0x00, 0x5a, 0x00, 0x00, 0x14, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x93, 0x02, 0x02, 0xa1, -0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, 0x20, 0xb7, 0x02, 0x02, 0x08, 0x04, 0xb8, 0x02, 0x02, 0x09, 0x04, 0xb7, 0x02, 0x08, -0x08, 0x03, 0x94, 0x02, 0x0c, 0xfe, 0x02, 0x08, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0e, 0x3e, 0x18, 0x07, 0x09, 0x3e, 0x02, -0x07, 0x0e, 0xc1, 0x04, 0x02, 0x09, 0x24, 0x25, 0xb5, 0x02, 0x32, 0x20, 0x01, 0xb8, 0x02, 0x10, 0x0e, 0x03, 0xb5, 0x02, -0x02, 0x20, 0x00, 0xbb, 0x04, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x04, 0x02, 0x0a, 0xbb, 0x04, 0x3f, 0x0c, 0x01, -0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x47, 0xbb, 0x04, 0x3f, 0x16, 0x03, 0x00, 0x00, 0x00, 0x3e, 0x18, 0x02, 0x08, 0xbb, -0x04, 0x48, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x0a, 0x74, 0xb7, 0x02, 0x02, 0x08, 0x02, 0xb7, 0x02, 0x02, -0x48, 0x03, 0xbb, 0x04, 0x48, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x0e, 0x78, 0xbc, 0x02, 0x02, 0x09, 0x74, -0xbb, 0x04, 0x48, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, 0x7b, 0xae, 0x83, 0x80, 0x02, 0x02, 0x0a, 0x0a, -0x0a, 0x0a, 0x75, 0x0a, 0x0a, 0x09, 0x76, 0x08, 0x08, 0x09, 0x09, 0x76, 0x76, 0x08, 0x08, 0x76, 0x08, 0x08, 0x08, 0x08, -0x08, 0x08, 0x08, 0x08, 0x09, 0x77, 0x3f, 0x76, 0x08, 0x08, 0x79, 0x0e, 0x08, 0x09, 0x09, 0x76, 0x3f, 0x08, 0x09, 0x3f, -0x08, 0x76, 0x08, 0x08, 0x08, 0x48, 0x0e, 0x08, 0x08, 0x48, 0x08, 0x08, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x47, 0x0a, -0x0a, 0x08, 0x08, 0x08, 0x08, 0x7a, 0x3f, 0x08, 0x08, 0x08, 0x7c, 0x3e, 0x02, 0x02, 0x7d, 0x39, 0x7e, 0x02, 0x02, 0x3e, -0x0a, 0x02, 0x09, 0xbb, 0x04, 0x48, 0x16, 0x03, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0xbb, -0x04, 0x08, 0x08, 0x00, 0x00, 0x80, 0x3f, 0x3e, 0x0a, 0x01, 0x09, 0x39, 0x9b, 0x01, 0x02, 0x01, 0x3e, 0x44, 0x07, 0x08, -0xbb, 0x04, 0x3f, 0x0a, 0x35, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x12, 0x30, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x0e, -0xbb, 0x04, 0x3f, 0x08, 0x34, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x48, 0x08, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x48, 0x0a, -0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x0c, 0x0a, 0xd7, 0xa3, 0x3a, 0xbb, 0x04, 0x48, 0x0c, 0x00, 0x00, 0x00, 0x00, -0xbb, 0x04, 0x3f, 0x1e, 0x31, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x1a, 0x32, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x0a, -0x36, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x06, 0x37, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x10, 0x3a, 0x00, 0x00, 0x00, -0xbb, 0x04, 0x3f, 0x08, 0x3b, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x0c, 0x33, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x48, -0xbb, 0x04, 0x3f, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x89, 0x03, 0x16, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0xab, 0x02, -0x02, 0xb6, 0x02, 0x3e, 0x02, 0x00, 0xb7, 0x02, 0x39, 0xb8, 0x02, 0x02, 0x00, 0xbb, 0x04, 0x3f, 0x14, 0x1e, 0x00, 0x00, -0x00, 0xbb, 0x04, 0x3f, 0x0e, 0x39, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x12, 0x38, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, -0x16, 0x23, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x14, 0x21, 0x00, 0x00, 0x00, 0xbe, 0x02, 0x6a, 0x08, 0x0e, 0x3e, 0x02, -0x02, 0x9d, 0x03, 0x39, 0x9e, 0x03, 0x02, 0x02, 0xec, 0x04, 0x09, 0x0c, 0xa6, 0x04, 0xa6, 0x04, 0xa6, 0x04, 0xa6, 0x04, -0xbb, 0x04, 0x08, 0x1a, 0xcd, 0xcc, 0x4c, 0x3f, 0x3e, 0x70, 0x03, 0x09, 0x39, 0xea, 0x03, 0x02, 0x03, 0xbb, 0x04, 0x3f, -0x0e, 0x3c, 0x00, 0x00, 0x00, 0xad, 0x06, 0x09, 0xea, 0x02, 0xad, 0x06, 0x08, 0x02, 0xad, 0x06, 0x0e, 0x02, 0xc6, 0x06, -0x02, 0xc9, 0x0a, 0x00, 0x03, 0x18, 0x02, 0x39, 0x24, 0xe4, 0x07, 0x07, 0x39, 0x25, 0x04, 0x07, 0x01, 0x09, 0x6e, 0xa8, -0x06, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x13, 0x53, 0xb0, 0x01, 0x7f, 0x51, 0x01, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x08, -0x5d, 0x54, 0x00, 0xc1, 0x0a, 0x08, 0x02, 0x56, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x58, 0x02, 0xe0, 0x0a, 0x09, 0x02, 0x06, -0x04, 0x02, 0x90, 0x07, 0xc1, 0x12, 0x09, 0x02, 0x55, 0x02, 0x2d, 0x76, 0x04, 0x04, 0x04, 0x20, 0x5c, 0x08, 0x02, 0x01, -0x42, 0xe1, 0x04, 0x13, 0x71, 0x04, 0x9f, 0x03, 0x51, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x08, 0x02, 0xa7, -0x1e, 0x3b, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x05, 0x18, 0x02, 0x99, 0x1e, 0x39, 0x18, 0x04, 0x13, 0xcd, 0x01, 0x02, 0x9f, -0x03, 0x59, 0x01, 0x0e, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x02, 0x02, 0x00, 0xc1, 0x0a, 0x08, 0x02, 0x04, 0x01, 0xc1, 0x0a, -0x08, 0x02, 0x06, 0x02, 0xe0, 0x0a, 0x09, 0x02, 0x06, 0x04, 0x02, 0xb2, 0x07, 0x4a, 0x08, 0x08, 0x1c, 0x82, 0x03, 0xca, -0x16, 0x14, 0x06, 0x28, 0x06, 0xa7, 0x1e, 0x19, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x19, 0x18, 0x02, 0xc3, 0x10, 0x08, 0x06, -0x30, 0x0e, 0xc3, 0x10, 0x08, 0x08, 0x32, 0x16, 0xc8, 0x10, 0x08, 0x02, 0x0a, 0x02, 0xc3, 0x10, 0x08, 0x02, 0xd4, 0x07, -0x02, 0xd2, 0x0a, 0x09, 0x82, 0x01, 0x82, 0x01, 0xa4, 0x01, 0x03, 0x99, 0x1e, 0x7c, 0x18, 0x7b, 0xe5, 0x1e, 0x09, 0x90, -0x01, 0x6f, 0x02, 0x00, 0x00, 0x69, 0x02, 0x00, 0x00, 0xc1, 0x02, 0x00, 0x00, 0x77, 0x02, 0x00, 0x00, 0x99, 0x1e, 0x8e, -0x01, 0x18, 0x8d, 0x01, 0xe5, 0x1e, 0x09, 0x8c, 0x01, 0xa5, 0x01, 0x00, 0x00, 0x67, 0x02, 0x00, 0x00, 0xcb, 0x02, 0x00, -0x00, 0x83, 0x02, 0x00, 0x00, 0x80, 0x0b, 0x18, 0x17, 0x17, 0x2e, 0x2c, 0x2c, 0x2c, 0x2a, 0xc1, 0x0a, 0x09, 0x25, 0x25, -0x00, 0x80, 0x0b, 0x18, 0x04, 0x04, 0x0c, 0x0a, 0x0a, 0x0a, 0x08, 0xc1, 0x0a, 0x09, 0x31, 0x31, 0x00, 0x22, 0xd2, 0x02, -0x00, 0x23, 0x84, 0x01, 0x1e, 0x7f, 0x59, 0x65, 0x01, 0x09, 0x02, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc3, 0x10, -0x0e, 0xe7, 0x02, 0x7f, 0xe7, 0x02, 0x13, 0x5a, 0x04, 0x7f, 0xf2, 0x03, 0x01, 0x47, 0x02, 0x02, 0xc1, 0x12, 0x0e, 0x04, -0x04, 0x0a, 0x01, 0x09, 0x04, 0x1a, 0x22, 0x02, 0x00, 0x22, 0x01, 0x04, 0xd9, 0x06, 0x09, 0x06, 0xa4, 0x07, 0x08, 0x04, -0x22, 0x20, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0xc6, 0x06, 0x09, 0xa3, 0x07, 0x00, 0x26, 0xa7, 0x06, 0x24, 0x03, 0xa7, 0x06, -0x25, 0x02, 0x18, 0x04, 0x01, 0x0e, 0xac, 0x02, 0xb0, 0x02, 0x5c, 0x08, 0x02, 0x01, 0x42, 0xc0, 0x01, 0x13, 0x71, 0x06, -0x7f, 0xc3, 0x01, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x0a, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, -0x01, 0x03, 0x18, 0x02, 0x01, 0x09, 0x04, 0xc4, 0x02, 0x9e, 0x1e, 0xc9, 0x00, 0x00, 0x00, 0x18, 0x01, 0x13, 0xcd, 0x01, -0x0c, 0x7f, 0xcc, 0x01, 0x01, 0x0e, 0x02, 0x02, 0x13, 0x71, 0x06, 0x7f, 0xd1, 0x01, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x0a, -0x08, 0x08, 0x10, 0x02, 0x13, 0xbe, 0x01, 0x08, 0x28, 0xda, 0x01, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x02, 0x14, 0x02, -0x5c, 0x08, 0x04, 0x01, 0x04, 0xdd, 0x01, 0xca, 0x16, 0x14, 0x04, 0x04, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, -0x01, 0x03, 0x18, 0x02, 0xc1, 0x0a, 0x08, 0x0c, 0x32, 0x00, 0xc1, 0x0a, 0x08, 0x04, 0x36, 0x01, 0xc3, 0x10, 0x08, 0x04, -0x04, 0x1e, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xec, 0x01, 0x4a, 0x08, 0x02, 0x0c, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x30, 0x02, -0xc8, 0x10, 0x08, 0x04, 0x04, 0x28, 0x99, 0x1e, 0x1c, 0x18, 0x1b, 0xe5, 0x1e, 0x08, 0xd2, 0x07, 0xd7, 0x00, 0x00, 0x00, -0xc8, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x13, 0x71, 0xab, 0x07, 0x7f, 0xf5, 0x01, 0x01, -0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x6e, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x28, 0xf8, 0x01, 0x92, 0x01, 0x4a, 0x08, -0x02, 0xa3, 0x07, 0x02, 0x3f, 0x08, 0x06, 0x06, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xfd, 0x01, 0xc3, 0x10, 0x08, 0x06, 0xd6, -0x01, 0x06, 0x13, 0x71, 0x04, 0x7f, 0x82, 0x02, 0x01, 0x08, 0x02, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x25, 0x81, 0x02, 0x84, -0x02, 0x13, 0xcd, 0x01, 0x06, 0x7f, 0x87, 0x02, 0x01, 0x0e, 0x02, 0x02, 0x13, 0x71, 0x04, 0x7f, 0x8a, 0x02, 0x01, 0x08, -0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x02, 0xf6, 0x01, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, -0x13, 0x71, 0x0a, 0x7f, 0x92, 0x02, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x02, 0xa8, 0x01, 0x02, 0x13, 0x71, 0x04, 0x7f, -0x96, 0x02, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x08, 0x02, 0x13, 0x9d, 0x02, 0x0a, 0x7f, 0x9c, 0x02, 0x01, -0x48, 0x02, 0x02, 0x5c, 0x76, 0x02, 0x01, 0x3e, 0x9f, 0x02, 0xc1, 0x0a, 0x08, 0x06, 0x06, 0x01, 0xc1, 0x0a, 0x08, 0x04, -0x0a, 0x00, 0x7c, 0x08, 0x04, 0x01, 0x2b, 0x99, 0x02, 0x92, 0x01, 0x96, 0x01, 0x7c, 0x08, 0x02, 0x01, 0x2e, 0xa3, 0x02, -0xa5, 0x02, 0xa7, 0x02, 0x13, 0x53, 0x08, 0x7f, 0xab, 0x02, 0x01, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x09, 0x02, 0x02, 0x00, -0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, 0x09, 0x02, 0x06, 0x01, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, -0x09, 0x02, 0x0a, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xd0, 0x0a, 0x47, 0x02, 0x0a, 0x06, 0x02, 0xb4, 0x0a, 0x47, -0x02, 0x34, 0x01, 0x00, 0x00, 0x01, 0xb7, 0x02, 0x0a, 0x02, 0x01, 0x0e, 0x04, 0xa8, 0x04, 0xc1, 0x12, 0x0e, 0x02, 0x10, -0x02, 0xe8, 0x0a, 0x09, 0x04, 0x0a, 0x04, 0x02, 0xa8, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x4a, 0x0e, 0x04, 0x72, -0x04, 0x99, 0x1e, 0x66, 0x18, 0x65, 0xe5, 0x1e, 0x0e, 0xfc, 0x06, 0x09, 0x01, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x42, -0x01, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x13, 0x71, 0x91, 0x06, 0x7f, 0xc3, 0x02, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, -0x04, 0x04, 0x84, 0x01, 0xce, 0x10, 0x0e, 0x04, 0x87, 0x06, 0x04, 0x13, 0x71, 0x04, 0x7f, 0xca, 0x02, 0x01, 0x08, 0x02, -0x02, 0xca, 0x16, 0x14, 0x02, 0x02, 0xf6, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x13, -0x71, 0x0c, 0x7f, 0xd3, 0x02, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0xaa, 0x02, 0x02, 0x6c, 0x08, 0x02, 0x01, -0x28, 0xd6, 0x02, 0x92, 0x01, 0x4a, 0x08, 0x02, 0xe7, 0x05, 0x02, 0x3f, 0x08, 0x06, 0x06, 0x5c, 0x08, 0x02, 0x01, 0x1b, -0xdb, 0x02, 0x13, 0x84, 0x01, 0x06, 0x7f, 0xde, 0x02, 0x01, 0x09, 0x02, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x23, -0x71, 0x02, 0x7f, 0xde, 0x02, 0x8f, 0x01, 0x01, 0x08, 0x02, 0x02, 0xce, 0x10, 0x0e, 0x02, 0x06, 0x02, 0x01, 0x0e, 0x04, -0xfc, 0x04, 0x5c, 0x0e, 0x02, 0x01, 0x45, 0xe6, 0x02, 0x13, 0xcd, 0x01, 0x04, 0x7f, 0xe8, 0x02, 0x01, 0x0e, 0x02, 0x02, -0xc4, 0x12, 0x08, 0x02, 0x08, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x28, 0xeb, 0x02, 0x92, 0x01, 0x6c, 0x08, 0x0a, 0x01, 0x1a, -0xec, 0x02, 0xcc, 0x02, 0xc3, 0x10, 0x08, 0x08, 0xbe, 0x03, 0x32, 0x4a, 0x08, 0x02, 0x0a, 0x02, 0xce, 0x10, 0x0e, 0x02, -0x26, 0x02, 0x4b, 0x0e, 0x04, 0x60, 0x04, 0x99, 0x1e, 0x54, 0x18, 0x53, 0xe5, 0x1e, 0x0e, 0x80, 0x06, 0x49, 0x01, 0x00, -0x00, 0x0f, 0x01, 0x00, 0x00, 0x79, 0x01, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x13, 0xbe, 0x01, 0xa9, 0x05, 0x27, 0x8f, -0x01, 0x01, 0x08, 0x02, 0x02, 0xce, 0x10, 0x0e, 0x04, 0xa3, 0x05, 0x04, 0x01, 0x09, 0x02, 0xae, 0x05, 0x3d, 0x0e, 0x02, -0x02, 0x02, 0x18, 0xc3, 0x10, 0x08, 0x04, 0xd6, 0x03, 0xf8, 0x01, 0xce, 0x10, 0x0e, 0x02, 0x06, 0x02, 0x4b, 0x0e, 0x04, -0x04, 0x0e, 0x13, 0xbe, 0x01, 0x02, 0x27, 0xe6, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x04, 0x00, 0x22, 0x02, 0x00, 0x13, 0xbe, -0x01, 0x02, 0x27, 0xda, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x08, 0x01, 0x22, 0x02, 0x00, 0x13, 0xbe, 0x01, 0x02, 0x27, 0xd5, -0x01, 0xc1, 0x0a, 0x08, 0x02, 0x0c, 0x02, 0x22, 0x02, 0x00, 0x01, 0x09, 0x02, 0xc8, 0x05, 0x9e, 0x1e, 0x8b, 0x01, 0x00, -0x00, 0x88, 0x06, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, -0x0b, 0x00, 0x08, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, -0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, -0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x53, 0x5a, 0xa0, 0x02, 0x04, 0x07, 0x10, 0x2e, -0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, -0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, -0x06, 0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, -0x10, 0x6c, 0x1e, 0x00, 0x10, 0x0e, 0x1e, 0x07, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xb5, 0x02, 0x0a, 0x20, 0x01, -0xa6, 0x02, 0x0c, 0x20, 0xb7, 0x02, 0x02, 0x0e, 0x04, 0xb8, 0x02, 0x02, 0x0f, 0x04, 0xb7, 0x02, 0x06, 0x0e, 0x03, 0xb8, -0x02, 0x02, 0x13, 0x03, 0xb5, 0x02, 0x02, 0x20, 0x00, 0xbb, 0x04, 0x15, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, -0x0f, 0x16, 0x8e, 0x03, 0x02, 0x10, 0x14, 0x08, 0x08, 0x08, 0x0e, 0x17, 0xbb, 0x04, 0x15, 0x02, 0x40, 0x00, 0x00, 0x00, -0xbc, 0x02, 0x02, 0x18, 0x19, 0xae, 0x02, 0x02, 0x1a, 0x3e, 0x02, 0x02, 0x1b, 0x39, 0x1c, 0x02, 0x02, 0xbb, 0x04, 0x08, -0x02, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x1e, 0x02, 0x08, 0xbb, 0x04, 0x08, 0x14, 0x04, 0x00, 0x00, 0x00, 0xb7, 0x02, 0x1a, -0x0e, 0x02, 0x3e, 0x1c, 0x03, 0x44, 0x39, 0x52, 0x02, 0x03, 0xbb, 0x04, 0x15, 0x06, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x02, -0x03, 0x0e, 0x3e, 0x04, 0x01, 0x0f, 0x39, 0x59, 0x02, 0x01, 0xbb, 0x04, 0x15, 0x02, 0x02, 0x00, 0x00, 0x00, 0x3e, 0x02, -0x01, 0x0e, 0xbb, 0x04, 0x15, 0x06, 0x03, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x15, 0x08, 0x01, 0x00, 0x00, 0x00, 0xad, 0x06, -0x08, 0x86, 0x01, 0xc6, 0x06, 0x02, 0xc3, 0x02, 0x00, 0x03, 0x18, 0x02, 0x33, 0x2d, 0xb8, 0x02, 0x1d, 0x1e, 0xa6, 0x01, -0x37, 0x01, 0x08, 0x02, 0x02, 0xbc, 0x0e, 0x0e, 0x99, 0x01, 0x99, 0x01, 0x13, 0x57, 0x06, 0x53, 0x56, 0x22, 0x00, 0x06, -0x13, 0x5c, 0x0a, 0x5a, 0x5b, 0x01, 0x0e, 0x02, 0x02, 0x13, 0x5c, 0x04, 0x5a, 0x5f, 0x01, 0x0e, 0x02, 0x02, 0xc8, 0x10, -0x0e, 0x02, 0x08, 0x02, 0x13, 0x57, 0x04, 0x53, 0x63, 0x22, 0x00, 0x04, 0x8d, 0x1e, 0x88, 0x06, 0x8b, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xfd, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, -0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xdf, 0x0e, 0x04, 0x04, 0xed, 0xc2, -0xa5, 0xf3, 0x06, 0x00, 0xfc, 0x01, 0xa0, 0x02, 0x04, 0x07, 0x00, 0xf8, 0x03, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x93, 0x02, -0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, 0x20, 0xb7, 0x02, 0x02, 0x08, 0x04, 0xbb, 0x04, 0x08, 0xe4, 0x01, 0x00, -0x00, 0x00, 0x00, 0xec, 0x04, 0x09, 0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0x3e, 0x74, 0x03, 0x09, -0x39, 0xfb, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xef, 0x03, 0x00, 0x03, 0x18, 0x02, 0x22, 0xed, 0x03, 0xf7, 0x02, 0x8d, -0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, -0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x15, 0x00, 0x00, +0x21, 0x21, 0x00, 0x22, 0xbe, 0x02, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x98, 0x00, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, +0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xcf, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, +0xa0, 0x02, 0x04, 0x07, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xc6, 0x06, 0x02, 0x02, 0x00, 0x03, 0x18, 0x02, 0x8d, +0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, +0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x1f, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, -0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xbf, 0x0f, 0x00, 0x02, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x03, 0x04, 0x05, 0x06, -0x07, 0x08, 0x09, 0x10, 0x24, 0x06, 0x10, 0x37, 0x0d, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, -0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x23, 0x04, 0x10, 0x10, 0x06, 0x80, 0x02, 0x47, 0x0d, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x02, 0x22, -0x00, 0x10, 0x00, 0x21, 0x01, 0x00, 0x13, 0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x16, 0x01, 0x08, 0x10, 0x0c, 0x06, 0x40, -0x10, 0x02, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x37, 0x0f, 0x83, 0x00, 0x05, 0x00, 0x23, 0x00, -0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, +0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x9c, 0x01, 0xe7, 0x03, +0xa0, 0x02, 0x04, 0x07, 0x10, 0xea, 0x01, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, +0x10, 0x37, 0x02, 0x76, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, -0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, -0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, -0x01, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, -0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, -0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, -0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, -0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x02, 0x22, 0x00, 0x10, -0x00, 0x21, 0x00, 0x10, 0x17, 0x1e, 0x00, 0x10, 0x02, 0x0b, 0x2b, 0x10, 0x02, 0x1e, 0x04, 0x10, 0x02, 0x1e, 0x07, 0x10, -0x02, 0x0b, 0x03, 0x47, 0x12, 0x02, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x00, 0x00, 0x02, 0x93, 0x02, 0x2e, -0xa1, 0x04, 0x02, 0x18, 0xa6, 0x02, 0x02, 0x20, 0xb7, 0x02, 0x02, 0x1a, 0x04, 0xb8, 0x02, 0x02, 0x1b, 0x04, 0xb7, 0x02, -0x02, 0x1a, 0x03, 0xae, 0x02, 0x25, 0x1b, 0xb5, 0x02, 0x28, 0x20, 0x00, 0xbb, 0x04, 0x1e, 0x02, 0x00, 0x00, 0x00, 0x00, -0xb5, 0x02, 0x02, 0x20, 0x01, 0xbb, 0x04, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x1e, 0x02, 0x01, 0x00, 0x00, -0x00, 0xbb, 0x04, 0x20, 0x02, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x1e, 0x02, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x02, -0x1d, 0x03, 0xbb, 0x04, 0x1e, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x27, 0x1b, 0x26, 0x8e, 0x03, 0x0d, 0x1c, 0x25, -0x20, 0x20, 0x20, 0x1a, 0x12, 0xbb, 0x04, 0x1e, 0x38, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x27, 0x0b, 0x27, 0xae, 0x02, -0x0d, 0x13, 0x3e, 0x38, 0x02, 0x0c, 0x39, 0x28, 0x35, 0x02, 0x3e, 0x38, 0x02, 0x1c, 0xbb, 0x04, 0x20, 0x02, 0x04, 0x00, -0x00, 0x00, 0x3e, 0x02, 0x03, 0x20, 0x39, 0x2b, 0x4f, 0x03, 0xb2, 0x06, 0x20, 0x16, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, -0x1e, 0x3c, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x2f, 0x1c, 0x2c, 0xb7, 0x02, 0x32, 0x1a, 0x02, 0xb7, 0x02, 0x02, 0x1e, -0x03, 0xbb, 0x04, 0x1e, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x33, 0x1d, 0x2f, 0xbc, 0x02, 0x02, 0x1b, 0x2c, 0xbb, -0x04, 0x1e, 0x34, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x31, 0x1b, 0x30, 0xae, 0x83, 0x80, 0x02, 0x0f, 0x1c, 0x1c, 0x1c, -0x1c, 0x14, 0x1c, 0x1c, 0x1b, 0x2d, 0x1a, 0x1a, 0x1b, 0x1b, 0x2d, 0x2d, 0x1a, 0x1a, 0x2d, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, -0x1a, 0x1a, 0x1a, 0x1b, 0x2e, 0x20, 0x2d, 0x1a, 0x1a, 0x15, 0x1d, 0x1a, 0x1b, 0x1b, 0x2d, 0x20, 0x1a, 0x1b, 0x20, 0x1a, -0x2d, 0x1a, 0x1a, 0x1a, 0x1e, 0x1d, 0x1a, 0x1a, 0x1e, 0x1a, 0x1a, 0x1d, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x25, 0x1c, 0x1c, -0x1a, 0x1a, 0x1a, 0x1a, 0x16, 0x20, 0x1a, 0x1a, 0x1a, 0x17, 0x3e, 0x44, 0x02, 0x0f, 0x39, 0x31, 0x41, 0x02, 0x3e, 0x44, -0x01, 0x1b, 0x39, 0x32, 0x5b, 0x01, 0x3e, 0x5e, 0x01, 0x20, 0x39, 0x33, 0x5b, 0x01, 0x3e, 0x5e, 0x03, 0x1b, 0x39, 0x34, -0x5b, 0x03, 0x3e, 0x5e, 0x03, 0x1a, 0x39, 0x34, 0x5b, 0x03, 0xbb, 0x04, 0x1a, 0x5e, 0x00, 0x00, 0x00, 0x40, 0xbb, 0x04, -0x1a, 0x02, 0x00, 0x00, 0x80, 0xbf, 0xbb, 0x04, 0x1a, 0x02, 0x00, 0x00, 0x80, 0x3f, 0xbc, 0x02, 0x02, 0x1a, 0x24, 0x3e, -0x02, 0x03, 0x39, 0x39, 0x3a, 0x63, 0x03, 0xbe, 0x02, 0x12, 0x1b, 0x1a, 0x3e, 0x54, 0x03, 0x11, 0x39, 0x3b, 0x63, 0x03, -0xc6, 0x06, 0x18, 0x0d, 0x00, 0x19, 0x18, 0x74, 0x01, 0x20, 0x02, 0x70, 0x22, 0x74, 0x00, 0x01, 0x20, 0x02, 0x76, 0xc7, -0x10, 0x20, 0x02, 0x02, 0x62, 0x33, 0x29, 0x02, 0x0d, 0x21, 0x3f, 0x21, 0x01, 0x1c, 0x02, 0x02, 0x01, 0x1b, 0x02, 0x7c, -0xc1, 0x12, 0x1b, 0x02, 0x04, 0x02, 0xb0, 0x0a, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x1b, 0x02, 0x02, 0x00, 0x3d, 0x1d, 0x02, -0x02, 0x02, 0x18, 0x13, 0x35, 0x02, 0x06, 0x1f, 0xc1, 0x0a, 0x1a, 0x02, 0x04, 0x00, 0x22, 0x02, 0x00, 0x13, 0x35, 0x02, -0x06, 0x22, 0xc1, 0x0a, 0x1a, 0x02, 0x08, 0x01, 0x22, 0x02, 0x00, 0x13, 0x35, 0x02, 0x06, 0x24, 0xc1, 0x0a, 0x1a, 0x02, -0x0c, 0x02, 0x22, 0x02, 0x00, 0x01, 0x20, 0x02, 0x94, 0x01, 0xcb, 0x10, 0x20, 0x02, 0x02, 0x80, 0x01, 0x23, 0x29, 0x02, -0x10, 0x2a, 0x4e, 0x01, 0x1c, 0x02, 0x02, 0xc1, 0x12, 0x1b, 0x02, 0x02, 0x18, 0x22, 0x94, 0x01, 0x00, 0x01, 0x20, 0x02, -0x9e, 0x01, 0xcb, 0x10, 0x20, 0x02, 0x02, 0x8a, 0x01, 0xbf, 0x0c, 0x1a, 0x02, 0x8c, 0x01, 0xc8, 0x10, 0x1a, 0x02, 0x3e, -0x02, 0xc8, 0x10, 0x1a, 0x02, 0x02, 0x40, 0x4b, 0x1a, 0x02, 0x40, 0x02, 0xbf, 0x0c, 0x1a, 0x02, 0x0a, 0x4a, 0x1a, 0x02, -0x08, 0x02, 0x4b, 0x1a, 0x02, 0x06, 0x02, 0xc8, 0x10, 0x1a, 0x02, 0x46, 0x0e, 0xc1, 0x0a, 0x1a, 0x02, 0x16, 0x00, 0x4a, -0x1a, 0x02, 0x02, 0x04, 0xd2, 0x0a, 0x1b, 0x02, 0x02, 0x1a, 0x00, 0xc1, 0x0a, 0x1a, 0x02, 0x02, 0x03, 0x4a, 0x1a, 0x02, -0x0c, 0x02, 0xc1, 0x0a, 0x1a, 0x02, 0x06, 0x00, 0x4b, 0x1a, 0x02, 0x02, 0x04, 0xd2, 0x0a, 0x1b, 0x02, 0x02, 0x0a, 0x00, -0xc1, 0x0a, 0x1a, 0x02, 0x02, 0x00, 0xc3, 0x10, 0x1a, 0x02, 0x5a, 0x18, 0xc1, 0x0a, 0x1a, 0x02, 0x06, 0x03, 0x4a, 0x1a, -0x02, 0x04, 0x02, 0x4b, 0x1a, 0x02, 0x08, 0x02, 0xc0, 0x10, 0x20, 0x02, 0x2c, 0x8c, 0x01, 0xbf, 0x0c, 0x1a, 0x02, 0x02, -0x4a, 0x1a, 0x02, 0x2c, 0x02, 0xc3, 0x10, 0x1a, 0x02, 0x68, 0x02, 0x4a, 0x1a, 0x02, 0x02, 0x0e, 0x4b, 0x1a, 0x02, 0x14, -0x02, 0x13, 0x35, 0x02, 0x08, 0x21, 0x22, 0x00, 0x0e, 0x3f, 0x1a, 0x02, 0x04, 0x13, 0x35, 0x02, 0x08, 0x23, 0x22, 0x00, -0x02, 0xc1, 0x0a, 0x1a, 0x02, 0x1e, 0x01, 0x3f, 0x1a, 0x02, 0x02, 0xd2, 0x0a, 0x1b, 0x02, 0x02, 0x22, 0x01, 0x13, 0x34, -0x02, 0x09, 0x21, 0x22, 0x00, 0x02, 0x22, 0xe4, 0x01, 0x6c, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x22, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, -0x31, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x11, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, -0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xaf, 0x0f, -0x00, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x85, 0x01, 0xa0, 0x01, 0xa2, 0x01, 0xaf, 0x01, 0xbf, 0x01, 0xc9, 0x01, -0x10, 0x92, 0x01, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, -0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, -0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, -0x00, 0x21, 0x01, 0x10, 0x42, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, -0x02, 0x76, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, -0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, -0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, -0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, -0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, -0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, -0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, -0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, -0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, -0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, -0x10, 0x00, 0x21, 0x00, 0x10, 0x16, 0x1e, 0x00, 0x00, 0x36, 0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x04, 0x0b, 0x2b, 0x10, -0x1a, 0x1e, 0x04, 0x10, 0x20, 0x1e, 0x07, 0x47, 0x10, 0x04, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x01, 0x0b, -0x01, 0x03, 0x01, 0x0b, 0x01, 0x04, 0x00, 0x00, 0x02, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x06, 0x20, -0xb7, 0x02, 0x02, 0x06, 0x04, 0xb8, 0x02, 0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, 0x06, 0x03, 0xae, 0x02, 0x24, 0x07, 0xb5, -0x02, 0x1a, 0x20, 0x00, 0xbb, 0x04, 0x28, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x04, 0x20, 0x01, 0xbb, 0x04, 0x2b, -0x02, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x28, 0x06, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x28, 0x0a, 0x02, 0x00, 0x00, -0x00, 0xb8, 0x02, 0x26, 0x09, 0x03, 0xbb, 0x04, 0x28, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x48, 0x8e, -0x03, 0x02, 0x08, 0x47, 0x2b, 0x2b, 0x2b, 0x06, 0x49, 0xbb, 0x04, 0x28, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, -0x4a, 0x4b, 0xae, 0x02, 0x02, 0x4c, 0x3e, 0x02, 0x02, 0x4d, 0x39, 0x4e, 0x02, 0x02, 0x3e, 0x04, 0x02, 0x08, 0xbb, 0x04, -0x2b, 0x28, 0x04, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x28, 0x14, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x08, 0x6f, 0xb7, -0x02, 0x02, 0x06, 0x02, 0xb7, 0x02, 0x02, 0x28, 0x03, 0xbb, 0x04, 0x28, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, -0x09, 0x73, 0xbc, 0x02, 0x02, 0x07, 0x6f, 0xbb, 0x04, 0x28, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x76, -0xae, 0x83, 0x80, 0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x70, 0x08, 0x08, 0x07, 0x71, 0x06, 0x06, 0x07, 0x07, 0x71, 0x71, -0x06, 0x06, 0x71, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x72, 0x2b, 0x71, 0x06, 0x06, 0x74, 0x09, 0x06, -0x07, 0x07, 0x71, 0x2b, 0x06, 0x07, 0x2b, 0x06, 0x71, 0x06, 0x06, 0x06, 0x28, 0x09, 0x06, 0x06, 0x28, 0x06, 0x06, 0x09, -0x06, 0x06, 0x06, 0x06, 0x06, 0x47, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x75, 0x2b, 0x06, 0x06, 0x06, 0x77, 0x3e, 0x02, -0x02, 0x78, 0x39, 0x79, 0x02, 0x02, 0x3e, 0x14, 0x01, 0x07, 0x39, 0x84, 0x01, 0x02, 0x01, 0x3e, 0x34, 0x03, 0x2b, 0x39, -0x9f, 0x01, 0x02, 0x03, 0x3e, 0x02, 0x01, 0x2b, 0x39, 0xa1, 0x01, 0x02, 0x01, 0x3e, 0x18, 0x03, 0x07, 0x39, 0xae, 0x01, -0x02, 0x03, 0x3e, 0x08, 0x03, 0x06, 0x39, 0xae, 0x01, 0x18, 0x03, 0xbc, 0x02, 0x0e, 0x06, 0x2f, 0xde, 0x02, 0x02, 0x07, -0x06, 0xc6, 0x01, 0xc6, 0x01, 0x3e, 0x02, 0x03, 0xc7, 0x01, 0x39, 0xc8, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0x89, 0x03, -0x00, 0x03, 0x18, 0x02, 0x01, 0x2b, 0xbc, 0x02, 0x02, 0x22, 0x06, 0x00, 0x01, 0x2b, 0x02, 0x08, 0x33, 0x51, 0x70, 0x4f, -0x2c, 0xa4, 0x01, 0x2c, 0x01, 0x08, 0x02, 0x02, 0x01, 0x07, 0x7e, 0xae, 0x02, 0xc1, 0x12, 0x07, 0x0f, 0x6e, 0x0f, 0xb0, -0x0a, 0x1b, 0x32, 0x32, 0xc1, 0x0a, 0x07, 0x0d, 0x0d, 0x00, 0x3d, 0x09, 0xe7, 0x01, 0xe7, 0x01, 0xe7, 0x01, 0x18, 0x13, -0xb3, 0x01, 0x04, 0xaf, 0x01, 0x29, 0xc1, 0x0a, 0x06, 0x02, 0x06, 0x00, 0x22, 0x02, 0x00, 0x13, 0xb3, 0x01, 0x02, 0xaf, -0x01, 0x2f, 0xc1, 0x0a, 0x06, 0x02, 0x0a, 0x01, 0x22, 0x02, 0x00, 0x13, 0xb3, 0x01, 0x02, 0xaf, 0x01, 0x34, 0xc1, 0x0a, -0x06, 0x02, 0x0e, 0x02, 0x22, 0x02, 0x00, 0x23, 0x51, 0xce, 0x01, 0x7a, 0x65, 0x2c, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, -0x07, 0xc5, 0x01, 0xc5, 0x01, 0xcf, 0x01, 0x22, 0x01, 0x00, 0xc1, 0x0a, 0x06, 0x0a, 0x0a, 0x01, 0x3f, 0x06, 0x02, 0x02, -0xd2, 0x0a, 0x07, 0xd8, 0x01, 0xd8, 0x01, 0xe4, 0x01, 0x01, 0x13, 0xae, 0x01, 0xc9, 0x01, 0xc9, 0x01, 0x2c, 0x22, 0x00, -0xc9, 0x01, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x30, 0x11, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, -0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, -0x8e, 0x01, 0x91, 0x02, 0xa0, 0x02, 0x04, 0x07, 0x10, 0xda, 0x01, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, -0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x76, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, -0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, -0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, -0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, -0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x08, 0x01, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, -0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, -0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, -0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, -0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x2e, 0x1e, 0x04, 0x47, 0x68, 0x02, 0x00, 0x23, 0x00, -0x01, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x10, 0x9a, 0x01, 0x1e, 0x00, 0x93, -0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, 0x20, 0xb7, 0x02, 0x02, 0x08, 0x04, 0xb8, 0x02, 0x02, 0x09, 0x04, -0xb7, 0x02, 0x08, 0x08, 0x03, 0x94, 0x02, 0x08, 0xfe, 0x02, 0x08, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0e, 0xb5, 0x02, 0x42, -0x20, 0x01, 0xb8, 0x02, 0x10, 0x0e, 0x03, 0xb5, 0x02, 0x02, 0x20, 0x00, 0xbb, 0x04, 0x37, 0x12, 0x00, 0x00, 0x00, 0x00, -0x3e, 0x04, 0x02, 0x0a, 0xbb, 0x04, 0x37, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x30, 0x02, 0x08, 0xbb, 0x04, 0x40, 0x06, -0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x0a, 0x6c, 0xb7, 0x02, 0x02, 0x08, 0x02, 0xb7, 0x02, 0x02, 0x40, 0x03, 0xbb, -0x04, 0x40, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x0e, 0x70, 0xbc, 0x02, 0x02, 0x09, 0x6c, 0xbb, 0x04, 0x40, -0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, 0x73, 0xae, 0x83, 0x80, 0x02, 0x02, 0x0a, 0x0a, 0x0a, 0x0a, 0x6d, -0x0a, 0x0a, 0x09, 0x6e, 0x08, 0x08, 0x09, 0x09, 0x6e, 0x6e, 0x08, 0x08, 0x6e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -0x08, 0x09, 0x6f, 0x37, 0x6e, 0x08, 0x08, 0x71, 0x0e, 0x08, 0x09, 0x09, 0x6e, 0x37, 0x08, 0x09, 0x37, 0x08, 0x6e, 0x08, -0x08, 0x08, 0x40, 0x0e, 0x08, 0x08, 0x40, 0x08, 0x08, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3f, 0x0a, 0x0a, 0x08, 0x08, -0x08, 0x08, 0x72, 0x37, 0x08, 0x08, 0x08, 0x74, 0x3e, 0x02, 0x02, 0x75, 0x39, 0x76, 0x02, 0x02, 0xbb, 0x04, 0x08, 0x1a, -0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x08, 0x00, 0x00, 0x80, 0x3f, 0x3e, 0x0a, 0x01, 0x09, 0x39, 0x8d, 0x01, 0x02, -0x01, 0xbe, 0x02, 0x68, 0x08, 0x0e, 0x3e, 0x02, 0x02, 0xc2, 0x01, 0x39, 0xc3, 0x01, 0x02, 0x02, 0xec, 0x04, 0x09, 0x0c, -0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0x3e, 0x06, 0x02, 0x0e, 0xbb, 0x04, 0x08, 0x16, 0xcd, 0xcc, 0x4c, 0x3f, -0x3e, 0x70, 0x03, 0x09, 0x39, 0x90, 0x02, 0x02, 0x03, 0xad, 0x06, 0x09, 0xd4, 0x02, 0xad, 0x06, 0x08, 0x02, 0xad, 0x06, -0x0e, 0x02, 0xc6, 0x06, 0x02, 0xf1, 0x06, 0x00, 0x03, 0x18, 0x02, 0x01, 0x09, 0x8e, 0x05, 0xfc, 0x02, 0x3d, 0x0e, 0x02, -0x02, 0x02, 0x18, 0x13, 0x4b, 0xb0, 0x01, 0x77, 0x49, 0x01, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x5d, 0x54, 0x00, 0xc1, -0x0a, 0x08, 0x02, 0x56, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x58, 0x02, 0xe0, 0x0a, 0x09, 0x02, 0x06, 0x04, 0x02, 0xe4, 0x03, -0xc1, 0x12, 0x09, 0x02, 0x55, 0x02, 0x2d, 0x6e, 0x04, 0x04, 0x04, 0x20, 0x5c, 0x08, 0x02, 0x01, 0x42, 0xfd, 0x02, 0x13, -0x69, 0x04, 0xc4, 0x01, 0x49, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x12, 0x02, 0x08, 0x02, 0xa7, 0x1e, 0x3b, 0x00, 0xba, -0x1e, 0x00, 0x01, 0x05, 0x18, 0x02, 0x99, 0x1e, 0x39, 0x18, 0x04, 0x13, 0xcd, 0x01, 0x02, 0xc4, 0x01, 0x51, 0x01, 0x0e, -0x02, 0x02, 0xc1, 0x0a, 0x08, 0x02, 0x02, 0x00, 0xc1, 0x0a, 0x08, 0x02, 0x04, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x06, 0x02, -0xe0, 0x0a, 0x09, 0x02, 0x06, 0x04, 0x02, 0x86, 0x04, 0x4a, 0x08, 0x08, 0x1c, 0xee, 0x02, 0xca, 0x16, 0x12, 0x06, 0x28, -0x06, 0xa7, 0x1e, 0x19, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x19, 0x18, 0x02, 0xc3, 0x10, 0x08, 0x06, 0x30, 0x0e, 0xc3, 0x10, -0x08, 0x08, 0x32, 0x16, 0xc8, 0x10, 0x08, 0x02, 0x0a, 0x02, 0xc3, 0x10, 0x08, 0x02, 0xa8, 0x04, 0x02, 0xd2, 0x0a, 0x09, -0x74, 0x74, 0x96, 0x01, 0x03, 0x99, 0x1e, 0x6e, 0x18, 0x6d, 0xe5, 0x1e, 0x09, 0x76, 0x8b, 0x01, 0x00, 0x00, 0x85, 0x01, -0x00, 0x00, 0xd6, 0x01, 0x00, 0x00, 0x93, 0x01, 0x00, 0x00, 0x99, 0x1e, 0x74, 0x18, 0x73, 0xe5, 0x1e, 0x09, 0x72, 0xca, -0x00, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0xda, 0x01, 0x00, 0x00, 0x9f, 0x01, 0x00, 0x00, 0x80, 0x0b, 0x16, 0x0b, 0x0b, -0x30, 0x2e, 0x2e, 0x2e, 0x2c, 0xc1, 0x0a, 0x09, 0x27, 0x27, 0x00, 0x80, 0x0b, 0x16, 0x04, 0x04, 0x0c, 0x0a, 0x0a, 0x0a, -0x08, 0xc1, 0x0a, 0x09, 0x21, 0x21, 0x00, 0x22, 0xbe, 0x02, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x53, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, -0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xcf, 0x0e, 0x04, 0x04, 0xed, 0xc2, -0xa5, 0xf3, 0x06, 0x00, 0xa0, 0x02, 0x04, 0x07, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xc6, 0x06, 0x02, 0x02, 0x00, -0x03, 0x18, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xd0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x7c, 0x1f, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, -0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, -0x9c, 0x01, 0xeb, 0x03, 0xa0, 0x02, 0x04, 0x07, 0x10, 0xea, 0x01, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, -0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x76, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, -0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, -0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, -0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, -0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x08, 0x01, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, -0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, -0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, -0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, -0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x3a, 0x1e, 0x04, 0x00, 0x8e, 0x02, 0x00, 0x00, 0x04, -0x00, 0x00, 0x28, 0x00, 0x10, 0x00, 0x22, 0x01, 0x10, 0x00, 0x21, 0x06, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x02, -0x00, 0x47, 0xba, 0x01, 0x02, 0x00, 0x23, 0x00, 0x01, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, -0x21, 0x08, 0x10, 0x98, 0x01, 0x1e, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, 0x20, 0xb7, 0x02, -0x02, 0x08, 0x04, 0xb8, 0x02, 0x02, 0x09, 0x04, 0xb7, 0x02, 0x08, 0x08, 0x03, 0x94, 0x02, 0x0c, 0xfe, 0x02, 0x08, 0x09, -0x09, 0x08, 0x08, 0x08, 0x0e, 0x3e, 0x18, 0x07, 0x09, 0x3e, 0x02, 0x07, 0x0e, 0xc1, 0x04, 0x02, 0x09, 0x24, 0x25, 0xb5, -0x02, 0x32, 0x20, 0x01, 0xb8, 0x02, 0x10, 0x0e, 0x03, 0xb5, 0x02, 0x02, 0x20, 0x00, 0xbb, 0x04, 0x3f, 0x12, 0x00, 0x00, -0x00, 0x00, 0x3e, 0x04, 0x02, 0x0a, 0xbb, 0x04, 0x3f, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x47, 0xbb, 0x04, -0x3f, 0x16, 0x03, 0x00, 0x00, 0x00, 0x3e, 0x18, 0x02, 0x08, 0xbb, 0x04, 0x48, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, -0x02, 0x0a, 0x74, 0xb7, 0x02, 0x02, 0x08, 0x02, 0xb7, 0x02, 0x02, 0x48, 0x03, 0xbb, 0x04, 0x48, 0x02, 0x09, 0x00, 0x00, -0x00, 0xbc, 0x02, 0x02, 0x0e, 0x78, 0xbc, 0x02, 0x02, 0x09, 0x74, 0xbb, 0x04, 0x48, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, -0x02, 0x02, 0x09, 0x7b, 0xae, 0x83, 0x80, 0x02, 0x02, 0x0a, 0x0a, 0x0a, 0x0a, 0x75, 0x0a, 0x0a, 0x09, 0x76, 0x08, 0x08, -0x09, 0x09, 0x76, 0x76, 0x08, 0x08, 0x76, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x77, 0x3f, 0x76, 0x08, -0x08, 0x79, 0x0e, 0x08, 0x09, 0x09, 0x76, 0x3f, 0x08, 0x09, 0x3f, 0x08, 0x76, 0x08, 0x08, 0x08, 0x48, 0x0e, 0x08, 0x08, -0x48, 0x08, 0x08, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x47, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x7a, 0x3f, 0x08, 0x08, -0x08, 0x7c, 0x3e, 0x02, 0x02, 0x7d, 0x39, 0x7e, 0x02, 0x02, 0x3e, 0x0a, 0x02, 0x09, 0xbb, 0x04, 0x48, 0x16, 0x03, 0x00, -0x00, 0x00, 0xbb, 0x04, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x08, 0x00, 0x00, 0x80, 0x3f, 0x3e, 0x0a, -0x01, 0x09, 0x39, 0x9b, 0x01, 0x02, 0x01, 0x3e, 0x44, 0x07, 0x08, 0xbb, 0x04, 0x3f, 0x0a, 0x35, 0x00, 0x00, 0x00, 0xbb, -0x04, 0x3f, 0x12, 0x30, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x0e, 0xbb, 0x04, 0x3f, 0x08, 0x34, 0x00, 0x00, 0x00, 0xbb, -0x04, 0x48, 0x08, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x48, 0x0a, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x0c, 0x0a, -0xd7, 0xa3, 0x3a, 0xbb, 0x04, 0x48, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x1e, 0x31, 0x00, 0x00, 0x00, 0xbb, -0x04, 0x3f, 0x1a, 0x32, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x0a, 0x36, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x06, 0x37, -0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x10, 0x3a, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x08, 0x3b, 0x00, 0x00, 0x00, 0xbb, -0x04, 0x3f, 0x0c, 0x33, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x48, 0xbb, 0x04, 0x3f, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x89, -0x03, 0x16, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0xab, 0x02, 0x02, 0xb6, 0x02, 0x3e, 0x02, 0x00, 0xb7, 0x02, 0x39, -0xb8, 0x02, 0x02, 0x00, 0xbb, 0x04, 0x3f, 0x14, 0x1e, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x0e, 0x39, 0x00, 0x00, 0x00, -0xbb, 0x04, 0x3f, 0x12, 0x38, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x16, 0x23, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x14, -0x21, 0x00, 0x00, 0x00, 0xbe, 0x02, 0x6a, 0x08, 0x0e, 0x3e, 0x02, 0x02, 0x9d, 0x03, 0x39, 0x9e, 0x03, 0x02, 0x02, 0xec, -0x04, 0x09, 0x0c, 0xa6, 0x04, 0xa6, 0x04, 0xa6, 0x04, 0xa6, 0x04, 0xbb, 0x04, 0x08, 0x1a, 0xcd, 0xcc, 0x4c, 0x3f, 0x3e, -0x70, 0x03, 0x09, 0x39, 0xea, 0x03, 0x02, 0x03, 0xbb, 0x04, 0x3f, 0x0e, 0x3c, 0x00, 0x00, 0x00, 0xad, 0x06, 0x09, 0xea, -0x02, 0xad, 0x06, 0x08, 0x02, 0xad, 0x06, 0x0e, 0x02, 0xc6, 0x06, 0x02, 0xc9, 0x0a, 0x00, 0x03, 0x18, 0x02, 0x39, 0x24, -0xe4, 0x07, 0x07, 0x39, 0x25, 0x04, 0x07, 0x01, 0x09, 0x6e, 0xa8, 0x06, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x13, 0x53, -0xb0, 0x01, 0x7f, 0x51, 0x01, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x5d, 0x54, 0x00, 0xc1, 0x0a, 0x08, 0x02, 0x56, 0x01, -0xc1, 0x0a, 0x08, 0x02, 0x58, 0x02, 0xe0, 0x0a, 0x09, 0x02, 0x06, 0x04, 0x02, 0x90, 0x07, 0xc1, 0x12, 0x09, 0x02, 0x55, -0x02, 0x2d, 0x76, 0x04, 0x04, 0x04, 0x20, 0x5c, 0x08, 0x02, 0x01, 0x42, 0xe1, 0x04, 0x13, 0x71, 0x04, 0x9f, 0x03, 0x51, -0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x08, 0x02, 0xa7, 0x1e, 0x3b, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x05, 0x18, -0x02, 0x99, 0x1e, 0x39, 0x18, 0x04, 0x13, 0xcd, 0x01, 0x02, 0x9f, 0x03, 0x59, 0x01, 0x0e, 0x02, 0x02, 0xc1, 0x0a, 0x08, -0x02, 0x02, 0x00, 0xc1, 0x0a, 0x08, 0x02, 0x04, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x06, 0x02, 0xe0, 0x0a, 0x09, 0x02, 0x06, -0x04, 0x02, 0xb2, 0x07, 0x4a, 0x08, 0x08, 0x1c, 0x82, 0x03, 0xca, 0x16, 0x14, 0x06, 0x28, 0x06, 0xa7, 0x1e, 0x19, 0x00, -0xba, 0x1e, 0x00, 0x01, 0x19, 0x18, 0x02, 0xc3, 0x10, 0x08, 0x06, 0x30, 0x0e, 0xc3, 0x10, 0x08, 0x08, 0x32, 0x16, 0xc8, -0x10, 0x08, 0x02, 0x0a, 0x02, 0xc3, 0x10, 0x08, 0x02, 0xd4, 0x07, 0x02, 0xd2, 0x0a, 0x09, 0x82, 0x01, 0x82, 0x01, 0xa4, -0x01, 0x03, 0x99, 0x1e, 0x7c, 0x18, 0x7b, 0xe5, 0x1e, 0x09, 0x90, 0x01, 0x6f, 0x02, 0x00, 0x00, 0x69, 0x02, 0x00, 0x00, -0xc1, 0x02, 0x00, 0x00, 0x77, 0x02, 0x00, 0x00, 0x99, 0x1e, 0x8e, 0x01, 0x18, 0x8d, 0x01, 0xe5, 0x1e, 0x09, 0x8c, 0x01, -0xa5, 0x01, 0x00, 0x00, 0x67, 0x02, 0x00, 0x00, 0xcb, 0x02, 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x80, 0x0b, 0x18, 0x17, -0x17, 0x2e, 0x2c, 0x2c, 0x2c, 0x2a, 0xc1, 0x0a, 0x09, 0x25, 0x25, 0x00, 0x80, 0x0b, 0x18, 0x04, 0x04, 0x0c, 0x0a, 0x0a, -0x0a, 0x08, 0xc1, 0x0a, 0x09, 0x31, 0x31, 0x00, 0x22, 0xd2, 0x02, 0x00, 0x23, 0x84, 0x01, 0x1e, 0x7f, 0x59, 0x65, 0x01, -0x09, 0x02, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc3, 0x10, 0x0e, 0xe7, 0x02, 0x7f, 0xe7, 0x02, 0x13, 0x5a, 0x04, -0x7f, 0xf2, 0x03, 0x01, 0x47, 0x02, 0x02, 0xc1, 0x12, 0x0e, 0x04, 0x04, 0x0a, 0x01, 0x09, 0x04, 0x1a, 0x22, 0x02, 0x00, -0x22, 0x01, 0x04, 0xd9, 0x06, 0x09, 0x06, 0xa4, 0x07, 0x08, 0x04, 0x22, 0x20, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0xc6, 0x06, -0x09, 0xa3, 0x07, 0x00, 0x26, 0xa7, 0x06, 0x24, 0x03, 0xa7, 0x06, 0x25, 0x02, 0x18, 0x04, 0x01, 0x0e, 0xac, 0x02, 0xb0, -0x02, 0x5c, 0x08, 0x02, 0x01, 0x42, 0xc0, 0x01, 0x13, 0x71, 0x06, 0x7f, 0xc3, 0x01, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, -0x14, 0x02, 0x0a, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x01, 0x09, 0x04, 0xc4, 0x02, -0x9e, 0x1e, 0xc9, 0x00, 0x00, 0x00, 0x18, 0x01, 0x13, 0xcd, 0x01, 0x0c, 0x7f, 0xcc, 0x01, 0x01, 0x0e, 0x02, 0x02, 0x13, -0x71, 0x06, 0x7f, 0xd1, 0x01, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x08, 0x10, 0x02, 0x13, 0xbe, 0x01, 0x08, 0x28, -0xda, 0x01, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x02, 0x14, 0x02, 0x5c, 0x08, 0x04, 0x01, 0x04, 0xdd, 0x01, 0xca, 0x16, -0x14, 0x04, 0x04, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0xc1, 0x0a, 0x08, 0x0c, 0x32, -0x00, 0xc1, 0x0a, 0x08, 0x04, 0x36, 0x01, 0xc3, 0x10, 0x08, 0x04, 0x04, 0x1e, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xec, 0x01, -0x4a, 0x08, 0x02, 0x0c, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x30, 0x02, 0xc8, 0x10, 0x08, 0x04, 0x04, 0x28, 0x99, 0x1e, 0x1c, -0x18, 0x1b, 0xe5, 0x1e, 0x08, 0xd2, 0x07, 0xd7, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xe2, -0x00, 0x00, 0x00, 0x13, 0x71, 0xab, 0x07, 0x7f, 0xf5, 0x01, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x6e, 0x02, -0x6c, 0x08, 0x02, 0x01, 0x28, 0xf8, 0x01, 0x92, 0x01, 0x4a, 0x08, 0x02, 0xa3, 0x07, 0x02, 0x3f, 0x08, 0x06, 0x06, 0x5c, -0x08, 0x02, 0x01, 0x1b, 0xfd, 0x01, 0xc3, 0x10, 0x08, 0x06, 0xd6, 0x01, 0x06, 0x13, 0x71, 0x04, 0x7f, 0x82, 0x02, 0x01, -0x08, 0x02, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x25, 0x81, 0x02, 0x84, 0x02, 0x13, 0xcd, 0x01, 0x06, 0x7f, 0x87, 0x02, 0x01, -0x0e, 0x02, 0x02, 0x13, 0x71, 0x04, 0x7f, 0x8a, 0x02, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x02, 0xf6, 0x01, -0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x13, 0x71, 0x0a, 0x7f, 0x92, 0x02, 0x01, 0x08, 0x02, -0x02, 0x4a, 0x08, 0x02, 0xa8, 0x01, 0x02, 0x13, 0x71, 0x04, 0x7f, 0x96, 0x02, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, -0x02, 0x08, 0x02, 0x13, 0x9d, 0x02, 0x0a, 0x7f, 0x9c, 0x02, 0x01, 0x48, 0x02, 0x02, 0x5c, 0x76, 0x02, 0x01, 0x3e, 0x9f, -0x02, 0xc1, 0x0a, 0x08, 0x06, 0x06, 0x01, 0xc1, 0x0a, 0x08, 0x04, 0x0a, 0x00, 0x7c, 0x08, 0x04, 0x01, 0x2b, 0x99, 0x02, -0x92, 0x01, 0x96, 0x01, 0x7c, 0x08, 0x02, 0x01, 0x2e, 0xa3, 0x02, 0xa5, 0x02, 0xa7, 0x02, 0x13, 0x53, 0x08, 0x7f, 0xab, -0x02, 0x01, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x09, 0x02, 0x02, 0x00, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, 0x09, -0x02, 0x06, 0x01, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, 0x09, 0x02, 0x0a, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, -0x18, 0xd0, 0x0a, 0x47, 0x02, 0x0a, 0x06, 0x02, 0xb4, 0x0a, 0x47, 0x02, 0x34, 0x01, 0x00, 0x00, 0x01, 0xb7, 0x02, 0x0a, -0x02, 0x01, 0x0e, 0x04, 0xa8, 0x04, 0xc1, 0x12, 0x0e, 0x02, 0x10, 0x02, 0xe8, 0x0a, 0x09, 0x04, 0x0a, 0x04, 0x02, 0xa8, -0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x4a, 0x0e, 0x04, 0x72, 0x04, 0x99, 0x1e, 0x66, 0x18, 0x65, 0xe5, 0x1e, 0x0e, -0xfc, 0x06, 0x09, 0x01, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x13, 0x71, -0x91, 0x06, 0x7f, 0xc3, 0x02, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x04, 0x04, 0x84, 0x01, 0xce, 0x10, 0x0e, 0x04, 0x87, -0x06, 0x04, 0x13, 0x71, 0x04, 0x7f, 0xca, 0x02, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x02, 0xf6, 0x02, 0xa7, -0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x13, 0x71, 0x0c, 0x7f, 0xd3, 0x02, 0x01, 0x08, 0x02, 0x02, -0xc3, 0x10, 0x08, 0x02, 0xaa, 0x02, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x28, 0xd6, 0x02, 0x92, 0x01, 0x4a, 0x08, 0x02, 0xe7, -0x05, 0x02, 0x3f, 0x08, 0x06, 0x06, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xdb, 0x02, 0x13, 0x84, 0x01, 0x06, 0x7f, 0xde, 0x02, -0x01, 0x09, 0x02, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x23, 0x71, 0x02, 0x7f, 0xde, 0x02, 0x8f, 0x01, 0x01, 0x08, -0x02, 0x02, 0xce, 0x10, 0x0e, 0x02, 0x06, 0x02, 0x01, 0x0e, 0x04, 0xfc, 0x04, 0x5c, 0x0e, 0x02, 0x01, 0x45, 0xe6, 0x02, -0x13, 0xcd, 0x01, 0x04, 0x7f, 0xe8, 0x02, 0x01, 0x0e, 0x02, 0x02, 0xc4, 0x12, 0x08, 0x02, 0x08, 0x02, 0x6c, 0x08, 0x02, -0x01, 0x28, 0xeb, 0x02, 0x92, 0x01, 0x6c, 0x08, 0x0a, 0x01, 0x1a, 0xec, 0x02, 0xcc, 0x02, 0xc3, 0x10, 0x08, 0x08, 0xbe, -0x03, 0x32, 0x4a, 0x08, 0x02, 0x0a, 0x02, 0xce, 0x10, 0x0e, 0x02, 0x26, 0x02, 0x4b, 0x0e, 0x04, 0x60, 0x04, 0x99, 0x1e, -0x54, 0x18, 0x53, 0xe5, 0x1e, 0x0e, 0x80, 0x06, 0x49, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x79, 0x01, 0x00, 0x00, -0x4e, 0x01, 0x00, 0x00, 0x13, 0xbe, 0x01, 0xa9, 0x05, 0x27, 0x8f, 0x01, 0x01, 0x08, 0x02, 0x02, 0xce, 0x10, 0x0e, 0x04, -0xa3, 0x05, 0x04, 0x01, 0x09, 0x02, 0xae, 0x05, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc3, 0x10, 0x08, 0x04, 0xd6, 0x03, -0xf8, 0x01, 0xce, 0x10, 0x0e, 0x02, 0x06, 0x02, 0x4b, 0x0e, 0x04, 0x04, 0x0e, 0x13, 0xbe, 0x01, 0x02, 0x27, 0xe6, 0x01, -0xc1, 0x0a, 0x08, 0x02, 0x04, 0x00, 0x22, 0x02, 0x00, 0x13, 0xbe, 0x01, 0x02, 0x27, 0xda, 0x01, 0xc1, 0x0a, 0x08, 0x02, -0x08, 0x01, 0x22, 0x02, 0x00, 0x13, 0xbe, 0x01, 0x02, 0x27, 0xd5, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x0c, 0x02, 0x22, 0x02, -0x00, 0x01, 0x09, 0x02, 0xc8, 0x05, 0x9e, 0x1e, 0x8b, 0x01, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, +0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, +0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, +0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, +0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, +0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, +0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, +0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x3a, 0x1e, 0x04, 0x00, 0x8e, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x28, 0x00, +0x10, 0x00, 0x22, 0x01, 0x10, 0x00, 0x21, 0x06, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x02, 0x00, 0x47, 0xb2, 0x01, +0x02, 0x00, 0x23, 0x00, 0x01, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x10, 0x98, +0x01, 0x1e, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, 0x20, 0xb7, 0x02, 0x02, 0x08, 0x04, 0xb8, +0x02, 0x02, 0x09, 0x04, 0xb7, 0x02, 0x08, 0x08, 0x03, 0x94, 0x02, 0x0c, 0xfe, 0x02, 0x08, 0x09, 0x09, 0x08, 0x08, 0x08, +0x0e, 0x3e, 0x18, 0x07, 0x09, 0x3e, 0x02, 0x07, 0x0e, 0xc1, 0x04, 0x02, 0x09, 0x24, 0x25, 0xb5, 0x02, 0x32, 0x20, 0x01, +0xb8, 0x02, 0x10, 0x0e, 0x03, 0xb5, 0x02, 0x02, 0x20, 0x00, 0xbb, 0x04, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x04, +0x02, 0x0a, 0xbb, 0x04, 0x3f, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x47, 0xbb, 0x04, 0x3f, 0x16, 0x03, 0x00, +0x00, 0x00, 0x3e, 0x18, 0x02, 0x08, 0xbb, 0x04, 0x48, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x0a, 0x74, 0xb7, +0x02, 0x02, 0x08, 0x02, 0xb7, 0x02, 0x02, 0x48, 0x03, 0xbb, 0x04, 0x48, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, +0x0e, 0x78, 0xbc, 0x02, 0x02, 0x09, 0x74, 0xbb, 0x04, 0x48, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, 0x7b, +0xae, 0x83, 0x80, 0x02, 0x02, 0x0a, 0x0a, 0x0a, 0x0a, 0x75, 0x0a, 0x0a, 0x09, 0x76, 0x08, 0x08, 0x09, 0x09, 0x76, 0x76, +0x08, 0x08, 0x76, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x77, 0x3f, 0x76, 0x08, 0x08, 0x79, 0x0e, 0x08, +0x09, 0x09, 0x76, 0x3f, 0x08, 0x09, 0x3f, 0x08, 0x76, 0x08, 0x08, 0x08, 0x48, 0x0e, 0x08, 0x08, 0x48, 0x08, 0x08, 0x0e, +0x08, 0x08, 0x08, 0x08, 0x08, 0x47, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x7a, 0x3f, 0x08, 0x08, 0x08, 0x7c, 0x3e, 0x02, +0x02, 0x7d, 0x39, 0x7e, 0x02, 0x02, 0x3e, 0x0a, 0x02, 0x09, 0xbb, 0x04, 0x48, 0x16, 0x03, 0x00, 0x00, 0x00, 0xbb, 0x04, +0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x08, 0x00, 0x00, 0x80, 0x3f, 0x3e, 0x0a, 0x01, 0x09, 0x39, 0x9b, +0x01, 0x02, 0x01, 0x3e, 0x44, 0x07, 0x08, 0xbb, 0x04, 0x3f, 0x0a, 0x35, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x12, 0x30, +0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x0e, 0xbb, 0x04, 0x3f, 0x08, 0x34, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x48, 0x08, 0x02, +0x00, 0x00, 0x00, 0xbb, 0x04, 0x48, 0x0a, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x0c, 0x0a, 0xd7, 0xa3, 0x3a, 0xbb, +0x04, 0x48, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x1e, 0x31, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x1a, 0x32, +0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x0a, 0x36, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x06, 0x37, 0x00, 0x00, 0x00, 0xbb, +0x04, 0x3f, 0x10, 0x3a, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x08, 0x3b, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x0c, 0x33, +0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x48, 0xbb, 0x04, 0x3f, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x89, 0x03, 0x16, 0x08, 0x03, +0x00, 0x00, 0x00, 0x01, 0x00, 0xab, 0x02, 0x02, 0xb6, 0x02, 0x3e, 0x02, 0x00, 0xb7, 0x02, 0x39, 0xb8, 0x02, 0x02, 0x00, +0xbb, 0x04, 0x3f, 0x14, 0x1e, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x0e, 0x39, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x12, +0x38, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x16, 0x23, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3f, 0x14, 0x21, 0x00, 0x00, 0x00, +0xbe, 0x02, 0x62, 0x08, 0x0e, 0x3e, 0x02, 0x02, 0x99, 0x03, 0x39, 0x9a, 0x03, 0x02, 0x02, 0xec, 0x04, 0x09, 0x0c, 0x9e, +0x04, 0x9e, 0x04, 0x9e, 0x04, 0x9e, 0x04, 0xbb, 0x04, 0x08, 0x1a, 0xcd, 0xcc, 0x4c, 0x3f, 0x3e, 0x70, 0x03, 0x09, 0x39, +0xe6, 0x03, 0x02, 0x03, 0xbb, 0x04, 0x3f, 0x0e, 0x3c, 0x00, 0x00, 0x00, 0xad, 0x06, 0x09, 0xea, 0x02, 0xad, 0x06, 0x08, +0x02, 0xad, 0x06, 0x0e, 0x02, 0xc6, 0x06, 0x02, 0xc1, 0x0a, 0x00, 0x03, 0x18, 0x02, 0x39, 0x24, 0xdc, 0x07, 0x07, 0x39, +0x25, 0x04, 0x07, 0x01, 0x09, 0x6e, 0xa0, 0x06, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x13, 0x53, 0xb0, 0x01, 0x7f, 0x51, +0x01, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x5d, 0x54, 0x00, 0xc1, 0x0a, 0x08, 0x02, 0x56, 0x01, 0xc1, 0x0a, 0x08, 0x02, +0x58, 0x02, 0xe0, 0x0a, 0x09, 0x02, 0x06, 0x04, 0x02, 0x88, 0x07, 0xc1, 0x12, 0x09, 0x02, 0x55, 0x02, 0x2d, 0x76, 0x04, +0x04, 0x04, 0x20, 0x5c, 0x08, 0x02, 0x01, 0x42, 0xdd, 0x04, 0x13, 0x71, 0x04, 0x9b, 0x03, 0x51, 0x01, 0x08, 0x02, 0x02, +0xca, 0x16, 0x14, 0x02, 0x08, 0x02, 0xa7, 0x1e, 0x3b, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x05, 0x18, 0x02, 0x99, 0x1e, 0x39, +0x18, 0x04, 0x13, 0xcd, 0x01, 0x02, 0x9b, 0x03, 0x59, 0x01, 0x0e, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x02, 0x02, 0x00, 0xc1, +0x0a, 0x08, 0x02, 0x04, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x06, 0x02, 0xe0, 0x0a, 0x09, 0x02, 0x06, 0x04, 0x02, 0xaa, 0x07, +0x4a, 0x08, 0x08, 0x1c, 0x82, 0x03, 0xca, 0x16, 0x14, 0x06, 0x28, 0x06, 0xa7, 0x1e, 0x19, 0x00, 0xba, 0x1e, 0x00, 0x01, +0x19, 0x18, 0x02, 0xc3, 0x10, 0x08, 0x06, 0x30, 0x0e, 0xc3, 0x10, 0x08, 0x08, 0x32, 0x16, 0xc8, 0x10, 0x08, 0x02, 0x0a, +0x02, 0xc3, 0x10, 0x08, 0x02, 0xcc, 0x07, 0x02, 0xd2, 0x0a, 0x09, 0x82, 0x01, 0x82, 0x01, 0xa4, 0x01, 0x03, 0x99, 0x1e, +0x7c, 0x18, 0x7b, 0xe5, 0x1e, 0x09, 0x90, 0x01, 0x6b, 0x02, 0x00, 0x00, 0x65, 0x02, 0x00, 0x00, 0xbd, 0x02, 0x00, 0x00, +0x73, 0x02, 0x00, 0x00, 0x99, 0x1e, 0x8e, 0x01, 0x18, 0x8d, 0x01, 0xe5, 0x1e, 0x09, 0x8c, 0x01, 0xa1, 0x01, 0x00, 0x00, +0x63, 0x02, 0x00, 0x00, 0xc7, 0x02, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0x80, 0x0b, 0x18, 0x17, 0x17, 0x2e, 0x2c, 0x2c, +0x2c, 0x2a, 0xc1, 0x0a, 0x09, 0x25, 0x25, 0x00, 0x80, 0x0b, 0x18, 0x04, 0x04, 0x0c, 0x0a, 0x0a, 0x0a, 0x08, 0xc1, 0x0a, +0x09, 0x31, 0x31, 0x00, 0x22, 0xd2, 0x02, 0x00, 0x23, 0x84, 0x01, 0x1e, 0x7f, 0x59, 0x65, 0x01, 0x09, 0x02, 0x02, 0x3d, +0x0e, 0x02, 0x02, 0x02, 0x18, 0xc3, 0x10, 0x0e, 0xe7, 0x02, 0x7f, 0xe7, 0x02, 0x13, 0x5a, 0x04, 0x7f, 0xee, 0x03, 0x01, +0x47, 0x02, 0x02, 0xc1, 0x12, 0x0e, 0x04, 0x04, 0x0a, 0x01, 0x09, 0x04, 0x1a, 0x22, 0x02, 0x00, 0x22, 0x01, 0x04, 0xd9, +0x06, 0x09, 0x06, 0x9c, 0x07, 0x08, 0x04, 0x22, 0x20, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0xc6, 0x06, 0x09, 0x9b, 0x07, 0x00, +0x26, 0xa7, 0x06, 0x24, 0x03, 0xa7, 0x06, 0x25, 0x02, 0x18, 0x04, 0x01, 0x0e, 0xac, 0x02, 0xb0, 0x02, 0x5c, 0x08, 0x02, +0x01, 0x42, 0xc0, 0x01, 0x13, 0x71, 0x06, 0x7f, 0xc3, 0x01, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x0a, 0x02, +0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x01, 0x09, 0x04, 0xc4, 0x02, 0x9e, 0x1e, 0xc9, 0x00, +0x00, 0x00, 0x18, 0x01, 0x13, 0xcd, 0x01, 0x0c, 0x7f, 0xcc, 0x01, 0x01, 0x0e, 0x02, 0x02, 0x13, 0x71, 0x06, 0x7f, 0xd1, +0x01, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x08, 0x10, 0x02, 0x13, 0xbe, 0x01, 0x08, 0x28, 0xda, 0x01, 0x01, 0x08, +0x02, 0x02, 0x4a, 0x08, 0x02, 0x14, 0x02, 0x5c, 0x08, 0x04, 0x01, 0x04, 0xdd, 0x01, 0xca, 0x16, 0x14, 0x04, 0x04, 0x02, +0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0xc1, 0x0a, 0x08, 0x0c, 0x32, 0x00, 0xc1, 0x0a, 0x08, +0x04, 0x36, 0x01, 0xc3, 0x10, 0x08, 0x04, 0x04, 0x1e, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xec, 0x01, 0x4a, 0x08, 0x02, 0x0c, +0x02, 0xc3, 0x10, 0x08, 0x02, 0x30, 0x02, 0xc8, 0x10, 0x08, 0x04, 0x04, 0x28, 0x99, 0x1e, 0x1c, 0x18, 0x1b, 0xe5, 0x1e, +0x08, 0xca, 0x07, 0xd7, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x13, +0x71, 0xa3, 0x07, 0x7f, 0xf5, 0x01, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x6e, 0x02, 0x6c, 0x08, 0x02, 0x01, +0x28, 0xf8, 0x01, 0x92, 0x01, 0x4a, 0x08, 0x02, 0x9b, 0x07, 0x02, 0x3f, 0x08, 0x06, 0x06, 0x5c, 0x08, 0x02, 0x01, 0x1b, +0xfd, 0x01, 0xc3, 0x10, 0x08, 0x06, 0xd6, 0x01, 0x06, 0x13, 0x71, 0x04, 0x7f, 0x82, 0x02, 0x01, 0x08, 0x02, 0x02, 0x6c, +0x08, 0x02, 0x01, 0x25, 0x81, 0x02, 0x84, 0x02, 0x13, 0xcd, 0x01, 0x06, 0x7f, 0x87, 0x02, 0x01, 0x0e, 0x02, 0x02, 0x13, +0x71, 0x04, 0x7f, 0x8a, 0x02, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x02, 0xf6, 0x01, 0xa7, 0x1e, 0x03, 0x00, +0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x13, 0x71, 0x0a, 0x7f, 0x92, 0x02, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x02, +0xa8, 0x01, 0x02, 0x13, 0x71, 0x04, 0x7f, 0x96, 0x02, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x08, 0x02, 0x13, +0x9d, 0x02, 0x0a, 0x7f, 0x9c, 0x02, 0x01, 0x48, 0x02, 0x02, 0x5c, 0x76, 0x02, 0x01, 0x3e, 0x9f, 0x02, 0xc1, 0x0a, 0x08, +0x06, 0x06, 0x01, 0xc1, 0x0a, 0x08, 0x04, 0x0a, 0x00, 0x7c, 0x08, 0x04, 0x01, 0x2b, 0x99, 0x02, 0x92, 0x01, 0x96, 0x01, +0x7c, 0x08, 0x02, 0x01, 0x2e, 0xa3, 0x02, 0xa5, 0x02, 0xa7, 0x02, 0x13, 0x53, 0x08, 0x7f, 0xab, 0x02, 0x01, 0x0a, 0x02, +0x02, 0xc1, 0x0a, 0x09, 0x02, 0x02, 0x00, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, 0x09, 0x02, 0x06, 0x01, 0x3d, +0x0e, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, 0x09, 0x02, 0x0a, 0x02, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xd0, 0x0a, 0x47, +0x02, 0x0a, 0x06, 0x02, 0xb4, 0x0a, 0x47, 0x02, 0x34, 0x01, 0x00, 0x00, 0x01, 0xb7, 0x02, 0x0a, 0x02, 0x01, 0x0e, 0x04, +0xa8, 0x04, 0xc1, 0x12, 0x0e, 0x02, 0x10, 0x02, 0xe8, 0x0a, 0x09, 0x04, 0x0a, 0x04, 0x02, 0xa8, 0x02, 0x3d, 0x0e, 0x02, +0x02, 0x02, 0x18, 0x4a, 0x0e, 0x04, 0x72, 0x04, 0x99, 0x1e, 0x66, 0x18, 0x65, 0xe5, 0x1e, 0x0e, 0xf4, 0x06, 0x09, 0x01, +0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x13, 0x71, 0x89, 0x06, 0x7f, 0xc3, +0x02, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x04, 0x04, 0x84, 0x01, 0xce, 0x10, 0x0e, 0x04, 0xff, 0x05, 0x04, 0x13, 0x71, +0x04, 0x7f, 0xca, 0x02, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x14, 0x02, 0x02, 0xf6, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, +0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x13, 0x71, 0x0c, 0x7f, 0xd3, 0x02, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, +0xaa, 0x02, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x28, 0xd6, 0x02, 0x92, 0x01, 0x4a, 0x08, 0x02, 0xdf, 0x05, 0x02, 0x3f, 0x08, +0x06, 0x06, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xdb, 0x02, 0x13, 0x84, 0x01, 0x06, 0x7f, 0xde, 0x02, 0x01, 0x09, 0x02, 0x02, +0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0x23, 0x71, 0x02, 0x7f, 0xde, 0x02, 0x8f, 0x01, 0x01, 0x08, 0x02, 0x02, 0xce, 0x10, +0x0e, 0x02, 0x06, 0x02, 0x01, 0x0e, 0x04, 0xfc, 0x04, 0x5c, 0x0e, 0x02, 0x01, 0x45, 0xe6, 0x02, 0x13, 0xcd, 0x01, 0x04, +0x7f, 0xe8, 0x02, 0x01, 0x0e, 0x02, 0x02, 0xc4, 0x12, 0x08, 0x02, 0x08, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x28, 0xeb, 0x02, +0x92, 0x01, 0x6c, 0x08, 0x0a, 0x01, 0x1a, 0xec, 0x02, 0xcc, 0x02, 0xc3, 0x10, 0x08, 0x08, 0xbe, 0x03, 0x32, 0x4a, 0x08, +0x02, 0x0a, 0x02, 0xce, 0x10, 0x0e, 0x02, 0x26, 0x02, 0x4b, 0x0e, 0x04, 0x60, 0x04, 0x99, 0x1e, 0x54, 0x18, 0x53, 0xe5, +0x1e, 0x0e, 0xf8, 0x05, 0x49, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x79, 0x01, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, +0x01, 0x09, 0xa1, 0x05, 0xa6, 0x05, 0x3d, 0x0e, 0x02, 0x02, 0x02, 0x18, 0xc3, 0x10, 0x08, 0x04, 0xce, 0x03, 0xf0, 0x01, +0xce, 0x10, 0x0e, 0x02, 0x06, 0x02, 0x4b, 0x0e, 0x04, 0x04, 0x95, 0x05, 0x13, 0xbe, 0x01, 0x02, 0x27, 0xe6, 0x01, 0xc1, +0x0a, 0x08, 0x02, 0x04, 0x00, 0x22, 0x02, 0x00, 0x13, 0xbe, 0x01, 0x02, 0x27, 0xda, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x08, +0x01, 0x22, 0x02, 0x00, 0x13, 0xbe, 0x01, 0x02, 0x27, 0xd5, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x0c, 0x02, 0x22, 0x02, 0x00, +0x01, 0x09, 0x02, 0xc0, 0x05, 0x9e, 0x1e, 0x87, 0x01, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, @@ -1958,11 +2010,11 @@ const uint8_t GRID_PACKAGE[] = { 0x04, 0x07, 0x10, 0xf8, 0x03, 0x1e, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, 0x20, 0xb7, 0x02, 0x02, 0x08, 0x04, 0xbb, 0x04, 0x08, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0xec, 0x04, 0x09, 0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0x3e, 0x74, 0x03, 0x09, 0x39, 0xfb, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xef, 0x03, 0x00, -0x03, 0x18, 0x02, 0x22, 0xed, 0x03, 0xf7, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x40, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x89, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x34, 0x15, 0x00, 0x00, 0x91, 0x02, 0x01, 0x91, 0x02, 0x20, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, +0x03, 0x18, 0x02, 0x22, 0xed, 0x03, 0xf7, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x8c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x16, 0x00, 0x00, 0x91, 0x02, 0x01, 0x91, 0x02, 0x20, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xaf, 0x0f, 0x00, 0x04, 0xed, 0xc2, 0xa5, -0xf3, 0x06, 0x00, 0x71, 0x8c, 0x01, 0xa7, 0x01, 0xb6, 0x01, 0xc6, 0x01, 0x89, 0x02, 0x10, 0x92, 0x01, 0x06, 0x10, 0x37, +0xf3, 0x06, 0x00, 0x73, 0x92, 0x01, 0xba, 0x01, 0xc9, 0x01, 0xd9, 0x01, 0x9b, 0x02, 0x10, 0x96, 0x01, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x00, 0x44, 0x0e, @@ -1984,199 +2036,204 @@ const uint8_t GRID_PACKAGE[] = { 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, -0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x18, 0x1e, 0x00, 0x10, 0x36, 0x0b, 0x2b, 0x10, 0x1e, 0x1e, -0x04, 0x10, 0x20, 0x1e, 0x07, 0x47, 0x82, 0x01, 0x04, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x01, 0x0b, 0x01, +0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x20, 0x1e, 0x00, 0x10, 0x50, 0x0b, 0x2b, 0x10, 0x1e, 0x1e, +0x04, 0x10, 0x20, 0x1e, 0x07, 0x47, 0x80, 0x01, 0x04, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x01, 0x0b, 0x01, 0x03, 0x01, 0x0b, 0x01, 0x04, 0x00, 0x00, 0x02, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x06, 0x20, 0xb7, -0x02, 0x02, 0x06, 0x04, 0xb8, 0x02, 0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, 0x06, 0x03, 0xae, 0x02, 0x24, 0x07, 0xb5, 0x02, -0x1a, 0x20, 0x00, 0xbb, 0x04, 0x28, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x04, 0x20, 0x01, 0xbb, 0x04, 0x2b, 0x02, -0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x28, 0x06, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2b, 0x04, 0x01, 0x00, 0x00, 0x00, -0xbb, 0x04, 0x28, 0x06, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2b, 0x04, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x22, 0x09, -0x03, 0xbb, 0x04, 0x28, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x48, 0x8e, 0x03, 0x02, 0x08, 0x47, 0x2b, -0x2b, 0x2b, 0x06, 0x49, 0xbb, 0x04, 0x28, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x4a, 0x4b, 0xae, 0x02, 0x02, -0x4c, 0x3e, 0x02, 0x02, 0x4d, 0x39, 0x4e, 0x02, 0x02, 0x3e, 0x04, 0x02, 0x08, 0xbb, 0x04, 0x2b, 0x28, 0x04, 0x00, 0x00, -0x00, 0x3e, 0x16, 0x03, 0x2b, 0x39, 0x70, 0x02, 0x03, 0xb2, 0x06, 0x2b, 0x04, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x28, -0x04, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x08, 0x75, 0xb7, 0x02, 0x02, 0x06, 0x02, 0xb7, 0x02, 0x02, 0x28, 0x03, -0xbb, 0x04, 0x28, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, 0x79, 0xbc, 0x02, 0x02, 0x07, 0x75, 0xbb, 0x04, -0x28, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x7c, 0xae, 0x83, 0x80, 0x02, 0x02, 0x08, 0x08, 0x08, 0x08, -0x76, 0x08, 0x08, 0x07, 0x77, 0x06, 0x06, 0x07, 0x07, 0x77, 0x77, 0x06, 0x06, 0x77, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, -0x06, 0x06, 0x07, 0x78, 0x2b, 0x77, 0x06, 0x06, 0x7a, 0x09, 0x06, 0x07, 0x07, 0x77, 0x2b, 0x06, 0x07, 0x2b, 0x06, 0x77, -0x06, 0x06, 0x06, 0x28, 0x09, 0x06, 0x06, 0x28, 0x06, 0x06, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x47, 0x08, 0x08, 0x06, -0x06, 0x06, 0x06, 0x7b, 0x2b, 0x06, 0x06, 0x06, 0x7d, 0x3e, 0x02, 0x02, 0x7e, 0x39, 0x7f, 0x02, 0x02, 0x3e, 0x16, 0x01, -0x07, 0x39, 0x8b, 0x01, 0x02, 0x01, 0x3e, 0x34, 0x01, 0x2b, 0x39, 0xa6, 0x01, 0x02, 0x01, 0x3e, 0x1c, 0x03, 0x07, 0x39, -0xb5, 0x01, 0x02, 0x03, 0x3e, 0x08, 0x03, 0x06, 0x39, 0xb5, 0x01, 0x18, 0x03, 0xbb, 0x04, 0x06, 0x0e, 0x00, 0x00, 0x00, -0x40, 0xbb, 0x04, 0x06, 0x08, 0x00, 0x00, 0x80, 0xbf, 0xbb, 0x04, 0x06, 0x16, 0x00, 0x00, 0x80, 0x3f, 0xbc, 0x02, 0x52, -0x06, 0x34, 0xbc, 0x02, 0x02, 0x06, 0x2f, 0xde, 0x02, 0x02, 0x07, 0x06, 0x85, 0x02, 0x86, 0x02, 0x3e, 0x02, 0x03, 0x87, -0x02, 0x39, 0x88, 0x02, 0x02, 0x03, 0xc6, 0x06, 0x02, 0x89, 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, 0x2b, 0xc6, 0x02, 0x02, -0x22, 0x6e, 0x00, 0x01, 0x2b, 0x04, 0x72, 0xc7, 0x10, 0x2b, 0x02, 0x02, 0x70, 0x33, 0x51, 0xf4, 0x01, 0x4f, 0x2c, 0xab, -0x01, 0x2c, 0x01, 0x08, 0x02, 0x02, 0x01, 0x07, 0x7e, 0xb2, 0x03, 0xc1, 0x12, 0x07, 0x0f, 0x6e, 0x0f, 0xb0, 0x0a, 0x1b, -0x3a, 0x3a, 0xc1, 0x0a, 0x07, 0x0d, 0x0d, 0x00, 0x3d, 0x09, 0xf3, 0x02, 0xf3, 0x02, 0xf3, 0x02, 0x18, 0x13, 0xba, 0x01, -0x04, 0xb6, 0x01, 0x29, 0xc1, 0x0a, 0x06, 0x02, 0x06, 0x00, 0x22, 0x02, 0x00, 0x13, 0xba, 0x01, 0x02, 0xb6, 0x01, 0x2f, -0xc1, 0x0a, 0x06, 0x02, 0x0a, 0x01, 0x22, 0x02, 0x00, 0x13, 0xba, 0x01, 0x02, 0xb6, 0x01, 0x34, 0xc1, 0x0a, 0x06, 0x02, -0x0e, 0x02, 0x22, 0x02, 0x00, 0x01, 0x2b, 0xd4, 0x02, 0xf2, 0x03, 0xcb, 0x10, 0x2b, 0x02, 0x02, 0xf0, 0x03, 0x23, 0x51, -0x04, 0x80, 0x01, 0x65, 0xeb, 0x02, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0xd1, 0x02, 0xd1, 0x02, 0xdb, 0x02, 0x22, -0x01, 0x00, 0x01, 0x2b, 0x08, 0xb0, 0x01, 0xcb, 0x10, 0x2b, 0x02, 0x02, 0xae, 0x01, 0xbf, 0x0c, 0x06, 0x08, 0xb6, 0x01, -0xc8, 0x10, 0x06, 0x02, 0x04, 0x02, 0xc8, 0x10, 0x06, 0x08, 0x08, 0x0c, 0x4b, 0x06, 0x02, 0x06, 0x02, 0xbf, 0x0c, 0x06, -0x0a, 0x1e, 0x4a, 0x06, 0x02, 0x16, 0x02, 0x4b, 0x06, 0x02, 0x0e, 0x02, 0xc8, 0x10, 0x06, 0x06, 0x04, 0x20, 0xc1, 0x0a, -0x06, 0x04, 0x36, 0x00, 0x4a, 0x06, 0x02, 0x02, 0x06, 0xd2, 0x0a, 0x07, 0xb8, 0x02, 0xb8, 0x02, 0xf0, 0x02, 0x00, 0xc1, -0x0a, 0x06, 0xad, 0x02, 0xad, 0x02, 0x03, 0x4a, 0x06, 0x02, 0x18, 0x02, 0xc1, 0x0a, 0x06, 0x04, 0xa7, 0x02, 0x00, 0x4b, -0x06, 0x02, 0x02, 0x06, 0xd2, 0x0a, 0x07, 0xae, 0x02, 0xae, 0x02, 0x08, 0x00, 0xc1, 0x0a, 0x06, 0xa5, 0x02, 0xa5, 0x02, -0x00, 0xc3, 0x10, 0x06, 0x0a, 0x2e, 0x32, 0xc1, 0x0a, 0x06, 0x04, 0x97, 0x02, 0x03, 0x4a, 0x06, 0x02, 0x06, 0x02, 0x4b, -0x06, 0x02, 0x12, 0x02, 0xc0, 0x10, 0x2b, 0x0c, 0x66, 0x98, 0x03, 0xbf, 0x0c, 0x06, 0x02, 0x02, 0x4a, 0x06, 0x02, 0x60, -0x02, 0xc3, 0x10, 0x06, 0x02, 0x48, 0x02, 0x4a, 0x06, 0x06, 0x06, 0x1c, 0x4b, 0x06, 0x02, 0x2c, 0x02, 0x23, 0xba, 0x01, -0x0e, 0x89, 0x02, 0x36, 0x2c, 0x22, 0x00, 0x28, 0x3f, 0x06, 0x04, 0x12, 0x23, 0xba, 0x01, 0x02, 0x89, 0x02, 0x36, 0x31, -0x22, 0x00, 0x02, 0xc1, 0x0a, 0x06, 0x04, 0xe1, 0x01, 0x01, 0x3f, 0x06, 0x02, 0x02, 0xd2, 0x0a, 0x07, 0xee, 0x01, 0xee, -0x01, 0x0e, 0x01, 0x13, 0xb5, 0x01, 0xe7, 0x01, 0x89, 0x02, 0x2c, 0x22, 0x00, 0xe7, 0x01, 0x22, 0xc6, 0x02, 0xd2, 0x01, -0x8d, 0x1e, 0x88, 0x06, 0x52, 0x49, 0x50, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x86, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, -0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x01, 0x44, 0x01, 0x05, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, -0x01, 0x90, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x08, 0x00, 0x00, -0x00, 0x02, 0x10, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x10, 0x01, 0x09, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01, 0x0a, 0x00, -0x00, 0x00, 0x02, 0x30, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x44, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x0d, -0x00, 0x00, 0x00, 0x02, 0x90, 0x00, 0x0d, 0x00, 0x00, 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, +0x02, 0x02, 0x06, 0x04, 0xb8, 0x02, 0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, 0x06, 0x03, 0xae, 0x02, 0x28, 0x07, 0xb5, 0x02, +0x1a, 0x20, 0x00, 0xbb, 0x04, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x04, 0x20, 0x01, 0xbb, 0x04, 0x2d, 0x02, +0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2a, 0x06, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2d, 0x04, 0x01, 0x00, 0x00, 0x00, +0xbb, 0x04, 0x2a, 0x06, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2d, 0x04, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x22, 0x09, +0x03, 0xbb, 0x04, 0x2a, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x4a, 0x8e, 0x03, 0x02, 0x08, 0x49, 0x2d, +0x2d, 0x2d, 0x06, 0x4b, 0xbb, 0x04, 0x2a, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x4c, 0x4d, 0xae, 0x02, 0x02, +0x4e, 0x3e, 0x02, 0x02, 0x4f, 0x39, 0x50, 0x02, 0x02, 0x3e, 0x04, 0x02, 0x08, 0xbb, 0x04, 0x2d, 0x28, 0x04, 0x00, 0x00, +0x00, 0xbb, 0x04, 0x2d, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x3e, 0x0a, 0x03, 0x2d, 0x39, 0x72, 0x02, 0x03, 0xb2, 0x06, 0x2d, +0x04, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2a, 0x04, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x08, 0x77, 0xb7, 0x02, +0x02, 0x06, 0x02, 0xb7, 0x02, 0x02, 0x2a, 0x03, 0xbb, 0x04, 0x2a, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, +0x7b, 0xbc, 0x02, 0x02, 0x07, 0x77, 0xbb, 0x04, 0x2a, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x7e, 0xae, +0x83, 0x80, 0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x78, 0x08, 0x08, 0x07, 0x79, 0x06, 0x06, 0x07, 0x07, 0x79, 0x79, 0x06, +0x06, 0x79, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x7a, 0x2d, 0x79, 0x06, 0x06, 0x7c, 0x09, 0x06, 0x07, +0x07, 0x79, 0x2d, 0x06, 0x07, 0x2d, 0x06, 0x79, 0x06, 0x06, 0x06, 0x2a, 0x09, 0x06, 0x06, 0x2a, 0x06, 0x06, 0x09, 0x06, +0x06, 0x06, 0x06, 0x06, 0x49, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x7d, 0x2d, 0x06, 0x06, 0x06, 0x7f, 0x3e, 0x02, 0x02, +0x80, 0x01, 0x39, 0x81, 0x01, 0x02, 0x02, 0x3e, 0x1e, 0x01, 0x07, 0x39, 0x91, 0x01, 0x02, 0x01, 0xbb, 0x04, 0x06, 0x40, +0x0a, 0xd7, 0x23, 0x3c, 0x3e, 0x0e, 0x01, 0x2d, 0x39, 0xb9, 0x01, 0x02, 0x01, 0x3e, 0x1c, 0x03, 0x07, 0x39, 0xc8, 0x01, +0x02, 0x03, 0x3e, 0x08, 0x03, 0x06, 0x39, 0xc8, 0x01, 0x18, 0x03, 0xbb, 0x04, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x40, 0xbb, +0x04, 0x06, 0x08, 0x00, 0x00, 0x80, 0xbf, 0xbb, 0x04, 0x06, 0x16, 0x00, 0x00, 0x80, 0x3f, 0xbc, 0x02, 0x52, 0x06, 0x36, +0xbc, 0x02, 0x02, 0x06, 0x31, 0xde, 0x02, 0x02, 0x07, 0x06, 0x97, 0x02, 0x98, 0x02, 0x3e, 0x02, 0x03, 0x99, 0x02, 0x39, +0x9a, 0x02, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xad, 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, 0x2d, 0xec, 0x02, 0x02, 0x22, 0x90, +0x01, 0x00, 0x01, 0x2d, 0x04, 0x94, 0x01, 0xc7, 0x10, 0x2d, 0x02, 0x02, 0x92, 0x01, 0x33, 0x53, 0xf2, 0x01, 0x51, 0x2e, +0xbe, 0x01, 0x2e, 0x01, 0x08, 0x02, 0x02, 0x01, 0x07, 0x8e, 0x01, 0xda, 0x03, 0xc1, 0x12, 0x07, 0x17, 0x76, 0x17, 0x01, +0x2d, 0x28, 0xa8, 0x04, 0xcb, 0x10, 0x2d, 0x02, 0x02, 0xa6, 0x04, 0x23, 0x53, 0x04, 0x82, 0x01, 0x67, 0x88, 0x03, 0x01, +0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x29, 0x29, 0x06, 0xd2, 0x0a, 0x07, 0x5e, 0xe6, 0x03, 0x5e, 0x02, 0x13, 0x53, 0x2d, +0x82, 0x01, 0x6d, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x29, 0x29, 0x55, 0xb0, 0x0a, 0x1d, 0x52, 0x52, 0xc1, 0x0a, +0x07, 0x0d, 0x0d, 0x00, 0x3d, 0x09, 0x9f, 0x03, 0x9f, 0x03, 0x9f, 0x03, 0x18, 0x13, 0xcd, 0x01, 0x04, 0xc9, 0x01, 0x2b, +0xc1, 0x0a, 0x06, 0x02, 0x06, 0x00, 0x22, 0x02, 0x00, 0x13, 0xcd, 0x01, 0x02, 0xc9, 0x01, 0x31, 0xc1, 0x0a, 0x06, 0x02, +0x0a, 0x01, 0x22, 0x02, 0x00, 0x13, 0xcd, 0x01, 0x02, 0xc9, 0x01, 0x36, 0xc1, 0x0a, 0x06, 0x02, 0x0e, 0x02, 0x22, 0x02, +0x00, 0x01, 0x2d, 0x80, 0x03, 0xc0, 0x04, 0xcb, 0x10, 0x2d, 0x02, 0x02, 0xbe, 0x04, 0x23, 0x53, 0x04, 0x82, 0x01, 0x67, +0x94, 0x03, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0xfd, 0x02, 0xfd, 0x02, 0x87, 0x03, 0x22, 0x01, 0x00, 0x01, 0x2d, +0x08, 0xd2, 0x01, 0xcb, 0x10, 0x2d, 0x02, 0x02, 0xd0, 0x01, 0xbf, 0x0c, 0x06, 0x06, 0xd6, 0x01, 0xc8, 0x10, 0x06, 0x02, +0x04, 0x02, 0xc8, 0x10, 0x06, 0x08, 0x08, 0x0c, 0x4b, 0x06, 0x02, 0x06, 0x02, 0xbf, 0x0c, 0x06, 0x0a, 0x1c, 0x4a, 0x06, +0x02, 0x16, 0x02, 0x4b, 0x06, 0x02, 0x0e, 0x02, 0xc8, 0x10, 0x06, 0x06, 0x04, 0x20, 0xc1, 0x0a, 0x06, 0x04, 0x34, 0x00, +0x4a, 0x06, 0x02, 0x02, 0x06, 0xd2, 0x0a, 0x07, 0xea, 0x02, 0xea, 0x02, 0xa0, 0x03, 0x00, 0xc1, 0x0a, 0x06, 0xdf, 0x02, +0xdf, 0x02, 0x03, 0x4a, 0x06, 0x02, 0x18, 0x02, 0xc1, 0x0a, 0x06, 0x04, 0xd9, 0x02, 0x00, 0x4b, 0x06, 0x02, 0x02, 0x06, +0xd2, 0x0a, 0x07, 0xe0, 0x02, 0xe0, 0x02, 0x08, 0x00, 0xc1, 0x0a, 0x06, 0xd7, 0x02, 0xd7, 0x02, 0x00, 0xc3, 0x10, 0x06, +0x0a, 0x2e, 0x32, 0xc1, 0x0a, 0x06, 0x04, 0xc9, 0x02, 0x03, 0x4a, 0x06, 0x02, 0x06, 0x02, 0x4b, 0x06, 0x02, 0x12, 0x02, +0xc0, 0x10, 0x2d, 0x0c, 0x64, 0xb8, 0x03, 0xbf, 0x0c, 0x06, 0x02, 0x02, 0x4a, 0x06, 0x02, 0x60, 0x02, 0xc3, 0x10, 0x06, +0x02, 0x48, 0x02, 0x4a, 0x06, 0x06, 0x06, 0x1c, 0x4b, 0x06, 0x02, 0x2c, 0x02, 0x23, 0xcd, 0x01, 0x0e, 0x9b, 0x02, 0x38, +0x2e, 0x22, 0x00, 0x28, 0x3f, 0x06, 0x04, 0x12, 0x23, 0xcd, 0x01, 0x02, 0x9b, 0x02, 0x38, 0x33, 0x22, 0x00, 0x02, 0xc1, +0x0a, 0x06, 0x04, 0x93, 0x02, 0x01, 0x3f, 0x06, 0x02, 0x02, 0xd2, 0x0a, 0x07, 0xa0, 0x02, 0xa0, 0x02, 0x0e, 0x01, 0x13, +0xc8, 0x01, 0x99, 0x02, 0x9b, 0x02, 0x2e, 0x22, 0x00, 0x99, 0x02, 0x22, 0xe6, 0x02, 0xd0, 0x01, 0x8d, 0x1e, 0x88, 0x06, +0x52, 0x49, 0x50, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x86, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x10, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x30, 0x01, 0x04, 0x00, +0x00, 0x00, 0x01, 0x44, 0x01, 0x05, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x06, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, +0x07, 0x00, 0x00, 0x00, 0x02, 0x10, 0x01, 0x09, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x30, +0x01, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x44, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, +0x90, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x4c, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x41, 0x4d, 0x0a, 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, 0xa6, 0x02, 0x00, 0x00, 0x01, 0x20, 0x01, 0xc0, 0x02, 0x00, +0x00, 0x01, 0x30, 0x01, 0x5e, 0x04, 0x00, 0x00, 0x01, 0x44, 0x01, 0xc2, 0x04, 0x00, 0x00, 0x01, 0x80, 0x00, 0xec, 0x04, +0x00, 0x00, 0x01, 0x90, 0x00, 0xec, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x26, 0x06, 0x00, 0x00, 0x02, 0x00, 0x01, 0x36, +0x07, 0x00, 0x00, 0x02, 0x10, 0x00, 0x26, 0x06, 0x00, 0x00, 0x02, 0x10, 0x01, 0xa6, 0x02, 0x00, 0x00, 0x02, 0x20, 0x01, +0x3e, 0x08, 0x00, 0x00, 0x02, 0x30, 0x01, 0x5e, 0x04, 0x00, 0x00, 0x02, 0x44, 0x01, 0xc2, 0x04, 0x00, 0x00, 0x02, 0x80, +0x00, 0xd0, 0x09, 0x00, 0x00, 0x02, 0x90, 0x00, 0xd0, 0x09, 0x00, 0x00, 0xea, 0x0d, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, +0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6b, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, +0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x04, 0x00, 0x6b, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x74, 0x01, +0x6b, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x04, 0x00, 0x6b, 0x01, 0x77, 0x01, 0x02, 0x00, 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, +0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, +0xc0, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc1, 0x01, 0x02, 0x00, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0x04, 0x00, +0x6b, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc8, 0x01, 0x02, 0x00, 0xc9, 0x01, 0xca, 0x01, +0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, +0x69, 0x00, 0x6b, 0x01, 0x12, 0x0d, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, +0x6b, 0x01, 0x77, 0x01, 0x02, 0x00, 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, +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, 0xbf, 0x01, 0xc0, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xd5, 0x01, 0x02, 0x00, +0xd6, 0x01, 0xd7, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc1, 0x01, 0x02, 0x00, 0xd8, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc6, 0x01, +0x02, 0x00, 0xc2, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xd9, 0x01, 0x02, 0x00, 0xc9, 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, +0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xde, 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, 0xe8, 0x01, +0xef, 0x01, 0xed, 0x01, 0xf0, 0x01, 0xe0, 0x01, 0xf1, 0x01, 0xd4, 0x01, 0x69, 0x00, 0x6b, 0x01, 0x64, 0x00, 0x00, 0x00, +0x09, 0x00, 0x00, 0x00, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6b, 0x01, 0xf2, 0x01, 0x02, 0x00, 0x69, 0x00, +0x6b, 0x01, 0x67, 0x19, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6b, 0x01, +0x77, 0x01, 0x02, 0x00, 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, 0xbf, 0x01, 0xc0, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xd5, 0x01, 0x02, 0x00, 0xd6, 0x01, +0xd7, 0x01, 0x04, 0x00, 0x6b, 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, 0x04, 0x00, 0x6b, 0x01, +0xc1, 0x01, 0x02, 0x00, 0xd8, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc2, 0x01, 0x04, 0x00, 0x6b, 0x01, +0x02, 0x02, 0x02, 0x00, 0xc9, 0x01, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0xde, 0x01, 0x07, 0x02, 0xe0, 0x01, +0xe1, 0x01, 0xde, 0x01, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0xe8, 0x01, 0x0e, 0x02, +0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0xed, 0x01, 0xee, 0x01, 0xe8, 0x01, 0x12, 0x02, 0xed, 0x01, 0x13, 0x02, 0xe0, 0x01, +0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0xde, 0x01, 0x18, 0x02, 0x19, 0x02, 0xe8, 0x01, 0x1a, 0x02, 0x1b, 0x02, +0xed, 0x01, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0xe8, 0x01, 0x20, 0x02, 0xed, 0x01, 0xee, 0x01, 0xe8, 0x01, +0x21, 0x02, 0xed, 0x01, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0xe8, 0x01, 0x27, 0x02, 0x28, 0x02, +0xed, 0x01, 0xee, 0x01, 0xe8, 0x01, 0x29, 0x02, 0xed, 0x01, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0xe8, 0x01, 0x2d, 0x02, +0xed, 0x01, 0xee, 0x01, 0xe8, 0x01, 0x2e, 0x02, 0xed, 0x01, 0x2f, 0x02, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, +0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0xd4, 0x01, 0x69, 0x00, 0x6b, 0x01, 0xbc, 0x03, 0x00, 0x00, +0x2e, 0x00, 0x00, 0x00, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6b, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6d, 0x01, +0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x04, 0x00, 0x6b, 0x01, 0x0d, 0x00, 0x0e, 0x00, +0x0f, 0x00, 0x74, 0x01, 0x6b, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x04, 0x00, 0x6b, 0x01, 0x39, 0x02, 0x6b, 0x01, +0xc1, 0x01, 0x02, 0x00, 0x3a, 0x02, 0x04, 0x00, 0x6b, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc3, 0x01, 0x04, 0x00, 0x6b, 0x01, +0x3b, 0x02, 0x02, 0x00, 0xc9, 0x01, 0x3c, 0x02, 0x3d, 0x02, 0xd4, 0x01, 0x69, 0x00, 0x6b, 0x01, 0xec, 0x00, 0x00, 0x00, +0x11, 0x00, 0x00, 0x00, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6b, 0x01, 0xc1, 0x01, 0x02, 0x00, 0xd8, 0x01, +0x04, 0x00, 0x6b, 0x01, 0x3e, 0x02, 0x02, 0x00, 0xc9, 0x01, 0x3f, 0x02, 0xd4, 0x01, 0x69, 0x00, 0x6b, 0x01, 0x1a, 0x12, +0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6b, 0x01, 0x05, 0x00, 0x02, 0x00, +0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x04, 0x00, 0x6b, 0x01, 0x0d, 0x00, +0x0e, 0x00, 0x0f, 0x00, 0x74, 0x01, 0x6b, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x04, 0x00, 0x6b, 0x01, 0x40, 0x02, +0x41, 0x02, 0x6b, 0x01, 0x77, 0x01, 0x02, 0x00, 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, 0xbf, 0x01, 0xc0, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc1, 0x01, +0x02, 0x00, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x04, 0x00, 0x6b, 0x01, +0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc8, 0x01, 0x02, 0x00, 0xc9, 0x01, 0xca, 0x01, 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, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, 0x55, 0x02, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x59, 0x02, +0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0xd4, 0x01, 0x69, 0x00, 0x6b, 0x01, 0xea, 0x0d, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, +0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6b, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, +0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x04, 0x00, 0x6b, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x74, 0x01, +0x6b, 0x01, 0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x04, 0x00, 0x6b, 0x01, 0x77, 0x01, 0x02, 0x00, 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, 0xbf, 0x01, +0xc0, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc1, 0x01, 0x02, 0x00, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0x04, 0x00, +0x6b, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc8, 0x01, 0x02, 0x00, 0xc9, 0x01, 0xca, 0x01, +0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, +0x69, 0x00, 0x6b, 0x01, 0x88, 0x0c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, +0x6b, 0x01, 0x77, 0x01, 0x02, 0x00, 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, 0xbf, 0x01, 0xc0, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xd5, 0x01, 0x02, 0x00, +0xd6, 0x01, 0xd7, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc1, 0x01, 0x02, 0x00, 0xd8, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc6, 0x01, +0x02, 0x00, 0xc2, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xd9, 0x01, 0x02, 0x00, 0xc9, 0x01, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, +0xde, 0x01, 0x67, 0x02, 0xe0, 0x01, 0xe1, 0x01, 0xde, 0x01, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0xe8, 0x01, 0x6b, 0x02, +0x6c, 0x02, 0x6d, 0x02, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xe8, 0x01, 0xef, 0x01, 0xed, 0x01, 0xf0, 0x01, 0xe0, 0x01, +0x6e, 0x02, 0xd4, 0x01, 0x69, 0x00, 0x6b, 0x01, 0x7c, 0x18, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x69, 0x01, 0x6a, 0x01, +0x6b, 0x01, 0x6c, 0x01, 0x6b, 0x01, 0x77, 0x01, 0x02, 0x00, 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, 0xbf, 0x01, 0xc0, 0x01, 0x04, 0x00, 0x6b, 0x01, +0xd5, 0x01, 0x02, 0x00, 0xd6, 0x01, 0xd7, 0x01, 0x04, 0x00, 0x6b, 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, 0x04, 0x00, 0x6b, 0x01, 0xc1, 0x01, 0x02, 0x00, 0xd8, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc6, 0x01, 0x02, 0x00, +0xc2, 0x01, 0x04, 0x00, 0x6b, 0x01, 0x02, 0x02, 0x02, 0x00, 0xc9, 0x01, 0x6f, 0x02, 0x70, 0x02, 0x71, 0x02, 0xde, 0x01, +0x72, 0x02, 0xe0, 0x01, 0xe1, 0x01, 0xde, 0x01, 0x73, 0x02, 0x74, 0x02, 0x75, 0x02, 0xe8, 0x01, 0x76, 0x02, 0x77, 0x02, +0x78, 0x02, 0x11, 0x02, 0xed, 0x01, 0xee, 0x01, 0xe8, 0x01, 0x12, 0x02, 0xed, 0x01, 0x13, 0x02, 0xe0, 0x01, 0x79, 0x02, +0x15, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x17, 0x02, 0xde, 0x01, 0x18, 0x02, 0x19, 0x02, 0xe8, 0x01, 0x7c, 0x02, 0x1b, 0x02, +0xed, 0x01, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0xe8, 0x01, 0x20, 0x02, 0xed, 0x01, 0xee, 0x01, 0xe8, 0x01, +0x21, 0x02, 0xed, 0x01, 0x7d, 0x02, 0x7e, 0x02, 0x26, 0x02, 0xe8, 0x01, 0x7f, 0x02, 0x80, 0x02, 0xed, 0x01, 0xee, 0x01, +0xe8, 0x01, 0x81, 0x02, 0xed, 0x01, 0x82, 0x02, 0x83, 0x02, 0x2c, 0x02, 0xe8, 0x01, 0x84, 0x02, 0xed, 0x01, 0xee, 0x01, +0xe8, 0x01, 0x2e, 0x02, 0xed, 0x01, 0x85, 0x02, 0x86, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, +0x37, 0x02, 0x87, 0x02, 0xd4, 0x01, 0x69, 0x00, 0x6b, 0x01, 0x3b, 0x12, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x69, 0x01, +0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6b, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, +0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x04, 0x00, 0x6b, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x74, 0x01, 0x6b, 0x01, +0x75, 0x01, 0x02, 0x00, 0x76, 0x01, 0x04, 0x00, 0x6b, 0x01, 0x40, 0x02, 0x41, 0x02, 0x6b, 0x01, 0x77, 0x01, 0x02, 0x00, +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, 0xbf, 0x01, 0xc0, 0x01, 0x04, 0x00, 0x6b, 0x01, 0xc1, 0x01, 0x02, 0x00, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, +0xc5, 0x01, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x04, 0x00, 0x6b, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0x04, 0x00, +0x6b, 0x01, 0xc8, 0x01, 0x02, 0x00, 0xc9, 0x01, 0xca, 0x01, 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, 0x95, 0x02, 0x96, 0x02, +0x97, 0x02, 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0xd4, 0x01, +0x69, 0x00, 0x6b, 0x01, }; int GRID_GRID_OFFSET = 0; -int GRID_GRID_SIZE = 43432; +int GRID_GRID_SIZE = 44564; diff --git a/thermion_dart/native/include/material/unlit_fixed_size.S b/thermion_dart/native/include/material/unlit_fixed_size.S index c91cfcd1..d6aab5ab 100644 --- a/thermion_dart/native/include/material/unlit_fixed_size.S +++ b/thermion_dart/native/include/material/unlit_fixed_size.S @@ -8,5 +8,5 @@ UNLIT_FIXED_SIZE_PACKAGE: UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_OFFSET: .int 0 UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_SIZE: - .int 39924 + .int 41110 diff --git a/thermion_dart/native/include/material/unlit_fixed_size.apple.S b/thermion_dart/native/include/material/unlit_fixed_size.apple.S index 9f14b873..b499e058 100644 --- a/thermion_dart/native/include/material/unlit_fixed_size.apple.S +++ b/thermion_dart/native/include/material/unlit_fixed_size.apple.S @@ -8,5 +8,5 @@ _UNLIT_FIXED_SIZE_PACKAGE: _UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_OFFSET: .int 0 _UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_SIZE: - .int 39924 + .int 41110 diff --git a/thermion_dart/native/include/material/unlit_fixed_size.bin b/thermion_dart/native/include/material/unlit_fixed_size.bin index 84bb768f5946e7e507ea3fecb86b235646de880f..70984c50a644a25048c530aa56bf1a18f5ebfb5b 100644 GIT binary patch delta 9853 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 diff --git a/thermion_dart/native/include/material/unlit_fixed_size.c b/thermion_dart/native/include/material/unlit_fixed_size.c index 27ed6e2a..d7361dfc 100644 --- a/thermion_dart/native/include/material/unlit_fixed_size.c +++ b/thermion_dart/native/include/material/unlit_fixed_size.c @@ -46,7 +46,7 @@ const uint8_t UNLIT_FIXED_SIZE_PACKAGE[] = { 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, 0x77, 0xc2, 0x95, 0x49, 0xd9, 0x38, 0xdc, 0x73, 0x44, 0x41, 0x48, 0x53, +0x5f, 0x54, 0x41, 0x4d, 0x08, 0x00, 0x00, 0x00, 0x81, 0x2c, 0xa2, 0xf2, 0xb6, 0xc0, 0x23, 0x25, 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, @@ -55,7 +55,7 @@ const uint8_t UNLIT_FIXED_SIZE_PACKAGE[] = { 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, 0xe6, 0x57, 0x00, 0x00, 0x6d, 0x02, 0x00, 0x00, 0x23, 0x76, 0x65, +0x01, 0x54, 0x58, 0x45, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x94, 0x5b, 0x00, 0x00, 0x7d, 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, @@ -158,1545 +158,1312 @@ const uint8_t UNLIT_FIXED_SIZE_PACKAGE[] = { 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, 0x35, 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, 0x33, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x38, 0x2e, 0x78, 0x79, +0x33, 0x38, 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, 0x36, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x33, 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, 0x38, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, +0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x29, 0x3b, -0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x38, 0x3b, 0x00, 0x5f, -0x33, 0x38, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x33, 0x38, 0x37, -0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x33, 0x38, 0x37, 0x2e, 0x7a, 0x20, -0x3d, 0x20, 0x5f, 0x33, 0x34, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 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, 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, 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, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x38, 0x2e, 0x78, 0x79, 0x7a, +0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x32, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x33, 0x3b, 0x00, 0x5f, +0x34, 0x32, 0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x34, 0x32, 0x30, +0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x34, 0x32, 0x30, 0x2e, 0x7a, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x36, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 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, 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, 0x32, 0x30, 0x29, 0x3b, 0x00, 0x5f, 0x33, 0x37, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x31, 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, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x33, 0x37, 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, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x31, 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, 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, 0x34, 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, 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, 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, 0x33, 0x37, 0x38, 0x3b, 0x00, -0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, -0x33, 0x36, 0x3b, 0x00, 0x5f, 0x32, 0x33, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x33, 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, 0x33, 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, 0x33, 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, 0x68, 0x69, 0x67, 0x68, -0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x20, 0x63, 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, 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, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x38, 0x31, -0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, -0x63, 0x33, 0x20, 0x5f, 0x39, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x31, 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, 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, 0x38, 0x31, 0x29, 0x29, 0x2e, 0x78, 0x79, -0x7a, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, -0x63, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x39, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x31, 0x3b, 0x00, -0x5f, 0x39, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x2e, 0x79, -0x20, 0x3d, 0x20, 0x5f, 0x39, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x39, 0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, -0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x30, 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, 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, -0x20, 0x2a, 0x20, 0x5f, 0x39, 0x33, 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, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 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, 0x31, 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, 0x31, 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, 0x31, 0x30, 0x31, -0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 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, 0x31, 0x30, 0x30, -0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, -0x5f, 0x31, 0x31, 0x32, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 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, 0x31, 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, 0x31, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, -0x20, 0x2f, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x30, 0x20, -0x3d, 0x20, 0x5f, 0x31, 0x31, 0x36, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x34, 0x29, -0x3b, 0x00, 0x5f, 0x31, 0x31, 0x32, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x2e, 0x78, 0x20, 0x2a, 0x20, -0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x32, 0x2e, 0x78, -0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, -0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x36, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, -0x5f, 0x31, 0x32, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 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, 0x31, -0x31, 0x32, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x31, 0x32, 0x30, 0x29, -0x20, 0x2a, 0x20, 0x5f, 0x31, 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, 0x31, 0x31, 0x32, 0x2e, -0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x36, 0x20, 0x2a, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, -0x5f, 0x31, 0x31, 0x32, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x31, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, -0x5f, 0x31, 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, 0x31, 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, 0x31, 0x31, 0x32, 0x3b, 0x00, -0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x38, -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, 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, 0x33, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 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, 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, 0x39, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, -0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, -0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x38, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x39, 0x3b, -0x00, 0x5f, 0x33, 0x38, 0x38, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x33, -0x38, 0x38, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x33, 0x38, 0x38, 0x2e, -0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 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, 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, 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, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x2e, 0x78, -0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x33, 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, 0x33, 0x37, -0x39, 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, 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, 0x33, 0x31, 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, 0x36, -0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x31, 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, 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, 0x33, 0x31, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, -0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x29, 0x3b, -0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x31, 0x3b, 0x00, 0x5f, -0x34, 0x36, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x36, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x34, 0x36, 0x34, -0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x36, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x34, 0x36, 0x34, 0x2e, 0x7a, 0x20, -0x3d, 0x20, 0x5f, 0x34, 0x31, 0x36, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x35, 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, 0x32, 0x31, 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, 0x36, 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, 0x33, 0x31, 0x20, -0x3d, 0x20, 0x5f, 0x34, 0x35, 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, 0x33, -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, 0x33, 0x31, 0x2e, 0x79, 0x3b, 0x00, 0x76, 0x65, +0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, +0x5f, 0x32, 0x35, 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, 0x34, 0x31, 0x31, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, +0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x32, 0x3b, 0x00, 0x5f, 0x32, +0x35, 0x32, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x35, 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, 0x35, 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, 0x35, 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, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, +0x20, 0x61, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x62, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 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, 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, 0x38, +0x30, 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, 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, 0x39, 0x33, +0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 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, 0x38, +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, 0x5f, 0x38, 0x33, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x6d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x29, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x39, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x33, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x2e, 0x78, 0x20, +0x3d, 0x20, 0x5f, 0x39, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, +0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x39, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 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, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, +0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, 0x5b, 0x5f, 0x38, 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, 0x5f, 0x39, 0x35, +0x29, 0x3b, 0x00, 0x5f, 0x31, 0x30, 0x35, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, +0x63, 0x34, 0x20, 0x5f, 0x31, 0x31, 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, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, +0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x29, 0x2e, 0x77, 0x6f, 0x72, 0x6c, 0x64, +0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x33, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x20, +0x3d, 0x20, 0x5f, 0x31, 0x31, 0x31, 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, 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, 0x31, 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, 0x33, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x34, 0x33, +0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x31, 0x32, 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, 0x35, 0x35, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, -0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x34, -0x38, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x25, +0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, +0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x32, +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, 0x32, 0x35, 0x31, 0x20, 0x3d, 0x20, 0x66, +0x4f, 0x55, 0x4e, 0x54, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 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, 0x35, -0x32, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x35, 0x31, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x5f, 0x32, 0x36, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x32, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x28, 0x5f, 0x32, 0x34, 0x38, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x34, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, -0x34, 0x33, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x35, 0x31, 0x29, 0x3b, -0x00, 0x5f, 0x32, 0x34, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, -0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x35, 0x32, 0x20, 0x2f, 0x20, 0x32, -0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, 0x36, 0x33, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x2e, +0x59, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, +0x37, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x28, 0x5f, 0x31, 0x32, 0x35, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x32, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, +0x32, 0x33, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x32, 0x36, 0x29, 0x3b, +0x00, 0x5f, 0x31, 0x32, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, +0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x31, 0x32, 0x37, 0x20, 0x2f, 0x20, 0x32, +0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x32, 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, 0x34, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, -0x2d, 0x20, 0x5f, 0x32, 0x36, 0x33, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x2e, 0x77, 0x29, 0x3b, 0x00, 0x67, +0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, +0x2d, 0x20, 0x5f, 0x31, 0x33, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x32, 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, 0x34, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, -0x5f, 0x32, 0x35, 0x32, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x34, 0x38, 0x20, 0x2b, 0x20, -0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x34, -0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x32, 0x34, 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, -0x34, 0x33, 0x2e, 0x77, 0x20, 0x2a, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, +0x2d, 0x28, 0x5f, 0x31, 0x32, 0x33, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, +0x5f, 0x31, 0x32, 0x37, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x32, 0x35, 0x20, 0x2b, 0x20, +0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x31, 0x32, +0x33, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x32, 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, 0x31, +0x32, 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, 0x34, 0x33, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, -0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 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, 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, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, -0x46, 0x61, 0x63, 0x74, 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, 0x33, 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, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 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, 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, 0x37, 0x29, 0x29, 0x2e, 0x78, 0x79, -0x7a, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, -0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, -0x33, 0x36, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x36, 0x36, -0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x36, -0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, -0x36, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, -0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x31, 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, 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, 0x33, 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, 0x33, 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, 0x33, -0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x32, 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, 0x33, 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, 0x32, 0x32, 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, 0x32, 0x38, 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, -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, 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, 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, 0x37, 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, 0x38, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 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, 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, 0x37, 0x31, -0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, -0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x38, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, -0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x34, -0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x34, 0x20, 0x5f, 0x38, 0x39, 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, 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, 0x38, 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, 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, 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, 0x38, 0x39, 0x2e, 0x7a, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x30, 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, 0x5f, 0x38, 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, 0x30, 0x30, 0x3b, 0x00, 0x20, -0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x32, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, +0x20, 0x5f, 0x31, 0x32, 0x33, 0x3b, 0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x30, 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, 0x38, 0x34, 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, 0x36, 0x31, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x38, 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, 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, 0x38, +0x34, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, +0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x29, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x20, +0x3d, 0x20, 0x5f, 0x33, 0x38, 0x34, 0x3b, 0x00, 0x5f, 0x34, 0x32, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, +0x31, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x34, 0x32, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x31, 0x2e, 0x79, +0x3b, 0x00, 0x5f, 0x34, 0x32, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x31, 0x2e, 0x7a, 0x3b, 0x00, 0x76, +0x65, 0x63, 0x34, 0x20, 0x5f, 0x33, 0x37, 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, 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, 0x32, 0x31, 0x29, 0x3b, 0x00, 0x5f, 0x33, 0x37, 0x35, +0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 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, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, 0x20, +0x2a, 0x20, 0x5f, 0x33, 0x37, 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, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x32, 0x2e, +0x78, 0x79, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x35, 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, 0x34, +0x31, 0x32, 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, 0x33, 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, 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, 0x34, 0x33, +0x33, 0x20, 0x3d, 0x20, 0x5f, 0x34, 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, +0x5f, 0x32, 0x33, 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, 0x35, 0x36, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, +0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x63, 0x29, +0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x35, 0x30, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x36, 0x3b, 0x00, +0x5f, 0x35, 0x30, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x5f, 0x35, 0x30, +0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x5f, 0x35, 0x30, 0x31, 0x2e, 0x7a, +0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 0x34, 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, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x61, +0x5b, 0x5f, 0x32, 0x33, 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, 0x35, 0x30, 0x31, 0x29, 0x3b, 0x00, 0x5f, 0x34, 0x34, +0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x34, 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, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x66, +0x20, 0x2a, 0x20, 0x5f, 0x34, 0x34, 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, 0x34, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x34, 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, 0x32, 0x34, 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, 0x34, 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, 0x34, +0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x76, 0x65, 0x63, 0x34, 0x20, 0x5f, 0x32, 0x35, 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, 0x39, +0x32, 0x3b, 0x00, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, +0x20, 0x5f, 0x32, 0x35, 0x39, 0x3b, 0x00, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x36, 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, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 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, -0x31, 0x30, 0x35, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x30, 0x33, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, -0x28, 0x5f, 0x31, 0x30, 0x32, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, -0x31, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x30, 0x30, 0x2e, 0x78, -0x2c, 0x20, 0x5f, 0x31, 0x30, 0x35, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, -0x30, 0x33, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, -0x31, 0x30, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, -0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x5f, 0x31, 0x31, 0x33, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, -0x20, 0x2f, 0x20, 0x5f, 0x31, 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, 0x31, 0x31, 0x34, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x37, 0x2c, 0x20, 0x31, 0x2e, -0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x2c, 0x20, 0x5f, 0x31, 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, 0x31, 0x34, 0x2c, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x30, 0x32, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, -0x30, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x2c, 0x20, 0x5f, 0x31, 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, 0x31, 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, 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, 0x20, -0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 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, 0x33, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 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, 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, 0x38, 0x29, 0x29, 0x2e, -0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, -0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, -0x20, 0x5f, 0x33, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x33, 0x38, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, -0x36, 0x37, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, -0x33, 0x36, 0x37, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x5f, 0x33, 0x36, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x33, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x33, 0x32, 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, 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, 0x33, -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, -0x33, 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, 0x33, 0x32, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, -0x32, 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, 0x33, 0x32, 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, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x36, 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, 0x36, 0x38, 0x20, 0x3d, 0x20, 0x32, 0x2e, +0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x36, 0x37, 0x3b, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x39, +0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x38, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x36, 0x34, +0x29, 0x3b, 0x00, 0x5f, 0x32, 0x35, 0x39, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x39, 0x2e, 0x78, 0x20, 0x2a, +0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x36, 0x37, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x35, 0x39, 0x2e, +0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x39, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x28, 0x2d, 0x31, 0x2e, +0x30, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x5f, 0x32, 0x36, 0x38, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x2b, +0x20, 0x5f, 0x32, 0x37, 0x39, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 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, 0x35, 0x39, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x5f, 0x32, 0x37, 0x39, +0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x35, 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, 0x35, 0x39, +0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x5f, 0x32, 0x36, 0x38, 0x20, 0x2a, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x36, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x20, 0x2a, +0x20, 0x5f, 0x32, 0x35, 0x39, 0x2e, 0x77, 0x29, 0x29, 0x3b, 0x00, 0x5f, 0x32, 0x35, 0x39, 0x2e, 0x7a, 0x20, 0x3d, 0x20, +0x28, 0x5f, 0x32, 0x35, 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, 0x35, 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, 0x35, 0x39, 0x3b, +0x00, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, +0x33, 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, 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, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x46, 0x61, 0x63, 0x74, 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, 0x33, 0x36, 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, 0x33, +0x33, 0x39, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x32, 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, 0x36, 0x32, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x6d, +0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x39, 0x39, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x36, 0x32, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x39, 0x39, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, +0x33, 0x33, 0x39, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x39, 0x39, 0x2e, 0x79, 0x20, 0x3d, 0x20, +0x5f, 0x33, 0x33, 0x39, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x39, 0x39, 0x2e, 0x7a, 0x20, 0x3d, +0x20, 0x5f, 0x33, 0x33, 0x39, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, +0x5f, 0x33, 0x35, 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, 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, 0x39, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x33, 0x35, 0x33, 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, 0x37, 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, 0x35, 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, 0x35, 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, 0x33, 0x35, 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, 0x33, 0x35, 0x37, 0x2e, 0x7a, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x34, 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, 0x35, 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, 0x32, 0x34, 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, 0x34, 0x34, +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, 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, 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, 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, +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, 0x31, +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, 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, +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, 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, 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, 0x31, 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, 0x33, 0x39, 0x36, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x31, 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, 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, 0x31, 0x31, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, -0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x34, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x31, 0x3b, -0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x34, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x36, 0x2e, 0x78, -0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x34, 0x34, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x36, 0x2e, -0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x34, 0x34, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x36, -0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x30, 0x35, 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, 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, 0x34, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, +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, 0x37, 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, 0x37, 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, 0x33, +0x20, 0x5f, 0x38, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x33, 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, 0x37, 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, 0x5f, 0x37, 0x33, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, +0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, +0x63, 0x61, 0x6c, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x38, +0x36, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x36, 0x2e, 0x78, 0x20, 0x3d, +0x20, 0x5f, 0x38, 0x34, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x36, 0x2e, 0x79, 0x20, 0x3d, 0x20, +0x5f, 0x38, 0x34, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x36, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, +0x38, 0x34, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 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, 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, 0x37, 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, 0x5f, 0x38, 0x36, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x5f, 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, 0x31, 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, 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, 0x34, 0x30, 0x35, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, +0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 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, 0x34, 0x30, 0x35, 0x2e, 0x79, 0x3b, 0x00, 0x20, +0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 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, 0x34, 0x30, 0x35, 0x2e, 0x7a, 0x3b, 0x00, -0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x66, 0x72, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x2e, 0x7a, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x31, 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, 0x34, 0x30, 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, 0x32, 0x33, 0x35, 0x3b, 0x00, 0x20, 0x20, -0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x69, 0x6e, 0x73, +0x5f, 0x31, 0x30, 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, 0x31, 0x31, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x31, 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, 0x32, 0x34, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 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, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, -0x34, 0x38, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, -0x5f, 0x32, 0x34, 0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x36, -0x37, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, -0x74, 0x20, 0x5f, 0x32, 0x37, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x32, 0x33, 0x35, 0x2e, 0x78, 0x2c, -0x20, 0x5f, 0x32, 0x34, 0x38, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x34, -0x33, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x32, -0x34, 0x38, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x36, 0x37, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, -0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x35, 0x35, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x33, 0x35, 0x3b, 0x00, 0x20, 0x20, 0x20, -0x20, 0x5f, 0x34, 0x35, 0x35, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x34, 0x36, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, -0x2f, 0x20, 0x5f, 0x32, 0x34, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x43, +0x43, 0x4f, 0x55, 0x4e, 0x54, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, +0x31, 0x36, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x31, 0x34, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, +0x5f, 0x31, 0x31, 0x33, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, +0x31, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x31, 0x31, 0x2e, 0x78, 0x2c, +0x20, 0x5f, 0x31, 0x31, 0x36, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x31, 0x31, +0x34, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x31, +0x31, 0x36, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, +0x61, 0x74, 0x34, 0x20, 0x5f, 0x31, 0x32, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x3b, 0x00, 0x20, 0x20, 0x20, +0x20, 0x5f, 0x31, 0x32, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x31, 0x32, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x20, +0x2f, 0x20, 0x5f, 0x31, 0x31, 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, 0x36, 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x30, -0x29, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x37, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x31, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x38, 0x2c, 0x20, 0x31, 0x2e, 0x30, +0x29, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x2c, 0x20, 0x5f, 0x31, 0x32, 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, 0x34, 0x36, 0x31, 0x2c, 0x20, -0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x34, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, -0x29, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x37, 0x2c, 0x20, 0x5f, 0x32, 0x37, 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, -0x35, 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, 0x32, 0x30, 0x39, 0x3b, 0x00, 0x4c, 0x53, 0x4c, 0x47, 0x5f, -0x54, 0x41, 0x4d, 0x0e, 0x09, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, -0x00, 0x00, 0x01, 0x00, 0x01, 0xa4, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xe0, -0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xf4, 0x01, 0x00, 0x00, 0x01, 0x30, 0x01, 0x40, 0x03, 0x00, 0x00, 0x01, 0x44, 0x01, -0x82, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x9a, 0x03, 0x00, 0x00, 0x01, 0x90, 0x00, 0x9a, 0x03, 0x00, 0x00, 0x02, 0x00, -0x00, 0xd6, 0x04, 0x00, 0x00, 0x02, 0x00, 0x01, 0xf6, 0x05, 0x00, 0x00, 0x02, 0x10, 0x00, 0xd6, 0x04, 0x00, 0x00, 0x02, -0x10, 0x01, 0x30, 0x06, 0x00, 0x00, 0x02, 0x20, 0x01, 0x42, 0x06, 0x00, 0x00, 0x02, 0x30, 0x01, 0x7c, 0x07, 0x00, 0x00, -0x02, 0x44, 0x01, 0xbc, 0x07, 0x00, 0x00, 0x02, 0x80, 0x00, 0xd2, 0x07, 0x00, 0x00, 0x02, 0x90, 0x00, 0xd2, 0x07, 0x00, -0x00, 0x86, 0x0a, 0x00, 0x00, 0x8b, 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, 0x18, -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, 0x14, 0x02, 0x00, 0x00, 0x1a, 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, 0x8d, 0x00, 0x65, 0x00, 0x8e, 0x00, 0x6a, -0x00, 0x02, 0x00, 0x8f, 0x00, 0x6d, 0x00, 0x51, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x80, -0x00, 0x6a, 0x00, 0x02, 0x00, 0x6d, 0x00, 0xb8, 0x0c, 0x00, 0x00, 0xa2, 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, 0x90, -0x00, 0x91, 0x00, 0x92, 0x00, 0x17, 0x00, 0x02, 0x00, 0x8b, 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, 0xda, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, -0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x65, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0x8e, 0x00, 0xdd, 0x00, 0x02, 0x00, 0xde, -0x00, 0xdf, 0x00, 0x02, 0x00, 0xe0, 0x00, 0x6d, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0x02, 0x00, 0xe4, 0x00, 0x6d, -0x00, 0x6e, 0x00, 0x02, 0x00, 0xe5, 0x00, 0x6d, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, 0x00, 0xea, 0x00, 0x02, -0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xef, 0x00, 0x6d, 0x00, 0xf0, -0x00, 0xf1, 0x00, 0xf2, 0x00, 0x02, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0x6d, 0x00, 0x6e, -0x00, 0x02, 0x00, 0xf8, 0x00, 0x6d, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0xe0, -0x00, 0x6d, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, 0x6d, 0x00, 0xec, -0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x01, 0x05, -0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, -0x00, 0x0b, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x0c, 0x01, 0x0d, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x0e, -0x01, 0x0f, 0x01, 0x6d, 0x00, 0x91, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x8e, -0x00, 0x6a, 0x00, 0x02, 0x00, 0x10, 0x01, 0x6d, 0x00, 0x0f, 0x0d, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, -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, 0x12, 0x01, 0x13, -0x01, 0x0f, 0x00, 0x14, 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, 0x18, 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, 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, 0x6d, 0x00, 0xb6, 0x09, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x2e, 0x01, 0x2f, 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, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa8, 0x00, 0xa9, -0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0x39, -0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0x3d, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0x40, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0x43, -0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc4, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, -0x00, 0xc8, 0x00, 0xc9, 0x00, 0x50, 0x00, 0xcb, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xd1, -0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0x5b, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0x61, -0x00, 0x62, 0x00, 0x02, 0x00, 0x18, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x65, 0x00, 0x66, 0x00, 0x30, 0x01, 0x31, 0x01, 0x32, -0x01, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, -0x00, 0x33, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x78, 0x00, 0x79, -0x00, 0x7a, 0x00, 0x3b, 0x01, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x6d, 0x00, 0x0f, 0x02, 0x00, 0x00, 0x19, 0x00, 0x00, -0x00, 0x2e, 0x01, 0x2f, 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, 0x18, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x65, -0x00, 0x8e, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x8f, 0x00, 0x6d, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2e, -0x01, 0x2f, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x6d, 0x00, 0xdc, 0x0a, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x2e, 0x01, 0x2f, -0x01, 0x81, 0x00, 0x02, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x04, 0x00, 0x90, -0x00, 0x91, 0x00, 0x92, 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, 0xa1, -0x00, 0xa2, 0x00, 0xa3, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, -0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0x39, 0x00, 0xb4, 0x00, 0xb5, -0x00, 0xb6, 0x00, 0x3d, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0x40, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0x43, 0x00, 0xbe, 0x00, 0xbf, -0x00, 0xc0, 0x00, 0xc1, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc4, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc8, 0x00, 0xc9, -0x00, 0x50, 0x00, 0xcb, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, -0x00, 0xd4, 0x00, 0x5b, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, -0x00, 0x18, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x65, 0x00, 0x3c, 0x01, 0x3d, 0x01, 0x8e, 0x00, 0x3e, 0x01, 0x02, 0x00, 0x3f, -0x01, 0xdf, 0x00, 0x02, 0x00, 0xe0, 0x00, 0x6d, 0x00, 0x40, 0x01, 0x41, 0x01, 0xe3, 0x00, 0x02, 0x00, 0xe4, 0x00, 0x6d, -0x00, 0x6e, 0x00, 0x02, 0x00, 0xe5, 0x00, 0x6d, 0x00, 0x42, 0x01, 0xe9, 0x00, 0xea, 0x00, 0x02, 0x00, 0x43, 0x01, 0x44, -0x01, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xef, 0x00, 0x6d, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0x02, 0x00, 0x45, -0x01, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xf8, 0x00, 0x6d, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xfd, -0x00, 0xfe, 0x00, 0xe0, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x02, 0x00, 0xff, 0x00, 0x00, 0x01, 0x46, 0x01, 0x02, 0x01, 0x03, -0x01, 0x6d, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2e, 0x01, 0x2f, 0x01, 0x05, 0x00, 0x02, 0x00, 0x06, +0x31, 0x5d, 0x20, 0x3d, 0x20, 0x2d, 0x66, 0x6d, 0x61, 0x28, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x31, 0x32, 0x35, 0x2c, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x31, 0x31, 0x33, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x2e, 0x30, +0x29, 0x2c, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x2c, 0x20, 0x5f, 0x31, 0x32, 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, +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, 0x37, 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, 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, 0x36, 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, 0x33, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x33, 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, 0x36, 0x33, 0x29, 0x29, 0x2e, 0x78, +0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, +0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, +0x5f, 0x34, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x36, 0x33, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x30, +0x30, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x2e, 0x78, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, +0x30, 0x30, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x2e, 0x79, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, +0x34, 0x30, 0x30, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x33, 0x35, 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, 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, 0x34, 0x30, +0x30, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x35, 0x34, 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, 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, 0x35, +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, 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, 0x33, 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, 0x33, +0x35, 0x38, 0x2e, 0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x34, +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, 0x35, 0x38, 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, 0x32, 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, 0x33, 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, 0x34, 0x31, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 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, 0x5f, 0x32, 0x32, 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, 0x33, 0x36, 0x29, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, +0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x38, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x36, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x38, 0x31, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x2e, 0x78, 0x3b, +0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x38, 0x31, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x2e, 0x79, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x38, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x31, 0x33, 0x2e, +0x7a, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x32, 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, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x64, +0x61, 0x74, 0x61, 0x5b, 0x5f, 0x32, 0x32, 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, 0x38, 0x31, 0x29, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x37, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x39, 0x39, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x33, 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, 0x34, 0x32, 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, 0x34, 0x33, 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, 0x34, 0x33, 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, 0x34, 0x33, 0x31, 0x2e, 0x7a, +0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x32, 0x35, 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, 0x34, 0x33, 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, 0x32, 0x35, 0x31, 0x3b, 0x00, +0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x32, 0x35, 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, 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, 0x32, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x35, 0x39, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, +0x74, 0x28, 0x5f, 0x32, 0x35, 0x36, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, +0x32, 0x38, 0x33, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x31, 0x2e, 0x77, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x20, 0x5f, 0x32, 0x38, 0x37, 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x5f, 0x32, 0x35, 0x31, 0x2e, +0x78, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x34, 0x2c, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x32, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x5f, +0x32, 0x35, 0x39, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x2c, 0x20, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, +0x5f, 0x32, 0x36, 0x34, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x32, 0x38, 0x33, 0x29, 0x3b, 0x00, 0x20, 0x20, 0x20, 0x20, 0x66, +0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x34, 0x39, 0x34, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x35, 0x31, 0x3b, 0x00, 0x20, +0x20, 0x20, 0x20, 0x5f, 0x34, 0x39, 0x34, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x37, 0x3b, 0x00, 0x20, 0x20, +0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x5f, 0x35, 0x30, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x2d, 0x32, 0x2e, 0x30, +0x29, 0x20, 0x2f, 0x20, 0x5f, 0x32, 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, 0x35, 0x30, 0x30, 0x2c, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x2c, 0x20, 0x31, +0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x33, 0x2c, 0x20, 0x5f, 0x32, 0x38, 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, 0x35, 0x30, 0x30, +0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x35, 0x36, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, +0x2e, 0x30, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x38, 0x33, 0x2c, 0x20, 0x5f, 0x32, 0x38, 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, 0x39, 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, 0x32, 0x32, 0x35, 0x3b, 0x00, 0x4c, 0x53, 0x4c, +0x47, 0x5f, 0x54, 0x41, 0x4d, 0x1e, 0x09, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xa8, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, +0x01, 0xe4, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0xf8, 0x01, 0x00, 0x00, 0x01, 0x30, 0x01, 0x44, 0x03, 0x00, 0x00, 0x01, +0x44, 0x01, 0x86, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x9e, 0x03, 0x00, 0x00, 0x01, 0x90, 0x00, 0x9e, 0x03, 0x00, 0x00, +0x02, 0x00, 0x00, 0xde, 0x04, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x06, 0x00, 0x00, 0x02, 0x10, 0x00, 0xde, 0x04, 0x00, +0x00, 0x02, 0x10, 0x01, 0x3c, 0x06, 0x00, 0x00, 0x02, 0x20, 0x01, 0x4e, 0x06, 0x00, 0x00, 0x02, 0x30, 0x01, 0x88, 0x07, +0x00, 0x00, 0x02, 0x44, 0x01, 0xc8, 0x07, 0x00, 0x00, 0x02, 0x80, 0x00, 0xde, 0x07, 0x00, 0x00, 0x02, 0x90, 0x00, 0xde, +0x07, 0x00, 0x00, 0xd0, 0x0a, 0x00, 0x00, 0x8d, 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, 0x18, 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, 0x7f, 0x00, 0x80, 0x00, 0x6d, 0x00, 0x14, 0x02, 0x00, 0x00, 0x1a, 0x00, 0x00, +0x00, 0x00, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x02, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, +0x00, 0x89, 0x00, 0x04, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x62, 0x00, 0x02, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, +0x00, 0x65, 0x00, 0x90, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x91, 0x00, 0x6d, 0x00, 0x51, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, +0x00, 0x00, 0x00, 0x81, 0x00, 0x82, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x6d, 0x00, 0xb8, 0x0c, 0x00, 0x00, 0xa2, 0x00, 0x00, +0x00, 0x00, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x02, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, +0x00, 0x89, 0x00, 0x04, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x17, 0x00, 0x02, 0x00, 0x8d, 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, 0xda, 0x00, 0xdb, 0x00, 0xdc, +0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x65, 0x00, 0xdd, 0x00, 0xde, 0x00, 0x90, +0x00, 0xdf, 0x00, 0x02, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0x02, 0x00, 0xe2, 0x00, 0x6d, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0xe5, +0x00, 0x02, 0x00, 0xe6, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xe7, 0x00, 0x6d, 0x00, 0xe8, 0x00, 0xe9, 0x00, 0xea, +0x00, 0xeb, 0x00, 0xec, 0x00, 0x02, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, 0x00, 0xf0, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, +0x00, 0xf1, 0x00, 0x6d, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0x02, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf8, +0x00, 0xf9, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xfa, 0x00, 0x6d, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, +0x00, 0xff, 0x00, 0x00, 0x01, 0xe2, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, +0x01, 0x05, 0x01, 0x6d, 0x00, 0xec, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x82, 0x00, 0x05, +0x00, 0x02, 0x00, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x0c, 0x01, 0x04, 0x00, 0x0d, +0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0d, 0x01, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x0e, 0x01, 0x0f, +0x01, 0x6a, 0x00, 0x02, 0x00, 0x10, 0x01, 0x11, 0x01, 0x6d, 0x00, 0x91, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x81, 0x00, 0x82, 0x00, 0x90, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x12, 0x01, 0x6d, 0x00, 0x80, 0x0d, 0x00, 0x00, 0x9c, +0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 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, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x47, 0x01, 0x48, 0x01, 0x6a, 0x00, 0x02, -0x00, 0x0e, 0x01, 0x0f, 0x01, 0x6d, 0x00, 0x92, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x2e, 0x01, 0x2f, 0x01, 0x8e, -0x00, 0x6a, 0x00, 0x02, 0x00, 0x10, 0x01, 0x6d, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x2e, 0x01, 0x2f, -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, 0x12, 0x01, 0x13, -0x01, 0x0f, 0x00, 0x14, 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, 0xa1, 0x00, 0xa2, 0x00, 0xa3, -0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, -0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0x39, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0x3d, -0x00, 0xb8, 0x00, 0xb9, 0x00, 0x40, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0x43, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, -0x00, 0x48, 0x00, 0x49, 0x00, 0xc4, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0x50, 0x00, 0xcb, -0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0x5b, -0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x18, 0x00, 0x8c, -0x00, 0x8d, 0x00, 0x65, 0x00, 0x30, 0x01, 0x66, 0x00, 0x31, 0x01, 0x32, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, -0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, 0x00, 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, 0x5f, 0x01, 0x60, -0x01, 0x61, 0x01, 0x6d, 0x00, 0x52, 0x49, 0x50, 0x53, 0x5f, 0x43, 0x49, 0x44, 0x0b, 0x2d, 0x00, 0x00, 0x01, 0x00, 0x00, -0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xe4, 0x14, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, -0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xaf, 0x0f, 0x00, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, -0x8b, 0x01, 0xc6, 0x01, 0xc8, 0x01, 0xd5, 0x01, 0xe5, 0x01, 0xed, 0x01, 0x10, 0x96, 0x01, 0x06, 0x10, 0x37, 0x02, 0x0b, -0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, -0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, -0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, 0x42, 0x06, 0x40, 0x10, -0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x83, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, -0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, -0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, -0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, -0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, -0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, -0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, -0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, -0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, -0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, -0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, -0x21, 0x00, 0x10, 0x1e, 0x1e, 0x00, 0x37, 0x4c, 0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, -0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x00, -0x26, 0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x04, 0x0b, 0x2b, 0x10, 0x1a, 0x1e, 0x04, 0x10, 0x20, 0x1e, 0x07, 0x47, 0x0c, -0x02, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x00, 0x00, 0x02, 0x00, 0xb0, 0x01, 0x00, 0x93, 0x02, 0x02, 0xa1, -0x04, 0x02, 0x02, 0xa6, 0x02, 0x06, 0x20, 0xb7, 0x02, 0x02, 0x06, 0x04, 0xb8, 0x02, 0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, -0x06, 0x03, 0xae, 0x02, 0x28, 0x07, 0xb5, 0x02, 0x1a, 0x20, 0x00, 0xbb, 0x04, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, -0x02, 0x04, 0x20, 0x01, 0xbb, 0x04, 0x2d, 0x02, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2a, 0x06, 0x01, 0x00, 0x00, 0x00, -0xbb, 0x04, 0x2a, 0x0a, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2d, 0x04, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x22, 0x09, -0x03, 0xbb, 0x04, 0x2a, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x4a, 0x8e, 0x03, 0x02, 0x08, 0x49, 0x2d, -0x2d, 0x2d, 0x06, 0x4b, 0xbb, 0x04, 0x2a, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x4c, 0x4d, 0xae, 0x02, 0x02, -0x4e, 0x3e, 0x02, 0x02, 0x4f, 0x39, 0x50, 0x02, 0x02, 0x3e, 0x04, 0x02, 0x08, 0xbb, 0x04, 0x2d, 0x28, 0x04, 0x00, 0x00, -0x00, 0x3e, 0x0e, 0x02, 0x06, 0xbb, 0x04, 0x2a, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x08, 0x71, 0xb7, 0x02, -0x02, 0x06, 0x02, 0xb7, 0x02, 0x02, 0x2a, 0x03, 0xbb, 0x04, 0x2a, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, -0x75, 0xbc, 0x02, 0x02, 0x07, 0x71, 0xbb, 0x04, 0x2a, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x78, 0xae, -0x83, 0x80, 0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x72, 0x08, 0x08, 0x07, 0x73, 0x06, 0x06, 0x07, 0x07, 0x73, 0x73, 0x06, -0x06, 0x73, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x74, 0x2d, 0x73, 0x06, 0x06, 0x76, 0x09, 0x06, 0x07, -0x07, 0x73, 0x2d, 0x06, 0x07, 0x2d, 0x06, 0x73, 0x06, 0x06, 0x06, 0x2a, 0x09, 0x06, 0x06, 0x2a, 0x06, 0x06, 0x09, 0x06, -0x06, 0x06, 0x06, 0x06, 0x49, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x77, 0x2d, 0x06, 0x06, 0x06, 0x79, 0x3e, 0x02, 0x02, -0x7a, 0x39, 0x7b, 0x02, 0x02, 0x3e, 0x1c, 0x01, 0x07, 0x39, 0x8a, 0x01, 0x02, 0x01, 0xce, 0x02, 0x4c, 0x08, 0x07, 0x06, -0x3e, 0x02, 0x02, 0xb1, 0x01, 0x39, 0xb2, 0x01, 0x02, 0x02, 0x3e, 0x24, 0x03, 0x2d, 0x39, 0xc5, 0x01, 0x02, 0x03, 0x3e, -0x02, 0x01, 0x2d, 0x39, 0xc7, 0x01, 0x02, 0x01, 0x3e, 0x18, 0x03, 0x07, 0x39, 0xd4, 0x01, 0x02, 0x03, 0x3e, 0x08, 0x03, -0x06, 0x39, 0xd4, 0x01, 0x18, 0x03, 0xbe, 0x02, 0x0c, 0x07, 0x06, 0x3e, 0x02, 0x03, 0xeb, 0x01, 0x39, 0xec, 0x01, 0x02, -0x03, 0xc6, 0x06, 0x02, 0xd1, 0x03, 0x00, 0x03, 0x18, 0x02, 0x01, 0x2d, 0x88, 0x03, 0x02, 0x22, 0x06, 0x00, 0x01, 0x2d, -0x02, 0x08, 0x33, 0x53, 0x66, 0x51, 0x2e, 0xca, 0x01, 0x2e, 0x01, 0x08, 0x02, 0x02, 0x01, 0x07, 0xb0, 0x01, 0x96, 0x03, -0xc1, 0x12, 0x07, 0x37, 0x78, 0x37, 0x13, 0x53, 0x46, 0x7c, 0x2e, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x41, 0x41, -0x06, 0x3d, 0x09, 0x04, 0x04, 0x04, 0x18, 0x5c, 0x06, 0x02, 0x01, 0x42, 0xbf, 0x02, 0x13, 0x6e, 0x04, 0xb3, 0x01, 0x38, -0x01, 0x06, 0x02, 0x02, 0xc8, 0x10, 0x06, 0x02, 0x08, 0x02, 0x3d, 0x09, 0x04, 0x1f, 0x1f, 0x18, 0xce, 0x10, 0x09, 0x02, -0x02, 0x06, 0xc1, 0x0a, 0x06, 0x04, 0x04, 0x00, 0xd2, 0x0a, 0x07, 0x54, 0x54, 0x3a, 0x00, 0xc1, 0x0a, 0x06, 0x4f, 0x08, -0x01, 0xd2, 0x0a, 0x07, 0x54, 0x54, 0x04, 0x01, 0xc1, 0x0a, 0x06, 0x4f, 0x0c, 0x02, 0xd2, 0x0a, 0x07, 0x54, 0x54, 0x04, -0x02, 0xc1, 0x12, 0x07, 0x4d, 0xa4, 0x01, 0x4d, 0xb0, 0x0a, 0x1d, 0x42, 0x42, 0xc1, 0x0a, 0x07, 0x0d, 0x0d, 0x00, 0x3d, -0x09, 0xa3, 0x02, 0xa3, 0x02, 0xa3, 0x02, 0x18, 0x13, 0xd9, 0x01, 0x04, 0xd5, 0x01, 0x2b, 0xc1, 0x0a, 0x06, 0x02, 0x06, -0x00, 0x22, 0x02, 0x00, 0x13, 0xd9, 0x01, 0x02, 0xd5, 0x01, 0x31, 0xc1, 0x0a, 0x06, 0x02, 0x0a, 0x01, 0x22, 0x02, 0x00, -0x13, 0xd9, 0x01, 0x02, 0xd5, 0x01, 0x36, 0xc1, 0x0a, 0x06, 0x02, 0x0e, 0x02, 0x22, 0x02, 0x00, 0x23, 0x53, 0x8a, 0x02, -0x7c, 0x67, 0x2e, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x81, 0x02, 0x81, 0x02, 0x8b, 0x02, 0x22, 0x01, 0x00, 0xc1, -0x0a, 0x06, 0x08, 0x08, 0x01, 0x3f, 0x06, 0x02, 0x02, 0xd2, 0x0a, 0x07, 0xa2, 0x02, 0xa2, 0x02, 0xac, 0x02, 0x01, 0x13, -0xd4, 0x01, 0x95, 0x02, 0xed, 0x01, 0x2e, 0x22, 0x00, 0x95, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, -0x18, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, -0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, -0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xdf, 0x0e, -0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0xd3, 0x01, 0xa0, 0x02, 0x04, 0x07, 0x37, 0x1e, 0x06, 0x00, 0x00, 0x01, -0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x37, 0xb0, 0x02, 0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, -0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, -0x00, 0x21, 0x08, 0x00, 0x54, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x12, 0x00, 0x93, 0x02, 0x02, -0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x12, 0x20, 0xb7, 0x02, 0x02, 0x0c, 0x04, 0xb7, 0x02, 0x02, 0x0c, 0x03, 0xfe, 0x02, -0x02, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0e, 0xb5, 0x02, 0x42, 0x20, 0x01, 0xb8, 0x02, 0x0c, 0x0d, 0x04, 0xbb, 0x04, 0x30, -0x2a, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x7e, 0x02, 0x0d, 0xce, 0x02, 0x3a, 0x36, 0x0d, 0x0c, 0x3e, 0x02, 0x02, 0xa7, 0x01, -0x39, 0xa8, 0x01, 0x02, 0x02, 0x3e, 0x52, 0x03, 0x0d, 0x39, 0xd2, 0x01, 0x02, 0x03, 0xad, 0x06, 0x0d, 0xea, 0x01, 0xad, -0x06, 0x0c, 0x02, 0xad, 0x06, 0x0e, 0x02, 0xc6, 0x06, 0x02, 0x8b, 0x05, 0x00, 0x03, 0x18, 0x02, 0x13, 0x8a, 0x01, 0xdc, -0x04, 0xa9, 0x01, 0x4b, 0x01, 0x0d, 0x02, 0x02, 0x80, 0x0b, 0x0f, 0x58, 0x58, 0x30, 0x2e, 0x2e, 0x2e, 0x2c, 0xc1, 0x0a, -0x0d, 0x29, 0x29, 0x00, 0x80, 0x0b, 0x0f, 0x04, 0x04, 0x0a, 0x08, 0x08, 0x08, 0x06, 0xc1, 0x0a, 0x0d, 0x1f, 0x1f, 0x00, -0x22, 0xd4, 0x01, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, -0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, -0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, -0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xcf, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0xa0, 0x02, 0x04, 0x07, -0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xc6, 0x06, 0x02, 0x02, 0x00, 0x03, 0x18, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, -0x00, 0x00, 0x00, 0x00, 0x79, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, -0x0b, 0x00, 0x08, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x20, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, +0x00, 0x10, 0x00, 0x14, 0x01, 0x15, 0x01, 0x0f, 0x00, 0x16, 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, 0x18, 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, 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, 0x6d, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x8e, +0x00, 0x00, 0x00, 0x32, 0x01, 0x33, 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, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0x2a, +0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, +0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0x39, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0x3d, 0x00, 0xba, +0x00, 0xbb, 0x00, 0x40, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x43, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0x48, +0x00, 0x49, 0x00, 0xc6, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xca, 0x00, 0xcb, 0x00, 0x50, 0x00, 0xcd, 0x00, 0x52, +0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0x5b, 0x00, 0xd8, +0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x18, 0x00, 0x8e, 0x00, 0x8f, +0x00, 0x65, 0x00, 0x66, 0x00, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, +0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, +0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x41, 0x01, 0x7e, +0x00, 0x7f, 0x00, 0x80, 0x00, 0x6d, 0x00, 0x0f, 0x02, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x32, 0x01, 0x33, 0x01, 0x83, +0x00, 0x02, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x04, 0x00, 0x8a, 0x00, 0x8b, +0x00, 0x8c, 0x00, 0x62, 0x00, 0x02, 0x00, 0x18, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x65, 0x00, 0x90, 0x00, 0x6a, 0x00, 0x02, +0x00, 0x91, 0x00, 0x6d, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x32, 0x01, 0x33, 0x01, 0x6a, 0x00, 0x02, +0x00, 0x6d, 0x00, 0xdc, 0x0a, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x32, 0x01, 0x33, 0x01, 0x83, 0x00, 0x02, 0x00, 0x84, +0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x04, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 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, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0x2a, +0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, +0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0x39, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0x3d, 0x00, 0xba, +0x00, 0xbb, 0x00, 0x40, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x43, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0x48, +0x00, 0x49, 0x00, 0xc6, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xca, 0x00, 0xcb, 0x00, 0x50, 0x00, 0xcd, 0x00, 0x52, +0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0x5b, 0x00, 0xd8, +0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x18, 0x00, 0x8e, 0x00, 0x8f, +0x00, 0x65, 0x00, 0x42, 0x01, 0x43, 0x01, 0x90, 0x00, 0x44, 0x01, 0x02, 0x00, 0x45, 0x01, 0xe1, 0x00, 0x02, 0x00, 0xe2, +0x00, 0x6d, 0x00, 0x46, 0x01, 0x47, 0x01, 0xe5, 0x00, 0x02, 0x00, 0xe6, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x02, 0x00, 0xe7, +0x00, 0x6d, 0x00, 0x48, 0x01, 0xeb, 0x00, 0xec, 0x00, 0x02, 0x00, 0x49, 0x01, 0x4a, 0x01, 0x6d, 0x00, 0x6e, 0x00, 0x02, +0x00, 0xf1, 0x00, 0x6d, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0x02, 0x00, 0x4b, 0x01, 0x6d, 0x00, 0x6e, 0x00, 0x02, +0x00, 0xfa, 0x00, 0x6d, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x00, 0x01, 0xe2, 0x00, 0x6d, +0x00, 0x6a, 0x00, 0x02, 0x00, 0x01, 0x01, 0x02, 0x01, 0x4c, 0x01, 0x04, 0x01, 0x05, 0x01, 0x6d, 0x00, 0xcc, 0x02, 0x00, +0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x01, 0x33, 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, 0x0d, 0x01, 0x14, +0x00, 0x02, 0x00, 0x15, 0x00, 0x16, 0x00, 0x4d, 0x01, 0x4e, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x10, 0x01, 0x11, 0x01, 0x6d, +0x00, 0x92, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x32, 0x01, 0x33, 0x01, 0x90, 0x00, 0x6a, 0x00, 0x02, 0x00, 0x12, +0x01, 0x6d, 0x00, 0x92, 0x0c, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x32, 0x01, 0x33, 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, 0x14, 0x01, 0x15, 0x01, 0x0f, 0x00, 0x16, 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, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, +0x00, 0x2d, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, +0x00, 0xb3, 0x00, 0xb4, 0x00, 0x39, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0x3d, 0x00, 0xba, 0x00, 0xbb, 0x00, 0x40, +0x00, 0xbd, 0x00, 0xbe, 0x00, 0x43, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0x48, 0x00, 0x49, 0x00, 0xc6, +0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xca, 0x00, 0xcb, 0x00, 0x50, 0x00, 0xcd, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, +0x00, 0x55, 0x00, 0x56, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0x5b, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, +0x00, 0xdb, 0x00, 0xdc, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x18, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x65, 0x00, 0x34, +0x01, 0x66, 0x00, 0x35, 0x01, 0x36, 0x01, 0x6a, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, +0x00, 0x02, 0x00, 0x6f, 0x00, 0x6d, 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, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, +0x01, 0x6d, 0x00, 0x52, 0x49, 0x50, 0x53, 0x5f, 0x43, 0x49, 0x44, 0xdf, 0x2d, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, +0x00, 0x00, 0x00, 0x00, 0xfe, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, +0x0b, 0x00, 0x08, 0x00, 0x9e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x15, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, -0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x95, 0x01, 0xb5, 0x03, 0xa0, 0x02, 0x04, 0x07, -0x37, 0x28, 0x06, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x22, 0x00, 0x00, 0x03, -0x00, 0x10, 0x9e, 0x01, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, -0x83, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, -0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, -0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, -0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, -0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, -0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, -0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, -0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, -0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x32, 0x1e, 0x04, 0x00, 0x5a, 0x00, 0x00, 0x70, 0x00, 0x00, -0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, -0x00, 0x02, 0x00, 0x00, 0x22, 0x00, 0x10, 0x00, 0x22, 0x01, 0x10, 0x00, 0x21, 0x06, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x00, -0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x28, -0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, -0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, -0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x37, 0x0a, 0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, -0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, -0x21, 0x08, 0x00, 0x54, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x00, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0xb6, -0x01, 0x00, 0x00, 0x12, 0x00, 0x00, 0x64, 0x00, 0x00, 0x04, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, -0x0a, 0x20, 0xb7, 0x02, 0x02, 0x08, 0x03, 0x94, 0x02, 0x0c, 0xb7, 0x02, 0x08, 0x08, 0x04, 0xfe, 0x02, 0x02, 0x13, 0x13, -0x08, 0x08, 0x08, 0x09, 0x3e, 0x18, 0x07, 0x13, 0x3e, 0x02, 0x07, 0x09, 0xc1, 0x04, 0x02, 0x13, 0x20, 0x21, 0xb5, 0x02, -0x32, 0x20, 0x01, 0xb8, 0x02, 0x0c, 0x13, 0x04, 0xb8, 0x02, 0x06, 0x09, 0x03, 0xb5, 0x02, 0x02, 0x20, 0x00, 0x3e, 0x16, -0x02, 0x41, 0xbb, 0x04, 0x3b, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x44, 0xbb, 0x04, 0x3b, 0x16, 0x03, 0x00, -0x00, 0x00, 0x3e, 0x18, 0x02, 0x08, 0xbb, 0x04, 0x45, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x41, 0x71, 0xb7, -0x02, 0x02, 0x08, 0x02, 0xb7, 0x02, 0x02, 0x45, 0x03, 0xbb, 0x04, 0x45, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, -0x09, 0x75, 0xbc, 0x02, 0x02, 0x13, 0x71, 0xbb, 0x04, 0x45, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x13, 0x78, -0xae, 0x83, 0x80, 0x02, 0x02, 0x41, 0x41, 0x41, 0x41, 0x72, 0x41, 0x41, 0x13, 0x73, 0x08, 0x08, 0x13, 0x13, 0x73, 0x73, -0x08, 0x08, 0x73, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x13, 0x74, 0x3b, 0x73, 0x08, 0x08, 0x76, 0x09, 0x08, -0x13, 0x13, 0x73, 0x3b, 0x08, 0x13, 0x3b, 0x08, 0x73, 0x08, 0x08, 0x08, 0x45, 0x09, 0x08, 0x08, 0x45, 0x08, 0x08, 0x09, -0x08, 0x08, 0x08, 0x08, 0x08, 0x44, 0x41, 0x41, 0x08, 0x08, 0x08, 0x08, 0x77, 0x3b, 0x08, 0x08, 0x08, 0x79, 0x3e, 0x02, -0x02, 0x7a, 0x39, 0x7b, 0x02, 0x02, 0x3e, 0x02, 0x02, 0x13, 0xbb, 0x04, 0x45, 0x16, 0x03, 0x00, 0x00, 0x00, 0xbb, 0x04, -0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x08, 0x00, 0x00, 0x80, 0x3f, 0x3e, 0x0a, 0x01, 0x13, 0x39, 0x94, -0x01, 0x02, 0x01, 0x3e, 0x44, 0x07, 0x08, 0xbb, 0x04, 0x3b, 0x0a, 0x35, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x12, 0x30, -0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x09, 0xbb, 0x04, 0x3b, 0x08, 0x34, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x45, 0x08, 0x02, -0x00, 0x00, 0x00, 0xbb, 0x04, 0x45, 0x0a, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x0c, 0x0a, 0xd7, 0xa3, 0x3a, 0xbb, -0x04, 0x45, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x1e, 0x31, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x1a, 0x32, -0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x0a, 0x36, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x06, 0x37, 0x00, 0x00, 0x00, 0xbb, -0x04, 0x3b, 0x10, 0x3a, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x08, 0x3b, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x0c, 0x33, -0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x45, 0xbb, 0x04, 0x3b, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x89, 0x03, 0x16, 0x08, 0x03, -0x00, 0x00, 0x00, 0x01, 0x00, 0xab, 0x02, 0x02, 0xaf, 0x02, 0x3e, 0x02, 0x00, 0xb0, 0x02, 0x39, 0xb1, 0x02, 0x02, 0x00, -0xbb, 0x04, 0x3b, 0x14, 0x1e, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x0e, 0x39, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x12, -0x38, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x16, 0x23, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x14, 0x21, 0x00, 0x00, 0x00, -0xce, 0x02, 0x50, 0x41, 0x13, 0x08, 0x3e, 0x02, 0x02, 0x89, 0x03, 0x39, 0x8a, 0x03, 0x02, 0x02, 0x3e, 0x52, 0x03, 0x13, -0x39, 0xb4, 0x03, 0x02, 0x03, 0xbb, 0x04, 0x3b, 0x0e, 0x3c, 0x00, 0x00, 0x00, 0xad, 0x06, 0x13, 0x82, 0x02, 0xad, 0x06, -0x08, 0x02, 0xad, 0x06, 0x09, 0x02, 0xc6, 0x06, 0x02, 0xf5, 0x08, 0x00, 0x03, 0x18, 0x02, 0x39, 0x20, 0xf8, 0x06, 0x07, -0x39, 0x21, 0x04, 0x07, 0x01, 0x13, 0x6e, 0xca, 0x05, 0x3d, 0x09, 0x02, 0x02, 0x02, 0x18, 0x13, 0x7d, 0x48, 0x8b, 0x03, -0x56, 0x01, 0x13, 0x02, 0x02, 0x80, 0x0b, 0x14, 0x66, 0x66, 0x2c, 0x2a, 0x2a, 0x2a, 0x28, 0xc1, 0x0a, 0x13, 0x25, 0x25, -0x00, 0x80, 0x0b, 0x14, 0x04, 0x04, 0x0a, 0x08, 0x08, 0x08, 0x06, 0xc1, 0x0a, 0x13, 0x31, 0x31, 0x00, 0x22, 0xe8, 0x01, -0x00, 0x23, 0x7d, 0x1e, 0x7c, 0x56, 0x62, 0x01, 0x13, 0x02, 0x02, 0x3d, 0x09, 0x02, 0x02, 0x02, 0x18, 0xc3, 0x10, 0x09, -0xfd, 0x01, 0x7f, 0xfd, 0x01, 0x13, 0x57, 0x04, 0x7c, 0xbc, 0x03, 0x01, 0x44, 0x02, 0x02, 0xc1, 0x12, 0x09, 0x04, 0x04, -0x0a, 0x01, 0x13, 0x04, 0x1a, 0x22, 0x02, 0x00, 0x22, 0x01, 0x04, 0xd9, 0x06, 0x13, 0x06, 0xc0, 0x06, 0x08, 0x04, 0x22, -0x20, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0xc6, 0x06, 0x13, 0xbf, 0x06, 0x00, 0x22, 0xa7, 0x06, 0x20, 0x03, 0xa7, 0x06, 0x21, -0x02, 0x18, 0x04, 0x01, 0x09, 0xa6, 0x02, 0xaa, 0x02, 0x5c, 0x08, 0x02, 0x01, 0x42, 0xb9, 0x01, 0x13, 0x6e, 0x06, 0x7c, -0xbc, 0x01, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x0f, 0x02, 0x0a, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, -0x03, 0x18, 0x02, 0x01, 0x13, 0x04, 0xbe, 0x02, 0x9e, 0x1e, 0xc2, 0x00, 0x00, 0x00, 0x18, 0x01, 0x13, 0xc6, 0x01, 0x0c, -0x7c, 0xc5, 0x01, 0x01, 0x09, 0x02, 0x02, 0x13, 0x6e, 0x06, 0x7c, 0xca, 0x01, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x0a, 0x08, -0x08, 0x10, 0x02, 0x13, 0xb7, 0x01, 0x08, 0x24, 0xd3, 0x01, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x02, 0x14, 0x02, 0x5c, -0x08, 0x04, 0x01, 0x04, 0xd6, 0x01, 0xca, 0x16, 0x0f, 0x04, 0x04, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, -0x03, 0x18, 0x02, 0xc1, 0x0a, 0x08, 0x0c, 0x32, 0x00, 0xc1, 0x0a, 0x08, 0x04, 0x36, 0x01, 0xc3, 0x10, 0x08, 0x04, 0x04, -0x1e, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xe5, 0x01, 0x4a, 0x08, 0x02, 0x0c, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x30, 0x02, 0xc8, -0x10, 0x08, 0x04, 0x04, 0x28, 0x99, 0x1e, 0x1c, 0x18, 0x1b, 0xe5, 0x1e, 0x08, 0xfc, 0x05, 0xd0, 0x00, 0x00, 0x00, 0xc1, -0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x13, 0x6e, 0xd5, 0x05, 0x7c, 0xee, 0x01, 0x01, 0x08, -0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x6e, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x28, 0xf1, 0x01, 0x8b, 0x01, 0x4a, 0x08, 0x02, -0xcd, 0x05, 0x02, 0x3f, 0x08, 0x06, 0x06, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xf6, 0x01, 0xc3, 0x10, 0x08, 0x06, 0xd6, 0x01, -0x06, 0x13, 0x6e, 0x04, 0x7c, 0xfb, 0x01, 0x01, 0x08, 0x02, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x25, 0xfa, 0x01, 0xfd, 0x01, -0x13, 0xc6, 0x01, 0x06, 0x7c, 0x80, 0x02, 0x01, 0x09, 0x02, 0x02, 0x13, 0x6e, 0x04, 0x7c, 0x83, 0x02, 0x01, 0x08, 0x02, -0x02, 0xca, 0x16, 0x0f, 0x02, 0x02, 0xf6, 0x01, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x13, -0x6e, 0x0a, 0x7c, 0x8b, 0x02, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x02, 0xa8, 0x01, 0x02, 0x13, 0x6e, 0x04, 0x7c, 0x8f, -0x02, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x08, 0x02, 0x13, 0x96, 0x02, 0x0a, 0x7c, 0x95, 0x02, 0x01, 0x45, -0x02, 0x02, 0x5c, 0x73, 0x02, 0x01, 0x3e, 0x98, 0x02, 0xc1, 0x0a, 0x08, 0x06, 0x06, 0x01, 0xc1, 0x0a, 0x08, 0x04, 0x0a, -0x00, 0x7c, 0x08, 0x04, 0x01, 0x2b, 0x92, 0x02, 0x8b, 0x01, 0x8f, 0x01, 0x7c, 0x08, 0x02, 0x01, 0x2e, 0x9c, 0x02, 0x9e, -0x02, 0xa0, 0x02, 0x13, 0x50, 0x08, 0x7c, 0xa4, 0x02, 0x01, 0x41, 0x02, 0x02, 0xc1, 0x0a, 0x13, 0x02, 0x02, 0x00, 0x3d, -0x09, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, 0x13, 0x02, 0x06, 0x01, 0x3d, 0x09, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, 0x13, -0x02, 0x0a, 0x02, 0x3d, 0x09, 0x02, 0x02, 0x02, 0x18, 0xd0, 0x0a, 0x44, 0x02, 0x0a, 0x06, 0x02, 0xb4, 0x0a, 0x44, 0x02, -0x2d, 0x01, 0x00, 0x00, 0x01, 0xb0, 0x02, 0x0a, 0x02, 0x01, 0x09, 0x04, 0xa2, 0x04, 0xc1, 0x12, 0x09, 0x02, 0x10, 0x02, -0xe8, 0x0a, 0x13, 0x04, 0x0a, 0x04, 0x02, 0xa1, 0x02, 0x3d, 0x09, 0x02, 0x02, 0x02, 0x18, 0x4a, 0x09, 0x04, 0x72, 0x04, -0x99, 0x1e, 0x66, 0x18, 0x65, 0xe5, 0x1e, 0x09, 0xa6, 0x05, 0x02, 0x01, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x3b, 0x01, -0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x13, 0x6e, 0xbb, 0x04, 0x7c, 0xbc, 0x02, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x04, -0x04, 0x84, 0x01, 0xce, 0x10, 0x09, 0x04, 0xb1, 0x04, 0x04, 0x13, 0x6e, 0x04, 0x7c, 0xc3, 0x02, 0x01, 0x08, 0x02, 0x02, -0xca, 0x16, 0x0f, 0x02, 0x02, 0xf6, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x13, 0x6e, -0x0c, 0x7c, 0xcc, 0x02, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0xaa, 0x02, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x28, -0xcf, 0x02, 0x8b, 0x01, 0x4a, 0x08, 0x02, 0x91, 0x04, 0x02, 0x3f, 0x08, 0x06, 0x06, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xd4, -0x02, 0x13, 0x7d, 0x06, 0x7c, 0xd7, 0x02, 0x01, 0x13, 0x02, 0x02, 0x3d, 0x09, 0x02, 0x02, 0x02, 0x18, 0x23, 0x6e, 0x02, -0x7c, 0xd7, 0x02, 0x88, 0x01, 0x01, 0x08, 0x02, 0x02, 0xce, 0x10, 0x09, 0x02, 0x06, 0x02, 0x01, 0x09, 0x04, 0xf6, 0x04, -0x5c, 0x09, 0x02, 0x01, 0x45, 0xdf, 0x02, 0x13, 0xc6, 0x01, 0x04, 0x7c, 0xe1, 0x02, 0x01, 0x09, 0x02, 0x02, 0xc4, 0x12, -0x08, 0x02, 0x08, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x28, 0xe4, 0x02, 0x8b, 0x01, 0x6c, 0x08, 0x0a, 0x01, 0x1a, 0xe5, 0x02, -0xc5, 0x02, 0xc3, 0x10, 0x08, 0x08, 0xbe, 0x03, 0x32, 0x4a, 0x08, 0x02, 0x0a, 0x02, 0xce, 0x10, 0x09, 0x02, 0x26, 0x02, -0x4b, 0x09, 0x04, 0x60, 0x04, 0x99, 0x1e, 0x54, 0x18, 0x53, 0xe5, 0x1e, 0x09, 0xaa, 0x04, 0x42, 0x01, 0x00, 0x00, 0x08, -0x01, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x13, 0xb7, 0x01, 0xd3, 0x03, 0x23, 0x88, 0x01, 0x01, -0x08, 0x02, 0x02, 0xce, 0x10, 0x09, 0x04, 0xcd, 0x03, 0x04, 0x01, 0x13, 0x02, 0xa8, 0x05, 0x3d, 0x09, 0x02, 0x02, 0x02, -0x18, 0xc3, 0x10, 0x08, 0x04, 0xd6, 0x03, 0xf8, 0x01, 0xce, 0x10, 0x09, 0x02, 0x06, 0x02, 0x4b, 0x09, 0x04, 0x04, 0x0e, -0x13, 0xb7, 0x01, 0x02, 0x23, 0xdf, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x04, 0x00, 0x22, 0x02, 0x00, 0x13, 0xb7, 0x01, 0x02, -0x23, 0xd3, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x08, 0x01, 0x22, 0x02, 0x00, 0x13, 0xb7, 0x01, 0x02, 0x23, 0xce, 0x01, 0xc1, -0x0a, 0x08, 0x02, 0x0c, 0x02, 0x22, 0x02, 0x00, 0x01, 0x13, 0x02, 0xc2, 0x05, 0x9e, 0x1e, 0x84, 0x01, 0x00, 0x00, 0x88, -0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, -0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, -0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, -0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x53, 0x5a, 0xa0, 0x02, -0x04, 0x07, 0x10, 0x2e, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, -0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x23, 0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, -0x10, 0x00, 0x21, 0x01, 0x10, 0x6c, 0x1e, 0x00, 0x10, 0x0e, 0x1e, 0x07, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xb5, -0x02, 0x0a, 0x20, 0x01, 0xa6, 0x02, 0x0c, 0x20, 0xb7, 0x02, 0x02, 0x0e, 0x04, 0xb8, 0x02, 0x02, 0x0f, 0x04, 0xb7, 0x02, -0x06, 0x0e, 0x03, 0xb8, 0x02, 0x02, 0x13, 0x03, 0xb5, 0x02, 0x02, 0x20, 0x00, 0xbb, 0x04, 0x15, 0x02, 0x08, 0x00, 0x00, -0x00, 0xbc, 0x02, 0x02, 0x0f, 0x16, 0x8e, 0x03, 0x02, 0x10, 0x14, 0x08, 0x08, 0x08, 0x0e, 0x17, 0xbb, 0x04, 0x15, 0x02, -0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x18, 0x19, 0xae, 0x02, 0x02, 0x1a, 0x3e, 0x02, 0x02, 0x1b, 0x39, 0x1c, 0x02, -0x02, 0xbb, 0x04, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x1e, 0x02, 0x08, 0xbb, 0x04, 0x08, 0x14, 0x04, 0x00, 0x00, -0x00, 0xb7, 0x02, 0x1a, 0x0e, 0x02, 0x3e, 0x1c, 0x03, 0x44, 0x39, 0x52, 0x02, 0x03, 0xbb, 0x04, 0x15, 0x06, 0x00, 0x00, -0x00, 0x00, 0x3e, 0x02, 0x03, 0x0e, 0x3e, 0x04, 0x01, 0x0f, 0x39, 0x59, 0x02, 0x01, 0xbb, 0x04, 0x15, 0x02, 0x02, 0x00, -0x00, 0x00, 0x3e, 0x02, 0x01, 0x0e, 0xbb, 0x04, 0x15, 0x06, 0x03, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x15, 0x08, 0x01, 0x00, -0x00, 0x00, 0xad, 0x06, 0x08, 0x86, 0x01, 0xc6, 0x06, 0x02, 0xc3, 0x02, 0x00, 0x03, 0x18, 0x02, 0x33, 0x2d, 0xb8, 0x02, -0x1d, 0x1e, 0xa6, 0x01, 0x37, 0x01, 0x08, 0x02, 0x02, 0xbc, 0x0e, 0x0e, 0x99, 0x01, 0x99, 0x01, 0x13, 0x57, 0x06, 0x53, -0x56, 0x22, 0x00, 0x06, 0x13, 0x5c, 0x0a, 0x5a, 0x5b, 0x01, 0x0e, 0x02, 0x02, 0x13, 0x5c, 0x04, 0x5a, 0x5f, 0x01, 0x0e, -0x02, 0x02, 0xc8, 0x10, 0x0e, 0x02, 0x08, 0x02, 0x13, 0x57, 0x04, 0x53, 0x63, 0x22, 0x00, 0x04, 0x8d, 0x1e, 0x88, 0x06, -0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, -0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, -0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xdf, 0x0e, -0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0xbf, 0x01, 0xa0, 0x02, 0x04, 0x07, 0x00, 0xfe, 0x02, 0x00, 0x10, 0x00, -0x1e, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x12, 0x20, 0xb7, 0x02, 0x02, 0x0c, 0x04, 0xbb, 0x04, -0x0c, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0xec, 0x04, 0x0d, 0x70, 0x70, 0x70, 0x70, 0x70, 0x3e, 0x34, 0x03, 0x0d, 0x39, -0xbe, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xf5, 0x02, 0x00, 0x03, 0x18, 0x02, 0x22, 0xf3, 0x02, 0xbd, 0x02, 0x8d, 0x1e, -0x88, 0x06, 0x00, 0x00, 0xb9, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, -0x00, 0x00, 0x07, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x18, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, -0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, -0x00, 0x01, 0xbf, 0x0f, 0x00, 0x02, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, -0x28, 0x06, 0x10, 0x37, 0x11, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, -0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, -0x14, 0x06, 0x80, 0x02, 0x47, 0x11, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x02, 0x22, 0x00, 0x10, 0x00, 0x21, -0x01, 0x10, 0x12, 0x06, 0x40, 0x10, 0x02, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x37, 0x15, 0x83, -0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, -0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, -0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, -0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, -0x04, 0x01, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, -0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, -0x10, 0x02, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x00, 0x17, 0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x1a, 0x01, 0x08, 0x10, -0x17, 0x1e, 0x00, 0x37, 0x1a, 0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, -0x01, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x02, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x10, 0x19, 0x0b, 0x2b, -0x10, 0x02, 0x1e, 0x04, 0x10, 0x02, 0x1e, 0x07, 0x10, 0x02, 0x0b, 0x03, 0x47, 0x16, 0x02, 0x00, 0x0b, 0x01, 0x00, 0x01, -0x0b, 0x01, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x93, 0x02, 0x34, 0xa1, 0x04, 0x02, 0x1b, 0xa6, 0x02, 0x02, 0x20, -0xb7, 0x02, 0x02, 0x1d, 0x04, 0xb8, 0x02, 0x02, 0x1e, 0x04, 0xb7, 0x02, 0x02, 0x1d, 0x03, 0xae, 0x02, 0x2b, 0x1e, 0xb5, -0x02, 0x2e, 0x20, 0x00, 0xbb, 0x04, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x02, 0x20, 0x01, 0xbb, 0x04, 0x23, -0x02, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x21, 0x02, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x23, 0x02, 0x01, 0x00, 0x00, -0x00, 0xbb, 0x04, 0x21, 0x02, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x23, 0x02, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x02, -0x20, 0x03, 0xbb, 0x04, 0x21, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x2b, 0x1e, 0x2a, 0x8e, 0x03, 0x11, 0x1f, 0x29, -0x23, 0x23, 0x23, 0x1d, 0x14, 0xbb, 0x04, 0x21, 0x40, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x2b, 0x0b, 0x2b, 0xae, 0x02, -0x11, 0x15, 0x3e, 0x40, 0x02, 0x0c, 0x39, 0x2c, 0x3d, 0x02, 0x3e, 0x40, 0x02, 0x1f, 0xbb, 0x04, 0x23, 0x02, 0x04, 0x00, -0x00, 0x00, 0x3e, 0x02, 0x02, 0x1d, 0xbb, 0x04, 0x21, 0x02, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x33, 0x1f, 0x30, 0xb7, -0x02, 0x36, 0x1d, 0x02, 0xb7, 0x02, 0x02, 0x21, 0x03, 0xbb, 0x04, 0x21, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x37, -0x20, 0x33, 0xbc, 0x02, 0x02, 0x1e, 0x30, 0xbb, 0x04, 0x21, 0x38, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x35, 0x1e, 0x34, -0xae, 0x83, 0x80, 0x02, 0x15, 0x1f, 0x1f, 0x1f, 0x1f, 0x16, 0x1f, 0x1f, 0x1e, 0x31, 0x1d, 0x1d, 0x1e, 0x1e, 0x31, 0x31, -0x1d, 0x1d, 0x31, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x32, 0x23, 0x31, 0x1d, 0x1d, 0x17, 0x20, 0x1d, -0x1e, 0x1e, 0x31, 0x23, 0x1d, 0x1e, 0x23, 0x1d, 0x31, 0x1d, 0x1d, 0x1d, 0x21, 0x20, 0x1d, 0x1d, 0x21, 0x1d, 0x1d, 0x20, -0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x29, 0x1f, 0x1f, 0x1d, 0x1d, 0x1d, 0x1d, 0x18, 0x23, 0x1d, 0x1d, 0x1d, 0x19, 0x3e, 0x4e, -0x02, 0x0e, 0x39, 0x35, 0x4b, 0x02, 0x3e, 0x4e, 0x03, 0x23, 0x39, 0x36, 0x65, 0x03, 0xb2, 0x06, 0x23, 0x1a, 0x02, 0x00, -0x00, 0x00, 0x3e, 0x4e, 0x01, 0x1e, 0x39, 0x37, 0x65, 0x01, 0xce, 0x02, 0x1a, 0x1f, 0x1e, 0x1d, 0x3e, 0x4e, 0x02, 0x11, -0x39, 0x38, 0x4b, 0x02, 0x3e, 0x4e, 0x01, 0x23, 0x39, 0x39, 0x67, 0x01, 0x3e, 0x6a, 0x03, 0x1e, 0x39, 0x3a, 0x67, 0x03, -0x3e, 0x6a, 0x03, 0x1d, 0x39, 0x3a, 0x67, 0x03, 0xbb, 0x04, 0x1d, 0x6a, 0x00, 0x00, 0x00, 0x40, 0xbb, 0x04, 0x1d, 0x02, -0x00, 0x00, 0x80, 0xbf, 0xbb, 0x04, 0x1d, 0x02, 0x00, 0x00, 0x80, 0x3f, 0xbc, 0x02, 0x02, 0x1d, 0x27, 0x3e, 0x02, 0x03, -0x3f, 0x39, 0x40, 0x6f, 0x03, 0xbe, 0x02, 0x16, 0x1e, 0x1d, 0x3e, 0x5c, 0x03, 0x13, 0x39, 0x41, 0x6f, 0x03, 0xc6, 0x06, -0x1b, 0x0d, 0x00, 0x1c, 0x18, 0x80, 0x01, 0x01, 0x23, 0x02, 0x7c, 0x22, 0x80, 0x01, 0x00, 0x01, 0x23, 0x02, 0x82, 0x01, -0xc7, 0x10, 0x23, 0x02, 0x02, 0x6a, 0x33, 0x2d, 0x02, 0x0d, 0x24, 0x45, 0x24, 0x01, 0x1f, 0x02, 0x02, 0x01, 0x1e, 0x02, -0x88, 0x01, 0xc1, 0x12, 0x1e, 0x02, 0x04, 0x02, 0x13, 0x2d, 0x02, 0x0f, 0x24, 0x01, 0x1f, 0x02, 0x02, 0xc1, 0x12, 0x1e, -0x02, 0x02, 0x06, 0x3d, 0x20, 0x02, 0x02, 0x02, 0x18, 0x5c, 0x1d, 0x02, 0x01, 0x42, 0x4d, 0x13, 0x2f, 0x02, 0x12, 0x28, -0x01, 0x1d, 0x69, 0x69, 0xc8, 0x10, 0x1d, 0x6c, 0x04, 0x6c, 0x3d, 0x20, 0x02, 0x12, 0x12, 0x18, 0xce, 0x10, 0x20, 0x02, -0x02, 0x04, 0xc1, 0x0a, 0x1d, 0x02, 0x02, 0x00, 0xd2, 0x0a, 0x1e, 0x02, 0x02, 0x18, 0x00, 0xc1, 0x0a, 0x1d, 0x02, 0x06, -0x01, 0xd2, 0x0a, 0x1e, 0x02, 0x02, 0x04, 0x01, 0xc1, 0x0a, 0x1d, 0x02, 0x0a, 0x02, 0xd2, 0x0a, 0x1e, 0x02, 0x02, 0x04, -0x02, 0xc1, 0x12, 0x1e, 0x02, 0x24, 0x02, 0xb0, 0x0a, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x1e, 0x02, 0x02, 0x00, 0x3d, 0x20, -0x02, 0x02, 0x02, 0x18, 0x13, 0x3b, 0x02, 0x06, 0x22, 0xc1, 0x0a, 0x1d, 0x02, 0x04, 0x00, 0x22, 0x02, 0x00, 0x13, 0x3b, -0x02, 0x06, 0x25, 0xc1, 0x0a, 0x1d, 0x02, 0x08, 0x01, 0x22, 0x02, 0x00, 0x13, 0x3b, 0x02, 0x06, 0x27, 0xc1, 0x0a, 0x1d, -0x02, 0x0c, 0x02, 0x22, 0x02, 0x00, 0x01, 0x23, 0x02, 0xc0, 0x01, 0xcb, 0x10, 0x23, 0x02, 0x02, 0xa8, 0x01, 0x23, 0x2d, -0x02, 0x0f, 0x2e, 0x64, 0x01, 0x1f, 0x02, 0x02, 0xc1, 0x12, 0x1e, 0x02, 0x02, 0x18, 0x22, 0xc0, 0x01, 0x00, 0x01, 0x23, -0x02, 0xca, 0x01, 0xcb, 0x10, 0x23, 0x02, 0x02, 0xb2, 0x01, 0xbf, 0x0c, 0x1d, 0x02, 0xb4, 0x01, 0xc8, 0x10, 0x1d, 0x02, -0x5e, 0x02, 0xc8, 0x10, 0x1d, 0x02, 0x02, 0x60, 0x4b, 0x1d, 0x02, 0x60, 0x02, 0xbf, 0x0c, 0x1d, 0x02, 0x0a, 0x4a, 0x1d, -0x02, 0x08, 0x02, 0x4b, 0x1d, 0x02, 0x06, 0x02, 0xc8, 0x10, 0x1d, 0x02, 0x66, 0x0e, 0xc1, 0x0a, 0x1d, 0x02, 0x16, 0x00, -0x4a, 0x1d, 0x02, 0x02, 0x04, 0xd2, 0x0a, 0x1e, 0x02, 0x02, 0x1a, 0x00, 0xc1, 0x0a, 0x1d, 0x02, 0x02, 0x03, 0x4a, 0x1d, -0x02, 0x0c, 0x02, 0xc1, 0x0a, 0x1d, 0x02, 0x06, 0x00, 0x4b, 0x1d, 0x02, 0x02, 0x04, 0xd2, 0x0a, 0x1e, 0x02, 0x02, 0x0a, -0x00, 0xc1, 0x0a, 0x1d, 0x02, 0x02, 0x00, 0xc3, 0x10, 0x1d, 0x02, 0x7a, 0x18, 0xc1, 0x0a, 0x1d, 0x02, 0x06, 0x03, 0x4a, -0x1d, 0x02, 0x04, 0x02, 0x4b, 0x1d, 0x02, 0x08, 0x02, 0xc0, 0x10, 0x23, 0x02, 0x2c, 0xb2, 0x01, 0xbf, 0x0c, 0x1d, 0x02, -0x02, 0x4a, 0x1d, 0x02, 0x2c, 0x02, 0xc3, 0x10, 0x1d, 0x02, 0x88, 0x01, 0x02, 0x4a, 0x1d, 0x02, 0x02, 0x0e, 0x4b, 0x1d, -0x02, 0x14, 0x02, 0x13, 0x3b, 0x02, 0x08, 0x24, 0x22, 0x00, 0x0e, 0x3f, 0x1d, 0x02, 0x04, 0x13, 0x3b, 0x02, 0x08, 0x26, -0x22, 0x00, 0x02, 0xc1, 0x0a, 0x1d, 0x02, 0x1e, 0x01, 0x3f, 0x1d, 0x02, 0x02, 0xd2, 0x0a, 0x1e, 0x02, 0x02, 0x22, 0x01, -0x13, 0x3a, 0x02, 0x09, 0x24, 0x22, 0x00, 0x02, 0x22, 0x90, 0x02, 0x8c, 0x01, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xca, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, -0x0b, 0x00, 0x08, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x14, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, -0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, -0x00, 0x01, 0xaf, 0x0f, 0x00, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x8b, 0x01, 0xc6, 0x01, 0xc8, 0x01, 0xd5, 0x01, -0xe5, 0x01, 0xee, 0x01, 0x10, 0x96, 0x01, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, +0x00, 0x01, 0xaf, 0x0f, 0x00, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x91, 0x01, 0xd6, 0x01, 0xd8, 0x01, 0xe5, 0x01, +0xf5, 0x01, 0xfd, 0x01, 0x10, 0x9a, 0x01, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, 0x42, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, -0x04, 0x06, 0x10, 0x37, 0x02, 0x76, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, +0x04, 0x06, 0x10, 0x37, 0x02, 0x83, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, -0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, -0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, -0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, -0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, 0x00, 0x00, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, -0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x1e, 0x1e, 0x00, 0x37, 0x4c, 0x07, 0x00, 0x05, 0x00, 0x23, 0x00, -0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, -0x00, 0x10, 0x00, 0x21, 0x08, 0x00, 0x26, 0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x04, 0x0b, 0x2b, 0x10, 0x1a, 0x1e, 0x04, -0x10, 0x20, 0x1e, 0x07, 0x47, 0x0e, 0x04, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x01, 0x0b, 0x01, 0x03, 0x01, -0x0b, 0x01, 0x04, 0x00, 0x00, 0x02, 0x00, 0xb0, 0x01, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x06, -0x20, 0xb7, 0x02, 0x02, 0x06, 0x04, 0xb8, 0x02, 0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, 0x06, 0x03, 0xae, 0x02, 0x28, 0x07, -0xb5, 0x02, 0x1a, 0x20, 0x00, 0xbb, 0x04, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x04, 0x20, 0x01, 0xbb, 0x04, -0x2d, 0x02, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2a, 0x06, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2a, 0x0a, 0x02, 0x00, -0x00, 0x00, 0xbb, 0x04, 0x2d, 0x04, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x22, 0x09, 0x03, 0xbb, 0x04, 0x2a, 0x02, 0x08, -0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x4a, 0x8e, 0x03, 0x02, 0x08, 0x49, 0x2d, 0x2d, 0x2d, 0x06, 0x4b, 0xbb, 0x04, -0x2a, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x4c, 0x4d, 0xae, 0x02, 0x02, 0x4e, 0x3e, 0x02, 0x02, 0x4f, 0x39, -0x50, 0x02, 0x02, 0x3e, 0x04, 0x02, 0x08, 0xbb, 0x04, 0x2d, 0x28, 0x04, 0x00, 0x00, 0x00, 0x3e, 0x0e, 0x02, 0x06, 0xbb, -0x04, 0x2a, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x08, 0x71, 0xb7, 0x02, 0x02, 0x06, 0x02, 0xb7, 0x02, 0x02, -0x2a, 0x03, 0xbb, 0x04, 0x2a, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, 0x75, 0xbc, 0x02, 0x02, 0x07, 0x71, -0xbb, 0x04, 0x2a, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x78, 0xae, 0x83, 0x80, 0x02, 0x02, 0x08, 0x08, -0x08, 0x08, 0x72, 0x08, 0x08, 0x07, 0x73, 0x06, 0x06, 0x07, 0x07, 0x73, 0x73, 0x06, 0x06, 0x73, 0x06, 0x06, 0x06, 0x06, -0x06, 0x06, 0x06, 0x06, 0x07, 0x74, 0x2d, 0x73, 0x06, 0x06, 0x76, 0x09, 0x06, 0x07, 0x07, 0x73, 0x2d, 0x06, 0x07, 0x2d, -0x06, 0x73, 0x06, 0x06, 0x06, 0x2a, 0x09, 0x06, 0x06, 0x2a, 0x06, 0x06, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x49, 0x08, -0x08, 0x06, 0x06, 0x06, 0x06, 0x77, 0x2d, 0x06, 0x06, 0x06, 0x79, 0x3e, 0x02, 0x02, 0x7a, 0x39, 0x7b, 0x02, 0x02, 0x3e, -0x1c, 0x01, 0x07, 0x39, 0x8a, 0x01, 0x02, 0x01, 0xce, 0x02, 0x4c, 0x08, 0x07, 0x06, 0x3e, 0x02, 0x02, 0xb1, 0x01, 0x39, -0xb2, 0x01, 0x02, 0x02, 0x3e, 0x24, 0x03, 0x2d, 0x39, 0xc5, 0x01, 0x02, 0x03, 0x3e, 0x02, 0x01, 0x2d, 0x39, 0xc7, 0x01, -0x02, 0x01, 0x3e, 0x18, 0x03, 0x07, 0x39, 0xd4, 0x01, 0x02, 0x03, 0x3e, 0x08, 0x03, 0x06, 0x39, 0xd4, 0x01, 0x18, 0x03, -0xbc, 0x02, 0x0c, 0x06, 0x31, 0xde, 0x02, 0x02, 0x07, 0x06, 0xeb, 0x01, 0xeb, 0x01, 0x3e, 0x02, 0x03, 0xec, 0x01, 0x39, -0xed, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xd3, 0x03, 0x00, 0x03, 0x18, 0x02, 0x01, 0x2d, 0x88, 0x03, 0x02, 0x22, 0x06, -0x00, 0x01, 0x2d, 0x02, 0x08, 0x33, 0x53, 0x68, 0x51, 0x2e, 0xca, 0x01, 0x2e, 0x01, 0x08, 0x02, 0x02, 0x01, 0x07, 0xb0, -0x01, 0x98, 0x03, 0xc1, 0x12, 0x07, 0x37, 0x78, 0x37, 0x13, 0x53, 0x46, 0x7c, 0x2e, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, -0x07, 0x41, 0x41, 0x06, 0x3d, 0x09, 0x04, 0x04, 0x04, 0x18, 0x5c, 0x06, 0x02, 0x01, 0x42, 0xc0, 0x02, 0x13, 0x6e, 0x04, -0xb3, 0x01, 0x38, 0x01, 0x06, 0x02, 0x02, 0xc8, 0x10, 0x06, 0x02, 0x08, 0x02, 0x3d, 0x09, 0x04, 0x1f, 0x1f, 0x18, 0xce, -0x10, 0x09, 0x02, 0x02, 0x06, 0xc1, 0x0a, 0x06, 0x04, 0x04, 0x00, 0xd2, 0x0a, 0x07, 0x54, 0x54, 0x3a, 0x00, 0xc1, 0x0a, -0x06, 0x4f, 0x08, 0x01, 0xd2, 0x0a, 0x07, 0x54, 0x54, 0x04, 0x01, 0xc1, 0x0a, 0x06, 0x4f, 0x0c, 0x02, 0xd2, 0x0a, 0x07, -0x54, 0x54, 0x04, 0x02, 0xc1, 0x12, 0x07, 0x4d, 0xa4, 0x01, 0x4d, 0xb0, 0x0a, 0x1d, 0x42, 0x42, 0xc1, 0x0a, 0x07, 0x0d, -0x0d, 0x00, 0x3d, 0x09, 0xa5, 0x02, 0xa5, 0x02, 0xa5, 0x02, 0x18, 0x13, 0xd9, 0x01, 0x04, 0xd5, 0x01, 0x2b, 0xc1, 0x0a, -0x06, 0x02, 0x06, 0x00, 0x22, 0x02, 0x00, 0x13, 0xd9, 0x01, 0x02, 0xd5, 0x01, 0x31, 0xc1, 0x0a, 0x06, 0x02, 0x0a, 0x01, -0x22, 0x02, 0x00, 0x13, 0xd9, 0x01, 0x02, 0xd5, 0x01, 0x36, 0xc1, 0x0a, 0x06, 0x02, 0x0e, 0x02, 0x22, 0x02, 0x00, 0x23, -0x53, 0x8c, 0x02, 0x7c, 0x67, 0x2e, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x83, 0x02, 0x83, 0x02, 0x8d, 0x02, 0x22, -0x01, 0x00, 0xc1, 0x0a, 0x06, 0x08, 0x08, 0x01, 0x3f, 0x06, 0x02, 0x02, 0xd2, 0x0a, 0x07, 0xa4, 0x02, 0xa4, 0x02, 0xae, -0x02, 0x01, 0x13, 0xd4, 0x01, 0x95, 0x02, 0xee, 0x01, 0x2e, 0x22, 0x00, 0x95, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, -0x0b, 0x00, 0x08, 0x00, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, -0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, -0x00, 0x01, 0xdf, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0xd3, 0x01, 0xa0, 0x02, 0x04, 0x07, 0x37, 0xce, -0x02, 0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, -0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x10, 0x54, 0x1e, 0x00, 0x00, 0xc2, 0x01, 0x00, -0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x12, 0x20, 0xb7, 0x02, 0x02, 0x0c, 0x04, 0xb7, 0x02, 0x02, 0x0c, -0x03, 0xfe, 0x02, 0x02, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0e, 0xb5, 0x02, 0x42, 0x20, 0x01, 0xb8, 0x02, 0x0c, 0x0d, 0x04, -0xbb, 0x04, 0x30, 0x2a, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x7e, 0x02, 0x0d, 0xce, 0x02, 0x3a, 0x36, 0x0d, 0x0c, 0x3e, 0x02, -0x02, 0xa7, 0x01, 0x39, 0xa8, 0x01, 0x02, 0x02, 0x3e, 0x52, 0x03, 0x0d, 0x39, 0xd2, 0x01, 0x02, 0x03, 0xad, 0x06, 0x0d, -0xea, 0x01, 0xad, 0x06, 0x0c, 0x02, 0xad, 0x06, 0x0e, 0x02, 0xc6, 0x06, 0x02, 0x8b, 0x05, 0x00, 0x03, 0x18, 0x02, 0x13, -0x8a, 0x01, 0xdc, 0x04, 0xa9, 0x01, 0x4b, 0x01, 0x0d, 0x02, 0x02, 0x80, 0x0b, 0x0f, 0x58, 0x58, 0x30, 0x2e, 0x2e, 0x2e, -0x2c, 0xc1, 0x0a, 0x0d, 0x29, 0x29, 0x00, 0x80, 0x0b, 0x0f, 0x04, 0x04, 0x0a, 0x08, 0x08, 0x08, 0x06, 0xc1, 0x0a, 0x0d, -0x1f, 0x1f, 0x00, 0x22, 0xd4, 0x01, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, -0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xcf, 0x0e, 0x04, 0x04, 0xed, 0xc2, -0xa5, 0xf3, 0x06, 0x00, 0xa0, 0x02, 0x04, 0x07, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xc6, 0x06, 0x02, 0x02, 0x00, -0x03, 0x18, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x14, 0x1d, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, -0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, -0x95, 0x01, 0xb5, 0x03, 0xa0, 0x02, 0x04, 0x07, 0x10, 0xe4, 0x01, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, -0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x76, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, -0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, -0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, -0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, -0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x08, 0x01, -0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, -0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, -0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, -0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, -0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, -0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x32, 0x1e, 0x04, 0x00, 0x8e, 0x02, 0x00, 0x00, 0x04, -0x00, 0x00, 0x28, 0x00, 0x10, 0x00, 0x22, 0x01, 0x10, 0x00, 0x21, 0x06, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x02, -0x00, 0x37, 0xa0, 0x01, 0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, -0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x10, 0x54, 0x1e, 0x00, 0x00, -0xd6, 0x01, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, 0x20, 0xb7, 0x02, 0x02, 0x08, 0x03, 0x94, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, +0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, +0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, +0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x26, 0x1e, 0x00, 0x37, 0x4c, +0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x10, +0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x00, 0x3a, 0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x04, +0x0b, 0x2b, 0x10, 0x1a, 0x1e, 0x04, 0x10, 0x20, 0x1e, 0x07, 0x47, 0x0c, 0x02, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, +0x01, 0x00, 0x00, 0x02, 0x00, 0xb2, 0x01, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x06, 0x20, 0xb7, +0x02, 0x02, 0x06, 0x04, 0xb8, 0x02, 0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, 0x06, 0x03, 0xae, 0x02, 0x2c, 0x07, 0xb5, 0x02, +0x1a, 0x20, 0x00, 0xbb, 0x04, 0x2c, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x04, 0x20, 0x01, 0xbb, 0x04, 0x2f, 0x02, +0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2c, 0x06, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2c, 0x0a, 0x02, 0x00, 0x00, 0x00, +0xbb, 0x04, 0x2f, 0x04, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x22, 0x09, 0x03, 0xbb, 0x04, 0x2c, 0x02, 0x08, 0x00, 0x00, +0x00, 0xbc, 0x02, 0x02, 0x07, 0x4c, 0x8e, 0x03, 0x02, 0x08, 0x4b, 0x2f, 0x2f, 0x2f, 0x06, 0x4d, 0xbb, 0x04, 0x2c, 0x02, +0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x4e, 0x4f, 0xae, 0x02, 0x02, 0x50, 0x3e, 0x02, 0x02, 0x51, 0x39, 0x52, 0x02, +0x02, 0x3e, 0x04, 0x02, 0x08, 0xbb, 0x04, 0x2f, 0x28, 0x04, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2f, 0x0c, 0x05, 0x00, 0x00, +0x00, 0x3e, 0x02, 0x02, 0x06, 0xbb, 0x04, 0x2c, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x08, 0x73, 0xb7, 0x02, +0x02, 0x06, 0x02, 0xb7, 0x02, 0x02, 0x2c, 0x03, 0xbb, 0x04, 0x2c, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, +0x77, 0xbc, 0x02, 0x02, 0x07, 0x73, 0xbb, 0x04, 0x2c, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x7a, 0xae, +0x83, 0x80, 0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x74, 0x08, 0x08, 0x07, 0x75, 0x06, 0x06, 0x07, 0x07, 0x75, 0x75, 0x06, +0x06, 0x75, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x76, 0x2f, 0x75, 0x06, 0x06, 0x78, 0x09, 0x06, 0x07, +0x07, 0x75, 0x2f, 0x06, 0x07, 0x2f, 0x06, 0x75, 0x06, 0x06, 0x06, 0x2c, 0x09, 0x06, 0x06, 0x2c, 0x06, 0x06, 0x09, 0x06, +0x06, 0x06, 0x06, 0x06, 0x4b, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x79, 0x2f, 0x06, 0x06, 0x06, 0x7b, 0x3e, 0x02, 0x02, +0x7c, 0x39, 0x7d, 0x02, 0x02, 0x3e, 0x24, 0x01, 0x07, 0x39, 0x90, 0x01, 0x02, 0x01, 0xce, 0x02, 0x4c, 0x08, 0x07, 0x06, +0x3e, 0x02, 0x02, 0xb7, 0x01, 0x39, 0xb8, 0x01, 0x02, 0x02, 0xbb, 0x04, 0x06, 0x2c, 0xa4, 0x70, 0x7d, 0x3f, 0x3e, 0x0c, +0x03, 0x2f, 0x39, 0xd5, 0x01, 0x02, 0x03, 0x3e, 0x02, 0x01, 0x2f, 0x39, 0xd7, 0x01, 0x02, 0x01, 0x3e, 0x18, 0x03, 0x07, +0x39, 0xe4, 0x01, 0x02, 0x03, 0x3e, 0x08, 0x03, 0x06, 0x39, 0xe4, 0x01, 0x18, 0x03, 0xbe, 0x02, 0x0c, 0x07, 0x06, 0x3e, +0x02, 0x03, 0xfb, 0x01, 0x39, 0xfc, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xf1, 0x03, 0x00, 0x03, 0x18, 0x02, 0x01, 0x2f, +0xa8, 0x03, 0x02, 0x22, 0x06, 0x00, 0x01, 0x2f, 0x02, 0x08, 0x33, 0x55, 0x66, 0x53, 0x30, 0xda, 0x01, 0x30, 0x01, 0x08, +0x02, 0x02, 0x01, 0x07, 0xc2, 0x01, 0xbc, 0x03, 0xc1, 0x12, 0x07, 0x47, 0x7a, 0x47, 0x13, 0x55, 0x56, 0x7e, 0x30, 0x01, +0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x51, 0x51, 0x06, 0x3d, 0x09, 0x04, 0x04, 0x04, 0x18, 0x5c, 0x06, 0x02, 0x01, 0x42, +0xd0, 0x02, 0x13, 0x70, 0x04, 0xb9, 0x01, 0x3a, 0x01, 0x06, 0x02, 0x02, 0xc8, 0x10, 0x06, 0x02, 0x08, 0x02, 0x3d, 0x09, +0x04, 0x2f, 0x2f, 0x18, 0xce, 0x10, 0x09, 0x02, 0x02, 0x06, 0xc1, 0x0a, 0x06, 0x04, 0x04, 0x00, 0xd2, 0x0a, 0x07, 0x74, +0x74, 0x4a, 0x00, 0xc1, 0x0a, 0x06, 0x6f, 0x08, 0x01, 0xd2, 0x0a, 0x07, 0x74, 0x74, 0x04, 0x01, 0xc1, 0x0a, 0x06, 0x6f, +0x0c, 0x02, 0xd2, 0x0a, 0x07, 0x74, 0x74, 0x04, 0x02, 0xc1, 0x12, 0x07, 0x6d, 0xa6, 0x01, 0x6d, 0x23, 0x55, 0x38, 0x7e, +0x69, 0x30, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x2f, 0x2f, 0x0a, 0xd2, 0x0a, 0x07, 0x68, 0x96, 0x03, 0x68, 0x02, +0x13, 0x55, 0x31, 0x7e, 0x6f, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x2f, 0x2f, 0x5f, 0xb0, 0x0a, 0x1f, 0x50, 0x50, +0xc1, 0x0a, 0x07, 0x0d, 0x0d, 0x00, 0x3d, 0x09, 0xc5, 0x02, 0xc5, 0x02, 0xc5, 0x02, 0x18, 0x13, 0xe9, 0x01, 0x04, 0xe5, +0x01, 0x2d, 0xc1, 0x0a, 0x06, 0x02, 0x06, 0x00, 0x22, 0x02, 0x00, 0x13, 0xe9, 0x01, 0x02, 0xe5, 0x01, 0x33, 0xc1, 0x0a, +0x06, 0x02, 0x0a, 0x01, 0x22, 0x02, 0x00, 0x13, 0xe9, 0x01, 0x02, 0xe5, 0x01, 0x38, 0xc1, 0x0a, 0x06, 0x02, 0x0e, 0x02, +0x22, 0x02, 0x00, 0xc1, 0x12, 0x07, 0x0a, 0x93, 0x02, 0xad, 0x02, 0x22, 0x01, 0x00, 0xc1, 0x0a, 0x06, 0x08, 0x08, 0x01, +0x3f, 0x06, 0x02, 0x02, 0xd2, 0x0a, 0x07, 0xc8, 0x02, 0xc8, 0x02, 0xd2, 0x02, 0x01, 0x13, 0xe4, 0x01, 0xbb, 0x02, 0xfd, +0x01, 0x30, 0x22, 0x00, 0xbb, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x03, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, +0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xdf, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, +0xd3, 0x01, 0xa0, 0x02, 0x04, 0x07, 0x37, 0x1e, 0x06, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, +0x00, 0x37, 0xb0, 0x02, 0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, +0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x00, 0x54, 0x00, 0x10, 0x00, +0x1e, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x12, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x12, 0x20, +0xb7, 0x02, 0x02, 0x0c, 0x04, 0xb7, 0x02, 0x02, 0x0c, 0x03, 0xfe, 0x02, 0x02, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0e, 0xb5, +0x02, 0x42, 0x20, 0x01, 0xb8, 0x02, 0x0c, 0x0d, 0x04, 0xbb, 0x04, 0x30, 0x2a, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x7e, 0x02, +0x0d, 0xce, 0x02, 0x3a, 0x36, 0x0d, 0x0c, 0x3e, 0x02, 0x02, 0xa7, 0x01, 0x39, 0xa8, 0x01, 0x02, 0x02, 0x3e, 0x52, 0x03, +0x0d, 0x39, 0xd2, 0x01, 0x02, 0x03, 0xad, 0x06, 0x0d, 0xea, 0x01, 0xad, 0x06, 0x0c, 0x02, 0xad, 0x06, 0x0e, 0x02, 0xc6, +0x06, 0x02, 0x8b, 0x05, 0x00, 0x03, 0x18, 0x02, 0x13, 0x8a, 0x01, 0xdc, 0x04, 0xa9, 0x01, 0x4b, 0x01, 0x0d, 0x02, 0x02, +0x80, 0x0b, 0x0f, 0x58, 0x58, 0x30, 0x2e, 0x2e, 0x2e, 0x2c, 0xc1, 0x0a, 0x0d, 0x29, 0x29, 0x00, 0x80, 0x0b, 0x0f, 0x04, +0x04, 0x0a, 0x08, 0x08, 0x08, 0x06, 0xc1, 0x0a, 0x0d, 0x1f, 0x1f, 0x00, 0x22, 0xd4, 0x01, 0x00, 0x8d, 0x1e, 0x88, 0x06, +0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, +0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, +0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xcf, 0x0e, +0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0xa0, 0x02, 0x04, 0x07, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xc6, +0x06, 0x02, 0x02, 0x00, 0x03, 0x18, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x5e, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x18, 0x20, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, +0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, +0xa5, 0xf3, 0x06, 0x00, 0x95, 0x01, 0xb5, 0x03, 0xa0, 0x02, 0x04, 0x07, 0x37, 0x28, 0x06, 0x00, 0x00, 0x01, 0x00, 0x01, +0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x22, 0x00, 0x00, 0x03, 0x00, 0x10, 0x9e, 0x01, 0x06, 0x40, 0x10, 0x08, +0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x83, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, +0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, +0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, +0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, +0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, +0x08, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, +0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x0c, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, +0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, +0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, +0x00, 0x10, 0x32, 0x1e, 0x04, 0x00, 0x5a, 0x00, 0x00, 0x70, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, +0x00, 0x06, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x22, 0x00, 0x10, 0x00, +0x22, 0x01, 0x10, 0x00, 0x21, 0x06, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, +0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x28, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, +0x02, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, +0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, +0x00, 0x37, 0x0a, 0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, +0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x00, 0x54, 0x00, 0x10, 0x00, 0x1e, +0x00, 0x00, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0xb6, 0x01, 0x00, 0x00, 0x12, 0x00, 0x00, 0x64, 0x00, +0x00, 0x04, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, 0x20, 0xb7, 0x02, 0x02, 0x08, 0x03, 0x94, 0x02, 0x0c, 0xb7, 0x02, 0x08, 0x08, 0x04, 0xfe, 0x02, 0x02, 0x13, 0x13, 0x08, 0x08, 0x08, 0x09, 0x3e, 0x18, 0x07, 0x13, 0x3e, 0x02, 0x07, 0x09, 0xc1, 0x04, 0x02, 0x13, 0x20, 0x21, 0xb5, 0x02, 0x32, 0x20, 0x01, 0xb8, 0x02, 0x0c, 0x13, 0x04, 0xb8, 0x02, 0x06, 0x09, 0x03, 0xb5, 0x02, 0x02, 0x20, 0x00, 0x3e, 0x16, 0x02, 0x41, 0xbb, 0x04, 0x3b, 0x0c, 0x01, 0x00, @@ -1771,237 +1538,529 @@ const uint8_t UNLIT_FIXED_SIZE_PACKAGE[] = { 0x01, 0xce, 0x10, 0x09, 0x02, 0x06, 0x02, 0x4b, 0x09, 0x04, 0x04, 0x0e, 0x13, 0xb7, 0x01, 0x02, 0x23, 0xdf, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x04, 0x00, 0x22, 0x02, 0x00, 0x13, 0xb7, 0x01, 0x02, 0x23, 0xd3, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x08, 0x01, 0x22, 0x02, 0x00, 0x13, 0xb7, 0x01, 0x02, 0x23, 0xce, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x0c, 0x02, 0x22, 0x02, 0x00, -0x01, 0x13, 0x02, 0xc2, 0x05, 0x9e, 0x1e, 0x84, 0x01, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xa7, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, -0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, -0xa5, 0xf3, 0x06, 0x00, 0x53, 0x5a, 0xa0, 0x02, 0x04, 0x07, 0x10, 0x2e, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, -0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, -0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, -0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, 0x6c, 0x1e, 0x00, 0x10, 0x0e, 0x1e, 0x07, -0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xb5, 0x02, 0x0a, 0x20, 0x01, 0xa6, 0x02, 0x0c, 0x20, 0xb7, 0x02, 0x02, 0x0e, -0x04, 0xb8, 0x02, 0x02, 0x0f, 0x04, 0xb7, 0x02, 0x06, 0x0e, 0x03, 0xb8, 0x02, 0x02, 0x13, 0x03, 0xb5, 0x02, 0x02, 0x20, -0x00, 0xbb, 0x04, 0x15, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x0f, 0x16, 0x8e, 0x03, 0x02, 0x10, 0x14, 0x08, -0x08, 0x08, 0x0e, 0x17, 0xbb, 0x04, 0x15, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x18, 0x19, 0xae, 0x02, 0x02, -0x1a, 0x3e, 0x02, 0x02, 0x1b, 0x39, 0x1c, 0x02, 0x02, 0xbb, 0x04, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x1e, 0x02, -0x08, 0xbb, 0x04, 0x08, 0x14, 0x04, 0x00, 0x00, 0x00, 0xb7, 0x02, 0x1a, 0x0e, 0x02, 0x3e, 0x1c, 0x03, 0x44, 0x39, 0x52, -0x02, 0x03, 0xbb, 0x04, 0x15, 0x06, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x03, 0x0e, 0x3e, 0x04, 0x01, 0x0f, 0x39, 0x59, -0x02, 0x01, 0xbb, 0x04, 0x15, 0x02, 0x02, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x01, 0x0e, 0xbb, 0x04, 0x15, 0x06, 0x03, 0x00, -0x00, 0x00, 0xbb, 0x04, 0x15, 0x08, 0x01, 0x00, 0x00, 0x00, 0xad, 0x06, 0x08, 0x86, 0x01, 0xc6, 0x06, 0x02, 0xc3, 0x02, -0x00, 0x03, 0x18, 0x02, 0x33, 0x2d, 0xb8, 0x02, 0x1d, 0x1e, 0xa6, 0x01, 0x37, 0x01, 0x08, 0x02, 0x02, 0xbc, 0x0e, 0x0e, -0x99, 0x01, 0x99, 0x01, 0x13, 0x57, 0x06, 0x53, 0x56, 0x22, 0x00, 0x06, 0x13, 0x5c, 0x0a, 0x5a, 0x5b, 0x01, 0x0e, 0x02, -0x02, 0x13, 0x5c, 0x04, 0x5a, 0x5f, 0x01, 0x0e, 0x02, 0x02, 0xc8, 0x10, 0x0e, 0x02, 0x08, 0x02, 0x13, 0x57, 0x04, 0x53, -0x63, 0x22, 0x00, 0x04, 0x8d, 0x1e, 0x88, 0x06, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, -0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, +0x01, 0x13, 0x02, 0xc2, 0x05, 0x9e, 0x1e, 0x84, 0x01, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, +0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, +0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, +0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x53, 0x5a, 0xa0, 0x02, 0x04, 0x07, 0x10, 0x2e, 0x06, 0x10, 0x37, 0x02, +0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, +0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, +0x02, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, 0x6c, 0x1e, 0x00, +0x10, 0x0e, 0x1e, 0x07, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xb5, 0x02, 0x0a, 0x20, 0x01, 0xa6, 0x02, 0x0c, 0x20, +0xb7, 0x02, 0x02, 0x0e, 0x04, 0xb8, 0x02, 0x02, 0x0f, 0x04, 0xb7, 0x02, 0x06, 0x0e, 0x03, 0xb8, 0x02, 0x02, 0x13, 0x03, +0xb5, 0x02, 0x02, 0x20, 0x00, 0xbb, 0x04, 0x15, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x0f, 0x16, 0x8e, 0x03, +0x02, 0x10, 0x14, 0x08, 0x08, 0x08, 0x0e, 0x17, 0xbb, 0x04, 0x15, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x18, +0x19, 0xae, 0x02, 0x02, 0x1a, 0x3e, 0x02, 0x02, 0x1b, 0x39, 0x1c, 0x02, 0x02, 0xbb, 0x04, 0x08, 0x02, 0x00, 0x00, 0x00, +0x00, 0x3e, 0x1e, 0x02, 0x08, 0xbb, 0x04, 0x08, 0x14, 0x04, 0x00, 0x00, 0x00, 0xb7, 0x02, 0x1a, 0x0e, 0x02, 0x3e, 0x1c, +0x03, 0x44, 0x39, 0x52, 0x02, 0x03, 0xbb, 0x04, 0x15, 0x06, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x03, 0x0e, 0x3e, 0x04, +0x01, 0x0f, 0x39, 0x59, 0x02, 0x01, 0xbb, 0x04, 0x15, 0x02, 0x02, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x01, 0x0e, 0xbb, 0x04, +0x15, 0x06, 0x03, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x15, 0x08, 0x01, 0x00, 0x00, 0x00, 0xad, 0x06, 0x08, 0x86, 0x01, 0xc6, +0x06, 0x02, 0xc3, 0x02, 0x00, 0x03, 0x18, 0x02, 0x33, 0x2d, 0xb8, 0x02, 0x1d, 0x1e, 0xa6, 0x01, 0x37, 0x01, 0x08, 0x02, +0x02, 0xbc, 0x0e, 0x0e, 0x99, 0x01, 0x99, 0x01, 0x13, 0x57, 0x06, 0x53, 0x56, 0x22, 0x00, 0x06, 0x13, 0x5c, 0x0a, 0x5a, +0x5b, 0x01, 0x0e, 0x02, 0x02, 0x13, 0x5c, 0x04, 0x5a, 0x5f, 0x01, 0x0e, 0x02, 0x02, 0xc8, 0x10, 0x0e, 0x02, 0x08, 0x02, +0x13, 0x57, 0x04, 0x53, 0x63, 0x22, 0x00, 0x04, 0x8d, 0x1e, 0x88, 0x06, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x2c, 0x01, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, +0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xdf, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, +0xbf, 0x01, 0xa0, 0x02, 0x04, 0x07, 0x00, 0xfe, 0x02, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, +0x02, 0xa6, 0x02, 0x12, 0x20, 0xb7, 0x02, 0x02, 0x0c, 0x04, 0xbb, 0x04, 0x0c, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0xec, +0x04, 0x0d, 0x70, 0x70, 0x70, 0x70, 0x70, 0x3e, 0x34, 0x03, 0x0d, 0x39, 0xbe, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xf5, +0x02, 0x00, 0x03, 0x18, 0x02, 0x22, 0xf3, 0x02, 0xbd, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0xfd, 0x05, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x97, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x28, 0x19, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, +0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xbf, 0x0f, 0x00, 0x02, 0xed, 0xc2, +0xa5, 0xf3, 0x06, 0x00, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x28, 0x06, 0x10, 0x37, 0x11, 0x0b, 0x00, 0x05, +0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x14, 0x06, 0x80, 0x02, 0x47, 0x11, 0x01, 0x00, +0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x02, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, 0x12, 0x06, 0x40, 0x10, 0x02, 0x06, +0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x37, 0x15, 0x83, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, +0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, +0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, +0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, +0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, +0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, +0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x0c, +0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, +0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, +0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x02, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, +0x00, 0x17, 0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x1a, 0x01, 0x08, 0x10, 0x17, 0x1e, 0x00, 0x37, 0x1a, 0x07, 0x00, 0x05, +0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, +0x10, 0x02, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x10, 0x19, 0x0b, 0x2b, 0x10, 0x02, 0x1e, 0x04, 0x10, 0x02, 0x1e, 0x07, +0x10, 0x02, 0x0b, 0x03, 0x47, 0x16, 0x02, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0e, +0x00, 0x93, 0x02, 0x34, 0xa1, 0x04, 0x02, 0x1b, 0xa6, 0x02, 0x02, 0x20, 0xb7, 0x02, 0x02, 0x1d, 0x04, 0xb8, 0x02, 0x02, +0x1e, 0x04, 0xb7, 0x02, 0x02, 0x1d, 0x03, 0xae, 0x02, 0x2b, 0x1e, 0xb5, 0x02, 0x2e, 0x20, 0x00, 0xbb, 0x04, 0x21, 0x02, +0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x02, 0x20, 0x01, 0xbb, 0x04, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x21, +0x02, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x23, 0x02, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x21, 0x02, 0x02, 0x00, 0x00, +0x00, 0xbb, 0x04, 0x23, 0x02, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x02, 0x20, 0x03, 0xbb, 0x04, 0x21, 0x02, 0x08, 0x00, +0x00, 0x00, 0xbc, 0x02, 0x2b, 0x1e, 0x2a, 0x8e, 0x03, 0x11, 0x1f, 0x29, 0x23, 0x23, 0x23, 0x1d, 0x14, 0xbb, 0x04, 0x21, +0x40, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x2b, 0x0b, 0x2b, 0xae, 0x02, 0x11, 0x15, 0x3e, 0x40, 0x02, 0x0c, 0x39, 0x2c, +0x3d, 0x02, 0x3e, 0x40, 0x02, 0x1f, 0xbb, 0x04, 0x23, 0x02, 0x04, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x23, 0x02, 0x05, 0x00, +0x00, 0x00, 0x3e, 0x02, 0x02, 0x1d, 0xbb, 0x04, 0x21, 0x02, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x35, 0x1f, 0x31, 0xb7, +0x02, 0x38, 0x1d, 0x02, 0xb7, 0x02, 0x02, 0x21, 0x03, 0xbb, 0x04, 0x21, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x39, +0x20, 0x34, 0xbc, 0x02, 0x02, 0x1e, 0x31, 0xbb, 0x04, 0x21, 0x3a, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x37, 0x1e, 0x35, +0xae, 0x83, 0x80, 0x02, 0x15, 0x1f, 0x1f, 0x1f, 0x1f, 0x16, 0x1f, 0x1f, 0x1e, 0x32, 0x1d, 0x1d, 0x1e, 0x1e, 0x32, 0x32, +0x1d, 0x1d, 0x32, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x33, 0x23, 0x32, 0x1d, 0x1d, 0x17, 0x20, 0x1d, +0x1e, 0x1e, 0x32, 0x23, 0x1d, 0x1e, 0x23, 0x1d, 0x32, 0x1d, 0x1d, 0x1d, 0x21, 0x20, 0x1d, 0x1d, 0x21, 0x1d, 0x1d, 0x20, +0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x29, 0x1f, 0x1f, 0x1d, 0x1d, 0x1d, 0x1d, 0x18, 0x23, 0x1d, 0x1d, 0x1d, 0x19, 0x3e, 0x50, +0x02, 0x0e, 0x39, 0x36, 0x4d, 0x02, 0x3e, 0x50, 0x03, 0x23, 0x39, 0x37, 0x67, 0x03, 0xb2, 0x06, 0x23, 0x1a, 0x02, 0x00, +0x00, 0x00, 0x3e, 0x50, 0x01, 0x1e, 0x39, 0x38, 0x67, 0x01, 0xce, 0x02, 0x1a, 0x1f, 0x1e, 0x1d, 0x3e, 0x50, 0x02, 0x11, +0x39, 0x39, 0x4d, 0x02, 0xbb, 0x04, 0x1d, 0x50, 0xa4, 0x70, 0x7d, 0x3f, 0x3e, 0x02, 0x01, 0x23, 0x39, 0x3b, 0x6b, 0x01, +0x3e, 0x6e, 0x03, 0x1e, 0x39, 0x3c, 0x6b, 0x03, 0x3e, 0x6e, 0x03, 0x1d, 0x39, 0x3c, 0x6b, 0x03, 0xbb, 0x04, 0x1d, 0x6e, +0x00, 0x00, 0x00, 0x40, 0xbb, 0x04, 0x1d, 0x02, 0x00, 0x00, 0x80, 0xbf, 0xbb, 0x04, 0x1d, 0x02, 0x00, 0x00, 0x80, 0x3f, +0xbc, 0x02, 0x02, 0x1d, 0x27, 0x3e, 0x02, 0x03, 0x41, 0x39, 0x42, 0x73, 0x03, 0xbe, 0x02, 0x16, 0x1e, 0x1d, 0x3e, 0x60, +0x03, 0x13, 0x39, 0x43, 0x73, 0x03, 0xc6, 0x06, 0x1b, 0x0d, 0x00, 0x1c, 0x18, 0x84, 0x01, 0x01, 0x23, 0x02, 0x80, 0x01, +0x22, 0x84, 0x01, 0x00, 0x01, 0x23, 0x02, 0x86, 0x01, 0xc7, 0x10, 0x23, 0x02, 0x02, 0x6e, 0x33, 0x2d, 0x02, 0x0d, 0x24, +0x47, 0x24, 0x01, 0x1f, 0x02, 0x02, 0x01, 0x1e, 0x02, 0x8c, 0x01, 0xc1, 0x12, 0x1e, 0x02, 0x04, 0x02, 0x13, 0x2d, 0x02, +0x0f, 0x24, 0x01, 0x1f, 0x02, 0x02, 0xc1, 0x12, 0x1e, 0x02, 0x02, 0x06, 0x3d, 0x20, 0x02, 0x02, 0x02, 0x18, 0x5c, 0x1d, +0x02, 0x01, 0x42, 0x4f, 0x13, 0x30, 0x02, 0x12, 0x28, 0x01, 0x1d, 0x6d, 0x6d, 0xc8, 0x10, 0x1d, 0x70, 0x04, 0x70, 0x3d, +0x20, 0x02, 0x12, 0x12, 0x18, 0xce, 0x10, 0x20, 0x02, 0x02, 0x04, 0xc1, 0x0a, 0x1d, 0x02, 0x02, 0x00, 0xd2, 0x0a, 0x1e, +0x02, 0x02, 0x18, 0x00, 0xc1, 0x0a, 0x1d, 0x02, 0x06, 0x01, 0xd2, 0x0a, 0x1e, 0x02, 0x02, 0x04, 0x01, 0xc1, 0x0a, 0x1d, +0x02, 0x0a, 0x02, 0xd2, 0x0a, 0x1e, 0x02, 0x02, 0x04, 0x02, 0xc1, 0x12, 0x1e, 0x02, 0x24, 0x02, 0x01, 0x23, 0x02, 0xb2, +0x01, 0xcb, 0x10, 0x23, 0x02, 0x02, 0x9a, 0x01, 0x23, 0x2d, 0x02, 0x0f, 0x2e, 0x5d, 0x01, 0x1f, 0x02, 0x02, 0xc1, 0x12, +0x1e, 0x02, 0x02, 0x0a, 0xd2, 0x0a, 0x1e, 0x02, 0x4e, 0x02, 0x02, 0x13, 0x2d, 0x02, 0x0f, 0x2f, 0x01, 0x1f, 0x02, 0x02, +0xc1, 0x12, 0x1e, 0x02, 0x02, 0x06, 0xb0, 0x0a, 0x0a, 0x02, 0x02, 0xc1, 0x0a, 0x1e, 0x02, 0x02, 0x00, 0x3d, 0x20, 0x02, +0x02, 0x02, 0x18, 0x13, 0x3d, 0x02, 0x06, 0x22, 0xc1, 0x0a, 0x1d, 0x02, 0x04, 0x00, 0x22, 0x02, 0x00, 0x13, 0x3d, 0x02, +0x06, 0x25, 0xc1, 0x0a, 0x1d, 0x02, 0x08, 0x01, 0x22, 0x02, 0x00, 0x13, 0x3d, 0x02, 0x06, 0x27, 0xc1, 0x0a, 0x1d, 0x02, +0x0c, 0x02, 0x22, 0x02, 0x00, 0x01, 0x23, 0x02, 0xd6, 0x01, 0xcb, 0x10, 0x23, 0x02, 0x02, 0xbe, 0x01, 0x23, 0x2d, 0x02, +0x0f, 0x2e, 0x6f, 0x01, 0x1f, 0x02, 0x02, 0xc1, 0x12, 0x1e, 0x02, 0x02, 0x18, 0x22, 0xd6, 0x01, 0x00, 0x01, 0x23, 0x02, +0xe0, 0x01, 0xcb, 0x10, 0x23, 0x02, 0x02, 0xc8, 0x01, 0xbf, 0x0c, 0x1d, 0x02, 0xca, 0x01, 0xc8, 0x10, 0x1d, 0x02, 0x70, +0x02, 0xc8, 0x10, 0x1d, 0x02, 0x02, 0x72, 0x4b, 0x1d, 0x02, 0x72, 0x02, 0xbf, 0x0c, 0x1d, 0x02, 0x0a, 0x4a, 0x1d, 0x02, +0x08, 0x02, 0x4b, 0x1d, 0x02, 0x06, 0x02, 0xc8, 0x10, 0x1d, 0x02, 0x78, 0x0e, 0xc1, 0x0a, 0x1d, 0x02, 0x16, 0x00, 0x4a, +0x1d, 0x02, 0x02, 0x04, 0xd2, 0x0a, 0x1e, 0x02, 0x02, 0x1a, 0x00, 0xc1, 0x0a, 0x1d, 0x02, 0x02, 0x03, 0x4a, 0x1d, 0x02, +0x0c, 0x02, 0xc1, 0x0a, 0x1d, 0x02, 0x06, 0x00, 0x4b, 0x1d, 0x02, 0x02, 0x04, 0xd2, 0x0a, 0x1e, 0x02, 0x02, 0x0a, 0x00, +0xc1, 0x0a, 0x1d, 0x02, 0x02, 0x00, 0xc3, 0x10, 0x1d, 0x02, 0x8c, 0x01, 0x18, 0xc1, 0x0a, 0x1d, 0x02, 0x06, 0x03, 0x4a, +0x1d, 0x02, 0x04, 0x02, 0x4b, 0x1d, 0x02, 0x08, 0x02, 0xc0, 0x10, 0x23, 0x02, 0x2c, 0xc8, 0x01, 0xbf, 0x0c, 0x1d, 0x02, +0x02, 0x4a, 0x1d, 0x02, 0x2c, 0x02, 0xc3, 0x10, 0x1d, 0x02, 0x9a, 0x01, 0x02, 0x4a, 0x1d, 0x02, 0x02, 0x0e, 0x4b, 0x1d, +0x02, 0x14, 0x02, 0x13, 0x3d, 0x02, 0x08, 0x24, 0x22, 0x00, 0x0e, 0x3f, 0x1d, 0x02, 0x04, 0x13, 0x3d, 0x02, 0x08, 0x26, +0x22, 0x00, 0x02, 0xc1, 0x0a, 0x1d, 0x02, 0x1e, 0x01, 0x3f, 0x1d, 0x02, 0x02, 0xd2, 0x0a, 0x1e, 0x02, 0x02, 0x22, 0x01, +0x13, 0x3c, 0x02, 0x09, 0x24, 0x22, 0x00, 0x02, 0x22, 0xa6, 0x02, 0x9e, 0x01, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, +0xf5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, +0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x14, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, +0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xaf, 0x0f, +0x00, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x91, 0x01, 0xd6, 0x01, 0xd8, 0x01, 0xe5, 0x01, 0xf5, 0x01, 0xfe, 0x01, +0x10, 0x9a, 0x01, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, +0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, +0x00, 0x21, 0x01, 0x10, 0x42, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, +0x02, 0x76, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, +0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, +0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, +0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, +0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, +0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, +0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, +0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, +0x10, 0x00, 0x21, 0x00, 0x10, 0x26, 0x1e, 0x00, 0x37, 0x4c, 0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, +0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, +0x08, 0x00, 0x3a, 0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x04, 0x0b, 0x2b, 0x10, 0x1a, 0x1e, 0x04, 0x10, 0x20, 0x1e, 0x07, +0x47, 0x0e, 0x04, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x01, 0x0b, 0x01, 0x03, 0x01, 0x0b, 0x01, 0x04, 0x00, +0x00, 0x02, 0x00, 0xb2, 0x01, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x06, 0x20, 0xb7, 0x02, 0x02, +0x06, 0x04, 0xb8, 0x02, 0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, 0x06, 0x03, 0xae, 0x02, 0x2c, 0x07, 0xb5, 0x02, 0x1a, 0x20, +0x00, 0xbb, 0x04, 0x2c, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x04, 0x20, 0x01, 0xbb, 0x04, 0x2f, 0x02, 0x00, 0x00, +0x00, 0x00, 0xbb, 0x04, 0x2c, 0x06, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2c, 0x0a, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, +0x2f, 0x04, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x22, 0x09, 0x03, 0xbb, 0x04, 0x2c, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, +0x02, 0x02, 0x07, 0x4c, 0x8e, 0x03, 0x02, 0x08, 0x4b, 0x2f, 0x2f, 0x2f, 0x06, 0x4d, 0xbb, 0x04, 0x2c, 0x02, 0x40, 0x00, +0x00, 0x00, 0xbc, 0x02, 0x02, 0x4e, 0x4f, 0xae, 0x02, 0x02, 0x50, 0x3e, 0x02, 0x02, 0x51, 0x39, 0x52, 0x02, 0x02, 0x3e, +0x04, 0x02, 0x08, 0xbb, 0x04, 0x2f, 0x28, 0x04, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2f, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x3e, +0x02, 0x02, 0x06, 0xbb, 0x04, 0x2c, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x08, 0x73, 0xb7, 0x02, 0x02, 0x06, +0x02, 0xb7, 0x02, 0x02, 0x2c, 0x03, 0xbb, 0x04, 0x2c, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, 0x77, 0xbc, +0x02, 0x02, 0x07, 0x73, 0xbb, 0x04, 0x2c, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x7a, 0xae, 0x83, 0x80, +0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x74, 0x08, 0x08, 0x07, 0x75, 0x06, 0x06, 0x07, 0x07, 0x75, 0x75, 0x06, 0x06, 0x75, +0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x76, 0x2f, 0x75, 0x06, 0x06, 0x78, 0x09, 0x06, 0x07, 0x07, 0x75, +0x2f, 0x06, 0x07, 0x2f, 0x06, 0x75, 0x06, 0x06, 0x06, 0x2c, 0x09, 0x06, 0x06, 0x2c, 0x06, 0x06, 0x09, 0x06, 0x06, 0x06, +0x06, 0x06, 0x4b, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x79, 0x2f, 0x06, 0x06, 0x06, 0x7b, 0x3e, 0x02, 0x02, 0x7c, 0x39, +0x7d, 0x02, 0x02, 0x3e, 0x24, 0x01, 0x07, 0x39, 0x90, 0x01, 0x02, 0x01, 0xce, 0x02, 0x4c, 0x08, 0x07, 0x06, 0x3e, 0x02, +0x02, 0xb7, 0x01, 0x39, 0xb8, 0x01, 0x02, 0x02, 0xbb, 0x04, 0x06, 0x2c, 0xa4, 0x70, 0x7d, 0x3f, 0x3e, 0x0c, 0x03, 0x2f, +0x39, 0xd5, 0x01, 0x02, 0x03, 0x3e, 0x02, 0x01, 0x2f, 0x39, 0xd7, 0x01, 0x02, 0x01, 0x3e, 0x18, 0x03, 0x07, 0x39, 0xe4, +0x01, 0x02, 0x03, 0x3e, 0x08, 0x03, 0x06, 0x39, 0xe4, 0x01, 0x18, 0x03, 0xbc, 0x02, 0x0c, 0x06, 0x33, 0xde, 0x02, 0x02, +0x07, 0x06, 0xfb, 0x01, 0xfb, 0x01, 0x3e, 0x02, 0x03, 0xfc, 0x01, 0x39, 0xfd, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xf3, +0x03, 0x00, 0x03, 0x18, 0x02, 0x01, 0x2f, 0xa8, 0x03, 0x02, 0x22, 0x06, 0x00, 0x01, 0x2f, 0x02, 0x08, 0x33, 0x55, 0x68, +0x53, 0x30, 0xda, 0x01, 0x30, 0x01, 0x08, 0x02, 0x02, 0x01, 0x07, 0xc2, 0x01, 0xbe, 0x03, 0xc1, 0x12, 0x07, 0x47, 0x7a, +0x47, 0x13, 0x55, 0x56, 0x7e, 0x30, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x51, 0x51, 0x06, 0x3d, 0x09, 0x04, 0x04, +0x04, 0x18, 0x5c, 0x06, 0x02, 0x01, 0x42, 0xd1, 0x02, 0x13, 0x70, 0x04, 0xb9, 0x01, 0x3a, 0x01, 0x06, 0x02, 0x02, 0xc8, +0x10, 0x06, 0x02, 0x08, 0x02, 0x3d, 0x09, 0x04, 0x2f, 0x2f, 0x18, 0xce, 0x10, 0x09, 0x02, 0x02, 0x06, 0xc1, 0x0a, 0x06, +0x04, 0x04, 0x00, 0xd2, 0x0a, 0x07, 0x74, 0x74, 0x4a, 0x00, 0xc1, 0x0a, 0x06, 0x6f, 0x08, 0x01, 0xd2, 0x0a, 0x07, 0x74, +0x74, 0x04, 0x01, 0xc1, 0x0a, 0x06, 0x6f, 0x0c, 0x02, 0xd2, 0x0a, 0x07, 0x74, 0x74, 0x04, 0x02, 0xc1, 0x12, 0x07, 0x6d, +0xa6, 0x01, 0x6d, 0x23, 0x55, 0x38, 0x7e, 0x69, 0x30, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x2f, 0x2f, 0x0a, 0xd2, +0x0a, 0x07, 0x68, 0x98, 0x03, 0x68, 0x02, 0x13, 0x55, 0x31, 0x7e, 0x6f, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x2f, +0x2f, 0x5f, 0xb0, 0x0a, 0x1f, 0x50, 0x50, 0xc1, 0x0a, 0x07, 0x0d, 0x0d, 0x00, 0x3d, 0x09, 0xc7, 0x02, 0xc7, 0x02, 0xc7, +0x02, 0x18, 0x13, 0xe9, 0x01, 0x04, 0xe5, 0x01, 0x2d, 0xc1, 0x0a, 0x06, 0x02, 0x06, 0x00, 0x22, 0x02, 0x00, 0x13, 0xe9, +0x01, 0x02, 0xe5, 0x01, 0x33, 0xc1, 0x0a, 0x06, 0x02, 0x0a, 0x01, 0x22, 0x02, 0x00, 0x13, 0xe9, 0x01, 0x02, 0xe5, 0x01, +0x38, 0xc1, 0x0a, 0x06, 0x02, 0x0e, 0x02, 0x22, 0x02, 0x00, 0xc1, 0x12, 0x07, 0x0a, 0x95, 0x02, 0xaf, 0x02, 0x22, 0x01, +0x00, 0xc1, 0x0a, 0x06, 0x08, 0x08, 0x01, 0x3f, 0x06, 0x02, 0x02, 0xd2, 0x0a, 0x07, 0xca, 0x02, 0xca, 0x02, 0xd4, 0x02, +0x01, 0x13, 0xe4, 0x01, 0xbb, 0x02, 0xfe, 0x01, 0x30, 0x22, 0x00, 0xbb, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, +0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, +0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, +0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xdf, 0x0e, +0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0xd3, 0x01, 0xa0, 0x02, 0x04, 0x07, 0x37, 0xce, 0x02, 0x07, 0x00, 0x05, +0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, +0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x10, 0x54, 0x1e, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x93, 0x02, 0x02, 0xa1, +0x04, 0x02, 0x02, 0xa6, 0x02, 0x12, 0x20, 0xb7, 0x02, 0x02, 0x0c, 0x04, 0xb7, 0x02, 0x02, 0x0c, 0x03, 0xfe, 0x02, 0x02, +0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0e, 0xb5, 0x02, 0x42, 0x20, 0x01, 0xb8, 0x02, 0x0c, 0x0d, 0x04, 0xbb, 0x04, 0x30, 0x2a, +0x01, 0x00, 0x00, 0x00, 0x3e, 0x7e, 0x02, 0x0d, 0xce, 0x02, 0x3a, 0x36, 0x0d, 0x0c, 0x3e, 0x02, 0x02, 0xa7, 0x01, 0x39, +0xa8, 0x01, 0x02, 0x02, 0x3e, 0x52, 0x03, 0x0d, 0x39, 0xd2, 0x01, 0x02, 0x03, 0xad, 0x06, 0x0d, 0xea, 0x01, 0xad, 0x06, +0x0c, 0x02, 0xad, 0x06, 0x0e, 0x02, 0xc6, 0x06, 0x02, 0x8b, 0x05, 0x00, 0x03, 0x18, 0x02, 0x13, 0x8a, 0x01, 0xdc, 0x04, +0xa9, 0x01, 0x4b, 0x01, 0x0d, 0x02, 0x02, 0x80, 0x0b, 0x0f, 0x58, 0x58, 0x30, 0x2e, 0x2e, 0x2e, 0x2c, 0xc1, 0x0a, 0x0d, +0x29, 0x29, 0x00, 0x80, 0x0b, 0x0f, 0x04, 0x04, 0x0a, 0x08, 0x08, 0x08, 0x06, 0xc1, 0x0a, 0x0d, 0x1f, 0x1f, 0x00, 0x22, +0xd4, 0x01, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x98, 0x00, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, +0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xcf, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, +0xa0, 0x02, 0x04, 0x07, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xc6, 0x06, 0x02, 0x02, 0x00, 0x03, 0x18, 0x02, 0x8d, +0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, +0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x1d, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, -0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xdf, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0xbf, 0x01, 0xa0, 0x02, -0x04, 0x07, 0x10, 0xfe, 0x02, 0x1e, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x12, 0x20, 0xb7, 0x02, -0x02, 0x0c, 0x04, 0xbb, 0x04, 0x0c, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0xec, 0x04, 0x0d, 0x70, 0x70, 0x70, 0x70, 0x70, -0x3e, 0x34, 0x03, 0x0d, 0x39, 0xbe, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xf5, 0x02, 0x00, 0x03, 0x18, 0x02, 0x22, 0xf3, -0x02, 0xbd, 0x02, 0x8d, 0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xa4, 0x17, 0x00, 0x00, 0x91, 0x02, 0x01, 0x91, 0x02, 0x20, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, -0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xaf, 0x0f, 0x00, 0x04, 0xed, 0xc2, 0xa5, -0xf3, 0x06, 0x00, 0x83, 0x01, 0x92, 0x01, 0xcd, 0x01, 0xdc, 0x01, 0xec, 0x01, 0xae, 0x02, 0x10, 0x96, 0x01, 0x06, 0x10, -0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, -0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, 0x80, -0x02, 0x47, 0x02, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, 0x42, -0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x76, 0x00, 0x05, 0x00, -0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, -0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, -0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, -0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, -0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, -0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, -0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, -0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, -0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, -0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, -0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, -0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, -0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, -0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x00, -0x0e, 0x0e, 0x10, 0x00, 0x1e, 0x08, 0x10, 0x04, 0x01, 0x08, 0x10, 0x1a, 0x1e, 0x00, 0x37, 0x4c, 0x07, 0x00, 0x05, 0x00, -0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, -0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x10, 0x26, 0x0b, 0x2b, 0x10, 0x1e, 0x1e, 0x04, 0x10, 0x20, 0x1e, 0x07, 0x47, -0x80, 0x01, 0x04, 0x00, 0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x01, 0x0b, 0x01, 0x03, 0x01, 0x0b, 0x01, 0x04, 0x00, -0x00, 0x02, 0x00, 0xc2, 0x01, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x06, 0x20, 0xb7, 0x02, 0x02, -0x06, 0x04, 0xb8, 0x02, 0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, 0x06, 0x03, 0xae, 0x02, 0x28, 0x07, 0xb5, 0x02, 0x1a, 0x20, -0x00, 0xbb, 0x04, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x04, 0x20, 0x01, 0xbb, 0x04, 0x2d, 0x02, 0x00, 0x00, -0x00, 0x00, 0xbb, 0x04, 0x2a, 0x06, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2d, 0x04, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, -0x2a, 0x06, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2d, 0x04, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x22, 0x09, 0x03, 0xbb, -0x04, 0x2a, 0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x4a, 0x8e, 0x03, 0x02, 0x08, 0x49, 0x2d, 0x2d, 0x2d, -0x06, 0x4b, 0xbb, 0x04, 0x2a, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x4c, 0x4d, 0xae, 0x02, 0x02, 0x4e, 0x3e, -0x02, 0x02, 0x4f, 0x39, 0x50, 0x02, 0x02, 0x3e, 0x04, 0x02, 0x08, 0xbb, 0x04, 0x2d, 0x28, 0x04, 0x00, 0x00, 0x00, 0x3e, -0x0e, 0x02, 0x06, 0xbb, 0x04, 0x2a, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x08, 0x71, 0xb7, 0x02, 0x02, 0x06, -0x02, 0xb7, 0x02, 0x02, 0x2a, 0x03, 0xbb, 0x04, 0x2a, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, 0x75, 0xbc, -0x02, 0x02, 0x07, 0x71, 0xbb, 0x04, 0x2a, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x78, 0xae, 0x83, 0x80, -0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x72, 0x08, 0x08, 0x07, 0x73, 0x06, 0x06, 0x07, 0x07, 0x73, 0x73, 0x06, 0x06, 0x73, -0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x74, 0x2d, 0x73, 0x06, 0x06, 0x76, 0x09, 0x06, 0x07, 0x07, 0x73, -0x2d, 0x06, 0x07, 0x2d, 0x06, 0x73, 0x06, 0x06, 0x06, 0x2a, 0x09, 0x06, 0x06, 0x2a, 0x06, 0x06, 0x09, 0x06, 0x06, 0x06, -0x06, 0x06, 0x49, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x77, 0x2d, 0x06, 0x06, 0x06, 0x79, 0x3e, 0x02, 0x02, 0x7a, 0x39, -0x7b, 0x02, 0x02, 0x3e, 0x0c, 0x03, 0x2d, 0x39, 0x82, 0x01, 0x02, 0x03, 0xb2, 0x06, 0x2d, 0x04, 0x02, 0x00, 0x00, 0x00, -0x3e, 0x18, 0x01, 0x07, 0x39, 0x91, 0x01, 0x02, 0x01, 0xce, 0x02, 0x4c, 0x08, 0x07, 0x06, 0x3e, 0x02, 0x02, 0xb8, 0x01, -0x39, 0xb9, 0x01, 0x02, 0x02, 0x3e, 0x24, 0x01, 0x2d, 0x39, 0xcc, 0x01, 0x02, 0x01, 0x3e, 0x1c, 0x03, 0x07, 0x39, 0xdb, -0x01, 0x02, 0x03, 0x3e, 0x08, 0x03, 0x06, 0x39, 0xdb, 0x01, 0x18, 0x03, 0xbb, 0x04, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x40, -0xbb, 0x04, 0x06, 0x08, 0x00, 0x00, 0x80, 0xbf, 0xbb, 0x04, 0x06, 0x16, 0x00, 0x00, 0x80, 0x3f, 0xbc, 0x02, 0x52, 0x06, -0x36, 0xbc, 0x02, 0x02, 0x06, 0x31, 0xde, 0x02, 0x02, 0x07, 0x06, 0xaa, 0x02, 0xab, 0x02, 0x3e, 0x02, 0x03, 0xac, 0x02, -0x39, 0xad, 0x02, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xd3, 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, 0x2d, 0x92, 0x03, 0x02, 0x22, -0x96, 0x01, 0x00, 0x01, 0x2d, 0x04, 0x9a, 0x01, 0xc7, 0x10, 0x2d, 0x02, 0x02, 0x98, 0x01, 0x33, 0x53, 0xec, 0x01, 0x51, -0x2e, 0xd1, 0x01, 0x2e, 0x01, 0x08, 0x02, 0x02, 0x01, 0x07, 0xb0, 0x01, 0x9c, 0x04, 0xc1, 0x12, 0x07, 0x37, 0x78, 0x37, -0x13, 0x53, 0x46, 0x7c, 0x2e, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x41, 0x41, 0x06, 0x3d, 0x09, 0x04, 0x04, 0x04, -0x18, 0x5c, 0x06, 0x02, 0x01, 0x42, 0x89, 0x03, 0x13, 0x6e, 0x04, 0xba, 0x01, 0x38, 0x01, 0x06, 0x02, 0x02, 0xc8, 0x10, -0x06, 0x02, 0x08, 0x02, 0x3d, 0x09, 0x04, 0x1f, 0x1f, 0x18, 0xce, 0x10, 0x09, 0x02, 0x02, 0x06, 0xc1, 0x0a, 0x06, 0x04, -0x04, 0x00, 0xd2, 0x0a, 0x07, 0x5c, 0x5c, 0x42, 0x00, 0xc1, 0x0a, 0x06, 0x57, 0x08, 0x01, 0xd2, 0x0a, 0x07, 0x5c, 0x5c, -0x04, 0x01, 0xc1, 0x0a, 0x06, 0x57, 0x0c, 0x02, 0xd2, 0x0a, 0x07, 0x5c, 0x5c, 0x04, 0x02, 0xc1, 0x12, 0x07, 0x55, 0xa4, -0x01, 0x55, 0xb0, 0x0a, 0x1d, 0x4a, 0x4a, 0xc1, 0x0a, 0x07, 0x0d, 0x0d, 0x00, 0x3d, 0x09, 0xb1, 0x03, 0xb1, 0x03, 0xb1, -0x03, 0x18, 0x13, 0xe0, 0x01, 0x04, 0xdc, 0x01, 0x2b, 0xc1, 0x0a, 0x06, 0x02, 0x06, 0x00, 0x22, 0x02, 0x00, 0x13, 0xe0, -0x01, 0x02, 0xdc, 0x01, 0x31, 0xc1, 0x0a, 0x06, 0x02, 0x0a, 0x01, 0x22, 0x02, 0x00, 0x13, 0xe0, 0x01, 0x02, 0xdc, 0x01, -0x36, 0xc1, 0x0a, 0x06, 0x02, 0x0e, 0x02, 0x22, 0x02, 0x00, 0x01, 0x2d, 0x92, 0x03, 0xd8, 0x04, 0xcb, 0x10, 0x2d, 0x02, -0x02, 0xd6, 0x04, 0x23, 0x53, 0x04, 0x7c, 0x67, 0xb0, 0x03, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x8f, 0x03, 0x8f, -0x03, 0x99, 0x03, 0x22, 0x01, 0x00, 0x01, 0x2d, 0x08, 0xd8, 0x01, 0xcb, 0x10, 0x2d, 0x02, 0x02, 0xd6, 0x01, 0xbf, 0x0c, -0x06, 0x06, 0xdc, 0x01, 0xc8, 0x10, 0x06, 0x02, 0x04, 0x02, 0xc8, 0x10, 0x06, 0x08, 0x08, 0x0c, 0x4b, 0x06, 0x02, 0x06, -0x02, 0xbf, 0x0c, 0x06, 0x0a, 0x1c, 0x4a, 0x06, 0x02, 0x16, 0x02, 0x4b, 0x06, 0x02, 0x0e, 0x02, 0xc8, 0x10, 0x06, 0x06, -0x04, 0x20, 0xc1, 0x0a, 0x06, 0x04, 0x34, 0x00, 0x4a, 0x06, 0x02, 0x02, 0x06, 0xd2, 0x0a, 0x07, 0x84, 0x03, 0x84, 0x03, -0xba, 0x03, 0x00, 0xc1, 0x0a, 0x06, 0xf9, 0x02, 0xf9, 0x02, 0x03, 0x4a, 0x06, 0x02, 0x18, 0x02, 0xc1, 0x0a, 0x06, 0x04, -0xf3, 0x02, 0x00, 0x4b, 0x06, 0x02, 0x02, 0x06, 0xd2, 0x0a, 0x07, 0xfa, 0x02, 0xfa, 0x02, 0x08, 0x00, 0xc1, 0x0a, 0x06, -0xf1, 0x02, 0xf1, 0x02, 0x00, 0xc3, 0x10, 0x06, 0x0a, 0x2e, 0x32, 0xc1, 0x0a, 0x06, 0x04, 0xe3, 0x02, 0x03, 0x4a, 0x06, -0x02, 0x06, 0x02, 0x4b, 0x06, 0x02, 0x12, 0x02, 0xc0, 0x10, 0x2d, 0x0c, 0x64, 0xde, 0x03, 0xbf, 0x0c, 0x06, 0x02, 0x02, -0x4a, 0x06, 0x02, 0x60, 0x02, 0xc3, 0x10, 0x06, 0x02, 0x48, 0x02, 0x4a, 0x06, 0x06, 0x06, 0x1c, 0x4b, 0x06, 0x02, 0x2c, -0x02, 0x23, 0xe0, 0x01, 0x0e, 0xae, 0x02, 0x38, 0x2e, 0x22, 0x00, 0x28, 0x3f, 0x06, 0x04, 0x12, 0x23, 0xe0, 0x01, 0x02, -0xae, 0x02, 0x38, 0x33, 0x22, 0x00, 0x02, 0xc1, 0x0a, 0x06, 0x04, 0xad, 0x02, 0x01, 0x3f, 0x06, 0x02, 0x02, 0xd2, 0x0a, -0x07, 0xba, 0x02, 0xba, 0x02, 0x0e, 0x01, 0x13, 0xdb, 0x01, 0xb3, 0x02, 0xae, 0x02, 0x2e, 0x22, 0x00, 0xb3, 0x02, 0x22, -0xec, 0x02, 0xd0, 0x01, 0x8d, 0x1e, 0x88, 0x06, 0x52, 0x49, 0x50, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x86, 0x00, 0x00, 0x00, -0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, -0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x03, -0x00, 0x00, 0x00, 0x01, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, 0x01, 0x44, 0x01, 0x05, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, -0x06, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, -0x01, 0x08, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x10, 0x01, 0x09, 0x00, 0x00, 0x00, 0x02, -0x20, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x30, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x44, 0x01, 0x0c, 0x00, 0x00, 0x00, -0x02, 0x80, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x90, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x4c, 0x54, 0x45, 0x4d, 0x5f, 0x54, -0x41, 0x4d, 0x22, 0x09, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, -0x00, 0x01, 0x00, 0x01, 0xac, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xe4, 0x01, -0x00, 0x00, 0x01, 0x20, 0x01, 0xfe, 0x01, 0x00, 0x00, 0x01, 0x30, 0x01, 0x68, 0x03, 0x00, 0x00, 0x01, 0x44, 0x01, 0xcc, -0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0xf6, 0x03, 0x00, 0x00, 0x01, 0x90, 0x00, 0xf6, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, -0x46, 0x05, 0x00, 0x00, 0x02, 0x00, 0x01, 0xac, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x46, 0x05, 0x00, 0x00, 0x02, 0x10, -0x01, 0xe4, 0x01, 0x00, 0x00, 0x02, 0x20, 0x01, 0x6c, 0x06, 0x00, 0x00, 0x02, 0x30, 0x01, 0x68, 0x03, 0x00, 0x00, 0x02, -0x44, 0x01, 0xcc, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0xd2, 0x07, 0x00, 0x00, 0x02, 0x90, 0x00, 0xd2, 0x07, 0x00, 0x00, -0x29, 0x0f, 0x00, 0x00, 0x8f, 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, 0x04, 0x00, 0x64, 0x01, 0xbe, 0x01, 0x02, 0x00, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, -0x04, 0x00, 0x64, 0x01, 0xc3, 0x01, 0x02, 0x00, 0xc4, 0x01, 0x04, 0x00, 0x64, 0x01, 0xc5, 0x01, 0x02, 0x00, 0xc6, 0x01, -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, 0x6d, 0x00, 0x64, 0x01, 0x96, 0x01, 0x00, 0x00, 0x18, 0x00, -0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0xba, 0x01, 0x02, 0x00, 0xbb, 0x01, 0xbc, 0x01, -0xbd, 0x01, 0x04, 0x00, 0x64, 0x01, 0xbe, 0x01, 0x02, 0x00, 0xd6, 0x01, 0x04, 0x00, 0x64, 0x01, 0xd7, 0x01, 0x02, 0x00, -0xc6, 0x01, 0xd8, 0x01, 0xd5, 0x01, 0x6d, 0x00, 0x64, 0x01, 0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x62, 0x01, -0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0xd9, 0x01, 0x02, 0x00, 0x6d, 0x00, 0x64, 0x01, 0x82, 0x16, 0x00, 0x00, -0xb1, 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, +0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x95, 0x01, 0xb5, 0x03, +0xa0, 0x02, 0x04, 0x07, 0x10, 0xe4, 0x01, 0x06, 0x40, 0x10, 0x08, 0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, +0x10, 0x37, 0x02, 0x76, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, +0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, +0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, +0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, +0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, +0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, +0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, +0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, +0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, +0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, +0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, +0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x32, 0x1e, 0x04, 0x00, 0x8e, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x28, 0x00, +0x10, 0x00, 0x22, 0x01, 0x10, 0x00, 0x21, 0x06, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x02, 0x00, 0x37, 0xa0, 0x01, +0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x10, +0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x08, 0x10, 0x54, 0x1e, 0x00, 0x00, 0xd6, 0x01, 0x00, 0x93, +0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x0a, 0x20, 0xb7, 0x02, 0x02, 0x08, 0x03, 0x94, 0x02, 0x0c, 0xb7, 0x02, +0x08, 0x08, 0x04, 0xfe, 0x02, 0x02, 0x13, 0x13, 0x08, 0x08, 0x08, 0x09, 0x3e, 0x18, 0x07, 0x13, 0x3e, 0x02, 0x07, 0x09, +0xc1, 0x04, 0x02, 0x13, 0x20, 0x21, 0xb5, 0x02, 0x32, 0x20, 0x01, 0xb8, 0x02, 0x0c, 0x13, 0x04, 0xb8, 0x02, 0x06, 0x09, +0x03, 0xb5, 0x02, 0x02, 0x20, 0x00, 0x3e, 0x16, 0x02, 0x41, 0xbb, 0x04, 0x3b, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x02, +0x02, 0x44, 0xbb, 0x04, 0x3b, 0x16, 0x03, 0x00, 0x00, 0x00, 0x3e, 0x18, 0x02, 0x08, 0xbb, 0x04, 0x45, 0x06, 0x04, 0x00, +0x00, 0x00, 0xbc, 0x02, 0x02, 0x41, 0x71, 0xb7, 0x02, 0x02, 0x08, 0x02, 0xb7, 0x02, 0x02, 0x45, 0x03, 0xbb, 0x04, 0x45, +0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x09, 0x75, 0xbc, 0x02, 0x02, 0x13, 0x71, 0xbb, 0x04, 0x45, 0x02, 0x28, +0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x13, 0x78, 0xae, 0x83, 0x80, 0x02, 0x02, 0x41, 0x41, 0x41, 0x41, 0x72, 0x41, 0x41, +0x13, 0x73, 0x08, 0x08, 0x13, 0x13, 0x73, 0x73, 0x08, 0x08, 0x73, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x13, +0x74, 0x3b, 0x73, 0x08, 0x08, 0x76, 0x09, 0x08, 0x13, 0x13, 0x73, 0x3b, 0x08, 0x13, 0x3b, 0x08, 0x73, 0x08, 0x08, 0x08, +0x45, 0x09, 0x08, 0x08, 0x45, 0x08, 0x08, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x44, 0x41, 0x41, 0x08, 0x08, 0x08, 0x08, +0x77, 0x3b, 0x08, 0x08, 0x08, 0x79, 0x3e, 0x02, 0x02, 0x7a, 0x39, 0x7b, 0x02, 0x02, 0x3e, 0x02, 0x02, 0x13, 0xbb, 0x04, +0x45, 0x16, 0x03, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x08, 0x08, 0x00, 0x00, +0x80, 0x3f, 0x3e, 0x0a, 0x01, 0x13, 0x39, 0x94, 0x01, 0x02, 0x01, 0x3e, 0x44, 0x07, 0x08, 0xbb, 0x04, 0x3b, 0x0a, 0x35, +0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x12, 0x30, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x09, 0xbb, 0x04, 0x3b, 0x08, 0x34, +0x00, 0x00, 0x00, 0xbb, 0x04, 0x45, 0x08, 0x02, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x45, 0x0a, 0x01, 0x00, 0x00, 0x00, 0xbb, +0x04, 0x08, 0x0c, 0x0a, 0xd7, 0xa3, 0x3a, 0xbb, 0x04, 0x45, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x1e, 0x31, +0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x1a, 0x32, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x0a, 0x36, 0x00, 0x00, 0x00, 0xbb, +0x04, 0x3b, 0x06, 0x37, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x10, 0x3a, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x08, 0x3b, +0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x0c, 0x33, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x45, 0xbb, 0x04, 0x3b, 0x1c, 0x06, +0x00, 0x00, 0x00, 0x89, 0x03, 0x16, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0xab, 0x02, 0x02, 0xaf, 0x02, 0x3e, 0x02, +0x00, 0xb0, 0x02, 0x39, 0xb1, 0x02, 0x02, 0x00, 0xbb, 0x04, 0x3b, 0x14, 0x1e, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x0e, +0x39, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x12, 0x38, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x3b, 0x16, 0x23, 0x00, 0x00, 0x00, +0xbb, 0x04, 0x3b, 0x14, 0x21, 0x00, 0x00, 0x00, 0xce, 0x02, 0x50, 0x41, 0x13, 0x08, 0x3e, 0x02, 0x02, 0x89, 0x03, 0x39, +0x8a, 0x03, 0x02, 0x02, 0x3e, 0x52, 0x03, 0x13, 0x39, 0xb4, 0x03, 0x02, 0x03, 0xbb, 0x04, 0x3b, 0x0e, 0x3c, 0x00, 0x00, +0x00, 0xad, 0x06, 0x13, 0x82, 0x02, 0xad, 0x06, 0x08, 0x02, 0xad, 0x06, 0x09, 0x02, 0xc6, 0x06, 0x02, 0xf5, 0x08, 0x00, +0x03, 0x18, 0x02, 0x39, 0x20, 0xf8, 0x06, 0x07, 0x39, 0x21, 0x04, 0x07, 0x01, 0x13, 0x6e, 0xca, 0x05, 0x3d, 0x09, 0x02, +0x02, 0x02, 0x18, 0x13, 0x7d, 0x48, 0x8b, 0x03, 0x56, 0x01, 0x13, 0x02, 0x02, 0x80, 0x0b, 0x14, 0x66, 0x66, 0x2c, 0x2a, +0x2a, 0x2a, 0x28, 0xc1, 0x0a, 0x13, 0x25, 0x25, 0x00, 0x80, 0x0b, 0x14, 0x04, 0x04, 0x0a, 0x08, 0x08, 0x08, 0x06, 0xc1, +0x0a, 0x13, 0x31, 0x31, 0x00, 0x22, 0xe8, 0x01, 0x00, 0x23, 0x7d, 0x1e, 0x7c, 0x56, 0x62, 0x01, 0x13, 0x02, 0x02, 0x3d, +0x09, 0x02, 0x02, 0x02, 0x18, 0xc3, 0x10, 0x09, 0xfd, 0x01, 0x7f, 0xfd, 0x01, 0x13, 0x57, 0x04, 0x7c, 0xbc, 0x03, 0x01, +0x44, 0x02, 0x02, 0xc1, 0x12, 0x09, 0x04, 0x04, 0x0a, 0x01, 0x13, 0x04, 0x1a, 0x22, 0x02, 0x00, 0x22, 0x01, 0x04, 0xd9, +0x06, 0x13, 0x06, 0xc0, 0x06, 0x08, 0x04, 0x22, 0x20, 0x00, 0x8d, 0x1e, 0x88, 0x06, 0xc6, 0x06, 0x13, 0xbf, 0x06, 0x00, +0x22, 0xa7, 0x06, 0x20, 0x03, 0xa7, 0x06, 0x21, 0x02, 0x18, 0x04, 0x01, 0x09, 0xa6, 0x02, 0xaa, 0x02, 0x5c, 0x08, 0x02, +0x01, 0x42, 0xb9, 0x01, 0x13, 0x6e, 0x06, 0x7c, 0xbc, 0x01, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x0f, 0x02, 0x0a, 0x02, +0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x01, 0x13, 0x04, 0xbe, 0x02, 0x9e, 0x1e, 0xc2, 0x00, +0x00, 0x00, 0x18, 0x01, 0x13, 0xc6, 0x01, 0x0c, 0x7c, 0xc5, 0x01, 0x01, 0x09, 0x02, 0x02, 0x13, 0x6e, 0x06, 0x7c, 0xca, +0x01, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x0a, 0x08, 0x08, 0x10, 0x02, 0x13, 0xb7, 0x01, 0x08, 0x24, 0xd3, 0x01, 0x01, 0x08, +0x02, 0x02, 0x4a, 0x08, 0x02, 0x14, 0x02, 0x5c, 0x08, 0x04, 0x01, 0x04, 0xd6, 0x01, 0xca, 0x16, 0x0f, 0x04, 0x04, 0x02, +0xa7, 0x1e, 0x03, 0x00, 0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0xc1, 0x0a, 0x08, 0x0c, 0x32, 0x00, 0xc1, 0x0a, 0x08, +0x04, 0x36, 0x01, 0xc3, 0x10, 0x08, 0x04, 0x04, 0x1e, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xe5, 0x01, 0x4a, 0x08, 0x02, 0x0c, +0x02, 0xc3, 0x10, 0x08, 0x02, 0x30, 0x02, 0xc8, 0x10, 0x08, 0x04, 0x04, 0x28, 0x99, 0x1e, 0x1c, 0x18, 0x1b, 0xe5, 0x1e, +0x08, 0xfc, 0x05, 0xd0, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x13, +0x6e, 0xd5, 0x05, 0x7c, 0xee, 0x01, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x6e, 0x02, 0x6c, 0x08, 0x02, 0x01, +0x28, 0xf1, 0x01, 0x8b, 0x01, 0x4a, 0x08, 0x02, 0xcd, 0x05, 0x02, 0x3f, 0x08, 0x06, 0x06, 0x5c, 0x08, 0x02, 0x01, 0x1b, +0xf6, 0x01, 0xc3, 0x10, 0x08, 0x06, 0xd6, 0x01, 0x06, 0x13, 0x6e, 0x04, 0x7c, 0xfb, 0x01, 0x01, 0x08, 0x02, 0x02, 0x6c, +0x08, 0x02, 0x01, 0x25, 0xfa, 0x01, 0xfd, 0x01, 0x13, 0xc6, 0x01, 0x06, 0x7c, 0x80, 0x02, 0x01, 0x09, 0x02, 0x02, 0x13, +0x6e, 0x04, 0x7c, 0x83, 0x02, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x0f, 0x02, 0x02, 0xf6, 0x01, 0xa7, 0x1e, 0x03, 0x00, +0xba, 0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x13, 0x6e, 0x0a, 0x7c, 0x8b, 0x02, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x02, +0xa8, 0x01, 0x02, 0x13, 0x6e, 0x04, 0x7c, 0x8f, 0x02, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, 0x08, 0x02, 0x13, +0x96, 0x02, 0x0a, 0x7c, 0x95, 0x02, 0x01, 0x45, 0x02, 0x02, 0x5c, 0x73, 0x02, 0x01, 0x3e, 0x98, 0x02, 0xc1, 0x0a, 0x08, +0x06, 0x06, 0x01, 0xc1, 0x0a, 0x08, 0x04, 0x0a, 0x00, 0x7c, 0x08, 0x04, 0x01, 0x2b, 0x92, 0x02, 0x8b, 0x01, 0x8f, 0x01, +0x7c, 0x08, 0x02, 0x01, 0x2e, 0x9c, 0x02, 0x9e, 0x02, 0xa0, 0x02, 0x13, 0x50, 0x08, 0x7c, 0xa4, 0x02, 0x01, 0x41, 0x02, +0x02, 0xc1, 0x0a, 0x13, 0x02, 0x02, 0x00, 0x3d, 0x09, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, 0x13, 0x02, 0x06, 0x01, 0x3d, +0x09, 0x02, 0x02, 0x02, 0x18, 0xc1, 0x0a, 0x13, 0x02, 0x0a, 0x02, 0x3d, 0x09, 0x02, 0x02, 0x02, 0x18, 0xd0, 0x0a, 0x44, +0x02, 0x0a, 0x06, 0x02, 0xb4, 0x0a, 0x44, 0x02, 0x2d, 0x01, 0x00, 0x00, 0x01, 0xb0, 0x02, 0x0a, 0x02, 0x01, 0x09, 0x04, +0xa2, 0x04, 0xc1, 0x12, 0x09, 0x02, 0x10, 0x02, 0xe8, 0x0a, 0x13, 0x04, 0x0a, 0x04, 0x02, 0xa1, 0x02, 0x3d, 0x09, 0x02, +0x02, 0x02, 0x18, 0x4a, 0x09, 0x04, 0x72, 0x04, 0x99, 0x1e, 0x66, 0x18, 0x65, 0xe5, 0x1e, 0x09, 0xa6, 0x05, 0x02, 0x01, +0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x13, 0x6e, 0xbb, 0x04, 0x7c, 0xbc, +0x02, 0x01, 0x08, 0x02, 0x02, 0x4a, 0x08, 0x04, 0x04, 0x84, 0x01, 0xce, 0x10, 0x09, 0x04, 0xb1, 0x04, 0x04, 0x13, 0x6e, +0x04, 0x7c, 0xc3, 0x02, 0x01, 0x08, 0x02, 0x02, 0xca, 0x16, 0x0f, 0x02, 0x02, 0xf6, 0x02, 0xa7, 0x1e, 0x03, 0x00, 0xba, +0x1e, 0x00, 0x01, 0x03, 0x18, 0x02, 0x13, 0x6e, 0x0c, 0x7c, 0xcc, 0x02, 0x01, 0x08, 0x02, 0x02, 0xc3, 0x10, 0x08, 0x02, +0xaa, 0x02, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x28, 0xcf, 0x02, 0x8b, 0x01, 0x4a, 0x08, 0x02, 0x91, 0x04, 0x02, 0x3f, 0x08, +0x06, 0x06, 0x5c, 0x08, 0x02, 0x01, 0x1b, 0xd4, 0x02, 0x13, 0x7d, 0x06, 0x7c, 0xd7, 0x02, 0x01, 0x13, 0x02, 0x02, 0x3d, +0x09, 0x02, 0x02, 0x02, 0x18, 0x23, 0x6e, 0x02, 0x7c, 0xd7, 0x02, 0x88, 0x01, 0x01, 0x08, 0x02, 0x02, 0xce, 0x10, 0x09, +0x02, 0x06, 0x02, 0x01, 0x09, 0x04, 0xf6, 0x04, 0x5c, 0x09, 0x02, 0x01, 0x45, 0xdf, 0x02, 0x13, 0xc6, 0x01, 0x04, 0x7c, +0xe1, 0x02, 0x01, 0x09, 0x02, 0x02, 0xc4, 0x12, 0x08, 0x02, 0x08, 0x02, 0x6c, 0x08, 0x02, 0x01, 0x28, 0xe4, 0x02, 0x8b, +0x01, 0x6c, 0x08, 0x0a, 0x01, 0x1a, 0xe5, 0x02, 0xc5, 0x02, 0xc3, 0x10, 0x08, 0x08, 0xbe, 0x03, 0x32, 0x4a, 0x08, 0x02, +0x0a, 0x02, 0xce, 0x10, 0x09, 0x02, 0x26, 0x02, 0x4b, 0x09, 0x04, 0x60, 0x04, 0x99, 0x1e, 0x54, 0x18, 0x53, 0xe5, 0x1e, +0x09, 0xaa, 0x04, 0x42, 0x01, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x13, +0xb7, 0x01, 0xd3, 0x03, 0x23, 0x88, 0x01, 0x01, 0x08, 0x02, 0x02, 0xce, 0x10, 0x09, 0x04, 0xcd, 0x03, 0x04, 0x01, 0x13, +0x02, 0xa8, 0x05, 0x3d, 0x09, 0x02, 0x02, 0x02, 0x18, 0xc3, 0x10, 0x08, 0x04, 0xd6, 0x03, 0xf8, 0x01, 0xce, 0x10, 0x09, +0x02, 0x06, 0x02, 0x4b, 0x09, 0x04, 0x04, 0x0e, 0x13, 0xb7, 0x01, 0x02, 0x23, 0xdf, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x04, +0x00, 0x22, 0x02, 0x00, 0x13, 0xb7, 0x01, 0x02, 0x23, 0xd3, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x08, 0x01, 0x22, 0x02, 0x00, +0x13, 0xb7, 0x01, 0x02, 0x23, 0xce, 0x01, 0xc1, 0x0a, 0x08, 0x02, 0x0c, 0x02, 0x22, 0x02, 0x00, 0x01, 0x13, 0x02, 0xc2, +0x05, 0x9e, 0x1e, 0x84, 0x01, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xb4, 0x04, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, +0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xef, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, +0x53, 0x5a, 0xa0, 0x02, 0x04, 0x07, 0x10, 0x2e, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, +0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, +0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, +0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, 0x6c, 0x1e, 0x00, 0x10, 0x0e, 0x1e, 0x07, 0x93, 0x02, 0x02, 0xa1, +0x04, 0x02, 0x02, 0xb5, 0x02, 0x0a, 0x20, 0x01, 0xa6, 0x02, 0x0c, 0x20, 0xb7, 0x02, 0x02, 0x0e, 0x04, 0xb8, 0x02, 0x02, +0x0f, 0x04, 0xb7, 0x02, 0x06, 0x0e, 0x03, 0xb8, 0x02, 0x02, 0x13, 0x03, 0xb5, 0x02, 0x02, 0x20, 0x00, 0xbb, 0x04, 0x15, +0x02, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x0f, 0x16, 0x8e, 0x03, 0x02, 0x10, 0x14, 0x08, 0x08, 0x08, 0x0e, 0x17, +0xbb, 0x04, 0x15, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x18, 0x19, 0xae, 0x02, 0x02, 0x1a, 0x3e, 0x02, 0x02, +0x1b, 0x39, 0x1c, 0x02, 0x02, 0xbb, 0x04, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x1e, 0x02, 0x08, 0xbb, 0x04, 0x08, +0x14, 0x04, 0x00, 0x00, 0x00, 0xb7, 0x02, 0x1a, 0x0e, 0x02, 0x3e, 0x1c, 0x03, 0x44, 0x39, 0x52, 0x02, 0x03, 0xbb, 0x04, +0x15, 0x06, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x03, 0x0e, 0x3e, 0x04, 0x01, 0x0f, 0x39, 0x59, 0x02, 0x01, 0xbb, 0x04, +0x15, 0x02, 0x02, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x01, 0x0e, 0xbb, 0x04, 0x15, 0x06, 0x03, 0x00, 0x00, 0x00, 0xbb, 0x04, +0x15, 0x08, 0x01, 0x00, 0x00, 0x00, 0xad, 0x06, 0x08, 0x86, 0x01, 0xc6, 0x06, 0x02, 0xc3, 0x02, 0x00, 0x03, 0x18, 0x02, +0x33, 0x2d, 0xb8, 0x02, 0x1d, 0x1e, 0xa6, 0x01, 0x37, 0x01, 0x08, 0x02, 0x02, 0xbc, 0x0e, 0x0e, 0x99, 0x01, 0x99, 0x01, +0x13, 0x57, 0x06, 0x53, 0x56, 0x22, 0x00, 0x06, 0x13, 0x5c, 0x0a, 0x5a, 0x5b, 0x01, 0x0e, 0x02, 0x02, 0x13, 0x5c, 0x04, +0x5a, 0x5f, 0x01, 0x0e, 0x02, 0x02, 0xc8, 0x10, 0x0e, 0x02, 0x08, 0x02, 0x13, 0x57, 0x04, 0x53, 0x63, 0x22, 0x00, 0x04, +0x8d, 0x1e, 0x88, 0x06, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, 0x00, 0x03, 0x01, 0x00, +0x0b, 0x00, 0x08, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x91, 0x02, 0x01, 0xd1, +0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, +0x00, 0x01, 0xdf, 0x0e, 0x04, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0xbf, 0x01, 0xa0, 0x02, 0x04, 0x07, 0x10, 0xfe, +0x02, 0x1e, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x12, 0x20, 0xb7, 0x02, 0x02, 0x0c, 0x04, 0xbb, +0x04, 0x0c, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0xec, 0x04, 0x0d, 0x70, 0x70, 0x70, 0x70, 0x70, 0x3e, 0x34, 0x03, 0x0d, +0x39, 0xbe, 0x01, 0x02, 0x03, 0xc6, 0x06, 0x02, 0xf5, 0x02, 0x00, 0x03, 0x18, 0x02, 0x22, 0xf3, 0x02, 0xbd, 0x02, 0x8d, +0x1e, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x4d, 0x53, +0x00, 0x03, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00, 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x18, 0x00, 0x00, +0x91, 0x02, 0x01, 0x91, 0x02, 0x20, 0xd1, 0x10, 0x02, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, +0x30, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x01, 0xaf, 0x0f, 0x00, 0x04, 0xed, 0xc2, 0xa5, 0xf3, 0x06, 0x00, 0x85, +0x01, 0x98, 0x01, 0xdd, 0x01, 0xec, 0x01, 0xfc, 0x01, 0xbe, 0x02, 0x10, 0x9a, 0x01, 0x06, 0x10, 0x37, 0x02, 0x0b, 0x00, +0x05, 0x00, 0x23, 0x00, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x30, +0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x10, 0x04, 0x06, 0x80, 0x02, 0x47, 0x02, 0x01, +0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x01, 0x10, 0x42, 0x06, 0x40, 0x10, 0x08, +0x06, 0x10, 0x10, 0x02, 0x06, 0x10, 0x10, 0x04, 0x06, 0x10, 0x37, 0x02, 0x76, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, +0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, +0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, +0x00, 0x23, 0x80, 0x02, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x23, 0x40, +0x01, 0x23, 0x10, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x23, +0x08, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x0c, 0x01, 0x00, 0x00, 0x23, 0x04, +0x01, 0x23, 0x08, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x90, 0x01, 0x01, 0x00, 0x00, 0x23, 0x0c, +0x01, 0x23, 0x04, 0x01, 0x23, 0x10, 0x01, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x08, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x10, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x08, +0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, +0x0c, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x0c, 0x01, +0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x23, 0x04, 0x01, 0x05, 0x00, 0x23, 0x04, 0x00, 0x07, 0x01, 0x10, +0x01, 0x05, 0x00, 0x23, 0x30, 0x00, 0x07, 0x01, 0x10, 0x01, 0x05, 0x00, 0x23, 0x40, 0x00, 0x07, 0x01, 0x10, 0x01, 0x00, +0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x23, +0x04, 0x01, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, 0x00, 0x00, 0x23, 0x04, 0x01, +0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, 0x00, 0x21, 0x00, 0x00, 0x0e, 0x0e, 0x10, 0x00, +0x1e, 0x08, 0x10, 0x04, 0x01, 0x08, 0x10, 0x22, 0x1e, 0x00, 0x37, 0x4c, 0x07, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x07, +0x01, 0x10, 0x01, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x02, 0x10, 0x04, 0x22, 0x00, 0x10, +0x00, 0x21, 0x08, 0x10, 0x3a, 0x0b, 0x2b, 0x10, 0x1e, 0x1e, 0x04, 0x10, 0x20, 0x1e, 0x07, 0x47, 0x80, 0x01, 0x04, 0x00, +0x0b, 0x01, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x01, 0x0b, 0x01, 0x03, 0x01, 0x0b, 0x01, 0x04, 0x00, 0x00, 0x02, 0x00, 0xc4, +0x01, 0x00, 0x93, 0x02, 0x02, 0xa1, 0x04, 0x02, 0x02, 0xa6, 0x02, 0x06, 0x20, 0xb7, 0x02, 0x02, 0x06, 0x04, 0xb8, 0x02, +0x02, 0x07, 0x04, 0xb7, 0x02, 0x02, 0x06, 0x03, 0xae, 0x02, 0x2c, 0x07, 0xb5, 0x02, 0x1a, 0x20, 0x00, 0xbb, 0x04, 0x2c, +0x02, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0x04, 0x20, 0x01, 0xbb, 0x04, 0x2f, 0x02, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x04, +0x2c, 0x06, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2f, 0x04, 0x01, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2c, 0x06, 0x02, 0x00, +0x00, 0x00, 0xbb, 0x04, 0x2f, 0x04, 0x02, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x22, 0x09, 0x03, 0xbb, 0x04, 0x2c, 0x02, 0x08, +0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, 0x4c, 0x8e, 0x03, 0x02, 0x08, 0x4b, 0x2f, 0x2f, 0x2f, 0x06, 0x4d, 0xbb, 0x04, +0x2c, 0x02, 0x40, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x4e, 0x4f, 0xae, 0x02, 0x02, 0x50, 0x3e, 0x02, 0x02, 0x51, 0x39, +0x52, 0x02, 0x02, 0x3e, 0x04, 0x02, 0x08, 0xbb, 0x04, 0x2f, 0x28, 0x04, 0x00, 0x00, 0x00, 0xbb, 0x04, 0x2f, 0x0c, 0x05, +0x00, 0x00, 0x00, 0x3e, 0x02, 0x02, 0x06, 0xbb, 0x04, 0x2c, 0x06, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x08, 0x73, +0xb7, 0x02, 0x02, 0x06, 0x02, 0xb7, 0x02, 0x02, 0x2c, 0x03, 0xbb, 0x04, 0x2c, 0x02, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x02, +0x02, 0x09, 0x77, 0xbc, 0x02, 0x02, 0x07, 0x73, 0xbb, 0x04, 0x2c, 0x02, 0x28, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x02, 0x07, +0x7a, 0xae, 0x83, 0x80, 0x02, 0x02, 0x08, 0x08, 0x08, 0x08, 0x74, 0x08, 0x08, 0x07, 0x75, 0x06, 0x06, 0x07, 0x07, 0x75, +0x75, 0x06, 0x06, 0x75, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x76, 0x2f, 0x75, 0x06, 0x06, 0x78, 0x09, +0x06, 0x07, 0x07, 0x75, 0x2f, 0x06, 0x07, 0x2f, 0x06, 0x75, 0x06, 0x06, 0x06, 0x2c, 0x09, 0x06, 0x06, 0x2c, 0x06, 0x06, +0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x4b, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x79, 0x2f, 0x06, 0x06, 0x06, 0x7b, 0x3e, +0x02, 0x02, 0x7c, 0x39, 0x7d, 0x02, 0x02, 0x3e, 0x0c, 0x03, 0x2f, 0x39, 0x84, 0x01, 0x02, 0x03, 0xb2, 0x06, 0x2f, 0x04, +0x02, 0x00, 0x00, 0x00, 0x3e, 0x20, 0x01, 0x07, 0x39, 0x97, 0x01, 0x02, 0x01, 0xce, 0x02, 0x4c, 0x08, 0x07, 0x06, 0x3e, +0x02, 0x02, 0xbe, 0x01, 0x39, 0xbf, 0x01, 0x02, 0x02, 0xbb, 0x04, 0x06, 0x2c, 0xa4, 0x70, 0x7d, 0x3f, 0x3e, 0x0c, 0x01, +0x2f, 0x39, 0xdc, 0x01, 0x02, 0x01, 0x3e, 0x1c, 0x03, 0x07, 0x39, 0xeb, 0x01, 0x02, 0x03, 0x3e, 0x08, 0x03, 0x06, 0x39, +0xeb, 0x01, 0x18, 0x03, 0xbb, 0x04, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x40, 0xbb, 0x04, 0x06, 0x08, 0x00, 0x00, 0x80, 0xbf, +0xbb, 0x04, 0x06, 0x16, 0x00, 0x00, 0x80, 0x3f, 0xbc, 0x02, 0x52, 0x06, 0x38, 0xbc, 0x02, 0x02, 0x06, 0x33, 0xde, 0x02, +0x02, 0x07, 0x06, 0xba, 0x02, 0xbb, 0x02, 0x3e, 0x02, 0x03, 0xbc, 0x02, 0x39, 0xbd, 0x02, 0x02, 0x03, 0xc6, 0x06, 0x02, +0xf3, 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, 0x2f, 0xb2, 0x03, 0x02, 0x22, 0xb2, 0x01, 0x00, 0x01, 0x2f, 0x04, 0xb6, 0x01, +0xc7, 0x10, 0x2f, 0x02, 0x02, 0xb4, 0x01, 0x33, 0x55, 0xec, 0x01, 0x53, 0x30, 0xe1, 0x01, 0x30, 0x01, 0x08, 0x02, 0x02, +0x01, 0x07, 0xc2, 0x01, 0xc2, 0x04, 0xc1, 0x12, 0x07, 0x47, 0x7a, 0x47, 0x13, 0x55, 0x56, 0x7e, 0x30, 0x01, 0x08, 0x02, +0x02, 0xc1, 0x12, 0x07, 0x51, 0x51, 0x06, 0x3d, 0x09, 0x04, 0x04, 0x04, 0x18, 0x5c, 0x06, 0x02, 0x01, 0x42, 0x9a, 0x03, +0x13, 0x70, 0x04, 0xc0, 0x01, 0x3a, 0x01, 0x06, 0x02, 0x02, 0xc8, 0x10, 0x06, 0x02, 0x08, 0x02, 0x3d, 0x09, 0x04, 0x2f, +0x2f, 0x18, 0xce, 0x10, 0x09, 0x02, 0x02, 0x06, 0xc1, 0x0a, 0x06, 0x04, 0x04, 0x00, 0xd2, 0x0a, 0x07, 0x84, 0x01, 0x84, +0x01, 0x5a, 0x00, 0xc1, 0x0a, 0x06, 0x7f, 0x08, 0x01, 0xd2, 0x0a, 0x07, 0x84, 0x01, 0x84, 0x01, 0x04, 0x01, 0xc1, 0x0a, +0x06, 0x7f, 0x0c, 0x02, 0xd2, 0x0a, 0x07, 0x84, 0x01, 0x84, 0x01, 0x04, 0x02, 0xc1, 0x12, 0x07, 0x7d, 0xa6, 0x01, 0x7d, +0x01, 0x2f, 0x3a, 0x86, 0x05, 0xcb, 0x10, 0x2f, 0x02, 0x02, 0x84, 0x05, 0x23, 0x55, 0x04, 0x7e, 0x69, 0xc9, 0x03, 0x01, +0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x37, 0x37, 0x0a, 0xd2, 0x0a, 0x07, 0x78, 0xac, 0x04, 0x78, 0x02, 0x13, 0x55, 0x39, +0x7e, 0x6f, 0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0x37, 0x37, 0x6f, 0xb0, 0x0a, 0x1f, 0x60, 0x60, 0xc1, 0x0a, 0x07, +0x0d, 0x0d, 0x00, 0x3d, 0x09, 0xdb, 0x03, 0xdb, 0x03, 0xdb, 0x03, 0x18, 0x13, 0xf0, 0x01, 0x04, 0xec, 0x01, 0x2d, 0xc1, +0x0a, 0x06, 0x02, 0x06, 0x00, 0x22, 0x02, 0x00, 0x13, 0xf0, 0x01, 0x02, 0xec, 0x01, 0x33, 0xc1, 0x0a, 0x06, 0x02, 0x0a, +0x01, 0x22, 0x02, 0x00, 0x13, 0xf0, 0x01, 0x02, 0xec, 0x01, 0x38, 0xc1, 0x0a, 0x06, 0x02, 0x0e, 0x02, 0x22, 0x02, 0x00, +0x01, 0x2f, 0xbc, 0x03, 0x9e, 0x05, 0xcb, 0x10, 0x2f, 0x02, 0x02, 0x9c, 0x05, 0x23, 0x55, 0x04, 0x7e, 0x69, 0xd5, 0x03, +0x01, 0x08, 0x02, 0x02, 0xc1, 0x12, 0x07, 0xb9, 0x03, 0xb9, 0x03, 0xc3, 0x03, 0x22, 0x01, 0x00, 0x01, 0x2f, 0x08, 0xf4, +0x01, 0xcb, 0x10, 0x2f, 0x02, 0x02, 0xf2, 0x01, 0xbf, 0x0c, 0x06, 0x06, 0xf8, 0x01, 0xc8, 0x10, 0x06, 0x02, 0x04, 0x02, +0xc8, 0x10, 0x06, 0x08, 0x08, 0x0c, 0x4b, 0x06, 0x02, 0x06, 0x02, 0xbf, 0x0c, 0x06, 0x0a, 0x1c, 0x4a, 0x06, 0x02, 0x16, +0x02, 0x4b, 0x06, 0x02, 0x0e, 0x02, 0xc8, 0x10, 0x06, 0x06, 0x04, 0x20, 0xc1, 0x0a, 0x06, 0x04, 0x34, 0x00, 0x4a, 0x06, +0x02, 0x02, 0x06, 0xd2, 0x0a, 0x07, 0xb2, 0x03, 0xb2, 0x03, 0xe8, 0x03, 0x00, 0xc1, 0x0a, 0x06, 0xa7, 0x03, 0xa7, 0x03, +0x03, 0x4a, 0x06, 0x02, 0x18, 0x02, 0xc1, 0x0a, 0x06, 0x04, 0xa1, 0x03, 0x00, 0x4b, 0x06, 0x02, 0x02, 0x06, 0xd2, 0x0a, +0x07, 0xa8, 0x03, 0xa8, 0x03, 0x08, 0x00, 0xc1, 0x0a, 0x06, 0x9f, 0x03, 0x9f, 0x03, 0x00, 0xc3, 0x10, 0x06, 0x0a, 0x2e, +0x32, 0xc1, 0x0a, 0x06, 0x04, 0x91, 0x03, 0x03, 0x4a, 0x06, 0x02, 0x06, 0x02, 0x4b, 0x06, 0x02, 0x12, 0x02, 0xc0, 0x10, +0x2f, 0x0c, 0x64, 0xfa, 0x03, 0xbf, 0x0c, 0x06, 0x02, 0x02, 0x4a, 0x06, 0x02, 0x60, 0x02, 0xc3, 0x10, 0x06, 0x02, 0x48, +0x02, 0x4a, 0x06, 0x06, 0x06, 0x1c, 0x4b, 0x06, 0x02, 0x2c, 0x02, 0x23, 0xf0, 0x01, 0x0e, 0xbe, 0x02, 0x3a, 0x30, 0x22, +0x00, 0x28, 0x3f, 0x06, 0x04, 0x12, 0x23, 0xf0, 0x01, 0x02, 0xbe, 0x02, 0x3a, 0x35, 0x22, 0x00, 0x02, 0xc1, 0x0a, 0x06, +0x04, 0xdb, 0x02, 0x01, 0x3f, 0x06, 0x02, 0x02, 0xd2, 0x0a, 0x07, 0xe8, 0x02, 0xe8, 0x02, 0x0e, 0x01, 0x13, 0xeb, 0x01, +0xe1, 0x02, 0xbe, 0x02, 0x30, 0x22, 0x00, 0xe1, 0x02, 0x22, 0x88, 0x03, 0xd0, 0x01, 0x8d, 0x1e, 0x88, 0x06, 0x52, 0x49, +0x50, 0x53, 0x5f, 0x54, 0x41, 0x4d, 0x86, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x10, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x30, 0x01, 0x04, 0x00, 0x00, 0x00, +0x01, 0x44, 0x01, 0x05, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x06, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x00, +0x00, 0x00, 0x02, 0x10, 0x01, 0x09, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x30, 0x01, 0x0b, +0x00, 0x00, 0x00, 0x02, 0x44, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x90, 0x00, +0x0d, 0x00, 0x00, 0x00, 0x4c, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x41, 0x4d, 0x32, 0x09, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xb0, 0x01, 0x00, 0x00, 0x01, 0x10, +0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xe8, 0x01, 0x00, 0x00, 0x01, 0x20, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, +0x30, 0x01, 0x6c, 0x03, 0x00, 0x00, 0x01, 0x44, 0x01, 0xd0, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0xfa, 0x03, 0x00, 0x00, +0x01, 0x90, 0x00, 0xfa, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x4e, 0x05, 0x00, 0x00, 0x02, 0x00, 0x01, 0xb0, 0x01, 0x00, +0x00, 0x02, 0x10, 0x00, 0x4e, 0x05, 0x00, 0x00, 0x02, 0x10, 0x01, 0xe8, 0x01, 0x00, 0x00, 0x02, 0x20, 0x01, 0x78, 0x06, +0x00, 0x00, 0x02, 0x30, 0x01, 0x6c, 0x03, 0x00, 0x00, 0x02, 0x44, 0x01, 0xd0, 0x03, 0x00, 0x00, 0x02, 0x80, 0x00, 0xde, +0x07, 0x00, 0x00, 0x02, 0x90, 0x00, 0xde, 0x07, 0x00, 0x00, 0xa1, 0x0f, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x6a, 0x01, +0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6c, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, +0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x75, 0x01, 0x6c, 0x01, +0x76, 0x01, 0x02, 0x00, 0x77, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x78, 0x01, 0x02, 0x00, 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, 0x04, 0x00, -0x64, 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, 0x04, 0x00, 0x64, 0x01, 0xbe, 0x01, 0x02, 0x00, -0xd6, 0x01, 0x04, 0x00, 0x64, 0x01, 0xc3, 0x01, 0x02, 0x00, 0xbf, 0x01, 0x04, 0x00, 0x64, 0x01, 0xe9, 0x01, 0x02, 0x00, -0xc6, 0x01, 0xd8, 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, 0xf0, 0x01, 0xf8, 0x01, 0xf3, 0x01, 0xf9, 0x01, -0xf0, 0x01, 0xfa, 0x01, 0xf3, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x01, 0xf0, 0x01, 0x00, 0x02, -0x01, 0x02, 0xf3, 0x01, 0xf9, 0x01, 0xf0, 0x01, 0x02, 0x02, 0xf3, 0x01, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0xf0, 0x01, -0x06, 0x02, 0xf3, 0x01, 0xf9, 0x01, 0xf0, 0x01, 0x07, 0x02, 0xf3, 0x01, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, -0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0xd5, 0x01, 0x6d, 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, 0x12, 0x02, -0x64, 0x01, 0xbe, 0x01, 0x02, 0x00, 0x13, 0x02, 0x04, 0x00, 0x64, 0x01, 0xc3, 0x01, 0x02, 0x00, 0xc0, 0x01, 0x04, 0x00, -0x64, 0x01, 0x14, 0x02, 0x02, 0x00, 0xc6, 0x01, 0x15, 0x02, 0x16, 0x02, 0xd5, 0x01, 0x6d, 0x00, 0x64, 0x01, 0xec, 0x00, -0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x64, 0x01, 0xbe, 0x01, 0x02, 0x00, -0xd6, 0x01, 0x04, 0x00, 0x64, 0x01, 0x17, 0x02, 0x02, 0x00, 0xc6, 0x01, 0x18, 0x02, 0xd5, 0x01, 0x6d, 0x00, 0x64, 0x01, -0x2b, 0x13, 0x00, 0x00, 0xa4, 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, 0x19, 0x02, 0x1a, 0x02, 0x64, 0x01, -0xba, 0x01, 0x02, 0x00, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0x04, 0x00, 0x64, 0x01, 0xbe, 0x01, 0x02, 0x00, 0xbf, 0x01, -0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x04, 0x00, 0x64, 0x01, 0xc3, 0x01, 0x02, 0x00, -0xc4, 0x01, 0x04, 0x00, 0x64, 0x01, 0xc5, 0x01, 0x02, 0x00, 0xc6, 0x01, 0xc7, 0x01, 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, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0xd5, 0x01, 0x6d, 0x00, 0x64, 0x01, 0x29, 0x0f, 0x00, 0x00, -0x8f, 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, -0x04, 0x00, 0x64, 0x01, 0xbe, 0x01, 0x02, 0x00, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0x04, 0x00, 0x64, 0x01, -0xc3, 0x01, 0x02, 0x00, 0xc4, 0x01, 0x04, 0x00, 0x64, 0x01, 0xc5, 0x01, 0x02, 0x00, 0xc6, 0x01, 0xc7, 0x01, 0x3a, 0x02, -0x3b, 0x02, 0x3c, 0x02, 0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, -0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0x6d, 0x00, 0x64, 0x01, 0x21, 0x16, 0x00, 0x00, 0xaf, 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, 0xba, 0x01, 0x02, 0x00, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0x04, 0x00, 0x64, 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, 0x04, 0x00, 0x64, 0x01, 0xbe, 0x01, 0x02, 0x00, 0xd6, 0x01, 0x04, 0x00, 0x64, 0x01, -0xc3, 0x01, 0x02, 0x00, 0xbf, 0x01, 0x04, 0x00, 0x64, 0x01, 0xe9, 0x01, 0x02, 0x00, 0xc6, 0x01, 0xd8, 0x01, 0xea, 0x01, -0x45, 0x02, 0x46, 0x02, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0x47, 0x02, 0xf2, 0x01, 0xf3, 0x01, -0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf0, 0x01, 0xf8, 0x01, 0xf3, 0x01, 0xf9, 0x01, 0xf0, 0x01, 0xfa, 0x01, -0xf3, 0x01, 0x48, 0x02, 0x49, 0x02, 0xff, 0x01, 0xf0, 0x01, 0x4a, 0x02, 0x4b, 0x02, 0xf3, 0x01, 0xf9, 0x01, 0xf0, 0x01, -0x4c, 0x02, 0xf3, 0x01, 0x4d, 0x02, 0x4e, 0x02, 0x05, 0x02, 0xf0, 0x01, 0x4f, 0x02, 0xf3, 0x01, 0xf9, 0x01, 0xf0, 0x01, -0x07, 0x02, 0xf3, 0x01, 0x50, 0x02, 0x51, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, -0x52, 0x02, 0xd5, 0x01, 0x6d, 0x00, 0x64, 0x01, 0x41, 0x13, 0x00, 0x00, 0xa4, 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, 0x19, 0x02, 0x1a, 0x02, 0x64, 0x01, 0xba, 0x01, 0x02, 0x00, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0x04, 0x00, -0x64, 0x01, 0xbe, 0x01, 0x02, 0x00, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, -0x04, 0x00, 0x64, 0x01, 0xc3, 0x01, 0x02, 0x00, 0xc4, 0x01, 0x04, 0x00, 0x64, 0x01, 0xc5, 0x01, 0x02, 0x00, 0xc6, 0x01, -0xc7, 0x01, 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, 0x69, 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x38, 0x02, 0x39, 0x02, 0xd5, 0x01, -0x6d, 0x00, 0x64, 0x01, +0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, +0x04, 0x00, 0x6c, 0x01, 0xc2, 0x01, 0x02, 0x00, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0x04, 0x00, 0x6c, 0x01, 0xc6, 0x01, +0x02, 0x00, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0x04, 0x00, 0x6c, 0x01, 0xcb, 0x01, 0x02, 0x00, 0xcc, 0x01, +0x04, 0x00, 0x6c, 0x01, 0xcd, 0x01, 0x02, 0x00, 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, 0x6d, 0x00, 0x6c, 0x01, 0x96, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x6a, 0x01, 0x6b, 0x01, +0x6c, 0x01, 0x6d, 0x01, 0x6c, 0x01, 0xc2, 0x01, 0x02, 0x00, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0x04, 0x00, 0x6c, 0x01, +0xc6, 0x01, 0x02, 0x00, 0xe0, 0x01, 0x04, 0x00, 0x6c, 0x01, 0xe1, 0x01, 0x02, 0x00, 0xce, 0x01, 0xe2, 0x01, 0xdf, 0x01, +0x6d, 0x00, 0x6c, 0x01, 0x64, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, +0x6c, 0x01, 0xe3, 0x01, 0x02, 0x00, 0x6d, 0x00, 0x6c, 0x01, 0x82, 0x16, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0x6a, 0x01, +0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6c, 0x01, 0x78, 0x01, 0x02, 0x00, 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, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0x04, 0x00, +0x6c, 0x01, 0xc2, 0x01, 0x02, 0x00, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0x04, 0x00, 0x6c, 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, 0x04, 0x00, 0x6c, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xe0, 0x01, 0x04, 0x00, 0x6c, 0x01, +0xcb, 0x01, 0x02, 0x00, 0xc7, 0x01, 0x04, 0x00, 0x6c, 0x01, 0xf3, 0x01, 0x02, 0x00, 0xce, 0x01, 0xe2, 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, 0xfa, 0x01, 0x02, 0x02, 0xfd, 0x01, 0x03, 0x02, 0xfa, 0x01, 0x04, 0x02, 0xfd, 0x01, +0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0xfa, 0x01, 0x0a, 0x02, 0x0b, 0x02, 0xfd, 0x01, 0x03, 0x02, +0xfa, 0x01, 0x0c, 0x02, 0xfd, 0x01, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0xfa, 0x01, 0x10, 0x02, 0xfd, 0x01, 0x03, 0x02, +0xfa, 0x01, 0x11, 0x02, 0xfd, 0x01, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, +0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0xdf, 0x01, 0x6d, 0x00, 0x6c, 0x01, 0xbc, 0x03, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, +0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6c, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, +0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x75, 0x01, +0x6c, 0x01, 0x76, 0x01, 0x02, 0x00, 0x77, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x1c, 0x02, 0x6c, 0x01, 0xc6, 0x01, 0x02, 0x00, +0x1d, 0x02, 0x04, 0x00, 0x6c, 0x01, 0xcb, 0x01, 0x02, 0x00, 0xc8, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x1e, 0x02, 0x02, 0x00, +0xce, 0x01, 0x1f, 0x02, 0x20, 0x02, 0xdf, 0x01, 0x6d, 0x00, 0x6c, 0x01, 0xec, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, +0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6c, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xe0, 0x01, 0x04, 0x00, 0x6c, 0x01, +0x21, 0x02, 0x02, 0x00, 0xce, 0x01, 0x22, 0x02, 0xdf, 0x01, 0x6d, 0x00, 0x6c, 0x01, 0xd0, 0x13, 0x00, 0x00, 0xa6, 0x00, +0x00, 0x00, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6c, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, +0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x75, 0x01, 0x6c, 0x01, 0x76, 0x01, 0x02, 0x00, 0x77, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x78, 0x01, 0x02, 0x00, 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, 0xbf, 0x01, +0xc0, 0x01, 0xc1, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x23, 0x02, 0x24, 0x02, 0x6c, 0x01, 0xc2, 0x01, 0x02, 0x00, 0xc3, 0x01, +0xc4, 0x01, 0xc5, 0x01, 0x04, 0x00, 0x6c, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, +0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x04, 0x00, 0x6c, 0x01, 0xcb, 0x01, 0x02, 0x00, 0xcc, 0x01, 0x04, 0x00, 0x6c, 0x01, +0xcd, 0x01, 0x02, 0x00, 0xce, 0x01, 0xcf, 0x01, 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, +0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0xdf, 0x01, 0x6d, 0x00, 0x6c, 0x01, 0xa1, 0x0f, 0x00, 0x00, 0x91, 0x00, +0x00, 0x00, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6c, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, +0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, +0x75, 0x01, 0x6c, 0x01, 0x76, 0x01, 0x02, 0x00, 0x77, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x78, 0x01, 0x02, 0x00, 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, 0xbf, 0x01, +0xc0, 0x01, 0xc1, 0x01, 0x04, 0x00, 0x6c, 0x01, 0xc2, 0x01, 0x02, 0x00, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0x04, 0x00, +0x6c, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0x04, 0x00, 0x6c, 0x01, 0xcb, 0x01, +0x02, 0x00, 0xcc, 0x01, 0x04, 0x00, 0x6c, 0x01, 0xcd, 0x01, 0x02, 0x00, 0xce, 0x01, 0xcf, 0x01, 0x46, 0x02, 0x47, 0x02, +0x48, 0x02, 0x49, 0x02, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x02, 0x4f, 0x02, 0x50, 0x02, 0x51, 0x02, +0x52, 0x02, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0x6d, 0x00, 0x6c, 0x01, 0x21, 0x16, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, +0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6c, 0x01, 0x78, 0x01, 0x02, 0x00, 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, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, +0x04, 0x00, 0x6c, 0x01, 0xc2, 0x01, 0x02, 0x00, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0x04, 0x00, 0x6c, 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, 0x04, 0x00, 0x6c, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xe0, 0x01, 0x04, 0x00, +0x6c, 0x01, 0xcb, 0x01, 0x02, 0x00, 0xc7, 0x01, 0x04, 0x00, 0x6c, 0x01, 0xf3, 0x01, 0x02, 0x00, 0xce, 0x01, 0xe2, 0x01, +0xf4, 0x01, 0x53, 0x02, 0x54, 0x02, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0x55, 0x02, 0xfc, 0x01, +0xfd, 0x01, 0xfe, 0x01, 0xff, 0x01, 0x00, 0x02, 0x01, 0x02, 0xfa, 0x01, 0x02, 0x02, 0xfd, 0x01, 0x03, 0x02, 0xfa, 0x01, +0x04, 0x02, 0xfd, 0x01, 0x56, 0x02, 0x57, 0x02, 0x09, 0x02, 0xfa, 0x01, 0x58, 0x02, 0x59, 0x02, 0xfd, 0x01, 0x03, 0x02, +0xfa, 0x01, 0x5a, 0x02, 0xfd, 0x01, 0x5b, 0x02, 0x5c, 0x02, 0x0f, 0x02, 0xfa, 0x01, 0x5d, 0x02, 0xfd, 0x01, 0x03, 0x02, +0xfa, 0x01, 0x11, 0x02, 0xfd, 0x01, 0x5e, 0x02, 0x5f, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, +0x1a, 0x02, 0x60, 0x02, 0xdf, 0x01, 0x6d, 0x00, 0x6c, 0x01, 0xe4, 0x13, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x6a, 0x01, +0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6c, 0x01, 0x05, 0x00, 0x02, 0x00, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, +0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x75, 0x01, 0x6c, 0x01, +0x76, 0x01, 0x02, 0x00, 0x77, 0x01, 0x04, 0x00, 0x6c, 0x01, 0x78, 0x01, 0x02, 0x00, 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, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, +0x04, 0x00, 0x6c, 0x01, 0x23, 0x02, 0x24, 0x02, 0x6c, 0x01, 0xc2, 0x01, 0x02, 0x00, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, +0x04, 0x00, 0x6c, 0x01, 0xc6, 0x01, 0x02, 0x00, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0x25, 0x02, 0x26, 0x02, +0x27, 0x02, 0x04, 0x00, 0x6c, 0x01, 0xcb, 0x01, 0x02, 0x00, 0xcc, 0x01, 0x04, 0x00, 0x6c, 0x01, 0xcd, 0x01, 0x02, 0x00, +0xce, 0x01, 0xcf, 0x01, 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, 0x79, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, +0x44, 0x02, 0x45, 0x02, 0xdf, 0x01, 0x6d, 0x00, 0x6c, 0x01, }; int UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_OFFSET = 0; -int UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_SIZE = 39924; +int UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_SIZE = 41110; diff --git a/thermion_dart/native/include/scene/AnimationManager.hpp b/thermion_dart/native/include/scene/AnimationManager.hpp new file mode 100644 index 00000000..365e438e --- /dev/null +++ b/thermion_dart/native/include/scene/AnimationManager.hpp @@ -0,0 +1,172 @@ +#pragma once + +#include +#include + +#include +#include + +#include "c_api/APIBoundaryTypes.h" + +#include "components/CollisionComponentManager.hpp" +#include "components/AnimationComponentManager.hpp" +#include "GltfSceneAssetInstance.hpp" +#include "GltfSceneAsset.hpp" +#include "SceneAsset.hpp" + +namespace thermion +{ + + using namespace filament; + using namespace filament::gltfio; + using namespace utils; + using std::string; + using std::unique_ptr; + using std::vector; + + /// @brief + class AnimationManager + { + public: + AnimationManager( + Engine *engine, + Scene *scene); + ~AnimationManager(); + + void update(); + + /// @brief + /// @param asset + /// @param childEntity + /// @return + vector getMorphTargetNames(GltfSceneAsset *asset, EntityId childEntity); + + /// @brief + /// @param instance + /// @param skinIndex + /// @return + vector getBoneEntities(GltfSceneAssetInstance *instance, int skinIndex); + + /// @brief + /// @param sceneAsset + /// @param morphData + /// @param morphIndices + /// @param numMorphTargets + /// @param numFrames + /// @param frameLengthInMs + /// @return + bool setMorphAnimationBuffer( + utils::Entity entity, + const float *const morphData, + const uint32_t *const morphIndices, + int numMorphTargets, + int numFrames, + float frameLengthInMs); + + /// @brief + /// @param entityId + void clearMorphAnimationBuffer( + utils::Entity entity); + + /// @brief + /// @param instance + /// @param skinIndex + /// @param boneIndex + /// @return + math::mat4f getInverseBindMatrix(GltfSceneAssetInstance *instance, int skinIndex, int boneIndex); + + /// @brief Set the local transform for the bone at boneIndex/skinIndex in the given entity. + /// @param entityId the parent entity + /// @param entityName the name of the mesh under entityId for which the bone will be set. + /// @param skinIndex the index of the joint skin. Currently only 0 is supported. + /// @param boneName the name of the bone + /// @param transform the 4x4 matrix representing the local transform for the bone + /// @return true if the transform was successfully set, false otherwise + bool setBoneTransform(GltfSceneAssetInstance *instance, int skinIndex, int boneIndex, math::mat4f transform); + + /// @brief Immediately start animating the bone at [boneIndex] under the parent instance [entity] at skin [skinIndex]. + /// @param entity the mesh entity to animate + /// @param frameData frame data as quaternions + /// @param numFrames the number of frames + /// @param boneName the name of the bone to animate + /// @param frameLengthInMs the length of each frame in ms + /// @return true if the bone animation was successfully enqueued + bool addBoneAnimation( + GltfSceneAssetInstance *instance, + int skinIndex, + int boneIndex, + const float *const frameData, + int numFrames, + float frameLengthInMs, + float fadeOutInSecs, + float fadeInInSecs, + float maxDelta); + + /// @brief + /// @param instance + /// @param skinIndex + /// @return + std::vector getBoneRestTranforms(GltfSceneAssetInstance *instance, int skinIndex); + + /// @brief + /// @param instance + void resetToRestPose(GltfSceneAssetInstance *instance); + + /// @brief + /// @param instance + void updateBoneMatrices(GltfSceneAssetInstance *instance); + + /// @brief + /// @param instance + /// @param animationIndex + /// @param loop + /// @param reverse + /// @param replaceActive + /// @param crossfade + /// @param startOffset + void playGltfAnimation(GltfSceneAssetInstance *instance, int animationIndex, bool loop, bool reverse, bool replaceActive, float crossfade = 0.3f, float startOffset = 0.0f); + + /// @brief + /// @param instance + /// @param animationIndex + void stopGltfAnimation(GltfSceneAssetInstance *instance, int animationIndex); + + /// @brief + /// @param instance + /// @param weights + /// @param count + void setMorphTargetWeights(utils::Entity entity, const float *const weights, int count); + + /// @brief + /// @param instance + /// @param animationIndex + /// @param animationFrame + void setGltfAnimationFrame(GltfSceneAssetInstance *instance, int animationIndex, int animationFrame); + + /// @brief + /// @param instance + /// @return + vector getGltfAnimationNames(GltfSceneAssetInstance *instance); + + /// @brief + /// @param instance + /// @param animationIndex + /// @return + float getGltfAnimationDuration(GltfSceneAssetInstance *instance, int animationIndex); + + /// @brief + /// @param entity + /// @return + bool addAnimationComponent(EntityId entity); + + /// @brief + /// @param entity + void removeAnimationComponent(EntityId entity); + + private: + Engine *_engine = nullptr; + Scene *_scene = nullptr; + std::mutex _mutex; + std::unique_ptr _animationComponentManager = std::nullptr_t(); + }; +} diff --git a/thermion_dart/native/include/CustomGeometry.hpp b/thermion_dart/native/include/scene/CustomGeometry.hpp similarity index 90% rename from thermion_dart/native/include/CustomGeometry.hpp rename to thermion_dart/native/include/scene/CustomGeometry.hpp index 6f34110f..0c9282a5 100644 --- a/thermion_dart/native/include/CustomGeometry.hpp +++ b/thermion_dart/native/include/scene/CustomGeometry.hpp @@ -17,9 +17,8 @@ namespace thermion { - using namespace filament; +using namespace filament; -// CustomGeometry.h class CustomGeometry { public: CustomGeometry( @@ -31,6 +30,7 @@ public: uint32_t numUvs, uint16_t* indices, uint32_t numIndices, + MaterialInstance* materialInstance, RenderableManager::PrimitiveType primitiveType, Engine* engine); ~CustomGeometry(); @@ -40,6 +40,8 @@ public: private: Engine* _engine; + MaterialInstance* _materialInstance = nullptr; + VertexBuffer* vertexBuffer; IndexBuffer* indexBuffer; diff --git a/thermion_dart/native/include/scene/GeometrySceneAsset.hpp b/thermion_dart/native/include/scene/GeometrySceneAsset.hpp new file mode 100644 index 00000000..9ce5432b --- /dev/null +++ b/thermion_dart/native/include/scene/GeometrySceneAsset.hpp @@ -0,0 +1,143 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include "scene/SceneAsset.hpp" + +namespace thermion +{ + + using namespace filament; + + class GeometrySceneAsset : public SceneAsset + { + public: + GeometrySceneAsset(bool isInstance, + Engine *engine, + VertexBuffer *vertexBuffer, + IndexBuffer *indexBuffer, + MaterialInstance **materialInstances, + size_t materialInstanceCount, + RenderableManager::PrimitiveType primitiveType, + Box boundingBox); + ~GeometrySceneAsset(); + + SceneAsset *createInstance(MaterialInstance **materialInstances = nullptr, size_t materialInstanceCount = 0) override; + + SceneAssetType getType() override + { + return SceneAsset::SceneAssetType::Geometry; + } + + bool isInstance() override + { + return _isInstance; + } + + utils::Entity getEntity() override + { + return _entity; + } + + MaterialInstance **getMaterialInstances() override + { + return _materialInstances; + } + + size_t getMaterialInstanceCount() override + { + return _materialInstanceCount; + } + + const Box &getBoundingBox() const { return _boundingBox; } + VertexBuffer *getVertexBuffer() const { return _vertexBuffer; } + IndexBuffer *getIndexBuffer() const { return _indexBuffer; } + + void addAllEntities(Scene *scene) override + { + scene->addEntity(_entity); + } + + void removeAllEntities(Scene *scene) override + { + scene->remove(_entity); + } + + void setPriority(RenderableManager &rm, int priority) override + { + auto renderableInstance = rm.getInstance(_entity); + rm.setPriority(renderableInstance, priority); + } + + void setLayer(RenderableManager &rm, int layer) override + { + auto renderableInstance = rm.getInstance(_entity); + rm.setLayerMask(renderableInstance, 0xFF, 1u << (uint8_t)layer); + } + + SceneAsset *getInstanceByEntity(utils::Entity entity) override + { + for (auto &instance : _instances) + { + if (instance->getEntity() == entity) + { + return instance.get(); + } + } + return std::nullptr_t(); + } + + SceneAsset *getInstanceAt(size_t index) override + { + auto &asset = _instances[index]; + return asset.get(); + } + + size_t getInstanceCount() override + { + return _instances.size(); + } + + size_t getChildEntityCount() override + { + return 0; + } + + const Entity *getChildEntities() override + { + return nullptr; + } + + Entity findEntityByName(const char *name) override + { + return Entity(); // not currently implemented + } + + static std::unique_ptr create( + float *vertices, uint32_t numVertices, + float *normals, uint32_t numNormals, + float *uvs, uint32_t numUvs, + uint16_t *indices, uint32_t numIndices, + MaterialInstance *materialInstance, + RenderableManager::PrimitiveType primitiveType, + Engine *engine); + + private: + Engine *_engine = nullptr; + VertexBuffer *_vertexBuffer = nullptr; + IndexBuffer *_indexBuffer = nullptr; + MaterialInstance **_materialInstances = nullptr; + size_t _materialInstanceCount = 0; + Box _boundingBox; + bool _isInstance = false; + utils::Entity _entity; + RenderableManager::PrimitiveType _primitiveType; + std::vector> _instances; + + }; + +} // namespace thermion \ No newline at end of file diff --git a/thermion_dart/native/include/scene/GeometrySceneAssetBuilder.hpp b/thermion_dart/native/include/scene/GeometrySceneAssetBuilder.hpp new file mode 100644 index 00000000..75815b42 --- /dev/null +++ b/thermion_dart/native/include/scene/GeometrySceneAssetBuilder.hpp @@ -0,0 +1,308 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "GeometrySceneAsset.hpp" +#include "Log.hpp" + +namespace thermion +{ + class GeometrySceneAssetBuilder + { + public: + GeometrySceneAssetBuilder(filament::Engine *engine) : mEngine(engine) {} + + GeometrySceneAssetBuilder &vertices(const float *vertices, uint32_t count) + { + mVertices->resize(count); + std::copy(vertices, vertices + count, mVertices->data()); + mNumVertices = count; + return *this; + } + + GeometrySceneAssetBuilder &normals(const float *normals, uint32_t count) + { + if (normals) + { + mNormals->resize(count); + std::copy(normals, normals + count, mNormals->data()); + } + else + { + mNormals->clear(); + } + mNumNormals = count; + return *this; + } + + GeometrySceneAssetBuilder &uvs(const float *uvs, uint32_t count) + { + if (uvs) + { + mUVs->resize(count); + std::copy(uvs, uvs + count, mUVs->data()); + } + else + { + mUVs->clear(); + } + mNumUVs = count; + return *this; + } + + GeometrySceneAssetBuilder &indices(const uint16_t *indices, uint32_t count) + { + mIndices->resize(count); + std::copy(indices, indices + count, mIndices->data()); + mNumIndices = count; + return *this; + } + + GeometrySceneAssetBuilder &materials(filament::MaterialInstance **materials, size_t materialInstanceCount) + { + mMaterialInstances = materials; + mMaterialInstanceCount = materialInstanceCount; + return *this; + } + + GeometrySceneAssetBuilder &primitiveType(filament::RenderableManager::PrimitiveType type) + { + mPrimitiveType = type; + return *this; + } + + std::unique_ptr build() + { + Log("Starting build. Validating inputs..."); + if (!validate()) + { + Log("Validation failed!"); + return nullptr; + } + + Log("Creating buffers..."); + auto [vertexBuffer, indexBuffer] = createBuffers(); + if (!vertexBuffer || !indexBuffer) + { + Log("Failed to create buffers: VB=%p, IB=%p", vertexBuffer, indexBuffer); + return nullptr; + } + Log("Buffers created successfully: VB=%p, IB=%p", vertexBuffer, indexBuffer); + + Log("Creating entity..."); + auto entity = utils::EntityManager::get().create(); + Log("Entity created: %d", entity.getId()); + + Box boundingBox = computeBoundingBox(); + Log("Computed bounding box: min={%f,%f,%f}, max={%f,%f,%f}", + boundingBox.getMin().x, boundingBox.getMin().y, boundingBox.getMin().z, + boundingBox.getMax().x, boundingBox.getMax().y, boundingBox.getMax().z); + + auto asset = std::make_unique( + false, + mEngine, + vertexBuffer, + indexBuffer, + mMaterialInstances, + mMaterialInstanceCount, + mPrimitiveType, + boundingBox); + + Log("Asset created: %p", asset.get()); + return asset; + } + + private: + Box computeBoundingBox() + { + float minX = FLT_MAX, minY = FLT_MAX, minZ = FLT_MAX; + float maxX = -FLT_MAX, maxY = -FLT_MAX, maxZ = -FLT_MAX; + Box box; + for (uint32_t i = 0; i < mNumVertices; i += 3) + { + minX = std::min(mVertices->at(i), minX); + minY = std::min(mVertices->at(i + 1), minY); + minZ = std::min(mVertices->at(i + 2), minZ); + maxX = std::max(mVertices->at(i), maxX); + maxY = std::max(mVertices->at(i + 1), maxY); + maxZ = std::max(mVertices->at(i + 2), maxZ); + } + const filament::math::float3 min {minX, minY, minZ}; + const filament::math::float3 max {maxX, maxY, maxZ}; + box.set(min, max); + return box; + } + + std::pair createBuffers() + { + auto indexBuffer = IndexBuffer::Builder() + .indexCount(mNumIndices) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(*mEngine); + + indexBuffer->setBuffer(*mEngine, + IndexBuffer::BufferDescriptor( + mIndices->data(), + mNumIndices * sizeof(uint16_t), + [](void *, size_t, void *data) + { + delete static_cast *>(data); + }, + mIndices)); + + if (mUVs->empty()) + { + mUVs->resize(mNumVertices); + std::fill(mUVs->begin(), mUVs->end(), 0.0f); + } + + auto dummyColors = new std::vector( + mNumVertices, filament::math::float4{1.0f, 1.0f, 1.0f, 1.0f}); + + auto vertexBufferBuilder = + VertexBuffer::Builder() + .vertexCount(mNumVertices) + .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 (!mNormals->empty()) + { + vertexBufferBuilder.bufferCount(5) + .attribute(VertexAttribute::TANGENTS, 4, VertexBuffer::AttributeType::FLOAT4); + } + else + { + vertexBufferBuilder = vertexBufferBuilder.bufferCount(4); + } + + auto vertexBuffer = vertexBufferBuilder.build(*mEngine); + + vertexBuffer->setBufferAt(*mEngine, 0, + VertexBuffer::BufferDescriptor( + mVertices->data(), mNumVertices * sizeof(float), + [](void *, size_t, void *) {})); + + vertexBuffer->setBufferAt(*mEngine, 1, + VertexBuffer::BufferDescriptor( + mUVs->data(), mUVs->size() * sizeof(float), + [](void *, size_t, void *data) + { + }, + mUVs)); + + vertexBuffer->setBufferAt(*mEngine, 2, + VertexBuffer::BufferDescriptor( + mUVs->data(), mUVs->size() * sizeof(float), + [](void *, size_t, void *data) { + delete static_cast *>(data); + + }, + mUVs)); + + vertexBuffer->setBufferAt(*mEngine, 3, + VertexBuffer::BufferDescriptor( + dummyColors->data(), dummyColors->size() * sizeof(math::float4), + [](void *, size_t, void *data) + { + delete static_cast *>(data); + }, + dummyColors)); + + if (!mNormals->empty()) + { + assert(mPrimitiveType == RenderableManager::PrimitiveType::TRIANGLES); + + std::vector triangles; + for (uint32_t i = 0; i < mNumIndices; i += 3) + { + triangles.push_back({mIndices->at(i), + mIndices->at(i + 1), + mIndices->at(i + 2)}); + } + + auto &builder = geometry::SurfaceOrientation::Builder() + .vertexCount(mNumVertices) + .normals((filament::math::float3 *)mNormals->data()) + .positions((filament::math::float3 *)mVertices->data()) + .triangleCount(triangles.size()) + .triangles(triangles.data()); + + auto orientation = builder.build(); + auto quats = new std::vector(mNumVertices); + orientation->getQuats(quats->data(), mNumVertices); + + vertexBuffer->setBufferAt(*mEngine, 4, + VertexBuffer::BufferDescriptor( + quats->data(), quats->size() * sizeof(math::quatf), + [](void *, size_t, void *data) + { + delete static_cast *>(data); + }, + quats)); + } + + return {vertexBuffer, indexBuffer}; + } + + bool validate() const + { + if (!mEngine) + { + Log("Validation failed: No engine"); + return false; + } + if (mVertices->empty() || mNumVertices == 0) + { + Log("Validation failed: No vertices (empty=%d, count=%d)", mVertices->empty(), mNumVertices); + return false; + } + if (mNumNormals > 0 && !mNormals->empty() && mNumNormals != mNumVertices) + { + Log("Validation failed: Normal count mismatch (normals=%d, vertices=%d)", mNumNormals, mNumVertices); + return false; + } + if (mNumUVs > 0 && !mUVs->empty() && mNumUVs != mNumVertices) + { + Log("Validation failed: UV count mismatch (uvs=%d, vertices=%d)", mNumUVs, mNumVertices); + return false; + } + if (mIndices->empty() || mNumIndices == 0) + { + Log("Validation failed: No indices (empty=%d, count=%d)", mIndices->empty(), mNumIndices); + return false; + } + + Log("Validation passed: vertices=%d, normals=%s, uvs=%d, indices=%d", + mNumVertices, + (!mNormals->empty() ? "yes" : "no"), + mNumUVs, + mNumIndices); + return true; + } + + filament::Engine *mEngine = nullptr; + std::vector *mVertices = new std::vector(); + std::vector *mNormals = new std::vector(); + std::vector *mUVs = new std::vector(); + std::vector *mIndices = new std::vector; + uint32_t mNumVertices = 0; + uint32_t mNumNormals = 0; + uint32_t mNumUVs = 0; + uint32_t mNumIndices = 0; + filament::MaterialInstance **mMaterialInstances = nullptr; + size_t mMaterialInstanceCount = 0; + filament::gltfio::MaterialProvider *mMaterialProvider = nullptr; + filament::RenderableManager::PrimitiveType mPrimitiveType = + filament::RenderableManager::PrimitiveType::TRIANGLES; + }; + +} // namespace thermion \ No newline at end of file diff --git a/thermion_dart/native/include/scene/Gizmo.hpp b/thermion_dart/native/include/scene/Gizmo.hpp new file mode 100644 index 00000000..7858502e --- /dev/null +++ b/thermion_dart/native/include/scene/Gizmo.hpp @@ -0,0 +1,201 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "c_api/ThermionDartApi.h" +#include "scene/SceneAsset.hpp" + +namespace thermion +{ + + using namespace filament; + using namespace utils; + + class Gizmo : public SceneAsset + { + + public: + Gizmo(Engine *engine, View *view, Scene *scene, Material *material); + ~Gizmo() override; + + enum Axis + { + X, + Y, + Z + }; + + enum GizmoPickResultType { + AxisX, + AxisY, + AxisZ, + Parent, + None + }; + + typedef void (*GizmoPickCallback)(Gizmo::GizmoPickResultType result, float x, float y, float z); + + + void pick(uint32_t x, uint32_t y, GizmoPickCallback callback); + bool isGizmoEntity(Entity entity); + + SceneAssetType getType() override { return SceneAssetType::Gizmo; } + utils::Entity getEntity() override { return _entities[0]; } + bool isInstance() override { return false; } + SceneAsset *createInstance(MaterialInstance **materialInstances, size_t materialInstanceCount) override { return nullptr; } + MaterialInstance **getMaterialInstances() override { return _materialInstances.data(); } + size_t getMaterialInstanceCount() override { return _materialInstances.size(); } + + void addAllEntities(Scene *scene) override + { + for (const auto &entity : _entities) + { + if (entity.isNull()) + { + continue; + } + scene->addEntity(entity); + + } + } + + void removeAllEntities(Scene *scene) override + { + for (const auto &entity : _entities) + { + scene->remove(entity); + } + } + + size_t getInstanceCount() override { return 0; } + SceneAsset *getInstanceByEntity(utils::Entity entity) override { return nullptr; } + SceneAsset *getInstanceAt(size_t index) override { return nullptr; } + + size_t getChildEntityCount() override { return _entities.size() - 1; } + const Entity *getChildEntities() override { return _entities.data() + 1; } + + Entity findEntityByName(const char *name) override + { + return utils::Entity::import(0); + } + + void setPriority(RenderableManager &rm, int mask) override + { + } + + void setLayer(RenderableManager &rm, int layer) override + { + } + + void highlight(Gizmo::Axis axis); + void unhighlight(Gizmo::Axis axis); + + private: + class PickCallbackHandler + { + public: + PickCallbackHandler(Gizmo *gizmo, GizmoPickCallback callback) + : _gizmo(gizmo), _callback(callback) {} + + void handle(filament::View::PickingQueryResult const &result) + { + + _gizmo->unhighlight(Gizmo::Axis::X); + _gizmo->unhighlight(Gizmo::Axis::Y); + _gizmo->unhighlight(Gizmo::Axis::Z); + + Gizmo::GizmoPickResultType resultType; + + if (result.renderable == _gizmo->_parent) + { + resultType = Gizmo::GizmoPickResultType::Parent; + } + else if (result.renderable == _gizmo->_x || result.renderable == _gizmo->_xHitTest) + { + resultType = Gizmo::GizmoPickResultType::AxisX; + _gizmo->highlight(Gizmo::Axis::X); + } + else if (result.renderable == _gizmo->_y || result.renderable == _gizmo->_yHitTest) + { + _gizmo->highlight(Gizmo::Axis::Y); + resultType = Gizmo::GizmoPickResultType::AxisY; + } + else if (result.renderable == _gizmo->_z || result.renderable == _gizmo->_zHitTest) + { + _gizmo->highlight(Gizmo::Axis::Z); + resultType = Gizmo::GizmoPickResultType::AxisZ; + } else { + resultType = Gizmo::GizmoPickResultType::None; + } + + _callback(resultType, result.fragCoords.x, result.fragCoords.y, result.fragCoords.z); + } + + private: + Gizmo *_gizmo; + GizmoPickCallback _callback; + }; + + Entity createParentEntity(); + Entity createHitTestEntity(Gizmo::Axis axis, Entity parent); + Entity createAxisEntity(Gizmo::Axis axis, Entity parent); + + math::mat4f getRotationForAxis(Gizmo::Axis axis); + Entity getEntityForAxis(Gizmo::Axis axis) + { + switch (axis) + { + case Gizmo::Axis::X: + return _x; + case Gizmo::Axis::Y: + return _y; + case Gizmo::Axis::Z: + return _z; + } + } + + Engine *_engine; + Scene *_scene; + View *_view; + Material *_material; + + utils::Entity _parent; + utils::Entity _x; + utils::Entity _y; + utils::Entity _z; + utils::Entity _xHitTest; + utils::Entity _yHitTest; + utils::Entity _zHitTest; + + std::vector _entities; + std::vector _materialInstances; + + math::float4 activeColors[3]{ + math::float4{1.0f, 1.0f, 0.0f, 0.5f}, + math::float4{1.0f, 1.0f, 0.0f, 0.5f}, + math::float4{1.0f, 1.0f, 0.0f, 0.5f}, + }; + math::float4 inactiveColors[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}, + }; + }; + +} \ No newline at end of file diff --git a/thermion_dart/native/include/scene/GizmoSceneAsset.hpp b/thermion_dart/native/include/scene/GizmoSceneAsset.hpp new file mode 100644 index 00000000..e69de29b diff --git a/thermion_dart/native/include/scene/GltfSceneAsset.hpp b/thermion_dart/native/include/scene/GltfSceneAsset.hpp new file mode 100644 index 00000000..d954880e --- /dev/null +++ b/thermion_dart/native/include/scene/GltfSceneAsset.hpp @@ -0,0 +1,163 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "scene/GltfSceneAssetInstance.hpp" +#include "components/AnimationComponentManager.hpp" +#include "components/CollisionComponentManager.hpp" + +#include "scene/SceneAsset.hpp" + +namespace thermion +{ + + using namespace filament; + + class GltfSceneAsset : public SceneAsset + { + public: + GltfSceneAsset( + gltfio::FilamentAsset *asset, + gltfio::AssetLoader *assetLoader, + Engine *engine, + MaterialInstance **materialInstances = nullptr, + size_t materialInstanceCount = 0, + int instanceIndex = -1) : _asset(asset), + _assetLoader(assetLoader), + _engine(engine), + _materialInstances(materialInstances), + _materialInstanceCount(materialInstanceCount) + { + } + + ~GltfSceneAsset(); + + SceneAsset *createInstance(MaterialInstance **materialInstances = nullptr, size_t materialInstanceCount = 0) override; + + SceneAssetType getType() override + { + return SceneAsset::SceneAssetType::Gltf; + } + + bool isInstance() override + { + return false; + } + + utils::Entity getEntity() override + { + return _asset->getRoot(); + } + + MaterialInstance **getMaterialInstances() override + { + return _materialInstances; + } + + size_t getMaterialInstanceCount() override + { + return _materialInstanceCount; + } + + gltfio::FilamentAsset *getAsset() + { + return _asset; + } + + void addAllEntities(Scene *scene) override + { + scene->addEntities(_asset->getEntities(), _asset->getEntityCount()); + scene->addEntities(_asset->getLightEntities(), _asset->getLightEntityCount()); + scene->addEntities(_asset->getCameraEntities(), _asset->getCameraEntityCount()); + } + + void removeAllEntities(Scene *scene) override + { + scene->removeEntities(_asset->getEntities(), _asset->getEntityCount()); + scene->removeEntities(_asset->getLightEntities(), _asset->getLightEntityCount()); + scene->removeEntities(_asset->getCameraEntities(), _asset->getCameraEntityCount()); + } + + void setPriority(RenderableManager &rm, int priority) override + { + const Entity *entities = _asset->getEntities(); + for (int i = 0; i < _asset->getEntityCount(); i++) + { + if (rm.hasComponent(entities[i])) + { + auto renderableInstance = rm.getInstance(entities[i]); + rm.setPriority(renderableInstance, priority); + } + } + } + + void setLayer(RenderableManager &rm, int layer) override + { + const Entity *entities = _asset->getEntities(); + for (int i = 0; i < _asset->getEntityCount(); i++) + { + if (rm.hasComponent(entities[i])) + { + auto renderableInstance = rm.getInstance(entities[i]); + rm.setLayerMask(renderableInstance, 0xFF, 1u << (uint8_t)layer); + } + } + } + + SceneAsset *getInstanceByEntity(utils::Entity entity) override + { + for (auto &instance : _instances) + { + if (instance->getEntity() == entity) + { + return instance.get(); + } + } + return std::nullptr_t(); + } + + SceneAsset *getInstanceAt(size_t index) override + { + auto &asset = _instances[index]; + return asset.get(); + } + + size_t getInstanceCount() override + { + return _instances.size(); + } + + size_t getChildEntityCount() override + { + return _asset->getEntityCount(); + } + + const Entity* getChildEntities() override { + return _asset->getEntities(); + } + + Entity findEntityByName(const char* name) override { + Entity entities[1]; + auto found = _asset->getEntitiesByName(name, entities, 1); + return entities[0]; + } + + private: + gltfio::FilamentAsset *_asset; + gltfio::AssetLoader *_assetLoader; + Engine *_engine; + MaterialInstance **_materialInstances = nullptr; + size_t _materialInstanceCount = 0; + std::vector> _instances; + }; + +} // namespace thermion \ No newline at end of file diff --git a/thermion_dart/native/include/scene/GltfSceneAssetInstance.hpp b/thermion_dart/native/include/scene/GltfSceneAssetInstance.hpp new file mode 100644 index 00000000..1aaf610c --- /dev/null +++ b/thermion_dart/native/include/scene/GltfSceneAssetInstance.hpp @@ -0,0 +1,143 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "scene/SceneAsset.hpp" + +namespace thermion +{ + + using namespace filament; + + class GltfSceneAssetInstance : public SceneAsset + { + public: + GltfSceneAssetInstance( + gltfio::FilamentInstance *instance, + Engine *engine, + MaterialInstance **materialInstances = nullptr, + size_t materialInstanceCount = 0, + int instanceIndex = -1) : _instance(instance), + _materialInstances(materialInstances), + _materialInstanceCount(materialInstanceCount) + { + } + + ~GltfSceneAssetInstance(); + + SceneAsset *createInstance(MaterialInstance **materialInstances = nullptr, size_t materialInstanceCount = 0) override + { + return std::nullptr_t(); + }; + + SceneAssetType getType() override + { + return SceneAsset::SceneAssetType::Gltf; + } + + bool isInstance() override + { + return true; + } + + utils::Entity getEntity() override + { + return _instance->getRoot(); + } + + MaterialInstance **getMaterialInstances() override + { + return _materialInstances; + } + + size_t getMaterialInstanceCount() override + { + return _materialInstanceCount; + } + + gltfio::FilamentInstance *getInstance() + { + return _instance; + } + + void addAllEntities(Scene *scene) override + { + scene->addEntities(_instance->getEntities(), _instance->getEntityCount()); + } + + void removeAllEntities(Scene *scene) override { + scene->removeEntities(_instance->getEntities(), _instance->getEntityCount()); + } + + size_t getInstanceCount() override + { + return 0; + } + + SceneAsset *getInstanceAt(size_t index) override + { + return std::nullptr_t(); + } + + size_t getChildEntityCount() override + { + return _instance->getEntityCount(); + } + + const Entity* getChildEntities() override { + return _instance->getEntities(); + } + + Entity findEntityByName(const char* name) override { + return Entity(); // not currently implemented + } + + SceneAsset *getInstanceByEntity(utils::Entity entity) override { + return std::nullptr_t(); + } + + void setPriority(RenderableManager &rm, int priority) override + { + const Entity *entities = _instance->getEntities(); + for (int i = 0; i < _instance->getEntityCount(); i++) + { + if (rm.hasComponent(entities[i])) + { + auto renderableInstance = rm.getInstance(entities[i]); + rm.setPriority(renderableInstance, priority); + } + } + } + + void setLayer(RenderableManager &rm, int layer) override + { + const Entity *entities = _instance->getEntities(); + for (int i = 0; i < _instance->getEntityCount(); i++) + { + if (rm.hasComponent(entities[i])) + { + auto renderableInstance = rm.getInstance(entities[i]); + rm.setLayerMask(renderableInstance, 0xFF, 1u << (uint8_t)layer); + } + } + } + + + + private: + filament::Engine *_engine; + gltfio::FilamentInstance *_instance; + MaterialInstance **_materialInstances = nullptr; + size_t _materialInstanceCount = 0; + }; + +} // namespace thermion \ No newline at end of file diff --git a/thermion_dart/native/include/GridOverlay.hpp b/thermion_dart/native/include/scene/GridOverlay.hpp similarity index 100% rename from thermion_dart/native/include/GridOverlay.hpp rename to thermion_dart/native/include/scene/GridOverlay.hpp diff --git a/thermion_dart/native/include/scene/SceneAsset.hpp b/thermion_dart/native/include/scene/SceneAsset.hpp new file mode 100644 index 00000000..588716c3 --- /dev/null +++ b/thermion_dart/native/include/scene/SceneAsset.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include + +#include +#include +#include + +#include "CustomGeometry.hpp" +#include "Log.hpp" + +namespace thermion { + +using namespace filament; +using namespace utils; + +class SceneAsset { + + public: + enum SceneAssetType { Gltf, Geometry, Light, Skybox, Ibl, Image, Gizmo }; + + virtual ~SceneAsset() { + + } + virtual SceneAssetType getType() = 0; + + virtual utils::Entity getEntity() { + return utils::Entity::import(0); + } + + virtual bool isInstance() = 0; + + virtual SceneAsset* createInstance(MaterialInstance **materialInstances, size_t materialInstanceCount) = 0; + + virtual MaterialInstance **getMaterialInstances() = 0; + virtual size_t getMaterialInstanceCount() = 0; + virtual void addAllEntities(Scene *scene) = 0; + virtual void removeAllEntities(Scene *scene) = 0; + + virtual size_t getInstanceCount() = 0; + virtual SceneAsset *getInstanceByEntity(utils::Entity entity) = 0; + virtual SceneAsset *getInstanceAt(size_t index) = 0; + virtual size_t getChildEntityCount() = 0; + virtual const Entity* getChildEntities() = 0; + virtual Entity findEntityByName(const char* name) = 0; + + virtual void setPriority(RenderableManager& rm, int mask) = 0; + virtual void setLayer(RenderableManager& rm, int layer) = 0; + + + +}; +} \ No newline at end of file diff --git a/thermion_dart/native/include/scene/SceneManager.hpp b/thermion_dart/native/include/scene/SceneManager.hpp new file mode 100644 index 00000000..05be78fa --- /dev/null +++ b/thermion_dart/native/include/scene/SceneManager.hpp @@ -0,0 +1,350 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "tsl/robin_map.h" + +#include "AnimationManager.hpp" +#include "CustomGeometry.hpp" +#include "Gizmo.hpp" +#include "GridOverlay.hpp" +#include "ResourceBuffer.hpp" +#include "SceneAsset.hpp" + +#include "components/CollisionComponentManager.hpp" + +namespace thermion +{ + + typedef int32_t EntityId; + + using namespace filament; + using namespace filament::gltfio; + using namespace utils; + using std::string; + using std::unique_ptr; + using std::vector; + + class SceneManager + { + public: + SceneManager( + const ResourceLoaderWrapperImpl *const loader, + Engine *engine, + Scene *scene, + const char *uberArchivePath, + Camera *mainCamera); + ~SceneManager(); + + enum LAYERS + { + DEFAULT_ASSETS = 0, + BACKGROUND = 6, + OVERLAY = 7, + }; + + //// + /// @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. + /// + SceneAsset* loadGltf(const char *uri, const char *relativeResourcePath, int numInstances = 1, bool keepData = false); + + //// + /// @brief Load the GLB from the specified path, optionally creating multiple instances. + /// @param uri the path to the asset. Should be either asset:// (representing a Flutter asset), or file:// (representing a filesystem file). + /// @param numInstances the number of instances to create. Must be at least 1. + /// @return an Entity representing the FilamentAsset associated with the loaded FilamentAsset. + /// + SceneAsset* loadGlb(const char *uri, int numInstances, bool keepData); + + /// @brief + /// @param data + /// @param length + /// @param numInstances + /// @param keepData + /// @param priority + /// @param layer + /// @param loadResourcesAsync + /// @return + SceneAsset* loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances = 1, bool keepData = false, int priority = 4, int layer = 0, bool loadResourcesAsync = false); + + /// + /// Creates an instance of the given entity. + /// This may return an instance from a pool of inactive instances; see [remove] for more information. + /// If [materialInstances] is provided, these wil + /// + SceneAsset* createInstance(SceneAsset* asset, MaterialInstance **materialInstances = nullptr, size_t materialInstanceCount = 0); + + /// @brief Removes the asset (and all its child entities) from the scene and "destroys" all resources. + /// If the asset is not an instance, the asset will be deleted. + /// If the asset is an instance, [remove] is not guaranted to delete the asset. It may be returned to a pool of inactive instances. + /// From the user's perspective, this can be considered as destroyed. + /// @param entity + void destroy(SceneAsset* entity); + + /// @brief Destroys all assets, scenes, materials, etc. + /// + void destroyAll(); + + /// @brief + /// @param entityId + void transformToUnitCube(EntityId entityId); + + /// @brief + /// @param entities + /// @param transforms + /// @param numEntities + void queueTransformUpdates(EntityId *entities, math::mat4 *transforms, int numEntities); + + /// @brief + /// @param entity + /// @param viewportCoordX + /// @param viewportCoordY + /// @param x + /// @param y + /// @param z + void queueRelativePositionUpdateWorldAxis(EntityId entity, float viewportCoordX, float viewportCoordY, float x, float y, float z); + + /// @brief + /// @param view + /// @param entityId + /// @param viewportCoordX + /// @param viewportCoordY + void queueRelativePositionUpdateFromViewportVector(View *view, EntityId entityId, float viewportCoordX, float viewportCoordY); + + const utils::Entity *getCameraEntities(EntityId e); + size_t getCameraEntityCount(EntityId e); + const utils::Entity *getLightEntities(EntityId e) noexcept; + size_t getLightEntityCount(EntityId e) noexcept; + + /// @brief + void update(); + + + /// @brief + /// @param data + /// @param length + /// @param name + /// @return + Texture *createTexture(const uint8_t *data, size_t length, const char *name); + + /// @brief + /// @param entityId + /// @param texture + /// @param slotName + /// @param materialIndex + /// @return + bool applyTexture(EntityId entityId, Texture *texture, const char *slotName, int materialIndex); + + /// @brief + /// @param texture + void destroyTexture(Texture *texture); + + /// @brief + /// @param entity + /// @return + bool removeFromScene(EntityId entity); + + /// @brief + /// @param entity + /// @return + bool addToScene(EntityId entity); + + /// @brief + /// @param entity + /// @param onCollisionCallback + /// @param affectsCollidingTransform + void addCollisionComponent(EntityId entity, void (*onCollisionCallback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform); + + /// @brief + /// @param entityId + /// + /// + void removeCollisionComponent(EntityId entityId); + + /// @brief + /// @param entity + void testCollisions(EntityId entity); + + /// @brief returns the number of instances of the FilamentAsset represented by the given entity. + /// @param entityId + /// @return the number of instances + int getInstanceCount(EntityId entityId); + + /// @brief returns an array containing all instances of the FilamentAsset represented by the given entity. + /// @param entityId + void getInstances(EntityId entityId, EntityId *out); + + /// + /// Sets the draw priority for the given entity. See RenderableManager.h for more details. + /// + void setPriority(EntityId entity, int priority); + + /// @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 getScreenSpaceBoundingBox(View *view, EntityId entity); + + /// @brief returns the 3D bounding box of the renderable instance for the given entity. + /// @return the bounding box + /// + Aabb3 getRenderableBoundingBox(EntityId entity); + + /// + /// Creates an entity with the specified geometry/material/normals and adds to the scene. + /// If [keepData] is true, stores + /// + SceneAsset *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 = RenderableManager::PrimitiveType::TRIANGLES, + MaterialInstance **materialInstances = nullptr, + size_t materialInstanceCount = 0, + bool keepData = false); + + + gltfio::MaterialProvider *const getUnlitMaterialProvider() + { + return _unlitMaterialProvider; + } + + gltfio::MaterialProvider *const getUbershaderMaterialProvider() + { + return _ubershaderProvider; + } + + /// @brief + /// @param materialInstance + void destroy(MaterialInstance *materialInstance); + + /// @brief + /// @return + MaterialInstance *createUnlitFixedSizeMaterialInstance(); + + /// @brief + /// @return + MaterialInstance *createUnlitMaterialInstance(); + + /// @brief + /// @param entityId + /// @param layer + void setVisibilityLayer(EntityId entityId, int layer); + + /// @brief + /// @return + Camera *createCamera(); + + /// @brief + /// @param camera + void destroyCamera(Camera *camera); + + /// @brief + /// @return + size_t getCameraCount(); + + /// @brief + /// @param index + /// @return + Camera *getCameraAt(size_t index); + + /// @brief + /// @param view + /// @param scene + /// @return + Gizmo *createGizmo(View *view, Scene *scene); + + + /// @brief + /// @return + Scene *getScene() + { + return _scene; + } + + /// @brief + /// @return + AnimationManager *getAnimationManager() { + return _animationManager.get(); + } + + /// @brief + /// @return + NameComponentManager *getNameComponentManager() { + return _ncm; + } + + Entity getOverlayEntity(size_t index) { + if(index == 0) { + return _gridOverlay->grid(); + } else if(index == 1) { + return _gridOverlay->sphere(); + } + } + + size_t getOverlayEntityCount() { + return 2; + } + + + + private: + gltfio::AssetLoader *_assetLoader = nullptr; + const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; + Engine *_engine = nullptr; + Scene *_scene = nullptr; + Camera *_mainCamera; + + gltfio::MaterialKey _defaultUnlitConfig; + + gltfio::MaterialProvider *_ubershaderProvider = nullptr; + gltfio::MaterialProvider *_unlitMaterialProvider = nullptr; + gltfio::ResourceLoader *_gltfResourceLoader = nullptr; + gltfio::TextureProvider *_stbDecoder = nullptr; + gltfio::TextureProvider *_ktxDecoder = nullptr; + std::mutex _mutex; + std::vector _materialInstances; + + Material *_unlitFixedSizeMaterial = nullptr; + + utils::NameComponentManager *_ncm; + + tsl::robin_map _transformUpdates; + std::set _textures; + std::vector _cameras; + std::vector> _sceneAssets; + std::vector> _gizmos; + + std::unique_ptr _animationManager = std::nullptr_t(); + std::unique_ptr _collisionComponentManager = std::nullptr_t(); + + GridOverlay *_gridOverlay = std::nullptr_t(); + + void _updateTransforms(); + }; +} diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 80b148f6..97220004 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -120,7 +120,8 @@ namespace thermion 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}}; + {-1.0f, 3.0f, 1.0f, 1.0f} + }; static const uint16_t sFullScreenTriangleIndices[3] = {0, 1, 2}; @@ -705,8 +706,8 @@ namespace thermion .width(width) .height(height) .levels(1) - .usage(filament::Texture::Usage::DEPTH_ATTACHMENT | filament::Texture::Usage::SAMPLEABLE) - .format(filament::Texture::InternalFormat::DEPTH32F) + .usage(filament::Texture::Usage::DEPTH_ATTACHMENT | filament::Texture::Usage::STENCIL_ATTACHMENT | filament::Texture::Usage::SAMPLEABLE) + .format(filament::Texture::InternalFormat::DEPTH24_STENCIL8) .build(*_engine); auto rt = filament::RenderTarget::Builder() .texture(RenderTarget::AttachmentPoint::COLOR, rtColor) @@ -767,6 +768,9 @@ namespace thermion view->setStencilBufferEnabled(true); view->setAmbientOcclusionOptions({.enabled = false}); view->setDynamicResolutionOptions({.enabled = false}); + ACESToneMapper tm; + auto colorGrading = ColorGrading::Builder().toneMapper(&tm).build(*_engine); + view->setColorGrading(colorGrading); #if defined(_WIN32) view->setStereoscopicOptions({.enabled = false}); #endif @@ -797,25 +801,6 @@ namespace thermion return nullptr; } - /// @brief - /// - /// - void FilamentViewer::clearEntities() - { - _sceneManager->destroyAll(); - } - - /// @brief - /// @param asset - /// - void FilamentViewer::removeEntity(EntityId asset) - { - _renderMutex.lock(); - // todo - what if we are using a camera from this asset? - _sceneManager->remove(asset); - _renderMutex.unlock(); - } - /// /// /// @@ -1046,8 +1031,7 @@ namespace thermion uint64_t frameTimeInNanos) { - _sceneManager->updateTransforms(); - _sceneManager->updateAnimations(); + _sceneManager->update(); for(auto swapChain : _swapChains) { auto views = _renderable[swapChain]; @@ -1091,7 +1075,6 @@ namespace thermion } }; - // Create a fence Fence *fence = nullptr; if (useFence) { @@ -1127,7 +1110,7 @@ namespace thermion { if(swapChain && !_engine->isValid(swapChain)) { - Log("SWAPCHAIN PROVIDED BUT NOT VALID"); + Log("SwapChain exists, but is not valid"); return; } @@ -1191,21 +1174,9 @@ namespace thermion return _engine->getCameraComponent(Entity::import(entity)); } - bool FilamentViewer::isNonPickableEntity(EntityId entityId) { - auto renderable = Entity::import(entityId); - return _sceneManager->isGizmoEntity(renderable) || renderable == _imageEntity || renderable == _sceneManager->_gridOverlay->sphere() || _sceneManager->_gridOverlay->grid(); - } - - void FilamentViewer::pick(View *view, uint32_t x, uint32_t y, PickCallback callback) - { - view->pick(x, y, [=](filament::View::PickingQueryResult const &result) { - callback(Entity::smuggle(result.renderable), x, y, view, result.depth, result.fragCoords.x, result.fragCoords.y, result.fragCoords.z); - }); - } - 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); + // const auto *geometry = _sceneManager->getGeometry(entityId); // if (!geometry->uvs) // { // Log("No UVS"); diff --git a/thermion_dart/native/src/Gizmo.cpp b/thermion_dart/native/src/Gizmo.cpp deleted file mode 100644 index 93271ddc..00000000 --- a/thermion_dart/native/src/Gizmo.cpp +++ /dev/null @@ -1,345 +0,0 @@ -#include "Gizmo.hpp" - -#include -#include -#include -#include -#include -#include -#include "SceneManager.hpp" -#include "material/unlit_fixed_size.h" -#include "Log.hpp" - -namespace thermion { - -using namespace filament::gltfio; - -Gizmo::Gizmo(Engine *engine, View *view, Scene* scene, Material* material) : _engine(engine), _view(view), _scene(scene), _material(material) -{ - - auto &entityManager = EntityManager::get(); - - auto &transformManager = _engine->getTransformManager(); - - // 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("baseColorFactor", math::float4{0.0f, 0.0f, 0.0f, 1.0f}); // Black color - - // Create center cube vertices - float centerCubeSize = 0.01f; - 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}, - {centerCubeSize, centerCubeSize, centerCubeSize}}) - .material(0, _materialInstances[3]) - .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) - .priority(7) - .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.6f; - float lineWidth = 0.004f; - float arrowLength = 0.06f; - float arrowWidth = 0.02f; - 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); })); - - // Create the three axes - for (int i = 0; i < 3; i++) - { - _entities[i] = entityManager.create(); - _materialInstances[i] = _material->createInstance(); - - auto baseColor = inactiveColors[i]; - - math::mat4f transform; - - 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; - } - - _materialInstances[i]->setParameter("baseColorFactor", baseColor); - - RenderableManager::Builder(1) - .boundingBox({{-arrowWidth, -arrowWidth, 0}, - {arrowWidth, arrowWidth, lineLength + arrowLength}}) - .material(0, _materialInstances[i]) - .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, ib, 0, 54) - .priority(6) - .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) - .culling(false) - .receiveShadows(false) - .castShadows(false) - .build(*engine, _entities[i]); - - - auto instance = transformManager.getInstance(_entities[i]); - transformManager.setTransform(instance, transform); - - // parent the axis to the center cube - transformManager.setParent(instance, cubeTransformInstance); - - } - - createTransparentRectangles(); -} - -Gizmo::~Gizmo() { - _scene->removeEntities(_entities, 7); - - for(int i = 0; i < 7; i++) { - _engine->destroy(_entities[i]); - } - - for(int i = 0; i < 7; i++) { - _engine->destroy(_materialInstances[i]); - } - - _engine->destroy(_material); - -} - -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, 1u << SceneManager::LAYERS::OVERLAY) - .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); - auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, 0); - - math::float4 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::float4 { 1.0f, 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::float4 baseColor = inactiveColors[i]; - materialInstance->setParameter("color", baseColor); - } -} - -void Gizmo::pick(uint32_t x, uint32_t y, PickCallback callback) - { - auto handler = new Gizmo::PickCallbackHandler(this, callback); - _view->pick(x, y, [=](filament::View::PickingQueryResult const &result) { - handler->handle(result); - }); - } - -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); - } -} -} - diff --git a/thermion_dart/native/src/GridOverlay.cpp b/thermion_dart/native/src/GridOverlay.cpp index 7b967a3f..274fd19d 100644 --- a/thermion_dart/native/src/GridOverlay.cpp +++ b/thermion_dart/native/src/GridOverlay.cpp @@ -3,7 +3,7 @@ #include #endif -#include "GridOverlay.hpp" +#include "scene/GridOverlay.hpp" #include #include @@ -13,190 +13,190 @@ #include #include "material/grid.h" -#include "SceneManager.hpp" +#include "scene/SceneManager.hpp" #include "Log.hpp" -namespace thermion { - -using namespace filament::gltfio; - -GridOverlay::GridOverlay(Engine &engine) : _engine(engine) +namespace thermion { - 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 + using namespace filament::gltfio; - float* gridVertices = new float[vertexCount * 3]; - int index = 0; + GridOverlay::GridOverlay(Engine &engine) : _engine(engine) + { + auto &entityManager = EntityManager::get(); + auto &transformManager = engine.getTransformManager(); - // Create grid lines - for (int i = 0; i <= gridSize; ++i) { - float pos = i * gridSpacing - (gridSize * gridSpacing / 2); + const int gridSize = 100; + const float gridSpacing = 1.0f; + int vertexCount = (gridSize + 1) * 4; // 2 axes, 2 vertices per line - // X-axis lines - gridVertices[index++] = pos; - gridVertices[index++] = 0; - gridVertices[index++] = -(gridSize * gridSpacing / 2); + float *gridVertices = new float[vertexCount * 3]; + int index = 0; - gridVertices[index++] = pos; - gridVertices[index++] = 0; - gridVertices[index++] = (gridSize * gridSpacing / 2); + // Create grid lines + for (int i = 0; i <= gridSize; ++i) + { + float pos = i * gridSpacing - (gridSize * gridSpacing / 2); - // Z-axis lines - gridVertices[index++] = -(gridSize * gridSpacing / 2); - gridVertices[index++] = 0; - gridVertices[index++] = pos; + // X-axis lines + gridVertices[index++] = pos; + gridVertices[index++] = 0; + gridVertices[index++] = -(gridSize * gridSpacing / 2); - gridVertices[index++] = (gridSize * gridSpacing / 2); - gridVertices[index++] = 0; - gridVertices[index++] = pos; + 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(); + _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) + .geometry(0, RenderableManager::PrimitiveType::LINES, vb, ib, 0, vertexCount) + .priority(0) + .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) + .culling(true) + .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(0) + .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) + .culling(true) + .receiveShadows(false) + .castShadows(false) + .build(engine, _sphereEntity); } - 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; + 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); } - 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(); - _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) - .geometry(0, RenderableManager::PrimitiveType::LINES, vb, ib, 0, vertexCount) - .priority(6) - .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) - .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, 1u << SceneManager::LAYERS::OVERLAY) - .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 \ No newline at end of file diff --git a/thermion_dart/native/src/HighlightOverlay.cpp b/thermion_dart/native/src/HighlightOverlay.cpp index a477a6a9..7a6e4044 100644 --- a/thermion_dart/native/src/HighlightOverlay.cpp +++ b/thermion_dart/native/src/HighlightOverlay.cpp @@ -1,172 +1,178 @@ -#include -#include -#include +// #include +// #include +// #include -#include "SceneManager.hpp" +// #include "scene/SceneManager.hpp" -namespace thermion -{ +// namespace thermion +// { - SceneManager::HighlightOverlay::HighlightOverlay( - EntityId entityId, - SceneManager *const sceneManager, - Engine *engine, - float r, - float g, - float b) : _sceneManager(sceneManager), _engine(engine) - { +// 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 &rm = engine->getRenderableManager(); - auto &tm = engine->getTransformManager(); +// 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 +// // 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(); +// 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::REPLACE); - _highlightMaterialInstance->setStencilCompareFunction(filament::backend::SamplerCompareFunc::NE); - _highlightMaterialInstance->setStencilReferenceValue(1); +// _highlightMaterialInstance = materialProvider->createMaterialInstance(&dummyKey, &dummyUvMap); +// _highlightMaterialInstance->setStencilOpStencilFail(filament::backend::StencilOperation::KEEP); +// _highlightMaterialInstance->setStencilOpDepthFail(filament::backend::StencilOperation::KEEP); +// _highlightMaterialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::REPLACE); +// _highlightMaterialInstance->setStencilCompareFunction(filament::backend::SamplerCompareFunc::NE); +// _highlightMaterialInstance->setStencilReferenceValue(1); - _highlightMaterialInstance->setParameter("baseColorFactor", filament::math::float3{r, g, b}); - _highlightMaterialInstance->setParameter("vertexScale", 1.04f); - _highlightMaterialInstance->setCullingMode(filament::backend::CullingMode::FRONT); +// _highlightMaterialInstance->setParameter("baseColorFactor", filament::math::float3{r, g, b}); +// _highlightMaterialInstance->setParameter("vertexScale", 1.04f); +// _highlightMaterialInstance->setCullingMode(filament::backend::CullingMode::FRONT); +// auto scene = sceneManager->getScene(); - auto scene = sceneManager->getScene(); +// // _isGeometryEntity = sceneManager->isGeometryEntity(entityId); +// // _isGltfAsset = sceneManager->isGltfAsset(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 || _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) +// { - if (_isGeometryEntity) - { +// auto geometryEntity = Entity::import(entityId); +// auto renderable = rm.getInstance(geometryEntity); - auto geometryEntity = Entity::import(entityId); - auto renderable = rm.getInstance(geometryEntity); +// auto materialInstance = rm.getMaterialInstanceAt(renderable, 0); - 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::KEEP); +// materialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::KEEP); +// materialInstance->setStencilCompareFunction(filament::backend::SamplerCompareFunc::A); +// // materialInstance->setCullingMode(filament::MaterialInstance::CullingMode::BACK); - // 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::KEEP); - materialInstance->setStencilOpDepthStencilPass(filament::backend::StencilOperation::KEEP); - materialInstance->setStencilCompareFunction(filament::backend::SamplerCompareFunc::A); - // materialInstance->setCullingMode(filament::MaterialInstance::CullingMode::BACK); +// // auto geometry = sceneManager->getGeometry(entityId); - auto geometry = sceneManager->getGeometry(entityId); +// // _entity = geometry->createInstance(materialInstance); - _entity = geometry->createInstance(materialInstance); +// scene->addEntity(_entity); +// auto outlineTransformInstance = tm.getInstance(_entity); +// auto entityTransformInstance = tm.getInstance(geometryEntity); +// tm.setParent(outlineTransformInstance, entityTransformInstance); +// } +// else if (_isGltfAsset) +// { +// Log("Entity %d is gltf", entityId); +// // auto *asset = sceneManager->getAssetByEntityId(entityId); - scene->addEntity(_entity); - auto outlineTransformInstance = tm.getInstance(_entity); - auto entityTransformInstance = tm.getInstance(geometryEntity); - tm.setParent(outlineTransformInstance, entityTransformInstance); - } - else if (_isGltfAsset) - { - Log("Entity %d is gltf", entityId); - auto *asset = sceneManager->getAssetByEntityId(entityId); +// // if (asset) +// // { - if (asset) - { +// // Log("Found glTF FilamentAsset with %d material instances", asset->getInstance()->getMaterialInstanceCount()); - Log("Found glTF FilamentAsset with %d material instances", asset->getInstance()->getMaterialInstanceCount()); +// // auto materialInstance = asset->getInstance()->getMaterialInstances()[0]; - 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); - // 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); +// // _newInstance = sceneManager->createGltfAssetInstance(asset); - _newInstance = sceneManager->createGltfAssetInstance(asset); +// // _entity = _newInstance->getRoot(); - _entity = _newInstance->getRoot(); +// // auto newTransformInstance = tm.getInstance(_entity); - auto newTransformInstance = tm.getInstance(_entity); +// // 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++) +// // { +// // 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()); +// // } +// } +// else +// { +// Log("Not FilamentAsset"); +// } +// } + - 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++) - { - 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()); - } - } - else - { - Log("Not FilamentAsset"); - } - } - } +// SceneManager::HighlightOverlay::~HighlightOverlay() +// { +// if (_entity.isNull()) +// { +// Log("Null entity"); +// return; +// } - SceneManager::HighlightOverlay::~HighlightOverlay() - { - if (_entity.isNull()) - { - Log("Null entity"); - return; - } - - if (_isGltfAsset) - { - _sceneManager->getScene()->removeEntities(_newInstance->getEntities(), _newInstance->getEntityCount()); - _newInstance->detachMaterialInstances(); - _engine->destroy(_highlightMaterialInstance); - } - 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 - { - Log("FATAL: Unknown highlight overlay entity type"); - } - } -} \ No newline at end of file +// if (_isGltfAsset) +// { +// Log("Destroyed gltf asset highlight overlay"); +// _sceneManager->getScene()->removeEntities(_newInstance->getEntities(), _newInstance->getEntityCount()); +// // _sceneManager->destroyGltfAssetInstance(_newInstance); +// // auto materialInstances = _newInstance->getMaterialInstances(); +// // auto numMaterialInstances = _newInstance->getMaterialInstanceCount(); +// // _newInstance->detachMaterialInstances(); +// // for(int i = 0; i < numMaterialInstances; i++) { +// // _engine->destroy(_highlightMaterialInstance); +// // } +// // _engine->destroy(_newInstance); +// } +// 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 +// { +// Log("FATAL: Unknown highlight overlay entity type"); +// } +// } +// } \ No newline at end of file diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp deleted file mode 100644 index 26af68f9..00000000 --- a/thermion_dart/native/src/SceneManager.cpp +++ /dev/null @@ -1,2584 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "material/FileMaterialProvider.hpp" -#include "material/UnlitMaterialProvider.hpp" -#include "material/unlit.h" - -#include "StreamBufferAdapter.hpp" -#include "Log.hpp" -#include "SceneManager.hpp" -#include "CustomGeometry.hpp" -#include "UnprojectTexture.hpp" - -#include "Gizmo.hpp" - -extern "C" -{ -#include "material/image.h" -#include "material/unlit_fixed_size.h" -} - -namespace thermion -{ - - using namespace std::chrono; - using namespace image; - using namespace utils; - using namespace filament; - using namespace filament::gltfio; - using std::unique_ptr; - - SceneManager::SceneManager(const ResourceLoaderWrapperImpl *const resourceLoaderWrapper, - Engine *engine, - Scene *scene, - const char *uberArchivePath, - Camera *mainCamera) - : _resourceLoaderWrapper(resourceLoaderWrapper), - _engine(engine), - _scene(scene), - _mainCamera(mainCamera) - { - - _stbDecoder = createStbProvider(_engine); - _ktxDecoder = createKtx2Provider(_engine); - - _gltfResourceLoader = new ResourceLoader({.engine = _engine, - .normalizeSkinningWeights = true}); - if (uberArchivePath) - { - auto uberdata = resourceLoaderWrapper->load(uberArchivePath); - if (!uberdata.data) - { - Log("Failed to load ubershader material. This is fatal."); - } - _ubershaderProvider = gltfio::createUbershaderProvider(_engine, uberdata.data, uberdata.size); - resourceLoaderWrapper->free(uberdata); - } - else - { - _ubershaderProvider = gltfio::createUbershaderProvider( - _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); - - _assetLoader = AssetLoader::create({_engine, _ubershaderProvider, _ncm, &em}); - - _gltfResourceLoader->addTextureProvider("image/ktx2", _ktxDecoder); - _gltfResourceLoader->addTextureProvider("image/png", _stbDecoder); - _gltfResourceLoader->addTextureProvider("image/jpeg", _stbDecoder); - - auto &tm = _engine->getTransformManager(); - - _collisionComponentManager = new CollisionComponentManager(tm); - _animationComponentManager = new AnimationComponentManager(tm, _engine->getRenderableManager()); - - _gridOverlay = new GridOverlay(*_engine); - - _scene->addEntity(_gridOverlay->sphere()); - _scene->addEntity(_gridOverlay->grid()); - - _gizmoMaterial = - Material::Builder() - .package(UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_DATA, UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_SIZE) - .build(*_engine); - } - - SceneManager::~SceneManager() - { - for (auto camera : _cameras) - { - auto entity = camera->getEntity(); - _engine->destroyCameraComponent(entity); - _engine->getEntityManager().destroy(entity); - } - _cameras.clear(); - - _gridOverlay->destroy(); - destroyAll(); - - _gltfResourceLoader->asyncCancelLoad(); - _ubershaderProvider->destroyMaterials(); - - delete _animationComponentManager; - delete _collisionComponentManager; - delete _ncm; - - delete _gltfResourceLoader; - delete _stbDecoder; - delete _ktxDecoder; - delete _ubershaderProvider; - AssetLoader::destroy(&_assetLoader); - } - - Gizmo *SceneManager::createGizmo(View *view, Scene *scene) - { - return new Gizmo(_engine, view, scene, _gizmoMaterial); - } - - bool SceneManager::isGizmoEntity(Entity entity) - { - return false; // TODO - } - - int SceneManager::getInstanceCount(EntityId entityId) - { - auto *asset = getAssetByEntityId(entityId); - if (!asset) - { - return -1; - } - - return asset->getAssetInstanceCount(); - } - - void SceneManager::getInstances(EntityId entityId, EntityId *out) - { - auto *asset = getAssetByEntityId(entityId); - if (!asset) - { - return; - } - auto *instances = asset->getAssetInstances(); - for (int i = 0; i < asset->getAssetInstanceCount(); i++) - { - auto instanceEntity = instances[i]->getRoot(); - out[i] = Entity::smuggle(instanceEntity); - } - } - - EntityId SceneManager::loadGltf(const char *uri, - const char *relativeResourcePath, - bool keepData) - { - ResourceBuffer rbuf = _resourceLoaderWrapper->load(uri); - - FilamentAsset *asset = _assetLoader->createAsset((uint8_t *)rbuf.data, rbuf.size); - - if (!asset) - { - Log("Unable to parse asset"); - return 0; - } - - const char *const *const resourceUris = asset->getResourceUris(); - const size_t resourceUriCount = asset->getResourceUriCount(); - - std::vector resourceBuffers; - - for (size_t i = 0; i < resourceUriCount; i++) - { - std::string uri = std::string(relativeResourcePath) + std::string("/") + std::string(resourceUris[i]); - ResourceBuffer buf = _resourceLoaderWrapper->load(uri.c_str()); - - resourceBuffers.push_back(buf); - - ResourceLoader::BufferDescriptor b(buf.data, buf.size); - _gltfResourceLoader->addResourceData(resourceUris[i], std::move(b)); - } - -#ifdef __EMSCRIPTEN__ - if (!_gltfResourceLoader->asyncBeginLoad(asset)) - { - Log("Unknown error loading glTF asset"); - _resourceLoaderWrapper->free(rbuf); - for (auto &rb : resourceBuffers) - { - _resourceLoaderWrapper->free(rb); - } - return 0; - } - while (_gltfResourceLoader->asyncGetLoadProgress() < 1.0f) - { - _gltfResourceLoader->asyncUpdateLoad(); - } -#else - // load resources synchronously - if (!_gltfResourceLoader->loadResources(asset)) - { - Log("Unknown error loading glTF asset"); - _resourceLoaderWrapper->free(rbuf); - for (auto &rb : resourceBuffers) - { - _resourceLoaderWrapper->free(rb); - } - return 0; - } -#endif - - _scene->addEntities(asset->getEntities(), asset->getEntityCount()); - - FilamentInstance *inst = asset->getInstance(); - inst->getAnimator()->updateBoneMatrices(); - inst->recomputeBoundingBoxes(); - - if (!keepData) - { - asset->releaseSourceData(); - } - - EntityId eid = Entity::smuggle(asset->getRoot()); - - _assets.emplace(eid, asset); - - for (auto &rb : resourceBuffers) - { - _resourceLoaderWrapper->free(rb); - } - _resourceLoaderWrapper->free(rbuf); - - Log("Finished loading glTF from %s", uri); - - 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("SceneManager::setVisibilityLayer - entity %d has no Renderable component", entityId); - return; - } - - rm.setLayerMask(renderable, 0xFF, 1u << layer); - } - - EntityId SceneManager::loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances, bool keepData, int priority, int layer, bool loadResourcesAsync) - { - - FilamentAsset *asset = nullptr; - if (numInstances > 1) - { - std::vector instances(numInstances); - asset = _assetLoader->createInstancedAsset((const uint8_t *)data, length, instances.data(), numInstances); - } - else - { - asset = _assetLoader->createAsset(data, length); - } - - if (!asset) - { - Log("Unknown error loading GLB asset."); - return 0; - } - - size_t entityCount = asset->getEntityCount(); - - _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)) - { - Log("Unknown error loading glb asset"); - return 0; - } - while (_gltfResourceLoader->asyncGetLoadProgress() < 1.0f) - { - _gltfResourceLoader->asyncUpdateLoad(); - } -#else - if (loadResourcesAsync) - { - if (!_gltfResourceLoader->asyncBeginLoad(asset)) - { - Log("Unknown error loading glb asset"); - return 0; - } - } - else - { - if (!_gltfResourceLoader->loadResources(asset)) - { - Log("Unknown error loading glb asset"); - return 0; - } - } -#endif - - auto lights = asset->getLightEntities(); - _scene->addEntities(lights, asset->getLightEntityCount()); - - for (int i = 0; i < asset->getAssetInstanceCount(); i++) - { - FilamentInstance *inst = asset->getAssetInstances()[i]; - inst->getAnimator()->updateBoneMatrices(); - inst->recomputeBoundingBoxes(); - auto instanceEntity = inst->getRoot(); - auto instanceEntityId = Entity::smuggle(instanceEntity); - _instances.emplace(instanceEntityId, inst); - } - - if (!keepData) - { - asset->releaseSourceData(); - } - - EntityId eid = Entity::smuggle(asset->getRoot()); - _assets.emplace(eid, asset); - return eid; - } - - void SceneManager::removeAnimationComponent(EntityId entityId) - { - - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - } - - if (instance) - { - _animationComponentManager->removeAnimationComponent(instance); - } - else - { - _animationComponentManager->removeAnimationComponent(Entity::import(entityId)); - } - } - - bool SceneManager::addAnimationComponent(EntityId entityId) - { - - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - } - - if (instance) - { - _animationComponentManager->addAnimationComponent(instance); - } - else - { - _animationComponentManager->addAnimationComponent(Entity::import(entityId)); - } - return true; - } - - EntityId SceneManager::createInstance(EntityId entityId) - { - std::lock_guard lock(_mutex); - - if(isGeometryEntity(entityId)) { - auto geometry = getGeometry(entityId); - auto materialInstance = createUnlitMaterialInstance(); - auto instanceEntity = geometry->createInstance(materialInstance); - _scene->addEntity(instanceEntity); - - return Entity::smuggle(instanceEntity); - } - - const auto &pos = _assets.find(entityId); - if (pos == _assets.end()) - { - Log("Couldn't find asset under specified entity id."); - return 0; - } - - const auto asset = pos->second; - auto instance = _assetLoader->createInstance(asset); - - 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, bool keepData) - { - ResourceBuffer rbuf = _resourceLoaderWrapper->load(uri); - auto entity = loadGlbFromBuffer((const uint8_t *)rbuf.data, rbuf.size, numInstances, keepData); - _resourceLoaderWrapper->free(rbuf); - return entity; - } - - bool SceneManager::hide(EntityId entityId, const char *meshName) - { - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - // Log("Failed to find glTF instance under entityID %d, hiding as regular entity", entityId); - _scene->remove(Entity::import(entityId)); - return true; - } - } - - utils::Entity entity; - - if (meshName) - { - entity = findEntityByName(instance, meshName); - if (entity.isNull()) - { - Log("Failed to hide entity; specified mesh name does not exist under the target entity, or the target entity itself is no longer valid."); - return false; - } - _scene->remove(entity); - } - else - { - auto *entities = instance->getEntities(); - for (int i = 0; i < instance->getEntityCount(); i++) - { - auto entity = entities[i]; - _scene->remove(entity); - } - } - - return true; - } - - bool SceneManager::reveal(EntityId entityId, const char *meshName) - { - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - // Log("Failed to find glTF instance under entityID %d, revealing as regular entity", entityId); - _scene->addEntity(Entity::import(entityId)); - return true; - } - } - - utils::Entity entity; - - if (meshName) - { - entity = findEntityByName(instance, meshName); - if (entity.isNull()) - { - Log("Failed to reveal entity; specified mesh name does not exist under the target entity, or the target entity itself is no longer valid."); - return false; - } - _scene->addEntity(entity); - } - else - { - // Log("Revealing all child entities"); - auto *entities = instance->getEntities(); - for (int i = 0; i < instance->getEntityCount(); i++) - { - auto entity = entities[i]; - _scene->addEntity(entity); - } - } - - return true; - } - - void SceneManager::destroyAll() - { - std::lock_guard lock(_mutex); - - for (auto &asset : _assets) - { - auto numInstances = asset.second->getAssetInstanceCount(); - for (int i = 0; i < numInstances; i++) - { - auto instance = asset.second->getAssetInstances()[i]; - for (int j = 0; j < instance->getEntityCount(); j++) - { - auto childEntity = instance->getEntities()[j]; - if (_collisionComponentManager->hasComponent(childEntity)) - { - _collisionComponentManager->removeComponent(childEntity); - } - if (_animationComponentManager->hasComponent(childEntity)) - { - _animationComponentManager->removeComponent(childEntity); - } - } - } - - _scene->removeEntities(asset.second->getEntities(), - asset.second->getEntityCount()); - _scene->removeEntities(asset.second->getLightEntities(), - asset.second->getLightEntityCount()); - _assetLoader->destroyAsset(asset.second); - } - for (auto *texture : _textures) - { - _engine->destroy(texture); - } - - for (auto *materialInstance : _materialInstances) - { - _engine->destroy(materialInstance); - } - - - // TODO - free geometry? - _textures.clear(); - _assets.clear(); - _materialInstances.clear(); - } - - FilamentInstance *SceneManager::getInstanceByEntityId(EntityId entityId) - { - const auto &pos = _instances.find(entityId); - if (pos == _instances.end()) - { - return nullptr; - } - return pos->second; - } - - FilamentAsset *SceneManager::getAssetByEntityId(EntityId entityId) - { - const auto &pos = _assets.find(entityId); - if (pos == _assets.end()) - { - return nullptr; - } - return pos->second; - } - - math::mat4f SceneManager::getLocalTransform(EntityId entityId) - { - auto entity = Entity::import(entityId); - auto &tm = _engine->getTransformManager(); - auto transformInstance = tm.getInstance(entity); - return tm.getTransform(transformInstance); - } - - math::mat4f SceneManager::getWorldTransform(EntityId entityId) - { - auto entity = Entity::import(entityId); - auto &tm = _engine->getTransformManager(); - auto transformInstance = tm.getInstance(entity); - return tm.getWorldTransform(transformInstance); - } - - EntityId SceneManager::getBone(EntityId entityId, int skinIndex, int boneIndex) - { - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - Log("Failed to find glTF instance under entityID %d, revealing as regular entity", entityId); - return false; - } - } - auto joints = instance->getJointsAt(skinIndex); - auto joint = joints[boneIndex]; - return Entity::smuggle(joint); - } - - math::mat4f SceneManager::getInverseBindMatrix(EntityId entityId, int skinIndex, int boneIndex) - { - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - Log("Failed to find glTF instance under entityID %d, revealing as regular entity", entityId); - return math::mat4f(); - } - } - auto inverseBindMatrix = instance->getInverseBindMatricesAt(skinIndex)[boneIndex]; - return inverseBindMatrix; - } - - bool SceneManager::setBoneTransform(EntityId entityId, int32_t skinIndex, int boneIndex, math::mat4f transform) - { - std::lock_guard lock(_mutex); - - const auto &entity = Entity::import(entityId); - - RenderableManager &rm = _engine->getRenderableManager(); - - const auto &renderableInstance = rm.getInstance(entity); - - if (!renderableInstance.isValid()) - { - Log("Specified entity is not a renderable. You probably provided the ultimate parent entity of a glTF asset, which is non-renderable. "); - return false; - } - - rm.setBones( - renderableInstance, - &transform, - 1, - boneIndex); - return true; - } - - void SceneManager::remove(EntityId entityId) - { - - std::lock_guard lock(_mutex); - - auto entity = Entity::import(entityId); - - if (_animationComponentManager->hasComponent(entity)) - { - _animationComponentManager->removeComponent(entity); - } - - if (_collisionComponentManager->hasComponent(entity)) - { - _collisionComponentManager->removeComponent(entity); - } - - _scene->remove(entity); - - if (isGeometryEntity(entityId)) - { - return; - } else if(isGeometryInstance(entityId)) { - // destroy renderable - auto & rm = _engine->getRenderableManager(); - auto & em = _engine->getEntityManager(); - auto instanceEntity = utils::Entity::import(entityId); - auto it = std::find(_geometryInstances.begin(), _geometryInstances.end(), entityId); - _geometryInstances.erase(it); - rm.destroy(instanceEntity); - em.destroy(instanceEntity); - _engine->destroy(instanceEntity); - return; - } - const auto *instance = getInstanceByEntityId(entityId); - - if (instance) - { - _instances.erase(entityId); - _scene->removeEntities(instance->getEntities(), instance->getEntityCount()); - for (int i = 0; i < instance->getEntityCount(); i++) - { - auto childEntity = instance->getEntities()[i]; - if (_collisionComponentManager->hasComponent(childEntity)) - { - _collisionComponentManager->removeComponent(childEntity); - } - if (_animationComponentManager->hasComponent(childEntity)) - { - _animationComponentManager->removeComponent(childEntity); - } - } - } - else - { - auto *asset = getAssetByEntityId(entityId); - - if (!asset) - { - return; - } - _assets.erase(entityId); - - _scene->removeEntities(asset->getEntities(), asset->getEntityCount()); - - _animationComponentManager->removeComponent(asset->getInstance()->getRoot()); - - for (int i = 0; i < asset->getEntityCount(); i++) - { - auto childEntity = asset->getEntities()[i]; - if (_collisionComponentManager->hasComponent(childEntity)) - { - _collisionComponentManager->removeComponent(childEntity); - } - if (_animationComponentManager->hasComponent(childEntity)) - { - _animationComponentManager->removeComponent(childEntity); - } - } - - auto lightCount = asset->getLightEntityCount(); - if (lightCount > 0) - { - _scene->removeEntities(asset->getLightEntities(), - asset->getLightEntityCount()); - } - _assetLoader->destroyAsset(asset); - } - } - - bool SceneManager::setMorphTargetWeights(EntityId entityId, const float *const weights, const int count) - { - std::lock_guard lock(_mutex); - - auto entity = Entity::import(entityId); - if (entity.isNull()) - { - Log("Warning: null entity %d", entityId); - return false; - } - - RenderableManager &rm = _engine->getRenderableManager(); - - auto renderableInstance = rm.getInstance(entity); - - if (!renderableInstance.isValid()) - { - Log("Warning: failed to find a valid renderable instance for child entity %d", entityId); - return false; - } - - rm.setMorphWeights( - renderableInstance, - weights, - count); - return true; - } - - utils::Entity SceneManager::findChildEntityByName(EntityId entityId, const char *entityName) - { - std::lock_guard lock(_mutex); - - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (!asset) - { - return utils::Entity(); - } - instance = asset->getInstance(); - } - - const auto entity = findEntityByName(instance, entityName); - - if (entity.isNull()) - { - Log("Failed to find entity %s.", entityName); - } - - return entity; - } - - utils::Entity SceneManager::findEntityByName(const FilamentInstance *instance, const char *entityName) - { - utils::Entity entity; - for (size_t i = 0, c = instance->getEntityCount(); i != c; ++i) - { - auto entity = instance->getEntities()[i]; - auto nameInstance = _ncm->getInstance(entity); - if (!nameInstance.isValid()) - { - continue; - } - auto name = _ncm->getName(nameInstance); - if (!name) - { - continue; - } - if (strcmp(entityName, name) == 0) - { - return entity; - } - } - return entity; - } - - bool SceneManager::setMorphAnimationBuffer( - EntityId entityId, - const float *const morphData, - const uint32_t *const morphIndices, - int numMorphTargets, - int numFrames, - float frameLengthInMs) - { - std::lock_guard lock(_mutex); - - auto entity = Entity::import(entityId); - - if (entity.isNull()) - { - Log("ERROR: invalid entity %d.", entityId); - return false; - } - - if (!_animationComponentManager->hasComponent(entity)) - { - _animationComponentManager->addAnimationComponent(entity); - } - - MorphAnimation morphAnimation; - - morphAnimation.meshTarget = entity; - morphAnimation.frameData.clear(); - morphAnimation.frameData.insert( - morphAnimation.frameData.begin(), - morphData, - morphData + (numFrames * numMorphTargets)); - morphAnimation.frameLengthInMs = frameLengthInMs; - morphAnimation.morphIndices.resize(numMorphTargets); - for (int i = 0; i < numMorphTargets; i++) - { - morphAnimation.morphIndices[i] = morphIndices[i]; - } - morphAnimation.durationInSecs = (frameLengthInMs * numFrames) / 1000.0f; - - morphAnimation.start = high_resolution_clock::now(); - morphAnimation.lengthInFrames = static_cast( - morphAnimation.durationInSecs * 1000.0f / - frameLengthInMs); - - auto animationComponentInstance = _animationComponentManager->getInstance(entity); - auto &animationComponent = _animationComponentManager->elementAt<0>(animationComponentInstance); - auto &morphAnimations = animationComponent.morphAnimations; - - morphAnimations.emplace_back(morphAnimation); - return true; - } - - void SceneManager::clearMorphAnimationBuffer( - EntityId entityId) - { - std::lock_guard lock(_mutex); - - auto entity = Entity::import(entityId); - - if (entity.isNull()) - { - Log("ERROR: invalid entity %d.", entityId); - return; - } - - auto animationComponentInstance = _animationComponentManager->getInstance(entity); - auto &animationComponent = _animationComponentManager->elementAt<0>(animationComponentInstance); - auto &morphAnimations = animationComponent.morphAnimations; - - morphAnimations.clear(); - return; - } - - bool SceneManager::setMaterialColor(EntityId entityId, const char *meshName, int materialIndex, const float r, const float g, const float b, const float a) - { - - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return false; - } - } - - auto entity = findEntityByName(instance, meshName); - - RenderableManager &rm = _engine->getRenderableManager(); - - auto renderable = rm.getInstance(entity); - - if (!renderable.isValid()) - { - Log("Renderable not valid, was the entity id correct?"); - return false; - } - - MaterialInstance *mi = rm.getMaterialInstanceAt(renderable, materialIndex); - - if (!mi) - { - Log("ERROR: material index must be less than number of material instances"); - return false; - } - mi->setParameter("baseColorFactor", RgbaType::sRGB, math::float4(r, g, b, a)); - Log("Set baseColorFactor for entity %d to %f %f %f %f", entityId, r, g, b, a); - return true; - } - - void SceneManager::resetBones(EntityId entityId) - { - std::lock_guard lock(_mutex); - - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return; - } - } - auto skinCount = instance->getSkinCount(); - - 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 - // 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. - // - // This can be calculated as: - // - // auto rest = inverse(parentTransformInModelSpace) * bindMatrix - // - // (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. - // We ensure that parents are reset before children by: - // - pushing all bones onto a stack - // - iterate over the stack - // - look at the bone at the top of the stack - // - if the bone already been reset, pop and continue iterating over the stack - // - otherwise - // - if the bone has a parent that has not been reset, push the parent to the top of the stack and continue iterating - // - otherwise - // - 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::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]; - auto transformInstance = transformManager.getInstance(joint); - transformManager.setTransform(transformInstance, restTransform); - } - } - instance->getAnimator()->updateBoneMatrices(); - } - - std::unique_ptr> SceneManager::getBoneRestTranforms(EntityId entityId, int skinIndex) - { - - auto transforms = std::make_unique>(); - - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return transforms; - } - } - - auto skinCount = instance->getSkinCount(); - - TransformManager &transformManager = _engine->getTransformManager(); - - 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 - // 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. - // - // This can be calculated as: - // - // auto rest = inverse(parentTransformInModelSpace) * bindMatrix - // - // (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. - // We ensure that parents are reset before children by: - // - pushing all bones onto a stack - // - iterate over the stack - // - look at the bone at the top of the stack - // - if the bone already been reset, pop and continue iterating over the stack - // - otherwise - // - if the bone has a parent that has not been reset, push the parent to the top of the stack and continue iterating - // - otherwise - // - pop the bone, reset its transform and mark it as completed - std::vector joints; - std::unordered_set completed; - std::stack stack; - - for (int i = 0; i < instance->getJointCountAt(skinIndex); i++) - { - const auto &joint = instance->getJointsAt(skinIndex)[i]; - joints.push_back(joint); - stack.push(joint); - } - - while (!stack.empty()) - { - 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()) - { - stack.pop(); - continue; - } - - 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, - // push the parent to the top of the stack and start the loop again - 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()) - { - stack.push(parent); - continue; - } - - // 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) - { - inverseBindMatrix = instance->getInverseBindMatricesAt(skinIndex)[i]; - found = true; - break; - } - } - ASSERT_PRECONDITION(found, "Failed to find inverse bind matrix for joint %d", joint); - - // now we need to ascend back up the hierarchy to calculate the modelSpaceTransform - math::mat4f modelSpaceTransform; - while (parentIter != joints.end()) - { - const auto transformInstance = transformManager.getInstance(parent); - const auto parentIndex = distance(joints.begin(), parentIter); - const auto transform = transforms->at(parentIndex); - modelSpaceTransform = transform * modelSpaceTransform; - parent = transformManager.getParent(transformInstance); - parentIter = std::find(joints.begin(), joints.end(), parent); - } - - const auto bindMatrix = inverse(inverseBindMatrix); - - const auto inverseModelSpaceTransform = inverse(modelSpaceTransform); - - const auto jointIndex = distance(joints.begin(), jointIter); - transforms->at(jointIndex) = inverseModelSpaceTransform * bindMatrix; - completed.insert(joint); - stack.pop(); - } - return transforms; - } - - bool SceneManager::updateBoneMatrices(EntityId entityId) - { - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return false; - } - } - instance->getAnimator()->updateBoneMatrices(); - return true; - } - - 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) - { - return false; - } - tm.setTransform(transformInstance, transform); - return true; - } - - bool SceneManager::setTransform(EntityId entityId, math::mat4 transform) - { - auto &tm = _engine->getTransformManager(); - const auto &entity = Entity::import(entityId); - auto transformInstance = tm.getInstance(entity); - if (!transformInstance) - { - return false; - } - tm.setTransform(transformInstance, transform); - return true; - } - - bool SceneManager::addBoneAnimation(EntityId parentEntity, - int skinIndex, - int boneIndex, - const float *const frameData, - int numFrames, - float frameLengthInMs, - float fadeOutInSecs, - float fadeInInSecs, - float maxDelta) - { - std::lock_guard lock(_mutex); - - auto *instance = getInstanceByEntityId(parentEntity); - if (!instance) - { - auto *asset = getAssetByEntityId(parentEntity); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return false; - } - } - - BoneAnimation animation; - animation.boneIndex = boneIndex; - animation.frameData.clear(); - - const auto &inverseBindMatrix = instance->getInverseBindMatricesAt(skinIndex)[boneIndex]; - - for (int i = 0; i < numFrames; i++) - { - math::mat4f frame( - frameData[i * 16], - frameData[(i * 16) + 1], - frameData[(i * 16) + 2], - frameData[(i * 16) + 3], - frameData[(i * 16) + 4], - frameData[(i * 16) + 5], - frameData[(i * 16) + 6], - frameData[(i * 16) + 7], - frameData[(i * 16) + 8], - frameData[(i * 16) + 9], - frameData[(i * 16) + 10], - frameData[(i * 16) + 11], - frameData[(i * 16) + 12], - frameData[(i * 16) + 13], - frameData[(i * 16) + 14], - frameData[(i * 16) + 15]); - - animation.frameData.push_back(frame); - } - - animation.frameLengthInMs = frameLengthInMs; - animation.start = std::chrono::high_resolution_clock::now(); - animation.reverse = false; - animation.durationInSecs = (frameLengthInMs * numFrames) / 1000.0f; - animation.lengthInFrames = numFrames; - animation.frameLengthInMs = frameLengthInMs; - animation.fadeOutInSecs = fadeOutInSecs; - animation.fadeInInSecs = fadeInInSecs; - animation.maxDelta = maxDelta; - animation.skinIndex = skinIndex; - if (!_animationComponentManager->hasComponent(instance->getRoot())) - { - Log("ERROR: specified entity is not animatable (has no animation component attached)."); - return false; - } - auto animationComponentInstance = _animationComponentManager->getInstance(instance->getRoot()); - - auto &animationComponent = _animationComponentManager->elementAt<0>(animationComponentInstance); - auto &boneAnimations = animationComponent.boneAnimations; - - boneAnimations.emplace_back(animation); - - return true; - } - - void SceneManager::playAnimation(EntityId entityId, int index, bool loop, bool reverse, bool replaceActive, float crossfade, float startOffset) - { - std::lock_guard lock(_mutex); - - if (index < 0) - { - Log("ERROR: glTF animation index must be greater than zero."); - return; - } - - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return; - } - } - - if (!_animationComponentManager->hasComponent(instance->getRoot())) - { - Log("ERROR: specified entity is not animatable (has no animation component attached)."); - return; - } - - auto animationComponentInstance = _animationComponentManager->getInstance(instance->getRoot()); - - auto &animationComponent = _animationComponentManager->elementAt<0>(animationComponentInstance); - - if (replaceActive) - { - if (animationComponent.gltfAnimations.size() > 0) - { - auto &last = animationComponent.gltfAnimations.back(); - animationComponent.fadeGltfAnimationIndex = last.index; - animationComponent.fadeDuration = crossfade; - auto now = high_resolution_clock::now(); - auto elapsedInSecs = float(std::chrono::duration_cast(now - last.start).count()) / 1000.0f; - animationComponent.fadeOutAnimationStart = elapsedInSecs; - animationComponent.gltfAnimations.clear(); - } - else - { - animationComponent.fadeGltfAnimationIndex = -1; - animationComponent.fadeDuration = 0.0f; - } - } - else if (crossfade > 0) - { - Log("ERROR: crossfade only supported when replaceActive is true."); - return; - } - else - { - animationComponent.fadeGltfAnimationIndex = -1; - animationComponent.fadeDuration = 0.0f; - } - - GltfAnimation animation; - animation.startOffset = startOffset; - animation.index = index; - animation.start = std::chrono::high_resolution_clock::now(); - animation.loop = loop; - animation.reverse = reverse; - animation.durationInSecs = instance->getAnimator()->getAnimationDuration(index); - - 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) - { - found = true; - break; - } - } - if (!found) - { - animationComponent.gltfAnimations.push_back(animation); - } - } - - void SceneManager::stopAnimation(EntityId entityId, int index) - { - std::lock_guard lock(_mutex); - - auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto *asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - Log("Failed to find instance for entity"); - return; - } - } - - auto animationComponentInstance = _animationComponentManager->getInstance(instance->getRoot()); - 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.erase(erased, - animationComponent.gltfAnimations.end()); - } - - Texture *SceneManager::createTexture(const uint8_t *data, size_t length, const char *name) - { - using namespace filament; - - // Create an input stream from the data - std::istringstream stream(std::string(reinterpret_cast(data), length)); - - // Decode the image - image::LinearImage linearImage = image::ImageDecoder::decode(stream, name, image::ImageDecoder::ColorSpace::SRGB); - - if (!linearImage.isValid()) - { - Log("Failed to decode image."); - return nullptr; - } - - uint32_t w = linearImage.getWidth(); - uint32_t h = linearImage.getHeight(); - uint32_t channels = linearImage.getChannels(); - - Texture::InternalFormat textureFormat = channels == 3 ? Texture::InternalFormat::RGB16F - : Texture::InternalFormat::RGBA16F; - Texture::Format bufferFormat = channels == 3 ? Texture::Format::RGB - : Texture::Format::RGBA; - - Texture *texture = Texture::Builder() - .width(w) - .height(h) - .levels(1) - .format(textureFormat) - .sampler(Texture::Sampler::SAMPLER_2D) - .build(*_engine); - - if (!texture) - { - Log("Failed to create texture: "); - return nullptr; - } - - Texture::PixelBufferDescriptor buffer( - linearImage.getPixelRef(), - size_t(w * h * channels * sizeof(float)), - bufferFormat, - Texture::Type::FLOAT); - - texture->setImage(*_engine, 0, std::move(buffer)); - - Log("Created texture: %s (%d x %d, %d channels)", name, w, h, channels); - - _textures.insert(texture); - - return texture; - } - - bool SceneManager::applyTexture(EntityId entityId, Texture *texture, const char *parameterName, int materialIndex) - { - auto entity = Entity::import(entityId); - - if (entity.isNull()) - { - Log("Entity %d is null?", entityId); - return false; - } - - 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) - { - auto *instance = getInstanceByEntityId(entityId); - auto offset = 60 * animationFrame * 1000; // TODO - don't hardcore 60fps framerate - instance->getAnimator()->applyAnimation(animationIndex, offset); - instance->getAnimator()->updateBoneMatrices(); - } - - float SceneManager::getAnimationDuration(EntityId entity, int animationIndex) - { - auto *instance = getInstanceByEntityId(entity); - - if (!instance) - { - auto *asset = getAssetByEntityId(entity); - if (!asset) - { - return -1.0f; - } - instance = asset->getInstance(); - } - return instance->getAnimator()->getAnimationDuration(animationIndex); - } - - unique_ptr> SceneManager::getAnimationNames(EntityId entity) - { - - const auto &pos = _instances.find(entity); - - unique_ptr> names = std::make_unique>(); - - FilamentInstance *instance; - - if (pos != _instances.end()) - { - instance = pos->second; - } - else - { - const auto &assetPos = _assets.find(entity); - if (assetPos != _assets.end()) - { - instance = assetPos->second->getInstance(); - } - else - { - Log("Could not resolve entity ID %d to FilamentInstance or FilamentAsset"); - return names; - } - } - - size_t count = instance->getAnimator()->getAnimationCount(); - - for (size_t i = 0; i < count; i++) - { - names->push_back(instance->getAnimator()->getAnimationName(i)); - } - - return names; - } - - unique_ptr> SceneManager::getMorphTargetNames(EntityId assetEntityId, EntityId child) - { - unique_ptr> names = std::make_unique>(); - - const auto *instance = getInstanceByEntityId(assetEntityId); - - if (!instance) - { - auto asset = getAssetByEntityId(assetEntityId); - if (!asset) - { - Log("Warning - failed to find specified asset. This is unexpected and probably indicates you are passing the wrong entity"); - return names; - } - instance = asset->getInstance(); - 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; - } - } - - const auto *asset = instance->getAsset(); - - const utils::Entity *entities = asset->getEntities(); - - const utils::Entity target = Entity::import(child); - - for (int i = 0; i < asset->getEntityCount(); i++) - { - - utils::Entity e = entities[i]; - if (e == target) - { - size_t count = asset->getMorphTargetCountAt(e); - for (int j = 0; j < count; j++) - { - const char *morphName = asset->getMorphTargetNameAt(e, j); - names->push_back(morphName); - } - break; - } - } - return names; - } - - unique_ptr> SceneManager::getBoneNames(EntityId assetEntityId, int skinIndex) - { - - unique_ptr> names = std::make_unique>(); - - auto *instance = getInstanceByEntityId(assetEntityId); - - if (!instance) - { - auto *asset = getAssetByEntityId(assetEntityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - Log("ERROR: failed to find instance for entity %d", assetEntityId); - return names; - } - } - - size_t skinCount = instance->getSkinCount(); - - if (skinCount > 1) - { - Log("WARNING - skin count > 1 not currently implemented. This will probably not work"); - } - - size_t numJoints = instance->getJointCountAt(skinIndex); - auto joints = instance->getJointsAt(skinIndex); - for (int i = 0; i < numJoints; i++) - { - const char *jointName = _ncm->getName(_ncm->getInstance(joints[i])); - names->push_back(jointName); - } - return names; - } - - void SceneManager::transformToUnitCube(EntityId entityId) - { - const auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return; - } - } - auto &tm = _engine->getTransformManager(); - - auto aabb = instance->getBoundingBox(); - auto center = aabb.center(); - auto halfExtent = aabb.extent(); - auto maxExtent = max(halfExtent) * 2; - auto scaleFactor = 2.0f / maxExtent; - auto transform = - math::mat4f::scaling(scaleFactor) * math::mat4f::translation(-center); - tm.setTransform(tm.getInstance(instance->getRoot()), transform); - } - - EntityId SceneManager::getParent(EntityId childEntityId) - { - auto &tm = _engine->getTransformManager(); - const auto child = Entity::import(childEntityId); - const auto &childInstance = tm.getInstance(child); - auto parent = tm.getParent(childInstance); - 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(); - const auto child = Entity::import(childEntityId); - const auto parent = Entity::import(parentEntityId); - - 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; - } - - 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); - } - - tm.setParent(childInstance, parentInstance); - } - - void SceneManager::addCollisionComponent(EntityId entityId, void (*onCollisionCallback)(const EntityId entityId1, const EntityId entityId2), bool affectsTransform) - { - std::lock_guard lock(_mutex); - const auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto asset = getAssetByEntityId(entityId); - if (!asset) - { - return; - } - else - { - instance = asset->getInstance(); - } - } - auto collisionInstance = _collisionComponentManager->addComponent(instance->getRoot()); - _collisionComponentManager->elementAt<0>(collisionInstance) = instance->getBoundingBox(); - _collisionComponentManager->elementAt<1>(collisionInstance) = onCollisionCallback; - _collisionComponentManager->elementAt<2>(collisionInstance) = affectsTransform; - } - - void SceneManager::removeCollisionComponent(EntityId entityId) - { - std::lock_guard lock(_mutex); - const auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto asset = getAssetByEntityId(entityId); - if (!asset) - { - return; - } - else - { - instance = asset->getInstance(); - } - } - _collisionComponentManager->removeComponent(instance->getRoot()); - } - - void SceneManager::testCollisions(EntityId entityId) - { - const auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return; - } - } - - const auto &tm = _engine->getTransformManager(); - - auto transformInstance = tm.getInstance(instance->getRoot()); - auto worldTransform = tm.getWorldTransform(transformInstance); - auto aabb = instance->getBoundingBox(); - aabb = aabb.transform(worldTransform); - _collisionComponentManager->collides(instance->getRoot(), aabb); - } - - void SceneManager::updateAnimations() - { - std::lock_guard lock(_mutex); - _animationComponentManager->update(); - } - - void SceneManager::updateTransforms() - { - std::lock_guard lock(_mutex); - - auto &tm = _engine->getTransformManager(); - tm.openLocalTransformTransaction(); - - for (const auto &[entityId, transformUpdate] : _transformUpdates) - { - const auto &pos = _instances.find(entityId); - - bool isCollidable = true; - Entity entity; - filament::TransformManager::Instance transformInstance; - filament::math::mat4f transform; - Aabb boundingBox; - if (pos == _instances.end()) - { - isCollidable = false; - entity = Entity::import(entityId); - } - else - { - const auto *instance = pos->second; - entity = instance->getRoot(); - boundingBox = instance->getBoundingBox(); - } - - transformInstance = tm.getInstance(entity); - transform = tm.getTransform(transformInstance); - - if (isCollidable) - { - auto transformedBB = boundingBox.transform(transform); - - auto collisionAxes = _collisionComponentManager->collides(entity, transformedBB); - - if (collisionAxes.size() == 1) - { - // auto globalAxis = collisionAxes[0]; - // globalAxis *= norm(relativeTranslation); - // auto newRelativeTranslation = relativeTranslation + globalAxis; - // translation -= relativeTranslation; - // translation += newRelativeTranslation; - // transform = composeMatrix(translation, rotation, scale); - } - else if (collisionAxes.size() > 1) - { - // translation -= relativeTranslation; - // transform = composeMatrix(translation, rotation, scale); - } - } - tm.setTransform(transformInstance, transformUpdate); - } - tm.commitLocalTransformTransaction(); - _transformUpdates.clear(); - } - - void SceneManager::setScale(EntityId entityId, float newScale) - { - std::lock_guard lock(_mutex); - - auto entity = Entity::import(entityId); - if (entity.isNull()) - { - Log("Failed to find entity under ID %d", entityId); - return; - } - auto &tm = _engine->getTransformManager(); - - auto transformInstance = tm.getInstance(entity); - auto transform = tm.getTransform(transformInstance); - math::float3 translation; - math::quatf rotation; - math::float3 scale; - - decomposeMatrix(transform, &translation, &rotation, &scale); - auto newTransform = composeMatrix(translation, rotation, newScale); - tm.setTransform(transformInstance, newTransform); - } - - void SceneManager::setPosition(EntityId entityId, float x, float y, float z) - { - std::lock_guard lock(_mutex); - - auto entity = Entity::import(entityId); - if (entity.isNull()) - { - Log("Failed to find entity under ID %d", entityId); - return; - } - auto &tm = _engine->getTransformManager(); - - auto transformInstance = tm.getInstance(entity); - auto transform = tm.getTransform(transformInstance); - math::float3 translation; - math::quatf rotation; - math::float3 scale; - - decomposeMatrix(transform, &translation, &rotation, &scale); - translation = math::float3(x, y, z); - auto newTransform = composeMatrix(translation, rotation, scale); - tm.setTransform(transformInstance, newTransform); - } - - void SceneManager::setRotation(EntityId entityId, float rads, float x, float y, float z, float w) - { - std::lock_guard lock(_mutex); - - auto entity = Entity::import(entityId); - if (entity.isNull()) - { - Log("Failed to find entity under ID %d", entityId); - return; - } - auto &tm = _engine->getTransformManager(); - - auto transformInstance = tm.getInstance(entity); - auto transform = tm.getTransform(transformInstance); - math::float3 translation; - math::quatf rotation; - math::float3 scale; - - decomposeMatrix(transform, &translation, &rotation, &scale); - rotation = math::quatf(w, x, y, z); - auto newTransform = composeMatrix(translation, rotation, scale); - tm.setTransform(transformInstance, newTransform); - } - - void SceneManager::queueRelativePositionUpdateFromViewportVector(View *view, 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) - } - - void SceneManager::queueTransformUpdates(EntityId *entities, math::mat4 *transforms, int numEntities) - { - std::lock_guard lock(_mutex); - - for (int i = 0; i < numEntities; i++) - { - auto entity = entities[i]; - const auto &pos = _transformUpdates.find(entity); - if (pos == _transformUpdates.end()) - { - _transformUpdates.emplace(entity, transforms[i]); - } - auto curr = _transformUpdates[entity]; - _transformUpdates[entity] = curr; - } - } - - const utils::Entity *SceneManager::getCameraEntities(EntityId entityId) - { - const auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return nullptr; - } - } - return instance->getAsset()->getCameraEntities(); - } - - size_t SceneManager::getCameraEntityCount(EntityId entityId) - { - const auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return -1; - } - } - return instance->getAsset()->getCameraEntityCount(); - } - - const utils::Entity *SceneManager::getLightEntities(EntityId entityId) noexcept - { - const auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return nullptr; - } - } - return instance->getAsset()->getLightEntities(); - } - - size_t SceneManager::getLightEntityCount(EntityId entityId) noexcept - { - const auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return -1; - } - } - return instance->getAsset()->getLightEntityCount(); - } - - const char *SceneManager::getNameForEntity(EntityId entityId) - { - const auto &entity = Entity::import(entityId); - auto nameInstance = _ncm->getInstance(entity); - if (!nameInstance.isValid()) - { - Log("Failed to find name instance for entity ID %d", entityId); - return nullptr; - } - return _ncm->getName(nameInstance); - } - - int SceneManager::getEntityCount(EntityId entityId, bool renderableOnly) - { - const auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return 0; - } - } - if (renderableOnly) - { - int count = 0; - const auto &rm = _engine->getRenderableManager(); - const Entity *entities = instance->getEntities(); - for (int i = 0; i < instance->getEntityCount(); i++) - { - if (rm.hasComponent(entities[i])) - { - count++; - } - } - return count; - } - return instance->getEntityCount(); - } - - void SceneManager::getEntities(EntityId entityId, bool renderableOnly, EntityId *out) - { - const auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return; - } - } - - if (renderableOnly) - { - int count = 0; - const auto &rm = _engine->getRenderableManager(); - const Entity *entities = instance->getEntities(); - int offset = 0; - for (int i = 0; i < instance->getEntityCount(); i++) - { - if (rm.hasComponent(entities[i])) - { - out[offset] = Entity::smuggle(entities[i]); - offset++; - } - } - } - else - { - for (int i = 0; i < instance->getEntityCount(); i++) - { - out[i] = Entity::smuggle(instance->getEntities()[i]); - } - } - } - - const char *SceneManager::getEntityNameAt(EntityId entityId, int index, bool renderableOnly) - { - const auto *instance = getInstanceByEntityId(entityId); - if (!instance) - { - auto asset = getAssetByEntityId(entityId); - if (asset) - { - instance = asset->getInstance(); - } - else - { - return nullptr; - } - } - int found = -1; - - if (renderableOnly) - { - int count = 0; - const auto &rm = _engine->getRenderableManager(); - const Entity *entities = instance->getEntities(); - for (int i = 0; i < instance->getEntityCount(); i++) - { - if (rm.hasComponent(entities[i])) - { - if (count == index) - { - found = i; - break; - } - count++; - } - } - } - else - { - found = index; - } - - if (found >= instance->getEntityCount()) - { - Log("ERROR: index %d greater than number of child entities.", found); - return nullptr; - } - - const utils::Entity entity = instance->getEntities()[found]; - auto inst = _ncm->getInstance(entity); - auto name = _ncm->getName(inst); - return name; - } - - void SceneManager::setPriority(EntityId entityId, int priority) - { - auto &rm = _engine->getRenderableManager(); - auto renderableInstance = rm.getInstance(Entity::import(entityId)); - if (!renderableInstance.isValid()) - { - Log("SceneManager::setPriority entity %d has no renderable component", entityId); - return; - } - rm.setPriority(renderableInstance, priority); - } - - Aabb3 SceneManager::getRenderableBoundingBox(EntityId entityId) { - auto& rm = _engine->getRenderableManager(); - auto instance = rm.getInstance(Entity::import(entityId)); - if(!instance.isValid()) { - return Aabb3 {}; - } - auto box = rm.getAxisAlignedBoundingBox(instance); - return Aabb3 { box.center.x, box.center.y, box.center.z, box.halfExtent.x, box.halfExtent.y, box.halfExtent.z }; - } - - Aabb2 SceneManager::getScreenSpaceBoundingBox(View *view, EntityId entityId) - { - const auto &camera = view->getCamera(); - const auto &viewport = view->getViewport(); - - auto &tcm = _engine->getTransformManager(); - auto &rcm = _engine->getRenderableManager(); - - // Get the projection and view matrices - math::mat4 projMatrix = camera.getProjectionMatrix(); - math::mat4 viewMatrix = camera.getViewMatrix(); - math::mat4 vpMatrix = projMatrix * viewMatrix; - - 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(); - - // 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) - { - - math::float4 clipSpace = vpMatrix * corner; - - // Check if the point is behind the camera - if (clipSpace.w <= 0) - { - continue; // Skip this point - } - - // Perform perspective division - math::float3 ndcSpace = clipSpace.xyz / clipSpace.w; - - // 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)); - - // 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 - - minX = std::min(minX, viewportX); - minY = std::min(minY, viewportY); - maxX = std::max(maxX, viewportX); - maxY = std::max(maxY, viewportY); - } - - return Aabb2{minX, minY, maxX, maxY}; - } - - 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; - } - 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 = std::make_unique(entityId, this, _engine, r, g, b); - - if (highlightEntity->isValid()) - { - _highlighted.emplace(entityId, std::move(highlightEntity)); - } - } - - 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, - filament::MaterialInstance *materialInstance, - bool keepData) - { - auto geometry = std::make_unique(vertices, numVertices, normals, numNormals, uvs, numUvs, indices, numIndices, primitiveType, _engine); - - filament::Material *mat = nullptr; - - if (!materialInstance) - { - Log("Using default ubershader material"); - filament::gltfio::MaterialKey config; - - 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 = numUvs > 0; - 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; - - materialInstance = createUbershaderMaterialInstance(config); - - if (!materialInstance) - { - Log("Failed to create material instance"); - return Entity::smuggle(Entity()); - } - } - - // Set up texture and sampler if UVs are available - if (uvs != nullptr && numUvs > 0) - { - if(materialInstance->getMaterial()->hasParameter("baseColorMap")) { - // 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); - - _textures.insert(texture); - - filament::backend::PixelBufferDescriptor pbd(&white, 4, Texture::Format::RGBA, Texture::Type::UBYTE); - texture->setImage(*_engine, 0, std::move(pbd)); - - // Create a sampler - TextureSampler sampler(TextureSampler::MinFilter::NEAREST, TextureSampler::MagFilter::NEAREST); - sampler.setWrapModeS(TextureSampler::WrapMode::REPEAT); - sampler.setWrapModeT(TextureSampler::WrapMode::REPEAT); - - // Set the texture and sampler to the material instance - materialInstance->setParameter("baseColorMap", texture, sampler); - } - } - - auto instanceEntity = geometry->createInstance(materialInstance); - auto instanceEntityId = Entity::smuggle(instanceEntity); - _scene->addEntity(instanceEntity); - _geometryInstances.push_back(instanceEntityId); - - _geometry.emplace(instanceEntityId, std::move(geometry)); - - return instanceEntityId; - } - - 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); - 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, value); - } - - void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char *property, int32_t 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, 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(filament::MaterialInstance *instance) - { - auto it = std::find(_materialInstances.begin(), _materialInstances.end(), instance); - if(it != _materialInstances.end()) { - _materialInstances.erase(it); - } - _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"); - return nullptr; - } - materialInstance->setParameter("baseColorFactor", RgbaType::sRGB, filament::math::float4{1.0f, 0.0f, 1.0f, 1.0f}); - materialInstance->setParameter("baseColorIndex", 0); - _materialInstances.push_back(materialInstance); - return materialInstance; - } - - MaterialInstance *SceneManager::createUnlitFixedSizeMaterialInstance() - { - auto instance = _gizmoMaterial->createInstance(); - instance->setParameter("scale", 1.0f); - return instance; - } - - MaterialInstance *SceneManager::createUnlitMaterialInstance() - { - UvMap uvmap; - auto instance = _unlitMaterialProvider->createMaterialInstance(nullptr, &uvmap); - _materialInstances.push_back(instance); - return instance; - } - - Camera *SceneManager::createCamera() - { - auto entity = EntityManager::get().create(); - auto camera = _engine->createCamera(entity); - _cameras.push_back(camera); - return camera; - } - - void SceneManager::destroyCamera(Camera *camera) - { - auto entity = camera->getEntity(); - _engine->destroyCameraComponent(entity); - _engine->getEntityManager().destroy(entity); - auto it = std::find(_cameras.begin(), _cameras.end(), camera); - if (it != _cameras.end()) - { - _cameras.erase(it); - } - } - - size_t SceneManager::getCameraCount() - { - return _cameras.size() + 1; - } - - Camera *SceneManager::getCameraAt(size_t index) - { - if (index == 0) - { - return _mainCamera; - } - if (index - 1 > _cameras.size() - 1) - { - return nullptr; - } - return _cameras[index - 1]; - } - -} // namespace thermion diff --git a/thermion_dart/native/src/TGizmo.cpp b/thermion_dart/native/src/TGizmo.cpp deleted file mode 100644 index 331474c8..00000000 --- a/thermion_dart/native/src/TGizmo.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include -#include - -#include "ThermionDartApi.h" -#include "TGizmo.h" -#include "Gizmo.hpp" -#include "Log.hpp" - -#ifdef __cplusplus -namespace thermion { -extern "C" -{ -using namespace filament; -#endif - - EMSCRIPTEN_KEEPALIVE void Gizmo_pick(TGizmo *tGizmo, uint32_t x, uint32_t y, GizmoPickCallback callback) - { - auto *gizmo = reinterpret_cast(tGizmo); - gizmo->pick(x, y, reinterpret_cast(callback)); - } - - EMSCRIPTEN_KEEPALIVE void Gizmo_setVisibility(TGizmo *tGizmo, bool visible) { - auto *gizmo = reinterpret_cast(tGizmo); - gizmo->setVisibility(visible); - } - -#ifdef __cplusplus -} -} -#endif diff --git a/thermion_dart/native/src/TMaterialInstance.cpp b/thermion_dart/native/src/TMaterialInstance.cpp deleted file mode 100644 index 3519999b..00000000 --- a/thermion_dart/native/src/TMaterialInstance.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include -#include - -#include "Log.hpp" -#include "TMaterialInstance.h" - -#ifdef __cplusplus -namespace thermion -{ - extern "C" - { -#endif - - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance *materialInstance, bool enabled) - { - reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setDepthWrite(enabled); - } - - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance *materialInstance, bool enabled) - { - reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setDepthCulling(enabled); - } - - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat4(TMaterialInstance *tMaterialInstance, const char *propertyName, double x, double y, double z, double w) - { - auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); - filament::math::float4 data{static_cast(x), static_cast(y), static_cast(z), static_cast(w)}; - materialInstance->setParameter(propertyName, data); - } - - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat2(TMaterialInstance *materialInstance, const char *propertyName, double x, double y) - { - filament::math::float2 data{static_cast(x), static_cast(y)}; - reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, data); - } - - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat(TMaterialInstance *materialInstance, const char *propertyName, double value) - { - reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, static_cast(value)); - } - - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance *materialInstance, const char *propertyName, int value) - { - reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, value); - } - - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthFunc(TMaterialInstance *tMaterialInstance, TDepthFunc tDepthFunc) { - auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); - auto depthFunc = static_cast(tDepthFunc); - materialInstance->setDepthFunc(depthFunc); - } -#ifdef __cplusplus - } -} -#endif diff --git a/thermion_dart/native/src/TSceneManager.cpp b/thermion_dart/native/src/TSceneManager.cpp deleted file mode 100644 index 48c42c91..00000000 --- a/thermion_dart/native/src/TSceneManager.cpp +++ /dev/null @@ -1,140 +0,0 @@ -#include "filament/LightManager.h" -#include "ResourceBuffer.hpp" -#include "FilamentViewer.hpp" -#include "Log.hpp" -#include "APIExport.h" - -using namespace thermion; - -extern "C" -{ - -#include "TSceneManager.h" - - EMSCRIPTEN_KEEPALIVE TGizmo *SceneManager_createGizmo(TSceneManager *tSceneManager, TView *tView, TScene *tScene) - { - auto sceneManager = reinterpret_cast(tSceneManager); - auto *scene = reinterpret_cast(tScene); - auto *view = reinterpret_cast(tView); - auto gizmo = sceneManager->createGizmo(view, scene); - return reinterpret_cast(gizmo); - } - - EMSCRIPTEN_KEEPALIVE EntityId SceneManager_loadGlbFromBuffer(TSceneManager *sceneManager, const uint8_t *const data, size_t length, bool keepData, int priority, int layer, bool loadResourcesAsync) - { - return ((SceneManager *)sceneManager)->loadGlbFromBuffer((const uint8_t *)data, length, 1, keepData, priority, layer, loadResourcesAsync); - } - - EMSCRIPTEN_KEEPALIVE bool SceneManager_setMorphAnimation( - TSceneManager *sceneManager, - EntityId asset, - const float *const morphData, - const uint32_t *const morphIndices, - int numMorphTargets, - int numFrames, - float frameLengthInMs) - { - auto result = ((SceneManager *)sceneManager)->setMorphAnimationBuffer(asset, morphData, morphIndices, numMorphTargets, numFrames, frameLengthInMs); - return result; - } - - EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_getCameraByName(TSceneManager *tSceneManager, EntityId entityId, const char *name) - { - auto *sceneManager = reinterpret_cast(tSceneManager); - return nullptr; - } - - EMSCRIPTEN_KEEPALIVE bool SceneManager_setTransform(TSceneManager *sceneManager, EntityId entityId, const double *const transform) - { - auto matrix = math::mat4( - transform[0], transform[1], transform[2], - transform[3], - transform[4], - transform[5], - transform[6], - transform[7], - transform[8], - transform[9], - transform[10], - transform[11], - transform[12], - transform[13], - transform[14], - transform[15]); - return ((SceneManager *)sceneManager)->setTransform(entityId, matrix); - } - - EMSCRIPTEN_KEEPALIVE Aabb3 SceneManager_getRenderableBoundingBox(TSceneManager *tSceneManager, EntityId entity) - { - auto sceneManager = reinterpret_cast(tSceneManager); - return sceneManager->getRenderableBoundingBox(entity); - } - - EMSCRIPTEN_KEEPALIVE void SceneManager_setVisibilityLayer(TSceneManager *tSceneManager, EntityId entity, int layer) - { - auto *sceneManager = reinterpret_cast(tSceneManager); - sceneManager->setVisibilityLayer(entity, layer); - } - - EMSCRIPTEN_KEEPALIVE TMaterialInstance *SceneManager_createUnlitMaterialInstance(TSceneManager *sceneManager) - { - auto *instance = ((SceneManager *)sceneManager)->createUnlitMaterialInstance(); - return reinterpret_cast(instance); - } - - EMSCRIPTEN_KEEPALIVE TMaterialInstance *SceneManager_createUnlitFixedSizeMaterialInstance(TSceneManager *sceneManager) - { - auto *instance = ((SceneManager *)sceneManager)->createUnlitFixedSizeMaterialInstance(); - return reinterpret_cast(instance); - } - - EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_createCamera(TSceneManager *tSceneManager) - { - auto *sceneManager = reinterpret_cast(tSceneManager); - return reinterpret_cast(sceneManager->createCamera()); - } - - EMSCRIPTEN_KEEPALIVE void SceneManager_destroyCamera(TSceneManager *tSceneManager, TCamera *tCamera) - { - auto *sceneManager = reinterpret_cast(tSceneManager); - auto *camera = reinterpret_cast(tCamera); - sceneManager->destroyCamera(camera); - } - - EMSCRIPTEN_KEEPALIVE size_t SceneManager_getCameraCount(TSceneManager *tSceneManager) - { - auto *sceneManager = reinterpret_cast(tSceneManager); - return sceneManager->getCameraCount(); - } - - EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_getCameraAt(TSceneManager *tSceneManager, size_t index) - { - auto *sceneManager = reinterpret_cast(tSceneManager); - auto *camera = sceneManager->getCameraAt(index); - return reinterpret_cast(camera); - } - - EMSCRIPTEN_KEEPALIVE EntityId SceneManager_createGeometry( - TSceneManager *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, static_cast(numVertices), normals, static_cast(numNormals), uvs, static_cast(numUvs), indices, static_cast(numIndices), (filament::RenderableManager::PrimitiveType)primitiveType, reinterpret_cast(materialInstance), keepData); - } - - EMSCRIPTEN_KEEPALIVE void SceneManager_destroyMaterialInstance(TSceneManager *sceneManager, TMaterialInstance *instance) - { - ((SceneManager *)sceneManager)->destroy(reinterpret_cast(instance)); - } - - -} \ No newline at end of file diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp deleted file mode 100644 index c8d908a9..00000000 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ /dev/null @@ -1,952 +0,0 @@ -#ifdef _WIN32 -#include "ThermionWin32.h" -#endif - -#include -#include - -#ifdef __EMSCRIPTEN__ -#include -#endif - -#include "filament/LightManager.h" -#include "ResourceBuffer.hpp" -#include "FilamentViewer.hpp" -#include "Log.hpp" -#include "ThreadPool.hpp" - -using namespace thermion; - -extern "C" -{ - -#include "ThermionDartApi.h" - - EMSCRIPTEN_KEEPALIVE TViewer *Viewer_create(const void *context, const void *const loader, void *const platform, const char *uberArchivePath) - { - const auto *loaderImpl = new ResourceLoaderWrapperImpl((ResourceLoaderWrapper *)loader); - auto viewer = new FilamentViewer(context, loaderImpl, platform, uberArchivePath); - return reinterpret_cast(viewer); - } - - EMSCRIPTEN_KEEPALIVE TEngine *Viewer_getEngine(TViewer *viewer) - { - auto *engine = reinterpret_cast(viewer)->getEngine(); - return reinterpret_cast(engine); - } - - EMSCRIPTEN_KEEPALIVE TRenderTarget *Viewer_createRenderTarget(TViewer *tViewer, intptr_t texture, uint32_t width, uint32_t height) - { - auto viewer = reinterpret_cast(tViewer); - auto renderTarget = viewer->createRenderTarget(texture, width, height); - return reinterpret_cast(renderTarget); - } - - EMSCRIPTEN_KEEPALIVE void Viewer_destroyRenderTarget(TViewer *tViewer, TRenderTarget *tRenderTarget) - { - auto viewer = reinterpret_cast(tViewer); - auto renderTarget = reinterpret_cast(tRenderTarget); - viewer->destroyRenderTarget(renderTarget); - } - - EMSCRIPTEN_KEEPALIVE void Viewer_pick(TViewer *tViewer, TView* tView, int x, int y, void (*callback)(EntityId entityId, int x, int y, TView *tView, float depth, float fragX, float fragY, float fragZ)) - { - auto *viewer = reinterpret_cast(tViewer); - auto *view = reinterpret_cast(tView); - ((FilamentViewer *)viewer)->pick(view, static_cast(x), static_cast(y), reinterpret_cast(callback)); - } - - EMSCRIPTEN_KEEPALIVE bool Viewer_isNonPickableEntity(TViewer *tViewer, EntityId entityId) { - auto *viewer = reinterpret_cast(tViewer); - return viewer->isNonPickableEntity(entityId); - } - - EMSCRIPTEN_KEEPALIVE void Viewer_destroy(TViewer *viewer) - { - delete ((FilamentViewer *)viewer); - } - - 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(TViewer *viewer) - { - ((FilamentViewer *)viewer)->clearBackgroundImage(); - } - - EMSCRIPTEN_KEEPALIVE void set_background_image(TViewer *viewer, const char *path, bool fillHeight) - { - ((FilamentViewer *)viewer)->setBackgroundImage(path, fillHeight, 100, 100); - } - - EMSCRIPTEN_KEEPALIVE void set_background_image_position(TViewer *viewer, float x, float y, bool clamp) - { - ((FilamentViewer *)viewer)->setBackgroundImagePosition(x, y, clamp, 100, 100); - } - - - EMSCRIPTEN_KEEPALIVE void load_skybox(TViewer *viewer, const char *skyboxPath) - { - ((FilamentViewer *)viewer)->loadSkybox(skyboxPath); - } - - 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 Viewer_loadIbl(TViewer *viewer, const char *iblPath, float intensity) - { - ((FilamentViewer *)viewer)->loadIbl(iblPath, intensity); - } - - EMSCRIPTEN_KEEPALIVE void rotate_ibl(TViewer *viewer, float *rotationMatrix) - { - math::mat3f matrix(rotationMatrix[0], rotationMatrix[1], - rotationMatrix[2], - rotationMatrix[3], - rotationMatrix[4], - rotationMatrix[5], - rotationMatrix[6], - rotationMatrix[7], - rotationMatrix[8]); - - ((FilamentViewer *)viewer)->rotateIbl(matrix); - } - - EMSCRIPTEN_KEEPALIVE void remove_skybox(TViewer *viewer) - { - ((FilamentViewer *)viewer)->removeSkybox(); - } - - EMSCRIPTEN_KEEPALIVE void remove_ibl(TViewer *viewer) - { - ((FilamentViewer *)viewer)->removeIbl(); - } - - EMSCRIPTEN_KEEPALIVE EntityId add_light( - TViewer *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) - { - 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(TViewer *viewer, int32_t entityId, float x, float y, float z) - { - ((FilamentViewer *)viewer)->setLightPosition(entityId, x, y, 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(TViewer *viewer, int32_t entityId) - { - ((FilamentViewer *)viewer)->removeLight(entityId); - } - - EMSCRIPTEN_KEEPALIVE void clear_lights(TViewer *viewer) - { - ((FilamentViewer *)viewer)->clearLights(); - } - - EMSCRIPTEN_KEEPALIVE EntityId load_glb(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData) - { - return ((SceneManager *)sceneManager)->loadGlb(assetPath, numInstances, keepData); - } - - EMSCRIPTEN_KEEPALIVE EntityId create_instance(TSceneManager *sceneManager, EntityId entityId) - { - return ((SceneManager *)sceneManager)->createInstance(entityId); - } - - EMSCRIPTEN_KEEPALIVE int get_instance_count(TSceneManager *sceneManager, EntityId entityId) - { - return ((SceneManager *)sceneManager)->getInstanceCount(entityId); - } - - EMSCRIPTEN_KEEPALIVE void get_instances(TSceneManager *sceneManager, EntityId entityId, EntityId *out) - { - return ((SceneManager *)sceneManager)->getInstances(entityId, out); - } - - EMSCRIPTEN_KEEPALIVE EntityId load_gltf(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData) - { - return ((SceneManager *)sceneManager)->loadGltf(assetPath, relativePath, keepData); - } - - EMSCRIPTEN_KEEPALIVE void Viewer_setMainCamera(TViewer *tViewer, TView *tView) - { - auto *viewer = reinterpret_cast(tViewer); - auto *view = reinterpret_cast(tView); - viewer->setMainCamera(view); - } - - EMSCRIPTEN_KEEPALIVE EntityId get_main_camera(TViewer *viewer) - { - return ((FilamentViewer *)viewer)->getMainCamera(); - } - - 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(TCamera *const camera) - { - auto cam = reinterpret_cast(camera); - return cam->getFocalLength(); - } - - 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 TCamera *get_camera(TViewer *viewer, EntityId entity) - { - auto filamentCamera = ((FilamentViewer *)viewer)->getCamera(entity); - return reinterpret_cast(filamentCamera); - } - - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_model_matrix(TCamera *camera) - { - const auto &mat = reinterpret_cast(camera)->getModelMatrix(); - return convert_mat4_to_double4x4(mat); - } - - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_view_matrix(TCamera *camera) - { - const auto &mat = reinterpret_cast(camera)->getViewMatrix(); - return convert_mat4_to_double4x4(mat); - } - - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_projection_matrix(TCamera *camera) - { - const auto &mat = reinterpret_cast(camera)->getProjectionMatrix(); - return convert_mat4_to_double4x4(mat); - } - - EMSCRIPTEN_KEEPALIVE double4x4 get_camera_culling_projection_matrix(TCamera *camera) - { - const auto &mat = reinterpret_cast(camera)->getCullingProjectionMatrix(); - return convert_mat4_to_double4x4(mat); - } - - EMSCRIPTEN_KEEPALIVE 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); - } - - EMSCRIPTEN_KEEPALIVE void Camera_setLensProjection(TCamera *camera, double near, double far, double aspect, double focalLength) - { - auto cam = reinterpret_cast(camera); - cam->setLensProjection(focalLength, aspect, near, far); - } - - EMSCRIPTEN_KEEPALIVE void Camera_setModelMatrix(TCamera *camera, double4x4 matrix) - { - auto cam = reinterpret_cast(camera); - cam->setModelMatrix(convert_double4x4_to_mat4(matrix)); - } - - EMSCRIPTEN_KEEPALIVE double get_camera_near(TCamera *camera) - { - auto cam = reinterpret_cast(camera); - return cam->getNear(); - } - - EMSCRIPTEN_KEEPALIVE double get_camera_culling_far(TCamera *camera) - { - auto cam = reinterpret_cast(camera); - return cam->getCullingFar(); - } - - EMSCRIPTEN_KEEPALIVE const double *const get_camera_frustum(TCamera *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++) - { - auto plane = planes[i]; - array[i * 4] = double(plane.x); - array[i * 4 + 1] = double(plane.y); - array[i * 4 + 2] = double(plane.z); - array[i * 4 + 3] = double(plane.w); - } - - return array; - } - - - 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(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(TCamera *camera, double4x4 matrix) - { - auto *cam = reinterpret_cast(camera); - const filament::math::mat4 &mat = convert_double4x4_to_mat4(matrix); - cam->setModelMatrix(mat); - } - - EMSCRIPTEN_KEEPALIVE void Viewer_render( - TViewer *tViewer) - { - auto viewer = reinterpret_cast(tViewer); - viewer->render(0); - } - - EMSCRIPTEN_KEEPALIVE void Viewer_setViewRenderable(TViewer *tViewer, TSwapChain *tSwapChain, TView *tView, bool renderable) { - auto viewer = reinterpret_cast(tViewer); - auto swapChain = reinterpret_cast(tSwapChain); - auto *view = reinterpret_cast(tView); - viewer->setRenderable(view, swapChain, renderable); - } - - EMSCRIPTEN_KEEPALIVE void Viewer_capture( - TViewer *tViewer, - TView *tView, - TSwapChain *tSwapChain, - uint8_t *pixelBuffer, - void (*callback)(void)) - { -#ifdef __EMSCRIPTEN__ - bool useFence = true; -#else - bool useFence = false; -#endif - auto swapChain = reinterpret_cast(tSwapChain); - auto viewer = reinterpret_cast(tViewer); - auto *view = reinterpret_cast(tView); - viewer->capture(view, pixelBuffer, useFence, swapChain, callback); - }; - - EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTarget( - TViewer *tViewer, - TView *tView, - TSwapChain *tSwapChain, - TRenderTarget *tRenderTarget, - uint8_t *pixelBuffer, - void (*callback)(void)) - { -#ifdef __EMSCRIPTEN__ - bool useFence = true; -#else - bool useFence = false; -#endif - auto swapChain = reinterpret_cast(tSwapChain); - auto renderTarget = reinterpret_cast(tRenderTarget); - auto viewer = reinterpret_cast(tViewer); - auto *view = reinterpret_cast(tView); - viewer->capture(view, pixelBuffer, useFence, swapChain, renderTarget, callback); - }; - - EMSCRIPTEN_KEEPALIVE void set_frame_interval( - TViewer *viewer, - float frameInterval) - { - ((FilamentViewer *)viewer)->setFrameInterval(frameInterval); - } - - EMSCRIPTEN_KEEPALIVE void Viewer_destroySwapChain(TViewer *tViewer, TSwapChain *tSwapChain) - { - auto viewer = reinterpret_cast(tViewer); - auto swapChain = reinterpret_cast(tSwapChain); - viewer->destroySwapChain(swapChain); - } - - EMSCRIPTEN_KEEPALIVE TSwapChain *Viewer_createHeadlessSwapChain(TViewer *tViewer, uint32_t width, uint32_t height) - { - auto viewer = reinterpret_cast(tViewer); - auto swapChain = viewer->createSwapChain(width, height); - return reinterpret_cast(swapChain); - } - - EMSCRIPTEN_KEEPALIVE TSwapChain *Viewer_createSwapChain(TViewer *tViewer, const void *const window) - { - auto viewer = reinterpret_cast(tViewer); - auto swapChain = viewer->createSwapChain(window); - return reinterpret_cast(swapChain); - } - - EMSCRIPTEN_KEEPALIVE TSwapChain* Viewer_getSwapChainAt(TViewer *tViewer, int index) { - auto viewer = reinterpret_cast(tViewer); - auto swapChain = viewer->getSwapChainAt(index); - return reinterpret_cast(swapChain); - } - - EMSCRIPTEN_KEEPALIVE TView *Viewer_createView(TViewer *tViewer) - { - auto viewer = reinterpret_cast(tViewer); - auto view = viewer->createView(); - return reinterpret_cast(view); - } - - EMSCRIPTEN_KEEPALIVE TView *Viewer_getViewAt(TViewer *tViewer, int32_t index) - { - auto viewer = reinterpret_cast(tViewer); - auto view = viewer->getViewAt(index); - return reinterpret_cast(view); - } - - - - EMSCRIPTEN_KEEPALIVE TSceneManager *Viewer_getSceneManager(TViewer *tViewer) - { - auto *viewer = reinterpret_cast(tViewer); - auto *sceneManager = viewer->getSceneManager(); - return reinterpret_cast(sceneManager); - } - - EMSCRIPTEN_KEEPALIVE void apply_weights( - TSceneManager *sceneManager, - EntityId asset, - const char *const entityName, - float *const weights, - int count) - { - // ((SceneManager*)sceneManager)->setMorphTargetWeights(asset, entityName, weights, count); - } - - EMSCRIPTEN_KEEPALIVE bool set_morph_target_weights( - TSceneManager *sceneManager, - EntityId asset, - const float *const weights, - const int numWeights) - { - return ((SceneManager *)sceneManager)->setMorphTargetWeights(asset, weights, numWeights); - } - - - EMSCRIPTEN_KEEPALIVE void clear_morph_animation(TSceneManager *sceneManager, EntityId asset) - { - ((SceneManager *)sceneManager)->clearMorphAnimationBuffer(asset); - } - - EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose(TSceneManager *sceneManager, EntityId entityId) - { - ((SceneManager *)sceneManager)->resetBones(entityId); - } - - EMSCRIPTEN_KEEPALIVE void add_bone_animation( - TSceneManager *sceneManager, - EntityId asset, - int skinIndex, - int boneIndex, - const float *const frameData, - int numFrames, - float frameLengthInMs, - float fadeOutInSecs, - float fadeInInSecs, - float maxDelta) - { - ((SceneManager *)sceneManager)->addBoneAnimation(asset, skinIndex, boneIndex, frameData, numFrames, frameLengthInMs, fadeOutInSecs, fadeInInSecs, maxDelta); - } - - EMSCRIPTEN_KEEPALIVE EntityId get_bone(TSceneManager *sceneManager, - EntityId entityId, - int skinIndex, - int boneIndex) - { - return ((SceneManager *)sceneManager)->getBone(entityId, skinIndex, boneIndex); - } - EMSCRIPTEN_KEEPALIVE void get_world_transform(TSceneManager *sceneManager, - 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]; - out[3] = transform[0][3]; - out[4] = transform[1][0]; - out[5] = transform[1][1]; - out[6] = transform[1][2]; - out[7] = transform[1][3]; - out[8] = transform[2][0]; - out[9] = transform[2][1]; - out[10] = transform[2][2]; - out[11] = transform[2][3]; - out[12] = transform[3][0]; - out[13] = transform[3][1]; - out[14] = transform[3][2]; - out[15] = transform[3][3]; - } - - EMSCRIPTEN_KEEPALIVE void get_local_transform(TSceneManager *sceneManager, - 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]; - out[3] = transform[0][3]; - out[4] = transform[1][0]; - out[5] = transform[1][1]; - out[6] = transform[1][2]; - out[7] = transform[1][3]; - out[8] = transform[2][0]; - out[9] = transform[2][1]; - out[10] = transform[2][2]; - out[11] = transform[2][3]; - out[12] = transform[3][0]; - out[13] = transform[3][1]; - out[14] = transform[3][2]; - out[15] = transform[3][3]; - } - - EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(TSceneManager *sceneManager, - EntityId entityId, int skinIndex, float *const out, int numBones) - { - const auto transforms = ((SceneManager *)sceneManager)->getBoneRestTranforms(entityId, skinIndex); - auto numTransforms = transforms->size(); - if (numTransforms != numBones) - { - Log("Error - %d bone transforms available but you only specified %d.", numTransforms, numBones); - return; - } - 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++) - { - out[(boneIndex * 16) + (colNum * 4) + rowNum] = transform[colNum][rowNum]; - } - } - } - } - - EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(TSceneManager *sceneManager, - 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]; - out[3] = transform[0][3]; - out[4] = transform[1][0]; - out[5] = transform[1][1]; - out[6] = transform[1][2]; - out[7] = transform[1][3]; - out[8] = transform[2][0]; - out[9] = transform[2][1]; - out[10] = transform[2][2]; - out[11] = transform[2][3]; - out[12] = transform[3][0]; - out[13] = transform[3][1]; - out[14] = transform[3][2]; - out[15] = transform[3][3]; - } - - EMSCRIPTEN_KEEPALIVE bool set_bone_transform( - TSceneManager *sceneManager, - EntityId entityId, - int skinIndex, - int boneIndex, - const float *const transform) - { - auto matrix = math::mat4f( - transform[0], transform[1], transform[2], - transform[3], - transform[4], - transform[5], - transform[6], - transform[7], - transform[8], - transform[9], - transform[10], - transform[11], - transform[12], - transform[13], - transform[14], - transform[15]); - return ((SceneManager *)sceneManager)->setBoneTransform(entityId, skinIndex, boneIndex, matrix); - } - - EMSCRIPTEN_KEEPALIVE void play_animation( - TSceneManager *sceneManager, - EntityId asset, - int index, - bool loop, - bool reverse, - bool replaceActive, - float crossfade, - float startOffset) - { - ((SceneManager *)sceneManager)->playAnimation(asset, index, loop, reverse, replaceActive, crossfade, startOffset); - } - - EMSCRIPTEN_KEEPALIVE void set_animation_frame( - TSceneManager *sceneManager, - EntityId asset, - int animationIndex, - int animationFrame) - { - // ((SceneManager*)sceneManager)->setAnimationFrame(asset, animationIndex, animationFrame); - } - - float get_animation_duration(TSceneManager *sceneManager, EntityId asset, int animationIndex) - { - return ((SceneManager *)sceneManager)->getAnimationDuration(asset, animationIndex); - } - - int get_animation_count( - TSceneManager *sceneManager, - EntityId asset) - { - auto names = ((SceneManager *)sceneManager)->getAnimationNames(asset); - return (int)names->size(); - } - - EMSCRIPTEN_KEEPALIVE void get_animation_name( - TSceneManager *sceneManager, - EntityId asset, - char *const outPtr, - int index) - { - auto names = ((SceneManager *)sceneManager)->getAnimationNames(asset); - std::string name = names->at(index); - strcpy(outPtr, name.c_str()); - } - - EMSCRIPTEN_KEEPALIVE int get_bone_count(TSceneManager *sceneManager, EntityId assetEntity, int skinIndex) - { - auto names = ((SceneManager *)sceneManager)->getBoneNames(assetEntity, skinIndex); - return names->size(); - } - - EMSCRIPTEN_KEEPALIVE void get_bone_names(TSceneManager *sceneManager, EntityId assetEntity, const char **out, int skinIndex) - { - auto names = ((SceneManager *)sceneManager)->getBoneNames(assetEntity, skinIndex); - 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); - } - } - - EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(TSceneManager *sceneManager, EntityId entityId) - { - return ((SceneManager *)sceneManager)->updateBoneMatrices(entityId); - } - - EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity) - { - auto names = ((SceneManager *)sceneManager)->getMorphTargetNames(assetEntity, childEntity); - return (int)names->size(); - } - - EMSCRIPTEN_KEEPALIVE void get_morph_target_name(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index) - { - auto names = ((SceneManager *)sceneManager)->getMorphTargetNames(assetEntity, childEntity); - std::string name = names->at(index); - strcpy(outPtr, name.c_str()); - } - - EMSCRIPTEN_KEEPALIVE void remove_entity(TViewer *viewer, EntityId asset) - { - ((FilamentViewer *)viewer)->removeEntity(asset); - } - - EMSCRIPTEN_KEEPALIVE void clear_entities(TViewer *viewer) - { - ((FilamentViewer *)viewer)->clearEntities(); - } - - bool set_material_color(TSceneManager *sceneManager, EntityId asset, const char *meshName, int materialIndex, const float r, const float g, const float b, const float a) - { - return ((SceneManager *)sceneManager)->setMaterialColor(asset, meshName, materialIndex, r, g, b, a); - } - - EMSCRIPTEN_KEEPALIVE void transform_to_unit_cube(TSceneManager *sceneManager, EntityId asset) - { - ((SceneManager *)sceneManager)->transformToUnitCube(asset); - } - - EMSCRIPTEN_KEEPALIVE void set_position(TSceneManager *sceneManager, EntityId asset, float x, float y, float z) - { - ((SceneManager *)sceneManager)->setPosition(asset, x, y, z); - } - - EMSCRIPTEN_KEEPALIVE void set_rotation(TSceneManager *sceneManager, EntityId asset, float rads, float x, float y, float z, float w) - { - ((SceneManager *)sceneManager)->setRotation(asset, rads, x, y, z, w); - } - - EMSCRIPTEN_KEEPALIVE void set_scale(TSceneManager *sceneManager, EntityId asset, float scale) - { - ((SceneManager *)sceneManager)->setScale(asset, scale); - } - - EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(TSceneManager *sceneManager, TView *tView, EntityId entity, float viewportX, float viewportY) - { - auto *view = reinterpret_cast(tView); - ((SceneManager *)sceneManager)->queueRelativePositionUpdateFromViewportVector(view, entity, viewportX, viewportY); - } - - EMSCRIPTEN_KEEPALIVE void stop_animation(TSceneManager *sceneManager, EntityId asset, int index) - { - ((SceneManager *)sceneManager)->stopAnimation(asset, index); - } - - EMSCRIPTEN_KEEPALIVE int hide_mesh(TSceneManager *sceneManager, EntityId asset, const char *meshName) - { - return ((SceneManager *)sceneManager)->hide(asset, meshName); - } - - EMSCRIPTEN_KEEPALIVE int reveal_mesh(TSceneManager *sceneManager, EntityId asset, const char *meshName) - { - return ((SceneManager *)sceneManager)->reveal(asset, meshName); - } - - EMSCRIPTEN_KEEPALIVE const char *get_name_for_entity(TSceneManager *sceneManager, const EntityId entityId) - { - return ((SceneManager *)sceneManager)->getNameForEntity(entityId); - } - - EMSCRIPTEN_KEEPALIVE int get_entity_count(TSceneManager *sceneManager, const EntityId target, bool renderableOnly) - { - return ((SceneManager *)sceneManager)->getEntityCount(target, renderableOnly); - } - - EMSCRIPTEN_KEEPALIVE void get_entities(TSceneManager *sceneManager, const EntityId target, bool renderableOnly, EntityId *out) - { - ((SceneManager *)sceneManager)->getEntities(target, renderableOnly, out); - } - - EMSCRIPTEN_KEEPALIVE const char *get_entity_name_at(TSceneManager *sceneManager, const EntityId target, int index, bool renderableOnly) - { - return ((SceneManager *)sceneManager)->getEntityNameAt(target, index, renderableOnly); - } - - EMSCRIPTEN_KEEPALIVE void ios_dummy() - { - Log("Dummy called"); - } - - EMSCRIPTEN_KEEPALIVE void thermion_filament_free(void *ptr) - { - free(ptr); - } - - EMSCRIPTEN_KEEPALIVE void add_collision_component(TSceneManager *sceneManager, EntityId entityId, void (*onCollisionCallback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform) - { - ((SceneManager *)sceneManager)->addCollisionComponent(entityId, onCollisionCallback, affectsCollidingTransform); - } - - EMSCRIPTEN_KEEPALIVE void remove_collision_component(TSceneManager *sceneManager, EntityId entityId) - { - ((SceneManager *)sceneManager)->removeCollisionComponent(entityId); - } - - EMSCRIPTEN_KEEPALIVE bool add_animation_component(TSceneManager *sceneManager, EntityId entityId) - { - return ((SceneManager *)sceneManager)->addAnimationComponent(entityId); - } - - EMSCRIPTEN_KEEPALIVE void remove_animation_component(TSceneManager *sceneManager, EntityId entityId) - { - ((SceneManager *)sceneManager)->removeAnimationComponent(entityId); - } - - - EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(TSceneManager *sceneManager, const EntityId parent, const char *name) - { - auto entity = ((SceneManager *)sceneManager)->findChildEntityByName(parent, name); - return utils::Entity::smuggle(entity); - } - - EMSCRIPTEN_KEEPALIVE EntityId get_parent(TSceneManager *sceneManager, EntityId child) - { - return ((SceneManager *)sceneManager)->getParent(child); - } - - EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(TSceneManager *sceneManager, EntityId child) - { - return ((SceneManager *)sceneManager)->getAncestor(child); - } - - EMSCRIPTEN_KEEPALIVE void set_parent(TSceneManager *sceneManager, EntityId child, EntityId parent, bool preserveScaling) - { - ((SceneManager *)sceneManager)->setParent(child, parent, preserveScaling); - } - - EMSCRIPTEN_KEEPALIVE void test_collisions(TSceneManager *sceneManager, EntityId entity) - { - ((SceneManager *)sceneManager)->testCollisions(entity); - } - - EMSCRIPTEN_KEEPALIVE void set_priority(TSceneManager *sceneManager, EntityId entity, int priority) - { - ((SceneManager *)sceneManager)->setPriority(entity, priority); - } - - EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(TSceneManager *sceneManager, TView *tView, EntityId entity) - { - auto view = reinterpret_cast(tView); - return ((SceneManager *)sceneManager)->getScreenSpaceBoundingBox(view, entity); - } - - EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(TSceneManager *sceneManager, TView *tView, EntityId entity, float *minX, float *minY, float *maxX, float *maxY) - { - auto view = reinterpret_cast(tView); - auto box = ((SceneManager *)sceneManager)->getScreenSpaceBoundingBox(view, entity); - *minX = box.minX; - *minY = box.minY; - *maxX = box.maxX; - *maxY = box.maxY; - } - - EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr) - { - free(ptr); - } - - EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(TSceneManager *sceneManager, EntityId entityId, float r, float g, float b) - { - ((SceneManager *)sceneManager)->setStencilHighlight(entityId, r, g, b); - } - - EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(TSceneManager *sceneManager, EntityId entityId) - { - ((SceneManager *)sceneManager)->removeStencilHighlight(entityId); - } - - EMSCRIPTEN_KEEPALIVE void set_material_property_float(TSceneManager *sceneManager, EntityId entity, int materialIndex, const char *property, float value) - { - ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value); - } - - EMSCRIPTEN_KEEPALIVE TMaterialInstance *get_material_instance_at(TSceneManager *sceneManager, EntityId entity, int materialIndex) - { - auto instance = ((SceneManager *)sceneManager)->getMaterialInstanceAt(entity, materialIndex); - return reinterpret_cast(instance); - } - - EMSCRIPTEN_KEEPALIVE void set_material_property_int(TSceneManager *sceneManager, EntityId entity, int materialIndex, const char *property, int32_t value) - { - ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value); - } - - EMSCRIPTEN_KEEPALIVE void set_material_property_float4(TSceneManager *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); - } - - 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); - } - - EMSCRIPTEN_KEEPALIVE void *const create_texture(TSceneManager *sceneManager, uint8_t *data, size_t length) - { - return (void *const)((SceneManager *)sceneManager)->createTexture(data, length, "SOMETEXTURE"); - } - - EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(TSceneManager *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(TSceneManager *sceneManager, void *const texture) - { - ((SceneManager *)sceneManager)->destroyTexture(reinterpret_cast(texture)); - } - - EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_material_instance(TSceneManager *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 TCamera *Engine_getCameraComponent(TEngine *tEngine, EntityId entityId) - { - auto *engine = reinterpret_cast(tEngine); - auto *camera = engine->getCameraComponent(utils::Entity::import(entityId)); - return reinterpret_cast(camera); - } - - EMSCRIPTEN_KEEPALIVE void Engine_setTransform(TEngine *tEngine, EntityId entity, double4x4 transform) - { - auto *engine = reinterpret_cast(tEngine); - auto &transformManager = engine->getTransformManager(); - - auto transformInstance = transformManager.getInstance(utils::Entity::import(entity)); - if (!transformInstance.isValid()) - { - Log("Transform instance not valid"); - } - transformManager.setTransform(transformInstance, convert_double4x4_to_mat4(transform)); - } - - - -} diff --git a/thermion_dart/native/src/UnprojectTexture.cpp b/thermion_dart/native/src/UnprojectTexture.cpp index a8c7126e..71418b0d 100644 --- a/thermion_dart/native/src/UnprojectTexture.cpp +++ b/thermion_dart/native/src/UnprojectTexture.cpp @@ -17,7 +17,7 @@ #include -#include "CustomGeometry.hpp" +#include "scene/CustomGeometry.hpp" #include "UnprojectTexture.hpp" namespace thermion diff --git a/thermion_dart/native/src/c_api/TAnimationManager.cpp b/thermion_dart/native/src/c_api/TAnimationManager.cpp new file mode 100644 index 00000000..675a2666 --- /dev/null +++ b/thermion_dart/native/src/c_api/TAnimationManager.cpp @@ -0,0 +1,300 @@ +#include "Log.hpp" + +#include "c_api/APIExport.h" +#include "scene/AnimationManager.hpp" + +using namespace thermion; + +extern "C" +{ + +#include "c_api/TAnimationManager.h" + + EMSCRIPTEN_KEEPALIVE void AnimationManager_addAnimationComponent(TAnimationManager *tAnimationManager, EntityId entityId) + { + auto animationManager = reinterpret_cast(tAnimationManager); + animationManager->addAnimationComponent(entityId); + } + EMSCRIPTEN_KEEPALIVE void AnimationManager_removeAnimationComponent(TAnimationManager *tAnimationManager, EntityId entityId) + { + auto animationManager = reinterpret_cast(tAnimationManager); + animationManager->removeAnimationComponent(entityId); + } + + EMSCRIPTEN_KEEPALIVE bool AnimationManager_setMorphAnimation( + TAnimationManager *tAnimationManager, + EntityId entityId, + const float *const morphData, + const uint32_t *const morphIndices, + int numMorphTargets, + int numFrames, + float frameLengthInMs) + { + auto entity = utils::Entity::import(entityId); + auto *animationManager = reinterpret_cast(tAnimationManager); + auto result = animationManager->setMorphAnimationBuffer(entity, morphData, morphIndices, numMorphTargets, numFrames, frameLengthInMs); + return result; + } + + EMSCRIPTEN_KEEPALIVE bool AnimationManager_setMorphTargetWeights( + TAnimationManager *tAnimationManager, + EntityId entityId, + const float *const morphData, + int numWeights) + { + auto entity = utils::Entity::import(entityId); + auto *animationManager = reinterpret_cast(tAnimationManager); + animationManager->setMorphTargetWeights(entity, morphData, numWeights); + return true; + } + + EMSCRIPTEN_KEEPALIVE bool AnimationManager_clearMorphAnimation(TAnimationManager *tAnimationManager, EntityId entityId) + { + auto *animManager = reinterpret_cast(tAnimationManager); + auto entity = utils::Entity::import(entityId); + animManager->clearMorphAnimationBuffer(entity); + return true; + } + + EMSCRIPTEN_KEEPALIVE void AnimationManager_resetToRestPose(TAnimationManager *tAnimationManager, TSceneAsset *sceneAsset) + { + auto *animManager = reinterpret_cast(tAnimationManager); + auto asset = reinterpret_cast(sceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && asset->isInstance()) + { + auto *instance = reinterpret_cast(asset); + animManager->resetToRestPose(instance); + } + } + + EMSCRIPTEN_KEEPALIVE void AnimationManager_addBoneAnimation( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int skinIndex, + int boneIndex, + const float *const frameData, + int numFrames, + float frameLengthInMs, + float fadeOutInSecs, + float fadeInInSecs, + float maxDelta) + { + auto *animManager = reinterpret_cast(tAnimationManager); + auto asset = reinterpret_cast(sceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && asset->isInstance()) + { + animManager->addBoneAnimation(reinterpret_cast(asset), skinIndex, boneIndex, frameData, numFrames, frameLengthInMs, + fadeOutInSecs, fadeInInSecs, maxDelta); + } + } + + EMSCRIPTEN_KEEPALIVE EntityId AnimationManager_getBone( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int skinIndex, + int boneIndex) + { + auto *animManager = reinterpret_cast(tAnimationManager); + auto asset = reinterpret_cast(sceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && asset->isInstance()) + { + auto entities = animManager->getBoneEntities(reinterpret_cast(asset), skinIndex); + if (boneIndex < entities.size()) + { + return utils::Entity::smuggle(entities[boneIndex]); + } + } + + return 0; + } + + EMSCRIPTEN_KEEPALIVE void AnimationManager_getRestLocalTransforms( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int skinIndex, + float *const out, + int numBones) + { + auto *animManager = reinterpret_cast(tAnimationManager); + auto asset = reinterpret_cast(sceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && asset->isInstance()) + { + auto *instance = reinterpret_cast(asset); + const auto transforms = animManager->getBoneRestTranforms(instance, skinIndex); + auto numTransforms = transforms.size(); + if (numTransforms != numBones) + { + Log("Error - %d bone transforms available but you only specified %d.", numTransforms, numBones); + return; + } + for (int boneIndex = 0; boneIndex < numTransforms; boneIndex++) + { + const auto transform = transforms[boneIndex]; + 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 AnimationManager_getInverseBindMatrix( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int skinIndex, + int boneIndex, + float *const out) + { + auto *animManager = reinterpret_cast(tAnimationManager); + auto asset = reinterpret_cast(sceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && asset->isInstance()) + { + auto *instance = reinterpret_cast(asset); + auto transform = animManager->getInverseBindMatrix(instance, skinIndex, boneIndex); + for (int colNum = 0; colNum < 4; colNum++) + { + for (int rowNum = 0; rowNum < 4; rowNum++) + { + out[(colNum * 4) + rowNum] = transform[colNum][rowNum]; + } + } + } + } + + EMSCRIPTEN_KEEPALIVE void AnimationManager_playAnimation( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int index, + bool loop, + bool reverse, + bool replaceActive, + float crossfade, + float startOffset) + { + auto *animManager = reinterpret_cast(tAnimationManager); + auto asset = reinterpret_cast(sceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && asset->isInstance()) + { + auto *instance = reinterpret_cast(asset); + + animManager->playGltfAnimation(instance, index, loop, reverse, replaceActive, crossfade, startOffset); + } + } + + EMSCRIPTEN_KEEPALIVE void AnimationManager_stopAnimation( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int index) + { + auto *animManager = reinterpret_cast(tAnimationManager); + auto asset = reinterpret_cast(sceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && asset->isInstance()) + { + auto *instance = reinterpret_cast(asset); + + animManager->stopGltfAnimation(instance, index); + } + } + + EMSCRIPTEN_KEEPALIVE void AnimationManager_setGltfAnimationFrame( + TAnimationManager *tAnimationManager, + TSceneAsset *tSceneAsset, + int animationIndex, + int frame) + { + auto *animManager = reinterpret_cast(tAnimationManager); + auto asset = reinterpret_cast(tSceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && asset->isInstance()) + { + auto *instance = reinterpret_cast(asset); + animManager->setGltfAnimationFrame(instance, animationIndex, frame); + } + } + + EMSCRIPTEN_KEEPALIVE float AnimationManager_getAnimationDuration( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int animationIndex) + { + auto instance = ((GltfSceneAssetInstance *)sceneAsset); + return ((AnimationManager *)tAnimationManager)->getGltfAnimationDuration(instance, animationIndex); + } + + EMSCRIPTEN_KEEPALIVE int AnimationManager_getAnimationCount( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset) + { + auto instance = ((GltfSceneAssetInstance *)sceneAsset); + auto names = ((AnimationManager *)tAnimationManager)->getGltfAnimationNames(instance); + return (int)names.size(); + } + + EMSCRIPTEN_KEEPALIVE void AnimationManager_getAnimationName( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + char *const outPtr, + int index) + { + auto instance = ((GltfSceneAssetInstance *)sceneAsset); + auto names = ((AnimationManager *)tAnimationManager)->getGltfAnimationNames(instance); + std::string name = names[index]; + strcpy(outPtr, name.c_str()); + } + + EMSCRIPTEN_KEEPALIVE int AnimationManager_getBoneCount( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + int skinIndex) + { + auto instance = ((GltfSceneAssetInstance *)sceneAsset); + auto entities = ((AnimationManager *)tAnimationManager)->getBoneEntities(instance, skinIndex); + return (int)entities.size(); + } + + EMSCRIPTEN_KEEPALIVE void AnimationManager_getBoneNames( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + const char **out, + int skinIndex) + { + auto instance = ((GltfSceneAssetInstance *)sceneAsset); + auto entities = ((AnimationManager *)tAnimationManager)->getBoneEntities(instance, skinIndex); + // Note: This needs implementation of a method to get bone names from entities + // Current source doesn't show how bone names are retrieved + } + + EMSCRIPTEN_KEEPALIVE bool AnimationManager_updateBoneMatrices( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset) + { + auto instance = ((GltfSceneAssetInstance *)sceneAsset); + ((AnimationManager *)tAnimationManager)->updateBoneMatrices(instance); + return true; + } + + EMSCRIPTEN_KEEPALIVE int AnimationManager_getMorphTargetNameCount( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + EntityId childEntity) + { + auto asset = ((GltfSceneAsset *)sceneAsset); + auto names = ((AnimationManager *)tAnimationManager)->getMorphTargetNames(asset, childEntity); + return (int)names.size(); + } + + EMSCRIPTEN_KEEPALIVE void AnimationManager_getMorphTargetName( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + EntityId childEntity, + char *const outPtr, + int index) + { + auto asset = ((GltfSceneAsset *)sceneAsset); + auto names = ((AnimationManager *)tAnimationManager)->getMorphTargetNames(asset, childEntity); + std::string name = names[index]; + strcpy(outPtr, name.c_str()); + } +} \ No newline at end of file diff --git a/thermion_dart/native/src/TCamera.cpp b/thermion_dart/native/src/c_api/TCamera.cpp similarity index 97% rename from thermion_dart/native/src/TCamera.cpp rename to thermion_dart/native/src/c_api/TCamera.cpp index 716c0bf2..5d9a606e 100644 --- a/thermion_dart/native/src/TCamera.cpp +++ b/thermion_dart/native/src/c_api/TCamera.cpp @@ -6,11 +6,11 @@ #include #include -#include "ThermionDartApi.h" -#include "TCamera.h" -#include "ThermionDartAPIUtils.h" - +#include "c_api/ThermionDartApi.h" +#include "c_api/TCamera.h" #include "Log.hpp" +#include "MathUtils.hpp" + #ifdef __cplusplus namespace thermion diff --git a/thermion_dart/native/src/c_api/TGizmo.cpp b/thermion_dart/native/src/c_api/TGizmo.cpp new file mode 100644 index 00000000..ecc5ec51 --- /dev/null +++ b/thermion_dart/native/src/c_api/TGizmo.cpp @@ -0,0 +1,41 @@ +#include +#include +#include + +#include "c_api/TGizmo.h" +#include "scene/Gizmo.hpp" +#include "Log.hpp" + +#ifdef __cplusplus +namespace thermion +{ + extern "C" + { + using namespace filament; +#endif + + EMSCRIPTEN_KEEPALIVE void Gizmo_pick(TGizmo *tGizmo, uint32_t x, uint32_t y, GizmoPickCallback callback) + { + auto *gizmo = reinterpret_cast(tGizmo); + gizmo->pick(x, y, reinterpret_cast(callback)); + } + + EMSCRIPTEN_KEEPALIVE void Gizmo_highlight(TGizmo *tGizmo, TGizmoAxis tAxis) + { + auto *gizmo = reinterpret_cast(tGizmo); + auto axis = static_cast(tAxis); + gizmo->highlight(axis); + } + + EMSCRIPTEN_KEEPALIVE void Gizmo_unhighlight(TGizmo *tGizmo) + { + auto *gizmo = reinterpret_cast(tGizmo); + gizmo->unhighlight(Gizmo::Axis::X); + gizmo->unhighlight(Gizmo::Axis::Y); + gizmo->unhighlight(Gizmo::Axis::Z); + } + +#ifdef __cplusplus + } +} +#endif diff --git a/thermion_dart/native/src/c_api/TMaterialInstance.cpp b/thermion_dart/native/src/c_api/TMaterialInstance.cpp new file mode 100644 index 00000000..aa27a4cd --- /dev/null +++ b/thermion_dart/native/src/c_api/TMaterialInstance.cpp @@ -0,0 +1,136 @@ +#include +#include +#include +#include + +#include "Log.hpp" +#include "c_api/TMaterialInstance.h" + +#ifdef __cplusplus +namespace thermion +{ + extern "C" + { +#endif + + EMSCRIPTEN_KEEPALIVE bool MaterialInstance_isStencilWriteEnabled(TMaterialInstance *tMaterialInstance) + { + return reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance)->isStencilWriteEnabled(); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance *materialInstance, bool enabled) + { + reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setDepthWrite(enabled); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance *materialInstance, bool enabled) + { + reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setDepthCulling(enabled); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat4(TMaterialInstance *tMaterialInstance, const char *propertyName, double x, double y, double z, double w) + { + auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); + filament::math::float4 data{static_cast(x), static_cast(y), static_cast(z), static_cast(w)}; + materialInstance->setParameter(propertyName, data); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat2(TMaterialInstance *materialInstance, const char *propertyName, double x, double y) + { + filament::math::float2 data{static_cast(x), static_cast(y)}; + reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, data); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat(TMaterialInstance *materialInstance, const char *propertyName, double value) + { + reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, static_cast(value)); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance *materialInstance, const char *propertyName, int value) + { + reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, value); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthFunc(TMaterialInstance *tMaterialInstance, TSamplerCompareFunc tDepthFunc) + { + auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); + auto depthFunc = static_cast(tDepthFunc); + materialInstance->setDepthFunc(depthFunc); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilOpStencilFail(TMaterialInstance *tMaterialInstance, + TStencilOperation tOp, TStencilFace tFace) + { + auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); + auto op = static_cast(tOp); + auto face = static_cast(tFace); + materialInstance->setStencilOpStencilFail(op, face); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilOpDepthFail(TMaterialInstance *tMaterialInstance, + TStencilOperation tOp, TStencilFace tFace) + { + auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); + auto op = static_cast(tOp); + auto face = static_cast(tFace); + materialInstance->setStencilOpDepthFail(op, face); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilOpDepthStencilPass(TMaterialInstance *tMaterialInstance, + TStencilOperation tOp, TStencilFace tFace) + { + auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); + auto op = static_cast(tOp); + auto face = static_cast(tFace); + materialInstance->setStencilOpDepthStencilPass(op, face); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilCompareFunction(TMaterialInstance *tMaterialInstance, + TSamplerCompareFunc tFunc, TStencilFace tFace) + { + auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); + auto func = static_cast(tFunc); + auto face = static_cast(tFace); + materialInstance->setStencilCompareFunction(func, face); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilReferenceValue(TMaterialInstance *tMaterialInstance, + uint8_t value, TStencilFace tFace) + { + auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); + auto face = static_cast(tFace); + materialInstance->setStencilReferenceValue(value, face); + + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilWrite(TMaterialInstance *materialInstance, bool enabled) + { + reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setStencilWrite(enabled); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setCullingMode(TMaterialInstance *materialInstance, TCullingMode culling) + { + auto *instance = reinterpret_cast<::filament::MaterialInstance *>(materialInstance); + auto cullingMode = static_cast(culling); + instance->setCullingMode(cullingMode); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilReadMask( + TMaterialInstance *materialInstance, + uint8_t mask) + { + auto *instance = reinterpret_cast<::filament::MaterialInstance *>(materialInstance); + instance->setStencilReadMask(mask); + } + + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilWriteMask( + TMaterialInstance *materialInstance, + uint8_t mask) + { + auto *instance = reinterpret_cast<::filament::MaterialInstance *>(materialInstance); + instance->setStencilWriteMask(mask); + } +#ifdef __cplusplus + } +} +#endif diff --git a/thermion_dart/native/src/c_api/TMaterialProvider.cpp b/thermion_dart/native/src/c_api/TMaterialProvider.cpp new file mode 100644 index 00000000..5d5cfc40 --- /dev/null +++ b/thermion_dart/native/src/c_api/TMaterialProvider.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include + +#include "Log.hpp" +#include "c_api/TMaterialProvider.h" +#include "c_api/TMaterialInstance.h" + +#ifdef __cplusplus +namespace thermion +{ + using namespace filament; + extern "C" + { +#endif + + EMSCRIPTEN_KEEPALIVE TMaterialInstance *MaterialProvider_createMaterialInstance(TMaterialProvider *tMaterialProvider, TMaterialKey *materialConfig) + { + gltfio::MaterialKey config; + gltfio::UvMap uvMap; + memset(&config, 0, sizeof(gltfio::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 *materialProvider = reinterpret_cast(tMaterialProvider); + auto materialInstance = materialProvider->createMaterialInstance(&config, &uvMap); + return reinterpret_cast(materialInstance); + } +#ifdef __cplusplus + } +} +#endif diff --git a/thermion_dart/native/src/c_api/TNameComponentManager.cpp b/thermion_dart/native/src/c_api/TNameComponentManager.cpp new file mode 100644 index 00000000..b2d737a9 --- /dev/null +++ b/thermion_dart/native/src/c_api/TNameComponentManager.cpp @@ -0,0 +1,20 @@ +#include + +#include "c_api/APIExport.h" +#include "c_api/APIBoundaryTypes.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + EMSCRIPTEN_KEEPALIVE const char *NameComponentManager_getName(TNameComponentManager *tNameComponentManager, EntityId entity) + { + auto ncm = reinterpret_cast(tNameComponentManager); + auto instance = ncm->getInstance(utils::Entity::import(entity)); + return ncm->getName(instance); + } + +#ifdef __cplusplus +} +#endif diff --git a/thermion_dart/native/src/c_api/TRenderableManager.cpp b/thermion_dart/native/src/c_api/TRenderableManager.cpp new file mode 100644 index 00000000..ba3fb9cb --- /dev/null +++ b/thermion_dart/native/src/c_api/TRenderableManager.cpp @@ -0,0 +1,44 @@ + +#include +#include +#include + +#include "Log.hpp" +#include "c_api/TRenderableManager.h" + +namespace thermion +{ + + extern "C" + { + using namespace filament; + using namespace utils; + + EMSCRIPTEN_KEEPALIVE void RenderableManager_setMaterialInstanceAt(TRenderableManager *tRenderableManager, EntityId entityId, int primitiveIndex, TMaterialInstance *tMaterialInstance) + { + auto *renderableManager = reinterpret_cast(tRenderableManager); + const auto &entity = utils::Entity::import(entityId); + auto renderableInstance = renderableManager->getInstance(entity); + auto materialInstance = reinterpret_cast(tMaterialInstance); + renderableManager->setMaterialInstanceAt(renderableInstance, primitiveIndex, materialInstance); + } + + EMSCRIPTEN_KEEPALIVE TMaterialInstance *RenderableManager_getMaterialInstanceAt(TRenderableManager *tRenderableManager, EntityId entityId, int primitiveIndex) { + auto *renderableManager = reinterpret_cast(tRenderableManager); + const auto &entity = utils::Entity::import(entityId); + auto renderableInstance = renderableManager->getInstance(entity); + if(!renderableInstance.isValid()) { + return nullptr; + } + auto materialInstance = renderableManager->getMaterialInstanceAt(renderableInstance, primitiveIndex); + return reinterpret_cast(materialInstance); + } + + EMSCRIPTEN_KEEPALIVE void RenderableManager_setPriority(TRenderableManager *tRenderableManager, EntityId entityId, int priority) { + auto *renderableManager = reinterpret_cast(tRenderableManager); + const auto &entity = utils::Entity::import(entityId); + auto renderableInstance = renderableManager->getInstance(entity); + renderableManager->setPriority(renderableInstance, priority); + } + } +} \ No newline at end of file diff --git a/thermion_dart/native/src/c_api/TSceneAsset.cpp b/thermion_dart/native/src/c_api/TSceneAsset.cpp new file mode 100644 index 00000000..e018baef --- /dev/null +++ b/thermion_dart/native/src/c_api/TSceneAsset.cpp @@ -0,0 +1,108 @@ +#include "c_api/TSceneAsset.h" +#include "scene/SceneAsset.hpp" +#include "scene/GltfSceneAsset.hpp" + +using namespace thermion; + +#ifdef __cplusplus + +extern "C" +{ +#endif + + EMSCRIPTEN_KEEPALIVE void SceneAsset_addToScene(TSceneAsset *tSceneAsset, TScene *tScene) { + auto *asset = reinterpret_cast(tSceneAsset); + auto *scene = reinterpret_cast(tScene); + asset->addAllEntities(scene); + } + + EMSCRIPTEN_KEEPALIVE EntityId SceneAsset_getEntity(TSceneAsset *tSceneAsset) { + auto *asset = reinterpret_cast(tSceneAsset); + return utils::Entity::smuggle(asset->getEntity()); + } + + EMSCRIPTEN_KEEPALIVE int SceneAsset_getChildEntityCount(TSceneAsset* tSceneAsset) { + auto *asset = reinterpret_cast(tSceneAsset); + return asset->getChildEntityCount(); + } + + EMSCRIPTEN_KEEPALIVE void SceneAsset_getChildEntities(TSceneAsset* tSceneAsset, EntityId *out) + { + auto *asset = reinterpret_cast(tSceneAsset); + auto entities = asset->getChildEntities(); + for(int i = 0; i < asset->getChildEntityCount(); i++) { + out[i] = utils::Entity::smuggle(entities[i]); + } + } + + EMSCRIPTEN_KEEPALIVE const utils::Entity *SceneAsset_getCameraEntities(TSceneAsset* tSceneAsset) + { + auto *asset = reinterpret_cast(tSceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && !asset->isInstance()) + { + auto gltfSceneAsset = reinterpret_cast(asset); + return gltfSceneAsset->getAsset()->getCameraEntities(); + } + else + { + return std::nullptr_t(); + } + } + + EMSCRIPTEN_KEEPALIVE size_t SceneAsset_getCameraEntityCount(TSceneAsset* tSceneAsset) + { + auto *asset = reinterpret_cast(tSceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && !asset->isInstance()) + { + auto gltfSceneAsset = reinterpret_cast(asset); + return gltfSceneAsset->getAsset()->getCameraEntityCount(); + } + + return -1; + + } + + EMSCRIPTEN_KEEPALIVE const utils::Entity *SceneAsset_getLightEntities(TSceneAsset* tSceneAsset) + { + auto *asset = reinterpret_cast(tSceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && !asset->isInstance()) + { + auto gltfSceneAsset = reinterpret_cast(asset); + return gltfSceneAsset->getAsset()->getLightEntities(); + } + + return std::nullptr_t(); + + } + + EMSCRIPTEN_KEEPALIVE size_t SceneAsset_getLightEntityCount(TSceneAsset* tSceneAsset) + { + auto *asset = reinterpret_cast(tSceneAsset); + if (asset->getType() == SceneAsset::SceneAssetType::Gltf && !asset->isInstance()) + { + auto gltfSceneAsset = reinterpret_cast(asset); + return gltfSceneAsset->getAsset()->getLightEntityCount(); + } + + return -1; + } + + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneAsset_getInstance(TSceneAsset *tSceneAsset, int index) { + auto *asset = reinterpret_cast(tSceneAsset); + auto *instance = asset->getInstanceAt(index); + return reinterpret_cast(instance); + } + + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneAsset_createInstance(TSceneAsset *tSceneAsset, TMaterialInstance **tMaterialInstances, int materialInstanceCount) + { + auto *materialInstances = reinterpret_cast(tMaterialInstances); + auto *sceneAsset = reinterpret_cast(tSceneAsset); + auto *instance = sceneAsset->createInstance(materialInstances, materialInstanceCount); + return reinterpret_cast(instance); + } + + +#ifdef __cplusplus +} +#endif + diff --git a/thermion_dart/native/src/c_api/TSceneManager.cpp b/thermion_dart/native/src/c_api/TSceneManager.cpp new file mode 100644 index 00000000..931539ff --- /dev/null +++ b/thermion_dart/native/src/c_api/TSceneManager.cpp @@ -0,0 +1,219 @@ +#include + +#include "c_api/APIExport.h" +#include "ResourceBuffer.hpp" +#include "FilamentViewer.hpp" +#include "Log.hpp" + +using namespace thermion; + +extern "C" +{ + +#include "c_api/TSceneManager.h" + + EMSCRIPTEN_KEEPALIVE TScene *SceneManager_getScene(TSceneManager *tSceneManager) { + auto sceneManager = reinterpret_cast(tSceneManager); + return reinterpret_cast(sceneManager->getScene()); + } + + + EMSCRIPTEN_KEEPALIVE TMaterialProvider *SceneManager_getUnlitMaterialProvider(TSceneManager *tSceneManager) { + auto sceneManager = reinterpret_cast(tSceneManager); + auto provider = sceneManager->getUnlitMaterialProvider(); + return reinterpret_cast(provider); + } + + EMSCRIPTEN_KEEPALIVE TMaterialProvider *SceneManager_getUbershaderMaterialProvider(TSceneManager *tSceneManager) { + auto sceneManager = reinterpret_cast(tSceneManager); + auto provider = sceneManager->getUbershaderMaterialProvider(); + return reinterpret_cast(provider); + } + + EMSCRIPTEN_KEEPALIVE TGizmo *SceneManager_createGizmo(TSceneManager *tSceneManager, TView *tView, TScene *tScene) + { + auto sceneManager = reinterpret_cast(tSceneManager); + auto *scene = reinterpret_cast(tScene); + auto *view = reinterpret_cast(tView); + auto gizmo = sceneManager->createGizmo(view, scene); + return reinterpret_cast(gizmo); + } + + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlb(TSceneManager *tSceneManager, const char *assetPath, int numInstances, bool keepData) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + auto *asset = sceneManager->loadGlb(assetPath, numInstances, keepData); + return reinterpret_cast(asset); + } + + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGltf(TSceneManager *tSceneManager, + const char *assetPath, + const char *relativeResourcePath, + bool keepData) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + auto *asset = sceneManager->loadGltf(assetPath, relativeResourcePath, 1, keepData); + return reinterpret_cast(asset); + } + + + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlbFromBuffer(TSceneManager *tSceneManager, const uint8_t *const data, size_t length, bool keepData, int priority, int layer, bool loadResourcesAsync) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + auto *asset = sceneManager->loadGlbFromBuffer((const uint8_t *)data, length, 1, keepData, priority, layer, loadResourcesAsync); + return reinterpret_cast(asset); + } + + EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_getCameraByName(TSceneManager *tSceneManager, EntityId entityId, const char *name) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + return nullptr; + } + + EMSCRIPTEN_KEEPALIVE Aabb3 SceneManager_getRenderableBoundingBox(TSceneManager *tSceneManager, EntityId entity) + { + auto sceneManager = reinterpret_cast(tSceneManager); + return sceneManager->getRenderableBoundingBox(entity); + } + + EMSCRIPTEN_KEEPALIVE void SceneManager_setVisibilityLayer(TSceneManager *tSceneManager, EntityId entity, int layer) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + sceneManager->setVisibilityLayer(entity, layer); + } + + EMSCRIPTEN_KEEPALIVE TMaterialInstance *SceneManager_createUnlitMaterialInstance(TSceneManager *sceneManager) + { + auto *instance = ((SceneManager *)sceneManager)->createUnlitMaterialInstance(); + return reinterpret_cast(instance); + } + + EMSCRIPTEN_KEEPALIVE TMaterialInstance *SceneManager_createUnlitFixedSizeMaterialInstance(TSceneManager *sceneManager) + { + auto *instance = ((SceneManager *)sceneManager)->createUnlitFixedSizeMaterialInstance(); + return reinterpret_cast(instance); + } + + EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_createCamera(TSceneManager *tSceneManager) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + return reinterpret_cast(sceneManager->createCamera()); + } + + EMSCRIPTEN_KEEPALIVE void SceneManager_destroyCamera(TSceneManager *tSceneManager, TCamera *tCamera) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + auto *camera = reinterpret_cast(tCamera); + sceneManager->destroyCamera(camera); + } + + EMSCRIPTEN_KEEPALIVE size_t SceneManager_getCameraCount(TSceneManager *tSceneManager) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + return sceneManager->getCameraCount(); + } + + EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_getCameraAt(TSceneManager *tSceneManager, size_t index) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + auto *camera = sceneManager->getCameraAt(index); + return reinterpret_cast(camera); + } + + EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_createGeometry( + TSceneManager *tSceneManager, + float *vertices, + int numVertices, + float *normals, + int numNormals, + float *uvs, + int numUvs, + uint16_t *indices, + int numIndices, + int primitiveType, + TMaterialInstance **tMaterialInstances, + int materialInstanceCount, + bool keepData) + { + auto sceneManager = reinterpret_cast(tSceneManager); + auto castedNumVertices = static_cast(numVertices); + auto castedNumNormals = static_cast(numNormals); + auto castedNumUvs = static_cast(numUvs); + auto castedNumIndices = static_cast(numIndices); + auto castedPrimitiveType = static_cast(primitiveType); + auto materialInstances = reinterpret_cast(tMaterialInstances); + + auto *asset = sceneManager->createGeometry( + vertices, + castedNumVertices, + normals, + castedNumNormals, + uvs, + castedNumUvs, + indices, + castedNumIndices, + castedPrimitiveType, + materialInstances, + materialInstanceCount, + keepData); + return reinterpret_cast(asset); + } + + EMSCRIPTEN_KEEPALIVE void SceneManager_destroyMaterialInstance(TSceneManager *sceneManager, TMaterialInstance *instance) + { + ((SceneManager *)sceneManager)->destroy(reinterpret_cast(instance)); + } + + + EMSCRIPTEN_KEEPALIVE int SceneManager_removeFromScene(TSceneManager *sceneManager, EntityId entityId) + { + return ((SceneManager *)sceneManager)->removeFromScene(entityId); + } + + EMSCRIPTEN_KEEPALIVE int SceneManager_addToScene(TSceneManager *sceneManager, EntityId entityId) + { + return ((SceneManager *)sceneManager)->addToScene(entityId); + } + + EMSCRIPTEN_KEEPALIVE void SceneManager_transformToUnitCube(TSceneManager *sceneManager, EntityId entityId) + { + ((SceneManager *)sceneManager)->transformToUnitCube(entityId); + } + + EMSCRIPTEN_KEEPALIVE TAnimationManager *SceneManager_getAnimationManager(TSceneManager *tSceneManager) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + auto *animationManager = sceneManager->getAnimationManager(); + return reinterpret_cast(animationManager); + } + + EMSCRIPTEN_KEEPALIVE void *SceneManager_destroyAll(TSceneManager *tSceneManager) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + sceneManager->destroyAll(); + return nullptr; + } + + EMSCRIPTEN_KEEPALIVE void *SceneManager_destroyAsset(TSceneManager *tSceneManager, TSceneAsset *tSceneAsset) + { + auto *sceneManager = reinterpret_cast(tSceneManager); + auto *sceneAsset = reinterpret_cast(tSceneAsset); + sceneManager->destroy(sceneAsset); + return nullptr; + } + + EMSCRIPTEN_KEEPALIVE TNameComponentManager *SceneManager_getNameComponentManager(TSceneManager *tSceneManager) { + auto *sceneManager = reinterpret_cast(tSceneManager); + return reinterpret_cast(sceneManager->getNameComponentManager()); + } + + EMSCRIPTEN_KEEPALIVE size_t SceneManager_getOverlayEntityCount(TSceneManager *tSceneManager) { + auto *sceneManager = reinterpret_cast(tSceneManager); + return sceneManager->getOverlayEntityCount(); + } + EMSCRIPTEN_KEEPALIVE EntityId SceneManager_getOverlayEntityAt(TSceneManager *tSceneManager, size_t index) { + auto *sceneManager = reinterpret_cast(tSceneManager); + auto entity = sceneManager->getOverlayEntity(index); + return utils::Entity::smuggle(entity); + } +} \ No newline at end of file diff --git a/thermion_dart/native/src/c_api/TTransformManager.cpp b/thermion_dart/native/src/c_api/TTransformManager.cpp new file mode 100644 index 00000000..f8b862d5 --- /dev/null +++ b/thermion_dart/native/src/c_api/TTransformManager.cpp @@ -0,0 +1,155 @@ +#include +#include +#include +#include + +#include "c_api/APIExport.h" +#include "MathUtils.hpp" +#include "Log.hpp" + +using namespace thermion; + +extern "C" +{ + using namespace filament; + using namespace utils; + using namespace filament::gltfio; + +#include "c_api/TTransformManager.h" + + EMSCRIPTEN_KEEPALIVE double4x4 TransformManager_getLocalTransform(TTransformManager *tTransformManager, EntityId entityId) + { + auto *transformManager = reinterpret_cast(tTransformManager); + const auto &entity = utils::Entity::import(entityId); + auto transformInstance = transformManager->getInstance(entity); + if (!transformInstance) + { + Log("Failed to find transform instance"); + return double4x4(); + } + auto transform = transformManager->getTransformAccurate(transformInstance); + return convert_mat4_to_double4x4(transform); + } + + EMSCRIPTEN_KEEPALIVE double4x4 TransformManager_getWorldTransform(TTransformManager *tTransformManager, EntityId entityId) + { + auto *transformManager = reinterpret_cast(tTransformManager); + const auto &entity = utils::Entity::import(entityId); + auto transformInstance = transformManager->getInstance(entity); + if (!transformInstance) + { + Log("Failed to find transform instance"); + return double4x4(); + } + auto transform = transformManager->getWorldTransformAccurate(transformInstance); + return convert_mat4_to_double4x4(transform); + } + + EMSCRIPTEN_KEEPALIVE void TransformManager_setTransform(TTransformManager *tTransformManager, EntityId entityId, double4x4 transform) + { + auto *transformManager = reinterpret_cast(tTransformManager); + const auto &entity = utils::Entity::import(entityId); + auto transformInstance = transformManager->getInstance(entity); + if (!transformInstance) + { + return; + } + transformManager->setTransform(transformInstance, convert_double4x4_to_mat4(transform)); + } + + // EMSCRIPTEN_KEEPALIVE void TransformManager_transformToUnitCube(TTransformManager *tTransformManager, EntityId entityId) { + // auto *transformManager = reinterpret_cast(tTransformManager); + // const auto &entity = utils::Entity::import(entityId); + // auto transformInstance = transformManager->getInstance(entity); + // if (!transformInstance) + // { + // return; + // } + + // auto aabb = instance->getBoundingBox(); + // auto center = aabb.center(); + // auto halfExtent = aabb.extent(); + // auto maxExtent = max(halfExtent) * 2; + // auto scaleFactor = 2.0f / maxExtent; + // auto transform = math::mat4f::scaling(scaleFactor) * math::mat4f::translation(-center); + // tm.setTransform(tm.getInstance(instance->getRoot()), transform); + // } + + EMSCRIPTEN_KEEPALIVE void TransformManager_setParent(TTransformManager *tTransformManager, EntityId childId, EntityId parentId, bool preserveScaling) + { + auto tm = reinterpret_cast(tTransformManager); + const auto child = Entity::import(childId); + const auto parent = Entity::import(parentId); + + 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; + } + + 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); + } + + tm->setParent(childInstance, parentInstance); + } + + EMSCRIPTEN_KEEPALIVE EntityId TransformManager_getParent(TTransformManager *tTransformManager, EntityId childId) + { + auto tm = reinterpret_cast(tTransformManager); + const auto child = Entity::import(childId); + const auto &childInstance = tm->getInstance(child); + + return Entity::smuggle(tm->getParent(childInstance)); + } + + EMSCRIPTEN_KEEPALIVE EntityId TransformManager_getAncestor(TTransformManager *tTransformManager, EntityId childEntityId) + { + auto tm = reinterpret_cast(tTransformManager); + + 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); + } +} \ No newline at end of file diff --git a/thermion_dart/native/src/TView.cpp b/thermion_dart/native/src/c_api/TView.cpp similarity index 85% rename from thermion_dart/native/src/TView.cpp rename to thermion_dart/native/src/c_api/TView.cpp index cc8df3b6..05d57e0b 100644 --- a/thermion_dart/native/src/TView.cpp +++ b/thermion_dart/native/src/c_api/TView.cpp @@ -5,8 +5,8 @@ #include #include -#include "ThermionDartApi.h" -#include "TView.h" +#include "c_api/ThermionDartApi.h" +#include "c_api/TView.h" #include "Log.hpp" #ifdef __cplusplus @@ -155,6 +155,25 @@ using namespace filament; return reinterpret_cast(&(view->getCamera())); } + EMSCRIPTEN_KEEPALIVE void View_setStencilBufferEnabled(TView *tView, bool enabled) { + auto view = reinterpret_cast(tView); + view->setStencilBufferEnabled(enabled); + } + + EMSCRIPTEN_KEEPALIVE bool View_isStencilBufferEnabled(TView *tView) { + auto view = reinterpret_cast(tView); + return view->isStencilBufferEnabled(); + } + + + + EMSCRIPTEN_KEEPALIVE void View_pick(TView *tView, uint32_t requestId, uint32_t x, uint32_t y, PickCallback callback) + { + auto *view = reinterpret_cast(tView); + view->pick(x, y, [=](filament::View::PickingQueryResult const &result) { + callback(requestId, utils::Entity::smuggle(result.renderable), result.depth, result.fragCoords.x, result.fragCoords.y, result.fragCoords.z); + }); + } #ifdef __cplusplus } diff --git a/thermion_dart/native/src/c_api/ThermionDartApi.cpp b/thermion_dart/native/src/c_api/ThermionDartApi.cpp new file mode 100644 index 00000000..6aad99ac --- /dev/null +++ b/thermion_dart/native/src/c_api/ThermionDartApi.cpp @@ -0,0 +1,511 @@ +#ifdef _WIN32 +#include "ThermionWin32.h" +#endif + +#include +#include + +#ifdef __EMSCRIPTEN__ +#include +#endif + +#include "filament/LightManager.h" +#include "ResourceBuffer.hpp" +#include "FilamentViewer.hpp" +#include "Log.hpp" +#include "ThreadPool.hpp" + +using namespace thermion; + +extern "C" +{ + +#include "c_api/ThermionDartApi.h" + + EMSCRIPTEN_KEEPALIVE TViewer *Viewer_create(const void *context, const void *const loader, void *const platform, const char *uberArchivePath) + { + const auto *loaderImpl = new ResourceLoaderWrapperImpl((ResourceLoaderWrapper *)loader); + auto viewer = new FilamentViewer(context, loaderImpl, platform, uberArchivePath); + return reinterpret_cast(viewer); + } + + EMSCRIPTEN_KEEPALIVE TEngine *Viewer_getEngine(TViewer *viewer) + { + auto *engine = reinterpret_cast(viewer)->getEngine(); + return reinterpret_cast(engine); + } + + EMSCRIPTEN_KEEPALIVE TRenderTarget *Viewer_createRenderTarget(TViewer *tViewer, intptr_t texture, uint32_t width, uint32_t height) + { + auto viewer = reinterpret_cast(tViewer); + auto renderTarget = viewer->createRenderTarget(texture, width, height); + return reinterpret_cast(renderTarget); + } + + EMSCRIPTEN_KEEPALIVE void Viewer_destroyRenderTarget(TViewer *tViewer, TRenderTarget *tRenderTarget) + { + auto viewer = reinterpret_cast(tViewer); + auto renderTarget = reinterpret_cast(tRenderTarget); + viewer->destroyRenderTarget(renderTarget); + } + + EMSCRIPTEN_KEEPALIVE void Viewer_destroy(TViewer *viewer) + { + delete ((FilamentViewer *)viewer); + } + + 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(TViewer *viewer) + { + ((FilamentViewer *)viewer)->clearBackgroundImage(); + } + + EMSCRIPTEN_KEEPALIVE void set_background_image(TViewer *viewer, const char *path, bool fillHeight) + { + ((FilamentViewer *)viewer)->setBackgroundImage(path, fillHeight, 100, 100); + } + + EMSCRIPTEN_KEEPALIVE void set_background_image_position(TViewer *viewer, float x, float y, bool clamp) + { + ((FilamentViewer *)viewer)->setBackgroundImagePosition(x, y, clamp, 100, 100); + } + + EMSCRIPTEN_KEEPALIVE void load_skybox(TViewer *viewer, const char *skyboxPath) + { + ((FilamentViewer *)viewer)->loadSkybox(skyboxPath); + } + + 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 Viewer_loadIbl(TViewer *viewer, const char *iblPath, float intensity) + { + ((FilamentViewer *)viewer)->loadIbl(iblPath, intensity); + } + + EMSCRIPTEN_KEEPALIVE void rotate_ibl(TViewer *viewer, float *rotationMatrix) + { + math::mat3f matrix(rotationMatrix[0], rotationMatrix[1], + rotationMatrix[2], + rotationMatrix[3], + rotationMatrix[4], + rotationMatrix[5], + rotationMatrix[6], + rotationMatrix[7], + rotationMatrix[8]); + + ((FilamentViewer *)viewer)->rotateIbl(matrix); + } + + EMSCRIPTEN_KEEPALIVE void remove_skybox(TViewer *viewer) + { + ((FilamentViewer *)viewer)->removeSkybox(); + } + + EMSCRIPTEN_KEEPALIVE void remove_ibl(TViewer *viewer) + { + ((FilamentViewer *)viewer)->removeIbl(); + } + + EMSCRIPTEN_KEEPALIVE EntityId add_light( + TViewer *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) + { + 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(TViewer *viewer, int32_t entityId, float x, float y, float z) + { + ((FilamentViewer *)viewer)->setLightPosition(entityId, x, y, 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(TViewer *viewer, int32_t entityId) + { + ((FilamentViewer *)viewer)->removeLight(entityId); + } + + EMSCRIPTEN_KEEPALIVE void clear_lights(TViewer *viewer) + { + ((FilamentViewer *)viewer)->clearLights(); + } + + EMSCRIPTEN_KEEPALIVE int get_instance_count(TSceneManager *sceneManager, EntityId entityId) + { + return ((SceneManager *)sceneManager)->getInstanceCount(entityId); + } + + EMSCRIPTEN_KEEPALIVE void get_instances(TSceneManager *sceneManager, EntityId entityId, EntityId *out) + { + return ((SceneManager *)sceneManager)->getInstances(entityId, out); + } + + EMSCRIPTEN_KEEPALIVE void Viewer_setMainCamera(TViewer *tViewer, TView *tView) + { + auto *viewer = reinterpret_cast(tViewer); + auto *view = reinterpret_cast(tView); + viewer->setMainCamera(view); + } + + EMSCRIPTEN_KEEPALIVE EntityId get_main_camera(TViewer *viewer) + { + return ((FilamentViewer *)viewer)->getMainCamera(); + } + + 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(TCamera *const camera) + { + auto cam = reinterpret_cast(camera); + return cam->getFocalLength(); + } + + 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 TCamera *get_camera(TViewer *viewer, EntityId entity) + { + auto filamentCamera = ((FilamentViewer *)viewer)->getCamera(entity); + return reinterpret_cast(filamentCamera); + } + + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_model_matrix(TCamera *camera) + { + const auto &mat = reinterpret_cast(camera)->getModelMatrix(); + return convert_mat4_to_double4x4(mat); + } + + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_view_matrix(TCamera *camera) + { + const auto &mat = reinterpret_cast(camera)->getViewMatrix(); + return convert_mat4_to_double4x4(mat); + } + + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_projection_matrix(TCamera *camera) + { + const auto &mat = reinterpret_cast(camera)->getProjectionMatrix(); + return convert_mat4_to_double4x4(mat); + } + + EMSCRIPTEN_KEEPALIVE double4x4 get_camera_culling_projection_matrix(TCamera *camera) + { + const auto &mat = reinterpret_cast(camera)->getCullingProjectionMatrix(); + return convert_mat4_to_double4x4(mat); + } + + EMSCRIPTEN_KEEPALIVE 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); + } + + EMSCRIPTEN_KEEPALIVE void Camera_setLensProjection(TCamera *camera, double near, double far, double aspect, double focalLength) + { + auto cam = reinterpret_cast(camera); + cam->setLensProjection(focalLength, aspect, near, far); + } + + EMSCRIPTEN_KEEPALIVE void Camera_setModelMatrix(TCamera *camera, double4x4 matrix) + { + auto cam = reinterpret_cast(camera); + cam->setModelMatrix(convert_double4x4_to_mat4(matrix)); + } + + EMSCRIPTEN_KEEPALIVE double get_camera_near(TCamera *camera) + { + auto cam = reinterpret_cast(camera); + return cam->getNear(); + } + + EMSCRIPTEN_KEEPALIVE double get_camera_culling_far(TCamera *camera) + { + auto cam = reinterpret_cast(camera); + return cam->getCullingFar(); + } + + EMSCRIPTEN_KEEPALIVE const double *const get_camera_frustum(TCamera *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++) + { + auto plane = planes[i]; + array[i * 4] = double(plane.x); + array[i * 4 + 1] = double(plane.y); + array[i * 4 + 2] = double(plane.z); + array[i * 4 + 3] = double(plane.w); + } + + return array; + } + + 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(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(TCamera *camera, double4x4 matrix) + { + auto *cam = reinterpret_cast(camera); + const filament::math::mat4 &mat = convert_double4x4_to_mat4(matrix); + cam->setModelMatrix(mat); + } + + EMSCRIPTEN_KEEPALIVE void Viewer_render( + TViewer *tViewer) + { + auto viewer = reinterpret_cast(tViewer); + viewer->render(0); + } + + EMSCRIPTEN_KEEPALIVE void Viewer_setViewRenderable(TViewer *tViewer, TSwapChain *tSwapChain, TView *tView, bool renderable) + { + auto viewer = reinterpret_cast(tViewer); + auto swapChain = reinterpret_cast(tSwapChain); + auto *view = reinterpret_cast(tView); + viewer->setRenderable(view, swapChain, renderable); + } + + EMSCRIPTEN_KEEPALIVE void Viewer_capture( + TViewer *tViewer, + TView *tView, + TSwapChain *tSwapChain, + uint8_t *pixelBuffer, + void (*callback)(void)) + { +#ifdef __EMSCRIPTEN__ + bool useFence = true; +#else + bool useFence = false; +#endif + auto swapChain = reinterpret_cast(tSwapChain); + auto viewer = reinterpret_cast(tViewer); + auto *view = reinterpret_cast(tView); + viewer->capture(view, pixelBuffer, useFence, swapChain, callback); + }; + + EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTarget( + TViewer *tViewer, + TView *tView, + TSwapChain *tSwapChain, + TRenderTarget *tRenderTarget, + uint8_t *pixelBuffer, + void (*callback)(void)) + { +#ifdef __EMSCRIPTEN__ + bool useFence = true; +#else + bool useFence = false; +#endif + auto swapChain = reinterpret_cast(tSwapChain); + auto renderTarget = reinterpret_cast(tRenderTarget); + auto viewer = reinterpret_cast(tViewer); + auto *view = reinterpret_cast(tView); + viewer->capture(view, pixelBuffer, useFence, swapChain, renderTarget, callback); + }; + + EMSCRIPTEN_KEEPALIVE void set_frame_interval( + TViewer *viewer, + float frameInterval) + { + ((FilamentViewer *)viewer)->setFrameInterval(frameInterval); + } + + EMSCRIPTEN_KEEPALIVE void Viewer_destroySwapChain(TViewer *tViewer, TSwapChain *tSwapChain) + { + auto viewer = reinterpret_cast(tViewer); + auto swapChain = reinterpret_cast(tSwapChain); + viewer->destroySwapChain(swapChain); + } + + EMSCRIPTEN_KEEPALIVE TSwapChain *Viewer_createHeadlessSwapChain(TViewer *tViewer, uint32_t width, uint32_t height) + { + auto viewer = reinterpret_cast(tViewer); + auto swapChain = viewer->createSwapChain(width, height); + return reinterpret_cast(swapChain); + } + + EMSCRIPTEN_KEEPALIVE TSwapChain *Viewer_createSwapChain(TViewer *tViewer, const void *const window) + { + auto viewer = reinterpret_cast(tViewer); + auto swapChain = viewer->createSwapChain(window); + return reinterpret_cast(swapChain); + } + + EMSCRIPTEN_KEEPALIVE TSwapChain *Viewer_getSwapChainAt(TViewer *tViewer, int index) + { + auto viewer = reinterpret_cast(tViewer); + auto swapChain = viewer->getSwapChainAt(index); + return reinterpret_cast(swapChain); + } + + EMSCRIPTEN_KEEPALIVE TView *Viewer_createView(TViewer *tViewer) + { + auto viewer = reinterpret_cast(tViewer); + auto view = viewer->createView(); + return reinterpret_cast(view); + } + + EMSCRIPTEN_KEEPALIVE TView *Viewer_getViewAt(TViewer *tViewer, int32_t index) + { + auto viewer = reinterpret_cast(tViewer); + auto view = viewer->getViewAt(index); + return reinterpret_cast(view); + } + + EMSCRIPTEN_KEEPALIVE TSceneManager *Viewer_getSceneManager(TViewer *tViewer) + { + auto *viewer = reinterpret_cast(tViewer); + auto *sceneManager = viewer->getSceneManager(); + return reinterpret_cast(sceneManager); + } + + EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(TSceneManager *sceneManager, TView *tView, EntityId entity, float viewportX, float viewportY) + { + auto *view = reinterpret_cast(tView); + ((SceneManager *)sceneManager)->queueRelativePositionUpdateFromViewportVector(view, entity, viewportX, viewportY); + } + + EMSCRIPTEN_KEEPALIVE void ios_dummy() + { + Log("Dummy called"); + } + + EMSCRIPTEN_KEEPALIVE void thermion_filament_free(void *ptr) + { + free(ptr); + } + + EMSCRIPTEN_KEEPALIVE void add_collision_component(TSceneManager *sceneManager, EntityId entityId, void (*onCollisionCallback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform) + { + ((SceneManager *)sceneManager)->addCollisionComponent(entityId, onCollisionCallback, affectsCollidingTransform); + } + + EMSCRIPTEN_KEEPALIVE void remove_collision_component(TSceneManager *sceneManager, EntityId entityId) + { + ((SceneManager *)sceneManager)->removeCollisionComponent(entityId); + } + + EMSCRIPTEN_KEEPALIVE void test_collisions(TSceneManager *sceneManager, EntityId entity) + { + ((SceneManager *)sceneManager)->testCollisions(entity); + } + + EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(TSceneManager *sceneManager, TView *tView, EntityId entity) + { + auto view = reinterpret_cast(tView); + return ((SceneManager *)sceneManager)->getScreenSpaceBoundingBox(view, entity); + } + + EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(TSceneManager *sceneManager, TView *tView, EntityId entity, float *minX, float *minY, float *maxX, float *maxY) + { + auto view = reinterpret_cast(tView); + auto box = ((SceneManager *)sceneManager)->getScreenSpaceBoundingBox(view, entity); + *minX = box.minX; + *minY = box.minY; + *maxX = box.maxX; + *maxY = box.maxY; + } + + EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr) + { + free(ptr); + } + + 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); + } + + EMSCRIPTEN_KEEPALIVE void *const create_texture(TSceneManager *sceneManager, uint8_t *data, size_t length) + { + return (void *const)((SceneManager *)sceneManager)->createTexture(data, length, "SOMETEXTURE"); + } + + EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(TSceneManager *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(TSceneManager *sceneManager, void *const texture) + { + ((SceneManager *)sceneManager)->destroyTexture(reinterpret_cast(texture)); + } + + EMSCRIPTEN_KEEPALIVE TTransformManager *Engine_getTransformManager(TEngine *tEngine) + { + auto *engine = reinterpret_cast(tEngine); + auto &transformManager = engine->getTransformManager(); + return reinterpret_cast(&transformManager); + } + + EMSCRIPTEN_KEEPALIVE TRenderableManager *Engine_getRenderableManager(TEngine *tEngine) + { + auto *engine = reinterpret_cast(tEngine); + auto &renderableManager = engine->getRenderableManager(); + return reinterpret_cast(&renderableManager); + } + + 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); + } + + EMSCRIPTEN_KEEPALIVE void Engine_setTransform(TEngine *tEngine, EntityId entity, double4x4 transform) + { + auto *engine = reinterpret_cast(tEngine); + auto &transformManager = engine->getTransformManager(); + + auto transformInstance = transformManager.getInstance(utils::Entity::import(entity)); + if (!transformInstance.isValid()) + { + Log("Transform instance not valid"); + } + transformManager.setTransform(transformInstance, convert_double4x4_to_mat4(transform)); + } +} diff --git a/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp similarity index 61% rename from thermion_dart/native/src/ThermionDartRenderThreadApi.cpp rename to thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp index cec11107..c99cf0ff 100644 --- a/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp +++ b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp @@ -3,14 +3,20 @@ #include #include -#include "ThermionDartRenderThreadApi.h" -#include "FilamentViewer.hpp" -#include "TView.h" -#include "Log.hpp" -#include "ThreadPool.hpp" -#include "TSceneManager.h" +#include + +#include "c_api/APIBoundaryTypes.h" +#include "c_api/TView.h" +#include "c_api/TSceneAsset.h" +#include "c_api/TSceneManager.h" +#include "c_api/TAnimationManager.h" +#include "c_api/ThermionDartRenderThreadApi.h" + +#include "FilamentViewer.hpp" +#include "Log.hpp" + +#include "ThreadPool.hpp" -#include "filament/LightManager.h" using namespace thermion; using namespace std::chrono_literals; @@ -99,8 +105,7 @@ public: } _cv.wait_for(taskLock, std::chrono::microseconds(2000), [this] - { return !_tasks.empty() || _stop; }); - + { return !_tasks.empty() || _stop; }); } void createViewer(void *const context, @@ -109,7 +114,7 @@ public: const ResourceLoaderWrapper *const loader, void (*renderCallback)(void *), void *const owner, - void (*callback)(TViewer*)) + void (*callback)(TViewer *)) { _renderCallback = renderCallback; _renderCallbackOwner = owner; @@ -117,8 +122,7 @@ public: { auto viewer = (FilamentViewer *)Viewer_create(context, loader, platform, uberArchivePath); _viewer = reinterpret_cast(viewer); - callback(_viewer); - }); + callback(_viewer); }); auto fut = add_task(lambda); } @@ -159,7 +163,7 @@ public: } private: - void(*_requestFrameRenderCallback)() = nullptr; + void (*_requestFrameRenderCallback)() = nullptr; bool _stop = false; int _frameIntervalInMicroseconds = 1000000 / 60; std::mutex _mutex; @@ -205,9 +209,9 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void Viewer_createHeadlessSwapChainRenderThread(TViewer *viewer, - uint32_t width, - uint32_t height, - void (*onComplete)(TSwapChain*)) + uint32_t width, + uint32_t height, + void (*onComplete)(TSwapChain *)) { std::packaged_task lambda( [=]() mutable @@ -219,8 +223,8 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void Viewer_createSwapChainRenderThread(TViewer *viewer, - void *const surface, - void (*onComplete)(TSwapChain*)) + void *const surface, + void (*onComplete)(TSwapChain *)) { std::packaged_task lambda( [=]() mutable @@ -242,8 +246,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - - EMSCRIPTEN_KEEPALIVE void Viewer_requestFrameRenderThread(TViewer *viewer, void(*onComplete)()) + EMSCRIPTEN_KEEPALIVE void Viewer_requestFrameRenderThread(TViewer *viewer, void (*onComplete)()) { if (!_rl) { @@ -255,24 +258,26 @@ extern "C" } } - EMSCRIPTEN_KEEPALIVE void Viewer_loadIblRenderThread(TViewer *viewer, const char *iblPath, float intensity, void(*onComplete)()) { - std::packaged_task lambda( + EMSCRIPTEN_KEEPALIVE void Viewer_loadIblRenderThread(TViewer *viewer, const char *iblPath, float intensity, void (*onComplete)()) + { + std::packaged_task lambda( [=]() mutable { Viewer_loadIbl(viewer, iblPath, intensity); onComplete(); }); - auto fut = _rl->add_task(lambda); + auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void Viewer_createRenderTargetRenderThread(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height, void(*onComplete)(TRenderTarget*)) { + EMSCRIPTEN_KEEPALIVE void Viewer_createRenderTargetRenderThread(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height, void (*onComplete)(TRenderTarget *)) + { std::packaged_task lambda( [=]() mutable { auto renderTarget = Viewer_createRenderTarget(viewer, texture, width, height); onComplete(renderTarget); }); - auto fut = _rl->add_task(lambda); + auto fut = _rl->add_task(lambda); } EMSCRIPTEN_KEEPALIVE void @@ -287,9 +292,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void Viewer_renderRenderThread(TViewer *viewer, TView *tView, TSwapChain *tSwapChain) { std::packaged_task lambda([=]() mutable - { - _rl->doRender(); - }); + { _rl->doRender(); }); auto fut = _rl->add_task(lambda); } @@ -300,7 +303,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTargetRenderThread(TViewer *viewer, TView *view, TSwapChain *tSwapChain, TRenderTarget* tRenderTarget, uint8_t *pixelBuffer, void (*onComplete)()) + EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTargetRenderThread(TViewer *viewer, TView *view, TSwapChain *tSwapChain, TRenderTarget *tRenderTarget, uint8_t *pixelBuffer, void (*onComplete)()) { std::packaged_task lambda([=]() mutable { Viewer_captureRenderTarget(viewer, view, tSwapChain, tRenderTarget, pixelBuffer, onComplete); }); @@ -317,32 +320,30 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void load_gltf_render_thread(TSceneManager *sceneManager, - const char *path, - const char *relativeResourcePath, - bool keepData, - void (*callback)(EntityId)) + EMSCRIPTEN_KEEPALIVE void SceneManager_loadGltfRenderThread(TSceneManager *sceneManager, + const char *path, + const char *relativeResourcePath, + bool keepData, + void (*callback)(TSceneAsset *)) { - std::packaged_task lambda([=]() mutable - { - auto entity = load_gltf(sceneManager, path, relativeResourcePath, keepData); - callback(entity); - return entity; }); + std::packaged_task lambda([=]() mutable + { + auto entity = SceneManager_loadGltf(sceneManager, path, relativeResourcePath, keepData); + callback(entity); }); auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void load_glb_render_thread(TSceneManager *sceneManager, - const char *path, - int numInstances, - bool keepData, - void (*callback)(EntityId)) + EMSCRIPTEN_KEEPALIVE void SceneManager_loadGlbRenderThread(TSceneManager *sceneManager, + const char *path, + int numInstances, + bool keepData, + void (*callback)(TSceneAsset *)) { - std::packaged_task lambda( + std::packaged_task lambda( [=]() mutable { - auto entity = load_glb(sceneManager, path, numInstances, keepData); - callback(entity); - return entity; + auto asset = SceneManager_loadGlb(sceneManager, path, numInstances, keepData); + callback(asset); }); auto fut = _rl->add_task(lambda); } @@ -358,22 +359,47 @@ extern "C" uint16_t *indices, int numIndices, int primitiveType, - TMaterialInstance *materialInstance, + TMaterialInstance **materialInstances, + int materialInstanceCount, bool keepData, - void (*callback)(EntityId)) + void (*callback)(TSceneAsset *)) { - std::packaged_task lambda( + std::packaged_task lambda( [=] { - auto entity = SceneManager_createGeometry(sceneManager, vertices, numVertices, normals, numNormals, uvs, numUvs, indices, numIndices, primitiveType, materialInstance, keepData); - callback(entity); - return entity; + auto *asset = SceneManager_createGeometry(sceneManager, vertices, numVertices, normals, numNormals, uvs, numUvs, indices, numIndices, primitiveType, materialInstances, materialInstanceCount, keepData); + callback(asset); }); auto fut = _rl->add_task(lambda); } + EMSCRIPTEN_KEEPALIVE void SceneAsset_createInstanceRenderThread( + TSceneAsset *asset, TMaterialInstance **tMaterialInstances, + int materialInstanceCount, + void (*callback)(TSceneAsset *)) + { + std::packaged_task lambda( + [=] + { + auto instanceAsset = SceneAsset_createInstance(asset, tMaterialInstances, materialInstanceCount); + callback(instanceAsset); + }); + auto fut = _rl->add_task(lambda); + } - EMSCRIPTEN_KEEPALIVE void SceneManager_createUnlitMaterialInstanceRenderThread(TSceneManager *sceneManager, void (*callback)(TMaterialInstance*)) { + EMSCRIPTEN_KEEPALIVE void MaterialProvider_createMaterialInstanceRenderThread(TMaterialProvider *tMaterialProvider, TMaterialKey *tKey, void (*callback)(TMaterialInstance *)) + { + std::packaged_task lambda( + [=] + { + auto materialInstance = MaterialProvider_createMaterialInstance(tMaterialProvider, tKey); + callback(materialInstance); + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void SceneManager_createUnlitMaterialInstanceRenderThread(TSceneManager *sceneManager, void (*callback)(TMaterialInstance *)) + { std::packaged_task lambda( [=]() mutable { @@ -383,7 +409,8 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void SceneManager_createUnlitFixedSizeMaterialInstanceRenderThread(TSceneManager *sceneManager, void (*callback)(TMaterialInstance*)) { + EMSCRIPTEN_KEEPALIVE void SceneManager_createUnlitFixedSizeMaterialInstanceRenderThread(TSceneManager *sceneManager, void (*callback)(TMaterialInstance *)) + { std::packaged_task lambda( [=]() mutable { @@ -394,21 +421,20 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void SceneManager_loadGlbFromBufferRenderThread(TSceneManager *sceneManager, - const uint8_t *const data, - size_t length, - int numInstances, - bool keepData, - int priority, - int layer, - bool loadResourcesAsync, - void (*callback)(EntityId)) + const uint8_t *const data, + size_t length, + int numInstances, + bool keepData, + int priority, + int layer, + bool loadResourcesAsync, + void (*callback)(TSceneAsset *)) { - std::packaged_task lambda( + std::packaged_task lambda( [=]() mutable { - auto entity = SceneManager_loadGlbFromBuffer(sceneManager, data, length, keepData, priority, layer, loadResourcesAsync); - callback(entity); - return entity; + auto *asset = SceneManager_loadGlbFromBuffer(sceneManager, data, length, keepData, priority, layer, loadResourcesAsync); + callback(asset); }); auto fut = _rl->add_task(lambda); } @@ -432,7 +458,7 @@ extern "C" }); auto fut = _rl->add_task(lambda); } - + EMSCRIPTEN_KEEPALIVE void set_background_image_position_render_thread(TViewer *viewer, float x, float y, bool clamp) @@ -442,7 +468,7 @@ extern "C" { set_background_image_position(viewer, x, y, clamp); }); auto fut = _rl->add_task(lambda); } - + EMSCRIPTEN_KEEPALIVE void load_skybox_render_thread(TViewer *viewer, const char *skyboxPath, void (*onComplete)()) @@ -450,11 +476,10 @@ extern "C" std::packaged_task lambda([=] { load_skybox(viewer, skyboxPath); - onComplete(); - }); + onComplete(); }); auto fut = _rl->add_task(lambda); } - + EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(TViewer *viewer) { std::packaged_task lambda([=] @@ -469,159 +494,8 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void remove_entity_render_thread(TViewer *viewer, - EntityId asset, void (*callback)()) + EMSCRIPTEN_KEEPALIVE void View_setToneMappingRenderThread(TView *tView, TEngine *tEngine, thermion::ToneMapping toneMapping) { - std::packaged_task lambda([=] - { - remove_entity(viewer, asset); - callback(); - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void clear_entities_render_thread(TViewer *viewer, void (*callback)()) - { - std::packaged_task lambda([=] - { - clear_entities(viewer); - callback(); - }); - auto fut = _rl->add_task(lambda); - } - - - EMSCRIPTEN_KEEPALIVE void - get_morph_target_name_render_thread(TSceneManager *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); - callback(); - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void - get_morph_target_name_count_render_thread(TSceneManager *sceneManager, EntityId assetEntity, - EntityId childEntity, void (*callback)(int)) - { - std::packaged_task lambda([=] - { - auto count = get_morph_target_name_count(sceneManager, assetEntity, childEntity); - callback(count); - return count; }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void set_animation_frame_render_thread(TSceneManager *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(TSceneManager *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(TSceneManager *sceneManager, - EntityId asset, - void (*callback)(int)) - { - std::packaged_task lambda( - [=] - { - auto count = get_animation_count(sceneManager, asset); - callback(count); - return count; - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void get_animation_name_render_thread(TSceneManager *sceneManager, - EntityId asset, - char *const outPtr, - int index, - void (*callback)()) - { - std::packaged_task lambda( - [=] - { - get_animation_name(sceneManager, asset, outPtr, index); - callback(); - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void - get_name_for_entity_render_thread(TSceneManager *sceneManager, const EntityId entityId, void (*callback)(const char *)) - { - std::packaged_task lambda( - [=] - { - auto name = get_name_for_entity(sceneManager, entityId); - callback(name); - return name; - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void set_morph_target_weights_render_thread(TSceneManager *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); - callback(result); - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void set_bone_transform_render_thread( - TSceneManager *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); - callback(success); - return success; - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void update_bone_matrices_render_thread(TSceneManager *sceneManager, - EntityId entity, void (*callback)(bool)) - { - std::packaged_task lambda( - [=] - { - auto success = update_bone_matrices(sceneManager, entity); - callback(success); - }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void View_setToneMappingRenderThread(TView *tView, TEngine *tEngine, thermion::ToneMapping toneMapping) { std::packaged_task lambda( [=] { @@ -629,8 +503,9 @@ extern "C" }); auto fut = _rl->add_task(lambda); } - - EMSCRIPTEN_KEEPALIVE void View_setBloomRenderThread(TView *tView, double bloom) { + + EMSCRIPTEN_KEEPALIVE void View_setBloomRenderThread(TView *tView, double bloom) + { std::packaged_task lambda( [=] { @@ -639,20 +514,31 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_render_thread(TSceneManager *sceneManager, EntityId entityId, void (*callback)()) + EMSCRIPTEN_KEEPALIVE void *SceneManager_destroyAllRenderThread(TSceneManager *tSceneManager, void (*callback)()) { std::packaged_task lambda( - [=] + [=]() mutable { - reset_to_rest_pose(sceneManager, entityId); + SceneManager_destroyAll(tSceneManager); callback(); }); auto fut = _rl->add_task(lambda); + return nullptr; } - + EMSCRIPTEN_KEEPALIVE void *SceneManager_destroyAssetRenderThread(TSceneManager *tSceneManager, TSceneAsset *tSceneAsset, void (*callback)()) + { + std::packaged_task lambda( + [=]() mutable + { + SceneManager_destroyAsset(tSceneManager, tSceneAsset); + callback(); + }); + auto fut = _rl->add_task(lambda); + return nullptr; + } - 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)()) + 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( [=] @@ -662,4 +548,34 @@ extern "C" }); auto fut = _rl->add_task(lambda); } + + EMSCRIPTEN_KEEPALIVE void AnimationManager_updateBoneMatricesRenderThread( + TAnimationManager *tAnimationManager, + TSceneAsset *sceneAsset, + void (*callback)(bool)) + { + std::packaged_task lambda( + [=]() mutable + { + bool result = AnimationManager_updateBoneMatrices(tAnimationManager, sceneAsset); + callback(result); + }); + auto fut = _rl->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void AnimationManager_setMorphTargetWeightsRenderThread( + TAnimationManager *tAnimationManager, + EntityId entityId, + const float *const morphData, + int numWeights, + void (*callback)(bool)) + { + std::packaged_task lambda( + [=]() mutable + { + bool result = AnimationManager_setMorphTargetWeights(tAnimationManager, entityId, morphData, numWeights); + callback(result); + }); + auto fut = _rl->add_task(lambda); + } } diff --git a/thermion_dart/native/src/scene/AnimationManager.cpp b/thermion_dart/native/src/scene/AnimationManager.cpp new file mode 100644 index 00000000..eb7075b6 --- /dev/null +++ b/thermion_dart/native/src/scene/AnimationManager.cpp @@ -0,0 +1,521 @@ +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "Log.hpp" + +#include "scene/AnimationManager.hpp" +#include "scene/SceneAsset.hpp" +#include "scene/GltfSceneAssetInstance.hpp" + +namespace thermion +{ + + using namespace filament; + using namespace utils; + + AnimationManager::AnimationManager(Engine *engine, Scene *scene) : _engine(engine), _scene(scene) + { + auto &transformManager = _engine->getTransformManager(); + auto &renderableManager = _engine->getRenderableManager(); + _animationComponentManager = std::make_unique(transformManager, renderableManager); + } + + AnimationManager::~AnimationManager() + { + _animationComponentManager = std::nullptr_t(); + } + + bool AnimationManager::setMorphAnimationBuffer( + utils::Entity entity, + const float *const morphData, + const uint32_t *const morphIndices, + int numMorphTargets, + int numFrames, + float frameLengthInMs) + { + std::lock_guard lock(_mutex); + + if (!_animationComponentManager->hasComponent(entity)) + { + _animationComponentManager->addAnimationComponent(entity); + } + + MorphAnimation morphAnimation; + + morphAnimation.meshTarget = entity; + morphAnimation.frameData.clear(); + morphAnimation.frameData.insert( + morphAnimation.frameData.begin(), + morphData, + morphData + (numFrames * numMorphTargets)); + morphAnimation.frameLengthInMs = frameLengthInMs; + morphAnimation.morphIndices.resize(numMorphTargets); + for (int i = 0; i < numMorphTargets; i++) + { + morphAnimation.morphIndices[i] = morphIndices[i]; + } + morphAnimation.durationInSecs = (frameLengthInMs * numFrames) / 1000.0f; + + morphAnimation.start = high_resolution_clock::now(); + morphAnimation.lengthInFrames = static_cast( + morphAnimation.durationInSecs * 1000.0f / + frameLengthInMs); + + auto animationComponentInstance = _animationComponentManager->getInstance(entity); + auto &animationComponent = _animationComponentManager->elementAt<0>(animationComponentInstance); + auto &morphAnimations = animationComponent.morphAnimations; + + morphAnimations.emplace_back(morphAnimation); + return true; + } + + void AnimationManager::clearMorphAnimationBuffer( + utils::Entity entity) + { + std::lock_guard lock(_mutex); + + auto animationComponentInstance = _animationComponentManager->getInstance(entity); + auto &animationComponent = _animationComponentManager->elementAt<0>(animationComponentInstance); + auto &morphAnimations = animationComponent.morphAnimations; + morphAnimations.clear(); + } + + void AnimationManager::resetToRestPose(GltfSceneAssetInstance *instance) + { + std::lock_guard lock(_mutex); + + auto filamentInstance = instance->getInstance(); + auto skinCount = filamentInstance->getSkinCount(); + + 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 + // 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. + // + // This can be calculated as: + // + // auto rest = inverse(parentTransformInModelSpace) * bindMatrix + // + // (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. + // We ensure that parents are reset before children by: + // - pushing all bones onto a stack + // - iterate over the stack + // - look at the bone at the top of the stack + // - if the bone already been reset, pop and continue iterating over the stack + // - otherwise + // - if the bone has a parent that has not been reset, push the parent to the top of the stack and continue iterating + // - otherwise + // - 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::stack stack; + + auto transforms = getBoneRestTranforms(instance, skinIndex); + + for (int i = 0; i < filamentInstance->getJointCountAt(skinIndex); i++) + { + auto restTransform = transforms[i]; + const auto &joint = filamentInstance->getJointsAt(skinIndex)[i]; + auto transformInstance = transformManager.getInstance(joint); + transformManager.setTransform(transformInstance, restTransform); + } + } + filamentInstance->getAnimator()->updateBoneMatrices(); + return; + } + + std::vector AnimationManager::getBoneRestTranforms(GltfSceneAssetInstance *instance, int skinIndex) + { + + std::vector transforms; + + auto filamentInstance = instance->getInstance(); + auto skinCount = filamentInstance->getSkinCount(); + + TransformManager &transformManager = _engine->getTransformManager(); + + transforms.resize(filamentInstance->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 + // 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. + // + // This can be calculated as: + // + // auto rest = inverse(parentTransformInModelSpace) * bindMatrix + // + // (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. + // We ensure that parents are reset before children by: + // - pushing all bones onto a stack + // - iterate over the stack + // - look at the bone at the top of the stack + // - if the bone already been reset, pop and continue iterating over the stack + // - otherwise + // - if the bone has a parent that has not been reset, push the parent to the top of the stack and continue iterating + // - otherwise + // - pop the bone, reset its transform and mark it as completed + std::vector joints; + std::unordered_set completed; + std::stack stack; + + for (int i = 0; i < filamentInstance->getJointCountAt(skinIndex); i++) + { + const auto &joint = filamentInstance->getJointsAt(skinIndex)[i]; + joints.push_back(joint); + stack.push(joint); + } + + while (!stack.empty()) + { + 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()) + { + stack.pop(); + continue; + } + + 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, + // push the parent to the top of the stack and start the loop again + 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()) + { + stack.push(parent); + continue; + } + + // otherwise let's get the inverse bind matrix for the joint + math::mat4f inverseBindMatrix; + bool found = false; + for (int i = 0; i < filamentInstance->getJointCountAt(skinIndex); i++) + { + if (filamentInstance->getJointsAt(skinIndex)[i] == joint) + { + inverseBindMatrix = filamentInstance->getInverseBindMatricesAt(skinIndex)[i]; + found = true; + break; + } + } + ASSERT_PRECONDITION(found, "Failed to find inverse bind matrix for joint %d", joint); + + // now we need to ascend back up the hierarchy to calculate the modelSpaceTransform + math::mat4f modelSpaceTransform; + while (parentIter != joints.end()) + { + const auto transformInstance = transformManager.getInstance(parent); + const auto parentIndex = distance(joints.begin(), parentIter); + const auto transform = transforms[parentIndex]; + modelSpaceTransform = transform * modelSpaceTransform; + parent = transformManager.getParent(transformInstance); + parentIter = std::find(joints.begin(), joints.end(), parent); + } + + const auto bindMatrix = inverse(inverseBindMatrix); + + const auto inverseModelSpaceTransform = inverse(modelSpaceTransform); + + const auto jointIndex = distance(joints.begin(), jointIter); + transforms[jointIndex] = inverseModelSpaceTransform * bindMatrix; + completed.insert(joint); + stack.pop(); + } + return transforms; + } + + void AnimationManager::updateBoneMatrices(GltfSceneAssetInstance *instance) + { + instance->getInstance()->getAnimator()->updateBoneMatrices(); + } + + bool AnimationManager::addBoneAnimation(GltfSceneAssetInstance *instance, + int skinIndex, + int boneIndex, + const float *const frameData, + int numFrames, + float frameLengthInMs, + float fadeOutInSecs, + float fadeInInSecs, + float maxDelta) + { + std::lock_guard lock(_mutex); + + BoneAnimation animation; + animation.boneIndex = boneIndex; + animation.frameData.clear(); + + const auto &inverseBindMatrix = instance->getInstance()->getInverseBindMatricesAt(skinIndex)[boneIndex]; + for (int i = 0; i < numFrames; i++) + { + math::mat4f frame( + frameData[i * 16], + frameData[(i * 16) + 1], + frameData[(i * 16) + 2], + frameData[(i * 16) + 3], + frameData[(i * 16) + 4], + frameData[(i * 16) + 5], + frameData[(i * 16) + 6], + frameData[(i * 16) + 7], + frameData[(i * 16) + 8], + frameData[(i * 16) + 9], + frameData[(i * 16) + 10], + frameData[(i * 16) + 11], + frameData[(i * 16) + 12], + frameData[(i * 16) + 13], + frameData[(i * 16) + 14], + frameData[(i * 16) + 15]); + + animation.frameData.push_back(frame); + } + + animation.frameLengthInMs = frameLengthInMs; + animation.start = std::chrono::high_resolution_clock::now(); + animation.reverse = false; + animation.durationInSecs = (frameLengthInMs * numFrames) / 1000.0f; + animation.lengthInFrames = numFrames; + animation.frameLengthInMs = frameLengthInMs; + animation.fadeOutInSecs = fadeOutInSecs; + animation.fadeInInSecs = fadeInInSecs; + animation.maxDelta = maxDelta; + animation.skinIndex = skinIndex; + if (!_animationComponentManager->hasComponent(instance->getInstance()->getRoot())) + { + Log("ERROR: specified entity is not animatable (has no animation component attached)."); + return false; + } + auto animationComponentInstance = _animationComponentManager->getInstance(instance->getInstance()->getRoot()); + + auto &animationComponent = _animationComponentManager->elementAt<0>(animationComponentInstance); + auto &boneAnimations = animationComponent.boneAnimations; + + boneAnimations.emplace_back(animation); + + return true; + } + + void AnimationManager::playGltfAnimation(GltfSceneAssetInstance *instance, int index, bool loop, bool reverse, bool replaceActive, float crossfade, float startOffset) + { + std::lock_guard lock(_mutex); + + if (index < 0) + { + Log("ERROR: glTF animation index must be greater than zero."); + return; + } + + if (!_animationComponentManager->hasComponent(instance->getEntity())) + { + Log("ERROR: specified entity is not animatable (has no animation component attached)."); + return; + } + + auto animationComponentInstance = _animationComponentManager->getInstance(instance->getEntity()); + + auto &animationComponent = _animationComponentManager->elementAt<0>(animationComponentInstance); + + if (replaceActive) + { + if (animationComponent.gltfAnimations.size() > 0) + { + auto &last = animationComponent.gltfAnimations.back(); + animationComponent.fadeGltfAnimationIndex = last.index; + animationComponent.fadeDuration = crossfade; + auto now = high_resolution_clock::now(); + auto elapsedInSecs = float(std::chrono::duration_cast(now - last.start).count()) / 1000.0f; + animationComponent.fadeOutAnimationStart = elapsedInSecs; + animationComponent.gltfAnimations.clear(); + } + else + { + animationComponent.fadeGltfAnimationIndex = -1; + animationComponent.fadeDuration = 0.0f; + } + } + else if (crossfade > 0) + { + Log("ERROR: crossfade only supported when replaceActive is true."); + return; + } + else + { + animationComponent.fadeGltfAnimationIndex = -1; + animationComponent.fadeDuration = 0.0f; + } + + GltfAnimation animation; + animation.startOffset = startOffset; + animation.index = index; + animation.start = std::chrono::high_resolution_clock::now(); + animation.loop = loop; + animation.reverse = reverse; + animation.durationInSecs = instance->getInstance()->getAnimator()->getAnimationDuration(index); + + 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) + { + found = true; + break; + } + } + if (!found) + { + animationComponent.gltfAnimations.push_back(animation); + } + } + + void AnimationManager::stopGltfAnimation(GltfSceneAssetInstance *instance, int index) + { + + auto animationComponentInstance = _animationComponentManager->getInstance(instance->getEntity()); + 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.erase(erased, + animationComponent.gltfAnimations.end()); + return; + } + + void AnimationManager::setMorphTargetWeights(utils::Entity entity, const float *const weights, const int count) + { + RenderableManager &rm = _engine->getRenderableManager(); + auto renderableInstance = rm.getInstance(entity); + rm.setMorphWeights( + renderableInstance, + weights, + count); + } + + void AnimationManager::setGltfAnimationFrame(GltfSceneAssetInstance *instance, int animationIndex, int animationFrame) + { + auto offset = 60 * animationFrame * 1000; // TODO - don't hardcore 60fps framerate + instance->getInstance()->getAnimator()->applyAnimation(animationIndex, offset); + instance->getInstance()->getAnimator()->updateBoneMatrices(); + return; + } + + float AnimationManager::getGltfAnimationDuration(GltfSceneAssetInstance *instance, int animationIndex) + { + return instance->getInstance()->getAnimator()->getAnimationDuration(animationIndex); + } + + std::vector AnimationManager::getGltfAnimationNames(GltfSceneAssetInstance *instance) + { + std::vector names; + + size_t count = instance->getInstance()->getAnimator()->getAnimationCount(); + + for (size_t i = 0; i < count; i++) + { + names.push_back(instance->getInstance()->getAnimator()->getAnimationName(i)); + } + return names; + } + + std::vector AnimationManager::getMorphTargetNames(GltfSceneAsset *asset, EntityId childEntity) + { + std::vector names; + + auto filamentAsset = asset->getAsset(); + + const utils::Entity targetEntity = utils::Entity::import(childEntity); + + size_t count = filamentAsset->getMorphTargetCountAt(targetEntity); + for (int j = 0; j < count; j++) + { + const char *morphName = filamentAsset->getMorphTargetNameAt(targetEntity, j); + names.push_back(morphName); + } + return names; + } + + vector AnimationManager::getBoneEntities(GltfSceneAssetInstance *instance, int skinIndex) + { + auto *joints = instance->getInstance()->getJointsAt(skinIndex); + auto jointCount = instance->getInstance()->getJointCountAt(skinIndex); + std::vector boneEntities(joints, joints + jointCount); + return boneEntities; + } + + void AnimationManager::update() + { + std::lock_guard lock(_mutex); + _animationComponentManager->update(); + } + + math::mat4f AnimationManager::getInverseBindMatrix(GltfSceneAssetInstance *instance, int skinIndex, int boneIndex) + { + return instance->getInstance()->getInverseBindMatricesAt(skinIndex)[boneIndex]; + } + + bool AnimationManager::setBoneTransform(GltfSceneAssetInstance *instance, int32_t skinIndex, int boneIndex, math::mat4f transform) + { + std::lock_guard lock(_mutex); + + RenderableManager &rm = _engine->getRenderableManager(); + + const auto &renderableInstance = rm.getInstance(instance->getEntity()); + + if (!renderableInstance.isValid()) + { + Log("Specified entity is not a renderable. You probably provided the ultimate parent entity of a glTF asset, which is non-renderable. "); + return false; + } + + rm.setBones( + renderableInstance, + &transform, + 1, + boneIndex); + return true; + } + + bool AnimationManager::addAnimationComponent(EntityId entity) + { + _animationComponentManager->addAnimationComponent(utils::Entity::import(entity)); + return true; + } + + void AnimationManager::removeAnimationComponent(EntityId entity) + { + _animationComponentManager->removeComponent(utils::Entity::import(entity)); + } + +} \ No newline at end of file diff --git a/thermion_dart/native/src/CustomGeometry.cpp b/thermion_dart/native/src/scene/CustomGeometry.cpp similarity index 97% rename from thermion_dart/native/src/CustomGeometry.cpp rename to thermion_dart/native/src/scene/CustomGeometry.cpp index c1e49adb..2ad9cf79 100644 --- a/thermion_dart/native/src/CustomGeometry.cpp +++ b/thermion_dart/native/src/scene/CustomGeometry.cpp @@ -10,7 +10,7 @@ #include #include -#include "CustomGeometry.hpp" +#include "scene/CustomGeometry.hpp" #include "Log.hpp" namespace thermion @@ -22,9 +22,10 @@ namespace thermion float *normals, uint32_t numNormals, float *uvs, uint32_t numUvs, uint16_t *indices, uint32_t numIndices, + MaterialInstance* materialInstance, RenderableManager::PrimitiveType primitiveType, Engine *engine) - : numVertices(numVertices), numIndices(numIndices), _engine(engine) + : numVertices(numVertices), numIndices(numIndices), _materialInstance(materialInstance), _engine(engine) { this->primitiveType = primitiveType; @@ -214,7 +215,6 @@ namespace thermion CustomGeometry::~CustomGeometry() { - Log("GEOMETRY DESTRUCTOR"); _engine->destroy(vertexBuffer); _engine->destroy(indexBuffer); } diff --git a/thermion_dart/native/src/scene/GeometrySceneAsset.cpp b/thermion_dart/native/src/scene/GeometrySceneAsset.cpp new file mode 100644 index 00000000..9d23dd28 --- /dev/null +++ b/thermion_dart/native/src/scene/GeometrySceneAsset.cpp @@ -0,0 +1,125 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Log.hpp" +#include "scene/GeometrySceneAsset.hpp" +#include "scene/GeometrySceneAssetBuilder.hpp" + +namespace thermion +{ + + using namespace filament; + + GeometrySceneAsset::GeometrySceneAsset( + bool isInstance, + Engine *engine, + VertexBuffer *vertexBuffer, + IndexBuffer *indexBuffer, + MaterialInstance **materialInstances, + size_t materialInstanceCount, + RenderableManager::PrimitiveType primitiveType, + Box boundingBox) + : _isInstance(isInstance), + _engine(engine), _vertexBuffer(vertexBuffer), _indexBuffer(indexBuffer), _materialInstances(materialInstances), _materialInstanceCount(materialInstanceCount), _primitiveType(primitiveType), _boundingBox(boundingBox) + { + _entity = utils::EntityManager::get().create(); + + RenderableManager::Builder builder(1); + builder.boundingBox(_boundingBox) + .geometry(0, _primitiveType, _vertexBuffer, _indexBuffer) + .culling(true) + .receiveShadows(true) + .castShadows(true); + for (int i = 0; i < materialInstanceCount; i++) + { + builder.material(i, materialInstances[i]); + } + builder.build(*_engine, _entity); + } + + + + GeometrySceneAsset::~GeometrySceneAsset() + { + if (_engine) + { + if (_vertexBuffer && !_isInstance) + _engine->destroy(_vertexBuffer); + if (_indexBuffer && !_isInstance) + _engine->destroy(_indexBuffer); + } + } + + SceneAsset *GeometrySceneAsset::createInstance(MaterialInstance **materialInstances, size_t materialInstanceCount) + { + if (_isInstance) + { + Log("Cannot create an instance from another instance. Ensure you are calling createInstance with the original asset."); + return nullptr; + } + + std::unique_ptr instance = std::make_unique( + true, + _engine, + _vertexBuffer, + _indexBuffer, + materialInstances, + materialInstanceCount, + _primitiveType, + _boundingBox); + auto *raw = instance.get(); + _instances.push_back(std::move(instance)); + return raw; + } + + // std::unique_ptr GeometrySceneAsset::create( + // float *vertices, uint32_t numVertices, + // float *normals, uint32_t numNormals, + // float *uvs, uint32_t numUvs, + // uint16_t *indices, uint32_t numIndices, + // MaterialInstance **materialInstances, + // size_t materialInstanceCount, + // RenderableManager::PrimitiveType primitiveType, + // Engine *engine) + // { + + // // Setup texture if needed + // if (asset && uvs && numUvs > 0 && + // asset->getMaterialInstance() && + // asset->getMaterialInstance()->getMaterial()->hasParameter("baseColorMap")) + // { + // static constexpr uint32_t textureSize = 1; + // static constexpr uint32_t white = 0x00ffffff; + + // auto texture = Texture::Builder() + // .width(textureSize) + // .height(textureSize) + // .levels(1) + // .format(Texture::InternalFormat::RGBA8) + // .build(*engine); + + // filament::backend::PixelBufferDescriptor pbd( + // &white, 4, Texture::Format::RGBA, Texture::Type::UBYTE); + // texture->setImage(*engine, 0, std::move(pbd)); + + // TextureSampler sampler( + // TextureSampler::MinFilter::NEAREST, + // TextureSampler::MagFilter::NEAREST); + // sampler.setWrapModeS(TextureSampler::WrapMode::REPEAT); + // sampler.setWrapModeT(TextureSampler::WrapMode::REPEAT); + + // asset->getMaterialInstance()->setParameter("baseColorMap", texture, sampler); + // } + + // return asset; + // } + +} // namespace thermion \ No newline at end of file diff --git a/thermion_dart/native/src/scene/Gizmo.cpp b/thermion_dart/native/src/scene/Gizmo.cpp new file mode 100644 index 00000000..5e091dc8 --- /dev/null +++ b/thermion_dart/native/src/scene/Gizmo.cpp @@ -0,0 +1,367 @@ +#include +#include +#include + +#include +#include + +#include + +#include "scene/Gizmo.hpp" +#include "scene/SceneManager.hpp" + +#include "material/unlit_fixed_size.h" + +#include "Log.hpp" + +namespace thermion +{ + + using namespace filament::gltfio; + + // First, create the black cube at the center + // The axes widgets will be parented to this entity + Entity Gizmo::createParentEntity() + { + auto &transformManager = _engine->getTransformManager(); + auto &entityManager = _engine->getEntityManager(); + + auto parent = entityManager.create(); + + auto *parentMaterialInstance = _material->createInstance(); + parentMaterialInstance->setParameter("baseColorFactor", math::float4{0.0f, 1.0f, 1.0f, 1.0f}); + parentMaterialInstance->setParameter("scale", 4.0f); + + _materialInstances.push_back(parentMaterialInstance); + + // Create center cube vertices + float centerCubeSize = 0.1f; + 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}, + {centerCubeSize, centerCubeSize, centerCubeSize}}) + .material(0, parentMaterialInstance) + .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) + .priority(7) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, centerCubeVb, centerCubeIb, 0, 36) + .culling(false) + .build(*_engine, parent); + + auto parentTransformInstance = transformManager.getInstance(parent); + math::mat4f cubeTransform; + transformManager.setTransform(parentTransformInstance, cubeTransform); + return parent; + } + + Gizmo::Gizmo(Engine *engine, View *view, Scene *scene, Material *material) : _engine(engine), _view(view), _scene(scene), _material(material) + { + auto parent = createParentEntity(); + auto x = createAxisEntity(Gizmo::Axis::X, parent); + auto y = createAxisEntity(Gizmo::Axis::Y, parent); + auto z = createAxisEntity(Gizmo::Axis::Z, parent); + + auto xHitTest = createHitTestEntity(Gizmo::Axis::X, parent); + auto yHitTest = createHitTestEntity(Gizmo::Axis::Y, parent); + auto zHitTest = createHitTestEntity(Gizmo::Axis::Z, parent); + + _entities = std::vector{parent, x, y, z, xHitTest, yHitTest, zHitTest}; + _parent = parent; + _x = x; + _y = y; + _z = z; + _xHitTest = xHitTest; + _yHitTest = yHitTest; + _zHitTest = zHitTest; + } + + Entity Gizmo::createAxisEntity(Gizmo::Axis axis, Entity parent) + { + auto &entityManager = _engine->getEntityManager(); + auto &transformManager = _engine->getTransformManager(); + auto *materialInstance = _material->createInstance(); + _materialInstances.push_back(materialInstance); + auto entity = entityManager.create(); + + auto baseColor = inactiveColors[axis]; + + // Line and arrow vertices + float lineLength = 0.6f; + float lineWidth = 0.008f; + float arrowLength = 0.06f; + float arrowWidth = 0.02f; + 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[24 + 18]{ + // 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 (18 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(42).bufferType(IndexBuffer::IndexType::USHORT).build(*_engine); + ib->setBuffer(*_engine, IndexBuffer::BufferDescriptor( + indices, 42 * sizeof(uint16_t), + [](void *buffer, size_t size, void *) + { delete[] static_cast(buffer); })); + + materialInstance->setParameter("baseColorFactor", baseColor); + materialInstance->setParameter("scale", 4.0f); + materialInstance->setDepthCulling(false); + materialInstance->setDepthFunc(MaterialInstance::DepthFunc::A); + + RenderableManager::Builder(1) + .boundingBox({{-arrowWidth, -arrowWidth, 0}, + {arrowWidth, arrowWidth, lineLength + arrowLength}}) + .material(0, materialInstance) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, ib, 0, 42) + .priority(6) + .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .build(*_engine, entity); + + auto transformInstance = transformManager.getInstance(entity); + + transformManager.setTransform(transformInstance, getRotationForAxis(axis)); + + // parent the axis to the center cube + auto parentTransformInstance = transformManager.getInstance(parent); + transformManager.setParent(transformInstance, parentTransformInstance); + return entity; + } + + Gizmo::~Gizmo() + { + _scene->removeEntities(_entities.data(), _entities.size()); + + for (auto entity : _entities) + { + _engine->destroy(entity); + } + + for (auto *materialInstance : _materialInstances) + { + _engine->destroy(materialInstance); + } + } + + Entity Gizmo::createHitTestEntity(Gizmo::Axis axis, Entity parent) + { + auto &entityManager = EntityManager::get(); + auto &transformManager = _engine->getTransformManager(); + + auto parentTransformInstance = transformManager.getInstance(parent); + + 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); })); + + auto entity = entityManager.create(); + auto *materialInstance = _material->createInstance(); + _materialInstances.push_back(materialInstance); + materialInstance->setParameter("baseColorFactor", math::float4{0.0f, 0.0f, 0.0f, 0.0f}); + materialInstance->setParameter("scale", 4.0f); + + RenderableManager::Builder(1) + .boundingBox({{-volumeWidth / 2, -volumeDepth / 2, 0}, {volumeWidth / 2, volumeDepth / 2, volumeLength}}) + .material(0, materialInstance) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, volumeVb, volumeIb, 0, 36) + .priority(7) + .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .build(*_engine, entity); + + auto transformInstance = transformManager.getInstance(entity); + transformManager.setTransform(transformInstance, getRotationForAxis(axis)); + // Parent the picking volume to the center cube + transformManager.setParent(transformInstance, parentTransformInstance); + return entity; + } + + void Gizmo::highlight(Gizmo::Axis axis) + { + auto &rm = _engine->getRenderableManager(); + auto entity = getEntityForAxis(axis); + if (entity.isNull()) + { + return; + } + auto renderableInstance = rm.getInstance(entity); + + if (!renderableInstance.isValid()) + { + Log("Invalid renderable for axis"); + return; + } + auto *materialInstance = rm.getMaterialInstanceAt(renderableInstance, 0); + math::float4 baseColor = activeColors[axis]; + materialInstance->setParameter("baseColorFactor", baseColor); + } + + void Gizmo::unhighlight(Gizmo::Axis axis) + { + auto &rm = _engine->getRenderableManager(); + auto entity = getEntityForAxis(axis); + if (entity.isNull()) + { + return; + } + auto renderableInstance = rm.getInstance(entity); + if (!renderableInstance.isValid()) + { + Log("Invalid renderable for axis"); + return; + } + auto *materialInstance = rm.getMaterialInstanceAt(renderableInstance, 0); + math::float4 baseColor = inactiveColors[axis]; + materialInstance->setParameter("baseColorFactor", baseColor); + } + + void Gizmo::pick(uint32_t x, uint32_t y, GizmoPickCallback callback) + { + + auto handler = new Gizmo::PickCallbackHandler(this, callback); + _view->pick(x, y, [=](filament::View::PickingQueryResult const &result) + { + handler->handle(result); + delete handler; }); + } + + bool Gizmo::isGizmoEntity(Entity e) + { + for (int i = 0; i < 7; i++) + { + if (e == _entities[i]) + { + return true; + } + } + return false; + } + + math::mat4f Gizmo::getRotationForAxis(Gizmo::Axis axis) + { + + math::mat4f transform; + + switch (axis) + { + 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; + } + return transform; + } + +} diff --git a/thermion_dart/native/src/scene/GltfSceneAsset.cpp b/thermion_dart/native/src/scene/GltfSceneAsset.cpp new file mode 100644 index 00000000..f950a19c --- /dev/null +++ b/thermion_dart/native/src/scene/GltfSceneAsset.cpp @@ -0,0 +1,61 @@ + +#include "scene/GltfSceneAsset.hpp" +#include "scene/GltfSceneAssetInstance.hpp" +#include "gltfio/FilamentInstance.h" +#include "Log.hpp" +namespace thermion +{ + + GltfSceneAsset::~GltfSceneAsset() + { + _instances.clear(); + _asset->releaseSourceData(); + _assetLoader->destroyAsset(_asset); + } + + SceneAsset *GltfSceneAsset::createInstance(MaterialInstance **materialInstances, size_t materialInstanceCount) + { + auto instanceNumber = _instances.size(); + + if (instanceNumber > _asset->getAssetInstanceCount() - 1) + { + Log("No instances available for reuse. When loading the asset, you must pre-allocate the number of instances you wish to make available for use. Try increasing this number."); + return std::nullptr_t(); + } + Log("Creating instance %d", instanceNumber); + auto instance = _asset->getAssetInstances()[instanceNumber]; + instance->recomputeBoundingBoxes(); + instance->getAnimator()->updateBoneMatrices(); + + auto& rm = _engine->getRenderableManager(); + + if(materialInstanceCount > 0) { + for(int i = 0; i < instance->getEntityCount(); i++) { + auto renderableInstance = rm.getInstance(instance->getEntities()[i]); + if(!renderableInstance.isValid()) { + Log("Instance is not renderable"); + } else { + for(int i = 0; i < materialInstanceCount; i++) { + rm.setMaterialInstanceAt(renderableInstance, i, materialInstances[i]); + } + } + } + } + + std::unique_ptr sceneAssetInstance = std::make_unique( + instance, + _engine, + materialInstances, + materialInstanceCount + ); + + auto *raw = sceneAssetInstance.get(); + + _instances.push_back(std::move(sceneAssetInstance)); + return raw; + } + + + + +} \ No newline at end of file diff --git a/thermion_dart/native/src/scene/GltfSceneAssetInstance.cpp b/thermion_dart/native/src/scene/GltfSceneAssetInstance.cpp new file mode 100644 index 00000000..744072c7 --- /dev/null +++ b/thermion_dart/native/src/scene/GltfSceneAssetInstance.cpp @@ -0,0 +1,14 @@ + +#include "scene/GltfSceneAssetInstance.hpp" +#include "gltfio/FilamentInstance.h" +#include "Log.hpp" +namespace thermion +{ + + GltfSceneAssetInstance::~GltfSceneAssetInstance() + { + + } + + +} \ No newline at end of file diff --git a/thermion_dart/native/src/scene/RotationGizmo.cpp b/thermion_dart/native/src/scene/RotationGizmo.cpp new file mode 100644 index 00000000..b7a926c1 --- /dev/null +++ b/thermion_dart/native/src/scene/RotationGizmo.cpp @@ -0,0 +1,349 @@ +// #include +// #include +// #include + +// #include + +// #include +// #include + +// #include + +// #include "scene/SceneManager.hpp" + +// namespace thermion { + +// using namespace filament::gltfio; + +// RotationGizmo::RotationGizmo(Engine* engine, View* view, Scene* scene, Material* material) +// : _engine(engine), _view(view), _scene(scene), _material(material) { + +// auto& entityManager = EntityManager::get(); +// auto& transformManager = _engine->getTransformManager(); + +// // Create center cube +// auto parentEntity = entityManager.create(); +// auto* parentMaterialInstance = _material->createInstance(); +// parentMaterialInstance->setParameter("baseColorFactor", math::float4{0.0f, 0.0f, 0.0f, 1.0f}); +// parentMaterialInstance->setParameter("scale", 4.0f); + +// _entities[0] = parentEntity; +// _materialInstances[0] = parentMaterialInstance; + +// // Create center cube geometry +// float centerCubeSize = 0.01f; +// 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 +// }; + +// 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}, +// {centerCubeSize, centerCubeSize, centerCubeSize}}) +// .material(0, parentMaterialInstance) +// .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) +// .priority(7) +// .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, centerCubeVb, centerCubeIb, 0, 36) +// .culling(false) +// .build(*engine, parentEntity); + +// // Create rotation circles +// constexpr int segments = 32; +// float radius = 0.5f; +// float* vertices; +// uint16_t* indices; +// int vertexCount, indexCount; + +// createCircle(radius, segments, vertices, indices, vertexCount, indexCount); + +// auto vb = VertexBuffer::Builder() +// .vertexCount(vertexCount) +// .bufferCount(1) +// .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) +// .build(*engine); + +// vb->setBufferAt(*engine, 0, +// VertexBuffer::BufferDescriptor(vertices, vertexCount * sizeof(filament::math::float3), +// [](void* buffer, size_t size, void*) { delete[] static_cast(buffer); })); + +// auto ib = IndexBuffer::Builder() +// .indexCount(indexCount) +// .bufferType(IndexBuffer::IndexType::USHORT) +// .build(*engine); + +// ib->setBuffer(*engine, +// IndexBuffer::BufferDescriptor(indices, indexCount * sizeof(uint16_t), +// [](void* buffer, size_t size, void*) { delete[] static_cast(buffer); })); + +// // Create the three circular rotation handles +// for (int i = 0; i < 3; i++) { +// auto* materialInstance = _material->createInstance(); +// auto entity = entityManager.create(); +// _entities[i + 1] = entity; +// _materialInstances[i + 1] = materialInstance; + +// auto baseColor = inactiveColors[i]; +// math::mat4f transform; + +// switch (i) { +// 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; +// } + +// materialInstance->setParameter("baseColorFactor", baseColor); +// materialInstance->setParameter("scale", 4.0f); + +// RenderableManager::Builder(1) +// .boundingBox({{-radius, -radius, -0.01f}, {radius, radius, 0.01f}}) +// .material(0, materialInstance) +// .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, ib, 0, indexCount) +// .priority(6) +// .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) +// .culling(false) +// .receiveShadows(false) +// .castShadows(false) +// .build(*engine, entity); + +// auto transformInstance = transformManager.getInstance(entity); +// transformManager.setTransform(transformInstance, transform); +// transformManager.setParent(transformInstance, transformManager.getInstance(parentEntity)); +// } + +// createHitTestEntities(); +// setVisibility(true); +// } + +// void RotationGizmo::createCircle(float radius, int segments, float*& vertices, uint16_t*& indices, int& vertexCount, int& indexCount) { +// vertexCount = segments * 2; +// indexCount = segments * 6; + +// vertices = new float[vertexCount * 3]; +// indices = new uint16_t[indexCount]; + +// float thickness = 0.01f; + +// // Generate vertices for inner and outer circles +// for (int i = 0; i < segments; i++) { +// float angle = (2.0f * M_PI * i) / segments; +// float x = cosf(angle); +// float y = sinf(angle); + +// // Inner circle vertex +// vertices[i * 6] = x * (radius - thickness); +// vertices[i * 6 + 1] = y * (radius - thickness); +// vertices[i * 6 + 2] = 0.0f; + +// // Outer circle vertex +// vertices[i * 6 + 3] = x * (radius + thickness); +// vertices[i * 6 + 4] = y * (radius + thickness); +// vertices[i * 6 + 5] = 0.0f; +// } + +// // Generate indices for triangles +// for (int i = 0; i < segments; i++) { +// int next = (i + 1) % segments; + +// // First triangle +// indices[i * 6] = i * 2; +// indices[i * 6 + 1] = i * 2 + 1; +// indices[i * 6 + 2] = next * 2 + 1; + +// // Second triangle +// indices[i * 6 + 3] = i * 2; +// indices[i * 6 + 4] = next * 2 + 1; +// indices[i * 6 + 5] = next * 2; +// } +// } + +// void RotationGizmo::createHitTestEntities() { +// auto& entityManager = EntityManager::get(); +// auto& transformManager = _engine->getTransformManager(); + +// float radius = 0.5f; +// float thickness = 0.1f; + +// // Create hit test volumes for each rotation circle +// for (int i = 4; i < 7; i++) { +// _entities[i] = entityManager.create(); +// _materialInstances[i] = _material->createInstance(); + +// _materialInstances[i]->setParameter("baseColorFactor", math::float4{0.0f, 0.0f, 0.0f, 0.0f}); +// _materialInstances[i]->setParameter("scale", 4.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; +// } + +// // Create a thicker invisible volume aroun + +// // Create a thicker invisible volume around each rotation circle for hit testing +// float* volumeVertices; +// uint16_t* volumeIndices; +// int volumeVertexCount, volumeIndexCount; +// createCircle(radius, 32, volumeVertices, volumeIndices, volumeVertexCount, volumeIndexCount); + +// auto volumeVb = VertexBuffer::Builder() +// .vertexCount(volumeVertexCount) +// .bufferCount(1) +// .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3) +// .build(*_engine); + +// volumeVb->setBufferAt(*_engine, 0, +// VertexBuffer::BufferDescriptor(volumeVertices, volumeVertexCount * sizeof(filament::math::float3), +// [](void* buffer, size_t size, void*) { delete[] static_cast(buffer); })); + +// auto volumeIb = IndexBuffer::Builder() +// .indexCount(volumeIndexCount) +// .bufferType(IndexBuffer::IndexType::USHORT) +// .build(*_engine); + +// volumeIb->setBuffer(*_engine, +// IndexBuffer::BufferDescriptor(volumeIndices, volumeIndexCount * sizeof(uint16_t), +// [](void* buffer, size_t size, void*) { delete[] static_cast(buffer); })); + +// RenderableManager::Builder(1) +// .boundingBox({{-radius, -radius, -thickness/2}, {radius, radius, thickness/2}}) +// .material(0, _materialInstances[i]) +// .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, volumeVb, volumeIb, 0, volumeIndexCount) +// .priority(7) +// .layerMask(0xFF, 1u << SceneManager::LAYERS::OVERLAY) +// .culling(false) +// .receiveShadows(false) +// .castShadows(false) +// .build(*_engine, _entities[i]); + +// auto instance = transformManager.getInstance(_entities[i]); +// transformManager.setTransform(instance, transform); +// transformManager.setParent(instance, transformManager.getInstance(_entities[0])); +// } +// } + +// RotationGizmo::~RotationGizmo() { +// _scene->removeEntities(_entities, 7); + +// for (int i = 0; i < 7; i++) { +// _engine->destroy(_entities[i]); +// _engine->destroy(_materialInstances[i]); +// } +// } + +// void RotationGizmo::highlight(Entity entity) { +// auto& rm = _engine->getRenderableManager(); +// auto renderableInstance = rm.getInstance(entity); +// auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, 0); + +// math::float4 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::float4{1.0f, 1.0f, 1.0f, 1.0f}; +// } + +// materialInstance->setParameter("baseColorFactor", baseColor); +// } + +// void RotationGizmo::unhighlight() { +// auto& rm = _engine->getRenderableManager(); + +// for (int i = 0; i < 3; i++) { +// auto renderableInstance = rm.getInstance(_entities[i + 1]); +// auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, 0); +// materialInstance->setParameter("baseColorFactor", inactiveColors[i]); +// } +// } + +// void RotationGizmo::pick(uint32_t x, uint32_t y, PickCallback callback) { +// auto handler = new RotationGizmo::PickCallbackHandler(this, callback); +// _view->pick(x, y, [=](filament::View::PickingQueryResult const& result) { +// handler->handle(result); +// delete handler; +// }); +// } + +// void RotationGizmo::PickCallbackHandler::handle(filament::View::PickingQueryResult const& result) { +// auto x = static_cast(result.fragCoords.x); +// auto y = static_cast(result.fragCoords.y); + +// for (int i = 0; i < 7; i++) { +// if (_gizmo->_entities[i] == result.renderable) { +// if (i < 4) { +// return; +// } +// _gizmo->highlight(_gizmo->_entities[i - 4]); +// _callback(static_cast(i - 4), x, y, _gizmo->_view); +// return; +// } +// } +// _gizmo->unhighlight(); +// } + +// bool RotationGizmo::isGizmoEntity(Entity e) { +// for (int i = 0; i < 7; i++) { +// if (e == _entities[i]) { +// return true; +// } +// } +// return false; +// } + +// void RotationGizmo::setVisibility(bool visible) { +// if (visible) { +// _scene->addEntities(_entities, 7); +// } else { +// _scene->removeEntities(_entities, 7); +// } +// } + +// } \ No newline at end of file diff --git a/thermion_dart/native/src/scene/SceneManager.cpp b/thermion_dart/native/src/scene/SceneManager.cpp new file mode 100644 index 00000000..5cb859c6 --- /dev/null +++ b/thermion_dart/native/src/scene/SceneManager.cpp @@ -0,0 +1,946 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "material/FileMaterialProvider.hpp" +#include "material/UnlitMaterialProvider.hpp" +#include "material/unlit.h" + +#include "StreamBufferAdapter.hpp" + +#include "Log.hpp" + +#include "scene/SceneManager.hpp" +#include "scene/CustomGeometry.hpp" +#include "scene/GeometrySceneAsset.hpp" +#include "scene/GltfSceneAsset.hpp" +#include "scene/Gizmo.hpp" +#include "scene/SceneAsset.hpp" +#include "scene/GeometrySceneAssetBuilder.hpp" +#include "UnprojectTexture.hpp" + + + + +extern "C" +{ +#include "material/image.h" +#include "material/unlit_fixed_size.h" +} + +namespace thermion +{ + + using namespace std::chrono; + using namespace image; + using namespace utils; + using namespace filament; + using namespace filament::gltfio; + using std::unique_ptr; + + SceneManager::SceneManager(const ResourceLoaderWrapperImpl *const resourceLoaderWrapper, + Engine *engine, + Scene *scene, + const char *uberArchivePath, + Camera *mainCamera) + : _resourceLoaderWrapper(resourceLoaderWrapper), + _engine(engine), + _scene(scene), + _mainCamera(mainCamera) + { + + _stbDecoder = createStbProvider(_engine); + _ktxDecoder = createKtx2Provider(_engine); + + _gltfResourceLoader = new ResourceLoader({.engine = _engine, + .normalizeSkinningWeights = true}); + if (uberArchivePath) + { + auto uberdata = resourceLoaderWrapper->load(uberArchivePath); + if (!uberdata.data) + { + Log("Failed to load ubershader material. This is fatal."); + } + _ubershaderProvider = gltfio::createUbershaderProvider(_engine, uberdata.data, uberdata.size); + resourceLoaderWrapper->free(uberdata); + } + else + { + _ubershaderProvider = gltfio::createUbershaderProvider( + _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); + + _assetLoader = AssetLoader::create({_engine, _ubershaderProvider, _ncm, &em}); + + _gltfResourceLoader->addTextureProvider("image/ktx2", _ktxDecoder); + _gltfResourceLoader->addTextureProvider("image/png", _stbDecoder); + _gltfResourceLoader->addTextureProvider("image/jpeg", _stbDecoder); + + auto &tm = _engine->getTransformManager(); + + _collisionComponentManager = std::make_unique(tm); + + _animationManager = std::make_unique(_engine, _scene); + + _gridOverlay = new GridOverlay(*_engine); + + _scene->addEntity(_gridOverlay->sphere()); + _scene->addEntity(_gridOverlay->grid()); + + _unlitFixedSizeMaterial = + Material::Builder() + .package(UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_DATA, UNLIT_FIXED_SIZE_UNLIT_FIXED_SIZE_SIZE) + .build(*_engine); + } + + SceneManager::~SceneManager() + { + for (auto camera : _cameras) + { + auto entity = camera->getEntity(); + _engine->destroyCameraComponent(entity); + _engine->getEntityManager().destroy(entity); + } + + _engine->destroy(_unlitFixedSizeMaterial); + _cameras.clear(); + + _gridOverlay->destroy(); + destroyAll(); + + _gltfResourceLoader->asyncCancelLoad(); + _ubershaderProvider->destroyMaterials(); + + _animationManager = std::nullptr_t(); + _collisionComponentManager = std::nullptr_t(); + delete _ncm; + + delete _gltfResourceLoader; + delete _stbDecoder; + delete _ktxDecoder; + delete _ubershaderProvider; + AssetLoader::destroy(&_assetLoader); + } + + Gizmo *SceneManager::createGizmo(View *view, Scene *scene) + { + auto gizmo = std::make_unique(_engine, view, scene, _unlitFixedSizeMaterial); + auto *raw =gizmo.get(); + _sceneAssets.push_back(std::move(gizmo)); + return raw; + } + + int SceneManager::getInstanceCount(EntityId entityId) + { + auto entity = utils::Entity::import(entityId); + for (auto &asset : _sceneAssets) + { + if (asset->getEntity() == entity) + { + return asset->getInstanceCount(); + } + } + return -1; + } + + void SceneManager::getInstances(EntityId entityId, EntityId *out) + { + auto entity = utils::Entity::import(entityId); + for (auto &asset : _sceneAssets) + { + if (asset->getEntity() == entity) + { + for (int i = 0; i < asset->getInstanceCount(); i++) + { + out[i] = Entity::smuggle(asset->getInstanceAt(i)->getEntity()); + } + return; + } + } + } + + SceneAsset *SceneManager::loadGltf(const char *uri, + const char *relativeResourcePath, + int numInstances, + bool keepData) + { + if (numInstances < 1) + { + return std::nullptr_t(); + } + + ResourceBuffer rbuf = _resourceLoaderWrapper->load(uri); + + std::vector instances(numInstances); + + FilamentAsset *asset = _assetLoader->createInstancedAsset((uint8_t *)rbuf.data, rbuf.size, instances.data(), numInstances); + + if (!asset) + { + Log("Unable to load glTF asset at %d", uri); + return std::nullptr_t(); + } + + const char *const *const resourceUris = asset->getResourceUris(); + const size_t resourceUriCount = asset->getResourceUriCount(); + + std::vector resourceBuffers; + + for (size_t i = 0; i < resourceUriCount; i++) + { + std::string uri = std::string(relativeResourcePath) + std::string("/") + std::string(resourceUris[i]); + ResourceBuffer buf = _resourceLoaderWrapper->load(uri.c_str()); + + resourceBuffers.push_back(buf); + + ResourceLoader::BufferDescriptor b(buf.data, buf.size); + _gltfResourceLoader->addResourceData(resourceUris[i], std::move(b)); + } + +#ifdef __EMSCRIPTEN__ + if (!_gltfResourceLoader->asyncBeginLoad(asset)) + { + Log("Unknown error loading glTF asset"); + _resourceLoaderWrapper->free(rbuf); + for (auto &rb : resourceBuffers) + { + _resourceLoaderWrapper->free(rb); + } + return 0; + } + while (_gltfResourceLoader->asyncGetLoadProgress() < 1.0f) + { + _gltfResourceLoader->asyncUpdateLoad(); + } +#else + // load resources synchronously + if (!_gltfResourceLoader->loadResources(asset)) + { + Log("Unknown error loading glTF asset"); + _resourceLoaderWrapper->free(rbuf); + for (auto &rb : resourceBuffers) + { + _resourceLoaderWrapper->free(rb); + } + return std::nullptr_t(); + } +#endif + + auto sceneAsset = std::make_unique( + asset, + _assetLoader, + _engine); + auto filamentInstance = asset->getInstance(); + size_t entityCount = filamentInstance->getEntityCount(); + + _scene->addEntities(filamentInstance->getEntities(), entityCount); + + for (auto &rb : resourceBuffers) + { + _resourceLoaderWrapper->free(rb); + } + _resourceLoaderWrapper->free(rbuf); + + auto lights = asset->getLightEntities(); + _scene->addEntities(lights, asset->getLightEntityCount()); + + sceneAsset->createInstance(); + + auto entityId = Entity::smuggle(sceneAsset->getEntity()); + + auto *raw = sceneAsset.get(); + + _sceneAssets.push_back(std::move(sceneAsset)); + + Log("Finished loading glTF from %s", uri); + + return raw; + } + + void SceneManager::setVisibilityLayer(EntityId entityId, int layer) + { + utils::Entity entity = utils::Entity::import(entityId); + for (auto &asset : _sceneAssets) + { + if (asset->getEntity() == entity) + { + asset->setLayer(_engine->getRenderableManager(), layer); + } + } + } + + SceneAsset *SceneManager::loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances, bool keepData, int priority, int layer, bool loadResourcesAsync) + { + auto &rm = _engine->getRenderableManager(); + + std::vector instances(numInstances); + + FilamentAsset *asset = _assetLoader->createInstancedAsset((const uint8_t *)data, length, instances.data(), numInstances); + + Log("Created instanced asset."); + + if (!asset) + { + Log("Unknown error loading GLB asset."); + return std::nullptr_t(); + } +#ifdef __EMSCRIPTEN__ + if (!_gltfResourceLoader->asyncBeginLoad(asset)) + { + Log("Unknown error loading glb asset"); + return 0; + } + while (_gltfResourceLoader->asyncGetLoadProgress() < 1.0f) + { + _gltfResourceLoader->asyncUpdateLoad(); + } +#else + if (loadResourcesAsync) + { + if (!_gltfResourceLoader->asyncBeginLoad(asset)) + { + Log("Unknown error loading glb asset"); + return 0; + } + } + else + { + if (!_gltfResourceLoader->loadResources(asset)) + { + Log("Unknown error loading glb asset"); + return 0; + } + } +#endif + + auto sceneAsset = std::make_unique( + asset, + _assetLoader, + _engine); + + auto sceneAssetInstance = sceneAsset->createInstance(); + sceneAssetInstance->addAllEntities(_scene); + sceneAssetInstance->setPriority(_engine->getRenderableManager(), priority); + sceneAssetInstance->setLayer(_engine->getRenderableManager(), layer); + + auto *raw = sceneAsset.get(); + + _sceneAssets.push_back(std::move(sceneAsset)); + + return raw; + } + + SceneAsset *SceneManager::createInstance(SceneAsset *asset, MaterialInstance **materialInstances, size_t materialInstanceCount) + { + std::lock_guard lock(_mutex); + + auto instance = asset->createInstance(materialInstances, materialInstanceCount); + if (instance) + { + instance->addAllEntities(_scene); + } + else + { + Log("Failed to create instance"); + } + return instance; + } + + SceneAsset *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, keepData); + _resourceLoaderWrapper->free(rbuf); + return entity; + } + + bool SceneManager::removeFromScene(EntityId entityId) + { + _scene->remove(Entity::import(entityId)); + return true; + } + + bool SceneManager::addToScene(EntityId entityId) + { + _scene->addEntity(Entity::import(entityId)); + return true; + } + + void SceneManager::destroyAll() + { + std::lock_guard lock(_mutex); + + for (auto &asset : _sceneAssets) + { + asset->removeAllEntities(_scene); + } + + _sceneAssets.clear(); + + for (auto *texture : _textures) + { + _engine->destroy(texture); + } + + for (auto *materialInstance : _materialInstances) + { + _engine->destroy(materialInstance); + } + + _textures.clear(); + _materialInstances.clear(); + } + + void SceneManager::destroy(SceneAsset *asset) + { + + std::lock_guard lock(_mutex); + + auto it = std::remove_if(_sceneAssets.begin(), _sceneAssets.end(), [=](auto &sceneAsset) + { return sceneAsset.get() == asset; }); + if (it != _sceneAssets.end()) + { + auto entity = (*it)->getEntity(); + _collisionComponentManager->removeComponent(entity); + _animationManager->removeAnimationComponent(utils::Entity::smuggle(entity)); + for (int i = 0; i < (*it)->getChildEntityCount(); i++) + { + auto childEntity = (*it)->getChildEntities()[i]; + _collisionComponentManager->removeComponent(childEntity); + _animationManager->removeAnimationComponent(utils::Entity::smuggle(childEntity)); + } + (*it)->removeAllEntities(_scene); + _sceneAssets.erase(it, _sceneAssets.end()); + return; + } + } + + Texture *SceneManager::createTexture(const uint8_t *data, size_t length, const char *name) + { + + // Create an input stream from the data + std::istringstream stream(std::string(reinterpret_cast(data), length)); + + // Decode the image + image::LinearImage linearImage = image::ImageDecoder::decode(stream, name, image::ImageDecoder::ColorSpace::SRGB); + + if (!linearImage.isValid()) + { + Log("Failed to decode image."); + return nullptr; + } + + uint32_t w = linearImage.getWidth(); + uint32_t h = linearImage.getHeight(); + uint32_t channels = linearImage.getChannels(); + + Texture::InternalFormat textureFormat = channels == 3 ? Texture::InternalFormat::RGB16F + : Texture::InternalFormat::RGBA16F; + Texture::Format bufferFormat = channels == 3 ? Texture::Format::RGB + : Texture::Format::RGBA; + + Texture *texture = Texture::Builder() + .width(w) + .height(h) + .levels(1) + .format(textureFormat) + .sampler(Texture::Sampler::SAMPLER_2D) + .build(*_engine); + + if (!texture) + { + Log("Failed to create texture: "); + return nullptr; + } + + Texture::PixelBufferDescriptor buffer( + linearImage.getPixelRef(), + size_t(w * h * channels * sizeof(float)), + bufferFormat, + Texture::Type::FLOAT); + + texture->setImage(*_engine, 0, std::move(buffer)); + + Log("Created texture: %s (%d x %d, %d channels)", name, w, h, channels); + + _textures.insert(texture); + + return texture; + } + + bool SceneManager::applyTexture(EntityId entityId, Texture *texture, const char *parameterName, int materialIndex) + { + auto entity = Entity::import(entityId); + + if (entity.isNull()) + { + Log("Entity %d is null?", entityId); + return false; + } + + 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::addCollisionComponent(EntityId entityId, void (*onCollisionCallback)(const EntityId entityId1, const EntityId entityId2), bool affectsTransform) + { + std::lock_guard lock(_mutex); + utils::Entity entity = utils::Entity::import(entityId); + for (auto &asset : _sceneAssets) + { + auto *instance = reinterpret_cast(asset->getInstanceByEntity(entity)); + if (instance) + { + auto collisionInstance = _collisionComponentManager->addComponent(instance->getInstance()->getRoot()); + _collisionComponentManager->elementAt<0>(collisionInstance) = instance->getInstance()->getBoundingBox(); + _collisionComponentManager->elementAt<1>(collisionInstance) = onCollisionCallback; + _collisionComponentManager->elementAt<2>(collisionInstance) = affectsTransform; + return; + } + } + } + + void SceneManager::removeCollisionComponent(EntityId entityId) + { + std::lock_guard lock(_mutex); + utils::Entity entity = utils::Entity::import(entityId); + _collisionComponentManager->removeComponent(entity); + } + + void SceneManager::testCollisions(EntityId entityId) + { + utils::Entity entity = utils::Entity::import(entityId); + for (auto &asset : _sceneAssets) + { + auto *instance = reinterpret_cast(asset->getInstanceByEntity(entity)); + if (instance) + { + const auto &tm = _engine->getTransformManager(); + auto transformInstance = tm.getInstance(entity); + auto worldTransform = tm.getWorldTransform(transformInstance); + auto aabb = instance->getInstance()->getBoundingBox(); + aabb = aabb.transform(worldTransform); + _collisionComponentManager->collides(entity, aabb); + } + } + } + + void SceneManager::update() + { + _animationManager->update(); + _updateTransforms(); + } + + void SceneManager::_updateTransforms() + { + std::lock_guard lock(_mutex); + + // auto &tm = _engine->getTransformManager(); + // tm.openLocalTransformTransaction(); + + // for (const auto &[entityId, transformUpdate] : _transformUpdates) + // { + // const auto &pos = _instances.find(entityId); + + // bool isCollidable = true; + // Entity entity; + // filament::TransformManager::Instance transformInstance; + // filament::math::mat4f transform; + // Aabb boundingBox; + // if (pos == _instances.end()) + // { + // isCollidable = false; + // entity = Entity::import(entityId); + // } + // else + // { + // const auto *instance = pos->second; + // entity = instance->getRoot(); + // boundingBox = instance->getBoundingBox(); + // } + + // transformInstance = tm.getInstance(entity); + // transform = tm.getTransform(transformInstance); + + // if (isCollidable) + // { + // auto transformedBB = boundingBox.transform(transform); + + // auto collisionAxes = _collisionComponentManager->collides(entity, transformedBB); + + // if (collisionAxes.size() == 1) + // { + // // auto globalAxis = collisionAxes[0]; + // // globalAxis *= norm(relativeTranslation); + // // auto newRelativeTranslation = relativeTranslation + globalAxis; + // // translation -= relativeTranslation; + // // translation += newRelativeTranslation; + // // transform = composeMatrix(translation, rotation, scale); + // } + // else if (collisionAxes.size() > 1) + // { + // // translation -= relativeTranslation; + // // transform = composeMatrix(translation, rotation, scale); + // } + // } + // tm.setTransform(transformInstance, transformUpdate); + // } + // tm.commitLocalTransformTransaction(); + // _transformUpdates.clear(); + } + + void SceneManager::queueRelativePositionUpdateFromViewportVector(View *view, 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; + + } + + void SceneManager::queueTransformUpdates(EntityId *entities, math::mat4 *transforms, int numEntities) + { + std::lock_guard lock(_mutex); + + for (int i = 0; i < numEntities; i++) + { + auto entity = entities[i]; + const auto &pos = _transformUpdates.find(entity); + if (pos == _transformUpdates.end()) + { + _transformUpdates.emplace(entity, transforms[i]); + } + auto curr = _transformUpdates[entity]; + _transformUpdates[entity] = curr; + } + } + + Aabb3 SceneManager::getRenderableBoundingBox(EntityId entityId) + { + auto &rm = _engine->getRenderableManager(); + auto instance = rm.getInstance(Entity::import(entityId)); + if (!instance.isValid()) + { + return Aabb3{}; + } + auto box = rm.getAxisAlignedBoundingBox(instance); + return Aabb3{box.center.x, box.center.y, box.center.z, box.halfExtent.x, box.halfExtent.y, box.halfExtent.z}; + } + + Aabb2 SceneManager::getScreenSpaceBoundingBox(View *view, EntityId entityId) + { + const auto &camera = view->getCamera(); + const auto &viewport = view->getViewport(); + + auto &tcm = _engine->getTransformManager(); + auto &rcm = _engine->getRenderableManager(); + + // Get the projection and view matrices + math::mat4 projMatrix = camera.getProjectionMatrix(); + math::mat4 viewMatrix = camera.getViewMatrix(); + math::mat4 vpMatrix = projMatrix * viewMatrix; + + 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(); + + // 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) + { + + math::float4 clipSpace = vpMatrix * corner; + + // Check if the point is behind the camera + if (clipSpace.w <= 0) + { + continue; // Skip this point + } + + // Perform perspective division + math::float3 ndcSpace = clipSpace.xyz / clipSpace.w; + + // 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)); + + // 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 + + minX = std::min(minX, viewportX); + minY = std::min(minY, viewportY); + maxX = std::max(maxX, viewportX); + maxY = std::max(maxY, viewportY); + } + + return Aabb2{minX, minY, maxX, maxY}; + } + + static filament::gltfio::MaterialKey getDefaultUnlitMaterialConfig(int numUvs) + { + filament::gltfio::MaterialKey config; + memset(&config, 0, sizeof(config)); + + config.unlit = false; + config.doubleSided = false; + config.useSpecularGlossiness = false; + config.alphaMode = filament::gltfio::AlphaMode::OPAQUE; + config.hasBaseColorTexture = numUvs > 0; + config.baseColorUV = 0; + config.hasVertexColors = false; + + return config; + } + + SceneAsset *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, + filament::MaterialInstance **materialInstances, + size_t materialInstanceCount, + bool keepData) + { + utils::Entity entity; + + auto builder = GeometrySceneAssetBuilder(_engine) + .vertices(vertices, numVertices) + .indices(indices, numIndices) + .primitiveType(primitiveType); + + if (normals) + { + builder.normals(normals, numNormals); + } + + if (uvs) + { + builder.uvs(uvs, numUvs); + } + + builder.materials(materialInstances, materialInstanceCount); + + auto sceneAsset = builder.build(); + + if (!sceneAsset) + { + Log("Failed to create geometry"); + return std::nullptr_t(); + } + + entity = sceneAsset->getEntity(); + _scene->addEntity(entity); + auto *raw = sceneAsset.get(); + _sceneAssets.push_back(std::move(sceneAsset)); + return raw; + } + + void SceneManager::destroy(filament::MaterialInstance *instance) + { + auto it = std::find(_materialInstances.begin(), _materialInstances.end(), instance); + if (it != _materialInstances.end()) + { + _materialInstances.erase(it); + } + _engine->destroy(instance); + } + + MaterialInstance *SceneManager::createUnlitFixedSizeMaterialInstance() + { + auto instance = _unlitFixedSizeMaterial->createInstance(); + instance->setParameter("scale", 1.0f); + return instance; + } + + MaterialInstance *SceneManager::createUnlitMaterialInstance() + { + UvMap uvmap; + auto instance = _unlitMaterialProvider->createMaterialInstance(nullptr, &uvmap); + instance->setParameter("baseColorFactor", filament::math::float4{1.0f, 1.0f, 1.0f, 1.0f}); + instance->setParameter("baseColorIndex", -1); + _materialInstances.push_back(instance); + return instance; + } + + Camera *SceneManager::createCamera() + { + auto entity = EntityManager::get().create(); + auto camera = _engine->createCamera(entity); + _cameras.push_back(camera); + return camera; + } + + void SceneManager::destroyCamera(Camera *camera) + { + auto entity = camera->getEntity(); + _engine->destroyCameraComponent(entity); + _engine->getEntityManager().destroy(entity); + auto it = std::find(_cameras.begin(), _cameras.end(), camera); + if (it != _cameras.end()) + { + _cameras.erase(it); + } + } + + size_t SceneManager::getCameraCount() + { + return _cameras.size() + 1; + } + + Camera *SceneManager::getCameraAt(size_t index) + { + if (index == 0) + { + return _mainCamera; + } + if (index - 1 > _cameras.size() - 1) + { + return nullptr; + } + return _cameras[index - 1]; + } + + void SceneManager::transformToUnitCube(EntityId entityId) + { + auto entity = utils::Entity::import(entityId); + for (auto &asset : _sceneAssets) + { + auto *instance = reinterpret_cast(asset->getInstanceByEntity(entity)); + if (instance) + { + auto &transformManager = _engine->getTransformManager(); + const auto &entity = utils::Entity::import(entityId); + auto transformInstance = transformManager.getInstance(entity); + if (!transformInstance) + { + return; + } + + auto aabb = instance->getInstance()->getBoundingBox(); + auto center = aabb.center(); + auto halfExtent = aabb.extent(); + auto maxExtent = max(halfExtent) * 2; + auto scaleFactor = 2.0f / maxExtent; + auto transform = math::mat4f::scaling(scaleFactor) * math::mat4f::translation(-center); + transformManager.setTransform(transformManager.getInstance(entity), transform); + return; + } + } + } + +} // namespace thermion diff --git a/thermion_dart/test/animation_tests.dart b/thermion_dart/test/animation_tests.dart index 0599a78c..cd1872a8 100644 --- a/thermion_dart/test/animation_tests.dart +++ b/thermion_dart/test/animation_tests.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:typed_data'; import 'package:animation_tools_dart/animation_tools_dart.dart'; import 'package:test/test.dart'; -import 'package:vector_math/vector_math_64.dart'; import 'helpers.dart'; void main() async { @@ -10,23 +9,21 @@ void main() async { group('morph animation tests', () { test('set morph animation', () async { - var viewer = await testHelper.createViewer( - bg: kRed, cameraPosition: Vector3(0, 0, 5)); + await testHelper.withViewer((viewer) async { + final cube = await viewer.loadGlb( + "${testHelper.testDir}/assets/cube_with_morph_targets.glb"); + var morphData = MorphAnimationData( + Float32List.fromList(List.generate(60, (i) => i / 60)), + ["Key 1"]); - final cube = await viewer - .loadGlb("${testHelper.testDir}/assets/cube_with_morph_targets.glb"); - var morphData = MorphAnimationData( - Float32List.fromList(List.generate(60, (i) => i / 60)), - ["Key 1"]); - await viewer.setMorphAnimationData(cube, morphData); - for (int i = 0; i < 60; i++) { - await viewer.requestFrame(); - await Future.delayed(Duration(milliseconds: 17)); - } - - await testHelper.capture(viewer, "morph_animation"); - await viewer.dispose(); + for (int i = 0; i < 60; i++) { + await viewer.requestFrame(); + await Future.delayed(Duration(milliseconds: 17)); + } + + await testHelper.capture(viewer, "morph_animation"); + }); }); }); } diff --git a/thermion_dart/test/camera_tests.dart b/thermion_dart/test/camera_tests.dart index 4df59737..b4d20f0d 100644 --- a/thermion_dart/test/camera_tests.dart +++ b/thermion_dart/test/camera_tests.dart @@ -11,218 +11,212 @@ void main() async { final testHelper = TestHelper("integration"); group('camera', () { - test('getCameraModelMatrix, getCameraPosition, rotation', () async { - var viewer = await testHelper.createViewer(); - var matrix = await viewer.getCameraModelMatrix(); - expect(matrix.trace(), 4); + test('model matrix', () async { + await testHelper.withViewer((viewer) async { + 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); + 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); - - await viewer.dispose(); + 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 testHelper.createViewer(); + await testHelper.withViewer((viewer) async { + await viewer.setCameraModelMatrix4(Matrix4.identity()); + var modelMatrix = await viewer.getCameraModelMatrix(); + var viewMatrix = await viewer.getCameraViewMatrix(); - 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); + var camera = await viewer.getMainCamera(); + identity = modelMatrix * (await camera.getViewMatrix()); + expect(identity.isIdentity(), isTrue); - // The view matrix should be the inverse of the model matrix - var identity = modelMatrix * viewMatrix; - expect(identity.isIdentity(), isTrue); - var camera = await viewer.getMainCamera(); - identity = modelMatrix * (await camera.getViewMatrix()); - 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)); - await viewer.dispose(); + // 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 testHelper.createViewer(); - var projectionMatrix = await viewer.getCameraProjectionMatrix(); - print(projectionMatrix); - await viewer.dispose(); + test('getCameraProjectionMatrix', () async { + await testHelper.withViewer((viewer) async { + var projectionMatrix = await viewer.getCameraProjectionMatrix(); + print(projectionMatrix); + }); + }); + + test('getCameraCullingProjectionMatrix', () async { + await testHelper.withViewer((viewer) async { + // ignore: dead_code + var viewer = await testHelper.createViewer(); + var matrix = await viewer.getCameraCullingProjectionMatrix(); + print(matrix); + }); + }); + + test('getCameraFrustum', () async { + await testHelper.withViewer((viewer) async { + var frustum = await viewer.getCameraFrustum(); + print(frustum.plane5.normal); + print(frustum.plane5.constant); + + var camera = await viewer.getMainCamera(); + + await camera.setLensProjection( + near: 10.0, far: 1000.0, aspect: 1.0, focalLength: 28.0); + frustum = await viewer.getCameraFrustum(); + print(frustum.plane5.normal); + print(frustum.plane5.constant); + }); + }); + + test('set orthographic projection', () async { + await testHelper.withViewer((viewer) async { + var camera = await viewer.getMainCamera(); + await viewer.createGeometry(GeometryHelper.cube()); + + await camera.setProjection( + Projection.Orthographic, -0.05, 0.05, -0.05, 0.05, 0.05, 10000); + await testHelper.capture( + viewer, "camera_set_orthographic_projection"); + }); + }); + + test('set perspective projection/culling matrix', () async { + await testHelper.withViewer((viewer) async { + var camera = await viewer.getMainCamera(); + final cube = await viewer.createGeometry(GeometryHelper.cube()); + + var fovY = pi / 2; + await camera.setProjectionMatrixWithCulling( + makePerspectiveMatrix(fovY, 1.0, 0.05, 10000), 0.05, 10000); + + await testHelper.capture(viewer, + "camera_set_perspective_projection_culling_matrix_object_fov90"); + + // cube no longer visible when the far plane is moved closer to camera so cube is outside + fovY = 2 * (pi / 3); + await camera.setProjectionMatrixWithCulling( + makePerspectiveMatrix(fovY, 1.0, 0.05, 10000), 0.05, 10000); + + await testHelper.capture(viewer, + "camera_set_perspective_projection_culling_matrix_object_fov120"); + }); + }); + + test('set custom projection/culling matrix (orthographic)', () async { + await testHelper.withViewer((viewer) async { + 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 testHelper.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 testHelper.capture(viewer, + "camera_projection_culling_matrix_object_outside_frustum"); + }); + }); + + test('setting transform on camera updates model matrix (no parent)', + () async { + await testHelper.withViewer((viewer) async { + var cameraEntity = await viewer.getMainCameraEntity(); + var camera = await viewer.getMainCamera(); + + await viewer.setTransform( + cameraEntity, Matrix4.translation(Vector3.all(1))); + + var modelMatrix = await viewer.getCameraModelMatrix(); + expect(modelMatrix.getColumn(3).x, 1.0); + expect(modelMatrix.getColumn(3).y, 1.0); + expect(modelMatrix.getColumn(3).z, 1.0); + expect(modelMatrix.getColumn(3).w, 1.0); + }); + }); + + test('setting transform on camera updates model matrix (with parent)', + () async { + await testHelper.withViewer((viewer) async { + var cameraEntity = await viewer.getMainCameraEntity(); + var camera = await viewer.getMainCamera(); + + var parent = await viewer.createGeometry(GeometryHelper.cube()); + + await viewer.setParent(camera.getEntity(), parent.entity); + await viewer.setTransform( + cameraEntity, Matrix4.translation(Vector3(1, 0, 0))); + + var modelMatrix = await viewer.getCameraModelMatrix(); + expect(modelMatrix.getColumn(3).x, 1.0); + expect(modelMatrix.getColumn(3).y, 0.0); + expect(modelMatrix.getColumn(3).z, 0.0); + expect(modelMatrix.getColumn(3).w, 1.0); + + await viewer.setTransform( + parent.entity, Matrix4.translation(Vector3(0, 1, 0))); + modelMatrix = await viewer.getCameraModelMatrix(); + expect(modelMatrix.getColumn(3).x, 1.0); + expect(modelMatrix.getColumn(3).y, 1.0); + expect(modelMatrix.getColumn(3).z, 0.0); + expect(modelMatrix.getColumn(3).w, 1.0); + }); + }); + + test('create camera', () async { + await testHelper.withViewer((viewer) async { + await viewer.setCameraPosition(0, 0, 5); + await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0); + await viewer.createGeometry(GeometryHelper.cube()); + await testHelper.capture(viewer, "create_camera_main_camera"); + + var newCamera = await viewer.createCamera(); + await newCamera.setTransform(Matrix4.translation(Vector3(0, 0, 4))); + newCamera.setLensProjection(); + await viewer.setActiveCamera(newCamera); + + expect(await viewer.getActiveCamera(), newCamera); + + await testHelper.capture(viewer, "create_camera_new_camera"); + + final mainCamera = await viewer.getMainCamera(); + await viewer.setActiveCamera(mainCamera); + expect(await viewer.getActiveCamera(), mainCamera); + await testHelper.capture(viewer, "create_camera_back_to_main"); + + expect(viewer.getCameraCount(), 2); + expect(viewer.getCameraAt(0), await viewer.getMainCamera()); + expect(viewer.getCameraAt(1), newCamera); + await expectLater( + () => viewer.getCameraAt(2), throwsA(isA())); + }); + }); }); - test('getCameraCullingProjectionMatrix', () async { - throw Exception("TODO"); - // ignore: dead_code - var viewer = await testHelper.createViewer(); - var matrix = await viewer.getCameraCullingProjectionMatrix(); - print(matrix); - await viewer.dispose(); - }); - - test('getCameraFrustum', () async { - var viewer = await testHelper.createViewer(); - var frustum = await viewer.getCameraFrustum(); - print(frustum.plane5.normal); - print(frustum.plane5.constant); - - var camera = await viewer.getMainCamera(); - - await camera.setLensProjection( - near: 10.0, far: 1000.0, aspect: 1.0, focalLength: 28.0); - frustum = await viewer.getCameraFrustum(); - print(frustum.plane5.normal); - print(frustum.plane5.constant); - - await viewer.dispose(); - }); - - test('set orthographic projection', () async { - var viewer = await testHelper.createViewer( - bg: kRed, cameraPosition: Vector3(0, 0, 4)); - var camera = await viewer.getMainCamera(); - await viewer.createGeometry(GeometryHelper.cube()); - - await camera.setProjection( - Projection.Orthographic, -0.05, 0.05, -0.05, 0.05, 0.05, 10000); - await testHelper.capture(viewer, "camera_set_orthographic_projection"); - await viewer.dispose(); - }); - - test('set perspective projection/culling matrix', () async { - var viewer = await testHelper.createViewer( - bg: kRed, cameraPosition: Vector3(0, 0, 4)); - var camera = await viewer.getMainCamera(); - final cube = await viewer.createGeometry(GeometryHelper.cube()); - - var fovY = pi / 2; - await camera.setProjectionMatrixWithCulling( - makePerspectiveMatrix(fovY, 1.0, 0.05, 10000), 0.05, 10000); - - await testHelper.capture( - viewer, "camera_set_perspective_projection_culling_matrix_object_fov90"); - - // cube no longer visible when the far plane is moved closer to camera so cube is outside - fovY = 2*(pi/3); - await camera.setProjectionMatrixWithCulling( - makePerspectiveMatrix(fovY, 1.0, 0.05, 10000), 0.05, 10000); - - await testHelper.capture( - viewer, "camera_set_perspective_projection_culling_matrix_object_fov120"); - - await viewer.dispose(); - }); - - test('set custom projection/culling matrix (orthographic)', () async { - var viewer = await testHelper.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 testHelper.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 testHelper.capture( - viewer, "camera_projection_culling_matrix_object_outside_frustum"); - - await viewer.dispose(); - }); - - test('setting transform on camera updates model matrix (no parent)', - () async { - var viewer = await testHelper.createViewer(); - - var cameraEntity = await viewer.getMainCameraEntity(); - var camera = await viewer.getMainCamera(); - - await viewer.setPosition(cameraEntity, 1, 0, 0); - - var modelMatrix = await viewer.getCameraModelMatrix(); - expect(modelMatrix.getColumn(3).x, 1.0); - expect(modelMatrix.getColumn(3).y, 0.0); - expect(modelMatrix.getColumn(3).z, 0.0); - expect(modelMatrix.getColumn(3).w, 1.0); - - await viewer.dispose(); - }); - - test('setting transform on camera updates model matrix (with parent)', - () async { - var viewer = await testHelper.createViewer(); - - var cameraEntity = await viewer.getMainCameraEntity(); - var camera = await viewer.getMainCamera(); - - var parent = await viewer.createGeometry(GeometryHelper.cube()); - - await viewer.setParent(camera.getEntity(), parent); - await viewer.setTransform( - cameraEntity, Matrix4.translation(Vector3(1, 0, 0))); - - var modelMatrix = await viewer.getCameraModelMatrix(); - expect(modelMatrix.getColumn(3).x, 1.0); - expect(modelMatrix.getColumn(3).y, 0.0); - expect(modelMatrix.getColumn(3).z, 0.0); - expect(modelMatrix.getColumn(3).w, 1.0); - - await viewer.setTransform(parent, Matrix4.translation(Vector3(0, 1, 0))); - modelMatrix = await viewer.getCameraModelMatrix(); - expect(modelMatrix.getColumn(3).x, 1.0); - expect(modelMatrix.getColumn(3).y, 1.0); - expect(modelMatrix.getColumn(3).z, 0.0); - expect(modelMatrix.getColumn(3).w, 1.0); - await viewer.dispose(); - }); - - test('create camera', () async { - var viewer = await testHelper.createViewer(); - - await viewer.setCameraPosition(0, 0, 5); - await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0); - await viewer.createGeometry(GeometryHelper.cube()); - await testHelper.capture(viewer, "create_camera_main_camera"); - - var newCamera = await viewer.createCamera(); - await newCamera.setTransform(Matrix4.translation(Vector3(0, 0, 4))); - newCamera.setLensProjection(); - await viewer.setActiveCamera(newCamera); - - expect(await viewer.getActiveCamera(), newCamera); - - await testHelper.capture(viewer, "create_camera_new_camera"); - - final mainCamera = await viewer.getMainCamera(); - await viewer.setActiveCamera(mainCamera); - expect(await viewer.getActiveCamera(), mainCamera); - await testHelper.capture(viewer, "create_camera_back_to_main"); - - expect(viewer.getCameraCount(), 2); - expect(viewer.getCameraAt(0), await viewer.getMainCamera()); - expect(viewer.getCameraAt(1), newCamera); - await expectLater(() => viewer.getCameraAt(2), throwsA(isA())); - - await viewer.dispose(); - }); - }); } diff --git a/thermion_dart/test/geometry_tests.dart b/thermion_dart/test/geometry_tests.dart index ee2b7707..e08562cf 100644 --- a/thermion_dart/test/geometry_tests.dart +++ b/thermion_dart/test/geometry_tests.dart @@ -13,71 +13,118 @@ import 'helpers.dart'; void main() async { final testHelper = TestHelper("geometry"); group("custom geometry", () { - test('create cube (no uvs/normals)', () async { - var viewer = await testHelper.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); - final cube = await viewer - .createGeometry(GeometryHelper.cube(normals: false, uvs: false)); - - await testHelper.capture(viewer, "geometry_cube_no_uv_no_normal"); - await viewer.removeEntity(cube); - await testHelper.capture(viewer, "geometry_cube_removed"); - await viewer.dispose(); - }); - - test('create cube (no normals)', () async { - var viewer = await testHelper.createViewer(); - var light = await viewer.addLight( - 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)); - await testHelper.capture(viewer, "geometry_cube_no_normals"); + test('create cube', () async { + await testHelper.withViewer((viewer) async { + final cube = await viewer + .createGeometry(GeometryHelper.cube(normals: false, uvs: false)); + await testHelper.capture(viewer, "geometry_add_cube"); + await viewer.removeEntity(cube); + await testHelper.capture(viewer, "geometry_remove_cube"); + }); }); test('create cube (with normals)', () async { var viewer = await testHelper.createViewer(); - - var light = await viewer.addLight( - 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, 1.0, 1.0, 1.0); await viewer .createGeometry(GeometryHelper.cube(normals: true, uvs: false)); await testHelper.capture(viewer, "geometry_cube_with_normals"); }); + test('create instance', () async { + await testHelper.withViewer((viewer) async { + final cube = await viewer + .createGeometry(GeometryHelper.cube(normals: false, uvs: false)); + await viewer.setTransform( + cube.entity, Matrix4.translation(Vector3.all(-1))); + final instance = await cube.createInstance(); + await instance.addToScene(); + await viewer.setTransform( + instance.entity, Matrix4.translation(Vector3.all(1))); + + await testHelper.capture(viewer, "geometry_instanced"); + }); + }); + + // test('create instance (shared material)', () async { + // await testHelper.withViewer((viewer) async { + // final materialInstance = await viewer.createUnlitMaterialInstance(); + // await materialInstance.setParameterFloat4( + // "baseColorFactor", 1.0, 0.0, 0.0, 1.0); + // final cube = await viewer.createGeometry( + // GeometryHelper.cube(normals: true, uvs: false), + // materialInstances: [materialInstance]); + + // final instance = await viewer + // .createInstance(cube, materialInstances: [materialInstance]); + // await viewer.setTransform( + // instance.entity, Matrix4.translation(Vector3.all(1))); + + // await testHelper.capture( + // viewer, "geometry_instanced_with_shared_material_instance"); + // }); + // }); + + // test('create instance (no material on second instance)', () async { + // await testHelper.withViewer((viewer) async { + // final materialInstance = await viewer.createUnlitMaterialInstance(); + // await materialInstance.setParameterFloat4( + // "baseColorFactor", 1.0, 0.0, 0.0, 1.0); + // final cube = await viewer.createGeometry( + // GeometryHelper.cube(normals: true, uvs: false), + // materialInstances: [materialInstance]); + + // final instance = await viewer + // .createInstance(cube); + // await viewer.setTransform( + // instance.entity, Matrix4.translation(Vector3.all(1))); + + // await testHelper.capture( + // viewer, "geometry_instanced_with_no_material_instance"); + // }); + // }); + + // test('create instance (separate materials)', () async { + // await testHelper.withViewer((viewer) async { + // final materialInstance = await viewer.createUnlitMaterialInstance(); + // await materialInstance.setParameterFloat4( + // "baseColorFactor", 1.0, 0.0, 0.0, 1.0); + // final cube = await viewer.createGeometry( + // GeometryHelper.cube(normals: true, uvs: false), + // materialInstances: [materialInstance]); + + // final materialInstance2 = await viewer.createUnlitMaterialInstance(); + // await materialInstance2.setParameterFloat4( + // "baseColorFactor", 0.0, 1.0, 0.0, 1.0); + // final instance = await viewer + // .createInstance(cube, materialInstances: [materialInstance2]); + // await viewer.setTransform( + // instance.entity, Matrix4.translation(Vector3.all(1))); + + // await testHelper.capture( + // viewer, "geometry_instanced_with_separate_material_instances"); + // }); + // }); + test('create cube with custom ubershader material instance (color)', () async { - var viewer = await testHelper.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); + await testHelper.withViewer((viewer) async { + 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: materialInstance); - await viewer.setMaterialPropertyFloat4( - cube, "baseColorFactor", 0, 0.0, 1.0, 0.0, 0.0); - await testHelper.capture( - viewer, "geometry_cube_with_custom_material_ubershader"); - await viewer.removeEntity(cube); - await viewer.destroyMaterialInstance(materialInstance); + var materialInstance = + await viewer.createUbershaderMaterialInstance(unlit: true); + final cube = await viewer.createGeometry( + GeometryHelper.cube(uvs: false, normals: true), + materialInstances: [materialInstance]); + await materialInstance.setParameterFloat4( + "baseColorFactor", 0.0, 1.0, 0.0, 0.0); + await testHelper.capture( + viewer, "geometry_cube_with_custom_material_ubershader"); + await viewer.removeEntity(cube); + }); }); test('create cube with custom ubershader material instance (texture)', @@ -92,86 +139,68 @@ void main() async { var materialInstance = await viewer.createUbershaderMaterialInstance(); final cube = await viewer.createGeometry( GeometryHelper.cube(uvs: true, normals: true), - materialInstance: materialInstance); + materialInstances: [materialInstance]); var textureData = File("${testHelper.testDir}/assets/cube_texture_512x512.png") .readAsBytesSync(); var texture = await viewer.createTexture(textureData); - await viewer.applyTexture(texture as ThermionFFITexture, cube); + await viewer.applyTexture(texture as ThermionFFITexture, cube.entity); await testHelper.capture( viewer, "geometry_cube_with_custom_material_ubershader_texture"); await viewer.removeEntity(cube); - await viewer.destroyMaterialInstance(materialInstance); await viewer.destroyTexture(texture); }); test('unlit material with color only', () async { - var viewer = await testHelper.createViewer(); - await viewer.setCameraPosition(0, 0, 6); - await viewer.setBackgroundColor(1.0, 0.0, 0.0, 1.0); - await viewer.setPostProcessing(true); - await viewer.setToneMapping(ToneMapper.LINEAR); + await testHelper.withViewer((viewer) async { + var materialInstance = await viewer.createUnlitMaterialInstance(); + var cube = await viewer.createGeometry(GeometryHelper.cube(), + materialInstances: [materialInstance]); - var materialInstance = await viewer.createUnlitMaterialInstance(); - var cube = await viewer.createGeometry(GeometryHelper.cube(), - materialInstance: materialInstance); + await materialInstance.setParameterFloat4( + "baseColorFactor", 0.0, 1.0, 0.0, 1.0); - await viewer.setMaterialPropertyFloat4( - cube, "baseColorFactor", 0, 0.0, 1.0, 0.0, 1.0); - - await testHelper.capture(viewer, "unlit_material_base_color"); - - await viewer.dispose(); + await testHelper.capture(viewer, "unlit_material_base_color"); + }); }); - test('create cube with custom material instance (unlit)', () async { - var viewer = await testHelper.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); + test('unlit material with texture', () async { + await testHelper.withViewer((viewer) async { + var materialInstance = await viewer.createUnlitMaterialInstance(); + var cube = await viewer.createGeometry(GeometryHelper.cube(), + materialInstances: [materialInstance]); - var materialInstance = await viewer.createUnlitMaterialInstance(); - var cube = await viewer.createGeometry(GeometryHelper.cube(), - materialInstance: materialInstance); + await materialInstance.setParameterInt("baseColorIndex", 0); + var textureData = + File("${testHelper.testDir}/assets/cube_texture_512x512.png") + .readAsBytesSync(); + var texture = await viewer.createTexture(textureData); + await viewer.applyTexture(texture, cube.entity); + await testHelper.capture(viewer, "unlit_material_texture_only"); + await viewer.removeEntity(cube); + }); + }); - var textureData = - File("${testHelper.testDir}/assets/cube_texture_512x512.png") - .readAsBytesSync(); - var texture = await viewer.createTexture(textureData); - await viewer.applyTexture(texture, cube); - await testHelper.capture( - viewer, "geometry_cube_with_custom_material_unlit_texture_only"); - await viewer.removeEntity(cube); + test('shared material instance with texture and base color', () async { + await testHelper.withViewer((viewer) async { + var materialInstance = await viewer.createUnlitMaterialInstance(); + var cube1 = await viewer.createGeometry(GeometryHelper.cube(), + materialInstances: [materialInstance]); + var cube2 = await viewer.createGeometry(GeometryHelper.cube(), + materialInstances: [materialInstance]); + await viewer.setTransform( + cube2.entity, Matrix4.translation(Vector3(1, 1, 1))); - 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 testHelper.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 testHelper.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(); + await materialInstance.setParameterInt("baseColorIndex", 0); + var textureData = + File("${testHelper.testDir}/assets/cube_texture_512x512.png") + .readAsBytesSync(); + var texture = await viewer.createTexture(textureData); + await viewer.applyTexture(texture, cube1.entity); + await viewer.applyTexture(texture, cube2.entity); + await testHelper.capture(viewer, "unlit_material_shared"); + await viewer.destroyTexture(texture); + }); }); test('create sphere (no normals)', () async { @@ -183,15 +212,15 @@ void main() async { await testHelper.capture(viewer, "geometry_sphere_no_normals"); }); - test('create geometry instance', () async { - var viewer = await testHelper.createViewer( - cameraPosition: Vector3(0, 0, 6), bg: kRed); - final cube = await viewer - .createGeometry(GeometryHelper.sphere(normals: false, uvs: false)); - await viewer.setTransform(cube, Matrix4.translation(Vector3(2, 1, 1))); - final cube2 = await viewer.createInstance(cube); - await viewer.setTransform(cube2, Matrix4.translation(Vector3(-2, 1, 1))); - await testHelper.capture(viewer, "geometry_instance"); - }); + // test('create geometry instance', () async { + // var viewer = await testHelper.createViewer( + // cameraPosition: Vector3(0, 0, 6), bg: kRed); + // final cube = await viewer + // .createGeometry(GeometryHelper.sphere(normals: false, uvs: false)); + // await viewer.setTransform(cube.entity, Matrix4.translation(Vector3(2, 1, 1))); + // final cube2 = await viewer.createInstance(cube); + // await viewer.setTransform(cube2.entity, Matrix4.translation(Vector3(-2, 1, 1))); + // await testHelper.capture(viewer, "geometry_instance"); + // }); }); } diff --git a/thermion_dart/test/gizmo_tests.dart b/thermion_dart/test/gizmo_tests.dart index ccf4e2d6..d7671332 100644 --- a/thermion_dart/test/gizmo_tests.dart +++ b/thermion_dart/test/gizmo_tests.dart @@ -1,19 +1,310 @@ -// ignore_for_file: unused_local_variable +import 'dart:async'; +import 'package:thermion_dart/thermion_dart.dart'; import 'package:test/test.dart'; - +import 'package:vector_math/vector_math_64.dart'; import 'helpers.dart'; void main() async { final testHelper = TestHelper("gizmo"); - group('gizmo', () { - test('add gizmo to scene', () async { - var viewer = await testHelper.createViewer(); - var view = await viewer.getViewAt(0); - var gizmo = await viewer.createGizmo(view); - await testHelper.capture(viewer, "gizmo_add_to_scene"); - await viewer.dispose(); + group("gizmo tests", () { + test('add gizmo', () async { + await testHelper.withViewer((viewer) async { + var modelMatrix = + makeViewMatrix(Vector3(0.5, 0.5, 0.5), Vector3.zero(), Vector3(0, 1, 0)); + modelMatrix.invert(); + await viewer.setCameraModelMatrix4(modelMatrix); + + final view = await viewer.getViewAt(0); + final gizmo = await viewer.createGizmo(view, GizmoType.translation); + await viewer.setLayerVisibility(VisibilityLayers.OVERLAY, true); + await gizmo.addToScene(); + await testHelper.capture( + viewer, "gizmo_added_to_scene_unattached_close"); + + modelMatrix = + makeViewMatrix(Vector3(0.5, 0.5, 0.5).scaled(10), Vector3.zero(), Vector3(0, 1, 0)); + modelMatrix.invert(); + await viewer.setCameraModelMatrix4(modelMatrix); + + // gizmo occupies same viewport size no matter the camera position + await testHelper.capture(viewer, "gizmo_added_to_scene_unattached_far"); + }, postProcessing: true, bg: kWhite); + }); + + test('pick gizmo when not added to scene (this should not crash)', + () async { + await testHelper.withViewer((viewer) async { + await viewer.setCameraPosition(0, 0, 1); + final view = await viewer.getViewAt(0); + final viewport = await view.getViewport(); + final gizmo = await viewer.createGizmo(view, GizmoType.translation); + + final completer = Completer(); + + await gizmo.pick(viewport.width ~/ 2, viewport.height ~/ 2 + 1, + handler: (GizmoPickResultType resultType, Vector3 coords) async { + completer.complete(resultType); + }); + + for (int i = 0; i < 10; i++) { + await testHelper.capture( + viewer, "pick_gizmo_without_adding_to_scene"); + if (completer.isCompleted) { + break; + } + } + + expect(completer.isCompleted, false); + }, postProcessing: true, bg: kWhite); + }); + + test('pick gizmo when added to scene', () async { + await testHelper.withViewer((viewer) async { + await viewer.setCameraPosition(0, 0, 1); + final view = await viewer.getViewAt(0); + final viewport = await view.getViewport(); + final gizmo = await viewer.createGizmo(view, GizmoType.translation); + await gizmo.addToScene(); + await viewer.setLayerVisibility(VisibilityLayers.OVERLAY, true); + + final completer = Completer(); + + await testHelper.capture(viewer, "gizmo_before_pick_no_highlight"); + + await gizmo.pick(viewport.width ~/ 2, viewport.height ~/ 2 + 1, + handler: (resultType, coords) async { + completer.complete(resultType); + }); + + for (int i = 0; i < 10; i++) { + await testHelper.capture(viewer, "gizmo_after_pick_no_highlight"); + if (completer.isCompleted) { + break; + } + } + + assert(completer.isCompleted); + }, postProcessing: true, bg: kWhite); + }); + + test('highlight/unhighlight gizmo', () async { + await testHelper.withViewer((viewer) async { + final modelMatrix = + makeViewMatrix(Vector3(0.5, 0.5, 0.5), Vector3.zero(), Vector3(0, 1, 0)); + modelMatrix.invert(); + await viewer.setCameraModelMatrix4(modelMatrix); + final view = await viewer.getViewAt(0); + final viewport = await view.getViewport(); + final gizmo = await viewer.createGizmo(view, GizmoType.translation); + await gizmo.addToScene(); + await viewer.setLayerVisibility(VisibilityLayers.OVERLAY, true); + + await testHelper.capture(viewer, "gizmo_before_highlight"); + await gizmo.highlight(Axis.X); + await testHelper.capture(viewer, "gizmo_after_highlight"); + await gizmo.unhighlight(); + await testHelper.capture(viewer, "gizmo_after_unhighlight"); + }, postProcessing: true, bg: kWhite); }); }); + + // test('set uv scaling (unlit)', () async { + // var viewer = await testHelper.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 unlitMaterialInstance = await viewer.createUnlitMaterialInstance(); + // final cube = await viewer.createGeometry(GeometryHelper.cube(), + // materialInstance: unlitMaterialInstance); + // await viewer.setMaterialPropertyFloat4( + // cube, 'baseColorFactor', 0, 1, 1, 1, 1); + // await viewer.setMaterialPropertyInt(cube, 'baseColorIndex', 0, 1); + // unlitMaterialInstance.setParameterFloat2("uvScale", 2.0, 4.0); + + // var textureData = + // File("${testHelper.testDir}/assets/cube_texture_512x512.png") + // .readAsBytesSync(); + // var texture = await viewer.createTexture(textureData); + // await viewer.applyTexture(texture, cube); + // await testHelper.capture(viewer, "set_uv_scaling"); + // await viewer.dispose(); + // }); + // }); + + // group("texture", () { + // test("create/apply/dispose texture", () async { + // var viewer = await testHelper.createViewer(); + + // var textureData = + // File("${testHelper.testDir}/assets/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( + // 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(), + // materialInstances: [materialInstance]); + + // await viewer.setPostProcessing(true); + // await viewer.setToneMapping(ToneMapper.LINEAR); + + // await viewer.applyTexture(texture, cube, + // materialIndex: 0, parameterName: "baseColorMap"); + + // await testHelper.capture(viewer, "texture_applied_to_geometry"); + + // await viewer.removeEntity(cube); + // await viewer.destroyTexture(texture); + // await viewer.dispose(); + // }); + // }); + + // group("unproject", () { + // test("unproject", () async { + // final dimensions = (width: 1280, height: 768); + + // var viewer = await testHelper.createViewer(viewportDimensions: dimensions); + // 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("${testHelper.testDir}/assets/cube_texture_512x512.png").readAsBytesSync(); + // var texture = await viewer.createTexture(textureData); + // await viewer.applyTexture(texture, cube, + // materialIndex: 0, parameterName: "baseColorMap"); + + // var numFrames = 60; + + // // first do the 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 testHelper.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); + + // await viewer.setPostProcessing(true); + // await viewer.setToneMapping(ToneMapper.LINEAR); + + // final unlit = await viewer.createUnlitMaterialInstance(); + // 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 testHelper.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 testHelper.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))); } diff --git a/thermion_dart/test/gltf_tests.dart b/thermion_dart/test/gltf_tests.dart index ee591457..306eac4e 100644 --- a/thermion_dart/test/gltf_tests.dart +++ b/thermion_dart/test/gltf_tests.dart @@ -12,50 +12,81 @@ void main() async { final testHelper = TestHelper("gltf"); group("gltf", () { test('load glb from file', () async { - var viewer = await testHelper.createViewer(bg: kRed, cameraPosition: Vector3(0, 1, 5)); - var model = await viewer.loadGlb("file://${testHelper.testDir}/assets/cube.glb"); - await viewer - .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); - await testHelper.capture(viewer, "load_glb_from_file"); - await viewer.dispose(); + await testHelper.withViewer((viewer) async { + var model = await viewer + .loadGlb("file://${testHelper.testDir}/assets/cube.glb"); + await testHelper.capture(viewer, "load_glb_from_file"); + await viewer.removeEntity(model); + }); }); test('load glb from buffer', () async { - var viewer = await testHelper.createViewer(); - var buffer = File("${testHelper.testDir}/assets/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 testHelper.capture(viewer, "load_glb_from_buffer"); - await viewer.dispose(); + await testHelper.withViewer((viewer) async { + var buffer = + File("${testHelper.testDir}/assets/cube.glb").readAsBytesSync(); + var model = await viewer.loadGlbFromBuffer(buffer); + await testHelper.capture(viewer, "load_glb_from_buffer"); + }); }); test('load glb from buffer with priority', () async { - var viewer = await testHelper.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)); + await testHelper.withViewer((viewer) async { + viewer.addDirectLight(DirectLight.sun()); + var buffer = + File("${testHelper.testDir}/assets/cube.glb").readAsBytesSync(); - var buffer = File("${testHelper.testDir}/assets/cube.glb").readAsBytesSync(); - var model1 = await viewer.loadGlbFromBuffer(buffer, priority: 7); - var model2 = await viewer.loadGlbFromBuffer(buffer, priority: 0); + // priority 0 gets drawn first + var greenModel = await viewer.loadGlbFromBuffer(buffer, priority: 0); + for (final entity in await viewer.getChildEntities(greenModel)) { + final material = await viewer.getMaterialInstanceAt(entity, 0); + await material!.setParameterFloat4("baseColorFactor", 0, 1, 0.0, 1.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 testHelper.capture(viewer, "load_glb_from_buffer_with_priority"); + // priority 7 gets drawn last + var blueModel = await viewer.loadGlbFromBuffer(buffer, priority: 7); + for (final entity in await viewer.getChildEntities(blueModel)) { + final material = await viewer.getMaterialInstanceAt(entity, 0); + await material!.setParameterFloat4("baseColorFactor", 0, 0, 1.0, 1.0); + } - await viewer.dispose(); + // blue model rendered in front + await testHelper.capture(viewer, "load_glb_from_buffer_with_priority"); + }); + }); + + test('create instance from gltf', () async { + await testHelper.withViewer((viewer) async { + var model = await viewer.loadGlb( + "file://${testHelper.testDir}/assets/cube.glb", + numInstances: 2); + await testHelper.capture(viewer, "gltf_create_instance_0"); + var instance = await model.createInstance(); + await instance.addToScene(); + await viewer.setRendering(true); + + await viewer.setTransform( + instance.entity, Matrix4.translation(Vector3.all(1))); + await testHelper.capture(viewer, "gltf_create_instance_1"); + }); + }); + + test('create instance from gltf with new material', () async { + await testHelper.withViewer((viewer) async { + var model = await viewer.loadGlb( + "file://${testHelper.testDir}/assets/cube.glb", + numInstances: 2); + await testHelper.capture(viewer, "gltf_create_instance_with_material_0"); + + final materialInstance = await viewer.createUnlitMaterialInstance(); + await materialInstance.setParameterFloat4( + "baseColorFactor", 1.0, 0.0, 0.0, 1.0); + var instance = await model.createInstance(materialInstances: [materialInstance]); + await instance.addToScene(); + + await viewer.setTransform( + instance.entity, Matrix4.translation(Vector3.all(1))); + await testHelper.capture(viewer, "gltf_create_instance_with_material_1"); + }); }); }); } diff --git a/thermion_dart/test/helpers.dart b/thermion_dart/test/helpers.dart index bde9b984..2d240fe9 100644 --- a/thermion_dart/test/helpers.dart +++ b/thermion_dart/test/helpers.dart @@ -3,6 +3,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'; @@ -79,7 +80,6 @@ class TestHelper { outDir = Directory("$testDir/output/${dir}"); print("Out dir : $packageUri"); - // outDir.deleteSync(recursive: true); outDir.createSync(recursive: true); print("Created out dir : $packageUri"); if (Platform.isMacOS) { @@ -110,42 +110,63 @@ class TestHelper { return object; } + Future withViewer(Future Function(ThermionViewer viewer) fn, + {img.Color? bg, + Vector3? cameraPosition, + viewportDimensions = (width: 500, height: 500), + bool postProcessing = false}) async { + var viewer = await createViewer( + bg: bg, + cameraPosition: cameraPosition, + viewportDimensions: viewportDimensions, + postProcessing: postProcessing); + + await fn.call(viewer); + await viewer.dispose(); + } + Future createViewer( {img.Color? bg, Vector3? cameraPosition, + bool postProcessing = false, viewportDimensions = (width: 500, height: 500)}) async { final resourceLoader = calloc(1); - + + cameraPosition ??= Vector3(0, 2, 6); + 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; swapChain = await viewer.createHeadlessSwapChain( viewportDimensions.width, viewportDimensions.height); - + 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); - } + await viewer.setCameraPosition( + cameraPosition.x, cameraPosition.y, cameraPosition.z); + + await viewer.setPostProcessing(postProcessing); + + await viewer.setToneMapping(ToneMapper.LINEAR); + return viewer; } } diff --git a/thermion_dart/test/material_tests.dart b/thermion_dart/test/material_tests.dart index a0255131..79584f15 100644 --- a/thermion_dart/test/material_tests.dart +++ b/thermion_dart/test/material_tests.dart @@ -8,30 +8,58 @@ import 'package:vector_math/vector_math_64.dart'; import 'helpers.dart'; +Future< + ({ + ThermionAsset blueCube, + MaterialInstance blueMaterialInstance, + ThermionAsset greenCube, + MaterialInstance greenMaterialInstance + })> setup(ThermionViewer viewer) async { + var blueMaterialInstance = await viewer.createUnlitMaterialInstance(); + final blueCube = await viewer.createGeometry(GeometryHelper.cube(), + materialInstances: [blueMaterialInstance]); + await blueMaterialInstance.setParameterFloat4( + "baseColorFactor", 0.0, 0.0, 1.0, 1.0); + + // Position blue cube slightly behind and to the right + await viewer.setTransform( + blueCube.entity, Matrix4.translation(Vector3(1.0, 0.0, -1.0))); + + var greenMaterialInstance = await viewer.createUnlitMaterialInstance(); + final greenCube = await viewer.createGeometry(GeometryHelper.cube(), + materialInstances: [greenMaterialInstance]); + await greenMaterialInstance.setParameterFloat4( + "baseColorFactor", 0.0, 1.0, 0.0, 1.0); + + return ( + blueCube: blueCube, + blueMaterialInstance: blueMaterialInstance, + greenCube: greenCube, + greenMaterialInstance: greenMaterialInstance + ); +} + void main() async { - final testHelper = TestHelper("integration"); + final testHelper = TestHelper("material"); group("material tests", () { test('unlit material with color only', () async { - var viewer = await testHelper.createViewer(); - await viewer.setCameraPosition(0, 0, 6); - await viewer.setBackgroundColor(1.0, 0.0, 0.0, 1.0); - await viewer.setPostProcessing(true); - await viewer.setToneMapping(ToneMapper.LINEAR); + await testHelper.withViewer((viewer) async { + await viewer.setPostProcessing(true); + await viewer.setToneMapping(ToneMapper.LINEAR); - var materialInstance = await viewer.createUnlitMaterialInstance(); - var cube = await viewer.createGeometry(GeometryHelper.cube(), - materialInstance: materialInstance); + var materialInstance = await viewer.createUnlitMaterialInstance(); + var cube = await viewer.createGeometry(GeometryHelper.cube(), + materialInstances: [materialInstance]); - await materialInstance.setParameterFloat4( - "baseColorFactor", 0.0, 1.0, 0.0, 1.0); - await materialInstance.setParameterInt("baseColorIndex", -1); - await viewer.render(); - await viewer.render(); - await viewer.render(); - await testHelper.capture(viewer, "unlit_material_base_color"); - - await viewer.dispose(); + await materialInstance.setParameterFloat4( + "baseColorFactor", 0.0, 1.0, 0.0, 1.0); + await materialInstance.setParameterInt("baseColorIndex", -1); + // await viewer.render(); + // await viewer.render(); + // await viewer.render(); + await testHelper.capture(viewer, "unlit_material_base_color"); + }); }); test('unlit fixed size material', () async { @@ -44,10 +72,10 @@ void main() async { var materialInstance = await viewer.createUnlitFixedSizeMaterialInstance(); var cube = await viewer.createGeometry(GeometryHelper.cube(), - materialInstance: materialInstance); + materialInstances: [materialInstance]); - await viewer.setMaterialPropertyFloat4( - cube, "baseColorFactor", 0, 0.0, 1.0, 0.0, 1.0); + await materialInstance.setParameterFloat4( + "baseColorFactor", 0.0, 1.0, 0.0, 1.0); await testHelper.capture(viewer, "unlit_fixed_size_default_scale"); @@ -69,12 +97,12 @@ void main() async { var materialInstance = await viewer.createUbershaderMaterialInstance(); final cube = await viewer.createGeometry( GeometryHelper.cube(uvs: true, normals: true), - materialInstance: materialInstance); + materialInstances: [materialInstance]); var textureData = File("${testHelper.testDir}/assets/cube_texture_512x512.png") .readAsBytesSync(); var texture = await viewer.createTexture(textureData); - await viewer.applyTexture(texture as ThermionFFITexture, cube); + await viewer.applyTexture(texture as ThermionFFITexture, cube.entity); await testHelper.capture( viewer, "geometry_cube_with_custom_material_ubershader_texture"); await viewer.removeEntity(cube); @@ -94,34 +122,34 @@ void main() async { var materialInstance = await viewer.createUnlitMaterialInstance(); var cube = await viewer.createGeometry(GeometryHelper.cube(), - materialInstance: materialInstance); + materialInstances: [materialInstance]); var textureData = File("${testHelper.testDir}/assets/cube_texture_512x512.png") .readAsBytesSync(); var texture = await viewer.createTexture(textureData); - await viewer.applyTexture(texture, cube); + await viewer.applyTexture(texture, cube.entity); await testHelper.capture( viewer, "geometry_cube_with_custom_material_unlit_texture_only"); await viewer.removeEntity(cube); cube = await viewer.createGeometry(GeometryHelper.cube(), - materialInstance: materialInstance); + materialInstances: [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 materialInstance.setParameterInt("baseColorIndex", -1); + await materialInstance.setParameterFloat4( + "baseColorFactor", 0.0, 1.0, 0.0, 1.0); await testHelper.capture( viewer, "geometry_cube_with_custom_material_unlit_color_only"); await viewer.removeEntity(cube); cube = await viewer.createGeometry(GeometryHelper.cube(), - materialInstance: materialInstance); + materialInstances: [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 materialInstance.setParameterInt("baseColorIndex", 0); + await materialInstance.setParameterFloat4( + "baseColorFactor", 0.0, 1.0, 0.0, 0.5); + await viewer.applyTexture(texture, cube.entity); await testHelper.capture( viewer, "geometry_cube_with_custom_material_unlit_color_and_texture"); @@ -143,253 +171,240 @@ void main() async { await viewer.dispose(); }); - }); - group("MaterialInstance", () { test('set depth func to always', () async { - var viewer = await testHelper.createViewer( - bg: kRed, cameraPosition: Vector3(0, 0, 6)); + await testHelper.withViewer((viewer) async { + final ( + :blueCube, + :blueMaterialInstance, + :greenCube, + :greenMaterialInstance + ) = await setup(viewer); - var materialInstance1 = await viewer.createUnlitMaterialInstance(); - final cube1 = await viewer.createGeometry(GeometryHelper.cube(), - materialInstance: materialInstance1); + // with default depth func, blue cube renders behind the green cube + await testHelper.capture( + viewer, "material_instance_depth_func_default"); - await materialInstance1! - .setParameterFloat4("baseColorFactor", 0.0, 1.0, 0.0, 1.0); + await greenMaterialInstance.setDepthFunc(SamplerCompareFunction.A); - var materialInstance2 = await viewer.createUnlitMaterialInstance(); - final cube2 = await viewer.createGeometry(GeometryHelper.cube(), - materialInstance: materialInstance2); - await viewer.setPosition(cube2, 1.0, 0.0, -1.0); - - await materialInstance2! - .setParameterFloat4("baseColorFactor", 0.0, 0.0, 1.0, 1.0); - - // with default depth func, blue cube renders behind the green cube - await testHelper.capture(viewer, "material_instance_depth_func_default"); - - await materialInstance2.setDepthFunc(SamplerCompareFunction.A); - - await testHelper.capture(viewer, "material_instance_depth_func_always"); - await viewer.dispose(); + // with green material depth func set to always pass, green cube will render in front of blue cube + await testHelper.capture(viewer, "material_instance_depth_func_always"); + }); }); test('disable depth write', () async { - var viewer = await testHelper.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())); + await testHelper.withViewer((viewer) async { + final ( + :blueCube, + :blueMaterialInstance, + :greenCube, + :greenMaterialInstance + ) = await setup(viewer); - final cube1 = await viewer.createGeometry(GeometryHelper.cube()); - var materialInstance = await viewer.getMaterialInstanceAt(cube1, 0); + // With depth write enabled on both materials, green cube renders behind the blue cube + await testHelper.capture( + viewer, "material_instance_depth_write_enabled"); - 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); + // Disable depth write on green cube, blue cube will always appear in front (green cube renders behind everything, including the image material, so not it's not visible at all) + await greenMaterialInstance.setDepthWriteEnabled(false); + await testHelper.capture( + viewer, "material_instance_depth_write_disabled"); - expect(materialInstance, isNotNull); - - // with depth write enabled on both materials, cube2 renders behind the white cube - await testHelper.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 testHelper.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 testHelper.capture( - viewer, "material_instance_depth_write_disabled_with_priority"); - await viewer.dispose(); + // Set priority for greenCube to render last, making it appear in front + await viewer.setPriority(greenCube.entity, 7); + await testHelper.capture( + viewer, "material_instance_depth_write_disabled_with_priority"); + }); }); - test('set uv scaling (unlit)', () async { - var viewer = await testHelper.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())); + test('enable stencil write', () async { + await testHelper.withViewer((viewer) async { + final ( + :blueCube, + :blueMaterialInstance, + :greenCube, + :greenMaterialInstance + ) = await setup(viewer); - final unlitMaterialInstance = await viewer.createUnlitMaterialInstance(); - final cube = await viewer.createGeometry(GeometryHelper.cube(), - materialInstance: unlitMaterialInstance); - await viewer.setMaterialPropertyFloat4( - cube, 'baseColorFactor', 0, 1, 1, 1, 1); - await viewer.setMaterialPropertyInt(cube, 'baseColorIndex', 0, 1); - unlitMaterialInstance.setParameterFloat2("uvScale", 2.0, 4.0); + // force depth to always pass so we're just comparing stencil test + await greenMaterialInstance.setDepthFunc(SamplerCompareFunction.A); + await blueMaterialInstance.setDepthFunc(SamplerCompareFunction.A); - var textureData = - File("${testHelper.testDir}/assets/cube_texture_512x512.png") - .readAsBytesSync(); - var texture = await viewer.createTexture(textureData); - await viewer.applyTexture(texture, cube); - await testHelper.capture(viewer, "set_uv_scaling"); - await viewer.dispose(); + await testHelper.capture( + viewer, "material_instance_depth_pass_stencil_disabled"); + + assert(await greenMaterialInstance.isStencilWriteEnabled() == false); + assert(await blueMaterialInstance.isStencilWriteEnabled() == false); + + await greenMaterialInstance.setStencilWriteEnabled(true); + await blueMaterialInstance.setStencilWriteEnabled(true); + + assert(await greenMaterialInstance.isStencilWriteEnabled() == true); + assert(await blueMaterialInstance.isStencilWriteEnabled() == true); + + // just a sanity check, no difference from the last + await testHelper.capture( + viewer, "material_instance_depth_pass_stencil_enabled"); + }, postProcessing: true, bg: null); + }); + + test('stencil always fail', () async { + await testHelper.withViewer((viewer) async { + final ( + :blueCube, + :blueMaterialInstance, + :greenCube, + :greenMaterialInstance + ) = await setup(viewer); + + // force depth to always pass so we're just comparing stencil test + await greenMaterialInstance.setDepthFunc(SamplerCompareFunction.A); + await blueMaterialInstance.setDepthFunc(SamplerCompareFunction.A); + + await greenMaterialInstance.setStencilWriteEnabled(true); + + assert(await greenMaterialInstance.isStencilWriteEnabled() == true); + + await greenMaterialInstance + .setStencilCompareFunction(SamplerCompareFunction.N); + + // green cube isn't rendered + await testHelper.capture( + viewer, "material_instance_stencil_always_fail"); + }, postProcessing: true, bg: null); + }); + + test('fail stencil not equal', () async { + await testHelper.withViewer((viewer) async { + final ( + :blueCube, + :blueMaterialInstance, + :greenCube, + :greenMaterialInstance + ) = await setup(viewer); + + // this ensures the blue cube is rendered before the green cube + await viewer.setPriority(blueCube.entity, 0); + await viewer.setPriority(greenCube.entity, 1); + + await blueMaterialInstance.setStencilWriteEnabled(true); + await blueMaterialInstance.setStencilReferenceValue(1); + await blueMaterialInstance + .setStencilCompareFunction(SamplerCompareFunction.A); + await blueMaterialInstance + .setStencilOpDepthStencilPass(StencilOperation.REPLACE); + + await greenMaterialInstance.setStencilReferenceValue(1); + await greenMaterialInstance + .setStencilCompareFunction(SamplerCompareFunction.E); + + // green cube is only rendered where it intersects with the blue cube + await testHelper.capture(viewer, "fail_stencil_ne"); + }, postProcessing: true); }); }); +} - group("stencil", () { - test('set stencil highlight for glb', () async { - final viewer = await testHelper.createViewer(); - var model = await viewer.loadGlb("${testHelper.testDir}/assets/cube.glb", - keepData: true); - await viewer.setPostProcessing(true); + // group("MaterialInstance", () { - var light = await viewer.addLight( - LightType.SUN, 6500, 1000000, 0, 0, 0, 0, -1, 0); - await viewer.setLightDirection(light, Vector3(0, 1, -1)); + // test('disable depth write', () async { + // var viewer = await testHelper.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())); - 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 testHelper.capture(viewer, "stencil_highlight_glb"); + // final cube1 = await viewer.createGeometry(GeometryHelper.cube()); + // var materialInstance = await viewer.getMaterialInstanceAt(cube1, 0); - await viewer.dispose(); - }); + // 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); - test('set stencil highlight for geometry', () async { - var viewer = await testHelper.createViewer(); - await viewer.setPostProcessing(true); - await viewer.setBackgroundColor(0.0, 1.0, 0.0, 1.0); - await viewer.setCameraPosition(0, 2, 5); - await viewer - .setCameraRotation(Quaternion.axisAngle(Vector3(1, 0, 0), -0.5)); + // expect(materialInstance, isNotNull); - var cube = await viewer.createGeometry(GeometryHelper.cube()); - await viewer.setStencilHighlight(cube); + // // with depth write enabled on both materials, cube2 renders behind the white cube + // await testHelper.capture(viewer, "material_instance_depth_write_enabled"); - await testHelper.capture(viewer, "stencil_highlight_geometry"); + // // if we disable depth write on cube1, then cube2 will always appear in front + // // (relying on insertion order) + // materialInstance!.setDepthWriteEnabled(false); + // await testHelper.capture( + // viewer, "material_instance_depth_write_disabled"); - await viewer.removeStencilHighlight(cube); + // // set priority for the cube1 cube to 7 (render) last, cube1 renders in front + // await viewer.setPriority(cube1, 7); + // await testHelper.capture( + // viewer, "material_instance_depth_write_disabled_with_priority"); + // await viewer.dispose(); + // }); - await testHelper.capture(viewer, "stencil_highlight_geometry_remove"); + // test('set uv scaling (unlit)', () async { + // var viewer = await testHelper.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())); - await viewer.dispose(); - }); + // final unlitMaterialInstance = await viewer.createUnlitMaterialInstance(); + // final cube = await viewer.createGeometry(GeometryHelper.cube(), + // materialInstance: unlitMaterialInstance); + // await viewer.setMaterialPropertyFloat4( + // cube, 'baseColorFactor', 0, 1, 1, 1, 1); + // await viewer.setMaterialPropertyInt(cube, 'baseColorIndex', 0, 1); + // unlitMaterialInstance.setParameterFloat2("uvScale", 2.0, 4.0); - test('set stencil highlight for gltf asset', () async { - var viewer = await testHelper.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 textureData = + // File("${testHelper.testDir}/assets/cube_texture_512x512.png") + // .readAsBytesSync(); + // var texture = await viewer.createTexture(textureData); + // await viewer.applyTexture(texture, cube); + // await testHelper.capture(viewer, "set_uv_scaling"); + // await viewer.dispose(); + // }); + // }); - var cube1 = await viewer.loadGlb("${testHelper.testDir}/assets/cube.glb", - keepData: true); - await viewer.transformToUnitCube(cube1); + // group("texture", () { + // test("create/apply/dispose texture", () async { + // var viewer = await testHelper.createViewer(); - await viewer.setStencilHighlight(cube1); + // var textureData = + // File("${testHelper.testDir}/assets/cube_texture_512x512.png") + // .readAsBytesSync(); - await testHelper.capture(viewer, "stencil_highlight_gltf"); + // var texture = await viewer.createTexture(textureData); + // await viewer.setBackgroundColor(0.0, 0.0, 0.0, 1.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(), + // materialInstances: [materialInstance]); - await viewer.removeStencilHighlight(cube1); + // await viewer.setPostProcessing(true); + // await viewer.setToneMapping(ToneMapper.LINEAR); - await testHelper.capture(viewer, "stencil_highlight_gltf_removed"); + // await viewer.applyTexture(texture, cube, + // materialIndex: 0, parameterName: "baseColorMap"); - await viewer.dispose(); - }); + // await testHelper.capture(viewer, "texture_applied_to_geometry"); - test('set stencil highlight for multiple geometry ', () async { - var viewer = await testHelper.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(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); - - await testHelper.capture(viewer, "stencil_highlight_multiple_geometry"); - - await viewer.removeStencilHighlight(cube1); - await viewer.removeStencilHighlight(cube2); - - await testHelper.capture( - viewer, "stencil_highlight_multiple_geometry_removed"); - - await viewer.dispose(); - }); - - test('set stencil highlight for multiple gltf assets ', () async { - var viewer = await testHelper.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("${testHelper.testDir}/assets/cube.glb", - keepData: true); - await viewer.transformToUnitCube(cube1); - var cube2 = await viewer.loadGlb("${testHelper.testDir}/assets/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 testHelper.capture(viewer, "stencil_highlight_multiple_geometry"); - - await viewer.removeStencilHighlight(cube1); - await viewer.removeStencilHighlight(cube2); - - await testHelper.capture( - viewer, "stencil_highlight_multiple_geometry_removed"); - await viewer.dispose(); - }); - }); - - group("texture", () { - test("create/apply/dispose texture", () async { - var viewer = await testHelper.createViewer(); - - var textureData = - File("${testHelper.testDir}/assets/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( - 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); - - await viewer.setPostProcessing(true); - await viewer.setToneMapping(ToneMapper.LINEAR); - - await viewer.applyTexture(texture, cube, - materialIndex: 0, parameterName: "baseColorMap"); - - await testHelper.capture(viewer, "texture_applied_to_geometry"); - - await viewer.removeEntity(cube); - await viewer.destroyTexture(texture); - await viewer.dispose(); - }); - }); + // await viewer.removeEntity(cube); + // await viewer.destroyTexture(texture); + // await viewer.dispose(); + // }); + // }); // group("unproject", () { // test("unproject", () async { @@ -523,4 +538,4 @@ void main() async { // } // }, timeout: Timeout(Duration(minutes: 2))); // }); -} +// } diff --git a/thermion_dart/test/overlay_tests.dart b/thermion_dart/test/overlay_tests.dart new file mode 100644 index 00000000..bf814313 --- /dev/null +++ b/thermion_dart/test/overlay_tests.dart @@ -0,0 +1,268 @@ +import 'dart:io'; +import 'dart:math'; +import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_viewer_ffi.dart'; +import 'package:thermion_dart/thermion_dart.dart'; +import 'package:test/test.dart'; + +import 'package:vector_math/vector_math_64.dart'; + +import 'helpers.dart'; + +void main() async { + final testHelper = TestHelper("overlay"); + + group("overlay tests", () { + group("stencil", () { + test('set stencil highlight for geometry', () async { + await testHelper.withViewer((viewer) async { + var cube = await viewer.createGeometry(GeometryHelper.cube()); + await testHelper.capture(viewer, "geometry_before_stencil_highlight"); + await cube.setStencilHighlight(); + + await testHelper.capture(viewer, "geometry_add_stencil_highlight"); + + await cube.removeStencilHighlight(); + + await testHelper.capture(viewer, "geometry_remove_stencil_highlight"); + }, postProcessing: true); + }); + + test('set stencil highlight for glb', () async { + await testHelper.withViewer((viewer) async { + var cube = await viewer.loadGlb( + "${testHelper.testDir}/assets/cube.glb", + numInstances: 2); + await testHelper.capture(viewer, "glb_before_stencil_highlight"); + + // gltf is slightly more complicated, because the "head" entity is + // not renderable, so we need to pick a child entity with a renderable + // component. + await cube.setStencilHighlight(entityIndex: 0); + + await testHelper.capture(viewer, "glb_add_stencil_highlight"); + + await cube.removeStencilHighlight(); + + await testHelper.capture(viewer, "glb_remove_stencil_highlight"); + }, postProcessing: true, bg: kWhite); + }); + + test('add gizmo', () async { + await testHelper.withViewer((viewer) async { + var cube = await viewer.createGeometry(GeometryHelper.cube()); + + final view = await viewer.getViewAt(0); + final gizmo = await viewer.createGizmo(view); + await viewer.setLayerVisibility(VisibilityLayers.OVERLAY, true); + await viewer.addEntityToScene(gizmo); + await viewer.setTransform(gizmo, Matrix4.identity()); + // await gizmo.attach(cube.entity); + + await testHelper.capture(viewer, "gizmo_attached"); + + // await gizmo.detach(); + + // await testHelper.capture(viewer, "gizmo_detached"); + }, postProcessing: true, bg: kWhite); + }); + }); + }); + + // test('set uv scaling (unlit)', () async { + // var viewer = await testHelper.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 unlitMaterialInstance = await viewer.createUnlitMaterialInstance(); + // final cube = await viewer.createGeometry(GeometryHelper.cube(), + // materialInstance: unlitMaterialInstance); + // await viewer.setMaterialPropertyFloat4( + // cube, 'baseColorFactor', 0, 1, 1, 1, 1); + // await viewer.setMaterialPropertyInt(cube, 'baseColorIndex', 0, 1); + // unlitMaterialInstance.setParameterFloat2("uvScale", 2.0, 4.0); + + // var textureData = + // File("${testHelper.testDir}/assets/cube_texture_512x512.png") + // .readAsBytesSync(); + // var texture = await viewer.createTexture(textureData); + // await viewer.applyTexture(texture, cube); + // await testHelper.capture(viewer, "set_uv_scaling"); + // await viewer.dispose(); + // }); + // }); + + // group("texture", () { + // test("create/apply/dispose texture", () async { + // var viewer = await testHelper.createViewer(); + + // var textureData = + // File("${testHelper.testDir}/assets/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( + // 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(), + // materialInstances: [materialInstance]); + + // await viewer.setPostProcessing(true); + // await viewer.setToneMapping(ToneMapper.LINEAR); + + // await viewer.applyTexture(texture, cube, + // materialIndex: 0, parameterName: "baseColorMap"); + + // await testHelper.capture(viewer, "texture_applied_to_geometry"); + + // await viewer.removeEntity(cube); + // await viewer.destroyTexture(texture); + // await viewer.dispose(); + // }); + // }); + + // group("unproject", () { + // test("unproject", () async { + // final dimensions = (width: 1280, height: 768); + + // var viewer = await testHelper.createViewer(viewportDimensions: dimensions); + // 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("${testHelper.testDir}/assets/cube_texture_512x512.png").readAsBytesSync(); + // var texture = await viewer.createTexture(textureData); + // await viewer.applyTexture(texture, cube, + // materialIndex: 0, parameterName: "baseColorMap"); + + // var numFrames = 60; + + // // first do the 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 testHelper.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); + + // await viewer.setPostProcessing(true); + // await viewer.setToneMapping(ToneMapper.LINEAR); + + // final unlit = await viewer.createUnlitMaterialInstance(); + // 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 testHelper.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 testHelper.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))); +} diff --git a/thermion_flutter/thermion_flutter/lib/src/thermion_flutter_plugin.dart b/thermion_flutter/thermion_flutter/lib/src/thermion_flutter_plugin.dart index 2d7905b2..cd485822 100644 --- a/thermion_flutter/thermion_flutter/lib/src/thermion_flutter_plugin.dart +++ b/thermion_flutter/thermion_flutter/lib/src/thermion_flutter_plugin.dart @@ -35,6 +35,8 @@ class ThermionFlutterPlugin { _viewer = await ThermionFlutterPlatform.instance.createViewer(options: options); + await _viewer!.initialized; + var camera = await _viewer!.getActiveCamera(); await camera.setLensProjection(); diff --git a/thermion_flutter/thermion_flutter/lib/src/widgets/src/thermion_listener_widget.dart b/thermion_flutter/thermion_flutter/lib/src/widgets/src/thermion_listener_widget.dart index 885abc23..820e57e7 100644 --- a/thermion_flutter/thermion_flutter/lib/src/widgets/src/thermion_listener_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/src/widgets/src/thermion_listener_widget.dart @@ -82,9 +82,11 @@ class _ThermionListenerWidgetState extends State { Widget _desktop(double pixelRatio) { return Listener( - onPointerHover: (event) => widget.inputHandler.onPointerHover( - event.localPosition.toVector2() * pixelRatio, - event.delta.toVector2() * pixelRatio), + onPointerHover: (event) { + widget.inputHandler.onPointerHover( + event.localPosition.toVector2() * pixelRatio, + event.delta.toVector2() * pixelRatio); + }, onPointerSignal: (PointerSignalEvent pointerSignal) { if (pointerSignal is PointerScrollEvent) { widget.inputHandler.onPointerScroll( @@ -95,22 +97,26 @@ class _ThermionListenerWidgetState extends State { onPointerPanZoomStart: (pzs) { throw Exception("TODO - is this a pinch zoom on laptop trackpad?"); }, - onPointerDown: (d) => widget.inputHandler.onPointerDown( - d.localPosition.toVector2() * pixelRatio, - d.buttons & kMiddleMouseButton != 0), - onPointerMove: (d) => widget.inputHandler.onPointerMove( + onPointerDown: (d) { + widget.inputHandler.onPointerDown( + d.localPosition.toVector2() * pixelRatio, + d.buttons & kMiddleMouseButton != 0); + }, + onPointerMove: (PointerMoveEvent d) => widget.inputHandler.onPointerMove( d.localPosition.toVector2() * pixelRatio, d.delta.toVector2() * pixelRatio, d.buttons & kMiddleMouseButton != 0), - onPointerUp: (d) => widget.inputHandler - .onPointerUp(d.buttons & kMiddleMouseButton != 0), + onPointerUp: (d) => + widget.inputHandler.onPointerUp(d.buttons & kMiddleMouseButton != 0), child: widget.child, ); } Widget _mobile(double pixelRatio) { return _MobileListenerWidget( - inputHandler: widget.inputHandler, pixelRatio: pixelRatio, child:widget.child); + inputHandler: widget.inputHandler, + pixelRatio: pixelRatio, + child: widget.child); } @override @@ -138,7 +144,10 @@ class _MobileListenerWidget extends StatefulWidget { final Widget? child; const _MobileListenerWidget( - {Key? key, required this.inputHandler, required this.pixelRatio, this.child}) + {Key? key, + required this.inputHandler, + required this.pixelRatio, + this.child}) : super(key: key); @override @@ -165,7 +174,9 @@ class _MobileListenerWidgetState extends State<_MobileListenerWidget> { }, onScaleStart: (details) async { await widget.inputHandler.onScaleStart( - details.localFocalPoint.toVector2() * widget.pixelRatio, details.pointerCount, details.sourceTimeStamp); + details.localFocalPoint.toVector2() * widget.pixelRatio, + details.pointerCount, + details.sourceTimeStamp); }, onScaleUpdate: (ScaleUpdateDetails details) async { await widget.inputHandler.onScaleUpdate( @@ -179,7 +190,8 @@ class _MobileListenerWidgetState extends State<_MobileListenerWidget> { details.sourceTimeStamp); }, onScaleEnd: (details) async { - await widget.inputHandler.onScaleEnd(details.pointerCount, details.scaleVelocity); + await widget.inputHandler + .onScaleEnd(details.pointerCount, details.scaleVelocity); }, child: widget.child); } diff --git a/thermion_flutter/thermion_flutter/test/Makefile b/thermion_flutter/thermion_flutter/test/Makefile deleted file mode 100644 index 232b7489..00000000 --- a/thermion_flutter/thermion_flutter/test/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -LDFLAGS:=-lfilament -lbackend -lfilameshio -lviewer -lfilamat -lgeometry -lutils -lfilabridge -lgltfio_core -lfilament-iblprefilter -limage -limageio -ltinyexr -lgltfio_core -lfilaflat -ldracodec -libl -lktxreader -lpng -lz -lstb -luberzlib -lsmol-v -luberarchive -lzstd -lvkshaders -lbluegl -lbluevk -lbasis_transcoder -lmeshoptimizer -L../macos/lib -framework CoreFoundation -framework Foundation -framework CoreVideo -framework Metal -framework QuartzCore -framework Cocoa - -clean: - rm ./out/test -run: build - ./out/test -build: cpp/test.cpp - mkdir -p out - clang++ -I../ios/include/filament -I../ios/include/ cpp/test.cpp ../macos/src/SceneManager.cpp --std=c++17 $(LDFLAGS) -o out/test - diff --git a/thermion_flutter/thermion_flutter/test/cpp/test.cpp b/thermion_flutter/thermion_flutter/test/cpp/test.cpp deleted file mode 100644 index fa9f0d6e..00000000 --- a/thermion_flutter/thermion_flutter/test/cpp/test.cpp +++ /dev/null @@ -1,94 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "SceneManager.hpp" - -#include "ResourceBuffer.hpp" - -using namespace filament; -using namespace thermion; -using namespace std; - -int _i = 0; - -ResourceBuffer loadResource(const char* name) { - - std::cout << "LOADING RESOURCE" << std::endl; - - char cwd[PATH_MAX]; - if (getcwd(cwd, sizeof(cwd)) != NULL) { - std::cout << "Current working dir: " << cwd << std::endl; - } - - string name_str(name); - auto id = _i++; - - name_str = string(cwd) + string("/") + name_str; - - std::cout << "Loading resource at " << name_str.c_str() << std::endl; - - streampos length; - ifstream is(name_str, ios::binary); - ResourceBuffer rb { nullptr, -1, 0 }; - if(!is) { - std::cout << "Failed to find resource at file path " << name_str.c_str() << std::endl; - return rb; - } - is.seekg (0, ios::end); - length = is.tellg(); - char * buffer; - buffer = new char [length]; - is.seekg (0, ios::beg); - is.read (buffer, length); - is.close(); - return ResourceBuffer { buffer, static_cast(length), id }; -} - -void freeResource(ResourceBuffer rb) { - -} - -int main(int argc, char** argv) { - auto engine = Engine::create(); - auto scene = engine->createScene(); - auto loader = ResourceLoaderWrapper(loadResource, freeResource); - - auto sceneManager = SceneManager(&loader, engine, scene, nullptr); - - auto shapes = sceneManager.loadGlb("../example/assets/shapes/shapes.glb", 2); - - sceneManager.remove(shapes); - - shapes = sceneManager.loadGlb("../example/assets/shapes/shapes.glb", 2); - - auto instanceCount = sceneManager.getInstanceCount(shapes); - assert(instanceCount == 2); - - EntityId instances[instanceCount]; - - sceneManager.getInstances(shapes, instances); - - sceneManager.transformToUnitCube(shapes); - - auto morphTargetNames = sceneManager.getMorphTargetNames(shapes, "Cylinder"); - assert(morphTargetNames->size() == 4); - - morphTargetNames = sceneManager.getMorphTargetNames(shapes, "Cube"); - assert(morphTargetNames->size() == 2); - - morphTargetNames = sceneManager.getMorphTargetNames(shapes, "Cone"); - assert(morphTargetNames->size() == 8); - math::mat4f boneTransform; - sceneManager.setBoneTransform(shapes, "Cylinder", 0, "Bone", boneTransform); - - - sceneManager.destroyAll(); -} \ No newline at end of file diff --git a/thermion_flutter/thermion_flutter/test/frustum_unit_test.dart b/thermion_flutter/thermion_flutter/test/frustum_unit_test.dart deleted file mode 100644 index 880fc702..00000000 --- a/thermion_flutter/thermion_flutter/test/frustum_unit_test.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:vector_math/vector_math_64.dart'; - -void main() { - test('Plane', () { - var plane = Plane()..setFromComponents(1, 0, 0, 2); - print(plane.distanceToVector3(Vector3(-1, 0, 0))); - }); - - test('Check if point is inside frustum', () { - var frustum = Frustum(); - frustum.plane0.setFromComponents(-0.868, 0, 0.49, 0); - frustum.plane1.setFromComponents(0.868, 0, 0.49, 0); - frustum.plane2.setFromComponents(0, -0.919, 0.39, 0); - frustum.plane3.setFromComponents(0, 0.919, 0.39, 0); - frustum.plane4.setFromComponents(0, 0, -1, -999.88); - frustum.plane5.setFromComponents(0, 0, 1, 0.05); - - var point = Vector3(0, 0, -1); - - print(frustum.plane0.distanceToVector3(point)); - print(frustum.plane1.distanceToVector3(point)); - - print(frustum.plane2.distanceToVector3(point)); - - print(frustum.plane3.distanceToVector3(point)); - - print(frustum.plane4.distanceToVector3(point)); - - print(frustum.plane5.distanceToVector3(point)); - - print(frustum.containsVector3(point)); - }); - - test("Lukas test", () { - final frustum = Frustum(); - //left - frustum.plane0.setFromComponents(-1.0, 0, 0, 1); - //right - frustum.plane1.setFromComponents(1.0, 0, 0, 2.0); - //bottom - frustum.plane2.setFromComponents(0, -1, 0, 1); - //top - frustum.plane3.setFromComponents(0, 1, 0, 1); - //far - frustum.plane4.setFromComponents(0, 0, -1, 1); - //near - frustum.plane5.setFromComponents(0, 0, 1, 1); - - // vector3 - final point = Vector3(-0.5, 0, 0); - - print(frustum.plane0.distanceToVector3(point)); - print(frustum.plane1.distanceToVector3(point)); - - print(frustum.plane2.distanceToVector3(point)); - - print(frustum.plane3.distanceToVector3(point)); - - print(frustum.plane4.distanceToVector3(point)); - - print(frustum.plane5.distanceToVector3(point)); - - print(frustum.containsVector3(point)); - }); -}