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 00000000..dc9ada47 Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 00000000..7353c41e Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ 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 00000000..797d452e Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ 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 00000000..6ed2d933 Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ 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 00000000..4cd7b009 Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ 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 00000000..fe730945 Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 00000000..321773cd Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 00000000..797d452e Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ 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 00000000..502f463a Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 00000000..0ec30343 Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ 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 00000000..0ec30343 Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ 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 00000000..e9f5fea2 Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 00000000..84ac32ae Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 00000000..8953cba0 Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ 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 00000000..0467bf12 Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ 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 00000000..9da19eac Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ 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 00000000..9da19eac Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ 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 00000000..9da19eac Binary files /dev/null and b/examples/flutter/materials/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ 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 00000000..82b6f9d9 Binary files /dev/null and b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ 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 00000000..13b35eba Binary files /dev/null and b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ 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 00000000..0a3f5fa4 Binary files /dev/null and b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 00000000..bdb57226 Binary files /dev/null and b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 00000000..f083318e Binary files /dev/null and b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 00000000..326c0e72 Binary files /dev/null and b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ 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 00000000..2f1632cf Binary files /dev/null and b/examples/flutter/materials/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/examples/flutter/materials/macos/Runner/Base.lproj/MainMenu.xib b/examples/flutter/materials/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 00000000..80e867a4 --- /dev/null +++ b/examples/flutter/materials/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 d4d65b4f..9b9d348f 100644 Binary files a/thermion_dart/native/include/material/grid.bin and b/thermion_dart/native/include/material/grid.bin differ 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 84bb768f..70984c50 100644 Binary files a/thermion_dart/native/include/material/unlit_fixed_size.bin and b/thermion_dart/native/include/material/unlit_fixed_size.bin differ 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)); - }); -}