diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/App.xaml b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/App.xaml new file mode 100644 index 000000000..49a2ff313 --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/App.xaml @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/App.xaml.cs b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/App.xaml.cs new file mode 100644 index 000000000..99a5cacba --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/App.xaml.cs @@ -0,0 +1,65 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using Microsoft.UI.Xaml.Shapes; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.Foundation; +using Windows.Foundation.Collections; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace DepthDemo +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + public partial class App : Application + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + this.InitializeComponent(); + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used such as when the application is launched to open a specific file. + /// + /// Details about the launch request and process. + protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) + { + m_window = new MainWindow(); + m_window.Activate(); + } + + private Window m_window; + } +} diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/DepthDemoApp.csproj b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/DepthDemoApp.csproj new file mode 100644 index 000000000..afbcb0e75 --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/DepthDemoApp.csproj @@ -0,0 +1,24 @@ + + + WinExe + net8.0-windows10.0.19041.0 + 10.0.17763.0 + DepthDemo + app.manifest + x86;x64;arm64 + win-x86;win-x64;win-arm64 + true + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/DepthTreatmentConfigurations.cs b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/DepthTreatmentConfigurations.cs new file mode 100644 index 000000000..7af395983 --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/DepthTreatmentConfigurations.cs @@ -0,0 +1,133 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI; +using Microsoft.UI.Composition; +using System; +using System.Numerics; +using Windows.UI; + +namespace DepthDemo +{ + /// + /// Configuration for constant values that are consistent across all scenarios + /// + class ConfigurationConstants + { + public ConfigurationConstants() { } + + public static int ZOffsetSpacingIncrement = 20; + + public static Color ShadowColor = Colors.DarkSlateGray; + + public static TimeSpan FocusAnimationDuration = TimeSpan.FromSeconds(0.5); + public static TimeSpan NavAnimationDuration = TimeSpan.FromSeconds(0.25); + + public static float ShadowOpacity = 0.7f; + + public static float BlurFocusFloat = 10.0f; + } + + + public class DepthTreatmentConfigurations + { + private Layer _associatedLayer; + + public Vector3 ChildScale { get; set; } + + public ShadowTreatment ShadowTreatment { get; set; } + + // Focus treatment increase for top layer objects + private float _focusScaleIncreaseFactor; + + public DepthTreatmentConfigurations(Layer associatedLayer, Vector3 childScale, float focusScaleIncreaseFactor, ShadowTreatment shadowTreatment = null) + { + _associatedLayer = associatedLayer; + _focusScaleIncreaseFactor = focusScaleIncreaseFactor; + ChildScale = childScale; + ShadowTreatment = shadowTreatment; + } + + public CompositionAnimationGroup GetVisualFocusAnimations(Compositor compositor, Layer layer) + { + var oldscale = ChildScale; + var newScale = new Vector3(oldscale.X * _focusScaleIncreaseFactor, oldscale.Y * _focusScaleIncreaseFactor, oldscale.Z); + + // Create AnimationGroup + CompositionAnimationGroup animationGroup = compositor.CreateAnimationGroup(); + + // Scale + Vector3KeyFrameAnimation scaleAnimation = compositor.CreateVector3KeyFrameAnimation(); + scaleAnimation.InsertKeyFrame(0.0f, oldscale); + scaleAnimation.InsertKeyFrame(1.0f, newScale); + scaleAnimation.Duration = ConfigurationConstants.FocusAnimationDuration; + scaleAnimation.Target = "Scale"; + animationGroup.Add(scaleAnimation); + + return animationGroup; + } + } + + + public class ShadowTreatment + { + public Color ShadowColor { get { return ConfigurationConstants.ShadowColor; } } + public int BlurRadius { get; set; } + public Vector3 Offset { get; set; } + + private int _focusShadowBlurRadiusIncreaseAmount; + private int _focusShadowOffsetIncreaseAmount; + + public ShadowTreatment(int blurRadius, Vector3 offset, int focusShadowBlurRadiusIncrease, + int focusShadowOffsetIncrease) + { + BlurRadius = blurRadius; + Offset = offset; + + _focusShadowBlurRadiusIncreaseAmount = focusShadowBlurRadiusIncrease; + _focusShadowOffsetIncreaseAmount = focusShadowOffsetIncrease; + } + + public CompositionAnimationGroup GetShadowFocusAnimations(Compositor compositor, Layer layer) + { + var newShadowBlurRadius = BlurRadius + _focusShadowBlurRadiusIncreaseAmount; + var oldShadowOffset = Offset; + var additionalShadowOffsetAmount = _focusShadowOffsetIncreaseAmount; + var newShadowOffset = new Vector3(oldShadowOffset.X + additionalShadowOffsetAmount, oldShadowOffset.Y + + additionalShadowOffsetAmount, oldShadowOffset.Z + additionalShadowOffsetAmount); + + + // Create AnimationGroup + CompositionAnimationGroup animationGroup = compositor.CreateAnimationGroup(); + + // Blur Radius + ScalarKeyFrameAnimation shadowBlurAnimation = compositor.CreateScalarKeyFrameAnimation(); + shadowBlurAnimation.InsertKeyFrame(0.0f, BlurRadius); + shadowBlurAnimation.InsertKeyFrame(1.0f, newShadowBlurRadius); + shadowBlurAnimation.Duration = ConfigurationConstants.FocusAnimationDuration; + shadowBlurAnimation.Target = "BlurRadius"; + animationGroup.Add(shadowBlurAnimation); + + // Offset + Vector3KeyFrameAnimation shadowOffsetAnimation = compositor.CreateVector3KeyFrameAnimation(); + shadowOffsetAnimation.InsertKeyFrame(0.0f, Offset); + shadowOffsetAnimation.InsertKeyFrame(1.0f, newShadowOffset); + shadowOffsetAnimation.Duration = ConfigurationConstants.FocusAnimationDuration; + shadowOffsetAnimation.Target = "Offset"; + animationGroup.Add(shadowOffsetAnimation); + + return animationGroup; + } + } +} diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Layer.cs b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Layer.cs new file mode 100644 index 000000000..f2f96eafa --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Layer.cs @@ -0,0 +1,199 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Composition; +using System.Collections.Generic; +using System.Numerics; + +namespace DepthDemo +{ + public class Layer + { + private Compositor _compositor; + private SpriteVisual _backingVisual; + private CompositionAnimationGroup _shadowAnimationGroup; + private CompositionAnimationGroup _visualAnimationGroup; + private CompositionAnimationGroup _reversedShadowAnimationGroup; + private CompositionAnimationGroup _reversedVisualAnimationGroup; + + + public int Identifier { get; set; } + public Vector3 Offset { get; set; } + public CompositionColorBrush LayerColor; + public DepthTreatmentConfigurations DepthTreatment { get; set; } + public List FocusedVisuals { get; set; } + public List ElevatedVisuals { get; set; } + public SpriteVisual LayerBackingVisual + { + get { return _backingVisual; } + set { _backingVisual = LayerBackingVisual; } + } + + + public Layer(Compositor compositor, int identifier, Vector3 offset, Vector2 size, + ContainerVisual parent, CompositionColorBrush layerColor) + { + _compositor = compositor; + LayerColor = layerColor; + FocusedVisuals = new List(); + ElevatedVisuals = new List(); + + SpriteVisual x = _compositor.CreateSpriteVisual(); + x.Size = new Vector2(size.X, size.Y); + x.Offset = Offset = offset; + Identifier = identifier; + x.Comment = Identifier.ToString(); + + _backingVisual = x; + parent.Children.InsertAtTop(x); + } + + public void SetDepthTreatments(DepthTreatmentConfigurations depthTreatmentConfig) + { + DepthTreatment = depthTreatmentConfig; + RefreshApplyDepthTreatments(); + + // Shadow Focus Animation + _shadowAnimationGroup = DepthTreatment.ShadowTreatment.GetShadowFocusAnimations(_compositor, this); + // Additional Focus Animations + _visualAnimationGroup = DepthTreatment.GetVisualFocusAnimations(_compositor, this); + + // Create reversed animation groups to run on unfocus + _reversedShadowAnimationGroup = _compositor.CreateAnimationGroup(); + _reversedVisualAnimationGroup = _compositor.CreateAnimationGroup(); + foreach (KeyFrameAnimation animation in _shadowAnimationGroup) + { + animation.Direction = AnimationDirection.Reverse; + _reversedShadowAnimationGroup.Add(animation); + } + foreach (KeyFrameAnimation animation in _visualAnimationGroup) + { + animation.Direction = AnimationDirection.Reverse; + _reversedVisualAnimationGroup.Add(animation); + } + } + + public void RefreshApplyDepthTreatments() + { + // Apply treatments to all children in layer + var children = _backingVisual.Children; + foreach (Visual child in children) + { + if (DepthTreatment.ShadowTreatment != null && child.GetType() == typeof(SpriteVisual)) + { + var shadowTreatment = DepthTreatment.ShadowTreatment; + + DropShadow shadow = _compositor.CreateDropShadow(); + shadow.BlurRadius = shadowTreatment.BlurRadius; + shadow.Offset = shadowTreatment.Offset; + shadow.Color = shadowTreatment.ShadowColor; + shadow.Opacity = ConfigurationConstants.ShadowOpacity; + + ((SpriteVisual)child).Shadow = shadow; + } + } + } + + public void AnimateFocusTreatment(SpriteVisual target) + { + FocusedVisuals.Add(target); + + target.Shadow.StartAnimationGroup(_shadowAnimationGroup); + target.StartAnimationGroup(_visualAnimationGroup); + } + + public void AnimationUnfocusTreatment(SpriteVisual target) + { + if (FocusedVisuals.Contains(target)) + { + if (target.Shadow != null && _reversedShadowAnimationGroup != null) + { + target.Shadow.StartAnimationGroup(_reversedShadowAnimationGroup); + } + if (_reversedVisualAnimationGroup != null) + { + target.StartAnimationGroup(_reversedVisualAnimationGroup); + } + + FocusedVisuals.Remove(target); + } + } + + public void AnimateAddedVisual(SpriteVisual target) + { + float currShadowBlurRadius = 0f; + Vector3 currShadowOffset = new Vector3(); + + if (target.Shadow != null) + { + currShadowBlurRadius = ((DropShadow)(target.Shadow)).BlurRadius; + currShadowOffset = ((DropShadow)(target.Shadow)).Offset; + } + else + { + DropShadow shadow = _compositor.CreateDropShadow(); + shadow.Color = ConfigurationConstants.ShadowColor; + shadow.Opacity = ConfigurationConstants.ShadowOpacity; + target.Shadow = shadow; + } + + // Create AnimationGroup for shadow change animation + CompositionAnimationGroup animationGroup = _compositor.CreateAnimationGroup(); + + // Animate shadow blur radius change + ScalarKeyFrameAnimation shadowBlurAnimation = _compositor.CreateScalarKeyFrameAnimation(); + shadowBlurAnimation.InsertKeyFrame(0.0f, currShadowBlurRadius); + shadowBlurAnimation.InsertKeyFrame(1.0f, DepthTreatment.ShadowTreatment.BlurRadius); + shadowBlurAnimation.Duration = ConfigurationConstants.FocusAnimationDuration; + shadowBlurAnimation.Target = "BlurRadius"; + animationGroup.Add(shadowBlurAnimation); + + // Animate shadow offset change + Vector3KeyFrameAnimation shadowOffsetAnimation = _compositor.CreateVector3KeyFrameAnimation(); + shadowOffsetAnimation.InsertKeyFrame(0.0f, currShadowOffset); + shadowOffsetAnimation.InsertKeyFrame(1.0f, DepthTreatment.ShadowTreatment.Offset); + shadowOffsetAnimation.Duration = ConfigurationConstants.FocusAnimationDuration; + shadowOffsetAnimation.Target = "Offset"; + animationGroup.Add(shadowOffsetAnimation); + + target.Shadow.StartAnimationGroup(animationGroup); + + AnimateToLayerHelper(target); + } + + private void AnimateToLayerHelper(SpriteVisual target) + { + // Create AnimationGroup for target visual propery animation + CompositionAnimationGroup animationGroup = _compositor.CreateAnimationGroup(); + + // Scale + Vector3KeyFrameAnimation scaleAnimation = _compositor.CreateVector3KeyFrameAnimation(); + scaleAnimation.InsertKeyFrame(0.0f, target.Scale); + scaleAnimation.InsertKeyFrame(1.0f, this.DepthTreatment.ChildScale); + scaleAnimation.Duration = ConfigurationConstants.FocusAnimationDuration; + scaleAnimation.Target = "Scale"; + animationGroup.Add(scaleAnimation); + + target.StartAnimationGroup(animationGroup); + + + // Update item color to match items in new layer. Preserve content if any. + var brushType = target.Brush.GetType(); + if (brushType != typeof(CompositionSurfaceBrush) && brushType != typeof(CompositionEffectBrush)) + { + target.Brush = LayerColor; + } + } + } +} diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainPage.xaml b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainPage.xaml new file mode 100644 index 000000000..5a29df68f --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainPage.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainPage.xaml.cs b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainPage.xaml.cs new file mode 100644 index 000000000..962dc7b59 --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainPage.xaml.cs @@ -0,0 +1,490 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using DepthDemo.Scenarios; +using ExpressionBuilder; +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Composition.Interactions; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Media; +using System; +using System.Collections.Generic; +using System.Numerics; +using Windows.Foundation; +using Windows.UI; +using Windows.UI.Popups; + +using EF = ExpressionBuilder.ExpressionFunctions; + +namespace DepthDemo +{ + + public sealed partial class MainPage : Page, IInteractionTrackerOwner + { + #region vars + private Compositor _compositor; + private ContainerVisual _mainContainer; + private InteractionTracker _tracker; + private VisualInteractionSource _interactionSource; + private List _scenarios; + private Scenario _currentScenario; + private Dictionary _scenarioContainersMapping; + private SpriteVisual _activeScenarioVisualIndicator; + private NestedScenario _nestedScenario; + private BasicElementsScenario _basicScenario; + #endregion + public MainPage() + { + this.InitializeComponent(); + + _scenarioContainersMapping = new Dictionary(); + _scenarios = new List(); + } + + private void Page_Loaded(object sender, RoutedEventArgs e) + { + _compositor = ElementCompositionPreview.GetElementVisual(MainGrid).Compositor; + + _activeScenarioVisualIndicator = _compositor.CreateSpriteVisual(); + _activeScenarioVisualIndicator.Brush = _compositor.CreateColorBrush(Color.FromArgb(255, 0, 153, 153)); + ElementCompositionPreview.SetElementChildVisual(ProgressIndicatorStackPanel, _activeScenarioVisualIndicator); + + // Create and add container for layers + _mainContainer = _compositor.CreateContainerVisual(); + ElementCompositionPreview.SetElementChildVisual(MainCanvas, _mainContainer); + + InitializeScenarios(); + + ConfigureInteractionTracker(); + } + + private void InitializeScenarios() + { + _nestedScenario = new NestedScenario(0, _compositor, MainCanvas); + _scenarios.Add(_nestedScenario); + _basicScenario = new BasicElementsScenario(1, _compositor, MainCanvas); + _scenarios.Add(_basicScenario); + + // For each scenario, allocate a spritevisual scenario container the size of maincanvas + // and add the scenario container to the maincontainer + var nextOffset = new Vector3(0, 0, 0); + for (int i = 0; i < _scenarios.Count; i++) + { + var scenarioContainer = _compositor.CreateSpriteVisual(); + scenarioContainer.Size = new Vector2((float)MainCanvas.ActualWidth, (float)MainCanvas.ActualHeight); + scenarioContainer.Offset = nextOffset; + _mainContainer.Children.InsertAtTop(scenarioContainer); + + _scenarioContainersMapping.Add(_scenarios[i], scenarioContainer); + + nextOffset = new Vector3(nextOffset.X + scenarioContainer.Size.X, 0, 0); + } + + _currentScenario = _scenarios[0]; + _currentScenario.IsActive = true; + + InitializeContent(); + + // For each scenario, add a button navigation/progress indicator + foreach (Scenario scenario in _scenarios) + { + Button bt = new Button(); + bt.Click += ProgressIndicatorButton_Click; + bt.Name = scenario.Identifier.ToString(); + bt.Content = "Scenario " + scenario.Identifier; + bt.Background = new SolidColorBrush(Colors.Transparent); + + ProgressIndicatorStackPanel.Children.Add(bt); + } + } + + private void InitializeContent() + { + foreach (Scenario scenario in _scenarios) + { + scenario.ImplementScenario(_compositor, _scenarioContainersMapping[scenario]); + } + } + + public void ConfigureInteractionTracker() + { + var backgroundVisual = ElementCompositionPreview.GetElementVisual(MainGrid); + backgroundVisual.Size = new Vector2((float)MainGrid.ActualWidth, (float)MainGrid.ActualHeight); + + // Configure interaction tracker + _tracker = InteractionTracker.CreateWithOwner(_compositor, this); + _tracker.MaxPosition = new Vector3((float)backgroundVisual.Size.X * _scenarios.Count, backgroundVisual.Size.Y, 0); + _tracker.MinPosition = new Vector3(); + + // Configure interaction source + _interactionSource = VisualInteractionSource.Create(backgroundVisual); + _interactionSource.PositionXSourceMode = InteractionSourceMode.EnabledWithInertia; + _tracker.InteractionSources.Add(_interactionSource); + + // Bind interaction tracker output to animation for now + var positionExpression = -_tracker.GetReference().Position.X; + _mainContainer.StartAnimation("Offset.X", positionExpression); + + ConfigureRestingPoints(); + + var nestedVisuals = _nestedScenario.GetVisuals(); + var exp = _compositor.CreateExpressionAnimation(); + for (int i = 0; i < nestedVisuals.Count; i++) + { + ConfigureParallax(i, nestedVisuals[i]); + } + } + private void ConfigureParallax(int index, Visual visual) + { + var parallaxExpression = _compositor.CreateExpressionAnimation( + "this.startingvalue + " + + "tracker.PositionVelocityInPixelsPerSecond.X *" + + "index / 100"); + parallaxExpression.SetReferenceParameter("tracker", _tracker); + parallaxExpression.SetScalarParameter("index", index); + + var parallaxExpression2 = ExpressionValues.StartingValue.CreateScalarStartingValue() + + _tracker.GetReference().PositionVelocityInPixelsPerSecond.X * + index / 50; + + visual.StartAnimation("Offset.X", parallaxExpression2); + } + private void ConfigureRestingPoints() + { + var size = (_tracker.MaxPosition.X - _tracker.MinPosition.X); + var props = _compositor.CreatePropertySet(); + props.InsertScalar("size", (_tracker.MaxPosition.X - _tracker.MinPosition.X)); + props.InsertScalar("numScenarios", (_scenarios.Count)); + + var endpoint1 = InteractionTrackerInertiaRestingValue.Create(_compositor); + + var endpoint1ExpressionAnimation = _tracker.GetReference().NaturalRestingPosition.X < (size / _scenarios.Count); + endpoint1.SetCondition(endpoint1ExpressionAnimation); + + endpoint1.RestingValue = _compositor.CreateExpressionAnimation("this.target.MinPosition.x"); + + // Update endpoints for number of scenarios + InteractionTrackerInertiaModifier[] endpoints = new InteractionTrackerInertiaModifier[_scenarios.Count]; + endpoints[0] = endpoint1; + for (int i = 1; i < _scenarios.Count - 1; i++) + { + var endpoint = InteractionTrackerInertiaRestingValue.Create(_compositor); + + var endpointExpressionAnimation = _tracker.GetReference().NaturalRestingPosition.X > (size / _scenarios.Count) * i & + _tracker.GetReference().NaturalRestingPosition.X <= (i + 1) * size / _scenarios.Count; + endpoint.SetCondition(endpointExpressionAnimation); + + var restingValueExpressionAnimation = i * _tracker.GetReference().MaxPosition.X / _scenarios.Count; + endpoint.SetRestingValue(restingValueExpressionAnimation); + + + endpoints[i] = endpoint; + } + + var finalEndpoint = InteractionTrackerInertiaRestingValue.Create(_compositor); + + var finalEndpointExpressionAnimation = _tracker.GetReference().NaturalRestingPosition.X > (_scenarios.Count - 1) * size / _scenarios.Count; + finalEndpoint.SetCondition(finalEndpointExpressionAnimation); + + var finalRestingValueExpressionAnimation = (_scenarios.Count - 1) * _tracker.GetReference().MaxPosition.X / _scenarios.Count; + finalEndpoint.SetRestingValue(finalRestingValueExpressionAnimation); + + endpoints[_scenarios.Count - 1] = finalEndpoint; + + _tracker.ConfigurePositionXInertiaModifiers(endpoints); + } + + #region PointerHandlers + private void MainGrid_PointerPressed(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e) + { + if (e.Pointer.PointerDeviceType == Microsoft.UI.Input.PointerDeviceType.Touch) + { + try + { + _interactionSource.TryRedirectForManipulation(e.GetCurrentPoint(MainGrid)); + } + catch (UnauthorizedAccessException) + { + // Ignoring the failed redirect to prevent app crashing + } + } + } + + private void MainCanvas_PointerPressed(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e) + { + // Pass event on to the scenario that's in view + foreach (Scenario scenario in _scenarios) + { + if (_scenarioContainersMapping[scenario].Offset.X == _tracker.Position.X) + { + scenario.CanvasPointerPressed(sender, e, MainCanvas); + } + } + } + + private void MainCanvas_PointerMoved(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e) + { + // Pass event on to the scenario that's in view + foreach (Scenario scenario in _scenarios) + { + if (_scenarioContainersMapping[scenario].Offset.X == _tracker.Position.X) + { + scenario.CanvasPointerMoved(sender, e, MainCanvas); + } + } + } + + private void MainCanvas_DoubleTapped(object sender, Microsoft.UI.Xaml.Input.DoubleTappedRoutedEventArgs e) + { + // Pass event on to the scenario that's in view + foreach (Scenario scenario in _scenarios) + { + if (_scenarioContainersMapping[scenario].Offset.X == _tracker.Position.X) + { + scenario.CanvasDoubleTapped(sender, e, MainCanvas); + } + } + } + + private void MainGrid_SizeChanged(object sender, SizeChangedEventArgs e) + { + if (_scenarios.Count > 0) + { + // Resize the container for each scenario + ContainerVisual previousScenarioContainer = null; + for (int i = 0; i < _scenarios.Count; i++) + { + var scenarioContainer = _scenarioContainersMapping[_scenarios[i]]; + scenarioContainer.Size = new Vector2((float)MainCanvas.ActualWidth, (float)MainCanvas.ActualHeight); + + // Update offset when applicable + if (previousScenarioContainer != null) + { + scenarioContainer.Offset = new Vector3(previousScenarioContainer.Offset.X + previousScenarioContainer.Size.X, 0, 0); + } + + // Update content on a per-scenario basis + _scenarios[i].SizeChanged(); + + previousScenarioContainer = scenarioContainer; + } + + // Update tracker position + var newOffset = _scenarioContainersMapping[_currentScenario].Offset; + _tracker.TryUpdatePosition(newOffset); + + // Update resting points + var backgroundVisual = ElementCompositionPreview.GetElementVisual(MainGrid); + backgroundVisual.Size = new Vector2((float)MainGrid.ActualWidth, (float)MainGrid.ActualHeight); + _tracker.MaxPosition = new Vector3((float)backgroundVisual.Size.X * _scenarios.Count, backgroundVisual.Size.Y, 0); + ConfigureRestingPoints(); + } + } + + private void ProgressIndicatorButton_Click(object sender, RoutedEventArgs e) + { + TryNavigateToScenario(int.Parse((sender as Button).Name)); + } + + private async void InfoButton_Click(object sender, RoutedEventArgs e) + { + // Pull up scenario help popup + string helpTextInfo = _currentScenario.HelpTextInstructions; + + var messageDialog = new MessageDialog(helpTextInfo); + WinRT.Interop.InitializeWithWindow.Initialize(messageDialog, WinRT.Interop.WindowNative.GetWindowHandle(MainWindow.CurrentWindow)); + await messageDialog.ShowAsync(); + } + #endregion + + #region Navigation + private void TryNavigateToScenario(int num) + { + foreach (Scenario scenario in _scenarios) + { + if (scenario.Identifier == num && _currentScenario != scenario) + { + var oldScenario = _currentScenario; + _currentScenario = scenario; + + var newOffset = _scenarioContainersMapping[scenario].Offset; + var currOffset = _tracker.Position; + + // Offset animation + Vector3KeyFrameAnimation offsetAnimation = _compositor.CreateVector3KeyFrameAnimation(); + offsetAnimation.InsertKeyFrame(0.0f, currOffset); + offsetAnimation.InsertKeyFrame(1.0f, newOffset); + offsetAnimation.Duration = ConfigurationConstants.FocusAnimationDuration; + offsetAnimation.Target = "Position"; + + _tracker.TryUpdatePositionWithAnimation(offsetAnimation); + + UpdateActiveScenarioIndicator(oldScenario); + + break; + } + } + } + + private Scenario GetActiveScenarioByTrackerPosition(Vector3 trackerPosition) + { + foreach (Scenario scenario in _scenarios) + { + if (_scenarioContainersMapping[scenario].Offset == trackerPosition) + { + return scenario; + } + } + return null; + } + + private void UpdateActiveScenarioIndicator(Scenario oldScenario) + { + oldScenario.IsActive = false; + _currentScenario.IsActive = true; + + var activeScenarioNum = _scenarios.IndexOf(_currentScenario); + + // Update nav active scenario indicator + // Get offset/size of new active scenario button + var buttonWidth = (float)ProgressIndicatorStackPanel.Children[activeScenarioNum].RenderSize.Width; + var buttonOffset = ProgressIndicatorStackPanel.Children[activeScenarioNum].GetOffset(ProgressIndicatorStackPanel); + var offsetDeltaX = Math.Abs(buttonOffset.X - _activeScenarioVisualIndicator.Offset.X); + + // Scoped batch for first half of the animation + var batch = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + batch.Completed += Batch_Completed; + + CompositionAnimationGroup animationGroup = _compositor.CreateAnimationGroup(); + + // Animate line size + ScalarKeyFrameAnimation sizeGrowAnimation = _compositor.CreateScalarKeyFrameAnimation(); + sizeGrowAnimation.Duration = ConfigurationConstants.NavAnimationDuration; + sizeGrowAnimation.InsertKeyFrame(0.0f, _activeScenarioVisualIndicator.Size.X); + sizeGrowAnimation.InsertKeyFrame(1.0f, offsetDeltaX + _activeScenarioVisualIndicator.Size.X); + sizeGrowAnimation.Target = "Size.X"; + if (buttonOffset.X < _activeScenarioVisualIndicator.Offset.X) + { + // Add offset animation to size change, to make the line appear to move to the left + ScalarKeyFrameAnimation offsetAnimation = _compositor.CreateScalarKeyFrameAnimation(); + offsetAnimation.InsertKeyFrame(0.0f, _activeScenarioVisualIndicator.Offset.X); + offsetAnimation.InsertKeyFrame(1.0f, buttonOffset.X); + offsetAnimation.Duration = ConfigurationConstants.NavAnimationDuration; + offsetAnimation.Target = "Offset.X"; + animationGroup.Add(offsetAnimation); + } + + animationGroup.Add(sizeGrowAnimation); + + _activeScenarioVisualIndicator.StartAnimationGroup(animationGroup); + + batch.End(); + } + + private void Batch_Completed(object sender, CompositionBatchCompletedEventArgs args) + { + // Start the second part of the animations + + // Get offset/size of new active scenario button + var activeScenarioNum = _scenarios.IndexOf(_currentScenario); + var buttonWidth = (float)ProgressIndicatorStackPanel.Children[activeScenarioNum].RenderSize.Width; + var buttonOffset = ProgressIndicatorStackPanel.Children[activeScenarioNum].GetOffset(ProgressIndicatorStackPanel); + var offsetDeltaX = Math.Abs(buttonOffset.X - _activeScenarioVisualIndicator.Offset.X); + + CompositionAnimationGroup animationGroup = _compositor.CreateAnimationGroup(); + + // Animate line size + ScalarKeyFrameAnimation sizeShrinkAnimation = _compositor.CreateScalarKeyFrameAnimation(); + sizeShrinkAnimation.Duration = ConfigurationConstants.NavAnimationDuration; + sizeShrinkAnimation.InsertKeyFrame(0.0f, _activeScenarioVisualIndicator.Size.X); + sizeShrinkAnimation.InsertKeyFrame(1.0f, buttonWidth); + sizeShrinkAnimation.Target = "Size.X"; + animationGroup.Add(sizeShrinkAnimation); + + if (buttonOffset.X > _activeScenarioVisualIndicator.Offset.X) + { + // Animate line to new offset + ScalarKeyFrameAnimation offsetAnimation = _compositor.CreateScalarKeyFrameAnimation(); + offsetAnimation.InsertKeyFrame(0.0f, _activeScenarioVisualIndicator.Offset.X); + offsetAnimation.InsertKeyFrame(1.0f, buttonOffset.X); + offsetAnimation.Duration = ConfigurationConstants.NavAnimationDuration; + offsetAnimation.Target = "Offset.X"; + animationGroup.Add(offsetAnimation); + } + + _activeScenarioVisualIndicator.StartAnimationGroup(animationGroup); + } + + private void ProgressIndicatorStackPanel_SizeChanged(object sender, SizeChangedEventArgs e) + { + var x = ProgressIndicatorStackPanel; + var y = ProgressIndicatorStackPanel.Children[0]; + + if (ProgressIndicatorStackPanel.Children.Count > 0) + { + var buttonHeight = (float)ProgressIndicatorStackPanel.Children[0].RenderSize.Height; + var buttonOffset = ProgressIndicatorStackPanel.Children[0].GetOffset(ProgressIndicatorStackPanel); + + _activeScenarioVisualIndicator.Offset = new Vector3(0, buttonHeight + buttonOffset.Y, 0); + _activeScenarioVisualIndicator.Size = new Vector2((float)ProgressIndicatorStackPanel.ActualWidth / _scenarios.Count, 3); + } + } + #endregion + + #region Callbacks + + public void CustomAnimationStateEntered(InteractionTracker sender, InteractionTrackerCustomAnimationStateEnteredArgs args) { } + + public void IdleStateEntered(InteractionTracker sender, InteractionTrackerIdleStateEnteredArgs args) + { + // Check offset for scenario and update progress indicator + var newScenario = GetActiveScenarioByTrackerPosition(sender.Position); + if (_currentScenario != newScenario && newScenario != null) + { + var oldScenario = _currentScenario; + _currentScenario = newScenario; + + UpdateActiveScenarioIndicator(oldScenario); + } + } + + public void InertiaStateEntered(InteractionTracker sender, InteractionTrackerInertiaStateEnteredArgs args) { } + + public void InteractingStateEntered(InteractionTracker sender, InteractionTrackerInteractingStateEnteredArgs args) { } + + public void RequestIgnored(InteractionTracker sender, InteractionTrackerRequestIgnoredArgs args) { } + + public void ValuesChanged(InteractionTracker sender, InteractionTrackerValuesChangedArgs args) { } + + #endregion Callbacks + + } + + + public static class UIElementExtensions + { + public static Vector3 GetOffset(this UIElement element, UIElement relativeTo = null) + { + var transform = element.TransformToVisual(relativeTo ?? Window.Current.Content); + var point = transform.TransformPoint(new Point(0, 0)); + Vector3 offset = new Vector3((float)point.X, (float)point.Y, 0); + + return offset; + } + } + +} \ No newline at end of file diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainWindow.xaml b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainWindow.xaml new file mode 100644 index 000000000..75f6a92af --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainWindow.xaml @@ -0,0 +1,11 @@ + + + + diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainWindow.xaml.cs b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainWindow.xaml.cs new file mode 100644 index 000000000..74da2b184 --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/MainWindow.xaml.cs @@ -0,0 +1,49 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Foundation; +using Windows.Foundation.Collections; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace DepthDemo +{ + /// + /// An empty window that can be used on its own or navigated to within a Frame. + /// + public sealed partial class MainWindow : Window + { + public static MainWindow CurrentWindow { get; private set; } + + public MainWindow() + { + this.InitializeComponent(); + this.Title = "Depth Demo - Windows App SDK"; + CurrentWindow = this; + } + } +} diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Properties/PublishProfiles/win-arm64.pubxml b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Properties/PublishProfiles/win-arm64.pubxml new file mode 100644 index 000000000..08b5300d8 --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Properties/PublishProfiles/win-arm64.pubxml @@ -0,0 +1,19 @@ + + + + + FileSystem + arm64 + win-arm64 + bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ + true + False + True + + + \ No newline at end of file diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Properties/PublishProfiles/win-x64.pubxml b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Properties/PublishProfiles/win-x64.pubxml new file mode 100644 index 000000000..dcdbaed60 --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Properties/PublishProfiles/win-x64.pubxml @@ -0,0 +1,19 @@ + + + + + FileSystem + x64 + win-x64 + bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ + true + False + True + + + \ No newline at end of file diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Properties/PublishProfiles/win-x86.pubxml b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Properties/PublishProfiles/win-x86.pubxml new file mode 100644 index 000000000..cf7e029c0 --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Properties/PublishProfiles/win-x86.pubxml @@ -0,0 +1,19 @@ + + + + + FileSystem + x86 + win-x86 + bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ + true + False + True + + + \ No newline at end of file diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Scenario.cs b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Scenario.cs new file mode 100644 index 000000000..de09cba5e --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Scenario.cs @@ -0,0 +1,216 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Input; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using Windows.Foundation; +using Windows.UI; + +namespace DepthDemo +{ + public abstract class Scenario + { + public Scenario(int identifier) + { + Identifier = identifier; + IsActive = false; + } + + public struct LayerConfig + { + public int ID; + public Color Color; + public Vector3 Scale; + public int ShadowBlurRadius; + public Vector3 ShadowOffset; + + public LayerConfig(int id, Color color, Vector3 scale, int shadowBlurRadius, Vector3 shadowOffset) + { + ID = id; + Color = color; + Scale = scale; + ShadowBlurRadius = shadowBlurRadius; + ShadowOffset = shadowOffset; + } + } + + /// + /// String describing how to interact with the scenario + /// + public string HelpTextInstructions { get; set; } + + /// + /// Boolean indicating whether the scenario is active or not. 'Active' indicates + /// the end user can see the scenario in the app. + /// + public bool IsActive { get; set; } + + /// + /// Identifier for the scenario + /// + public int Identifier { get; set; } + + /// + /// Used to define new behavior when animating a visual from one conceptual layer to another, + /// on a per scenario basis. + /// + public virtual void AnimateVisualToLayer(Layer oldLayer, Layer newLayer, SpriteVisual targetVisual, bool overrideProjectedShadows = false) + { + if (oldLayer.LayerBackingVisual.Children.Contains(targetVisual)) + { + // Remove visual from current layer + oldLayer.LayerBackingVisual.Children.Remove(targetVisual); + + // Add to new layer + newLayer.LayerBackingVisual.Children.InsertAtTop(targetVisual); + + // Trigger animation to new values + newLayer.AnimateAddedVisual(targetVisual); + } + } + + public Visual GetHittestVisual(Point pointerPosition, List visuals, List layers, List excludedVisuals) + { + return GetHittestVisualHelper(pointerPosition, visuals, layers, excludedVisuals); + } + + public Visual GetHittestVisual(Point pointerPosition, List visuals, List layers, List excludedVisuals) + { + List visualsList = new List(); + foreach (Visual visual in visuals) + { + visualsList.Add((Visual)visual); + } + + return GetHittestVisualHelper(pointerPosition, visualsList, layers, excludedVisuals); + } + + public Visual GetHittestVisual(Point pointerPosition, VisualCollection visuals, List layers, List excludedVisuals) + { + List visualsList = new List(); + foreach (Visual visual in visuals) + { + visualsList.Add(visual); + } + + return GetHittestVisualHelper(pointerPosition, visualsList, layers, excludedVisuals); + } + + private Visual GetHittestVisualHelper(Point pointerPosition, List visuals, List layers, List excludedVisuals) + { + if (excludedVisuals == null) { excludedVisuals = new List(); } + List hitVisuals = new List(); + foreach (Visual visual in visuals) + { + if (!excludedVisuals.Contains(visual)) + { + var visualXLowerBound = visual.Offset.X; + var visualXUpperBound = visual.Offset.X + visual.Size.X; + var visualYLowerBound = visual.Offset.Y; + var visualYUpperBound = visual.Offset.Y + visual.Size.Y; + + // Check if clicked + if (pointerPosition.X >= visualXLowerBound && pointerPosition.X <= visualXUpperBound && + pointerPosition.Y >= visualYLowerBound && pointerPosition.Y <= visualYUpperBound) + { + hitVisuals.Add(visual); + } + } + } + + if (hitVisuals.Count >= 1) + { + if (hitVisuals.Count == 1) + { + return hitVisuals.First(); + } + else + { + // Go through each layer starting at the end (highest) and get the topmost hit visual + for (int i = layers.Count - 1; i >= 0; i--) + { + foreach (Visual v in hitVisuals) + { + if (layers[i].LayerBackingVisual.Children.Contains(v)) + { + // Convert back to SV or CV + if (v.GetType().Name.Equals("SpriteVisual")) + { + return (SpriteVisual)v; + } + else if (v.GetType().Name.Equals("ContainerVisual")) + { + return (ContainerVisual)v; + } + return v; + } + } + } + } + } + return null; + } + + /// + /// Given a visual, get it's parent Layer object + /// + public Layer GetParentLayer(List layers, Visual visual) + { + foreach (Layer layer in layers) + { + if (layer.LayerBackingVisual.Children.Contains(visual)) + { + return layer; + } + } + return null; + } + + /// + /// Create conceptual layers for the scenario, in order to define layer-specific behavior + /// + abstract public void CreateLayers(); + + /// + /// Size changed listener helper method + /// + abstract public void SizeChanged(); + + /// + /// Used to actually create the components of the scenario. Separated from the constructor + /// in order to provide greater control over scenarios. + /// + abstract public void ImplementScenario(Compositor compositor, SpriteVisual scenarioContainer); + + /// + /// Scenario-specific behavior for canvas pointer moved input + /// + virtual public void CanvasPointerMoved(object sender, PointerRoutedEventArgs e, Canvas canvasReference) { } + + /// + /// Scenario-specific behavior for canvas pointer pressed input + /// + virtual public void CanvasPointerPressed(object sender, PointerRoutedEventArgs e, Canvas canvasReference) { } + + /// + /// Scenario-specific behavior for canvas double tapped input + /// + virtual public void CanvasDoubleTapped(object sender, DoubleTappedRoutedEventArgs e, Canvas canvasReference) { } + + } +} diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Scenarios/BasicElementsScenario.cs b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Scenarios/BasicElementsScenario.cs new file mode 100644 index 000000000..97c5a9e11 --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Scenarios/BasicElementsScenario.cs @@ -0,0 +1,229 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using Windows.UI; + +namespace DepthDemo.Scenarios +{ + class BasicElementsScenario : Scenario + { + private Compositor _compositor; + private List _visuals; + private List _layers; + private SpriteVisual _scenarioContainer; + private Canvas _canvasReference; + private Layer _primaryHostLayer; + private SpriteVisual _bottomLargeVisual; + + private int _numTopVisuals = 6; + + // Focus treatment increase for top layer objects + public static float _focusScaleIncreaseFactor = 1.1f; + // Shadow specific + public static int _focusShadowBlurRadiusIncreaseAmount = 15; + public static int _focusShadowOffsetIncreaseAmount = 15; + + private static List s_layers = new List + { + new LayerConfig(0, Color.FromArgb(255,0,153,153), new Vector3(1, 1, 1), 30, new Vector3(0, 0, -20)), + new LayerConfig(1, Color.FromArgb(255,0,204,204), new Vector3(1.3f,1.3f, 1.3f), 60, new Vector3(0, 0, -30)) + }; + + public BasicElementsScenario(int identifier, Compositor compositor, Canvas canvasReference) : base(identifier) + { + _visuals = new List(); + _layers = new List(); + + _compositor = compositor; + _canvasReference = canvasReference; + + HelpTextInstructions = "1. Click a visual in the upper portion of the screen to animate it forward with depth. " + System.Environment.NewLine + + "Click again to send it back to the original position."; + } + + public override void CreateLayers() + { + // Create layers + for (int i = 0; i < s_layers.Count; i++) + { + var offset = new Vector3(0, 0, (ConfigurationConstants.ZOffsetSpacingIncrement * s_layers[i].ID)); + var size = new Vector2((float)_canvasReference.ActualWidth, (float)_canvasReference.ActualHeight); + + Layer l = new Layer(_compositor, s_layers[i].ID, offset, size, _scenarioContainer, _compositor.CreateColorBrush(s_layers[i].Color)); + _layers.Add(l); + + // Set depth treatment + ShadowTreatment shadowTreatment = new ShadowTreatment(s_layers[i].ShadowBlurRadius, s_layers[i].ShadowOffset, _focusShadowBlurRadiusIncreaseAmount, _focusShadowOffsetIncreaseAmount); + DepthTreatmentConfigurations depthTreatment = new DepthTreatmentConfigurations(_layers[i], s_layers[i].Scale, _focusScaleIncreaseFactor, shadowTreatment); + _layers[i].SetDepthTreatments(depthTreatment); + } + } + + public override void ImplementScenario(Compositor compositor, SpriteVisual scenarioContainer) + { + _scenarioContainer = scenarioContainer; + + CreateLayers(); + + // Get layer 0 + foreach (Layer layer in _layers) + { + if (layer.Identifier == 0) + { + _primaryHostLayer = layer; + } + } + + // Create larger visual on bottom + _bottomLargeVisual = compositor.CreateSpriteVisual(); + _bottomLargeVisual.Brush = compositor.CreateColorBrush(s_layers[0].Color); + _bottomLargeVisual.Opacity = 1.0f; + _visuals.Add(_bottomLargeVisual); + _primaryHostLayer.LayerBackingVisual.Children.InsertAtTop(_bottomLargeVisual); + + // Create basic sprite visuals, all on layer of id 0 + for (int i = 0; i < _numTopVisuals; i++) + { + SpriteVisual v = compositor.CreateSpriteVisual(); + v.Brush = compositor.CreateColorBrush(s_layers[0].Color); + v.Opacity = 1.0f; + _visuals.Add(v); + _primaryHostLayer.LayerBackingVisual.Children.InsertAtTop(v); + } + + UpdateSizeAndLayout(); + + foreach (Layer l in _layers) + { + l.RefreshApplyDepthTreatments(); + } + } + + public override void CanvasPointerPressed(object sender, PointerRoutedEventArgs e, Canvas canvasReference) + { + List excludedVisuals = new List() { _bottomLargeVisual }; + var hitVisual = (SpriteVisual)GetHittestVisual(e.GetCurrentPoint(canvasReference).Position, _visuals, _layers, excludedVisuals); + + // Get parent layer + Layer parentLayer = GetParentLayer(_layers, hitVisual); + + if (hitVisual != null) + { + // Check if the hittested visual was elevated from a previous layer. If it wasn't, elevate. Else move back. + if (!parentLayer.ElevatedVisuals.Contains(hitVisual)) + { + RemoveElevatedVisuals(); + + // Elevate hit tested visual + // Get new layer owner + var newLayerIndex2 = _layers.IndexOf(parentLayer) + 1; + if (newLayerIndex2 >= _layers.Count) + { + newLayerIndex2 = _layers.Count - 1; + } + var newLayer = _layers[newLayerIndex2]; + + AnimateVisualToLayer(parentLayer, newLayer, hitVisual); + newLayer.ElevatedVisuals.Add(hitVisual); + } + else + { + // Animate back to non-elevated state + var newLayerIndex = _layers.IndexOf(parentLayer) - 1; + if (newLayerIndex < 0) + { + newLayerIndex = 0; + } + var newLayer = _layers[newLayerIndex]; + + AnimateVisualToLayer(parentLayer, newLayer, hitVisual); + parentLayer.ElevatedVisuals.Remove(hitVisual); + } + } + else + { + RemoveElevatedVisuals(); + } + } + + private void RemoveElevatedVisuals(bool overrideProjectedShadows = false) + { + foreach (Layer layer in _layers) + { + if (layer.ElevatedVisuals.Count > 0) + { + foreach (SpriteVisual currentlyElevatedVisual in layer.ElevatedVisuals.ToList()) + { + var newLayerIndex = _layers.IndexOf(layer) - 1; + if (newLayerIndex < 0) + { + newLayerIndex = 0; + } + + AnimateVisualToLayer(layer, _layers[newLayerIndex], currentlyElevatedVisual, overrideProjectedShadows); + layer.ElevatedVisuals.Remove(currentlyElevatedVisual); + } + } + } + } + + public override void AnimateVisualToLayer(Layer oldLayer, Layer newLayer, SpriteVisual targetVisual, bool overrideProjectedShadows = false) + { + if (oldLayer.LayerBackingVisual.Children.Contains(targetVisual)) + { + // Remove visual from current layer + oldLayer.LayerBackingVisual.Children.Remove(targetVisual); + + // Add to new layer + newLayer.LayerBackingVisual.Children.InsertAtTop(targetVisual); + + // Trigger animation to new values + newLayer.AnimateAddedVisual(targetVisual); + } + } + + public override void SizeChanged() + { + UpdateSizeAndLayout(); + } + + private void UpdateSizeAndLayout() + { + var previousOffset = new Vector3(20, 20, 0); + foreach (SpriteVisual child in _primaryHostLayer.LayerBackingVisual.Children) + { + if (child == _bottomLargeVisual) + { + child.Size = new Vector2((float)_scenarioContainer.Size.X - 40, (float)_scenarioContainer.Size.Y - 20); + child.Offset = new Vector3(20, _scenarioContainer.Size.Y / 4, 0); + child.CenterPoint = new Vector3(child.Size.X / 2, child.Size.Y / 2, 0); + } + else + { + child.Size = new Vector2((_bottomLargeVisual.Size.X - 20 * (_numTopVisuals - 1)) / _numTopVisuals, _bottomLargeVisual.Offset.Y - 40); + child.Offset = previousOffset; + child.CenterPoint = new Vector3(child.Size.X / 2, child.Size.Y / 2, 0); // to center scaling + previousOffset = new Vector3(previousOffset.X + child.Size.X + 20, previousOffset.Y, 0); + } + } + } + } +} diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Scenarios/NestedScenario.cs b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Scenarios/NestedScenario.cs new file mode 100644 index 000000000..8c7f22283 --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/Scenarios/NestedScenario.cs @@ -0,0 +1,131 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Input; +using System.Collections.Generic; +using System.Numerics; +using Windows.UI; + +namespace DepthDemo.Scenarios +{ + class NestedScenario : Scenario + { + private Compositor _compositor; + private List _visuals; + private List _layers; + private SpriteVisual _scenarioContainer; + private Canvas _canvasReference; + + // Focus treatment increase for top layer objects + public static float _focusScaleIncreaseFactor = 1.2f; + // Shadow specific + public static int _focusShadowBlurRadiusIncreaseAmount = 5; + public static int _focusShadowOffsetIncreaseAmount = 10; + + private static List s_layers = new List + { + new LayerConfig(-2, Color.FromArgb(255,0,153,153), new Vector3(1, 1, 1), 0, new Vector3(0, 0, 0)), + new LayerConfig(-1, Color.FromArgb(255,0,204,204), new Vector3(1, 1, 1), 5, new Vector3(5,5,-5)), + new LayerConfig(0, Color.FromArgb(255,0,255,255), new Vector3(1, 1, 1), 9, new Vector3(10,10,-10)), + new LayerConfig(1, Color.FromArgb(255,102,255,255), new Vector3(1, 1, 1), 15, new Vector3(15,15,-15)), + new LayerConfig(2, Color.FromArgb(255,204,255,255), new Vector3(1, 1, 1), 30, new Vector3(20,20,-20)) + }; + + public NestedScenario(int identifier, Compositor compositor, Canvas canvasReference) : base(identifier) + { + _visuals = new List(); + _layers = new List(); + + _compositor = compositor; + _canvasReference = canvasReference; + + HelpTextInstructions = "1. Move your finger L/R across the screen as if panning, to trigger the parallax behavior in the nested visuals."; + } + + public override void CreateLayers() + { + // Create layers + for (int i = 0; i < s_layers.Count; i++) + { + var offset = new Vector3(0, 0, (ConfigurationConstants.ZOffsetSpacingIncrement * s_layers[i].ID)); + var size = new Vector2((float)_canvasReference.ActualWidth, (float)_canvasReference.ActualHeight); + + Layer l = new Layer(_compositor, s_layers[i].ID, offset, size, _scenarioContainer, _compositor.CreateColorBrush(s_layers[i].Color)); + _layers.Add(l); + + // Set depth treatment + ShadowTreatment shadowTreatment = new ShadowTreatment(s_layers[i].ShadowBlurRadius, s_layers[i].ShadowOffset, _focusShadowBlurRadiusIncreaseAmount, _focusShadowOffsetIncreaseAmount); + DepthTreatmentConfigurations depthTreatment = new DepthTreatmentConfigurations(_layers[i], s_layers[i].Scale, _focusScaleIncreaseFactor, shadowTreatment); + _layers[i].SetDepthTreatments(depthTreatment); + } + } + + public override void ImplementScenario(Compositor compositor, SpriteVisual scenarioContainer) + { + _scenarioContainer = scenarioContainer; + + CreateLayers(); + + // Create basic sprite visual to add to each layer, with random colors + for (int i = 0; i < _layers.Count; i++) + { + SpriteVisual v = compositor.CreateSpriteVisual(); + v.Brush = compositor.CreateColorBrush(s_layers[i].Color); + v.Opacity = 1.0f; + + _visuals.Add(v); + _layers[i].LayerBackingVisual.Children.InsertAtTop(v); + } + + UpdateSizeAndLayout(); + + foreach (Layer l in _layers) + { + l.RefreshApplyDepthTreatments(); + } + } + + public List GetVisuals() + { + return _visuals; + } + + public override void SizeChanged() + { + UpdateSizeAndLayout(); + } + + private void UpdateSizeAndLayout() + { + // Incremental offset and size starting values + var previousOffset = new Vector3(10, 10, 0); + var previousSize = new Vector2((float)_scenarioContainer.Size.X - 200, (float)_scenarioContainer.Size.Y - 200); + + for (int i = 0; i < _layers.Count; i++) + { + foreach (SpriteVisual child in _layers[i].LayerBackingVisual.Children) + { + child.Size = previousSize; + child.Offset = previousOffset; + child.CenterPoint = new Vector3(previousSize.X / 2, previousSize.Y / 2, 0); // to center scaling + + previousOffset = new Vector3(previousOffset.X + 50, previousOffset.Y + 50, 0); + previousSize = new Vector2(previousSize.X - 100, previousSize.Y - 100); + } + } + } + } +} diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/app.manifest b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/app.manifest new file mode 100644 index 000000000..2e0eca2ad --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoApp/app.manifest @@ -0,0 +1,15 @@ + + + + + + + + true/PM + PerMonitorV2, PerMonitor + + + diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/DepthDemoPackage.wapproj b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/DepthDemoPackage.wapproj new file mode 100644 index 000000000..f02bf066e --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/DepthDemoPackage.wapproj @@ -0,0 +1,62 @@ + + + + 15.0 + + + + Debug + x86 + + + Release + x86 + + + Debug + x64 + + + Release + x64 + + + Debug + arm64 + + + Release + arm64 + + + + $(MSBuildExtensionsPath)\Microsoft\DesktopBridge\ + + + 479855a2-c397-46d6-a034-ecb60fd91780 + 10.0.19041.0 + 10.0.17763.0 + en-US + false + ..\DepthDemoApp\DepthDemoApp.csproj + + + + Designer + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/LockScreenLogo.scale-200.png b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/LockScreenLogo.scale-200.png new file mode 100644 index 000000000..7440f0d4b Binary files /dev/null and b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/LockScreenLogo.scale-200.png differ diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/SplashScreen.scale-200.png b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/SplashScreen.scale-200.png new file mode 100644 index 000000000..32f486a86 Binary files /dev/null and b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/SplashScreen.scale-200.png differ diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Square150x150Logo.scale-200.png b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Square150x150Logo.scale-200.png new file mode 100644 index 000000000..53ee3777e Binary files /dev/null and b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Square150x150Logo.scale-200.png differ diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Square44x44Logo.scale-200.png b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Square44x44Logo.scale-200.png new file mode 100644 index 000000000..f713bba67 Binary files /dev/null and b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Square44x44Logo.scale-200.png differ diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Square44x44Logo.targetsize-24_altform-unplated.png b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 000000000..dc9f5bea0 Binary files /dev/null and b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Square44x44Logo.targetsize-24_altform-unplated.png differ diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/StoreLogo.png b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/StoreLogo.png new file mode 100644 index 000000000..a4586f26b Binary files /dev/null and b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/StoreLogo.png differ diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Wide310x150Logo.scale-200.png b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Wide310x150Logo.scale-200.png new file mode 100644 index 000000000..8b4a5d0dd Binary files /dev/null and b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Images/Wide310x150Logo.scale-200.png differ diff --git a/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Package.appxmanifest b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Package.appxmanifest new file mode 100644 index 000000000..f98b95947 --- /dev/null +++ b/Samples/SceneGraph/Demos/DepthDemo/DepthDemoPackage/Package.appxmanifest @@ -0,0 +1,48 @@ + + + + + + + + DepthDemoPackage + getrou + Images\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/App.xaml b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/App.xaml new file mode 100644 index 000000000..e8dfe9cd7 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/App.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/App.xaml.cs b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/App.xaml.cs new file mode 100644 index 000000000..1cc0aa472 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/App.xaml.cs @@ -0,0 +1,65 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using Microsoft.UI.Xaml.Shapes; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.Foundation; +using Windows.Foundation.Collections; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace EffectEditor +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + public partial class App : Application + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + this.InitializeComponent(); + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used such as when the application is launched to open a specific file. + /// + /// Details about the launch request and process. + protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) + { + m_window = new MainWindow(); + m_window.Activate(); + } + + private Window m_window; + } +} diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/Bruno'sFamily2015 (13)-X2.jpg b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/Bruno'sFamily2015 (13)-X2.jpg new file mode 100644 index 000000000..55d9ce799 Binary files /dev/null and b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/Bruno'sFamily2015 (13)-X2.jpg differ diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/Checkerboard_100x100.png b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/Checkerboard_100x100.png new file mode 100644 index 000000000..f5e97147e Binary files /dev/null and b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/Checkerboard_100x100.png differ diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/CircleMask.png b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/CircleMask.png new file mode 100644 index 000000000..4f64b1f1b Binary files /dev/null and b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/CircleMask.png differ diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/_P2A8041.jpg b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/_P2A8041.jpg new file mode 100644 index 000000000..ab29117d8 Binary files /dev/null and b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Assets/_P2A8041.jpg differ diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/EffectEditorApp.csproj b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/EffectEditorApp.csproj new file mode 100644 index 000000000..4be186ba1 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/EffectEditorApp.csproj @@ -0,0 +1,53 @@ + + + WinExe + net8.0-windows10.0.19041.0 + 10.0.17763.0 + EffectEditor + app.manifest + x86;x64;arm64 + win-x86;win-x64;win-arm64 + true + + + 1701;1702;CA1416 + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + MSBuild:Compile + + + diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainPage.xaml b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainPage.xaml new file mode 100644 index 000000000..b926a5d8c --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainPage.xaml @@ -0,0 +1,246 @@ + + + + + + No Effect + Alpha Mask + Arithmetic + Blend + Color Source + Contrast + Exposure + Gamma Transfer + Grayscale + Hue Rotation + Invert + Saturation + Sepia + Temperature and Tint + Transform 2D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Red + Green + Blue + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Premultiplied + Straight + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainPage.xaml.cs b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainPage.xaml.cs new file mode 100644 index 000000000..45f12b854 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainPage.xaml.cs @@ -0,0 +1,886 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Numerics; +using System.Runtime.InteropServices.WindowsRuntime; +using System.Threading; +using System.Threading.Tasks; +using System.Xml; +using Microsoft.Graphics.Canvas; +using Microsoft.Graphics.Canvas.Effects; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.Graphics.Imaging; +using Windows.Storage; +using Windows.UI; +using SamplesCommon; +using static SamplesCommon.ImageLoader; + +// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 + +namespace EffectEditor +{ + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class MainPage : Page + { + public enum EffectType + { + NoEffect, + AlphaMask, + Arithmetic, + Blend, + ColorSource, + Contrast, + Exposure, + GammaTransfer, + Grayscale, + HueRotation, + Invert, + Saturation, + Sepia, + TemperatureAndTint, + Transform2D, + + NumEffectTypes + } + + public MainPage() + { + this.InitializeComponent(); + + DataContext = this; + } + + + void InitializeValues() + { + EffectSelector.SelectedIndex = 0; + ArithmeticMultiply.Value = 0.5f; + ArithmeticSource1.Value = 0.5f; + ArithmeticSource2.Value = 0.5f; + ArithmeticOffset.Value = 0.0f; + BlendModeSelector.SelectedIndex = 0; + ColorSourceRed.Value = 1.0f; + ColorSourceGreen.Value = 1.0f; + ColorSourceBlue.Value = 1.0f; + ColorSourceAlpha.Value = 1.0f; + Contrast.Value = 0.5f; + Exposure.Value = 0.5f; + GammaTransferChannelSelector.SelectedIndex = 0; + GammaAmplitude.Value = 1.0f; + GammaExponent.Value = 1.0f; + GammaOffset.Value = 0.0f; + HueRotation.Value = 0.5f; + Saturation.Value = 0.5f; + SepiaAlphaModeSelector.SelectedIndex = 0; + Sepia.Value = 0.5f; + Temperature.Value = 0.5f; + Tint.Value = 0.5f; + } + + private CompositionSurfaceBrush CreateBrushFromAsset(string name, out Size size) + { + CompositionDrawingSurface surface = ImageLoader.Instance.LoadFromUri(new Uri("ms-appx:///Assets/" + name)).Surface; + size = surface.Size; + return m_compositor.CreateSurfaceBrush(surface); + } + + private CompositionSurfaceBrush CreateBrushFromAsset(string name) + { + Size size; + return CreateBrushFromAsset(name, out size); + } + + private void MainGridLoaded(object sender, RoutedEventArgs e) + { + m_compositor = ElementCompositionPreview.GetElementVisual(MainGrid).Compositor; + m_root = m_compositor.CreateContainerVisual(); + ElementCompositionPreview.SetElementChildVisual(MainGrid, m_root); + + ImageLoader.Initialize(m_compositor); + + Size imageSize; + m_noEffectBrush = CreateBrushFromAsset( + "Bruno'sFamily2015 (13)-X2.jpg", + out imageSize); + m_imageAspectRatio = (imageSize.Width == 0 && imageSize.Height == 0) ? 1 : imageSize.Width / imageSize.Height; + + m_sprite = m_compositor.CreateSpriteVisual(); + ResizeImage(new Size(MainGrid.ActualWidth, MainGrid.ActualHeight)); + m_root.Children.InsertAtTop(m_sprite); + + // Image with alpha channel as an mask. + var alphaMaskEffectDesc = new CompositeEffect + { + Mode = CanvasComposite.DestinationIn, + Sources = + { + new CompositionEffectSourceParameter("Image"), + new Transform2DEffect + { + Name = "MaskTransform", + Source = new CompositionEffectSourceParameter("Mask") + } + } + }; + m_alphaMaskEffectBrush = m_compositor.CreateEffectFactory( + alphaMaskEffectDesc, + new[] { "MaskTransform.TransformMatrix" } + ).CreateBrush(); + m_alphaMaskEffectBrush.SetSourceParameter( + "Image", + m_noEffectBrush); + m_alphaMaskEffectBrush.SetSourceParameter( + "Mask", + CreateBrushFromAsset("CircleMask.png")); + + // Arithmetic operations between two images. + var arithmeticEffectDesc = new ArithmeticCompositeEffect + { + Name = "effect", + ClampOutput = false, + Source1 = new CompositionEffectSourceParameter("Source1"), + Source2 = new CompositionEffectSourceParameter("Source2") + }; + m_arithmeticEffectBrush = m_compositor.CreateEffectFactory( + arithmeticEffectDesc, + new[] + { + "effect.MultiplyAmount", + "effect.Source1Amount", + "effect.Source2Amount", + "effect.Offset" + } + ).CreateBrush(); + m_arithmeticEffectBrush.SetSourceParameter( + "Source1", + m_noEffectBrush); + m_arithmeticEffectBrush.SetSourceParameter( + "Source2", + CreateBrushFromAsset("_P2A8041.jpg")); + + // Creates a blend effect that combines two images. + var foregroundBrush = CreateBrushFromAsset("Checkerboard_100x100.png"); + m_blendEffectBrushes = new CompositionEffectBrush[m_supportedBlendModes.Length]; + for (int i = 0; i < m_supportedBlendModes.Length; i++) + { + var blendEffectDesc = new BlendEffect + { + Mode = m_supportedBlendModes[i], + Background = new CompositionEffectSourceParameter("Background"), + Foreground = new CompositionEffectSourceParameter("Foreground") + }; + m_blendEffectBrushes[i] = m_compositor.CreateEffectFactory( + blendEffectDesc + ).CreateBrush(); + m_blendEffectBrushes[i].SetSourceParameter( + "Background", + m_noEffectBrush); + m_blendEffectBrushes[i].SetSourceParameter( + "Foreground", + foregroundBrush); + } + + // Generates an image containing a solid color. + var colorSourceEffectDesc = new ColorSourceEffect // FloodEffect + { + Name = "effect" + }; + m_colorSourceEffectBrush = m_compositor.CreateEffectFactory( + colorSourceEffectDesc, + new[] { "effect.Color" } + ).CreateBrush(); + + // Changes the contrast of an image. + var contrastEffectDesc = new ContrastEffect + { + Name = "effect", + Source = new CompositionEffectSourceParameter("Image") + }; + m_contrastEffectBrush = m_compositor.CreateEffectFactory( + contrastEffectDesc, + new[] { "effect.Contrast" } + ).CreateBrush(); + m_contrastEffectBrush.SetSourceParameter( + "Image", + m_noEffectBrush); + + // Changes the exposure of an image. + var exposureEffectDesc = new ExposureEffect + { + Name = "effect", + Source = new CompositionEffectSourceParameter("Image") + }; + m_exposureEffectBrush = m_compositor.CreateEffectFactory( + exposureEffectDesc, + new[] { "effect.Exposure" } + ).CreateBrush(); + m_exposureEffectBrush.SetSourceParameter( + "Image", + m_noEffectBrush); + + // Alters the colors of an image by applying a per-channel gamma transfer function. + var gammaTransferEffectDesc = new GammaTransferEffect + { + Name = "effect", + RedDisable = false, + GreenDisable = false, + BlueDisable = false, + AlphaDisable = false, + Source = new CompositionEffectSourceParameter("Image") + }; + m_gammaTransferEffectBrush = m_compositor.CreateEffectFactory( + gammaTransferEffectDesc, + new[] + { + "effect.RedAmplitude", + "effect.RedExponent", + "effect.RedOffset", + "effect.GreenAmplitude", + "effect.GreenExponent", + "effect.GreenOffset", + "effect.BlueAmplitude", + "effect.BlueExponent", + "effect.BlueOffset" + } + ).CreateBrush(); + m_gammaTransferEffectBrush.SetSourceParameter( + "Image", + m_noEffectBrush); + + // Converts an image to monochromatic gray. + var grayscaleEffectDesc = new GrayscaleEffect + { + Name = "effect", + Source = new CompositionEffectSourceParameter("Image") + }; + m_grayscaleEffectBrush = m_compositor.CreateEffectFactory( + grayscaleEffectDesc + ).CreateBrush(); + m_grayscaleEffectBrush.SetSourceParameter( + "Image", + m_noEffectBrush); + + // Alters the color of an image by rotating its hue values. + var hueRotationEffectDesc = new HueRotationEffect + { + Name = "effect", + Source = new CompositionEffectSourceParameter("Image") + }; + m_hueRotationEffectBrush = m_compositor.CreateEffectFactory( + hueRotationEffectDesc, + new[] { "effect.Angle" } + ).CreateBrush(); + m_hueRotationEffectBrush.SetSourceParameter( + "Image", + m_noEffectBrush); + + // Inverts the colors of an image. + var invertEffectDesc = new InvertEffect + { + Name = "effect", + Source = new CompositionEffectSourceParameter("Image") + }; + m_invertEffectBrush = m_compositor.CreateEffectFactory( + invertEffectDesc + ).CreateBrush(); + m_invertEffectBrush.SetSourceParameter( + "Image", + m_noEffectBrush); + + // Alters the saturation of an image. + var saturationEffectDesc = new SaturationEffect + { + Name = "effect", + Source = new CompositionEffectSourceParameter("Image") + }; + m_saturateEffectBrush = m_compositor.CreateEffectFactory( + saturationEffectDesc, + new[] { "effect.Saturation" } + ).CreateBrush(); + m_saturateEffectBrush.SetSourceParameter( + "Image", + m_noEffectBrush); + + // Converts an image to sepia tones. + var supportedAlphaModes = new[] + { + CanvasAlphaMode.Premultiplied, + CanvasAlphaMode.Straight + }; + m_sepiaEffectBrushes = new CompositionEffectBrush[supportedAlphaModes.Length]; + for (int i = 0; i < supportedAlphaModes.Length; i++) + { + var sepiaEffectDesc = new SepiaEffect + { + Name = "effect", + AlphaMode = supportedAlphaModes[i], + Source = new CompositionEffectSourceParameter("Image") + }; + m_sepiaEffectBrushes[i] = m_compositor.CreateEffectFactory( + sepiaEffectDesc, + new[] { "effect.Intensity" } + ).CreateBrush(); + m_sepiaEffectBrushes[i].SetSourceParameter( + "Image", + m_noEffectBrush); + } + + // Adjusts the temperature and/or tint of an image. + var temperatureAndTintEffectDesc = new TemperatureAndTintEffect + { + Name = "effect", + Source = new CompositionEffectSourceParameter("Image") + }; + m_temperatureAndTintEffectBrush = m_compositor.CreateEffectFactory( + temperatureAndTintEffectDesc, + new[] + { + "effect.Temperature", + "effect.Tint" + } + ).CreateBrush(); + m_temperatureAndTintEffectBrush.SetSourceParameter( + "Image", + m_noEffectBrush); + + // Applies a 2D affine transform matrix to an image. + var transform2DEffectDesc = new Transform2DEffect + { + TransformMatrix = new Matrix3x2( + -1, 0, + 0, 1, + m_sprite.Size.X, 0), + Source = new CompositionEffectSourceParameter("Image") + }; + m_transform2DEffectBrush = m_compositor.CreateEffectFactory( + transform2DEffectDesc + ).CreateBrush(); + m_transform2DEffectBrush.SetSourceParameter( + "Image", + m_noEffectBrush); + + // For simplying UI states switch, put effect parameter grids in an array + m_effectParamsGrids = new Grid[(int)EffectType.NumEffectTypes]; + m_effectParamsGrids[(int)EffectType.NoEffect] = null; + m_effectParamsGrids[(int)EffectType.AlphaMask] = AlphaMaskParams; + m_effectParamsGrids[(int)EffectType.Arithmetic] = ArithmeticParams; + m_effectParamsGrids[(int)EffectType.Blend] = BlendParams; + m_effectParamsGrids[(int)EffectType.ColorSource] = ColorSourceParams; + m_effectParamsGrids[(int)EffectType.Contrast] = ContrastParams; + m_effectParamsGrids[(int)EffectType.Exposure] = ExposureParams; + m_effectParamsGrids[(int)EffectType.GammaTransfer] = GammaTransferParams; + m_effectParamsGrids[(int)EffectType.Grayscale] = null; + m_effectParamsGrids[(int)EffectType.HueRotation] = HueRotationParams; + m_effectParamsGrids[(int)EffectType.Invert] = null; + m_effectParamsGrids[(int)EffectType.Saturation] = SaturationParams; + m_effectParamsGrids[(int)EffectType.Sepia] = SepiaParams; + m_effectParamsGrids[(int)EffectType.TemperatureAndTint] = TemperatureAndTintParams; + m_effectParamsGrids[(int)EffectType.Transform2D] = null; + + // Same as grids + m_effectBrushes = new CompositionBrush[(int)EffectType.NumEffectTypes]; + m_effectBrushes[(int)EffectType.NoEffect] = m_noEffectBrush; + m_effectBrushes[(int)EffectType.AlphaMask] = m_alphaMaskEffectBrush; + m_effectBrushes[(int)EffectType.Arithmetic] = m_arithmeticEffectBrush; + m_effectBrushes[(int)EffectType.Blend] = m_blendEffectBrushes[m_activeBlendMode]; + m_effectBrushes[(int)EffectType.ColorSource] = m_colorSourceEffectBrush; + m_effectBrushes[(int)EffectType.Contrast] = m_contrastEffectBrush; + m_effectBrushes[(int)EffectType.Exposure] = m_exposureEffectBrush; + m_effectBrushes[(int)EffectType.GammaTransfer] = m_gammaTransferEffectBrush; + m_effectBrushes[(int)EffectType.Grayscale] = m_grayscaleEffectBrush; + m_effectBrushes[(int)EffectType.HueRotation] = m_hueRotationEffectBrush; + m_effectBrushes[(int)EffectType.Invert] = m_invertEffectBrush; + m_effectBrushes[(int)EffectType.Saturation] = m_saturateEffectBrush; + m_effectBrushes[(int)EffectType.Sepia] = m_sepiaEffectBrushes[m_activeSepiaAlphaMode]; + m_effectBrushes[(int)EffectType.TemperatureAndTint] = m_temperatureAndTintEffectBrush; + m_effectBrushes[(int)EffectType.Transform2D] = m_transform2DEffectBrush; + + this.InitializeValues(); + } + + private void MainGridSizeChanged(object sender, SizeChangedEventArgs e) + { + if (m_sprite != null) + { + ResizeImage(e.NewSize); + } + } + + private void ResizeImage(Size windowSize) + { + double visibleWidth = windowSize.Width - EffectControls.Width; + double visibleHeight = windowSize.Height; + double newWidth = visibleWidth; + double newHeight = visibleHeight; + + newWidth = newHeight * m_imageAspectRatio; + if (newWidth > visibleWidth) + { + newWidth = visibleWidth; + newHeight = newWidth / m_imageAspectRatio; + } + + m_sprite.Offset = new Vector3( + (float)(EffectControls.Width + (visibleWidth - newWidth) / 2), + (float)((visibleHeight - newHeight) / 2), + 0.0f); + m_sprite.Size = new Vector2( + (float)newWidth, + (float)newHeight); + } + + string ChannelName(int index) + { + string channel; + switch (index) + { + case 0: + channel = "Red"; + break; + case 1: + channel = "Green"; + break; + case 2: + channel = "Blue"; + break; + default: + throw new InvalidOperationException(); + } + return channel; + } + + public EffectType ActiveEffectType + { + get + { + return m_activeEffectType; + } + set + { + m_activeEffectType = value; + + foreach (Grid paramsGrid in m_effectParamsGrids) + { + if (paramsGrid != null) + { + paramsGrid.Visibility = Visibility.Collapsed; + } + } + + Grid selectedParamsGrid = m_effectParamsGrids[(int)m_activeEffectType]; + if (selectedParamsGrid != null) + { + selectedParamsGrid.Visibility = Visibility.Visible; + } + + m_sprite.Brush = m_effectBrushes[(int)m_activeEffectType]; + + EffectControls.UpdateLayout(); + } + } + + public int ActiveBlendMode + { + get + { + return m_activeBlendMode; + } + set + { + m_activeBlendMode = value; + m_sprite.Brush = m_effectBrushes[(int)EffectType.Blend] + = m_blendEffectBrushes[m_activeBlendMode]; + } + } + + public int ActiveSepiaAlphaMode + { + get + { + return m_activeSepiaAlphaMode; + } + set + { + m_activeSepiaAlphaMode = value; + m_sprite.Brush = m_effectBrushes[(int)EffectType.Sepia] + = m_sepiaEffectBrushes[m_activeSepiaAlphaMode]; + } + } + + public IReadOnlyList SupportedBlendModes + { + get + { + return m_supportedBlendModes; + } + } + + private void OnArithmeticMultiplyValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_arithmeticEffectBrush.Properties.InsertScalar( + "effect.MultiplyAmount", + (float)(e.NewValue)); + } + + private void OnArithmeticSource1ValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_arithmeticEffectBrush.Properties.InsertScalar( + "effect.Source1Amount", + (float)(e.NewValue)); + } + + private void OnArithmeticSource2ValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_arithmeticEffectBrush.Properties.InsertScalar( + "effect.Source2Amount", + (float)(e.NewValue)); + } + + private void OnArithmeticOffsetValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_arithmeticEffectBrush.Properties.InsertScalar( + "effect.Offset", + (float)(e.NewValue)); + } + + private void OnColorSourceRedValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_colorSource.R = (byte)(e.NewValue * 255); + m_colorSourceEffectBrush.Properties.InsertColor( + "effect.Color", + m_colorSource); + } + + private void OnColorSourceGreenValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_colorSource.G = (byte)(e.NewValue * 255); + m_colorSourceEffectBrush.Properties.InsertColor( + "effect.Color", + m_colorSource); + } + + private void OnColorSourceBlueValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_colorSource.B = (byte)(e.NewValue * 255); + m_colorSourceEffectBrush.Properties.InsertColor( + "effect.Color", + m_colorSource); + } + + private void OnColorSourceAlphaValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_colorSource.A = (byte)(e.NewValue * 255); + m_colorSourceEffectBrush.Properties.InsertColor( + "effect.Color", + m_colorSource); + } + + private void OnContrastValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_contrastEffectBrush.Properties.InsertScalar( + "effect.Contrast", + (float)e.NewValue); + } + + private void OnExposureValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_exposureEffectBrush.Properties.InsertScalar( + "effect.Exposure", + (float)e.NewValue); + } + + private void OnGammaTransferChannelSelectorSelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (m_activeEffectType == EffectType.GammaTransfer) + { + m_sprite.Brush = m_gammaTransferEffectBrush; + } + } + + private void OnGammaAmplitudeValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_gammaTransferEffectBrush.Properties.InsertScalar( + "effect." + ChannelName(GammaTransferChannelSelector.SelectedIndex) + "Amplitude", + (float)(e.NewValue)); + } + + private void OnGammaExponentValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_gammaTransferEffectBrush.Properties.InsertScalar( + "effect." + ChannelName(GammaTransferChannelSelector.SelectedIndex) + "Exponent", + (float)(e.NewValue)); + } + + private void OnGammaOffsetValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_gammaTransferEffectBrush.Properties.InsertScalar( + "effect." + ChannelName(GammaTransferChannelSelector.SelectedIndex) + "Offset", + (float)(e.NewValue)); + } + + private void OnHueRotationValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_hueRotationEffectBrush.Properties.InsertScalar( + "effect.Angle", + (float)(e.NewValue * Math.PI * 2)); + } + + private void OnSaturationValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_saturateEffectBrush.Properties.InsertScalar( + "effect.Saturation", + (float)e.NewValue); + } + + private void OnSepiaValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_sepiaEffectBrushes[m_activeSepiaAlphaMode].Properties.InsertScalar( + "effect.Intensity", + (float)e.NewValue); + } + + private void OnTemperatureValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_temperatureAndTintEffectBrush.Properties.InsertScalar( + "effect.Temperature", + (float)e.NewValue); + } + + private void OnTintValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + m_temperatureAndTintEffectBrush.Properties.InsertScalar( + "effect.Tint", + (float)e.NewValue); + } + + private void OnAlphaMaskAnimationToggled(object sender, RoutedEventArgs e) + { + if (AlphaMaskAnimation.IsOn) + { + var propertySet = m_compositor.CreatePropertySet(); + propertySet.InsertScalar("Size", 0.0f); + + // An animation for scaling the mask + + var scaleAnimation = m_compositor.CreateScalarKeyFrameAnimation(); + var linearEasing = m_compositor.CreateLinearEasingFunction(); + scaleAnimation.InsertKeyFrame(0.0f, 0.0f, linearEasing); + scaleAnimation.InsertKeyFrame(0.4f, 1.0f, linearEasing); + scaleAnimation.InsertKeyFrame(0.6f, 1.0f, linearEasing); + scaleAnimation.InsertKeyFrame(1.0f, 0.0f, linearEasing); + scaleAnimation.Duration = TimeSpan.FromMilliseconds(5000); + scaleAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + propertySet.StartAnimation("Size", scaleAnimation); + + var transformExpression = m_compositor.CreateExpressionAnimation( + "Matrix3x2(Props.Size, 0, 0, Props.Size, 0, 0)"); + transformExpression.SetReferenceParameter("Props", propertySet); + m_alphaMaskEffectBrush.StartAnimation("MaskTransform.TransformMatrix", + transformExpression); + } + else + { + m_alphaMaskEffectBrush.StopAnimation("MaskTransform.TransformMatrix"); + } + } + + private void OnContrastAnimationToggled(object sender, RoutedEventArgs e) + { + if (ContrastAnimation.IsOn) + { + Contrast.IsEnabled = false; + + // Animates the contrast from 0 to 1 and back to 0 + + var animation = m_compositor.CreateScalarKeyFrameAnimation(); + animation.InsertExpressionKeyFrame(0.0f, "0.0f"); + animation.InsertExpressionKeyFrame(0.5f, "1.0f"); + animation.InsertExpressionKeyFrame(1.0f, "0.0f"); + animation.Duration = TimeSpan.FromMilliseconds(5000); + animation.IterationBehavior = AnimationIterationBehavior.Forever; + m_contrastEffectBrush.StartAnimation("effect.Contrast", animation); + } + else + { + m_contrastEffectBrush.StopAnimation("effect.Contrast"); + + Contrast.IsEnabled = true; + } + } + + private void OnExposureAnimationToggled(object sender, RoutedEventArgs e) + { + if (ExposureAnimation.IsOn) + { + Exposure.IsEnabled = false; + + var animation = m_compositor.CreateScalarKeyFrameAnimation(); + animation.InsertExpressionKeyFrame(0.0f, "0.0f"); + animation.InsertExpressionKeyFrame(0.5f, "1.0f"); + animation.InsertExpressionKeyFrame(1.0f, "0.0f"); + animation.Duration = TimeSpan.FromMilliseconds(5000); + animation.IterationBehavior = AnimationIterationBehavior.Forever; + m_exposureEffectBrush.StartAnimation("effect.Exposure", animation); + } + else + { + m_exposureEffectBrush.StopAnimation("effect.Exposure"); + + Exposure.IsEnabled = true; + } + } + + private void OnHueRotationAnimationToggled(object sender, RoutedEventArgs e) + { + if (HueRotationAnimation.IsOn) + { + HueRotation.IsEnabled = false; + + var animation = m_compositor.CreateScalarKeyFrameAnimation(); + animation.InsertExpressionKeyFrame(0.0f, "0.0f"); + animation.InsertExpressionKeyFrame(0.5f, "PI * 2"); + animation.InsertExpressionKeyFrame(1.0f, "0.0f"); + animation.Duration = TimeSpan.FromMilliseconds(5000); + animation.IterationBehavior = AnimationIterationBehavior.Forever; + m_hueRotationEffectBrush.StartAnimation("effect.Angle", animation); + } + else + { + m_hueRotationEffectBrush.StopAnimation("effect.Angle"); + + HueRotation.IsEnabled = true; + } + } + + private void OnSepiaAnimationToggled(object sender, RoutedEventArgs e) + { + if (SepiaAnimation.IsOn) + { + Sepia.IsEnabled = false; + + var animation = m_compositor.CreateScalarKeyFrameAnimation(); + animation.InsertExpressionKeyFrame(0.0f, "0.0f"); + animation.InsertExpressionKeyFrame(0.5f, "1.0f"); + animation.InsertExpressionKeyFrame(1.0f, "0.0f"); + animation.Duration = TimeSpan.FromMilliseconds(5000); + animation.IterationBehavior = AnimationIterationBehavior.Forever; + m_sepiaEffectBrushes[m_activeSepiaAlphaMode].StartAnimation( + "effect.Intensity", + animation); + } + else + { + m_sepiaEffectBrushes[m_activeSepiaAlphaMode].StopAnimation("effect.Intensity"); + + Sepia.IsEnabled = true; + } + } + + private void OnSaturationAnimationToggled(object sender, RoutedEventArgs e) + { + if (SaturationAnimation.IsOn) + { + Saturation.IsEnabled = false; + + var animation = m_compositor.CreateScalarKeyFrameAnimation(); + animation.InsertExpressionKeyFrame(0.0f, "0.0f"); + animation.InsertExpressionKeyFrame(0.5f, "1.0f"); + animation.InsertExpressionKeyFrame(1.0f, "0.0f"); + animation.Duration = TimeSpan.FromMilliseconds(5000); + animation.IterationBehavior = AnimationIterationBehavior.Forever; + m_saturateEffectBrush.StartAnimation("effect.Saturation", animation); + } + else + { + m_saturateEffectBrush.StopAnimation("effect.Saturation"); + + Saturation.IsEnabled = true; + } + } + + private Compositor m_compositor; + private ContainerVisual m_root; + private SpriteVisual m_sprite; + + private CompositionSurfaceBrush m_noEffectBrush; + private CompositionEffectBrush m_alphaMaskEffectBrush; + private CompositionEffectBrush m_arithmeticEffectBrush; + private CompositionEffectBrush[] m_blendEffectBrushes; + private CompositionEffectBrush m_colorSourceEffectBrush; + private CompositionEffectBrush m_contrastEffectBrush; + private CompositionEffectBrush m_exposureEffectBrush; + private CompositionEffectBrush m_grayscaleEffectBrush; + private CompositionEffectBrush m_gammaTransferEffectBrush; + private CompositionEffectBrush m_hueRotationEffectBrush; + private CompositionEffectBrush m_invertEffectBrush; + private CompositionEffectBrush m_saturateEffectBrush; + private CompositionEffectBrush[] m_sepiaEffectBrushes; + private CompositionEffectBrush m_temperatureAndTintEffectBrush; + private CompositionEffectBrush m_transform2DEffectBrush; + + private Color m_colorSource; + + private BlendEffectMode[] m_supportedBlendModes = new[] + { + BlendEffectMode.Multiply, + BlendEffectMode.Screen, + BlendEffectMode.Darken, + BlendEffectMode.Lighten, + BlendEffectMode.ColorBurn, + BlendEffectMode.LinearBurn, + BlendEffectMode.DarkerColor, + BlendEffectMode.LighterColor, + BlendEffectMode.ColorDodge, + BlendEffectMode.LinearDodge, + BlendEffectMode.Overlay, + BlendEffectMode.SoftLight, + BlendEffectMode.HardLight, + BlendEffectMode.VividLight, + BlendEffectMode.LinearLight, + BlendEffectMode.PinLight, + BlendEffectMode.HardMix, + BlendEffectMode.Difference, + BlendEffectMode.Exclusion, + BlendEffectMode.Subtract, + BlendEffectMode.Division + }; + + private Grid[] m_effectParamsGrids; + private CompositionBrush[] m_effectBrushes; + + private EffectType m_activeEffectType = EffectType.NoEffect; + private int m_activeBlendMode = 0; + private int m_activeSepiaAlphaMode = 0; + + private double m_imageAspectRatio; + } +} diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainWindow.xaml b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainWindow.xaml new file mode 100644 index 000000000..e2bdd3e64 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainWindow.xaml @@ -0,0 +1,11 @@ + + + + diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainWindow.xaml.cs b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainWindow.xaml.cs new file mode 100644 index 000000000..ebfc55cb1 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/MainWindow.xaml.cs @@ -0,0 +1,46 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Foundation; +using Windows.Foundation.Collections; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace EffectEditor +{ + /// + /// An empty window that can be used on its own or navigated to within a Frame. + /// + public sealed partial class MainWindow : Window + { + public MainWindow() + { + this.InitializeComponent(); + this.Title = "Effect Editor - Windows App SDK"; + } + } +} diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Properties/PublishProfiles/win-arm64.pubxml b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Properties/PublishProfiles/win-arm64.pubxml new file mode 100644 index 000000000..08b5300d8 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Properties/PublishProfiles/win-arm64.pubxml @@ -0,0 +1,19 @@ + + + + + FileSystem + arm64 + win-arm64 + bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ + true + False + True + + + \ No newline at end of file diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Properties/PublishProfiles/win-x64.pubxml b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Properties/PublishProfiles/win-x64.pubxml new file mode 100644 index 000000000..dcdbaed60 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Properties/PublishProfiles/win-x64.pubxml @@ -0,0 +1,19 @@ + + + + + FileSystem + x64 + win-x64 + bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ + true + False + True + + + \ No newline at end of file diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Properties/PublishProfiles/win-x86.pubxml b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Properties/PublishProfiles/win-x86.pubxml new file mode 100644 index 000000000..cf7e029c0 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/Properties/PublishProfiles/win-x86.pubxml @@ -0,0 +1,19 @@ + + + + + FileSystem + x86 + win-x86 + bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ + true + False + True + + + \ No newline at end of file diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/app.manifest b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/app.manifest new file mode 100644 index 000000000..55cb58f36 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorApp/app.manifest @@ -0,0 +1,15 @@ + + + + + + + + true/PM + PerMonitorV2, PerMonitor + + + diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/EffectEditorPackage.wapproj b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/EffectEditorPackage.wapproj new file mode 100644 index 000000000..046bb2981 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/EffectEditorPackage.wapproj @@ -0,0 +1,62 @@ + + + + 15.0 + + + + Debug + x86 + + + Release + x86 + + + Debug + x64 + + + Release + x64 + + + Debug + arm64 + + + Release + arm64 + + + + $(MSBuildExtensionsPath)\Microsoft\DesktopBridge\ + + + 4e5e4821-d14b-451b-b4a0-9c0a872f4a25 + 10.0.19041.0 + 10.0.17763.0 + en-US + false + ..\EffectEditorApp\EffectEditorApp.csproj + + + + Designer + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/LockScreenLogo.scale-200.png b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/LockScreenLogo.scale-200.png new file mode 100644 index 000000000..7440f0d4b Binary files /dev/null and b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/LockScreenLogo.scale-200.png differ diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/SplashScreen.scale-200.png b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/SplashScreen.scale-200.png new file mode 100644 index 000000000..32f486a86 Binary files /dev/null and b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/SplashScreen.scale-200.png differ diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Square150x150Logo.scale-200.png b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Square150x150Logo.scale-200.png new file mode 100644 index 000000000..53ee3777e Binary files /dev/null and b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Square150x150Logo.scale-200.png differ diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Square44x44Logo.scale-200.png b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Square44x44Logo.scale-200.png new file mode 100644 index 000000000..f713bba67 Binary files /dev/null and b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Square44x44Logo.scale-200.png differ diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Square44x44Logo.targetsize-24_altform-unplated.png b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 000000000..dc9f5bea0 Binary files /dev/null and b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Square44x44Logo.targetsize-24_altform-unplated.png differ diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/StoreLogo.png b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/StoreLogo.png new file mode 100644 index 000000000..a4586f26b Binary files /dev/null and b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/StoreLogo.png differ diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Wide310x150Logo.scale-200.png b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Wide310x150Logo.scale-200.png new file mode 100644 index 000000000..8b4a5d0dd Binary files /dev/null and b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Images/Wide310x150Logo.scale-200.png differ diff --git a/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Package.appxmanifest b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Package.appxmanifest new file mode 100644 index 000000000..4d32101f8 --- /dev/null +++ b/Samples/SceneGraph/Demos/EffectEditor/EffectEditorPackage/Package.appxmanifest @@ -0,0 +1,48 @@ + + + + + + + + EffectEditorPackage + getrou + Images\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/App.xaml b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/App.xaml new file mode 100644 index 000000000..e98a5b37d --- /dev/null +++ b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/App.xaml @@ -0,0 +1,97 @@ + + + + + + + + + + + + diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/App.xaml.cs b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/App.xaml.cs new file mode 100644 index 000000000..325250ff6 --- /dev/null +++ b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/App.xaml.cs @@ -0,0 +1,65 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using Microsoft.UI.Xaml.Shapes; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.Foundation; +using Windows.Foundation.Collections; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace MaterialCreator +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + public partial class App : Application + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + this.InitializeComponent(); + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used such as when the application is launched to open a specific file. + /// + /// Details about the launch request and process. + protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) + { + m_window = new MainWindow(); + m_window.Activate(); + } + + private Window m_window; + } +} diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/Aurora.jpg b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/Aurora.jpg new file mode 100644 index 000000000..c97845eb7 Binary files /dev/null and b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/Aurora.jpg differ diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/City.jpg b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/City.jpg new file mode 100644 index 000000000..a87cdf613 Binary files /dev/null and b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/City.jpg differ diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/Ferns.jpg b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/Ferns.jpg new file mode 100644 index 000000000..0bf7e81f4 Binary files /dev/null and b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/Ferns.jpg differ diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/Lake.jpg b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/Lake.jpg new file mode 100644 index 000000000..49668e35e Binary files /dev/null and b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/Lake.jpg differ diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/MatMDL2.ttf b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/MatMDL2.ttf new file mode 100644 index 000000000..6496b71a6 Binary files /dev/null and b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/MatMDL2.ttf differ diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/SwatchCheckerboard.png b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/SwatchCheckerboard.png new file mode 100644 index 000000000..1f2e600ed Binary files /dev/null and b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Assets/SwatchCheckerboard.png differ diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Controls/EditEffectControl.xaml b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Controls/EditEffectControl.xaml new file mode 100644 index 000000000..6d32f4e71 --- /dev/null +++ b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Controls/EditEffectControl.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Controls/EditEffectControl.xaml.cs b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Controls/EditEffectControl.xaml.cs new file mode 100644 index 000000000..e7a1a7acf --- /dev/null +++ b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Controls/EditEffectControl.xaml.cs @@ -0,0 +1,73 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Xaml.Controls; +using System; +using System.Diagnostics; +using System.Reflection; + +namespace MaterialCreator +{ + public sealed partial class EditEffectControl : UserControl + { + Effect _effect; + + public EditEffectControl() + { + this.InitializeComponent(); + } + + public void Initialize(Effect effect) + { + Debug.Assert(effect != null); + _effect = effect; + + ComboBoxItem item; + foreach (Type effectType in Effect.SupportedEffectTypes) + { + item = new ComboBoxItem(); + item.Tag = effectType; + item.Content = effectType.Name.ToString(); + item.IsSelected = effectType.Name == _effect.EffectType.Name; + EffectType.Items.Add(item); + } + + UpdateEffectProperties(); + } + + void UpdateEffectProperties() + { + Type effectType = (Type)EffectType.SelectedValue; + + EffectPropertyPanel.Children.Clear(); + + foreach (PropertyInfo info in effectType.GetProperties()) + { + if (Helpers.SkipProperty(info.Name)) + { + continue; + } + + Helpers.AddPropertyToPanel(_effect.GraphicsEffect, _effect, EffectPropertyPanel, info); + } + } + + private void EffectType_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + _effect.EffectType = (Type)EffectType.SelectedValue; + + UpdateEffectProperties(); + } + } +} diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Controls/EditLayerControl.xaml b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Controls/EditLayerControl.xaml new file mode 100644 index 000000000..17a7f6531 --- /dev/null +++ b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Controls/EditLayerControl.xaml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Dialogs/ThreeButtonDialog.xaml.cs b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Dialogs/ThreeButtonDialog.xaml.cs new file mode 100644 index 000000000..56d94c59b --- /dev/null +++ b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Dialogs/ThreeButtonDialog.xaml.cs @@ -0,0 +1,60 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace MaterialCreator +{ + public sealed partial class ThreeButtonDialog : ContentDialog + { + public enum ThreeButtonDialogResult + { + FirstButton, + SecondButton, + TernaryButton + } + + public ThreeButtonDialog() + { + this.InitializeComponent(); + this.DataContext = this; + } + + public string Message { get; set; } + public string FirstButtonText { get; set; } + public string SecondButtonText { get; set; } + public string ThirdButtonText { get; set; } + + public ThreeButtonDialogResult Result { get; private set; } + + private void PrimaryButton_Click(object sender, RoutedEventArgs e) + { + Result = ThreeButtonDialogResult.FirstButton; + Hide(); + } + + private void SecondaryButton_Click(object sender, RoutedEventArgs e) + { + Result = ThreeButtonDialogResult.SecondButton; + Hide(); + } + + private void TernaryButton_Click(object sender, RoutedEventArgs e) + { + Result = ThreeButtonDialogResult.TernaryButton; + Hide(); + } + } +} diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Dialogs/ViewEffectDialog.xaml b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Dialogs/ViewEffectDialog.xaml new file mode 100644 index 000000000..d810cee6d --- /dev/null +++ b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Dialogs/ViewEffectDialog.xaml @@ -0,0 +1,16 @@ + + + + + + diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Dialogs/ViewEffectDialog.xaml.cs b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Dialogs/ViewEffectDialog.xaml.cs new file mode 100644 index 000000000..b4bb7775b --- /dev/null +++ b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/Dialogs/ViewEffectDialog.xaml.cs @@ -0,0 +1,36 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Xaml.Controls; + + +namespace MaterialCreator +{ + public sealed partial class ViewEffectDialog : ContentDialog + { + public ViewEffectDialog() + { + this.InitializeComponent(); + } + + private void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + } + + public string EffectText + { + get; set; + } + } +} diff --git a/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/MainPage.xaml b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/MainPage.xaml new file mode 100644 index 000000000..9be8ac9dc --- /dev/null +++ b/Samples/SceneGraph/Demos/MaterialCreator/MaterialCreatorApp/MainPage.xaml @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BackDropSample/BackDropSample.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/BackDropSample/BackDropSample.cs new file mode 100644 index 000000000..2e2ad2ba4 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BackDropSample/BackDropSample.cs @@ -0,0 +1,57 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using SamplesCommon; + +using System; + +using Microsoft.UI; +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery +{ + public sealed partial class BackDropSample : SamplePage + { + public BackDropSample() + { + this.InitializeComponent(); + + var compositor = backDrop.VisualProperties.Compositor; + var blurAnim = compositor.CreateScalarKeyFrameAnimation(); + blurAnim.Duration = TimeSpan.FromSeconds(10); + blurAnim.InsertKeyFrame(0.0f, 0); + blurAnim.InsertKeyFrame(0.5f, (float)backDrop.BlurAmount); // animate around the specified value + blurAnim.InsertKeyFrame(1.0f, 0); + blurAnim.IterationBehavior = AnimationIterationBehavior.Forever; + + backDrop.VisualProperties.StartAnimation(BackDrop.BlurAmountProperty, blurAnim); + + var colorAnim = compositor.CreateColorKeyFrameAnimation(); + var linearEasing = compositor.CreateLinearEasingFunction(); + colorAnim.Duration = TimeSpan.FromSeconds(5); + colorAnim.InsertKeyFrame(0.0f, Colors.Transparent, linearEasing); + colorAnim.InsertKeyFrame(0.05f, backDrop.TintColor, linearEasing); + colorAnim.InsertKeyFrame(1.0f, Colors.Transparent, linearEasing); + colorAnim.IterationBehavior = AnimationIterationBehavior.Forever; + + backDrop.VisualProperties.StartAnimation(BackDrop.TintColorProperty, colorAnim); + } + + public static string StaticSampleName => "BackDrop Control Sample"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to create your own custom BackDrop UserControl that provides Blur and Tint properties that can be animated with Composition Animations."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868994"; + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BackDropSample/BackDropSample.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/BackDropSample/BackDropSample.xaml new file mode 100644 index 000000000..8ebeec13f --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BackDropSample/BackDropSample.xaml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BasicLayoutAndTransforms/BasicLayoutAndTransforms.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/BasicLayoutAndTransforms/BasicLayoutAndTransforms.xaml new file mode 100644 index 000000000..ebbff61a5 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BasicLayoutAndTransforms/BasicLayoutAndTransforms.xaml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BasicLayoutAndTransforms/BasicLayoutAndTransforms.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/BasicLayoutAndTransforms/BasicLayoutAndTransforms.xaml.cs new file mode 100644 index 000000000..df188dcfd --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BasicLayoutAndTransforms/BasicLayoutAndTransforms.xaml.cs @@ -0,0 +1,140 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System.Numerics; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Hosting; +using System.Collections.Generic; + +namespace CompositionSampleGallery +{ + public sealed partial class BasicLayoutAndTransforms : SamplePage + { + private Visual _xamlRoot; + private Compositor _compositor; + private ContainerVisual _root; + private ContainerVisual _indicatorContainer; + private SpriteVisual _mainImage; + private SpriteVisual _apIndicator; + private SpriteVisual _cpIndicator; + + public BasicLayoutAndTransforms() + { + this.InitializeComponent(); + } + + public static string StaticSampleName => "Basic Layout and Transforms"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Adjust the sliders to see how CenterPoint and AnchorPoint affect positioning and transforms"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868942"; + + private void SamplePage_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + // Acquire Compositor and set up basic visual tree structure + _xamlRoot = ElementCompositionPreview.GetElementVisual(MainGrid); + _compositor = _xamlRoot.Compositor; + _root = _compositor.CreateContainerVisual(); + _mainImage = Image.SpriteVisual; + + ElementCompositionPreview.SetElementChildVisual(ImageContainer, _root); + _root.Children.InsertAtTop(_mainImage); + + + // Add visual indicators to show the position of AnchorPoint and CenterPoint + _indicatorContainer = _compositor.CreateContainerVisual(); + + _apIndicator = _compositor.CreateSpriteVisual(); + _apIndicator.Size = new Vector2(10, 10); + _apIndicator.AnchorPoint = new Vector2(0.5f, 0.5f); + _apIndicator.Brush = _compositor.CreateColorBrush(Microsoft.UI.Colors.Red); + + _cpIndicator = _compositor.CreateSpriteVisual(); + _cpIndicator.Size = new Vector2(10, 10); + _cpIndicator.AnchorPoint = new Vector2(0.5f, 0.5f); + _cpIndicator.Brush = _compositor.CreateColorBrush(Microsoft.UI.Colors.Green); + + _root.Children.InsertAtTop(_indicatorContainer); + _indicatorContainer.Children.InsertAtTop(_cpIndicator); + _indicatorContainer.Children.InsertAtTop(_apIndicator); + + + // Specify a clip to prevent image from overflowing into the sliders list + Visual containerGrid = ElementCompositionPreview.GetElementVisual(ContentGrid); + containerGrid.Size = new Vector2((float)ContentGrid.ActualWidth, (float)ContentGrid.ActualHeight); + ContentGrid.SizeChanged += (s, a) => + { + containerGrid.Size = new Vector2((float)ContentGrid.ActualWidth, (float)ContentGrid.ActualHeight); + }; + containerGrid.Clip = _compositor.CreateInsetClip(); + + + // Create list of properties to add as sliders + var list = new List(); + list.Add(new TransformPropertyModel(AnchorPointXAction) { PropertyName = "AnchorPoint - X (Red)", MinValue = -1, MaxValue = 2, StepFrequency = 0.01f, Value = _mainImage.AnchorPoint.X }); + list.Add(new TransformPropertyModel(AnchorPointYAction) { PropertyName = "AnchorPoint - Y (Red)", MinValue = -1, MaxValue = 2, StepFrequency = 0.01f, Value = _mainImage.AnchorPoint.Y }); + list.Add(new TransformPropertyModel(CenterPointXAction) { PropertyName = "CenterPoint - X (Green)", MinValue = -600, MaxValue = 600, StepFrequency = 1f, Value = _mainImage.CenterPoint.X }); + list.Add(new TransformPropertyModel(CenterPointYAction) { PropertyName = "CenterPoint - Y (Green)", MinValue = -600, MaxValue = 600, StepFrequency = 1f, Value = _mainImage.CenterPoint.Y }); + list.Add(new TransformPropertyModel(RotationAction) { PropertyName = "Rotation (in Degrees)", MinValue = 0, MaxValue = 360, StepFrequency = 1f, Value = _mainImage.RotationAngleInDegrees }); + list.Add(new TransformPropertyModel(ScaleXAction) { PropertyName = "Scale - X", MinValue = 0, MaxValue = 3, StepFrequency = 0.01f, Value = _mainImage.Scale.X }); + list.Add(new TransformPropertyModel(ScaleYAction) { PropertyName = "Scale - Y", MinValue = 0, MaxValue = 3, StepFrequency = 0.01f, Value = _mainImage.Scale.Y }); + list.Add(new TransformPropertyModel(OffsetXAction) { PropertyName = "Offset - X", MinValue = -200, MaxValue = 200, StepFrequency = 1f, Value = _mainImage.Offset.X }); + list.Add(new TransformPropertyModel(OffsetYAction) { PropertyName = "Offset - Y", MinValue = -200, MaxValue = 200, StepFrequency = 1f, Value = _mainImage.Offset.Y }); + + XamlItemsControl.ItemsSource = list; + + } + + private void AnchorPointXAction(float value) + { + _mainImage.AnchorPoint = new Vector2(value, _mainImage.AnchorPoint.Y); + } + private void AnchorPointYAction(float value) + { + _mainImage.AnchorPoint = new Vector2(_mainImage.AnchorPoint.X, value); + } + private void CenterPointXAction(float value) + { + _mainImage.CenterPoint = new Vector3(value, _mainImage.CenterPoint.Y, _mainImage.CenterPoint.Z); + _cpIndicator.Offset = _mainImage.CenterPoint; + } + private void CenterPointYAction(float value) + { + _mainImage.CenterPoint = new Vector3(_mainImage.CenterPoint.X, value, _mainImage.CenterPoint.Z); + _cpIndicator.Offset = _mainImage.CenterPoint; + } + private void RotationAction(float value) + { + _mainImage.RotationAngleInDegrees = value; + } + private void ScaleXAction(float value) + { + _mainImage.Scale = new Vector3(value, _mainImage.Scale.Y, 0); + } + private void ScaleYAction(float value) + { + _mainImage.Scale = new Vector3(_mainImage.Scale.X, value, 0); + } + private void OffsetXAction(float value) + { + _mainImage.Offset = new Vector3((float)value, _mainImage.Offset.Y, _mainImage.Offset.Z); + _indicatorContainer.Offset = _mainImage.Offset; + } + private void OffsetYAction(float value) + { + _mainImage.Offset = new Vector3(_mainImage.Offset.X, (float)value, _mainImage.Offset.Z); + _indicatorContainer.Offset = _mainImage.Offset; + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BasicLayoutAndTransforms/TransformPropertyModel.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/BasicLayoutAndTransforms/TransformPropertyModel.cs new file mode 100644 index 000000000..720aa22df --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BasicLayoutAndTransforms/TransformPropertyModel.cs @@ -0,0 +1,58 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery +{ + class TransformPropertyModel : INotifyPropertyChanged + { + private float _value; + private Action _action; + + public string PropertyName { get; set; } + public float MinValue { get; set; } + public float MaxValue { get; set; } + public float StepFrequency { get; set; } + public float Value + { + get { return _value; } + set + { + _value = value; + _action(_value); + OnPropertyChanged(); + } + } + + public TransformPropertyModel(Action action) + { + _action = action; + } + + public event PropertyChangedEventHandler PropertyChanged; + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChangedEventHandler handler = PropertyChanged; + if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BasicXamlInterop/BasicXamlInterop.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/BasicXamlInterop/BasicXamlInterop.xaml new file mode 100644 index 000000000..323db4f2e --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BasicXamlInterop/BasicXamlInterop.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BasicXamlInterop/BasicXamlInterop.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/BasicXamlInterop/BasicXamlInterop.xaml.cs new file mode 100644 index 000000000..0395777e5 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BasicXamlInterop/BasicXamlInterop.xaml.cs @@ -0,0 +1,131 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Linq; +using System.Numerics; +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; + +namespace CompositionSampleGallery +{ + public sealed partial class BasicXamlInterop : SamplePage + { + private ContainerVisual _container2; + + public BasicXamlInterop() + { + this.InitializeComponent(); + } + + public static string StaticSampleName => "Basic Xaml Interop"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how obtain a Windows.UI.Composition Compositor instance using Windows.UI.Xaml.Hosting to create CompositionObjects in a Windows.UI.Xaml based application."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761160"; + + private void SamplePage_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + // + // Example 1 - Animate a tree of XAML content. ElementCompositionPreview.GetElementVisual() + // returns the Visual which contains all Visual children under the target + // UIElement including that UIELement's Visuals. The returned Visual + // can be used to manipulate the XAML tree, but you cannot add to or modify + // the Visual tree. + // + + Visual visual = ElementCompositionPreview.GetElementVisual(TextBlock1); + Compositor compositor = visual.Compositor; + + // Apply a simple animation to the XAML content + var animation = compositor.CreateVector3KeyFrameAnimation(); + animation.InsertKeyFrame(0.5f, new Vector3(100, 0, 0)); + animation.InsertKeyFrame(1.0f, new Vector3(0, 0, 0)); + animation.Duration = TimeSpan.FromMilliseconds(4000); + animation.IterationBehavior = AnimationIterationBehavior.Forever; + visual.StartAnimation("Offset", animation); + + + // + // Example 2 - Add some Windows.UI.Composition content to the XAML tree. + // ElementCompositionPreview.SetElementChildVisual() sets a Windows.UI.Composition + // Visual as the child of the target UIElement. You can use this Visual as the + // basis for creating a tree of Windows.UI.Composition content under the target + // UIElement in the tree. + // + + ContainerVisual container = compositor.CreateContainerVisual(); + ElementCompositionPreview.SetElementChildVisual(TextBlock2, container); + + // Add some solid color sprites under the container. + SpriteVisual redSprite = compositor.CreateSpriteVisual(); + redSprite.Brush = compositor.CreateColorBrush(Colors.Red); + redSprite.Size = new Vector2(100f, 100f); + redSprite.Offset = new Vector3(0f, (float)TextBlock2.RenderSize.Height, 0f); + container.Children.InsertAtTop(redSprite); + + SpriteVisual blueSprite = compositor.CreateSpriteVisual(); + blueSprite.Brush = compositor.CreateColorBrush(Colors.Blue); + blueSprite.Size = new Vector2(100f, 100f); + blueSprite.Offset = new Vector3(100f, (float)TextBlock2.RenderSize.Height, 0f); + container.Children.InsertAtTop(blueSprite); + + // Start the same animation + container.StartAnimation("Offset", animation); + + + // + // Example 3 - Add some Windows.UI.Composition content to the XAML tree and modify their tree order. + // + + _container2 = compositor.CreateContainerVisual(); + ElementCompositionPreview.SetElementChildVisual(TextBlock3, _container2); + _container2.Offset = new Vector3(0, 50f, 0f); + + // Add some solid color sprites under the container. + SpriteVisual orangeSprite = compositor.CreateSpriteVisual(); + orangeSprite.Brush = compositor.CreateColorBrush(Colors.Orange); + orangeSprite.Size = new Vector2(100f, 100f); + orangeSprite.Offset = new Vector3(0f, 0f, 0f); + _container2.Children.InsertAtTop(orangeSprite); + + SpriteVisual greenSprite = compositor.CreateSpriteVisual(); + greenSprite.Brush = compositor.CreateColorBrush(Colors.Green); + greenSprite.Size = new Vector2(100f, 100f); + greenSprite.Offset = new Vector3(50f, 0f, 0f); + _container2.Children.InsertAtTop(greenSprite); + + SpriteVisual purpleSprite = compositor.CreateSpriteVisual(); + purpleSprite.Brush = compositor.CreateColorBrush(Colors.Purple); + purpleSprite.Size = new Vector2(100f, 100f); + purpleSprite.Offset = new Vector3(100f, 0f, 0f); + _container2.Children.InsertAtTop(purpleSprite); + + // Start a timer, when it fires rearrange the sprites in the tree. + DispatcherTimer timer = new DispatcherTimer(); + timer.Tick += Timer_Tick; + timer.Interval = new TimeSpan(0, 0, 1); + timer.Start(); + } + + private void Timer_Tick(object sender, object e) + { + var child = _container2.Children.FirstOrDefault(); + _container2.Children.Remove(child); + _container2.Children.InsertAtTop(child); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BlurPlayground/BlurPlayground.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/BlurPlayground/BlurPlayground.cs new file mode 100644 index 000000000..bd8b55a63 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BlurPlayground/BlurPlayground.cs @@ -0,0 +1,177 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.Graphics.Canvas.Effects; +using SamplesCommon; +using System; +using System.Collections.Generic; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Hosting; +using System.Numerics; +using Windows.Foundation; + +namespace CompositionSampleGallery +{ + public sealed partial class BlurPlayground : SamplePage + { + private CompositionEffectBrush _brush; + private Compositor _compositor; + + public BlurPlayground() + { + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + this.InitializeComponent(); + } + + public static string StaticSampleName => "Blur Playground"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "This is a place to play around with different blur and blend recipes"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868995"; + + private void Page_Loaded(object sender, RoutedEventArgs e) + { + // Populate the BlendEffectMode combobox + IList blendList = new List(); + + foreach (BlendEffectMode type in Enum.GetValues(typeof(BlendEffectMode))) + { + // Exclude unsupported types + if (type != BlendEffectMode.Dissolve && + type != BlendEffectMode.Saturation && + type != BlendEffectMode.Color && + type != BlendEffectMode.Hue && + type != BlendEffectMode.Luminosity + ) + { + ComboBoxItem item = new ComboBoxItem(); + item.Tag = type; + item.Content = type.ToString(); + blendList.Add(item); + } + } + + BlendSelection.ItemsSource = blendList; + BlendSelection.SelectedIndex = 0; + + LandscapeTrigger.SizeChanged(new Size(this.ActualSize.X, this.ActualSize.Y)); + PortraitTrigger.SizeChanged(new Size(this.ActualSize.X, this.ActualSize.Y)); + this.SizeChanged += BlurPlayground_SizeChanged; + } + + private void BlurPlayground_SizeChanged(object sender, SizeChangedEventArgs e) + { + LandscapeTrigger.SizeChanged(e.NewSize); + PortraitTrigger.SizeChanged(e.NewSize); + } + + private void BlendSelection_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + ComboBoxItem item = BlendSelection.SelectedValue as ComboBoxItem; + BlendEffectMode blendmode = (BlendEffectMode)item.Tag; + + // Create a chained effect graph using a BlendEffect, blending color and blur + var graphicsEffect = new BlendEffect + { + Mode = blendmode, + Background = new ColorSourceEffect() + { + Name = "Tint", + Color = Tint.Color, + }, + + Foreground = new GaussianBlurEffect() + { + Name = "Blur", + Source = new CompositionEffectSourceParameter("ImageSource"), + BlurAmount = (float)BlurAmount.Value, + BorderMode = EffectBorderMode.Hard, + } + }; + + + var blurEffectFactory = _compositor.CreateEffectFactory(graphicsEffect, + new[] { "Blur.BlurAmount", "Tint.Color" }); + + // Create EffectBrush to be painted on CompositionImage Control’s SpriteVisual + _brush = blurEffectFactory.CreateBrush(); + _brush.SetSourceParameter("ImageSource", CatImage.SurfaceBrush); + CatImage.Brush = _brush; + + //If the animation is running, restart it on the new brush + if (AnimateToggle.IsOn) + { + StartBlurAnimation(); + } + + } + private void BlurAmount_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + // Get slider value + var blur_amount = (float)e.NewValue; + + // Set new BlurAmount + _brush.Properties.InsertScalar("Blur.BlurAmount", blur_amount); + } + + + private void isEnabled (object sender, RangeBaseValueChangedEventArgs e) + { + _brush.StopAnimation("Blur.BlurAmount"); + } + + private void ColorChanged(object sender, ColorEventArgs e) + { + if (_brush != null) + { + // Get color value + _brush.Properties.InsertColor("Tint.Color", e.NewColor); + } + } + + private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e) + { + if (AnimateToggle.IsOn) + { + StartBlurAnimation(); + BlurAmount.IsEnabled = false; + } + else + { + _brush.StopAnimation("Blur.BlurAmount"); + BlurAmount.IsEnabled = true; + BlurAmount.Value = 0; + _brush.Properties.InsertScalar("Blur.BlurAmount", 0); + + + + } + } + + private void StartBlurAnimation() + { + ScalarKeyFrameAnimation blurAnimation = _compositor.CreateScalarKeyFrameAnimation(); + blurAnimation.InsertKeyFrame(0.0f, 0.0f); + blurAnimation.InsertKeyFrame(0.5f, 100.0f); + blurAnimation.InsertKeyFrame(1.0f, 0.0f); + blurAnimation.Duration = TimeSpan.FromSeconds(4); + blurAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + _brush.StartAnimation("Blur.BlurAmount", blurAnimation); + } + } + } diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BlurPlayground/BlurPlayground.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/BlurPlayground/BlurPlayground.xaml new file mode 100644 index 000000000..7c747f342 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BlurPlayground/BlurPlayground.xaml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BorderPlayground/BorderPlayground.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/BorderPlayground/BorderPlayground.xaml new file mode 100644 index 000000000..1dad577ff --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BorderPlayground/BorderPlayground.xaml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BorderPlayground/BorderPlayground.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/BorderPlayground/BorderPlayground.xaml.cs new file mode 100644 index 000000000..b653480fe --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BorderPlayground/BorderPlayground.xaml.cs @@ -0,0 +1,178 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.Graphics.Canvas; +using Microsoft.Graphics.Canvas.Effects; + +using SamplesCommon; + +using System; +using System.Collections.Generic; +using System.Numerics; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Media.Imaging; + +namespace CompositionSampleGallery +{ + public sealed partial class BorderPlayground : SamplePage + { + private Compositor _compositor; + private SpriteVisual _sprite; + private ManagedSurface _image; + + enum ImageName + { + Checkerboard, + Flower + } + + public BorderPlayground() + { + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + + this.InitializeComponent(); + } + + public static string StaticSampleName => "Border Effect"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrate different border modes with scaling, offset, and rotation."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868944"; + + private void Page_Loaded(object sender, RoutedEventArgs e) + { + _sprite = _compositor.CreateSpriteVisual(); + _sprite.Size = new Vector2((float)BorderImage.ActualWidth, (float)BorderImage.ActualHeight); + ElementCompositionPreview.SetElementChildVisual(BorderImage, _sprite); + + IList imageList = new List(); + SetComboBoxList(imageList); + ImageSelector.ItemsSource = imageList; + ImageSelector.SelectedIndex = 0; + + IList extendXList = new List(); + SetComboBoxList(extendXList); + ExtendXBox.ItemsSource = extendXList; + ExtendXBox.SelectedIndex = 0; + + IList extendYList = new List(); + SetComboBoxList(extendYList); + ExtendYBox.ItemsSource = extendYList; + ExtendYBox.SelectedIndex = 0; + } + + private void Page_Unloaded(object sender, RoutedEventArgs e) + { + if (_image != null) + { + _image.Dispose(); + _image = null; + } + } + private void SetImageBrush(string uri) + { + // Update the sprite + _image = ImageLoader.Instance.LoadFromUri(new Uri(uri)); + UpdateImageBrush(); + + // Update the preview image + BitmapImage image = new BitmapImage(new Uri(uri)); + ImagePreview.Source = image; + } + + private void SetComboBoxList(IList list) + { + foreach (T type in Enum.GetValues(typeof(T))) + { + ComboBoxItem item = new ComboBoxItem(); + item.Tag = type; + item.Content = type.ToString(); + list.Add(item); + } + } + + private void Extend_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + UpdateBorderEffectBrush(); + } + + private void UpdateBorderEffectBrush() + { + ComboBoxItem itemX = ExtendXBox.SelectedValue as ComboBoxItem; + ComboBoxItem itemY = ExtendYBox.SelectedValue as ComboBoxItem; + + if (itemX == null || itemY == null) + { + return; + } + + var borderEffect = new BorderEffect + { + ExtendX = (CanvasEdgeBehavior)itemX.Tag, + ExtendY = (CanvasEdgeBehavior)itemY.Tag, + Source = new CompositionEffectSourceParameter("source") + }; + + var brush = _compositor.CreateEffectFactory(borderEffect).CreateBrush(); + brush.SetSourceParameter("source", _image.Brush); + _sprite.Brush = brush; + } + + private void ImageSelector_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + ComboBoxItem image = ImageSelector.SelectedValue as ComboBoxItem; + + switch ((ImageName)image.Tag) + { + case ImageName.Checkerboard: + SetImageBrush("ms-appx:///Assets/Other/Checkerboard.png"); + break; + case ImageName.Flower: + SetImageBrush("ms-appx:///Assets/Nature/Nature-5.jpg"); + break; + } + + UpdateBorderEffectBrush(); + } + + void UpdateImageBrush() + { + _image.Brush.Scale = new Vector2((float)ScaleX.Value, (float)ScaleY.Value); + _image.Brush.Offset = new Vector2((float)OffsetX.Value, (float)OffsetY.Value); + _image.Brush.RotationAngleInDegrees = (float)RenderRotation.Value; + _image.Brush.Stretch = CompositionStretch.None; + _image.Brush.CenterPoint = new Vector2(_sprite.Size.X / 2f, _sprite.Size.Y / 2f); + } + + private void Slider_ValueChanged(object sender, Microsoft.UI.Xaml.Controls.Primitives.RangeBaseValueChangedEventArgs e) + { + if (_image != null) + { + UpdateImageBrush(); + } + } + + private void BorderImage_SizeChanged(object sender, SizeChangedEventArgs e) + { + if (_sprite != null) + { + _sprite.Size = e.NewSize.ToVector2(); + } + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/BackdropTintBlurBrush.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/BackdropTintBlurBrush.cs new file mode 100644 index 000000000..fe42873af --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/BackdropTintBlurBrush.cs @@ -0,0 +1,90 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Media; +using Microsoft.Graphics.Canvas.Effects; + +namespace CompositionSampleGallery.Samples.BrushInterop +{ + class BackdropTintBlurBrush : XamlCompositionBrushBase + { + protected override void OnConnected() + { + Compositor compositor = CompositionTarget.GetCompositorForCurrentThread(); + // CompositionCapabilities: Are Effects supported? + var capabilities = new CompositionCapabilities(); + bool usingFallback = !capabilities.AreEffectsSupported(); + if (usingFallback) + { + // If Effects are not supported, use Fallback Solid Color + CompositionBrush = compositor.CreateColorBrush(FallbackColor); + return; + } + + + // Define Effect graph + var graphicsEffect = new BlendEffect + { + Mode = BlendEffectMode.LinearBurn, + Background = new ColorSourceEffect() + { + Name = "Tint", + Color = Microsoft.UI.Colors.Silver, + }, + Foreground = new GaussianBlurEffect() + { + Name = "Blur", + Source = new CompositionEffectSourceParameter("Backdrop"), + BlurAmount = 0, + BorderMode = EffectBorderMode.Hard, + } + }; + + // Create EffectFactory and EffectBrush + CompositionEffectFactory effectFactory = compositor.CreateEffectFactory(graphicsEffect, new[] { "Blur.BlurAmount" }); + CompositionEffectBrush effectBrush = effectFactory.CreateBrush(); + + // Create BackdropBrush + CompositionBackdropBrush backdrop = compositor.CreateBackdropBrush(); + effectBrush.SetSourceParameter("backdrop", backdrop); + + // Trivial looping animation to demonstrate animated effects + TimeSpan _duration = TimeSpan.FromSeconds(5); + ScalarKeyFrameAnimation blurAnimation = compositor.CreateScalarKeyFrameAnimation(); + blurAnimation.InsertKeyFrame(0, 0); + blurAnimation.InsertKeyFrame(0.5f, 10f); + blurAnimation.InsertKeyFrame(1, 0); + blurAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + blurAnimation.Duration = _duration; + effectBrush.Properties.StartAnimation("Blur.BlurAmount", blurAnimation); + + // Set EffectBrush to paint Xaml UIElement + CompositionBrush = effectBrush; + } + + protected override void OnDisconnected() + { + // Dispose CompositionBrushes if XamlCompBrushBase is removed from tree + if (CompositionBrush != null) + { + CompositionBrush.Dispose(); + CompositionBrush = null; + } + } + } +} \ No newline at end of file diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/BrushInterop.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/BrushInterop.xaml new file mode 100644 index 000000000..ab8da5c5d --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/BrushInterop.xaml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/BrushInterop.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/BrushInterop.xaml.cs new file mode 100644 index 000000000..914c92bee --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/BrushInterop.xaml.cs @@ -0,0 +1,31 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + + +namespace CompositionSampleGallery +{ + public sealed partial class BrushInterop : SamplePage + { + public BrushInterop() + { + this.InitializeComponent(); + } + + public static string StaticSampleName => "Brush Interop"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Paint XAML UIElements with CompositionBrushes (and load Surfaces from XAML to CompositionBrushes): Grids, Text, and Shapes painted with EffectBrushes"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868945"; + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/ImageEffectBrush.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/ImageEffectBrush.cs new file mode 100644 index 000000000..7aaeaed70 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/BrushInterop/ImageEffectBrush.cs @@ -0,0 +1,130 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + + +using System; + +using Windows.Graphics.Effects; + +using Microsoft.Graphics.Canvas.Effects; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Media; + +namespace CompositionSampleGallery.Samples.BrushInterop +{ + public sealed class ImageEffectBrush : XamlCompositionBrushBase + { + private LoadedImageSurface _surface; + private CompositionSurfaceBrush _surfaceBrush; + + public static readonly DependencyProperty ImageUriStringProperty = DependencyProperty.Register( + "ImageUri", + typeof(string), + typeof(ImageEffectBrush), + new PropertyMetadata(String.Empty, new PropertyChangedCallback(OnImageUriStringChanged)) + ); + + public string ImageUriString + { + get { return (String)GetValue(ImageUriStringProperty); } + set { SetValue(ImageUriStringProperty, value); } + } + + private static void OnImageUriStringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var brush = (ImageEffectBrush)d; + // Unbox and update surface if CompositionBrush exists + if (brush._surfaceBrush != null) + { + var newSurface = LoadedImageSurface.StartLoadFromUri(new Uri((String)e.NewValue)); + brush._surface = newSurface; + brush._surfaceBrush.Surface = newSurface; + } + } + + protected override void OnConnected() + { + // return if Uri String is null or empty + if (String.IsNullOrEmpty(ImageUriString)) + { + return; + } + + Compositor compositor = CompositionTarget.GetCompositorForCurrentThread(); + + // Use LoadedImageSurface API to get ICompositionSurface from image uri provided + _surface = LoadedImageSurface.StartLoadFromUri(new Uri(ImageUriString)); + + // Load Surface onto SurfaceBrush + _surfaceBrush = compositor.CreateSurfaceBrush(_surface); + _surfaceBrush.Stretch = CompositionStretch.UniformToFill; + + // CompositionCapabilities: Are Tint+Temperature and Saturation supported? + var capabilities = new CompositionCapabilities(); + bool usingFallback = !capabilities.AreEffectsSupported(); + if (usingFallback) + { + // If Effects are not supported, Fallback to image without effects + CompositionBrush = _surfaceBrush; + return; + } + + // Define Effect graph + IGraphicsEffect graphicsEffect = new SaturationEffect + { + Name = "Saturation", + Saturation = 0.3f, + Source = new TemperatureAndTintEffect + { + Name = "TempAndTint", + Temperature = 0, + Source = new CompositionEffectSourceParameter("Surface"), + } + }; + + // Create EffectFactory and EffectBrush + CompositionEffectFactory effectFactory = compositor.CreateEffectFactory(graphicsEffect, new[] { "TempAndTint.Temperature" }); + CompositionEffectBrush effectBrush = effectFactory.CreateBrush(); + effectBrush.SetSourceParameter("Surface", _surfaceBrush); + + // Set EffectBrush to paint Xaml UIElement + CompositionBrush = effectBrush; + + // Trivial looping animation to demonstrate animated effect + ScalarKeyFrameAnimation tempAnim = compositor.CreateScalarKeyFrameAnimation(); + tempAnim.InsertKeyFrame(0, 0); + tempAnim.InsertKeyFrame(0.5f, 1f); + tempAnim.InsertKeyFrame(1, 0); + tempAnim.Duration = TimeSpan.FromSeconds(5); + tempAnim.IterationBehavior = Microsoft.UI.Composition.AnimationIterationBehavior.Forever; + effectBrush.Properties.StartAnimation("TempAndTint.Temperature", tempAnim); + } + + protected override void OnDisconnected() + { + // Dispose Surface and CompositionBrushes if XamlCompBrushBase is removed from tree + if (_surface != null) + { + _surface.Dispose(); + _surface = null; + } + if (CompositionBrush != null) + { + CompositionBrush.Dispose(); + CompositionBrush = null; + } + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/CompCapabilities/CompCapabilities.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/CompCapabilities/CompCapabilities.xaml new file mode 100644 index 000000000..3cd9e1cb6 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/CompCapabilities/CompCapabilities.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + Simulate Capabilities + + + + + + + + + \ No newline at end of file diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/CompCapabilities/CompCapabilities.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/CompCapabilities/CompCapabilities.xaml.cs new file mode 100644 index 000000000..3e50c48c7 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/CompCapabilities/CompCapabilities.xaml.cs @@ -0,0 +1,312 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* +using SamplesCommon; +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Numerics; +using Microsoft.Graphics.Canvas.Effects; +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +namespace CompositionSampleGallery +{ + public sealed partial class CompCapabilities : SamplePage, INotifyPropertyChanged + { + private Compositor _compositor; + private SpriteVisual _circleImageVisual; + private SpriteVisual _backgroundImageVisual; + private CompositionCapabilities _liveCapabilities; + private ManagedSurface _surface; + private ManagedSurface _circleMaskSurface; + private ContainerVisual _imageContainer; + private string _capabilityText = ""; + private bool _containsCircleImage = false; + + private CapabilityWrapper _activeCapabilityWrapper; + + public ObservableCollection capabilityDropdownOptions = new ObservableCollection(); + + public static string StaticSampleName => "Composition Capabilities"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use the capabilities API to detect hardware capabilities, " + + "listen to capability changes, and adjust effect usage and UI based on hardware."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868946"; + + public CompCapabilities() + { + this.InitializeComponent(); + + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + + // Get hardware capabilities and register changed event listener + _liveCapabilities = new CompositionCapabilities(); + + var fastEffectsCapabilitySimulatedOption = new CapabilityWrapper("EffectsFast", true, true); + capabilityDropdownOptions.Add(fastEffectsCapabilitySimulatedOption); + capabilityDropdownOptions.Add(new CapabilityWrapper("EffectsSupported", true, false)); + capabilityDropdownOptions.Add(new CapabilityWrapper("None", false, false)); + SimulatorDropdown.SelectedItem = fastEffectsCapabilitySimulatedOption; + + _activeCapabilityWrapper = fastEffectsCapabilitySimulatedOption; + } + /// + /// Handles property changes for data binding. + /// + public event PropertyChangedEventHandler PropertyChanged; + /// + /// Binding for TextBlock description of effects applied + /// + public string CapabilityText + { + get + { + return _capabilityText; + } + set + { + _capabilityText = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CapabilityText))); + } + } + + /// + /// Handles hardware capabilities changed updates + /// + private void HandleCapabilitiesChanged(CompositionCapabilities sender, object args) + { + _liveCapabilities = sender; + + if (ToggleSwitch.IsOn == false) + { + // If not in simulate mode, update to wrapper to use live capabilities and update view + _activeCapabilityWrapper = new CapabilityWrapper("", _liveCapabilities.AreEffectsSupported(), _liveCapabilities.AreEffectsFast()); + UpdateAlbumArt(); + } + } + + private async void Page_Loaded(object sender, RoutedEventArgs e) + { + _backgroundImageVisual = _compositor.CreateSpriteVisual(); + _imageContainer = _compositor.CreateContainerVisual(); + _liveCapabilities.Changed += HandleCapabilitiesChanged; + + ElementCompositionPreview.SetElementChildVisual(ImageCanvas, _imageContainer); + + // Load the image + _surface = await ImageLoader.Instance.LoadFromUriAsync(new Uri("ms-appx:///Assets/Landscapes/Landscape-7.jpg")); + _surface.Brush.Stretch = CompositionStretch.Fill; + _circleMaskSurface = ImageLoader.Instance.LoadCircle(200, Colors.White); + _circleMaskSurface.Brush.Stretch = CompositionStretch.Uniform; + + _imageContainer.Size = new Vector2((float)ImageCanvas.ActualWidth, (float)ImageCanvas.ActualHeight); + + _imageContainer.Children.InsertAtTop(_backgroundImageVisual); + + UpdateVisualSizeAndPosition(); + + UpdateAlbumArt(); + } + + /// + /// Updates the effects applied and visuals shown based on information retrieved from + /// calling the capabilities API + /// + private void UpdateAlbumArt() + { + if (_activeCapabilityWrapper.EffectsSupported) + { + // + // If effects are supported, add effects to the background image and + // add a masked circle image in the center for better visual appearance. + // + + if (!_containsCircleImage) + { + // Create circle mask + _circleMaskSurface = ImageLoader.Instance.LoadCircle(200, Colors.White); + + // Create image visual to use as the circle-masked center image + _circleImageVisual = _compositor.CreateSpriteVisual(); + _circleImageVisual.Size = new Vector2((float)ImageCanvas.ActualWidth / 2, (float)ImageCanvas.ActualHeight / 2); + var xOffset = (float)(ImageCanvas.ActualWidth / 2 - _circleImageVisual.Size.X / 2); + var yOffset = (float)(ImageCanvas.ActualHeight / 2 - _circleImageVisual.Size.Y / 2); + _circleImageVisual.Offset = new Vector3(xOffset, yOffset, 0); + + // Apply mask to visual + CompositionMaskBrush maskBrush = _compositor.CreateMaskBrush(); + maskBrush.Source = _surface.Brush; + maskBrush.Mask = _circleMaskSurface.Brush; + + _circleImageVisual.Brush = maskBrush; + + _imageContainer.Children.InsertAtTop(_circleImageVisual); + _containsCircleImage = true; + } + // + // Create saturation effect, which will be either used alone if effects are slow, or chained + // with blur if effects are fast + // + var saturationEffect = new SaturationEffect + { + Saturation = 0.3f, + Source = new CompositionEffectSourceParameter("SaturationSource") + }; + + if (_activeCapabilityWrapper.EffectsFast) + { + // Create blur effect and chain with saturation effect + GaussianBlurEffect chainedEffect = new GaussianBlurEffect() + { + Name = "Blur", + Source = saturationEffect, //takes saturation effect as input + BlurAmount = 6.0f, + BorderMode = EffectBorderMode.Hard, + Optimization = EffectOptimization.Balanced + }; + CompositionEffectFactory chainedEffectFactory = _compositor.CreateEffectFactory(chainedEffect); + + CompositionEffectBrush effectBrush = chainedEffectFactory.CreateBrush(); + effectBrush.SetSourceParameter("SaturationSource", _surface.Brush); + + _backgroundImageVisual.Brush = effectBrush; + + CapabilityText = "Effects are supported and fast. Background image is blurred and desaturated."; + } + else + { + // If effects are slow but supported use desaturation effect since it is less expensive than blur + CompositionEffectFactory saturationEffectFactory = _compositor.CreateEffectFactory(saturationEffect); + CompositionEffectBrush saturationBrush = saturationEffectFactory.CreateBrush(); + saturationBrush.SetSourceParameter("SaturationSource", _surface.Brush); + _backgroundImageVisual.Brush = saturationBrush; + CapabilityText = "Effects are supported but not fast. Background image is desaturated."; + } + } + else + { + // + // If effects are not supported, just use the image as the background with no effects + // and remove the center circle image to declutter the UI. + // + + if (_containsCircleImage) + { + _imageContainer.Children.Remove(_circleImageVisual); + _containsCircleImage = false; + } + + _backgroundImageVisual.Brush = _surface.Brush; + + CapabilityText = "Effects not supported. No effects are applied."; + } + } + /// + /// Updates size and position of the two image visuals on grid size change + /// + private void Grid_SizeChanged(object sender, SizeChangedEventArgs e) + { + UpdateVisualSizeAndPosition(); + } + + /// + /// Resizes and centers the two image visuals based on their parent canvas + /// + private void UpdateVisualSizeAndPosition() + { + if (_backgroundImageVisual != null) + { + _backgroundImageVisual.Size = new Vector2((float)ImageCanvas.ActualWidth, (float)ImageCanvas.ActualHeight); + } + + if (_circleImageVisual != null) + { + _circleImageVisual.Size = new Vector2((float)ImageCanvas.ActualWidth / 2, (float)ImageCanvas.ActualHeight / 2); + var xOffset = (float)(ImageCanvas.ActualWidth / 2 - _circleImageVisual.Size.X / 2); + var yOffset = (float)(ImageCanvas.ActualHeight / 2 - _circleImageVisual.Size.Y / 2); + _circleImageVisual.Offset = new Vector3(xOffset, yOffset, 0); + } + } + /// + /// Clean up resources on unload + /// + private void Page_Unloaded(object sender, RoutedEventArgs e) + { + _liveCapabilities.Changed -= HandleCapabilitiesChanged; + + if (_surface != null) + { + _surface.Dispose(); + _surface = null; + } + + if (_circleMaskSurface != null) + { + _circleMaskSurface.Dispose(); + _circleMaskSurface = null; + } + } + + private void SimulatorDropdown_SelectionChanged(object sender, Microsoft.UI.Xaml.Controls.SelectionChangedEventArgs e) + { + var selectedSimulatedCapability = (CapabilityWrapper)SimulatorDropdown.SelectedItem; + _activeCapabilityWrapper = selectedSimulatedCapability; + if (_backgroundImageVisual != null) + { + UpdateAlbumArt(); + } + } + private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e) + { + ToggleSwitch toggleSwitch = sender as ToggleSwitch; + if (toggleSwitch != null && SimulatorDropdown != null) + { + if (toggleSwitch.IsOn == true) + { + // Show simulation options + SimulatorDropdown.Visibility = Visibility.Visible; + + // Simulate capabilities + _activeCapabilityWrapper = (CapabilityWrapper)SimulatorDropdown.SelectedItem; + } + else + { + // Hide simulation options + SimulatorDropdown.Visibility = Visibility.Collapsed; + + // Update to use actual capabilities + _activeCapabilityWrapper = new CapabilityWrapper("", _liveCapabilities.AreEffectsSupported(), _liveCapabilities.AreEffectsFast()); + } + UpdateAlbumArt(); + } + } + } + + public class CapabilityWrapper + { + public string Name { get; } + public bool EffectsSupported { get; } + public bool EffectsFast { get; } + + public CapabilityWrapper(string name, bool effectsSupported, bool effectsFast) + { + Name = name; + EffectsSupported = effectsSupported; + EffectsFast = effectsFast; + } + } +} \ No newline at end of file diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationDetail.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationDetail.xaml new file mode 100644 index 000000000..c1a457be1 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationDetail.xaml @@ -0,0 +1,13 @@ + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationDetail.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationDetail.xaml.cs new file mode 100644 index 000000000..9283a948f --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationDetail.xaml.cs @@ -0,0 +1,54 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using Windows.UI.Core; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media.Animation; +using Microsoft.UI.Xaml.Media.Imaging; +using Microsoft.UI.Xaml.Navigation; + +// The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236 + +namespace CompositionSampleGallery +{ + public sealed partial class ConnectedAnimationDetail : Page + { + //SystemNavigationManager _systemNavigationManager = SystemNavigationManager.GetForCurrentView(); + + public ConnectedAnimationDetail() + { + InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + PhotoImage.Source = new BitmapImage(new Uri((string)e.Parameter)); + + var animation = ConnectedAnimationService.GetForCurrentView().GetAnimation("Image"); + if (animation != null) + { + PhotoImage.Opacity = 0; + // Wait for image opened. In future Insider Preview releases, this won't be necessary. + PhotoImage.ImageOpened += (sender_, e_) => + { + PhotoImage.Opacity = 1; + animation.TryStart(PhotoImage); + }; + } + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationSample.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationSample.xaml new file mode 100644 index 000000000..ddd95b4d4 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationSample.xaml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationSample.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationSample.xaml.cs new file mode 100644 index 000000000..a6e152868 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ConnectedAnimationSample/ConnectedAnimationSample.xaml.cs @@ -0,0 +1,140 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Linq; +using System.Numerics; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Media.Animation; +using Microsoft.UI.Xaml.Navigation; +using CompositionSampleGallery.Shared; + +namespace CompositionSampleGallery +{ + + public sealed partial class ConnectedAnimationSample : Page + { + public LocalDataSource Model { get; } = new LocalDataSource(); + + static string _navigatedUri; + static bool _usingCustomParameters; + + Compositor _compositor; + + + public ConnectedAnimationSample() + { + InitializeComponent(); + + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + CustomParametersCheckBox.IsChecked = _usingCustomParameters; + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + // Don't use vertical entrance animation with connected animation + if (e.NavigationMode == NavigationMode.Back) + { + EntranceTransition.FromVerticalOffset = 0; + } + } + + private void ItemsGridView_ItemClick(object sender, ItemClickEventArgs e) + { + var container = ItemsGridView.ContainerFromItem(e.ClickedItem) as GridViewItem; + if (container != null) + { + var root = (FrameworkElement)container.ContentTemplateRoot; + var image = (UIElement)root.FindName("Image"); + + ConnectedAnimationService.GetForCurrentView().PrepareToAnimate("Image", image); + } + + var item = (Thumbnail)e.ClickedItem; + + // Add a fade out effect + Transitions = new TransitionCollection(); + Transitions.Add(new ContentThemeTransition()); + + Frame.Navigate(typeof(ConnectedAnimationDetail), _navigatedUri = item.ImageUrl); + } + + private void ItemsGridView_Loaded(object sender, RoutedEventArgs e) + { + if (_navigatedUri != null) + { + // May be able to perform backwards Connected Animation + var animation = ConnectedAnimationService.GetForCurrentView().GetAnimation("Image"); + if (animation != null) + { + var item = Model.Landscapes.Where(compare => compare.ImageUrl == _navigatedUri).First(); + + ItemsGridView.ScrollIntoView(item, ScrollIntoViewAlignment.Default); + ItemsGridView.UpdateLayout(); + + var container = ItemsGridView.ContainerFromItem(item) as GridViewItem; + if (container != null) + { + var root = (FrameworkElement)container.ContentTemplateRoot; + var image = (Image)root.FindName("Image"); + + // Wait for image opened. In future Insider Preview releases, this won't be necessary. + image.Opacity = 0; + image.ImageOpened += (sender_, e_) => + { + image.Opacity = 1; + animation.TryStart(image); + }; + } + else + { + animation.Cancel(); + } + } + + _navigatedUri = null; + } + } + + private void CustomParametersCheckBox_Checked(object sender, RoutedEventArgs e) + { + var connectedAnimationService = ConnectedAnimationService.GetForCurrentView(); + connectedAnimationService.DefaultDuration = TimeSpan.FromSeconds(0.8); + connectedAnimationService.DefaultEasingFunction = _compositor.CreateCubicBezierEasingFunction( + new Vector2(0.41f, 0.52f), + new Vector2(0.00f, 0.94f) + ); + + _usingCustomParameters = true; + } + + private void CustomParametersCheckBox_Unchecked(object sender, RoutedEventArgs e) + { + // These are the default values for ConnectedAnimationService in Windows 10 Anniversary + var connectedAnimationService = ConnectedAnimationService.GetForCurrentView(); + connectedAnimationService.DefaultDuration = TimeSpan.FromSeconds(0.33); + connectedAnimationService.DefaultEasingFunction = _compositor.CreateCubicBezierEasingFunction( + new Vector2(0.3f, 0.3f), + new Vector2(0.0f, 1.0f) + ); + + _usingCustomParameters = false; + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/Curtain/Curtain.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/Curtain/Curtain.cs new file mode 100644 index 000000000..db72cfdc1 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/Curtain/Curtain.cs @@ -0,0 +1,210 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; +using System; +using System.Numerics; + +using Windows.Foundation; + +using Microsoft.UI.Composition; +using Microsoft.UI.Composition.Interactions; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Input; + +using EF = ExpressionBuilder.ExpressionFunctions; + +namespace CompositionSampleGallery +{ + public sealed partial class Curtain : SamplePage + { + private Visual _image; + private Visual _root; + private Compositor _compositor; + private VisualInteractionSource _interactionSource; + private InteractionTracker _tracker; + public Curtain() + { + this.InitializeComponent(); + } + + public static string StaticSampleName => "Curtain"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to provide custom inertia expressions in response to touch input. Select a motion and swipe up with touch to see how the UI reacts."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868996"; + + private void Page_Loaded(object sender, RoutedEventArgs e) + { + _image = ElementCompositionPreview.GetElementVisual(Cover); + _root = ElementCompositionPreview.GetElementVisual(Root); + _compositor = _image.Compositor; + + ConfigureInteractionTracker(); + } + + private void ConfigureInteractionTracker() + { + _tracker = InteractionTracker.Create(_compositor); + + _interactionSource = VisualInteractionSource.Create(_root); + _interactionSource.PositionYSourceMode = InteractionSourceMode.EnabledWithInertia; + _tracker.InteractionSources.Add(_interactionSource); + _tracker.MaxPosition = new Vector3(0, (float)Root.ActualHeight, 0); + SetDefaultInertia(); + + // + // Use the Tacker's Position (negated) to apply to the Offset of the Image. + // + + _image.StartAnimation("Offset", -_tracker.GetReference().Position); + } + + private void ActivateSpringForce() + { + var modifier = InteractionTrackerInertiaNaturalMotion.Create(_compositor); + var springAnimation = _compositor.CreateSpringScalarAnimation(); + springAnimation.Period = TimeSpan.FromSeconds(.15); + springAnimation.DampingRatio = .4f; + springAnimation.FinalValue = 0.0f; + + modifier.Condition = _compositor.CreateExpressionAnimation("true"); + modifier.NaturalMotion = springAnimation; + _tracker.ConfigurePositionYInertiaModifiers(new InteractionTrackerInertiaModifier[] { modifier }); + } + private void Grid_SizeChanged(object sender, SizeChangedEventArgs e) + { + GridClip.Rect = new Rect(0d, 0d, e.NewSize.Width, e.NewSize.Height); + } + + private void ActivateGravityForce() + { + // + // Setup the gravity+bounce inertia modifier. + // + + var target = ExpressionValues.Target.CreateInteractionTrackerTarget(); + var posY = target.Position.Y; + var velY = target.PositionVelocityInPixelsPerSecond.Y; + + // + // Gravity Force + // + + // Adding a factor of 100 since -9.8 pixels / second ^2 is not very fast. + var gravity = -9.8f * 100; + + // + // Floor Force + // + // This is the force that resists gravity and causes the bouncing. It's defined as: + // 1. Zero if above the floor, + // 2. Equal and opposite to gravity if "on" the floor (1 pixel above floor or below), + // 3. The effects of 2., plus a reflective force if the direction of motion is still downward and the tracker is below the floor. + // This force is at its strongest (-1.8 * 100 * V) if the tracker is 5 or more + // pixels below floor, and weakest (-1.0 * 100 * V) if the tracker is "at" the + // floor. + // + + // The amount the tracker is below the floor, capped to at most 5 below. + + var belowFloor = EF.Clamp(0, 0 - posY, 5); + + // The time slice our force engine uses. + float dt = .01f; + + // + // Defining bounce constants. + // -2 would cause perfectly inellastic reflection, bouncing as high as it fell from. + // -1 would cause perfectly ellastic reflection, freezing motion. + // We want some bounce, but we also want the bouncing to decay, so choose + // bounce factors between -1 and -2. + // + // Also, divide by the time slice width to make this reflective force apply entirely + // all at once. + // + var weakestBounce = -1.1f / dt; + var strongestBounce = -1.8f / dt; + + var floorForceExpression = EF.Conditional(posY < 1, + -gravity, + 0) + + EF.Conditional(EF.And(velY < 0f, posY < 0f), + EF.Lerp(weakestBounce, strongestBounce, belowFloor/5) * velY, + 0); + + // + // Apply the forces to the modifier + // + var modifier = InteractionTrackerInertiaMotion.Create(_compositor); + modifier.SetCondition((BooleanNode)true); + modifier.SetMotion(gravity + floorForceExpression); + _tracker.ConfigurePositionYInertiaModifiers(new InteractionTrackerInertiaModifier[] { modifier }); + } + + // + // Create a snap point in the "down" position using default inertia + // + private void SetDefaultInertia() + { + var modifier = InteractionTrackerInertiaRestingValue.Create(_compositor); + modifier.RestingValue = _compositor.CreateExpressionAnimation("0"); + modifier.Condition = _compositor.CreateExpressionAnimation("true"); + _tracker.ConfigurePositionYInertiaModifiers(new InteractionTrackerInertiaModifier[] { modifier }); + } + + private void Root_PointerPressed(object sender, PointerRoutedEventArgs e) + { + if (e.Pointer.PointerDeviceType == Microsoft.UI.Input.PointerDeviceType.Mouse) + { + _tracker.TryUpdatePositionWithAdditionalVelocity(new Vector3(0.0f, 1000.0f, 0.0f)); + } + else + { + try + { + _interactionSource.TryRedirectForManipulation(e.GetCurrentPoint(Root)); + } + catch (Exception) + { + //catch to avoid app crash based on unauthorized input + } + } + } + + private void Selector_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (_tracker != null) + { + switch (((ListBox)sender).SelectedIndex) + { + case 0: + SetDefaultInertia(); + break; + + case 1: + ActivateSpringForce(); + break; + + case 2: + ActivateGravityForce(); + break; + + } + } + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/Curtain/Curtain.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/Curtain/Curtain.xaml new file mode 100644 index 000000000..5d4404c5e --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/Curtain/Curtain.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/CustomConnectedAnimation/ConnectedAnimationShell.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/CustomConnectedAnimation/ConnectedAnimationShell.xaml new file mode 100644 index 000000000..a1c45ed2d --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/CustomConnectedAnimation/ConnectedAnimationShell.xaml @@ -0,0 +1,23 @@ + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/CustomConnectedAnimation/ConnectedAnimationShell.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/CustomConnectedAnimation/ConnectedAnimationShell.xaml.cs new file mode 100644 index 000000000..e004f4c3b --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/CustomConnectedAnimation/ConnectedAnimationShell.xaml.cs @@ -0,0 +1,44 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Xaml.Controls; + +namespace CompositionSampleGallery +{ + public sealed partial class ConnectedAnimationShell : SamplePage + { + public static string StaticSampleName => "Connected Animation"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Connected animations communicate context across page navigations. Click on one of the thumbnails and see it transition continuously across from one page to another."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761164"; + + + public ConnectedAnimationShell() + { + InitializeComponent(); + + SampleComboBox.ItemsSource = new[] { "XAML Connected Animation" }; + SampleComboBox.SelectedIndex = 0; + } + + private void SampleComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (SampleComboBox.SelectedIndex == 0) + { + SamplesFrame.Navigate(typeof(ConnectedAnimationSample)); + } + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/CustomConnectedAnimation/ConnectedTransition.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/CustomConnectedAnimation/ConnectedTransition.cs new file mode 100644 index 000000000..89c780513 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/CustomConnectedAnimation/ConnectedTransition.cs @@ -0,0 +1,254 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; +using SamplesCommon; +using System; +using System.Numerics; + +using Windows.Foundation; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Media; + +using EF = ExpressionBuilder.ExpressionFunctions; + +namespace CompositionSampleGallery +{ + class ConnectedTransition + { + private UIElement _host; + private UIElement _parent; + private object _payload; + private SpriteVisual _sprite; + private bool _imageLoaded; + private bool _animationCompleted; + private CompositionScopedBatch _scopeBatch; + private CompositionImage _targetImage; + + public object Payload { get { return _payload; } } + public object Host { get { return _host; } } + + public ConnectedTransition() + { + } + + public void Initialize(UIElement host, CompositionImage sourceElement, object payload) + { + _host = host; + _parent = host; + _payload = payload; + + // Make a copy of the sourceElement's sprite so we can hand it off to the next page + SpriteVisual sourceSprite = sourceElement.SpriteVisual; + Compositor compositor = sourceSprite.Compositor; + _sprite = compositor.CreateSpriteVisual(); + _sprite.Size = sourceSprite.Size; + _sprite.Brush = sourceElement.SurfaceBrush; + + // We're going to use the backing surface, make sure it doesn't get released + sourceElement.SharedSurface = true; + + // Determine the offset from the host to the source element used in the transition + GeneralTransform coordinate = sourceElement.TransformToVisual(_parent); + Point position = coordinate.TransformPoint(new Point(0, 0)); + + // Set the sprite to that offset relative to the host + _sprite.Offset = new Vector3((float)position.X, (float)position.Y, 0); + + // Set the sprite as the content under the host + ElementCompositionPreview.SetElementChildVisual(_parent, _sprite); + } + + public void Start(UIElement newParent, CompositionImage targetImage, ScrollViewer scrollViewer, UIElement animationTarget) + { + Visual transitionVisual = ElementCompositionPreview.GetElementChildVisual(_parent); + ElementCompositionPreview.SetElementChildVisual(_parent, null); + + + // + // We need to reparent the transition visual under the new parent. This is important to ensure + // it's propertly clipped, etc. + // + + GeneralTransform coordinate = newParent.TransformToVisual(_parent); + Point position = coordinate.TransformPoint(new Point(0, 0)); + + Vector3 currentOffset = transitionVisual.Offset; + currentOffset.X -= (float)position.X; + currentOffset.Y -= (float)position.Y; + transitionVisual.Offset = currentOffset; + + _parent = newParent; + _targetImage = targetImage; + + // Move the transition visual to it's new parent + ElementCompositionPreview.SetElementChildVisual(_parent, transitionVisual); + + // Hide the target Image now since the handoff visual is still transitioning + targetImage.Opacity = 0f; + + // Load image if necessary + _imageLoaded = targetImage.IsContentLoaded; + if (!_imageLoaded) + { + targetImage.ImageOpened += CompositionImage_ImageOpened; + } + + // + // Create a scoped batch around the animations. When the batch completes, we know the animations + // have finished and we can cleanup the transition related objects. + // + + Compositor compositor = transitionVisual.Compositor; + _scopeBatch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + + // + // Determine the offset between the parent and the target UIElement. This will be used to calculate the + // target position we are animating to. + // + + coordinate = targetImage.TransformToVisual(_parent); + position = coordinate.TransformPoint(new Point(0, 0)); + + TimeSpan totalDuration = TimeSpan.FromMilliseconds(1000); + Vector3KeyFrameAnimation offsetAnimation = compositor.CreateVector3KeyFrameAnimation(); + + if (scrollViewer != null) + { + CompositionPropertySet scrollProperties = ElementCompositionPreview.GetScrollViewerManipulationPropertySet(scrollViewer); + + // Include the scroller offset as that is a factor + position.X += scrollViewer.HorizontalOffset; + position.Y += scrollViewer.VerticalOffset; + + + // + // Since the target position is relative to the target UIElement which can move, we need to construct + // an expression to bind the target's position to the end position of our animation. + // + + var scrollPropSet = scrollProperties.GetSpecializedReference(); + var itemOffset = new Vector3((float)position.X, (float)position.Y, 0); + var expression = EF.Vector3(scrollPropSet.Translation.X, scrollPropSet.Translation.Y, 0) + itemOffset ; + offsetAnimation.InsertExpressionKeyFrame(1f, expression); + offsetAnimation.Duration = totalDuration; + } + else + { + offsetAnimation.InsertKeyFrame(1, new Vector3((float)position.X, (float)position.Y, 0)); + offsetAnimation.Duration = totalDuration; + } + + // Create size animation to change size of the visual + Vector2KeyFrameAnimation sizeAnimation = compositor.CreateVector2KeyFrameAnimation(); + sizeAnimation.InsertKeyFrame(1f, new Vector2((float)targetImage.ActualWidth, (float)targetImage.ActualHeight)); + sizeAnimation.Duration = totalDuration; + + // Create the fade in animation for the other page content + if (animationTarget != null) + { + Visual fadeVisual = ElementCompositionPreview.GetElementVisual(animationTarget); + ScalarKeyFrameAnimation fadeIn = compositor.CreateScalarKeyFrameAnimation(); + fadeIn.InsertKeyFrame(0f, 0.0f); + fadeIn.InsertKeyFrame(1f, 1.0f); + fadeIn.Duration = totalDuration; + fadeVisual.StartAnimation("Opacity", fadeIn); + } + + //Start Animations + _sprite.StartAnimation("Size", sizeAnimation); + _sprite.StartAnimation("Offset", offsetAnimation); + + //Scoped batch completed event + _scopeBatch.Completed += ScopeBatch_Completed; + _scopeBatch.End(); + + // Clear the flag + _animationCompleted = false; + } + + public void Cancel() + { + if (!Completed) + { + Complete(true); + } + } + + public bool Completed + { + get + { + // Either we aren't actively transitioning or the image and animation have completed + return (_sprite == null) || (_imageLoaded && _animationCompleted); + } + } + + private void Complete(bool forceComplete) + { + // If we're forcing completion, make sure the scope batch is cleaned up + if (forceComplete && (_scopeBatch != null)) + { + CleanupScopeBatch(); + } + + // If we've completed the transition or we're forcing completion, cleanup + if (forceComplete || (_imageLoaded && _animationCompleted)) + { + _sprite = null; + + // Clear the sprite from the UIElement + ElementCompositionPreview.SetElementChildVisual(_parent, null); + + // Clean up the image and show it + if (_targetImage != null) + { + _targetImage.ImageOpened -= CompositionImage_ImageOpened; + + _targetImage.Opacity = 1f; + + _targetImage = null; + } + } + } + + private void CompositionImage_ImageOpened(object sender, RoutedEventArgs e) + { + _imageLoaded = true; + Complete(false); + } + + private void ScopeBatch_Completed(object sender, CompositionBatchCompletedEventArgs args) + { + _animationCompleted = true; + Complete(false); + + CleanupScopeBatch(); + } + + private void CleanupScopeBatch() + { + if (_scopeBatch != null) + { + _scopeBatch.Completed -= ScopeBatch_Completed; + _scopeBatch.Dispose(); + _scopeBatch = null; + } + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ForegroundFocusEffects/ForegroundFocusEffects.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/ForegroundFocusEffects/ForegroundFocusEffects.xaml new file mode 100644 index 000000000..9d9507e0d --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ForegroundFocusEffects/ForegroundFocusEffects.xaml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ForegroundFocusEffects/ForegroundFocusEffects.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/ForegroundFocusEffects/ForegroundFocusEffects.xaml.cs new file mode 100644 index 000000000..fe9da4fbd --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ForegroundFocusEffects/ForegroundFocusEffects.xaml.cs @@ -0,0 +1,500 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using SamplesCommon; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Numerics; + +using Windows.UI; +using Windows.UI.Popups; +using Windows.Graphics.Effects; + +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.Graphics.Canvas; +using Microsoft.Graphics.Canvas.Effects; +using CompositionSampleGallery.Shared; + +namespace CompositionSampleGallery +{ + public sealed partial class ForegroundFocusEffects : SamplePage + { + private SpriteVisual _destinationSprite; + private Compositor _compositor; + private CompositionScopedBatch + _scopeBatch; + private ManagedSurface _maskSurface; + + public enum EffectTypes + { + Blur, + LightenBlur, + DarkenBlur, + RainbowBlur, + Mask, + VividLight, + Desaturation, + Hue, + } + + public ForegroundFocusEffects() + { + Model = new LocalDataSource(); + this.InitializeComponent(); + } + + public static string StaticSampleName => "Foreground Focus Effects"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use a BackDrop effect to deemphasize background content. Click on any thumbnail to trigger the selected effect."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761179"; + + public LocalDataSource Model { set; get; } + private async void Page_Loaded(object sender, RoutedEventArgs e) + { + ThumbnailList.ItemsSource = ThumbnailList.ItemsSource = Model.AggregateDataSources(new ObservableCollection[] { Model.Landscapes, Model.Nature }); + + // Populate the Effect combobox + IList effectList = new List(); + foreach (EffectTypes type in Enum.GetValues(typeof(EffectTypes))) + { + ComboBoxItem item = new ComboBoxItem(); + item.Tag = type; + item.Content = type.ToString(); + effectList.Add(item); + } + + EffectSelection.ItemsSource = effectList; + EffectSelection.SelectedIndex = 0; + + // Get the current compositor + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + + // Create the destinatio sprite, sized to cover the entire list + _destinationSprite = _compositor.CreateSpriteVisual(); + _destinationSprite.Size = new Vector2((float)ThumbnailList.ActualWidth, (float)ThumbnailList.ActualHeight); + + // Start out with the destination layer invisible to avoid any cost until necessary + _destinationSprite.IsVisible = false; + + // Create the .png surface + _maskSurface = await ImageLoader.Instance.LoadFromUriAsync(new Uri("ms-appx:///Assets/NormalMapsAndMasks/ForegroundFocusMask.png")); + + ElementCompositionPreview.SetElementChildVisual(ThumbnailList, _destinationSprite); + + // Update the effect to set the appropriate brush + UpdateEffect(); + + } + + private void Page_Unloaded(object sender, RoutedEventArgs e) + { + // Dispose the sprite and unparent it + ElementCompositionPreview.SetElementChildVisual(ThumbnailList, null); + + if (_destinationSprite != null) + { + _destinationSprite.Dispose(); + _destinationSprite = null; + } + + if (_maskSurface != null) + { + _maskSurface.Dispose(); + _maskSurface = null; + } + } + + private void ListView_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args) + { + CompositionImage image = args.ItemContainer.ContentTemplateRoot.GetFirstDescendantOfType(); + Thumbnail thumbnail = args.Item as Thumbnail; + Uri uri = new Uri(thumbnail.ImageUrl); + + // Update the image URI + image.Source = uri; + } + + private void ThumbnailList_SizeChanged(object sender, SizeChangedEventArgs e) + { + if (_destinationSprite != null) + { + _destinationSprite.Size = e.NewSize.ToVector2(); + + ComboBoxItem item = EffectSelection.SelectedValue as ComboBoxItem; + switch ((EffectTypes)item.Tag) + { + case EffectTypes.Mask: + { + CompositionEffectBrush brush = (CompositionEffectBrush)_destinationSprite.Brush; + CompositionSurfaceBrush surfaceBrush = (CompositionSurfaceBrush)brush.GetSourceParameter("SecondSource"); + surfaceBrush.CenterPoint = e.NewSize.ToVector2() * .5f; + break; + } + default: + break; + } + } + } + + private async void ThumbnailList_ItemClick(object sender, ItemClickEventArgs e) + { + Thumbnail thumbnail = (Thumbnail)e.ClickedItem; + + // If we're in the middle of an animation, cancel it now + if (_scopeBatch != null) + { + CleanupScopeBatch(); + } + + // We're starting our transition, show the destination sprite + _destinationSprite.IsVisible = true; + + // Animate from transparent to fully opaque + ScalarKeyFrameAnimation showAnimation = _compositor.CreateScalarKeyFrameAnimation(); + showAnimation.InsertKeyFrame(0f, 0f); + showAnimation.InsertKeyFrame(1f, 1f); + showAnimation.Duration = TimeSpan.FromMilliseconds(1500); + _destinationSprite.StartAnimation("Opacity", showAnimation); + + // Use whichever effect is currently selected + ComboBoxItem item = EffectSelection.SelectedValue as ComboBoxItem; + switch ((EffectTypes)item.Tag) + { + case EffectTypes.Mask: + { + CompositionSurfaceBrush brush = ((CompositionEffectBrush)_destinationSprite.Brush).GetSourceParameter("SecondSource") as CompositionSurfaceBrush; + Vector2KeyFrameAnimation scaleAnimation = _compositor.CreateVector2KeyFrameAnimation(); + scaleAnimation.InsertKeyFrame(0f, new Vector2(1.25f, 1.25f)); + scaleAnimation.InsertKeyFrame(1f, new Vector2(0f, 0f)); + scaleAnimation.Duration = TimeSpan.FromMilliseconds(2000); + brush.StartAnimation("Scale", scaleAnimation); + break; + } + case EffectTypes.VividLight: + { + CompositionEffectBrush brush = (CompositionEffectBrush)_destinationSprite.Brush; + ColorKeyFrameAnimation coloAnimation = _compositor.CreateColorKeyFrameAnimation(); + coloAnimation.InsertKeyFrame(0f, Color.FromArgb(255, 255, 255, 255)); + coloAnimation.InsertKeyFrame(0f, Color.FromArgb(255, 30, 30, 30)); + coloAnimation.Duration = TimeSpan.FromMilliseconds(4000); + brush.StartAnimation("Base.Color", coloAnimation); + break; + } + case EffectTypes.Hue: + { + CompositionEffectBrush brush = (CompositionEffectBrush)_destinationSprite.Brush; + ScalarKeyFrameAnimation rotateAnimation = _compositor.CreateScalarKeyFrameAnimation(); + rotateAnimation.InsertKeyFrame(0f, 0f); + rotateAnimation.InsertKeyFrame(1f, (float)Math.PI); + rotateAnimation.Duration = TimeSpan.FromMilliseconds(4000); + brush.StartAnimation("Hue.Angle", rotateAnimation); + break; + } + case EffectTypes.RainbowBlur: + { + CompositionEffectBrush brush = (CompositionEffectBrush)_destinationSprite.Brush; + ColorKeyFrameAnimation colorAnimation = _compositor.CreateColorKeyFrameAnimation(); + colorAnimation.InsertKeyFrame(0, Colors.Red); + colorAnimation.InsertKeyFrame(.16f, Colors.Orange); + colorAnimation.InsertKeyFrame(.32f, Colors.Yellow); + colorAnimation.InsertKeyFrame(.48f, Colors.Green); + colorAnimation.InsertKeyFrame(.64f, Colors.Blue); + colorAnimation.InsertKeyFrame(.80f, Colors.Purple); + colorAnimation.InsertKeyFrame(1, Colors.Red); + colorAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + colorAnimation.Duration = TimeSpan.FromMilliseconds(5000); + brush.StartAnimation("Base.Color", colorAnimation); + break; + } + default: + break; + } + + // Create the dialog + var messageDialog = new MessageDialog(thumbnail.Name); + messageDialog.Commands.Add(new UICommand("Close", new UICommandInvokedHandler(DialogDismissedHandler))); + + WinRT.Interop.InitializeWithWindow.Initialize(messageDialog, WinRT.Interop.WindowNative.GetWindowHandle(MainWindow.CurrentWindow)); + + // Show the message dialog + await messageDialog.ShowAsync(); + } + + private void DialogDismissedHandler(IUICommand command) + { + // Start a scoped batch so we can register to completion event and hide the destination layer + _scopeBatch = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + + // Start the hide animation to fade out the destination effect + ScalarKeyFrameAnimation hideAnimation = _compositor.CreateScalarKeyFrameAnimation(); + hideAnimation.InsertKeyFrame(0f, 1f); + hideAnimation.InsertKeyFrame(1.0f, 0f); + hideAnimation.Duration = TimeSpan.FromMilliseconds(1000); + _destinationSprite.StartAnimation("Opacity", hideAnimation); + + // Use whichever effect is currently selected + ComboBoxItem item = EffectSelection.SelectedValue as ComboBoxItem; + switch ((EffectTypes)item.Tag) + { + case EffectTypes.Mask: + { + CompositionSurfaceBrush brush = ((CompositionEffectBrush)_destinationSprite.Brush).GetSourceParameter("SecondSource") as CompositionSurfaceBrush; + Vector2KeyFrameAnimation scaleAnimation = _compositor.CreateVector2KeyFrameAnimation(); + scaleAnimation.InsertKeyFrame(1f, new Vector2(2.0f, 2.0f)); + scaleAnimation.Duration = TimeSpan.FromMilliseconds(1000); + brush.StartAnimation("Scale", scaleAnimation); + break; + } + case EffectTypes.VividLight: + { + CompositionEffectBrush brush = (CompositionEffectBrush)_destinationSprite.Brush; + ColorKeyFrameAnimation coloAnimation = _compositor.CreateColorKeyFrameAnimation(); + coloAnimation.InsertKeyFrame(1f, Color.FromArgb(255, 100, 100, 100)); + coloAnimation.Duration = TimeSpan.FromMilliseconds(1500); + brush.StartAnimation("Base.Color", coloAnimation); + break; + } + case EffectTypes.Hue: + { + CompositionEffectBrush brush = (CompositionEffectBrush)_destinationSprite.Brush; + ScalarKeyFrameAnimation rotateAnimation = _compositor.CreateScalarKeyFrameAnimation(); + rotateAnimation.InsertKeyFrame(1f, 0f); + rotateAnimation.Duration = TimeSpan.FromMilliseconds(1500); + brush.StartAnimation("Hue.Angle", rotateAnimation); + break; + } + default: + break; + } + + //Scoped batch completed event + _scopeBatch.Completed += ScopeBatch_Completed; + _scopeBatch.End(); + } + + private void EffectSelection_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + UpdateEffect(); + } + + private void UpdateEffect() + { + if (_compositor != null) + { + ComboBoxItem item = EffectSelection.SelectedValue as ComboBoxItem; + IGraphicsEffect graphicsEffect = null; + CompositionBrush secondaryBrush = null; + string[] animatableProperties = null; + + // + // Create the appropriate effect graph and resources + // + + switch ((EffectTypes)item.Tag) + { + case EffectTypes.Desaturation: + { + graphicsEffect = new SaturationEffect() + { + Saturation = 0.0f, + Source = new CompositionEffectSourceParameter("ImageSource") + }; + } + break; + + case EffectTypes.Hue: + { + graphicsEffect = new HueRotationEffect() + { + Name = "Hue", + Angle = 3.14f, + Source = new CompositionEffectSourceParameter("ImageSource") + }; + animatableProperties = new[] { "Hue.Angle" }; + } + break; + + case EffectTypes.VividLight: + { + graphicsEffect = new BlendEffect() + { + Mode = BlendEffectMode.VividLight, + Foreground = new ColorSourceEffect() + { + Name = "Base", + Color = Color.FromArgb(255,80,40,40) + }, + Background = new CompositionEffectSourceParameter("ImageSource"), + }; + animatableProperties = new[] { "Base.Color" }; + } + break; + case EffectTypes.Mask: + { + graphicsEffect = new CompositeEffect() + { + Mode = CanvasComposite.DestinationOver, + Sources = + { + new CompositeEffect() + { + Mode = CanvasComposite.DestinationIn, + Sources = + { + + new CompositionEffectSourceParameter("ImageSource"), + new CompositionEffectSourceParameter("SecondSource") + } + }, + new ColorSourceEffect() + { + Color = Color.FromArgb(200,255,255,255) + }, + } + }; + + _maskSurface.Brush.Stretch = CompositionStretch.UniformToFill; + _maskSurface.Brush.CenterPoint = _destinationSprite.Size * .5f; + secondaryBrush = _maskSurface.Brush; + } + break; + case EffectTypes.Blur: + { + graphicsEffect = new GaussianBlurEffect() + { + BlurAmount = 20, + Source = new CompositionEffectSourceParameter("ImageSource"), + Optimization = EffectOptimization.Balanced, + BorderMode = EffectBorderMode.Hard, + }; + } + break; + case EffectTypes.LightenBlur: + { + graphicsEffect = new ArithmeticCompositeEffect() + { + Source1Amount = .4f, + Source2Amount = .6f, + MultiplyAmount = 0, + Source1 = new ColorSourceEffect() + { + Name = "Base", + Color = Color.FromArgb(255, 255, 255, 255), + }, + Source2 = new GaussianBlurEffect() + { + BlurAmount = 20, + Source = new CompositionEffectSourceParameter("ImageSource"), + Optimization = EffectOptimization.Balanced, + BorderMode = EffectBorderMode.Hard, + } + }; + } + break; + case EffectTypes.DarkenBlur: + { + graphicsEffect = new ArithmeticCompositeEffect() + { + Source1Amount = .4f, + Source2Amount = .6f, + MultiplyAmount = 0, + Source1 = new ColorSourceEffect() + { + Name = "Base", + Color = Color.FromArgb(255, 0, 0, 0), + }, + Source2 = new GaussianBlurEffect() + { + BlurAmount = 20, + Source = new CompositionEffectSourceParameter("ImageSource"), + Optimization = EffectOptimization.Balanced, + BorderMode= EffectBorderMode.Hard, + } + }; + } + break; + case EffectTypes.RainbowBlur: + { + graphicsEffect = new ArithmeticCompositeEffect() + { + Source1Amount = .3f, + Source2Amount = .7f, + MultiplyAmount = 0, + Source1 = new ColorSourceEffect() + { + Name = "Base", + Color = Color.FromArgb(255, 0, 0, 0), + }, + Source2 = new GaussianBlurEffect() + { + BlurAmount = 20, + Source = new CompositionEffectSourceParameter("ImageSource"), + Optimization = EffectOptimization.Balanced, + BorderMode = EffectBorderMode.Hard, + } + }; + animatableProperties = new[] { "Base.Color" }; + } + break; + default: + break; + } + + // Create the effect factory and instantiate a brush + CompositionEffectFactory _effectFactory = _compositor.CreateEffectFactory(graphicsEffect, animatableProperties); + CompositionEffectBrush brush = _effectFactory.CreateBrush(); + + // Set the destination brush as the source of the image content + brush.SetSourceParameter("ImageSource", _compositor.CreateBackdropBrush()); + + // If his effect uses a secondary brush, set it now + if (secondaryBrush != null) + { + brush.SetSourceParameter("SecondSource", secondaryBrush); + } + + // Update the destination layer with the fully configured brush + _destinationSprite.Brush = brush; + } + } + + private void ScopeBatch_Completed(object sender, CompositionBatchCompletedEventArgs args) + { + if (_destinationSprite != null) + { + // Scope batch completion event has fired, hide the destination sprite and cleanup + // the batch + _destinationSprite.IsVisible = false; + } + + CleanupScopeBatch(); + } + + private void CleanupScopeBatch() + { + if (_scopeBatch != null) + { + _scopeBatch.Completed -= ScopeBatch_Completed; + _scopeBatch.Dispose(); + _scopeBatch = null; + } + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/Gears/Gears.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/Gears/Gears.cs new file mode 100644 index 000000000..97a1b947a --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/Gears/Gears.cs @@ -0,0 +1,252 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Numerics; +using System.Runtime.CompilerServices; + +using Windows.Foundation; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Media.Imaging; +using Microsoft.UI.Xaml.Navigation; + +namespace CompositionSampleGallery +{ + public sealed partial class Gears : SamplePage, INotifyPropertyChanged + { + private Compositor _compositor; + private List _gearVisuals; + private ScalarKeyFrameAnimation _gearMotionScalarAnimation; + private double _x = 87, _y = 0d, _width = 100, _height = 100; + private double _gearDimension = 87; + private int _count; + + public event PropertyChangedEventHandler PropertyChanged; + + public Gears() + { + InitializeComponent(); + } + + public static string StaticSampleName => "Gears"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use ExpressionAnimations to update many Visual properites based off of one driving property. Press the slow or fast buttons to see the gears spin."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761162"; + + public int Count + { + get { return _count; } + set + { + _count = value; + RaisePropertyChanged(); + } + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + _compositor = ElementCompositionPreview.GetElementVisual(this)?.Compositor; + Setup(); + } + + private void Setup() + { + var firstGearVisual = ElementCompositionPreview.GetElementVisual(FirstGear); + firstGearVisual.Size = new Vector2((float)FirstGear.ActualWidth, (float)FirstGear.ActualHeight); + firstGearVisual.AnchorPoint = new Vector2(0.5f, 0.5f); + + for (int i = Container.Children.Count - 1; i > 0; i--) + { + Container.Children.RemoveAt(i); + } + + _x = 87; + _y = 0d; + _width = 100; + _height = 100; + _gearDimension = 87; + + Count = 1; + _gearVisuals = new List() { firstGearVisual }; + } + + private void AddGear_Click(object sender, RoutedEventArgs e) + { + // Create an image + var bitmapImage = new BitmapImage(new Uri("ms-appx:///Assets/Other/Gear.png")); + var image = new Image + { + Source = bitmapImage, + Width = _width, + Height = _height, + RenderTransformOrigin = new Point(0.5, 0.5) + }; + + // Set the coordinates of where the image should be + Canvas.SetLeft(image, _x); + Canvas.SetTop(image, _y); + + PerformLayoutCalculation(); + + // Add the gear to the container + Container.Children.Add(image); + + // Add a gear visual to the screen + var gearVisual = AddGear(image); + + ConfigureGearAnimation(_gearVisuals[_gearVisuals.Count - 1], _gearVisuals[_gearVisuals.Count - 2]); + } + + private Visual AddGear(Image gear) + { + // Create a visual based on the XAML object + var visual = ElementCompositionPreview.GetElementVisual(gear); + visual.Size = new Vector2((float)gear.ActualWidth, (float)gear.ActualHeight); + visual.AnchorPoint = new Vector2(0.5f, 0.5f); + _gearVisuals.Add(visual); + + Count++; + + return visual; + } + + private void ConfigureGearAnimation(Visual currentGear, Visual previousGear) + { + // If rotation expression is null then create an expression of a gear rotating the opposite direction + + var rotateExpression = -previousGear.GetReference().RotationAngleInDegrees; + + // Start the animation based on the Rotation Angle in Degrees. + currentGear.StartAnimation("RotationAngleInDegrees", rotateExpression); + } + + private void StartGearMotor(double secondsPerRotation) + { + // Start the first gear (the red one) + if (_gearMotionScalarAnimation == null) + { + _gearMotionScalarAnimation = _compositor.CreateScalarKeyFrameAnimation(); + var linear = _compositor.CreateLinearEasingFunction(); + + var startingValue = ExpressionValues.StartingValue.CreateScalarStartingValue(); + _gearMotionScalarAnimation.InsertExpressionKeyFrame(0.0f, startingValue); + _gearMotionScalarAnimation.InsertExpressionKeyFrame(1.0f, startingValue + 360f, linear); + + _gearMotionScalarAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + } + + _gearMotionScalarAnimation.Duration = TimeSpan.FromSeconds(secondsPerRotation); + _gearVisuals.First().StartAnimation("RotationAngleInDegrees", _gearMotionScalarAnimation); + } + + private void AnimateFast_Click(object sender, RoutedEventArgs e) + { + // Setup and start the animation on the red gear. + StartGearMotor(1); + } + + private void AnimateSlow_Click(object sender, RoutedEventArgs e) + { + // Setup and start the animation on the red gear. + StartGearMotor(5); + } + + private void Stop_Click(object sender, RoutedEventArgs e) + { + _gearVisuals.First().StopAnimation("RotationAngleInDegrees"); + } + + private void Reverse_Click(object sender, RoutedEventArgs e) + { + if (_gearMotionScalarAnimation.Direction == AnimationDirection.Normal) + { + _gearMotionScalarAnimation.Direction = AnimationDirection.Reverse; + } + else + { + _gearMotionScalarAnimation.Direction = AnimationDirection.Normal; + } + + _gearVisuals.First().StartAnimation("RotationAngleInDegrees", _gearMotionScalarAnimation); + } + + private void AddXGearsButton_Click(object sender, RoutedEventArgs e) + { + int gearsToAdd; + + if (int.TryParse(NumberOfGears.Text, out gearsToAdd)) + { + int amount = gearsToAdd + _gearVisuals.Count - 1; + Setup(); + + var maxAreaPerTile = Math.Sqrt((Container.ActualWidth * Container.ActualHeight) / (amount + Container.Children.Count)); + + if (maxAreaPerTile < _width) + { + var wholeTilesHeight = Math.Floor(Container.ActualHeight / maxAreaPerTile); + var wholeTileWidth = Math.Floor(Container.ActualWidth / maxAreaPerTile); + + FirstGear.Width = FirstGear.Height = maxAreaPerTile; + _width = _height = maxAreaPerTile; + + _x = _gearDimension = _width * 0.87; + } + + for (int i = 0; i < amount; i++) + { + AddGear_Click(sender, e); + } + } + } + + private void PerformLayoutCalculation() + { + if ( + ((_x + Container.Margin.Left + _width > Container.ActualWidth) && _gearDimension > 0) || + (_x < Container.Margin.Left && _gearDimension < 0)) + { + if (_gearDimension < 0) + { + _y -= _gearDimension; + } + else + { + _y += _gearDimension; + } + _gearDimension = -_gearDimension; + } + else + { + _x += _gearDimension; + } + } + + private void RaisePropertyChanged([CallerMemberName]string property = "") + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); + } + } +} \ No newline at end of file diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/Gears/Gears.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/Gears/Gears.xaml new file mode 100644 index 000000000..4dca60ed8 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/Gears/Gears.xaml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridResizing.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridResizing.xaml.cs new file mode 100644 index 000000000..714a2c432 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridResizing.xaml.cs @@ -0,0 +1,375 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using CompositionSampleGallery.Samples.SDK_14393.NineGridResizing; +using CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios; +using SamplesCommon; +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Numerics; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Hosting; +using Windows.Foundation; + +namespace CompositionSampleGallery +{ + public sealed partial class NineGridResizing : SamplePage, INotifyPropertyChanged + { + private readonly Compositor _compositor; + private readonly Visual _backgroundContainer; + private readonly SpriteVisual _ninegridVisual; + private readonly ManagedSurface _ninegridSurface; + private readonly CompositionNineGridBrush _ninegridBrush; + private readonly ObservableCollection _nineGridBrushScenarios; + private INineGridScenario _selectedBrushScenario; + private Vector2 _defaultSize; + private bool _isAnimatedInterpolation; + private static readonly TimeSpan _duration = TimeSpan.FromSeconds(2); + private ValueTimer _valueTimerXSlider; + private ValueTimer _valueTimerYSlider; + private ValueTimer _valueTimerScaleSlider; + + public static string StaticSampleName => "Nine-Grid Resizing"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Resize and Scale a SpriteVisual painted with a NineGridBrush"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869001"; + + public NineGridResizing() + { + this.InitializeComponent(); + + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + + // Add page loaded event listener + this.Loaded += NineGridResizing_Loaded; + + // Set data context for data binding + DataContext = this; + + // Sprite visual to be painted + _ninegridVisual = _compositor.CreateSpriteVisual(); + + // Create ninegridbrush and paint on visual; + _ninegridBrush = _compositor.CreateNineGridBrush(); + _ninegridVisual.Brush = _ninegridBrush; + _ninegridSurface = ImageLoader.Instance.LoadFromUri(new Uri("ms-appx:///Assets/Other/RoundedRect.png")); + + // Clip compgrid + var compGrid = ElementCompositionPreview.GetElementVisual(CompGrid); + compGrid.Clip = _compositor.CreateInsetClip(); + + // Scene container to be scaled + _backgroundContainer = ElementCompositionPreview.GetElementVisual(bkgHost); + + // Insert Composition island + ElementCompositionPreview.SetElementChildVisual(ngHost, _ninegridVisual); + + // Instatiate brush scenario list and fill with created brush scenarios + _nineGridBrushScenarios = new ObservableCollection(CreateBrushes(_compositor, _ninegridSurface, _ninegridVisual.Size)); + + // Set default combo box selection to first item + BrushScenarioSelected = _nineGridBrushScenarios.FirstOrDefault(); + + // Value timer initialization for sliders + _valueTimerXSlider = new ValueTimer(); + _valueTimerXSlider.ValueChanged += OnXSliderValueChanged; + + _valueTimerYSlider = new ValueTimer(); + _valueTimerYSlider.ValueChanged += OnYSliderValueChanged; + + _valueTimerScaleSlider = new ValueTimer(); + _valueTimerScaleSlider.ValueChanged += OnScaleSliderValueChanged; + } + + /// + /// Handles property changes for data binding. + /// + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Data binding for animated interpolation toggle button + /// + public bool IsAnimatedInterpolation + { + get { return _isAnimatedInterpolation; } + set + { + _isAnimatedInterpolation = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsAnimatedInterpolation))); + if (_isAnimatedInterpolation) + { + _valueTimerXSlider.IntervalMilliseconds = _valueTimerYSlider.IntervalMilliseconds = _valueTimerScaleSlider.IntervalMilliseconds = 250; + } + else + { + _valueTimerXSlider.IntervalMilliseconds = _valueTimerYSlider.IntervalMilliseconds = _valueTimerScaleSlider.IntervalMilliseconds = 0; + } + } + } + + /// + /// Data binding for selected brush combobox scenario. + /// + public INineGridScenario BrushScenarioSelected + { + get { return _selectedBrushScenario; } + set + { + _selectedBrushScenario = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(BrushScenarioSelected))); + ComboBoxSelectedItemChanged(); + } + } + + /// + /// Instantiate brush scenarios to use on the visual; used in combobox BrushSelection changed event. + /// + private static INineGridScenario[] CreateBrushes(Compositor compositor, ManagedSurface ninegridSurface, Vector2 visualSize) + { + ninegridSurface.Brush.Stretch = CompositionStretch.Fill; + + // Create INineGridScenario array to return. Surface scenario is special because it's used as input to another scenario + var surfaceNineGridScenario = new SurfaceNineGridScenario(compositor, ninegridSurface.Brush, "Source: SurfaceBrush"); + return new INineGridScenario[] + { + new ColorNineGridScenario(compositor, "Source: ColorBrush(hollow)"), + new BorderNineGridScenario(compositor, ninegridSurface.Brush, visualSize, "Source: ColorBrush(w/ content)"), + surfaceNineGridScenario, + new EffectNineGridScenario(compositor, (CompositionNineGridBrush)surfaceNineGridScenario.Brush, "Input to: EffectBrush"), + new MaskNineGridScenario(compositor, ninegridSurface.Brush, "Input to: MaskBrush") + }; + } + + /// + /// Handles selection change event from the XAML BrushSelection ComboBox. + /// Uses the appropriate scenario to update the visual with the correct brush. + /// + private void ComboBoxSelectedItemChanged() + { + // Remove content from the border case when switching brushes + var children = _ninegridVisual.Children; + if (children != null) + { + children.RemoveAll(); + } + + BrushScenarioSelected.Selected(_ninegridVisual); + } + + /// + /// Helper for slider value changes; updates ninegrid visual to correct x/y size with animation. + /// + private void AnimateXYSliderChangeHelper(ValueTimer sender, string direction) + { + // For animated case, animate from the current to the released values using a keyframe animation + if (IsAnimatedInterpolation) + { + var percentSliderValue = (float)sender.Value / 100.0f; + + float defaultSizeValue; + switch (direction) + { + case "x": + defaultSizeValue = _defaultSize.X; + break; + case "y": + defaultSizeValue = _defaultSize.Y; + break; + default: + throw new ArgumentException("Parameter must be 'x' or 'y'", direction); + } + + // Define keyframe animation + var animation = _compositor.CreateScalarKeyFrameAnimation(); + animation.InsertExpressionKeyFrame(1, direction + " * p"); + animation.SetScalarParameter(direction, defaultSizeValue); + animation.SetScalarParameter("p", percentSliderValue); + animation.Duration = _duration; + + // Start animation + _ninegridVisual.StartAnimation("Size." + direction.ToUpper(), animation); + } + } + + /// + /// Called on x slider value changed; calls value timer to start attempt at value change. + /// + private void SizeXSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + if (_valueTimerXSlider != null) + { + _valueTimerXSlider.Restart((float)((Slider)sender).Value); + } + } + + /// + /// Callback for value timer to execute value changed. + /// + private void OnXSliderValueChanged(ValueTimer sender, ValueChangedEventArgs args) + { + if (_valueTimerXSlider.IntervalMilliseconds != 0 && IsAnimatedInterpolation) + { + this.AnimateXYSliderChangeHelper(sender, "x"); + } + else if (!IsAnimatedInterpolation) + { + // For non-animated case, change Size.X based on the percentage value from the slider + var p = (float)args.Value / 100.0f; + var x = _defaultSize.X; + var y = _ninegridVisual.Size.Y; + _ninegridVisual.Size = new Vector2(x * p, y); + } + } + + /// + /// Called on y slider value changed; calls value timer to start attempt at value change. + /// + private void SizeYSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + if (_valueTimerYSlider != null) + { + _valueTimerYSlider.Restart((float)((Slider)sender).Value); + } + } + + /// + /// Callback for value timer to execute value changed. + /// + private void OnYSliderValueChanged(ValueTimer sender, ValueChangedEventArgs args) + { + if (_valueTimerYSlider.IntervalMilliseconds != 0 && IsAnimatedInterpolation) + { + this.AnimateXYSliderChangeHelper(sender, "y"); + } + else if(!IsAnimatedInterpolation) + { + // For non-animated case, change Size.Y based on the percentage value from the slider + var x = _ninegridVisual.Size.X; + var p = (float)args.Value / 100.0f; + var y = _defaultSize.Y; + _ninegridVisual.Size = new Vector2(x, y * p); + } + } + + /// + /// Called on scale slider value changed; calls value timer to start attempt at value change. + /// + private void ScaleSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + if (_valueTimerScaleSlider != null) + { + _valueTimerScaleSlider.Restart((float)((Slider)sender).Value); + } + } + + /// + /// Callback for value timer to execute value changed. + /// + private void OnScaleSliderValueChanged(ValueTimer sender, ValueChangedEventArgs args) + { + if (_valueTimerScaleSlider.IntervalMilliseconds != 0 && IsAnimatedInterpolation) + { + // For animated case, animate from the current to the released values using a keyframe animation + var scaleValue = (float)args.Value; + + // Define keyframe animation + var scaleAnimation = _compositor.CreateVector3KeyFrameAnimation(); + scaleAnimation.InsertKeyFrame(1, new Vector3(scaleValue / 100.0f, scaleValue / 100.0f, 1)); + scaleAnimation.Duration = _duration; + + // Start animations + _ninegridVisual.StartAnimation("Scale", scaleAnimation); + } + else if(!IsAnimatedInterpolation) + { + // For non-animated case, change Scale based on the percentage value from the slider + var s = (float)args.Value; + _ninegridVisual.Scale = new Vector3(s / 100.0f, s / 100.0f, 1); + } + } + + /// + /// Called on reset button click; reses sliders and visual to original values. + /// + private void ResetButton_Click(object sender, RoutedEventArgs e) + { + // Reset values on controls and restore default transforms + _ninegridVisual.Size = _defaultSize; + _ninegridVisual.Scale = new Vector3(1, 1, 0); + _ninegridBrush.SetInsetScales(1.0f); + _backgroundContainer.Scale = new Vector3(1, 1, 0); + SizeXSlider.Value = 100; + SizeYSlider.Value = 100; + ScaleSlider.Value = 100; + IsAnimatedInterpolation = false; + } + + /// + /// Called on page load to do initial setup. + /// + private void NineGridResizing_Loaded(object sender, RoutedEventArgs e) + { + // Set properties for ninegridVisual and backgroundContainer + SetDefaultVisualProperties(); + + LandscapeTrigger.SizeChanged(new Size(this.ActualSize.X, this.ActualSize.Y)); + PortraitTrigger.SizeChanged(new Size(this.ActualSize.X, this.ActualSize.Y)); + this.SizeChanged += BlurPlayground_SizeChanged; + } + + private void BlurPlayground_SizeChanged(object sender, SizeChangedEventArgs e) + { + LandscapeTrigger.SizeChanged(e.NewSize); + PortraitTrigger.SizeChanged(e.NewSize); + } + + /// + /// Set/update properties for the visual and container. + /// + private void SetDefaultVisualProperties() + { + // Compute size and transforms + _defaultSize = new Vector2((float)(Math.Min(ngHost.ActualWidth, ngHost.ActualHeight)) * 0.35f); + + // Specify centerpoint for scale transforms + _backgroundContainer.CenterPoint = new Vector3(bkgHost.RenderSize.ToVector2() / 2, 0); + + _ninegridVisual.Size = new Vector2((float)SizeXSlider.Value / 100.0f * _defaultSize.X, (float)SizeYSlider.Value / 100.0f * _defaultSize.Y); + _ninegridVisual.Offset = new Vector3(ngHost.RenderSize.ToVector2() / 2, 0); + _ninegridVisual.AnchorPoint = new Vector2(0.5f); + } + + /// + /// Recomputes transforms on visual based on updated UIElement size. + /// + private void CompGrid_SizeChanged(object sender, SizeChangedEventArgs e) + { + SetDefaultVisualProperties(); + } + + private void SamplePage_Unloaded(object sender, RoutedEventArgs e) + { + _valueTimerXSlider.Dispose(); + _valueTimerYSlider.Dispose(); + _valueTimerScaleSlider.Dispose(); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/BorderNineGridScenario.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/BorderNineGridScenario.cs new file mode 100644 index 000000000..d12bebeae --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/BorderNineGridScenario.cs @@ -0,0 +1,84 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; +using System.Numerics; + +using Windows.UI; + +using Microsoft.UI; +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios +{ + sealed internal class BorderNineGridScenario : INineGridScenario + { + private readonly CompositionNineGridBrush _nineGridBrush; + private readonly SpriteVisual _borderedContent; + private readonly Compositor _compositor; + private readonly string _text; + + public BorderNineGridScenario(Compositor compositor, CompositionSurfaceBrush surfaceBrush, Vector2 hostVisualSize, string text) + { + _nineGridBrush = compositor.CreateNineGridBrush(); + _nineGridBrush.Source = compositor.CreateColorBrush(Colors.Black); + _nineGridBrush.SetInsets(10.0f); + _nineGridBrush.IsCenterHollow = true; + + _borderedContent = compositor.CreateSpriteVisual(); + _borderedContent.Size = hostVisualSize - new Vector2(2 * 10.0f); + _borderedContent.Offset = new Vector3(10.0f, 10.0f, 0); + _borderedContent.Brush = surfaceBrush; + + _compositor = compositor; + _text = text; + } + + public CompositionBrush Brush + { + get + { + return _nineGridBrush; + } + } + + public string Text + { + get + { + return _text; + } + } + public void Selected(SpriteVisual hostVisual) + { + // Set ColorBrush as Source to NineGridBrush with HollowCenter and insert child Content visual + hostVisual.Brush = _nineGridBrush; + hostVisual.Children.InsertAtTop(_borderedContent); + + // Run expression animations to manage the size of borderedContent child visual + + var hostNode = hostVisual.GetReference(); + var nineBrush = _nineGridBrush.GetReference(); + var xSizeExpression = hostNode.Size.X - (nineBrush.LeftInset * nineBrush.LeftInsetScale + nineBrush.RightInset * nineBrush.RightInsetScale); + var ySizeExpression = hostNode.Size.Y - (nineBrush.TopInset * nineBrush.TopInsetScale + nineBrush.BottomInset + nineBrush.BottomInsetScale); + var xOffsetExpression = nineBrush.LeftInset * nineBrush.LeftInsetScale; + var yOffsetExpression = nineBrush.TopInset * nineBrush.TopInsetScale; + + _borderedContent.StartAnimation("Size.X", xSizeExpression); + _borderedContent.StartAnimation("Size.Y", ySizeExpression); + _borderedContent.StartAnimation("Offset.X", xOffsetExpression); + _borderedContent.StartAnimation("Offset.Y", yOffsetExpression); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/ColorNineGridScenario.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/ColorNineGridScenario.cs new file mode 100644 index 000000000..52698a1bc --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/ColorNineGridScenario.cs @@ -0,0 +1,55 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI; +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios +{ + sealed internal class ColorNineGridScenario : INineGridScenario + { + private readonly CompositionNineGridBrush _nineGridBrush; + private readonly string _text; + + public ColorNineGridScenario(Compositor compositor, string text) + { + _nineGridBrush = compositor.CreateNineGridBrush(); + _nineGridBrush.Source = compositor.CreateColorBrush(Colors.Black); + _nineGridBrush.SetInsets(10.0f); + _nineGridBrush.IsCenterHollow = true; + + _text = text; + } + + public CompositionBrush Brush + { + get + { + return _nineGridBrush; + } + } + public string Text + { + get + { + return _text; + } + } + + public void Selected(SpriteVisual hostVisual) + { + hostVisual.Brush = _nineGridBrush; + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/EffectNineGridScenario.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/EffectNineGridScenario.cs new file mode 100644 index 000000000..647cade63 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/EffectNineGridScenario.cs @@ -0,0 +1,59 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.Graphics.Canvas.Effects; +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios +{ + sealed internal class EffectNineGridScenario : INineGridScenario + { + private readonly CompositionEffectBrush _nineGridEffectBrush; + private readonly string _text; + + public EffectNineGridScenario(Compositor compositor, CompositionNineGridBrush sourceNineGridBrush, string text) + { + var saturationEffect = new SaturationEffect + { + Saturation = 0f, + Source = new CompositionEffectSourceParameter("sourceNineGridBrush"), + }; + var saturationFactory = compositor.CreateEffectFactory(saturationEffect); + _nineGridEffectBrush = saturationFactory.CreateBrush(); + _nineGridEffectBrush.SetSourceParameter("sourceNineGridBrush", sourceNineGridBrush); //takes a ninegrid source as input + + _text = text; + } + + public CompositionBrush Brush + { + get + { + return _nineGridEffectBrush; + } + } + public string Text + { + get + { + return _text; + } + } + + public void Selected(SpriteVisual hostVisual) + { + hostVisual.Brush = _nineGridEffectBrush; + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/MaskNineGridScenario.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/MaskNineGridScenario.cs new file mode 100644 index 000000000..4421889de --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/MaskNineGridScenario.cs @@ -0,0 +1,59 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI; +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios +{ + sealed internal class MaskNineGridScenario : INineGridScenario + { + private readonly CompositionMaskBrush _nineGridMaskBrush; + private readonly string _text; + + public MaskNineGridScenario(Compositor compositor, CompositionSurfaceBrush surfaceBrush, string text) + { + CompositionNineGridBrush brush = compositor.CreateNineGridBrush(); + brush.Source = surfaceBrush; + brush.SetInsets(60.0f); + brush.IsCenterHollow = true; + + _nineGridMaskBrush = compositor.CreateMaskBrush(); + _nineGridMaskBrush.Mask = brush; + _nineGridMaskBrush.Source = compositor.CreateColorBrush(Colors.Black); + + _text = text; + } + + public CompositionBrush Brush + { + get + { + return _nineGridMaskBrush; + } + } + public string Text + { + get + { + return _text; + } + } + + public void Selected(SpriteVisual hostVisual) + { + hostVisual.Brush = _nineGridMaskBrush; + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/SurfaceNineGridScenario.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/SurfaceNineGridScenario.cs new file mode 100644 index 000000000..934932d87 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/NineGridResizing/NineGridScenarios/SurfaceNineGridScenario.cs @@ -0,0 +1,54 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios +{ + sealed internal class SurfaceNineGridScenario : INineGridScenario + { + private readonly CompositionNineGridBrush _nineGridBrush; + private readonly string _text; + + public SurfaceNineGridScenario(Compositor compositor, CompositionSurfaceBrush surfaceBrush, string text) + { + _nineGridBrush = compositor.CreateNineGridBrush(); + _nineGridBrush.Source = surfaceBrush; + _nineGridBrush.SetInsets(60.0f); + + _text = text; + } + + public CompositionBrush Brush + { + get + { + return _nineGridBrush; + } + } + + public string Text + { + get + { + return _text; + } + } + + public void Selected(SpriteVisual hostVisual) + { + hostVisual.Brush = _nineGridBrush; + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/NowPlaying/NowPlaying.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/NowPlaying/NowPlaying.xaml new file mode 100644 index 000000000..012b03213 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/NowPlaying/NowPlaying.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/NowPlaying/NowPlaying.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/NowPlaying/NowPlaying.xaml.cs new file mode 100644 index 000000000..ea1c5a8c3 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/NowPlaying/NowPlaying.xaml.cs @@ -0,0 +1,255 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using SamplesCommon; +using System; +using System.Numerics; + +using Windows.Foundation; +using Windows.Graphics.Effects; + +using Microsoft.Graphics.Canvas.Effects; +using Microsoft.Graphics.Canvas.Text; +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Text; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; + +namespace CompositionSampleGallery +{ + public sealed partial class NowPlaying : SamplePage + { + private Compositor _compositor; + private SpriteVisual _textSprite; + + public NowPlaying() + { + this.InitializeComponent(); + } + + public static string StaticSampleName => "Now Playing"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates the use of image lighting with BackdropBrush with a HardLight blend to create an interesting dynamic visual effect."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869002"; + + private void Grid_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + // Get the current compositor + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + + // Set the artist image + ArtistImage.Source = new Uri("ms-appx:///Assets/Landscapes/Landscape-7.jpg"); + + // Disable the placeholder image + ArtistImage.PlaceholderDelay = TimeSpan.MinValue; + + // Bounds of the window, used for positioning lights + //Vector2 sizeWindowBounds = new Vector2((float)Window.Current.Bounds.Width, (float)Window.Current.Bounds.Height); + Vector2 sizeWindowBounds = new Vector2(this.ActualSize.X, this.ActualSize.Y); + + // Setup the image and lighting effect + CreateImageAndLights(sizeWindowBounds); + + // Setup text with the hard light blending over the drawn content + CreateTextAndBlendEffect(sizeWindowBounds); + } + + private void CreateTextAndBlendEffect(Vector2 sizeLightBounds) + { + // + // Crete the effect graph, doing a hard light blend of the text over the + // content already drawn into the backbuffer + // + + IGraphicsEffect graphicsEffect = new BlendEffect() + { + Mode = BlendEffectMode.HardLight, + Foreground = new CompositionEffectSourceParameter("Text"), + Background = new CompositionEffectSourceParameter("Destination"), + }; + + CompositionEffectFactory effectFactory = _compositor.CreateEffectFactory(graphicsEffect, null); + CompositionEffectBrush brush = effectFactory.CreateBrush(); + + // Bind the destination brush + brush.SetSourceParameter("Destination", _compositor.CreateBackdropBrush()); + + + // + // Create the text surface which we'll scroll over the image with the lighting effect + // + + // Pick a nice size font depending on target size + const float maxFontSize = 72; + const float scaleFactor = 12; + float fontSize = Math.Min(sizeLightBounds.X / scaleFactor, maxFontSize); + + // Create the text format description, then the surface + CanvasTextFormat textFormat = new CanvasTextFormat + { + FontFamily = "Segoe UI", + FontSize = fontSize, + FontWeight = FontWeights.Bold, + WordWrapping = CanvasWordWrapping.WholeWord, + HorizontalAlignment = CanvasHorizontalAlignment.Center, + VerticalAlignment = CanvasVerticalAlignment.Center + }; + + string text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec efficitur, eros sit amet laoreet scelerisque, " + + "nunc odio ultricies metus, ut consectetur nulla massa eu nibh.Phasellus in lorem id nunc euismod tempus.Phasellus et nulla non turpis tempor blandit ut eget turpis." + + "Phasellus ac ornare elit, ut scelerisque dolor. Nam vel finibus lorem. Aenean malesuada pulvinar eros id ornare. Fusce blandit ante eget dolor efficitur suscipit." + + "Phasellus ac lacus nibh. Aenean eget blandit risus, in lacinia mi. Proin fermentum ante eros, non sollicitudin mi pretium eu. Curabitur suscipit lectus arcu, eget" + + "pretium quam sagittis non. Mauris purus mauris, condimentum nec laoreet sit amet, imperdiet sit amet nisi. Sed interdum, urna et aliquam porta, elit velit tincidunt orci," + + "vitae vestibulum risus lacus at nulla.Phasellus sapien ipsum, pellentesque varius enim nec, iaculis aliquet enim. Nulla id dapibus ante. Sed hendrerit sagittis leo, commodo" + + "fringilla ligula rutrum ut. Nullam sodales, ex ut pellentesque scelerisque, sapien nulla mattis lectus, vel ullamcorper leo enim ac mi.Sed consectetur vitae velit in consequat." + + "Pellentesque ac condimentum justo, at feugiat nulla. Sed ut congue neque. Nam gravida quam ac urna porttitor, ut bibendum ante mattis.Cras viverra cursus sapien, et sollicitudin" + + "risus fringilla eget. Nulla facilisi. Duis pellentesque scelerisque nisi, facilisis malesuada massa gravida et. Vestibulum ac leo sed orci tincidunt feugiat.Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc id leo vestibulum, vulputate ipsum sit amet, scelerisque velit. Curabitur imperdiet justo et tortor dignissim, sit amet volutpat sem ullamcorper. Nam mollis ullamcorper tellus vitae convallis. Aliquam eleifend elit nec tincidunt pharetra. Aliquam turpis eros, mollis et nunc quis, porta molestie justo. Etiam ultrices sem non turpis imperdiet dictum.Aliquam molestie elit in urna sodales, nec luctus dui laoreet.Curabitur molestie risus vel ligula efficitur, non fringilla urna iaculis.Curabitur neque tortor, facilisis quis dictum facilisis, facilisis et ante. Sed nisl erat, semper vitae efficitur ut, congue vitae quam. Ut auctor lacus sit amet varius placerat.Sed ac tellus tempus, ultricies est quis, tempor felis.Nulla vel faucibus elit, eu tincidunt eros. Nulla blandit id nisl ut porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam suscipit tellus a mattis pulvinar. Sed et libero vel ligula elementum suscipit.Ut elementum libero at sagittis pharetra. Fusce ultrices odio sapien, a posuere est consectetur ut."; + + // Make the surface twice the height to give us room to scroll + Vector2 surfaceSize = new Vector2(sizeLightBounds.X, 2f * sizeLightBounds.Y); + ManagedSurface textSurface = ImageLoader.Instance.LoadText(text, surfaceSize.ToSize(), + textFormat, Colors.White, Colors.Transparent); + brush.SetSourceParameter("Text", textSurface.Brush); + + // Create the sprite and parent it to the panel with the clip + _textSprite = _compositor.CreateSpriteVisual(); + _textSprite.Size = surfaceSize; + _textSprite.Brush = brush; + + ElementCompositionPreview.SetElementChildVisual(MyPanel, _textSprite); + + // Lastly, setup the slow scrolling animation of the text + LinearEasingFunction linear = _compositor.CreateLinearEasingFunction(); + Vector3KeyFrameAnimation offsetAnimation = _compositor.CreateVector3KeyFrameAnimation(); + offsetAnimation.InsertKeyFrame(0f, new Vector3(0, 0, 0), linear); + offsetAnimation.InsertKeyFrame(1f, new Vector3(0, -_textSprite.Size.Y * .5f, 0), linear); + offsetAnimation.Duration = TimeSpan.FromMilliseconds(30000); + offsetAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + _textSprite.StartAnimation("Offset", offsetAnimation); + } + + private void CreateImageAndLights(Vector2 sizeLightBounds) + { + // + // Image and effect setup + // + + // Create the effect graph. We will combine the desaturated image with two diffuse lights + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.Add, + Sources = + { + new SaturationEffect() + { + Saturation = 0, + Source = new CompositionEffectSourceParameter("ImageSource") + }, + + new PointDiffuseEffect() + { + Name = "Light1", + DiffuseAmount = 1f, + }, + + new PointDiffuseEffect() + { + Name = "Light2", + DiffuseAmount = 1f, + }, + } + }; + + // Create the effect factory, we're going to animate the light positions and colors + CompositionEffectFactory effectFactory = _compositor.CreateEffectFactory(graphicsEffect, + new[] { "Light1.LightPosition", "Light1.LightColor", + "Light2.LightPosition", "Light2.LightColor", }); + + // Create the effect brush and bind the normal map + CompositionEffectBrush brush = effectFactory.CreateBrush(); + + // Update the CompositionImage to use the custom effect brush + ArtistImage.Brush = brush; + + + // + // Animation setup + // + + // Setup the first light's position, top and to the left in general + LinearEasingFunction linear = _compositor.CreateLinearEasingFunction(); + Vector3KeyFrameAnimation positionAnimation = _compositor.CreateVector3KeyFrameAnimation(); + positionAnimation.InsertKeyFrame(0f, new Vector3(0f, 0f, 300f), linear); + positionAnimation.InsertKeyFrame(.33f, new Vector3(sizeLightBounds.X * .5f, sizeLightBounds.Y * .5f, 100f), linear); + positionAnimation.InsertKeyFrame(.66f, new Vector3(sizeLightBounds.X * .25f, sizeLightBounds.Y * .95f, 100f), linear); + positionAnimation.InsertKeyFrame(1f, new Vector3(0f, 0f, 300f), linear); + positionAnimation.Duration = TimeSpan.FromMilliseconds(20000); + positionAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + brush.StartAnimation("Light1.LightPosition", positionAnimation); + + + // Setup the first light's color animation, cycling through some brighter tones + ColorKeyFrameAnimation colorAnimation = _compositor.CreateColorKeyFrameAnimation(); + colorAnimation.InsertKeyFrame(0f, Colors.Orange); + colorAnimation.InsertKeyFrame(.2f, Colors.Orange); + colorAnimation.InsertKeyFrame(.3f, Colors.Red); + colorAnimation.InsertKeyFrame(.5f, Colors.Red); + colorAnimation.InsertKeyFrame(.6f, Colors.Yellow); + colorAnimation.InsertKeyFrame(.8f, Colors.Yellow); + colorAnimation.InsertKeyFrame(.9f, Colors.Orange); + colorAnimation.InsertKeyFrame(1f, Colors.Orange); + colorAnimation.Duration = TimeSpan.FromMilliseconds(20000); + colorAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + brush.StartAnimation("Light1.LightColor", colorAnimation); + + + // Setup the second light's position, down and to the right in general + positionAnimation = _compositor.CreateVector3KeyFrameAnimation(); + positionAnimation.InsertKeyFrame(0f, new Vector3(sizeLightBounds.X, sizeLightBounds.Y, 200f), linear); + positionAnimation.InsertKeyFrame(.33f, new Vector3(sizeLightBounds.X * .7f, sizeLightBounds.Y * .9f, 300f), linear); + positionAnimation.InsertKeyFrame(.66f, new Vector3(sizeLightBounds.X * .95f, sizeLightBounds.Y * .95f, 100f), linear); + positionAnimation.InsertKeyFrame(1f, new Vector3(sizeLightBounds.X, sizeLightBounds.Y, 200f), linear); + positionAnimation.Duration = TimeSpan.FromMilliseconds(20000); + positionAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + brush.StartAnimation("Light2.LightPosition", positionAnimation); + + // Setup the second light's color animation, cycling through some darker tones + colorAnimation = _compositor.CreateColorKeyFrameAnimation(); + colorAnimation.InsertKeyFrame(0f, Colors.Blue); + colorAnimation.InsertKeyFrame(.2f, Colors.Blue); + colorAnimation.InsertKeyFrame(.3f, Colors.DarkGreen); + colorAnimation.InsertKeyFrame(.5f, Colors.DarkGreen); + colorAnimation.InsertKeyFrame(.6f, Colors.DarkBlue); + colorAnimation.InsertKeyFrame(.8f, Colors.DarkBlue); + colorAnimation.InsertKeyFrame(.9f, Colors.Blue); + colorAnimation.InsertKeyFrame(1f, Colors.Blue); + colorAnimation.Duration = TimeSpan.FromMilliseconds(20000); + colorAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + brush.StartAnimation("Light2.LightColor", colorAnimation); + } + + private void MyPanel_SizeChanged(object sender, SizeChangedEventArgs e) + { + MyClip.Rect = new Rect(0d, 0d, e.NewSize.Width, e.NewSize.Height); + + // Resize the text layer if available + if (_textSprite != null) + { + _textSprite.Size = new Vector2((float)e.NewSize.Width, (float)e.NewSize.Height * 2f); + } + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/OffsetStompingFix/OffsetStompingFix.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/OffsetStompingFix/OffsetStompingFix.xaml new file mode 100644 index 000000000..bb24c8ec5 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/OffsetStompingFix/OffsetStompingFix.xaml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/PullToRefresh/PullToRefresh.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/PullToRefresh/PullToRefresh.xaml new file mode 100644 index 000000000..8e76598f3 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/PullToRefresh/PullToRefresh.xaml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/PullToRefresh/PullToRefresh.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/PullToRefresh/PullToRefresh.xaml.cs new file mode 100644 index 000000000..481eb27c5 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/PullToRefresh/PullToRefresh.xaml.cs @@ -0,0 +1,211 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System.Numerics; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +using ExpressionBuilder; + +using Microsoft.UI.Composition; +using Microsoft.UI.Composition.Interactions; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Input; +using CompositionSampleGallery.Shared; + +namespace CompositionSampleGallery +{ + public sealed partial class PullToRefresh : SamplePage + { + private Visual _contentPanelVisual; + private Visual _root; + private Compositor _compositor; + private VisualInteractionSource _interactionSource; + private InteractionTracker _tracker; + + public PullToRefresh() + { + Model = new LocalDataSource(); + this.InitializeComponent(); + } + + + public static string StaticSampleName => "Pull-To-Refresh ListView Items"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to create a custom Pull-to-Refresh control using Interaction Tracker Source Modifiers"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868952"; + + public LocalDataSource Model { set; get; } + private void Page_Loaded(object sender, RoutedEventArgs e) + { + ThumbnailList.ItemsSource = ThumbnailList.ItemsSource = Model.AggregateDataSources(new ObservableCollection[] { Model.Landscapes, Model.Nature }); + _contentPanelVisual = ElementCompositionPreview.GetElementVisual(ContentPanel); + _root = ElementCompositionPreview.GetElementVisual(Root); + _compositor = _root.Compositor; + ConfigureInteractionTracker(); + SetupAnimatingRefreshPanel(); + } + + + private void SetupAnimatingRefreshPanel() + { + Visual loadingVisual = ElementCompositionPreview.GetElementVisual(FirstGear); + loadingVisual.Size = new Vector2((float)FirstGear.ActualWidth, (float)FirstGear.ActualHeight); + loadingVisual.AnchorPoint = new Vector2(0.5f, 0.5f); + + // Animate the refresh panel icon using a simple rotating key frame animation + ScalarKeyFrameAnimation _loadingMotionScalarAnimation = _compositor.CreateScalarKeyFrameAnimation(); + var linear = _compositor.CreateLinearEasingFunction(); + + _loadingMotionScalarAnimation.InsertExpressionKeyFrame(0.0f, "this.StartingValue"); + _loadingMotionScalarAnimation.InsertExpressionKeyFrame(1.0f, "this.StartingValue + 360", linear); + _loadingMotionScalarAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + _loadingMotionScalarAnimation.Duration = TimeSpan.FromSeconds(2); + + loadingVisual.StartAnimation("RotationAngleInDegrees", _loadingMotionScalarAnimation); + + } + + + private void ConfigureInteractionTracker() + { + _tracker = InteractionTracker.Create(_compositor); + + _interactionSource = VisualInteractionSource.Create(_root); + + _interactionSource.PositionYSourceMode = InteractionSourceMode.EnabledWithInertia; + _interactionSource.PositionYChainingMode = InteractionChainingMode.Always; + + _tracker.InteractionSources.Add(_interactionSource); + float refreshPanelHeight = (float)RefreshPanel.ActualHeight; + + _tracker.MaxPosition = new Vector3((float)Root.ActualWidth, 0, 0); + _tracker.MinPosition = new Vector3(-(float)Root.ActualWidth, -refreshPanelHeight, 0); + + //The PointerPressed handler needs to be added using AddHandler method with the handledEventsToo boolean set to "true" + //instead of the XAML element's "PointerPressed=Window_PointerPressed", + //because the list view needs to chain PointerPressed handled events as well. + ContentPanel.AddHandler(PointerPressedEvent, new PointerEventHandler(Window_PointerPressed), true); + + SetupPullToRefreshBehavior(refreshPanelHeight); + + //Apply spring force to pull the content back to Zero + ConfigureRestingPoint(refreshPanelHeight); + + // + // Use the Tracker's Position (negated) to apply to the Offset of the Image. The -{refreshPanelHeight} is to hide the refresh panel + // + _contentPanelVisual.StartAnimation("Offset.Y", -_tracker.GetReference().Position.Y - refreshPanelHeight); + + } + + private void Window_PointerPressed(object sender, PointerRoutedEventArgs e) + { + try + { + // Tell the system to use the gestures from this pointer point (if it can). + _interactionSource.TryRedirectForManipulation(e.GetCurrentPoint(null)); + } + catch (Exception) + { + // Ignoring the failed redirect to prevent app crashing + } + } + + // Apply two sourcemodifiers to the input source: One to provide resistance, one to stop motion + public void SetupPullToRefreshBehavior( + float pullToRefreshDistance) + { + // + // Modifier 1: Cut DeltaY to a third as long as the InteractionTracker is not yet at the + // pullRefreshDistance. + // + + CompositionConditionalValue resistanceModifier = CompositionConditionalValue.Create(_compositor); + + ExpressionAnimation resistanceCondition = _compositor.CreateExpressionAnimation( + $"-tracker.Position.Y < {pullToRefreshDistance}"); + resistanceCondition.SetReferenceParameter("tracker", _tracker); + + ExpressionAnimation resistanceAlternateValue = _compositor.CreateExpressionAnimation( + "source.DeltaPosition.Y / 3"); + + resistanceAlternateValue.SetReferenceParameter("source", _interactionSource); + + resistanceModifier.Condition = resistanceCondition; + resistanceModifier.Value = resistanceAlternateValue; + + // + // Modifier 2: Zero the delta if we are past the pullRefreshDistance. (So we can't pan + // past the pullRefreshDistance) + // + + CompositionConditionalValue stoppingModifier = CompositionConditionalValue.Create(_compositor); + ExpressionAnimation stoppingCondition = _compositor.CreateExpressionAnimation( + $"-tracker.Position.Y >= {pullToRefreshDistance}"); + stoppingCondition.SetReferenceParameter("tracker", _tracker); + + ExpressionAnimation stoppingAlternateValue = _compositor.CreateExpressionAnimation("0"); + + stoppingModifier.Condition = stoppingCondition; + stoppingModifier.Value = stoppingAlternateValue; + + // + // Apply the modifiers to the source as a list + // + + List modifierList = + new List() { resistanceModifier, stoppingModifier + }; + + _interactionSource.ConfigureDeltaPositionYModifiers(modifierList); + } + + private void ActivateSpringForce(float pullToRefreshDistance) + { + var dampingConstant = 5; + var springConstant = 5; + + var modifier = InteractionTrackerInertiaMotion.Create(_compositor); + + // Set the condition to true (always) + modifier.SetCondition((BooleanNode)true); + + var target = ExpressionValues.Target.CreateInteractionTrackerTarget(); + + // Define a spring-like force, anchored at position 0. This brings the listView back to position 0. + modifier.SetMotion(-(target.Position.Y * springConstant) - (target.PositionVelocityInPixelsPerSecond.Y * dampingConstant)); + + _tracker.ConfigurePositionYInertiaModifiers(new InteractionTrackerInertiaModifier[] { modifier }); + } + + + private void ConfigureRestingPoint(float pullToRefreshDistance) + { + // Setup a possible inertia endpoint (snap point) for the InteractionTracker's minimum position + var endpoint1 = InteractionTrackerInertiaRestingValue.Create(_compositor); + var target = ExpressionValues.Target.CreateInteractionTrackerTarget(); + + // Use this endpoint when the natural resting position of the interaction is less than the size fo the Refresh Panel. + endpoint1.SetCondition(target.NaturalRestingPosition.Y < pullToRefreshDistance); + + // Set the result for this condition to make the InteractionTracker's y position the minimum y position + endpoint1.SetRestingValue(-target.MinPosition.Y - pullToRefreshDistance); + _tracker.ConfigurePositionYInertiaModifiers(new InteractionTrackerInertiaModifier[] { endpoint1 }); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/SceneNode/SceneNodePlayground.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/SceneNode/SceneNodePlayground.xaml new file mode 100644 index 000000000..ac9803c44 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/SceneNode/SceneNodePlayground.xaml @@ -0,0 +1,15 @@ + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/SceneNode/SceneNodePlayground.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/SceneNode/SceneNodePlayground.xaml.cs new file mode 100644 index 000000000..94940e5a9 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/SceneNode/SceneNodePlayground.xaml.cs @@ -0,0 +1,1170 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using SamplesCommon; +using System; +using System.Runtime.InteropServices; +using System.Numerics; + +using Windows.Foundation; + +using Microsoft.UI.Composition; +using Microsoft.UI.Composition.Scenes; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; +using WinRT; + +namespace CompositionSampleGallery +{ + public sealed partial class SceneNodePlayground : SamplePage + { + public static string StaticSampleName => "SceneNode Playground"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "SceneNode Sample."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761172"; + + public SceneNodePlayground() + { + this.InitializeComponent(); + } + + private void SceneNodePlayground_Loaded(object sender, RoutedEventArgs e) + { + Compositor compositor = ElementCompositionPreview.GetElementVisual(MyGrid).Compositor; + ContainerVisual container = compositor.CreateContainerVisual(); + ElementCompositionPreview.SetElementChildVisual(MyGrid, container); + + var sceneNode = SceneNode.Create(compositor); + + var sceneVisual = SceneVisual.Create(compositor); + sceneVisual.Root = sceneNode; + sceneVisual.Size = new Vector2(500); + sceneVisual.Offset = new Vector3(250, 250, 0); + + container.Children.InsertAtTop(sceneVisual); + + var mesh = SceneMesh.Create(compositor); + + mesh.PrimitiveTopology = Microsoft.Graphics.DirectX.DirectXPrimitiveTopology.TriangleList; + + mesh.FillMeshAttribute( + SceneAttributeSemantic.Vertex, + Microsoft.Graphics.DirectX.DirectXPixelFormat.R32G32B32Float, + CopyArrayOfBytesToMemoryBuffer(k_rgPositions)); + + mesh.FillMeshAttribute( + SceneAttributeSemantic.Index, + Microsoft.Graphics.DirectX.DirectXPixelFormat.R16UInt, + CopyArrayOfBytesToMemoryBuffer(k_rgIndices)); + + mesh.FillMeshAttribute( + SceneAttributeSemantic.Normal, + Microsoft.Graphics.DirectX.DirectXPixelFormat.R32G32B32Float, + CopyArrayOfBytesToMemoryBuffer(k_rgNormals)); + + var material = SceneMetallicRoughnessMaterial.Create(compositor); + material.BaseColorFactor = new Vector4(56f / 255f, 191f / 255f, 110f / 255f, 1.0f); + + var meshRendererComponent = SceneMeshRendererComponent.Create(compositor); + meshRendererComponent.Mesh = mesh; + meshRendererComponent.Material = material; + + sceneNode.Components.Add(meshRendererComponent); + } + + private void SceneNodePlayground_Unloaded(object sender, RoutedEventArgs e) + { + + } + + static MemoryBuffer CopyArrayOfBytesToMemoryBuffer(byte[] a) + { + MemoryBuffer mb = new MemoryBuffer((uint)a.Length); + var mbr = mb.CreateReference(); + var mba = mbr.As(); + unsafe + { + byte* bytes = null; + uint capacity; + mba.GetBuffer(&bytes, &capacity); + for (int i = 0; i < capacity; ++i) + { + bytes[i] = a[i]; + } + } + + return mb; + } + + [ComImport, + Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d"), + InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + interface IMemoryBufferByteAccess + { + unsafe void GetBuffer(byte** bytes, uint* capacity); + } + + + static byte[] k_rgPositions = + { + 0xbf, 0x7d, 0xbf, 0xc1, 0x96, 0x90, 0x38, 0x41, 0x66, 0xe6, 0xf4, 0x41, 0xab, 0xcf, 0x95, 0xc1, 0x5f, 0xba, 0x21, 0x41, 0x81, 0x73, 0xd5, 0x41, 0xec, 0x2f, 0x7b, 0xc1, 0x45, 0xd8, 0x36, 0x41, 0xab, 0xed, 0x08, 0x42, 0x11, 0x58, 0x37, 0xc1, 0x2a, 0xa9, 0x20, 0x41, 0x2a, 0x98, 0xee, 0x41, 0xc3, 0x42, 0xc4, 0xc1, 0xcf, 0xd5, 0x21, 0x41, 0xbb, 0xa7, 0xb1, 0x41, 0x24, 0x28, 0xf4, 0xc1, 0x03, 0x09, 0x3a, 0x41, 0x90, 0x0f, 0xc9, 0x41, 0x77, 0x9c, 0x0c, 0xc2, 0x06, 0xf0, 0x3a, 0x41, +0xb7, 0xc0, 0x8d, 0x41, 0x38, 0x67, 0xe4, 0xc1, 0x23, 0xdb, 0x22, 0x41, 0xc0, 0xca, 0x7c, 0x41, 0xe1, 0xe9, 0xf8, 0xc1, 0x8c, 0xb9, 0x22, 0x41, 0xc6, 0x50, 0xcc, 0x40, 0x74, 0xb5, 0x17, 0xc2, 0xe1, 0x7a, 0x3c, 0x41, 0xb7, 0xe9, 0xdf, 0x40, 0x20, 0x12, 0x3f, 0x42, 0xf4, 0xdb, 0x61, 0x41, 0x1c, 0x7c, 0x06, 0x42, 0x55, 0x30, 0x76, 0x42, 0x91, 0x5c, 0x64, 0x41, 0x64, 0xaa, 0xc9, 0x41, 0x49, 0x5d, 0x4f, 0x42, 0xdd, 0xa4, 0x8d, 0x41, 0xa5, 0x3d, 0x12, 0x42, 0xf2, 0x70, 0x83, 0x42, +0xdc, 0xf9, 0x92, 0x41, 0x89, 0xb0, 0xd8, 0x41, 0xfb, 0x0b, 0x60, 0x42, 0xb6, 0xf3, 0x36, 0x41, 0x05, 0x92, 0xb5, 0x41, 0xd9, 0xbd, 0x2e, 0x42, 0x47, 0xe1, 0x36, 0x41, 0x96, 0x21, 0xf0, 0x41, 0x71, 0x2c, 0xe5, 0xc1, 0x8e, 0x97, 0x66, 0x41, 0xcd, 0xea, 0x07, 0x42, 0x09, 0xac, 0x9b, 0xc1, 0xab, 0xf1, 0x64, 0x41, 0xf1, 0xb4, 0x17, 0x42, 0x9c, 0x44, 0x10, 0xc2, 0x1e, 0x16, 0x68, 0x41, 0xea, 0x73, 0xdd, 0x41, 0x80, 0xb7, 0x03, 0xc2, 0x8e, 0x75, 0x94, 0x41, 0x32, 0xe6, 0x12, 0x42, +0xec, 0xaf, 0x23, 0xc2, 0xbf, 0x0e, 0x95, 0x41, 0x08, 0x1b, 0xed, 0x41, 0xd8, 0xdf, 0xb9, 0xc1, 0xbe, 0x30, 0x91, 0x41, 0xee, 0x2b, 0x24, 0x42, 0x03, 0xc9, 0x23, 0xc2, 0x17, 0x48, 0x6a, 0x41, 0x73, 0xc6, 0x99, 0x41, 0x83, 0xaf, 0x30, 0xc2, 0xb3, 0x7b, 0x6a, 0x41, 0x96, 0xe7, 0xe8, 0x40, 0x75, 0xb1, 0x38, 0xc2, 0x80, 0x48, 0x95, 0x41, 0x61, 0x32, 0xa4, 0x41, 0xeb, 0x11, 0x49, 0xc2, 0xac, 0x1c, 0x93, 0x41, 0x1e, 0xa2, 0xeb, 0x40, 0x84, 0x3c, 0x89, 0x42, 0x36, 0x3c, 0x63, 0x41, +0x11, 0x36, 0x61, 0x41, 0x78, 0xcb, 0x79, 0x42, 0xe5, 0x61, 0x36, 0x41, 0x89, 0xb0, 0x4f, 0x41, 0x00, 0xaf, 0x92, 0x42, 0x3f, 0xc6, 0x92, 0x41, 0xdc, 0xb5, 0x6e, 0x41, 0x07, 0x1f, 0x5f, 0x42, 0x8b, 0xfd, 0xb3, 0x41, 0x9d, 0x2f, 0x1a, 0x42, 0x14, 0xbf, 0x89, 0x42, 0x1d, 0x49, 0xbb, 0x41, 0xcc, 0x5d, 0xe3, 0x41, 0x2e, 0xee, 0x70, 0x42, 0x21, 0x8e, 0xe1, 0x41, 0x2d, 0x61, 0x1e, 0x42, 0xc8, 0x98, 0x8e, 0x42, 0x86, 0x49, 0xe8, 0x41, 0x02, 0xab, 0xea, 0x41, 0x77, 0xed, 0x13, 0xc2, +0xe4, 0xf2, 0xbd, 0x41, 0x6d, 0x56, 0x1a, 0x42, 0x05, 0x23, 0xd8, 0xc1, 0x9f, 0xbc, 0xbb, 0x41, 0x7a, 0x25, 0x2c, 0x42, 0xb9, 0xeb, 0x34, 0xc2, 0x6a, 0x4d, 0xbd, 0x41, 0x94, 0x65, 0xf7, 0x41, 0xda, 0x4a, 0x24, 0xc2, 0xf5, 0xa8, 0xea, 0x41, 0xbb, 0xe7, 0x1d, 0x42, 0xcd, 0xcc, 0x43, 0xc2, 0x84, 0x7c, 0xe7, 0x41, 0x17, 0x48, 0xfb, 0x41, 0x11, 0xe5, 0x03, 0xc2, 0xfc, 0x87, 0xed, 0x41, 0x73, 0xe8, 0x2d, 0x42, 0x03, 0xf8, 0x99, 0x42, 0x0e, 0xbe, 0xbb, 0x41, 0xca, 0x32, 0x79, 0x41, +0x49, 0xec, 0x9e, 0x42, 0xe4, 0x83, 0xe9, 0x41, 0xa0, 0x89, 0x80, 0x41, 0xe3, 0xc5, 0x91, 0x42, 0x3c, 0x7d, 0x0c, 0x42, 0xf8, 0xb1, 0xee, 0x41, 0x5f, 0xf6, 0x7c, 0x42, 0xc7, 0x3a, 0x0a, 0x42, 0xa3, 0x52, 0x1f, 0x42, 0xaa, 0x80, 0x82, 0x42, 0xfe, 0x94, 0x25, 0x42, 0x38, 0x89, 0x1f, 0x42, 0xa4, 0x9f, 0x93, 0x42, 0x52, 0xf8, 0x26, 0x42, 0x00, 0xde, 0xee, 0x41, 0x15, 0xdd, 0xa1, 0x42, 0x01, 0x8d, 0x0d, 0x42, 0xa2, 0x45, 0x83, 0x41, 0xbb, 0xb8, 0xa3, 0x42, 0xbd, 0x74, 0x28, 0x42, +0x67, 0xd5, 0x85, 0x41, 0xaa, 0x40, 0x81, 0x42, 0x89, 0xf0, 0x5d, 0x42, 0x27, 0x0f, 0x19, 0x42, 0xd4, 0x29, 0x84, 0x42, 0xd5, 0x38, 0x42, 0x42, 0xc7, 0xfa, 0x1c, 0x42, 0xc4, 0x51, 0x91, 0x42, 0x13, 0x03, 0x5c, 0x42, 0x72, 0xf9, 0xe9, 0x41, 0x55, 0xff, 0x93, 0x42, 0x88, 0x23, 0x42, 0x42, 0x50, 0x7c, 0xed, 0x41, 0xc6, 0x2d, 0xa3, 0x42, 0xd4, 0x5a, 0x43, 0x42, 0xd0, 0xb3, 0x87, 0x41, 0x6d, 0x56, 0xa0, 0x42, 0xbf, 0xbd, 0x5c, 0x42, 0x81, 0x95, 0x87, 0x41, 0x54, 0x12, 0x5e, 0x42, +0xcf, 0x77, 0x87, 0x42, 0x75, 0xf1, 0x0e, 0x42, 0x53, 0xc5, 0x74, 0x42, 0xd6, 0x05, 0x78, 0x42, 0x15, 0x2e, 0x15, 0x42, 0x72, 0x2a, 0x85, 0x42, 0x3f, 0xd5, 0x84, 0x42, 0xd8, 0x5f, 0xdf, 0x41, 0x0a, 0x57, 0x8c, 0x42, 0x90, 0x0f, 0x74, 0x42, 0xb2, 0x1d, 0xe5, 0x41, 0x26, 0x93, 0x9b, 0x42, 0x12, 0x14, 0x74, 0x42, 0xbb, 0x16, 0x86, 0x41, 0xba, 0xba, 0x95, 0x42, 0x52, 0xa7, 0x84, 0x42, 0xda, 0xce, 0x84, 0x41, 0x07, 0xfd, 0x2d, 0x42, 0xfd, 0x65, 0x97, 0x42, 0x8e, 0xf5, 0xfe, 0x41, +0x9a, 0x08, 0x42, 0x42, 0x49, 0x4e, 0x90, 0x42, 0x92, 0x9c, 0x07, 0x42, 0x6b, 0xbc, 0x63, 0x42, 0xe5, 0x01, 0x96, 0x42, 0xfa, 0xfe, 0xcd, 0x41, 0x07, 0x0e, 0x77, 0x42, 0xf2, 0x12, 0x8e, 0x42, 0x79, 0xd8, 0xd6, 0x41, 0xa2, 0x43, 0x8f, 0x42, 0xba, 0x5a, 0x8e, 0x42, 0x05, 0x56, 0x85, 0x41, 0xf3, 0x5d, 0x86, 0x42, 0x0a, 0xe6, 0x96, 0x42, 0xc2, 0x17, 0x85, 0x41, 0x2e, 0xff, 0x41, 0xc1, 0x8a, 0xff, 0x93, 0x42, 0x51, 0x5a, 0xe7, 0x41, 0x9c, 0xdc, 0xf7, 0x3f, 0x6a, 0xad, 0x91, 0x42, +0x55, 0x81, 0x07, 0x42, 0xfe, 0xcf, 0xec, 0xc0, 0xf2, 0x50, 0x98, 0x42, 0xd8, 0x01, 0xd3, 0x41, 0xc5, 0x72, 0x69, 0x40, 0x12, 0xd4, 0x97, 0x42, 0x4f, 0x62, 0xf4, 0x41, 0xb1, 0x4b, 0x58, 0xc0, 0x7d, 0x1d, 0x9c, 0x42, 0xf9, 0x8f, 0xb9, 0x41, 0x8c, 0x2d, 0xaa, 0x40, 0x92, 0xda, 0x9c, 0x42, 0x11, 0xb6, 0xd7, 0x41, 0x04, 0x56, 0x6d, 0x41, 0x06, 0xa1, 0x98, 0x42, 0x3b, 0x30, 0x00, 0x42, 0xc1, 0x39, 0x6b, 0x41, 0x68, 0xb1, 0x9d, 0x42, 0xda, 0x1b, 0xe7, 0x41, 0x5e, 0x29, 0x6c, 0x41, +0x7e, 0xbd, 0x93, 0x42, 0x2d, 0xa1, 0x0c, 0x42, 0x67, 0x44, 0x6b, 0xc1, 0x1d, 0x38, 0x99, 0x42, 0x67, 0xc4, 0x9d, 0x41, 0x15, 0x9d, 0x99, 0xc1, 0x7d, 0x9f, 0x9b, 0x42, 0x69, 0xc1, 0xea, 0x40, 0x75, 0x93, 0xa7, 0xc1, 0x05, 0x03, 0x96, 0x42, 0x2d, 0x32, 0xab, 0x41, 0x5b, 0x42, 0xc6, 0xc1, 0xf7, 0x75, 0x9c, 0x42, 0xb6, 0xd6, 0xf4, 0x40, 0x78, 0x7a, 0x54, 0xc1, 0x2e, 0x90, 0x9c, 0x42, 0x26, 0xfc, 0xd8, 0x40, 0xff, 0xf3, 0x14, 0xc1, 0xf3, 0x2e, 0x9c, 0x42, 0xd9, 0x4e, 0x8d, 0x41, +0x2f, 0x51, 0x15, 0x40, 0x17, 0x88, 0xa2, 0x42, 0xef, 0x38, 0x2b, 0x41, 0xfe, 0xec, 0x27, 0x3f, 0x04, 0x25, 0xa2, 0x42, 0xc3, 0x99, 0x7f, 0x40, 0x2c, 0x26, 0x9e, 0x40, 0x78, 0xda, 0xa2, 0x42, 0xac, 0x1c, 0x7d, 0x41, 0xd5, 0x38, 0x5d, 0xc2, 0xf0, 0xf6, 0xa2, 0x42, 0xf3, 0x7d, 0xa1, 0x41, 0x5d, 0x0f, 0x46, 0xc2, 0x6f, 0xc1, 0xa7, 0x42, 0x74, 0x24, 0xa6, 0x41, 0x1e, 0xe7, 0x5a, 0xc2, 0xc3, 0xf3, 0xb3, 0x42, 0xc0, 0x84, 0x0d, 0x41, 0x13, 0x32, 0x42, 0xc2, 0xfc, 0x87, 0xb8, 0x42, +0xb1, 0x0a, 0x11, 0x41, 0x13, 0x32, 0x42, 0xc2, 0xfc, 0x87, 0xb8, 0x42, 0xb1, 0x0a, 0x11, 0x41, 0x5d, 0x0f, 0x46, 0xc2, 0x6f, 0xc1, 0xa7, 0x42, 0x74, 0x24, 0xa6, 0x41, 0xd2, 0xaf, 0x29, 0xc2, 0x69, 0x0f, 0xb7, 0x42, 0x90, 0x5a, 0x10, 0x41, 0xf5, 0x68, 0x30, 0xc2, 0xbd, 0xc1, 0xa5, 0x42, 0xd7, 0xa3, 0xa8, 0x41, 0x65, 0x99, 0x41, 0xc2, 0x6d, 0x85, 0x9a, 0x42, 0x0e, 0xad, 0xd7, 0x41, 0x83, 0xaf, 0x30, 0xc2, 0xa0, 0xc9, 0x9b, 0x42, 0xaf, 0x03, 0xd1, 0x41, 0x65, 0x99, 0x41, 0xc2, +0x6d, 0x85, 0x9a, 0x42, 0x0e, 0xad, 0xd7, 0x41, 0x5b, 0xa0, 0x56, 0xc2, 0x99, 0x79, 0x95, 0x42, 0xba, 0xc9, 0xd7, 0x41, 0x1e, 0x56, 0x7f, 0xc2, 0xfb, 0xab, 0x8b, 0x42, 0xd7, 0xa3, 0x8d, 0x41, 0xe9, 0x55, 0x71, 0xc2, 0x1c, 0xba, 0x98, 0x42, 0x91, 0x7e, 0x98, 0x41, 0x74, 0x84, 0x81, 0xc2, 0xa5, 0xcc, 0x93, 0x42, 0x21, 0xe5, 0xe4, 0x40, 0x6e, 0xa3, 0x70, 0xc2, 0xb8, 0xcf, 0xa8, 0x42, 0xbd, 0x80, 0x04, 0x41, 0x17, 0x08, 0x69, 0xc2, 0x79, 0x47, 0x8d, 0x42, 0x0a, 0x57, 0xd3, 0x41, +0xc2, 0x46, 0x76, 0xc2, 0x40, 0x64, 0x83, 0x42, 0x6a, 0xcd, 0xc9, 0x41, 0x66, 0x95, 0x68, 0xc2, 0xc3, 0xa4, 0x71, 0x42, 0x0e, 0xad, 0xfc, 0x41, 0x74, 0x35, 0x5a, 0xc2, 0xc4, 0xc0, 0x81, 0x42, 0x7b, 0xb2, 0x03, 0x42, 0x67, 0xc4, 0x48, 0xc2, 0xf2, 0x90, 0x89, 0x42, 0x54, 0x63, 0x04, 0x42, 0xe9, 0xb7, 0x2b, 0xc2, 0x34, 0x00, 0x75, 0x42, 0x64, 0xcc, 0x1d, 0x42, 0xbb, 0x96, 0x39, 0xc2, 0x7e, 0x3f, 0x5e, 0x42, 0x1e, 0x56, 0x21, 0x42, 0xa1, 0xd6, 0x43, 0xc2, 0x3f, 0x06, 0x45, 0x42, +0x86, 0x49, 0x1f, 0x42, 0x09, 0x39, 0x56, 0xc2, 0x05, 0xa3, 0x38, 0x42, 0xa0, 0xf8, 0x0b, 0x42, 0x61, 0x43, 0x73, 0xc2, 0x98, 0xfb, 0x5f, 0x42, 0x18, 0x95, 0xe4, 0x41, 0xac, 0x7a, 0x69, 0xc2, 0x86, 0xc9, 0x2f, 0x42, 0xbb, 0x49, 0xe0, 0x41, 0xa9, 0x46, 0x7c, 0xc2, 0x80, 0xea, 0x52, 0x42, 0x41, 0x71, 0xc0, 0x41, 0xbf, 0xee, 0x81, 0xc2, 0xb7, 0x11, 0x65, 0x42, 0x1c, 0xeb, 0xad, 0x41, 0x16, 0x99, 0x7e, 0xc2, 0x38, 0x27, 0x73, 0x42, 0x28, 0xed, 0xba, 0x41, 0xa9, 0x93, 0x4a, 0xc2, +0xe1, 0xfa, 0xbb, 0x41, 0x4d, 0xf3, 0xa9, 0x41, 0x2c, 0x07, 0x5f, 0xc2, 0x11, 0x58, 0xb8, 0x41, 0xaa, 0x60, 0xf7, 0x40, 0x53, 0xb4, 0x59, 0xc2, 0x48, 0x50, 0xe4, 0x41, 0x08, 0x1b, 0xad, 0x41, 0xd2, 0x6f, 0x70, 0xc2, 0x1f, 0xe3, 0xe1, 0x41, 0x35, 0xb0, 0xfd, 0x40, 0x43, 0x6e, 0x95, 0xc0, 0xe6, 0xee, 0x0e, 0x42, 0xec, 0xde, 0x50, 0x42, 0x6a, 0xd9, 0xa5, 0xc0, 0x9f, 0x6b, 0x1d, 0x42, 0x8c, 0x79, 0x53, 0x42, 0xdb, 0xf9, 0x25, 0xc1, 0x96, 0x43, 0x11, 0x42, 0x9b, 0x55, 0x4f, 0x42, +0xca, 0xc3, 0x46, 0xc1, 0x4a, 0xfb, 0x1c, 0x42, 0x81, 0xc4, 0x4f, 0x42, 0x2a, 0x8c, 0xbe, 0xc0, 0xc0, 0x8a, 0x2d, 0x42, 0xfd, 0xa9, 0x54, 0x42, 0x64, 0x3b, 0x64, 0xc1, 0x24, 0xe8, 0x2d, 0x42, 0x8a, 0x8e, 0x4f, 0x42, 0x9e, 0x8d, 0x34, 0xc2, 0xc7, 0xba, 0x0c, 0x42, 0x3a, 0x52, 0x1c, 0x42, 0xd6, 0xb4, 0x50, 0xc2, 0x03, 0x67, 0x08, 0x42, 0x56, 0xfd, 0xf7, 0x41, 0x09, 0x39, 0x56, 0xc2, 0x05, 0xa3, 0x38, 0x42, 0xa0, 0xf8, 0x0b, 0x42, 0xac, 0x7a, 0x69, 0xc2, 0x86, 0xc9, 0x2f, 0x42, +0xbb, 0x49, 0xe0, 0x41, 0xa1, 0xd6, 0x43, 0xc2, 0x3f, 0x06, 0x45, 0x42, 0x86, 0x49, 0x1f, 0x42, 0xcc, 0x6e, 0x1d, 0xc2, 0x82, 0xb3, 0x14, 0x42, 0x49, 0x4c, 0x2b, 0x42, 0xee, 0xfc, 0x66, 0xc2, 0xab, 0x2d, 0x06, 0x42, 0x7b, 0x14, 0xac, 0x41, 0x9c, 0xd1, 0x7c, 0xc2, 0xbf, 0x6c, 0x05, 0x42, 0xd7, 0xc0, 0xf8, 0x40, 0xcc, 0xee, 0x79, 0xc2, 0x5f, 0x18, 0x2b, 0x42, 0xa7, 0xd7, 0x9c, 0x41, 0xf9, 0x80, 0x84, 0xc2, 0x01, 0x80, 0x29, 0x42, 0xc8, 0xea, 0xf2, 0x40, 0xe1, 0x06, 0xcb, 0xc0, +0x54, 0x23, 0x3e, 0x42, 0xd2, 0x5e, 0x54, 0x42, 0x49, 0x9d, 0xc6, 0xc0, 0x9a, 0xb7, 0x4d, 0x42, 0x67, 0xe6, 0x51, 0x42, 0x9d, 0x80, 0x6f, 0xc1, 0xa2, 0x63, 0x40, 0x42, 0xe8, 0x48, 0x4e, 0x42, 0x40, 0x13, 0x68, 0xc1, 0x16, 0x19, 0x51, 0x42, 0x97, 0x2e, 0x4c, 0x42, 0x01, 0x4d, 0xc1, 0xc1, 0x44, 0x9a, 0x85, 0x42, 0xea, 0x84, 0x1e, 0x42, 0x9c, 0xc4, 0xa8, 0xc1, 0x8d, 0x28, 0x81, 0x42, 0x37, 0xda, 0x26, 0x42, 0x91, 0x7e, 0x53, 0xc1, 0x4e, 0x51, 0x88, 0x42, 0xf8, 0x31, 0x1a, 0x42, +0xb1, 0xbf, 0x29, 0xc1, 0xc2, 0x26, 0x83, 0x42, 0x05, 0x12, 0x25, 0x42, 0x43, 0x9c, 0xe9, 0xc1, 0xec, 0x4f, 0x9f, 0x42, 0xfc, 0x5e, 0x01, 0x41, 0xbf, 0x6c, 0xdc, 0xc1, 0x1a, 0x60, 0x93, 0x42, 0x52, 0x27, 0xb7, 0x41, 0x5f, 0xba, 0xa6, 0xc1, 0xc6, 0xdc, 0x8f, 0x42, 0x33, 0xb3, 0xfc, 0x41, 0x5f, 0xba, 0xa6, 0xc1, 0xc6, 0xdc, 0x8f, 0x42, 0x33, 0xb3, 0xfc, 0x41, 0xbf, 0x6c, 0xdc, 0xc1, 0x1a, 0x60, 0x93, 0x42, 0x52, 0x27, 0xb7, 0x41, 0xf7, 0x64, 0xfe, 0xc1, 0xfa, 0xad, 0x8d, 0x42, +0x14, 0xbf, 0x05, 0x42, 0x5a, 0x53, 0x08, 0xc2, 0x89, 0x50, 0x93, 0x42, 0x16, 0x59, 0xb9, 0x41, 0x43, 0x9c, 0xe9, 0xc1, 0xec, 0x4f, 0x9f, 0x42, 0xfc, 0x5e, 0x01, 0x41, 0x11, 0x76, 0x04, 0xc2, 0x78, 0xab, 0xa4, 0x42, 0xd0, 0xfe, 0x09, 0x41, 0x70, 0x7d, 0x08, 0x42, 0xc3, 0x24, 0xa1, 0x42, 0xab, 0x2d, 0xd5, 0x41, 0x79, 0x58, 0x1c, 0x42, 0xa4, 0x4e, 0x9b, 0x42, 0x9a, 0xf7, 0xeb, 0x41, 0x15, 0xfb, 0x40, 0x42, 0x65, 0x28, 0xa2, 0x42, 0xb3, 0x9d, 0xb2, 0x41, 0xde, 0x24, 0x51, 0x42, +0xbc, 0x94, 0x9c, 0x42, 0x54, 0x63, 0xc2, 0x41, 0xcf, 0x66, 0xe5, 0x41, 0xe9, 0x17, 0x96, 0x42, 0xc2, 0xf5, 0x0a, 0x42, 0x31, 0xf7, 0xd4, 0x41, 0x6b, 0xe9, 0x99, 0x42, 0xb1, 0x50, 0xff, 0x41, 0x29, 0x3a, 0xc4, 0x41, 0x7f, 0xd9, 0x9e, 0x42, 0x17, 0xc8, 0xe8, 0x41, 0xc7, 0x58, 0x7a, 0x42, 0x80, 0xb7, 0x9d, 0x42, 0x59, 0xf5, 0x80, 0x41, 0x7e, 0xfb, 0x68, 0x42, 0x72, 0x4a, 0xa3, 0x42, 0xc5, 0xfe, 0x6e, 0x41, 0x3f, 0x3a, 0x0c, 0x41, 0xc5, 0x1e, 0xa3, 0x42, 0x75, 0xf1, 0xa1, 0x41, +0xdc, 0xd7, 0x78, 0x41, 0xeb, 0xc2, 0xa2, 0x42, 0x4e, 0x62, 0xc3, 0x41, 0x65, 0x3b, 0x20, 0xc2, 0x92, 0x9c, 0x92, 0x42, 0x9c, 0x22, 0xe8, 0x41, 0x6f, 0x92, 0x1d, 0xc2, 0x34, 0xd1, 0x9b, 0x42, 0x1b, 0x1e, 0xb2, 0x41, 0xf4, 0x6c, 0x14, 0xc2, 0xb4, 0x59, 0xb0, 0x42, 0x3e, 0xa2, 0x0e, 0x41, 0xcc, 0xee, 0x79, 0xc2, 0x5f, 0x18, 0x2b, 0x42, 0xa7, 0xd7, 0x9c, 0x41, 0x83, 0x2f, 0x83, 0xc2, 0xc7, 0xa9, 0x4e, 0x42, 0x40, 0x13, 0x8a, 0x41, 0xf9, 0x80, 0x84, 0xc2, 0x01, 0x80, 0x29, 0x42, +0xc8, 0xea, 0xf2, 0x40, 0x5b, 0x02, 0x88, 0xc2, 0x2e, 0x50, 0x4e, 0x42, 0x46, 0xeb, 0xe4, 0x40, 0x26, 0x82, 0x84, 0xc2, 0x20, 0x12, 0x67, 0x42, 0x43, 0x1c, 0x80, 0x41, 0x9c, 0xf3, 0x87, 0xc2, 0xac, 0x0b, 0x6a, 0x42, 0xc7, 0xef, 0xdf, 0x40, 0x9b, 0x55, 0x33, 0xc2, 0xcd, 0xaa, 0x8e, 0x42, 0x36, 0x7c, 0x00, 0x42, 0x5a, 0x53, 0x18, 0xc2, 0x72, 0x39, 0x85, 0x42, 0x15, 0x8c, 0x16, 0x42, 0x5a, 0x53, 0x18, 0xc2, 0x72, 0x39, 0x85, 0x42, 0x15, 0x8c, 0x16, 0x42, 0x9b, 0x55, 0x33, 0xc2, +0xcd, 0xaa, 0x8e, 0x42, 0x36, 0x7c, 0x00, 0x42, 0x54, 0x23, 0x83, 0xc2, 0x1f, 0x34, 0x7e, 0x42, 0xb6, 0x73, 0x84, 0x41, 0x53, 0xd4, 0x85, 0xc2, 0x6b, 0x3c, 0x83, 0x42, 0xa6, 0x79, 0xe2, 0x40, 0x36, 0xab, 0x5c, 0x42, 0x0a, 0x77, 0xa7, 0x42, 0xac, 0x8b, 0x53, 0x41, 0xaa, 0x8f, 0x38, 0x42, 0xea, 0x95, 0xa6, 0x42, 0xd5, 0x78, 0xa0, 0x41, 0xab, 0x7e, 0x55, 0x42, 0x49, 0x1d, 0xab, 0x42, 0xde, 0xe0, 0x45, 0x41, 0xdc, 0x75, 0x33, 0x42, 0xe4, 0x65, 0xaa, 0x42, 0xf9, 0x0f, 0x96, 0x41, +0xaa, 0x71, 0xca, 0x41, 0x9d, 0x51, 0xa6, 0x42, 0x7e, 0x3f, 0xbe, 0x41, 0x98, 0x5d, 0x8c, 0x41, 0xb5, 0x75, 0xa6, 0x42, 0x20, 0x41, 0xad, 0x41, 0x64, 0x2a, 0xc3, 0x41, 0x8b, 0x7b, 0xa2, 0x42, 0xe5, 0x50, 0xd3, 0x41, 0x66, 0x66, 0x98, 0x41, 0xc3, 0x04, 0xaa, 0x42, 0x86, 0xc9, 0xa3, 0x41, 0xa4, 0x70, 0xd0, 0x41, 0xcb, 0xe1, 0xa9, 0x42, 0x55, 0x9f, 0xb2, 0x41, 0xce, 0xc8, 0x0c, 0x42, 0x05, 0x16, 0xa6, 0x42, 0xbb, 0x16, 0xbc, 0x41, 0x9a, 0x08, 0x0d, 0x42, 0xa9, 0xf3, 0xa9, 0x42, +0x3a, 0x12, 0xb0, 0x41, 0x3e, 0xe8, 0x41, 0x41, 0xbb, 0x78, 0xa6, 0x42, 0x9a, 0x99, 0x90, 0x41, 0x90, 0x66, 0x0a, 0x41, 0x8a, 0x4e, 0xa6, 0x42, 0xfd, 0x65, 0x5b, 0x41, 0xa0, 0x89, 0x23, 0x41, 0x9e, 0xed, 0xa9, 0x42, 0xdf, 0x4f, 0x52, 0x41, 0x20, 0xd2, 0x5d, 0x41, 0xb2, 0x0c, 0xaa, 0x42, 0xdc, 0x46, 0x8a, 0x41, 0x38, 0x16, 0x1d, 0x42, 0x34, 0x11, 0x20, 0x41, 0xe7, 0xea, 0xcf, 0x41, 0x31, 0xf7, 0x46, 0x42, 0x04, 0xf3, 0x1f, 0x41, 0x86, 0xa7, 0x9d, 0x41, 0x7f, 0xd9, 0x69, 0x41, +0xca, 0x32, 0x20, 0x41, 0xcc, 0x5d, 0xfe, 0x41, 0x6d, 0xb4, 0xcf, 0x41, 0x44, 0x69, 0x20, 0x41, 0x7c, 0x50, 0xf0, 0x41, 0x76, 0xe0, 0x72, 0x41, 0x5c, 0x8f, 0x36, 0x41, 0x65, 0xaa, 0x11, 0x42, 0xf8, 0xb1, 0xe1, 0x41, 0x45, 0xd8, 0x36, 0x41, 0xff, 0x50, 0x0a, 0x42, 0x03, 0xea, 0x2d, 0xbf, 0xd0, 0x44, 0x20, 0x41, 0xa2, 0xa3, 0xfe, 0x41, 0x0b, 0x98, 0x2c, 0xc0, 0xe1, 0x7a, 0x35, 0x41, 0x77, 0xdc, 0x11, 0x42, 0x4c, 0xb7, 0x5c, 0x42, 0x91, 0x7e, 0x20, 0x41, 0x0e, 0xbe, 0x36, 0x41, +0xfb, 0x3a, 0xf4, 0x41, 0xe7, 0x8c, 0x61, 0x41, 0xa9, 0xe4, 0x18, 0x42, 0xd8, 0x01, 0x81, 0x41, 0x42, 0xad, 0x5f, 0x41, 0xec, 0xde, 0x20, 0x42, 0xdf, 0x60, 0x8a, 0x41, 0x6f, 0xf0, 0x8a, 0x41, 0xbe, 0x30, 0x2d, 0x42, 0x34, 0x51, 0x04, 0x42, 0x69, 0xde, 0x8d, 0x41, 0x89, 0x81, 0x25, 0x42, 0x03, 0x09, 0xa7, 0xc0, 0xfe, 0x43, 0x61, 0x41, 0xea, 0x04, 0x21, 0x42, 0xc4, 0x20, 0x05, 0xc1, 0x78, 0xfa, 0x8e, 0x41, 0x9f, 0x7c, 0x2d, 0x42, 0x23, 0x5b, 0x97, 0x41, 0xff, 0xd0, 0x10, 0x42, +0x57, 0x5b, 0x52, 0x42, 0xd0, 0xb3, 0x93, 0x41, 0xcf, 0xf7, 0x1f, 0x42, 0x96, 0x32, 0x55, 0x42, 0x6f, 0x81, 0x33, 0x41, 0x48, 0x7f, 0x0e, 0x42, 0x2b, 0x65, 0x52, 0x42, 0x9f, 0xab, 0x29, 0x41, 0x0e, 0x9c, 0x1e, 0x42, 0xc1, 0xb9, 0x55, 0x42, 0xb6, 0x04, 0x92, 0x41, 0x14, 0x3f, 0x31, 0x42, 0x97, 0x2e, 0x57, 0x42, 0x69, 0x6f, 0x22, 0x41, 0x8a, 0x4e, 0x2f, 0x42, 0x67, 0xb3, 0x57, 0x42, 0xd0, 0xb3, 0x93, 0x41, 0xcf, 0xf7, 0x1f, 0x42, 0x96, 0x32, 0x55, 0x42, 0xc4, 0xa0, 0xcf, 0x41, +0x62, 0xff, 0x1f, 0x42, 0x16, 0x19, 0x53, 0x42, 0xb6, 0x04, 0x92, 0x41, 0x14, 0x3f, 0x31, 0x42, 0x97, 0x2e, 0x57, 0x42, 0xca, 0x32, 0xd8, 0x41, 0xe7, 0x3b, 0x32, 0x42, 0xb4, 0x88, 0x53, 0x42, 0x49, 0x8c, 0xc4, 0x41, 0xe4, 0xb2, 0x13, 0x42, 0x5b, 0xe0, 0x51, 0x42, 0x23, 0x5b, 0x97, 0x41, 0xff, 0xd0, 0x10, 0x42, 0x57, 0x5b, 0x52, 0x42, 0x2b, 0x87, 0x8d, 0x41, 0xf8, 0xf1, 0x43, 0x42, 0xd4, 0x49, 0x57, 0x42, 0x91, 0xc4, 0x1b, 0x41, 0x98, 0x5d, 0x40, 0x42, 0xa8, 0x86, 0x57, 0x42, +0x95, 0xab, 0x15, 0x41, 0xe9, 0xb7, 0x50, 0x42, 0xbc, 0x05, 0x56, 0x42, 0x88, 0x63, 0x87, 0x41, 0x52, 0x67, 0x56, 0x42, 0xc1, 0x28, 0x55, 0x42, 0x88, 0x63, 0x87, 0x41, 0x52, 0x67, 0x56, 0x42, 0xc1, 0x28, 0x55, 0x42, 0x2b, 0x87, 0x8d, 0x41, 0xf8, 0xf1, 0x43, 0x42, 0xd4, 0x49, 0x57, 0x42, 0xcb, 0x7f, 0xcb, 0x41, 0x3e, 0x57, 0x5c, 0x42, 0x23, 0x4a, 0x50, 0x42, 0x0f, 0xfa, 0xd6, 0x41, 0x29, 0x7a, 0x47, 0x42, 0xe2, 0xc7, 0x52, 0x42, 0xa9, 0x24, 0x81, 0x41, 0x9a, 0x66, 0x66, 0x42, +0xb6, 0x44, 0x51, 0x42, 0x38, 0x04, 0x12, 0x41, 0x52, 0x78, 0x5f, 0x42, 0x55, 0xdf, 0x52, 0x42, 0x7c, 0xb3, 0x13, 0x41, 0x32, 0x08, 0x6d, 0x42, 0x93, 0xd8, 0x4c, 0x42, 0x1d, 0xa7, 0x7f, 0x41, 0x7e, 0x7b, 0x73, 0x42, 0xb3, 0x6a, 0x4b, 0x42, 0x1d, 0xa7, 0x7f, 0x41, 0x7e, 0x7b, 0x73, 0x42, 0xb3, 0x6a, 0x4b, 0x42, 0xa9, 0x24, 0x81, 0x41, 0x9a, 0x66, 0x66, 0x42, 0xb6, 0x44, 0x51, 0x42, 0x67, 0x33, 0xaa, 0x41, 0x19, 0x91, 0x76, 0x42, 0xf7, 0x93, 0x49, 0x42, 0x41, 0xf1, 0xb9, 0x41, +0x4c, 0xd5, 0x6c, 0x42, 0x7e, 0xcc, 0x4c, 0x42, 0xc6, 0x0b, 0x01, 0x42, 0xeb, 0xd1, 0x8e, 0x42, 0x0b, 0xe4, 0x17, 0x42, 0xa8, 0x35, 0x73, 0x41, 0x9e, 0xde, 0x8d, 0x42, 0xae, 0xf6, 0x19, 0x42, 0xa8, 0x75, 0x2f, 0x42, 0x94, 0x96, 0x87, 0x42, 0x86, 0x78, 0x1f, 0x42, 0x61, 0xc3, 0x4d, 0x42, 0x3a, 0xb4, 0x7a, 0x42, 0xe2, 0xd8, 0x25, 0x42, 0x1a, 0xef, 0x5f, 0x42, 0x66, 0xa6, 0x60, 0x42, 0x8a, 0x1f, 0x2b, 0x42, 0xf9, 0x8f, 0x66, 0x42, 0x10, 0xa9, 0x43, 0x42, 0x8a, 0x5f, 0x2f, 0x42, +0xbf, 0xac, 0x61, 0x42, 0x27, 0x0f, 0x27, 0x42, 0x97, 0xbf, 0x31, 0x42, 0xb9, 0xab, 0x53, 0x42, 0x01, 0x3c, 0x0c, 0x42, 0x27, 0x4f, 0x32, 0x42, 0x8f, 0xd3, 0x3b, 0x42, 0x68, 0x11, 0xe8, 0x41, 0xa8, 0xf5, 0x30, 0x42, 0x36, 0xde, 0x10, 0x42, 0xb8, 0x2f, 0xb9, 0x41, 0x55, 0x9f, 0x2f, 0x42, 0xf8, 0x53, 0x90, 0x41, 0x2e, 0xb2, 0xaa, 0x41, 0xc7, 0xa9, 0x35, 0x42, 0x1e, 0x16, 0x51, 0xc1, 0xbf, 0x6c, 0xbc, 0x41, 0x32, 0x95, 0x36, 0x42, 0x71, 0x1b, 0xc2, 0xc1, 0xa9, 0x13, 0xee, 0x41, +0xaa, 0xe0, 0x39, 0x42, 0x11, 0x25, 0xfe, 0xc1, 0xa0, 0x78, 0x12, 0x42, 0x8b, 0x1b, 0x37, 0x42, 0xd4, 0x89, 0x14, 0xc2, 0xf0, 0x96, 0x32, 0x42, 0x8c, 0xb9, 0x31, 0x42, 0xeb, 0x51, 0x17, 0xc2, 0x23, 0x4a, 0x4e, 0x42, 0x53, 0xc5, 0x2e, 0x42, 0x9a, 0x77, 0x0f, 0xc2, 0xc9, 0x94, 0x67, 0x42, 0xe6, 0xee, 0x2a, 0x42, 0xbb, 0x96, 0x39, 0xc2, 0x7e, 0x3f, 0x5e, 0x42, 0x1e, 0x56, 0x21, 0x42, 0xe9, 0xb7, 0x2b, 0xc2, 0x34, 0x00, 0x75, 0x42, 0x64, 0xcc, 0x1d, 0x42, 0xc6, 0xcb, 0xfb, 0xc1, +0x5d, 0x2d, 0x7d, 0x42, 0x15, 0x2e, 0x25, 0x42, 0x5a, 0x53, 0x18, 0xc2, 0x72, 0x39, 0x85, 0x42, 0x15, 0x8c, 0x16, 0x42, 0xf7, 0x64, 0xfe, 0xc1, 0xfa, 0xad, 0x8d, 0x42, 0x14, 0xbf, 0x05, 0x42, 0x44, 0x86, 0xb7, 0xc0, 0x84, 0xbc, 0x5a, 0x42, 0x32, 0x44, 0x4f, 0x42, 0x6f, 0xf0, 0x4e, 0xc1, 0x5c, 0xbe, 0x5d, 0x42, 0x05, 0xa3, 0x4a, 0x42, 0x9c, 0x85, 0xb1, 0xc0, 0xb8, 0xde, 0x65, 0x42, 0x66, 0x95, 0x4a, 0x42, 0x31, 0x08, 0x31, 0xc1, 0x7b, 0x54, 0x65, 0x42, 0x94, 0x36, 0x49, 0x42, +0x20, 0x41, 0xb1, 0x3f, 0x6d, 0x85, 0x8a, 0x42, 0x65, 0x59, 0x1a, 0x42, 0x30, 0x99, 0xdf, 0xc1, 0x18, 0xe6, 0x11, 0x42, 0xc0, 0x8a, 0x3a, 0x42, 0xc8, 0x07, 0x00, 0xc2, 0x2b, 0x47, 0x2d, 0x42, 0x59, 0x06, 0x37, 0x42, 0xc3, 0xd3, 0xbe, 0xc1, 0x8b, 0x9b, 0x12, 0x42, 0xe7, 0x0c, 0x43, 0x42, 0x82, 0x62, 0xda, 0xc1, 0xe1, 0x8b, 0x2b, 0x42, 0x59, 0x46, 0x40, 0x42, 0x2a, 0xa9, 0xcf, 0xc1, 0xf2, 0x41, 0x12, 0x42, 0x43, 0x1c, 0x3d, 0x42, 0x72, 0x79, 0xee, 0xc1, 0x55, 0xdf, 0x2b, 0x42, +0x40, 0x24, 0x3a, 0x42, 0x7e, 0x8c, 0x83, 0xc1, 0x32, 0xe6, 0x00, 0x42, 0xba, 0x38, 0x45, 0x42, 0x23, 0x4a, 0x95, 0xc1, 0x44, 0x69, 0xf9, 0x41, 0x50, 0x4d, 0x3f, 0x42, 0x60, 0xd4, 0xa4, 0xc1, 0xb6, 0xe2, 0xf4, 0x41, 0x8a, 0x41, 0x3c, 0x42, 0xcb, 0x50, 0x05, 0xc2, 0xe4, 0x83, 0x48, 0x42, 0x5d, 0x6d, 0x33, 0x42, 0xfb, 0x8b, 0x00, 0xc2, 0x88, 0xf4, 0x61, 0x42, 0xe3, 0x54, 0x2f, 0x42, 0x19, 0x04, 0xe6, 0xc1, 0x82, 0x15, 0x45, 0x42, 0x46, 0x25, 0x3d, 0x42, 0x1b, 0x1e, 0xdf, 0xc1, +0x09, 0x2c, 0x5c, 0x42, 0x7c, 0x10, 0x3a, 0x42, 0x2d, 0x21, 0xfa, 0xc1, 0xad, 0x98, 0x46, 0x42, 0x19, 0xa2, 0x36, 0x42, 0xc5, 0x20, 0xf2, 0xc1, 0x84, 0x5e, 0x5f, 0x42, 0x2e, 0xd0, 0x32, 0x42, 0xac, 0x7a, 0xef, 0x41, 0x05, 0x34, 0xcf, 0x41, 0x2a, 0x18, 0x3a, 0x42, 0x9f, 0x3c, 0x83, 0x41, 0xaa, 0x71, 0xbf, 0x41, 0x7e, 0x3b, 0x3c, 0x42, 0x25, 0x06, 0x5a, 0x41, 0xde, 0x82, 0xe0, 0x41, 0x91, 0xfe, 0x47, 0x42, 0xc7, 0x29, 0x6f, 0x41, 0x61, 0xb2, 0xcd, 0x41, 0xc5, 0x8f, 0x41, 0x42, +0x89, 0xb0, 0xbf, 0x41, 0xc6, 0x5c, 0xec, 0x41, 0x80, 0xa6, 0x47, 0x42, 0x9a, 0x08, 0xd6, 0x41, 0xc1, 0x17, 0xdc, 0x41, 0xe3, 0x76, 0x40, 0x42, 0x89, 0xb0, 0xbf, 0x41, 0xc6, 0x5c, 0xec, 0x41, 0x80, 0xa6, 0x47, 0x42, 0x9a, 0x08, 0xd6, 0x41, 0xc1, 0x17, 0xdc, 0x41, 0xe3, 0x76, 0x40, 0x42, 0x15, 0x8c, 0x01, 0x42, 0x4f, 0xde, 0x02, 0x42, 0x01, 0x7c, 0x47, 0x42, 0xa7, 0x28, 0x11, 0x42, 0x0a, 0xc6, 0xf9, 0x41, 0xf3, 0x3d, 0x40, 0x42, 0x7b, 0x72, 0x20, 0x42, 0xc5, 0x20, 0xf2, 0x41, +0x3b, 0x0e, 0x3a, 0x42, 0x81, 0x78, 0x1d, 0xc1, 0xb6, 0x04, 0xd1, 0x41, 0xad, 0x9c, 0x3c, 0x42, 0xf8, 0x19, 0xe5, 0xc0, 0xb1, 0x2e, 0xeb, 0x41, 0xe3, 0xd4, 0x46, 0x42, 0x21, 0xd9, 0x06, 0xc1, 0xf8, 0xb1, 0xdb, 0x41, 0x55, 0xf0, 0x40, 0x42, 0x6b, 0x49, 0x3b, 0x42, 0x9c, 0x44, 0x0f, 0x42, 0x07, 0x4e, 0x3a, 0x42, 0xd2, 0x9e, 0x18, 0x42, 0x01, 0x0d, 0x16, 0x42, 0x27, 0x20, 0x47, 0x42, 0x72, 0xa8, 0x2a, 0x42, 0xea, 0x15, 0x12, 0x42, 0x3c, 0x3d, 0x40, 0x42, 0x9d, 0x91, 0x25, 0x42, +0xa5, 0xbd, 0x2d, 0x42, 0xbe, 0xdf, 0x45, 0x42, 0x44, 0x0b, 0x3a, 0x42, 0x43, 0x1c, 0x2b, 0x42, 0xdb, 0x28, 0x3f, 0x42, 0x51, 0x1a, 0x4b, 0x42, 0x37, 0x1a, 0x29, 0x42, 0x25, 0x64, 0x39, 0x42, 0x44, 0x3a, 0x50, 0x42, 0x6c, 0x38, 0x45, 0x42, 0x76, 0x0f, 0x37, 0x42, 0x95, 0x14, 0x29, 0x42, 0x32, 0xa6, 0x47, 0x42, 0xa9, 0x82, 0x43, 0x42, 0x06, 0xf0, 0x3e, 0x42, 0x50, 0x8d, 0x46, 0x42, 0x15, 0xbb, 0x3c, 0x42, 0x2d, 0xe1, 0x21, 0x42, 0x2d, 0x61, 0x61, 0x42, 0x54, 0x23, 0x40, 0x42, +0x86, 0xa7, 0x36, 0x42, 0x84, 0xde, 0x61, 0x42, 0x94, 0x07, 0x39, 0x42, 0xc3, 0x82, 0x48, 0x42, 0x94, 0x98, 0x61, 0x42, 0x65, 0x08, 0x33, 0x42, 0x7c, 0xe1, 0xd3, 0x41, 0x4d, 0x84, 0x8a, 0x42, 0x96, 0x32, 0x25, 0x42, 0xe9, 0x77, 0x14, 0x42, 0x1a, 0xe0, 0x85, 0x42, 0xe5, 0x61, 0x29, 0x42, 0x43, 0x0b, 0xa4, 0x41, 0x6b, 0x7c, 0x84, 0x42, 0x63, 0x9d, 0x37, 0x42, 0x51, 0xc9, 0xe7, 0x41, 0xea, 0x13, 0x82, 0x42, 0xf8, 0x93, 0x39, 0x42, 0x7d, 0xae, 0xb9, 0x41, 0x0d, 0xa0, 0x87, 0x42, +0xae, 0x36, 0x2e, 0x42, 0xdb, 0x68, 0x03, 0x42, 0x31, 0x57, 0x84, 0x42, 0x97, 0x2e, 0x31, 0x42, 0x38, 0xd6, 0x30, 0x41, 0x26, 0x53, 0x83, 0x42, 0x7b, 0xc3, 0x36, 0x42, 0x43, 0x0b, 0xa4, 0x41, 0x6b, 0x7c, 0x84, 0x42, 0x63, 0x9d, 0x37, 0x42, 0xf5, 0xb9, 0x45, 0x41, 0x39, 0x85, 0x86, 0x42, 0xb8, 0xde, 0x2c, 0x42, 0x7d, 0xae, 0xb9, 0x41, 0x0d, 0xa0, 0x87, 0x42, 0xae, 0x36, 0x2e, 0x42, 0x3e, 0x57, 0x5b, 0x41, 0x64, 0x8c, 0x89, 0x42, 0xcc, 0x6e, 0x24, 0x42, 0x54, 0x41, 0x34, 0x42, +0x6c, 0x38, 0x7a, 0x42, 0x0c, 0x42, 0x2e, 0x42, 0xab, 0x4f, 0x0f, 0x42, 0xec, 0xc0, 0x76, 0x42, 0x4e, 0x91, 0x3c, 0x42, 0x6c, 0x38, 0x22, 0x42, 0x04, 0x05, 0x79, 0x42, 0xe4, 0xf2, 0x34, 0x42, 0x2a, 0x29, 0xe2, 0xc1, 0xc9, 0x65, 0x76, 0x42, 0xc8, 0xb6, 0x2a, 0x42, 0xab, 0xad, 0x94, 0xc1, 0x5d, 0x8b, 0x79, 0x42, 0x61, 0x65, 0x36, 0x42, 0x50, 0x6b, 0xa1, 0xc1, 0x83, 0x5e, 0x7f, 0x42, 0x94, 0x65, 0x2a, 0x42, 0x3a, 0x92, 0xc5, 0xc1, 0x5b, 0x20, 0x6e, 0x42, 0x3b, 0x8e, 0x37, 0x42, +0xb3, 0xfb, 0xd5, 0xc1, 0x4d, 0x04, 0x73, 0x42, 0xe0, 0xad, 0x2e, 0x42, 0x5b, 0x4e, 0x0f, 0xc1, 0xfb, 0x0b, 0x7d, 0x42, 0x67, 0x55, 0x36, 0x42, 0xfc, 0xfb, 0x1c, 0xc1, 0x31, 0x28, 0x81, 0x42, 0x88, 0x23, 0x2a, 0x42, 0x02, 0x48, 0xa9, 0x3f, 0xb2, 0x4e, 0x80, 0x42, 0x5a, 0xa4, 0x36, 0x42, 0x89, 0x07, 0xc8, 0x3f, 0x5f, 0xe7, 0x82, 0x42, 0xd4, 0x1a, 0x2c, 0x42, 0x3d, 0x1b, 0xb3, 0xc1, 0xd1, 0x51, 0x2d, 0x42, 0x2b, 0x65, 0x47, 0x42, 0x27, 0x31, 0x99, 0xc1, 0x71, 0x9b, 0x18, 0x42, +0x1c, 0x9a, 0x49, 0x42, 0xcb, 0x7f, 0x55, 0xc1, 0xa0, 0xc9, 0x09, 0x42, 0x6d, 0x16, 0x4b, 0x42, 0xd3, 0xab, 0xb6, 0xc1, 0x04, 0x45, 0x57, 0x42, 0x36, 0x6b, 0x42, 0x42, 0x6a, 0x4d, 0xbd, 0xc1, 0xae, 0x87, 0x43, 0x42, 0xaa, 0xe0, 0x44, 0x42, 0x04, 0xd6, 0xa8, 0x41, 0xdd, 0xf5, 0x02, 0x42, 0xfc, 0xe9, 0x4d, 0x42, 0x7f, 0xd9, 0x44, 0x41, 0x5f, 0x18, 0xfd, 0x41, 0x55, 0xdf, 0x4d, 0x42, 0x04, 0xd6, 0xa8, 0x41, 0xdd, 0xf5, 0x02, 0x42, 0xfc, 0xe9, 0x4d, 0x42, 0x9a, 0x99, 0xe1, 0x41, +0x96, 0xe1, 0x0b, 0x42, 0xe3, 0xf6, 0x4d, 0x42, 0xf6, 0x7a, 0xb6, 0xc0, 0xae, 0xc7, 0x01, 0x42, 0x1a, 0x6f, 0x4c, 0x42, 0x0b, 0xb5, 0x01, 0x42, 0x43, 0xdc, 0x1b, 0x42, 0x0a, 0xd7, 0x4d, 0x42, 0xc1, 0xb9, 0x0b, 0x42, 0xa4, 0x9f, 0x30, 0x42, 0x7f, 0x08, 0x4d, 0x42, 0x6a, 0xfc, 0x0c, 0x42, 0x4a, 0x2a, 0x48, 0x42, 0xc0, 0x1b, 0x4b, 0x42, 0x93, 0xe9, 0x06, 0x42, 0xe2, 0x98, 0x5f, 0x42, 0xa4, 0x30, 0x48, 0x42, 0xc6, 0xcb, 0xc6, 0x41, 0xe1, 0x7a, 0x7d, 0x42, 0x13, 0x72, 0x42, 0x42, +0x5d, 0x5c, 0x8f, 0x41, 0x82, 0x22, 0x7f, 0x42, 0x97, 0xbf, 0x41, 0x42, 0xcb, 0x62, 0x1f, 0x41, 0x98, 0x8c, 0x7b, 0x42, 0x7d, 0x9d, 0x41, 0x42, 0x5d, 0x5c, 0x8f, 0x41, 0x82, 0x22, 0x7f, 0x42, 0x97, 0xbf, 0x41, 0x42, 0xde, 0x24, 0xf0, 0x41, 0x55, 0x63, 0x72, 0x42, 0x30, 0xfb, 0x44, 0x42, 0x88, 0x63, 0xa3, 0xc1, 0xd1, 0x91, 0x66, 0x42, 0xb7, 0x80, 0x40, 0x42, 0x0d, 0x4f, 0x70, 0xc1, 0xc5, 0xfe, 0x6e, 0x42, 0x29, 0x0b, 0x40, 0x42, 0x62, 0xa1, 0xe3, 0xc0, 0x53, 0x34, 0x72, 0x42, +0x18, 0xd5, 0x40, 0x42, 0x96, 0xcf, 0xc2, 0x3f, 0x1a, 0x00, 0x76, 0x42, 0x35, 0x6f, 0x41, 0x42, 0xda, 0x38, 0xe2, 0x3f, 0x7c, 0x10, 0x68, 0x42, 0x23, 0x0a, 0x4c, 0x42, 0xa5, 0xf7, 0xd9, 0x3f, 0x68, 0x51, 0x5b, 0x42, 0xb9, 0xeb, 0x51, 0x42, 0x88, 0x9d, 0xd1, 0x3f, 0x92, 0x8b, 0x4d, 0x42, 0x7a, 0x36, 0x55, 0x42, 0xf8, 0xfc, 0xe0, 0x3f, 0x75, 0x13, 0x3e, 0x42, 0x32, 0x26, 0x57, 0x42, 0x8d, 0x45, 0x07, 0x40, 0x6f, 0xc1, 0x2d, 0x42, 0x70, 0x4e, 0x57, 0x42, 0xcc, 0x40, 0x27, 0x40, +0xfa, 0x9c, 0x1d, 0x42, 0x1f, 0x34, 0x55, 0x42, 0xd9, 0xeb, 0x41, 0x40, 0x60, 0xd4, 0x0d, 0x42, 0xb8, 0xde, 0x51, 0x42, 0xb7, 0x0b, 0x47, 0x40, 0xbb, 0x16, 0xfd, 0x41, 0x56, 0x4e, 0x4d, 0x42, 0xe5, 0xd0, 0x44, 0x40, 0x9b, 0xd5, 0xe1, 0x41, 0x0e, 0xbe, 0x47, 0x42, 0x9d, 0x0c, 0x46, 0x40, 0x03, 0x2b, 0xcf, 0x41, 0x1e, 0xe7, 0x41, 0x42, 0x71, 0xe6, 0x47, 0x40, 0xde, 0x82, 0xc0, 0x41, 0x3b, 0x1f, 0x3d, 0x42, 0xb9, 0xdf, 0x41, 0x40, 0x46, 0x94, 0xab, 0x41, 0xcf, 0x95, 0x37, 0x42, +0xa5, 0xa0, 0x82, 0x40, 0x53, 0x16, 0x8b, 0x41, 0x81, 0xc4, 0x2f, 0x42, 0x6a, 0x6a, 0x8f, 0x40, 0x84, 0xc0, 0x5e, 0x41, 0xe8, 0xd9, 0x23, 0x42, 0x2f, 0x2f, 0x94, 0x40, 0x2e, 0x90, 0x35, 0x41, 0x56, 0x3d, 0x14, 0x42, 0x89, 0x93, 0x9e, 0x40, 0x14, 0xf9, 0x1f, 0x41, 0xc5, 0x8f, 0x01, 0x42, 0x0a, 0x48, 0x8d, 0x42, 0xc3, 0x42, 0x66, 0x41, 0xc2, 0x69, 0x3b, 0x40, 0xb5, 0xa6, 0x97, 0x42, 0x74, 0x24, 0x93, 0x41, 0xf3, 0x1f, 0x3c, 0x40, 0x1b, 0x8d, 0x80, 0x42, 0x87, 0x85, 0x3a, 0x41, +0x4b, 0x3c, 0x2a, 0x40, 0xdf, 0xde, 0x9f, 0x42, 0xd4, 0x4d, 0xbb, 0x41, 0xf3, 0x1f, 0x3c, 0x40, 0x27, 0xa0, 0xa5, 0x42, 0x2a, 0x18, 0xe9, 0x41, 0xf3, 0x1f, 0x3c, 0x40, 0x1d, 0x29, 0xa9, 0x42, 0xe8, 0x6a, 0x0d, 0x42, 0xf3, 0x1f, 0x3c, 0x40, 0xc5, 0xbe, 0xab, 0x42, 0xb8, 0x8d, 0x28, 0x42, 0xf3, 0x1f, 0x3c, 0x40, 0x1b, 0xed, 0xab, 0x42, 0x20, 0x70, 0x43, 0x42, 0x35, 0x7b, 0x50, 0x40, 0x53, 0xd4, 0xa9, 0x42, 0x1e, 0xd6, 0x5c, 0x42, 0x35, 0x7b, 0x50, 0x40, 0x9b, 0xa6, 0xa5, 0x42, +0x24, 0x17, 0x74, 0x42, 0x55, 0x87, 0x50, 0x40, 0x3c, 0xdf, 0x9f, 0x42, 0xc2, 0x66, 0x84, 0x42, 0x35, 0x7b, 0x50, 0x40, 0x5b, 0x82, 0x99, 0x42, 0xc5, 0xaf, 0x8e, 0x42, 0xd5, 0x56, 0x50, 0x40, 0x66, 0xd7, 0x91, 0x42, 0x55, 0x50, 0x97, 0x42, 0x31, 0x77, 0x47, 0x40, 0xcf, 0x06, 0x8a, 0x42, 0x85, 0x4b, 0x9e, 0x42, 0x09, 0xa2, 0x40, 0x40, 0xc6, 0xed, 0x81, 0x42, 0x28, 0x3e, 0xa4, 0x42, 0x88, 0x16, 0x39, 0x40, 0xb3, 0x3b, 0x76, 0x42, 0xa0, 0x69, 0xa8, 0x42, 0x08, 0x20, 0x21, 0x40, +0xb3, 0x99, 0x6c, 0x42, 0x11, 0xa7, 0xab, 0x42, 0x5e, 0x80, 0x07, 0x40, 0x6a, 0x4d, 0x64, 0x42, 0xa4, 0x70, 0x22, 0x41, 0xcb, 0x45, 0x12, 0x40, 0x20, 0x7b, 0xd4, 0x40, 0x94, 0x25, 0xa6, 0x42, 0x9e, 0x41, 0x0a, 0x41, 0xb7, 0x23, 0xb5, 0x40, 0xe1, 0x09, 0xa6, 0x42, 0xaf, 0x42, 0x3e, 0x40, 0x6d, 0x6e, 0xfd, 0x40, 0xb8, 0x7e, 0xa9, 0x42, 0xdc, 0xef, 0x02, 0x41, 0x57, 0x78, 0xd7, 0x40, 0x9e, 0x0d, 0xa9, 0x42, 0xd3, 0x9f, 0x35, 0x40, 0xff, 0x90, 0x25, 0x41, 0xf4, 0xcc, 0xae, 0x42, +0x1c, 0xeb, 0x5f, 0x41, 0xa3, 0x75, 0xf5, 0x40, 0x9c, 0x84, 0xad, 0x42, 0x74, 0x35, 0x0a, 0x41, 0x00, 0x52, 0xc5, 0x40, 0x95, 0xb4, 0xac, 0x42, 0x3d, 0x9b, 0x55, 0x40, 0x4b, 0x93, 0x8a, 0x40, 0xcf, 0x66, 0xb1, 0x42, 0xea, 0x78, 0x92, 0x40, 0xb0, 0xc4, 0xbf, 0x40, 0xbd, 0x23, 0xb3, 0x42, 0xbd, 0xc1, 0x21, 0x41, 0x5a, 0xaa, 0x13, 0x41, 0xdc, 0x15, 0xb7, 0x42, 0x60, 0xd4, 0x88, 0x41, 0xbe, 0x30, 0x9c, 0x41, 0xe4, 0x32, 0xae, 0x42, 0xec, 0x2f, 0xa5, 0x41, 0x6f, 0x5f, 0x66, 0x41, +0x8c, 0x8a, 0xae, 0x42, 0x97, 0xff, 0x8e, 0x41, 0x40, 0x82, 0x68, 0x41, 0x13, 0xf2, 0xb4, 0x42, 0xd1, 0xa2, 0xa4, 0x41, 0x72, 0x8a, 0x9c, 0x41, 0x42, 0x6f, 0xb3, 0x42, 0x38, 0xe7, 0xb3, 0x41, 0x14, 0xae, 0xd1, 0x41, 0x2c, 0xe3, 0xad, 0x42, 0xbd, 0x52, 0xb1, 0x41, 0x52, 0xb8, 0xce, 0x41, 0xe5, 0xa1, 0xb2, 0x42, 0x72, 0x79, 0xbc, 0x41, 0x24, 0x17, 0x0c, 0x42, 0x59, 0xc6, 0xb2, 0x42, 0x50, 0xfc, 0xba, 0x41, 0x8a, 0x1f, 0x0c, 0x42, 0x32, 0xe6, 0xad, 0x42, 0xa7, 0x57, 0xaf, 0x41, +0x78, 0x3a, 0x34, 0x42, 0xea, 0xd5, 0xb2, 0x42, 0x8e, 0x97, 0x9e, 0x41, 0x66, 0xb7, 0x31, 0x42, 0x30, 0x59, 0xae, 0x42, 0x79, 0x47, 0x95, 0x41, 0x88, 0x63, 0x53, 0x42, 0x32, 0x08, 0xaf, 0x42, 0x51, 0x49, 0x45, 0x41, 0xf6, 0x97, 0x58, 0x42, 0xfd, 0x65, 0xb4, 0x42, 0x92, 0x3a, 0x52, 0x41, 0xaa, 0x4f, 0x6a, 0x42, 0xcb, 0x30, 0xaf, 0x42, 0x77, 0xf3, 0x0e, 0x40, 0xe1, 0x69, 0x6c, 0x42, 0x96, 0x10, 0xb4, 0x42, 0xf7, 0x1e, 0x58, 0x40, 0x7a, 0x4e, 0xca, 0x3f, 0xb7, 0xa0, 0x85, 0x42, +0x5b, 0xf1, 0x24, 0x42, 0xe7, 0x6a, 0xfe, 0xc1, 0x70, 0x5f, 0x21, 0x41, 0x62, 0x4a, 0xfc, 0xbf, 0xd0, 0x33, 0x1b, 0xc2, 0x0d, 0x02, 0x3b, 0x41, 0xce, 0xdf, 0xf8, 0xbf, 0xb3, 0xfb, 0x34, 0xc2, 0xf0, 0xa7, 0x68, 0x41, 0x83, 0x9e, 0xfd, 0xbf, 0xd8, 0x41, 0x4e, 0xc2, 0x2d, 0xa1, 0x91, 0x41, 0x2c, 0xd4, 0x06, 0xc0, 0x2e, 0x90, 0x8d, 0x42, 0x49, 0x9d, 0x63, 0x41, 0x1d, 0x38, 0x28, 0xc1, 0x92, 0xdc, 0x97, 0x42, 0xec, 0x2f, 0x92, 0x41, 0x6d, 0xe7, 0x29, 0xc1, 0x1b, 0xbe, 0x80, 0x42, +0x22, 0x6c, 0x38, 0x41, 0x43, 0x1c, 0x22, 0xc1, 0xa4, 0xdf, 0x9f, 0x42, 0x1c, 0xeb, 0xba, 0x41, 0xa2, 0x45, 0x2a, 0xc1, 0x25, 0x64, 0xa5, 0x42, 0x02, 0x09, 0xe9, 0x41, 0xcf, 0xf7, 0x2b, 0xc1, 0x92, 0xbc, 0xa8, 0x42, 0xcf, 0x77, 0x0d, 0x42, 0xbf, 0x0e, 0x31, 0xc1, 0x51, 0x3a, 0xab, 0x42, 0x4a, 0x8c, 0x28, 0x42, 0xd8, 0x81, 0x38, 0xc1, 0x7e, 0x9b, 0xab, 0x42, 0x6d, 0xb4, 0x43, 0x42, 0x72, 0x68, 0x40, 0xc1, 0xb5, 0x95, 0xa9, 0x42, 0xca, 0x61, 0x5d, 0x42, 0xe0, 0x9c, 0x46, 0xc1, +0x22, 0x6c, 0xa5, 0x42, 0xc0, 0xdb, 0x74, 0x42, 0xd7, 0x12, 0x4b, 0xc1, 0xc3, 0x44, 0x9f, 0x42, 0xb9, 0xcb, 0x84, 0x42, 0x1a, 0xc0, 0x4e, 0xc1, 0x38, 0x56, 0x8f, 0x42, 0x33, 0x44, 0x97, 0x42, 0x2f, 0x4c, 0x4b, 0xc1, 0x9a, 0x08, 0x98, 0x42, 0x08, 0xdb, 0x8e, 0x42, 0x82, 0x51, 0x56, 0xc1, 0x17, 0xd9, 0x9d, 0xc1, 0xc6, 0xcd, 0x9b, 0x42, 0xce, 0xdf, 0xf8, 0xbf, 0x4c, 0x15, 0xa2, 0xc1, 0x1c, 0xfc, 0x9b, 0x42, 0xc8, 0x98, 0x33, 0xc1, 0xda, 0x2c, 0xc8, 0xc1, 0x75, 0x62, 0x9d, 0x42, +0xf8, 0x36, 0xe9, 0xbf, 0xc8, 0x18, 0xca, 0xc1, 0xf3, 0x4e, 0x9e, 0x42, 0x23, 0xb9, 0x34, 0xc1, 0x39, 0x23, 0x5d, 0xc1, 0x25, 0xa6, 0x9c, 0x42, 0x49, 0x2e, 0xf3, 0xbf, 0x64, 0xcc, 0x65, 0xc1, 0x36, 0xbc, 0x9c, 0x42, 0x98, 0x4c, 0x29, 0xc1, 0xfa, 0x7f, 0x19, 0x3f, 0x82, 0x31, 0xa2, 0x42, 0x42, 0x95, 0x8e, 0xbf, 0x06, 0x13, 0x0b, 0x3f, 0xb2, 0x3d, 0xa2, 0x42, 0x82, 0x17, 0xc7, 0xc0, 0x1d, 0xc9, 0x5d, 0xc2, 0x95, 0xf4, 0xb8, 0x42, 0x10, 0xc7, 0x58, 0xc0, 0x36, 0xde, 0x43, 0xc2, +0x9c, 0xc2, 0xbc, 0x42, 0x3d, 0xb8, 0x5b, 0xc0, 0xba, 0x89, 0x45, 0xc2, 0x52, 0xf6, 0xb9, 0x42, 0x58, 0x17, 0x75, 0xc1, 0x36, 0xde, 0x43, 0xc2, 0x9c, 0xc2, 0xbc, 0x42, 0x3d, 0xb8, 0x5b, 0xc0, 0xe4, 0xc3, 0x2c, 0xc2, 0x78, 0x0b, 0xb8, 0x42, 0xe7, 0x8c, 0x6f, 0xc1, 0x58, 0xf9, 0x2a, 0xc2, 0x41, 0x80, 0xb9, 0x42, 0xa3, 0xaa, 0x4f, 0xc0, 0x3a, 0xa1, 0x84, 0xc2, 0xd6, 0xf4, 0x96, 0x42, 0xa6, 0x96, 0x07, 0xc0, 0x68, 0x80, 0x76, 0xc2, 0xe1, 0x5a, 0xad, 0x42, 0xb4, 0x59, 0x3d, 0xc0, +0xa6, 0x5b, 0x63, 0xc2, 0x19, 0x62, 0xb7, 0x41, 0x87, 0xbf, 0x02, 0xc0, 0x71, 0x2c, 0x74, 0xc2, 0xfa, 0x5c, 0xe0, 0x41, 0x2e, 0xff, 0x34, 0xc1, 0x27, 0x4f, 0x75, 0xc2, 0x05, 0x56, 0xe1, 0x41, 0x24, 0x0b, 0x00, 0xc0, 0xc9, 0xb4, 0x80, 0xc2, 0x9f, 0xfc, 0x08, 0x42, 0xe6, 0xae, 0x32, 0xc1, 0xb3, 0x5d, 0x81, 0xc2, 0x05, 0xa3, 0x08, 0x42, 0x5c, 0xc9, 0xf6, 0xbf, 0xc9, 0x54, 0xe9, 0xc1, 0x42, 0xbe, 0xa0, 0x42, 0x71, 0xfe, 0xd6, 0xbf, 0x15, 0x0c, 0xe9, 0xc1, 0x98, 0x2c, 0xa2, 0x42, +0xb9, 0x1e, 0x37, 0xc1, 0xea, 0x73, 0x03, 0xc2, 0xf0, 0x05, 0xa7, 0x42, 0x31, 0xeb, 0xf9, 0xbf, 0xc4, 0x71, 0x02, 0xc2, 0x00, 0x60, 0xa9, 0x42, 0x84, 0x7c, 0x48, 0xc1, 0xc9, 0x54, 0xe9, 0xc1, 0x42, 0xbe, 0xa0, 0x42, 0x71, 0xfe, 0xd6, 0xbf, 0x15, 0x0c, 0xe9, 0xc1, 0x98, 0x2c, 0xa2, 0x42, 0xb9, 0x1e, 0x37, 0xc1, 0x03, 0x29, 0x87, 0x42, 0xc1, 0x37, 0x9e, 0x42, 0x71, 0x3d, 0x44, 0xc1, 0xd8, 0xf0, 0x7d, 0x42, 0xeb, 0x02, 0xa4, 0x42, 0x4c, 0xa6, 0x38, 0xc1, 0x9e, 0x8d, 0x14, 0xc2, +0xe2, 0xe7, 0xb1, 0x42, 0x76, 0x89, 0x3e, 0xc0, 0x53, 0x45, 0x15, 0xc2, 0xad, 0x9a, 0xb2, 0x42, 0x4d, 0x84, 0x68, 0xc1, 0xe4, 0x72, 0x87, 0xc2, 0x3a, 0xb4, 0x2a, 0x42, 0x27, 0xda, 0xf1, 0xbf, 0xd5, 0x98, 0x8a, 0xc2, 0xa8, 0x24, 0x50, 0x42, 0x96, 0xe7, 0xfd, 0xbf, 0x0a, 0x28, 0x8a, 0xc2, 0x04, 0x45, 0x6c, 0x42, 0x55, 0x30, 0xfe, 0xbf, 0x8d, 0x06, 0x88, 0xc2, 0x8c, 0x2c, 0x85, 0x42, 0x92, 0x57, 0xfb, 0xbf, 0x42, 0xfe, 0x6f, 0x42, 0xe9, 0x06, 0xa8, 0x42, 0x7f, 0xd9, 0x2b, 0xc1, +0x35, 0x0d, 0x67, 0x42, 0x37, 0x38, 0xab, 0x42, 0x0e, 0x9c, 0x25, 0xc1, 0x57, 0x04, 0xb6, 0x40, 0x07, 0x0e, 0xa6, 0x42, 0x45, 0x47, 0x3a, 0xbf, 0x21, 0xe5, 0xb6, 0x40, 0x3a, 0x12, 0xa6, 0x42, 0x14, 0xb3, 0x8d, 0xc0, 0x26, 0x4e, 0xd0, 0x40, 0xd1, 0xe0, 0xa8, 0x42, 0x07, 0x96, 0x77, 0xbf, 0xc8, 0x5e, 0xcb, 0x40, 0xb0, 0xc1, 0xa8, 0x42, 0x8c, 0x2d, 0x6e, 0xc0, 0x1b, 0x5e, 0x64, 0x42, 0x9a, 0x77, 0x21, 0x41, 0x84, 0x7c, 0x19, 0xc1, 0x1a, 0x34, 0xb7, 0x40, 0xb9, 0x6b, 0xac, 0x42, +0xfd, 0xd7, 0xa9, 0xbe, 0xb3, 0xb5, 0xae, 0x40, 0x28, 0x3e, 0xac, 0x42, 0xbd, 0xa9, 0x50, 0xc0, 0xb4, 0x3c, 0x6f, 0x40, 0x83, 0x0f, 0xb1, 0x42, 0x20, 0xef, 0x8d, 0x3f, 0x1b, 0xd3, 0x4f, 0x40, 0x36, 0x2b, 0xb1, 0x42, 0x18, 0x5b, 0x2e, 0xc0, 0x46, 0xb6, 0x63, 0x42, 0xd1, 0x91, 0xb3, 0x42, 0x2e, 0x90, 0x28, 0xc1, 0x72, 0xf9, 0x61, 0x42, 0x7e, 0xec, 0xae, 0x42, 0xae, 0x47, 0x21, 0xc1, 0x58, 0xb9, 0xc2, 0xc1, 0x72, 0xf9, 0x36, 0x41, 0xf2, 0x70, 0x19, 0xc2, 0xb0, 0x83, 0x81, 0xc1, +0xa6, 0x9b, 0x36, 0x41, 0xfb, 0x4b, 0x27, 0xc2, 0xe8, 0x6a, 0x99, 0xc1, 0xb1, 0x85, 0x1f, 0x41, 0x34, 0x40, 0x0a, 0xc2, 0x88, 0xd2, 0x40, 0xc1, 0xe4, 0xe6, 0x1f, 0x41, 0x13, 0xe1, 0x15, 0xc2, 0x17, 0xd9, 0xf8, 0xc1, 0xd7, 0xa3, 0x37, 0x41, 0xd8, 0xdf, 0x03, 0xc2, 0xb7, 0xf3, 0xc8, 0xc1, 0xb3, 0xde, 0x1e, 0x41, 0xee, 0x7c, 0xf1, 0xc1, 0xe3, 0xe5, 0x0d, 0xc2, 0x4f, 0x1e, 0x3a, 0x41, 0x50, 0x6b, 0xcd, 0xc1, 0x0b, 0x13, 0xe8, 0xc1, 0xa1, 0xd6, 0x20, 0x41, 0x48, 0xbf, 0xbf, 0xc1, +0x5b, 0x60, 0x17, 0xc2, 0xb6, 0x84, 0x3b, 0x41, 0x56, 0x7d, 0x8f, 0xc1, 0xcd, 0xbb, 0xf7, 0xc1, 0xf0, 0x85, 0x22, 0x41, 0x97, 0xff, 0x87, 0xc1, 0x59, 0xd5, 0x82, 0x42, 0xdc, 0xf9, 0x92, 0x41, 0x36, 0xab, 0x0a, 0xc2, 0x00, 0x00, 0x74, 0x42, 0x17, 0xd9, 0x64, 0x41, 0xe4, 0xc3, 0x02, 0xc2, 0x3f, 0x75, 0x4c, 0x42, 0xb3, 0x9d, 0x8e, 0x41, 0x08, 0x1b, 0x2f, 0xc2, 0x88, 0xe3, 0x3b, 0x42, 0xad, 0x69, 0x63, 0x41, 0x77, 0x2d, 0x23, 0xc2, 0x86, 0x27, 0x5e, 0x42, 0xf7, 0x75, 0x37, 0x41, +0x5a, 0xe4, 0xf1, 0xc1, 0x2e, 0xee, 0x2b, 0x42, 0x17, 0x26, 0x38, 0x41, 0x00, 0xaf, 0x15, 0xc2, 0x58, 0x28, 0x9c, 0xc1, 0xab, 0xad, 0x65, 0x41, 0x0d, 0x8f, 0x35, 0xc2, 0x09, 0xf9, 0xe7, 0xc1, 0x27, 0x0f, 0x66, 0x41, 0xc5, 0x8f, 0x26, 0xc2, 0xb7, 0xf3, 0x11, 0xc2, 0x1c, 0x5a, 0x67, 0x41, 0x27, 0x71, 0x0d, 0xc2, 0x38, 0xe7, 0x24, 0xc2, 0xbf, 0x0e, 0x95, 0x41, 0x47, 0xe1, 0x14, 0xc2, 0x3a, 0xc1, 0x04, 0xc2, 0xdd, 0x93, 0x94, 0x41, 0x71, 0xec, 0x30, 0xc2, 0x49, 0xae, 0xb5, 0xc1, +0x84, 0x0d, 0x93, 0x41, 0x6f, 0xb0, 0x40, 0xc2, 0x84, 0xbc, 0x25, 0xc2, 0x9a, 0xe6, 0x66, 0x41, 0xaf, 0x14, 0xd9, 0xc1, 0x42, 0x7e, 0x30, 0xc2, 0x7d, 0x1d, 0x67, 0x41, 0xaf, 0x94, 0x95, 0xc1, 0x27, 0xa0, 0x47, 0xc2, 0x59, 0x06, 0x91, 0x41, 0x05, 0xa3, 0x9b, 0xc1, 0xc9, 0xa5, 0x3a, 0xc2, 0x74, 0x24, 0x93, 0x41, 0x3f, 0x46, 0xe2, 0xc1, 0xaa, 0x60, 0x78, 0x42, 0xae, 0xb6, 0x36, 0x41, 0x7c, 0x50, 0xa4, 0xc1, 0xd5, 0x87, 0x88, 0x42, 0xf4, 0x6c, 0x63, 0x41, 0x48, 0x3f, 0xad, 0xc1, +0x5a, 0x13, 0x92, 0x42, 0x3f, 0xc6, 0x92, 0x41, 0x40, 0x02, 0xb4, 0xc1, 0xfb, 0xda, 0x8d, 0x42, 0x17, 0x48, 0xe8, 0x41, 0xe8, 0x6a, 0x13, 0xc2, 0x6e, 0x23, 0x89, 0x42, 0x1d, 0x49, 0xbb, 0x41, 0x8f, 0x02, 0x10, 0xc2, 0x8a, 0x41, 0x6d, 0x42, 0x4f, 0xaf, 0xe3, 0x41, 0xa7, 0x28, 0x3a, 0xc2, 0xa6, 0x5b, 0x5b, 0x42, 0xa5, 0xac, 0xb5, 0x41, 0x70, 0xdf, 0x36, 0xc2, 0x1b, 0x0d, 0xd7, 0xc1, 0x9a, 0x88, 0xbd, 0x41, 0x76, 0x8f, 0x48, 0xc2, 0x89, 0xb0, 0x14, 0xc2, 0x0d, 0x02, 0xbe, 0x41, +0x1a, 0x91, 0x37, 0xc2, 0xd8, 0x23, 0x36, 0xc2, 0x6a, 0x4d, 0xbd, 0x41, 0x73, 0x06, 0x1a, 0xc2, 0x2d, 0x72, 0x45, 0xc2, 0x26, 0x06, 0xe7, 0x41, 0x30, 0x19, 0x1c, 0xc2, 0xb9, 0x7c, 0x25, 0xc2, 0x54, 0xc1, 0xea, 0x41, 0xc9, 0x14, 0x3b, 0xc2, 0xe1, 0xcb, 0x04, 0xc2, 0xe8, 0xfb, 0xee, 0x41, 0xf6, 0xd7, 0x4a, 0xc2, 0x5d, 0x5c, 0x99, 0x42, 0x0e, 0xbe, 0xbb, 0x41, 0xb7, 0x40, 0xb9, 0xc1, 0xa4, 0x50, 0x9e, 0x42, 0xe4, 0x83, 0xe9, 0x41, 0x4f, 0x2f, 0xbd, 0xc1, 0x69, 0x20, 0x91, 0x42, +0xd8, 0x81, 0x0c, 0x42, 0x9e, 0x8d, 0x15, 0xc2, 0x69, 0x11, 0x7a, 0x42, 0x5c, 0x3e, 0x0b, 0x42, 0x74, 0xa4, 0x3a, 0xc2, 0x60, 0xf6, 0x92, 0x42, 0x0a, 0x06, 0x27, 0x42, 0x96, 0x61, 0x15, 0xc2, 0xc5, 0x3e, 0x81, 0x42, 0xac, 0x5c, 0x26, 0x42, 0x55, 0x5f, 0x3a, 0xc2, 0x6f, 0x41, 0xa1, 0x42, 0x01, 0x8d, 0x0d, 0x42, 0x50, 0xeb, 0xbf, 0xc1, 0x15, 0x1d, 0xa3, 0x42, 0xbd, 0x74, 0x28, 0x42, 0xee, 0x7c, 0xc2, 0xc1, 0xa2, 0xb4, 0x7f, 0x42, 0x74, 0xe4, 0x5c, 0x42, 0x5d, 0x4b, 0x36, 0xc2, +0x2e, 0xd0, 0x91, 0x42, 0x6e, 0x63, 0x5c, 0x42, 0xa4, 0x1f, 0x14, 0xc2, 0xa6, 0x6a, 0x82, 0x42, 0x53, 0x34, 0x42, 0x42, 0xa8, 0x75, 0x38, 0xc2, 0x14, 0xae, 0x93, 0x42, 0x69, 0x40, 0x42, 0x42, 0x33, 0x33, 0x15, 0xc2, 0x17, 0x59, 0xa3, 0x42, 0x5f, 0x98, 0x43, 0x42, 0xc2, 0x06, 0xc5, 0xc1, 0xcb, 0x5f, 0xa1, 0x42, 0x0b, 0x64, 0x5d, 0x42, 0xbd, 0x74, 0xc6, 0xc1, 0xdc, 0x35, 0x5f, 0x42, 0x65, 0x88, 0x85, 0x42, 0x77, 0xad, 0x30, 0xc2, 0xb3, 0x9d, 0x86, 0x42, 0x98, 0xdd, 0x84, 0x42, +0xc9, 0x76, 0x10, 0xc2, 0x34, 0x2f, 0x73, 0x42, 0xe2, 0xc7, 0x75, 0x42, 0x5b, 0x20, 0x34, 0xc2, 0x0d, 0x8f, 0x8d, 0x42, 0xdc, 0x79, 0x74, 0x42, 0xad, 0x29, 0x13, 0xc2, 0xa6, 0x39, 0x9d, 0x42, 0x5d, 0x0f, 0x75, 0x42, 0x98, 0x6e, 0xc6, 0xc1, 0x52, 0x18, 0x97, 0x42, 0x29, 0x0b, 0x85, 0x42, 0x2e, 0xff, 0xc4, 0xc1, 0x0c, 0xd3, 0x2f, 0x42, 0x6e, 0x54, 0x95, 0x42, 0x90, 0x42, 0x1f, 0xc2, 0x9c, 0x51, 0x67, 0x42, 0xdc, 0x79, 0x96, 0x42, 0xa4, 0x8e, 0x08, 0xc2, 0x25, 0xc6, 0x44, 0x42, +0x8d, 0xe6, 0x8d, 0x42, 0xc3, 0x64, 0x29, 0xc2, 0x39, 0xf4, 0x7b, 0x42, 0x17, 0x19, 0x8e, 0x42, 0xc8, 0xc7, 0x0c, 0xc2, 0x82, 0xf3, 0x8e, 0x42, 0xdc, 0x66, 0x8e, 0x42, 0x59, 0x97, 0xc3, 0xc1, 0xba, 0xba, 0x85, 0x42, 0xfa, 0xed, 0x96, 0x42, 0x9b, 0x66, 0xc3, 0xc1, 0x78, 0x7a, 0x43, 0xc1, 0x88, 0xc3, 0x93, 0x42, 0x06, 0xc1, 0x11, 0xc2, 0xe3, 0x6b, 0xdb, 0xc0, 0xeb, 0x42, 0x98, 0x42, 0x7b, 0x32, 0x05, 0xc2, 0x12, 0xf7, 0x0c, 0x40, 0xc4, 0xc0, 0x91, 0x42, 0x9b, 0xe6, 0x24, 0xc2, +0x61, 0x32, 0x83, 0x40, 0xf4, 0xac, 0x97, 0x42, 0x17, 0xc8, 0x15, 0xc2, 0xc4, 0xb1, 0x02, 0xc0, 0xf2, 0xd2, 0x9c, 0x42, 0xce, 0xcc, 0xeb, 0xc1, 0x11, 0xfc, 0xc5, 0x40, 0x65, 0x0a, 0x9d, 0x42, 0x71, 0xbd, 0x05, 0xc2, 0x63, 0x5d, 0x76, 0x41, 0x7f, 0x99, 0x9d, 0x42, 0x0d, 0x0f, 0x0e, 0xc2, 0x14, 0x3f, 0x76, 0x41, 0x7d, 0x3f, 0x98, 0x42, 0xa5, 0xac, 0x1b, 0xc2, 0x3f, 0xa4, 0x78, 0x41, 0xf9, 0x60, 0x92, 0x42, 0xc6, 0x0b, 0x2a, 0xc2, 0x01, 0x4d, 0xc6, 0xc1, 0x8d, 0x28, 0x99, 0x42, +0x48, 0xd0, 0x9d, 0xc1, 0xa2, 0x45, 0x95, 0xc1, 0xee, 0x5a, 0x9a, 0x42, 0xf2, 0xc1, 0x97, 0xc1, 0x32, 0x66, 0xa5, 0xc1, 0x92, 0xfc, 0x95, 0x42, 0xe7, 0x8c, 0xe6, 0xc1, 0x6b, 0x09, 0x69, 0xc1, 0x02, 0x3a, 0x99, 0x42, 0x5c, 0x0f, 0xd8, 0xc1, 0x44, 0x8b, 0x48, 0xc1, 0x53, 0x94, 0x9c, 0x42, 0xa7, 0x57, 0x8d, 0xc1, 0xa0, 0x1a, 0x05, 0xc1, 0xb5, 0xb5, 0x9c, 0x42, 0x5e, 0x29, 0xc2, 0xc1, 0x5b, 0x77, 0xfb, 0x3f, 0x2c, 0x83, 0xa2, 0x42, 0xab, 0xcf, 0x92, 0xc1, 0x04, 0x56, 0x3a, 0x3f, +0xd8, 0x5f, 0xa2, 0x42, 0x05, 0xa3, 0x46, 0xc1, 0xb7, 0x06, 0x8b, 0x40, 0xd2, 0x3e, 0xa2, 0x42, 0x48, 0x50, 0xc1, 0xc1, 0x3c, 0x5f, 0x5f, 0xc2, 0xc5, 0xa0, 0xa2, 0x42, 0x38, 0x67, 0xe4, 0xc1, 0xe4, 0x43, 0x5f, 0xc2, 0x1c, 0x7c, 0xae, 0x42, 0xd4, 0x9a, 0xb0, 0xc1, 0xff, 0x90, 0x47, 0xc2, 0xc8, 0x38, 0xa7, 0x42, 0xc9, 0xe5, 0xe7, 0xc1, 0x69, 0x80, 0x46, 0xc2, 0x75, 0xb1, 0xb2, 0x42, 0xe9, 0xb7, 0xb3, 0xc1, 0x69, 0x80, 0x46, 0xc2, 0x75, 0xb1, 0xb2, 0x42, 0xe9, 0xb7, 0xb3, 0xc1, +0x7c, 0xd0, 0x2e, 0xc2, 0xe4, 0xb2, 0xb0, 0x42, 0xc2, 0x86, 0xb2, 0xc1, 0xff, 0x90, 0x47, 0xc2, 0xc8, 0x38, 0xa7, 0x42, 0xc9, 0xe5, 0xe7, 0xc1, 0xc8, 0xc7, 0x31, 0xc2, 0xa8, 0x35, 0xa5, 0x42, 0xb1, 0xbf, 0xe7, 0xc1, 0x88, 0xf4, 0x31, 0xc2, 0x1a, 0xc0, 0x9b, 0x42, 0xc1, 0xa8, 0x06, 0xc2, 0x23, 0xb9, 0x42, 0xc2, 0xfd, 0x76, 0x9a, 0x42, 0x5c, 0x20, 0x0a, 0xc2, 0x6d, 0x85, 0x58, 0xc2, 0xb5, 0x95, 0x95, 0x42, 0x94, 0x87, 0x0a, 0xc2, 0x23, 0xb9, 0x42, 0xc2, 0xfd, 0x76, 0x9a, 0x42, +0x5c, 0x20, 0x0a, 0xc2, 0x4e, 0xa0, 0x80, 0xc2, 0x89, 0x50, 0x8b, 0x42, 0xec, 0x2f, 0xcf, 0xc1, 0xb6, 0x02, 0x83, 0xc2, 0xe0, 0x2d, 0x91, 0x42, 0x09, 0x0a, 0x94, 0xc1, 0xa5, 0x7d, 0x74, 0xc2, 0x09, 0x39, 0x98, 0x42, 0x05, 0x23, 0xda, 0xc1, 0xc1, 0xd7, 0x76, 0xc2, 0x4a, 0xcc, 0xa3, 0x42, 0x8f, 0xd3, 0xa7, 0xc1, 0x4d, 0x22, 0x6b, 0xc2, 0xb2, 0x6c, 0x8d, 0x42, 0x55, 0x70, 0x08, 0xc2, 0x5f, 0xd8, 0x77, 0xc2, 0xd8, 0x81, 0x83, 0x42, 0x3a, 0xd2, 0x03, 0xc2, 0xa0, 0xc9, 0x69, 0xc2, +0x35, 0x8d, 0x71, 0x42, 0xc4, 0xb1, 0x1c, 0xc2, 0x8a, 0x3d, 0x5c, 0xc2, 0x41, 0x11, 0x82, 0x42, 0x0c, 0x13, 0x22, 0xc2, 0xe2, 0x07, 0x4a, 0xc2, 0xd2, 0x8f, 0x89, 0x42, 0x0f, 0xba, 0x22, 0xc2, 0x85, 0xda, 0x2d, 0xc2, 0xc1, 0xca, 0x71, 0x42, 0x25, 0xf5, 0x3d, 0xc2, 0x42, 0xe0, 0x3a, 0xc2, 0xe7, 0x6a, 0x5d, 0x42, 0xbd, 0x63, 0x40, 0xc2, 0xb5, 0xd5, 0x44, 0xc2, 0x98, 0xcc, 0x44, 0x42, 0x3c, 0x7d, 0x3d, 0xc2, 0x65, 0xbb, 0x58, 0xc2, 0xef, 0xf8, 0x37, 0x42, 0x2d, 0x21, 0x29, 0xc2, +0x27, 0xe0, 0x6b, 0xc2, 0x2d, 0xe1, 0x2e, 0x42, 0xdc, 0x57, 0x0e, 0xc2, 0x2b, 0x36, 0x75, 0xc2, 0xd5, 0x56, 0x5f, 0x42, 0x90, 0x31, 0x11, 0xc2, 0x6a, 0x6b, 0x7f, 0xc2, 0xce, 0x48, 0x52, 0x42, 0x73, 0x06, 0x00, 0xc2, 0x0b, 0x64, 0x82, 0xc2, 0x09, 0x4a, 0x64, 0x42, 0x49, 0x1d, 0xec, 0xc1, 0xe7, 0xbb, 0x7f, 0xc2, 0x80, 0xea, 0x72, 0x42, 0xf1, 0x52, 0xf9, 0xc1, 0x8a, 0xce, 0x4c, 0xc2, 0xb0, 0x61, 0xb9, 0x41, 0x5b, 0xa0, 0xe8, 0xc1, 0xf8, 0xd3, 0x5b, 0xc2, 0x3a, 0x81, 0xb6, 0x41, +0x13, 0xd0, 0x9f, 0xc1, 0xc5, 0x0f, 0x6d, 0xc2, 0x92, 0x4b, 0xdf, 0x41, 0x88, 0xe3, 0xa1, 0xc1, 0xa7, 0x9b, 0x5c, 0xc2, 0x27, 0xb1, 0xe1, 0x41, 0x32, 0x66, 0xec, 0xc1, 0x0b, 0xb0, 0x7d, 0xc0, 0xe1, 0x29, 0x10, 0x42, 0x32, 0x08, 0x6e, 0xc2, 0xe0, 0x39, 0x15, 0xc1, 0xb3, 0xaa, 0x12, 0x42, 0xb6, 0x33, 0x6c, 0xc2, 0x57, 0x21, 0x8c, 0xc0, 0xa4, 0x4e, 0x1e, 0x42, 0x14, 0x5d, 0x6f, 0xc2, 0x4e, 0x40, 0x33, 0xc1, 0xa1, 0xa7, 0x1d, 0x42, 0xb3, 0x1d, 0x6c, 0xc2, 0xe5, 0x61, 0x51, 0xc1, +0xf9, 0x60, 0x2d, 0x42, 0x74, 0x64, 0x6b, 0xc2, 0x47, 0x1b, 0xa7, 0xc0, 0xd1, 0xe2, 0x2d, 0x42, 0x0a, 0x86, 0x6f, 0xc2, 0xb6, 0x62, 0x37, 0xc2, 0x5c, 0xbe, 0x0d, 0x42, 0xd8, 0x41, 0x39, 0xc2, 0xd4, 0x4d, 0x54, 0xc2, 0x41, 0x20, 0x09, 0x42, 0x7f, 0x19, 0x1a, 0xc2, 0x27, 0xe0, 0x6b, 0xc2, 0x2d, 0xe1, 0x2e, 0x42, 0xdc, 0x57, 0x0e, 0xc2, 0x65, 0xbb, 0x58, 0xc2, 0xef, 0xf8, 0x37, 0x42, 0x2d, 0x21, 0x29, 0xc2, 0xb5, 0xd5, 0x44, 0xc2, 0x98, 0xcc, 0x44, 0x42, 0x3c, 0x7d, 0x3d, 0xc2, +0x61, 0x03, 0x1f, 0xc2, 0xce, 0x59, 0x15, 0x42, 0xa6, 0xca, 0x48, 0xc2, 0x2b, 0xc7, 0x6a, 0xc2, 0x2c, 0xc3, 0x06, 0x42, 0xb7, 0x51, 0xeb, 0xc1, 0x61, 0x83, 0x7c, 0xc2, 0x1d, 0xda, 0x05, 0x42, 0xd3, 0x2b, 0xa1, 0xc1, 0x6f, 0xb0, 0x84, 0xc2, 0x79, 0xc7, 0x28, 0x42, 0x47, 0x83, 0x9b, 0xc1, 0xfc, 0x87, 0x7c, 0xc2, 0x74, 0x35, 0x2a, 0x42, 0x76, 0xcf, 0xde, 0xc1, 0x1e, 0x85, 0x63, 0xc1, 0xad, 0x9c, 0x4f, 0x42, 0xca, 0x32, 0x68, 0xc2, 0x3f, 0x35, 0xc0, 0xc0, 0x9f, 0x6b, 0x4d, 0x42, +0x2e, 0x32, 0x6c, 0xc2, 0xf4, 0x6c, 0x63, 0xc1, 0xc9, 0xe5, 0x3e, 0x42, 0x4b, 0xf7, 0x69, 0xc2, 0xd8, 0xf0, 0xba, 0xc0, 0xd9, 0x0e, 0x3e, 0x42, 0xc3, 0x64, 0x6e, 0xc2, 0x8d, 0x28, 0x32, 0xc1, 0x5f, 0xfa, 0x82, 0x42, 0x65, 0xc8, 0x42, 0xc2, 0x35, 0xef, 0xad, 0xc1, 0x04, 0x05, 0x80, 0x42, 0x44, 0x29, 0x45, 0xc2, 0x22, 0xfd, 0x5e, 0xc1, 0x0a, 0xa8, 0x87, 0x42, 0xb1, 0xae, 0x37, 0xc2, 0x31, 0x77, 0xc8, 0xc1, 0xdd, 0xd3, 0x83, 0x42, 0xb5, 0x26, 0x3d, 0xc2, 0x56, 0x8e, 0xf0, 0xc1, +0x89, 0xa1, 0x9a, 0x42, 0xe1, 0x8b, 0xa4, 0xc1, 0x19, 0x73, 0xda, 0xc1, 0x8d, 0xc6, 0x93, 0x42, 0xff, 0xa1, 0xf2, 0xc1, 0x08, 0x9b, 0xac, 0xc1, 0xea, 0x95, 0x8e, 0x42, 0xed, 0x8d, 0x1d, 0xc2, 0x08, 0x9b, 0xac, 0xc1, 0xea, 0x95, 0x8e, 0x42, 0xed, 0x8d, 0x1d, 0xc2, 0xca, 0x83, 0x04, 0xc2, 0x39, 0xc5, 0x8a, 0x42, 0x9c, 0xe2, 0x25, 0xc2, 0x19, 0x73, 0xda, 0xc1, 0x8d, 0xc6, 0x93, 0x42, 0xff, 0xa1, 0xf2, 0xc1, 0x17, 0x08, 0x09, 0xc2, 0x21, 0xce, 0x93, 0x42, 0x52, 0xb8, 0xf6, 0xc1, +0xf1, 0xf4, 0x09, 0xc2, 0x01, 0x0d, 0xa0, 0x42, 0x91, 0x7e, 0xac, 0xc1, 0x56, 0x8e, 0xf0, 0xc1, 0x89, 0xa1, 0x9a, 0x42, 0xe1, 0x8b, 0xa4, 0xc1, 0xea, 0xf3, 0x08, 0x42, 0xfe, 0x23, 0xa1, 0x42, 0xcb, 0xff, 0x08, 0xc2, 0xc7, 0xcb, 0x42, 0x42, 0x7d, 0x5f, 0xa2, 0x42, 0x81, 0xf3, 0xf6, 0xc1, 0x49, 0xdd, 0x1c, 0x42, 0x72, 0x4a, 0x9b, 0x42, 0x9b, 0x55, 0x14, 0xc2, 0xf4, 0x2c, 0x53, 0x42, 0x05, 0xf4, 0x9c, 0x42, 0x58, 0x79, 0x03, 0xc2, 0x0b, 0xa4, 0xed, 0x41, 0x9a, 0x77, 0x93, 0x42, +0x53, 0x34, 0x28, 0xc2, 0xf0, 0x05, 0xd9, 0x41, 0x7b, 0x74, 0x99, 0x42, 0xba, 0x89, 0x1b, 0xc2, 0x77, 0xbe, 0xc9, 0x41, 0x90, 0xa0, 0x9e, 0x42, 0xb3, 0x3b, 0x0f, 0xc2, 0x35, 0x8d, 0x79, 0x42, 0xdd, 0xd5, 0x9d, 0x42, 0x1f, 0xf4, 0xc1, 0xc1, 0xf2, 0xc1, 0x67, 0x42, 0x42, 0x6f, 0xa3, 0x42, 0xd0, 0xc4, 0xb9, 0xc1, 0x0a, 0x63, 0x18, 0x41, 0x40, 0x24, 0xa2, 0x42, 0x6f, 0x5f, 0xe6, 0xc1, 0x71, 0x9b, 0x84, 0x41, 0x08, 0x3b, 0xa2, 0x42, 0xf7, 0x28, 0xff, 0xc1, 0x2c, 0x94, 0x21, 0xc2, +0x4e, 0xa2, 0x92, 0x42, 0x18, 0x55, 0x12, 0xc2, 0x3a, 0x92, 0x1e, 0xc2, 0x2c, 0x23, 0x9c, 0x42, 0xd3, 0xab, 0xee, 0xc1, 0x9d, 0x80, 0x1a, 0xc2, 0x4d, 0x44, 0xa9, 0x42, 0xa8, 0x35, 0xb1, 0xc1, 0xfc, 0x87, 0x7c, 0xc2, 0x74, 0x35, 0x2a, 0x42, 0x76, 0xcf, 0xde, 0xc1, 0x6f, 0xb0, 0x84, 0xc2, 0x79, 0xc7, 0x28, 0x42, 0x47, 0x83, 0x9b, 0xc1, 0xe4, 0x43, 0x84, 0xc2, 0x65, 0x59, 0x4d, 0x42, 0x08, 0x9b, 0xce, 0xc1, 0x39, 0x14, 0x88, 0xc2, 0x1f, 0x05, 0x4d, 0x42, 0x94, 0x18, 0x93, 0xc1, +0x38, 0x09, 0x88, 0xc2, 0x6b, 0xda, 0x68, 0x42, 0xe1, 0x8b, 0x8e, 0xc1, 0x70, 0x5f, 0x85, 0xc2, 0x3d, 0x5b, 0x66, 0x42, 0xd8, 0x81, 0xc5, 0xc1, 0x15, 0x8c, 0x34, 0xc2, 0xe4, 0x92, 0x8e, 0x42, 0x0a, 0xc6, 0x1e, 0xc2, 0xf6, 0xc6, 0x1c, 0xc2, 0x5d, 0x9c, 0x81, 0x42, 0xee, 0xda, 0x36, 0xc2, 0xf6, 0xc6, 0x1c, 0xc2, 0x5d, 0x9c, 0x81, 0x42, 0xee, 0xda, 0x36, 0xc2, 0x15, 0x8c, 0x34, 0xc2, 0xe4, 0x92, 0x8e, 0x42, 0x0a, 0xc6, 0x1e, 0xc2, 0x5b, 0xb1, 0x83, 0xc2, 0x6a, 0xab, 0x7d, 0x42, +0x40, 0x13, 0xc8, 0xc1, 0xe8, 0x2a, 0x86, 0xc2, 0x59, 0x35, 0x82, 0x42, 0xbb, 0x49, 0x8f, 0xc1, 0x84, 0xde, 0x59, 0x42, 0x96, 0x52, 0xa7, 0x42, 0x57, 0x6c, 0xac, 0xc1, 0x19, 0x62, 0x38, 0x42, 0xf3, 0x7f, 0xa6, 0x42, 0x33, 0x22, 0xe5, 0xc1, 0xc2, 0xc6, 0x30, 0x42, 0xee, 0x3c, 0xaa, 0x42, 0xf5, 0x4a, 0xd6, 0xc1, 0xde, 0xc2, 0x50, 0x42, 0xe9, 0xb7, 0xaa, 0x42, 0x23, 0x39, 0xa3, 0xc1, 0x70, 0x5f, 0x8f, 0x41, 0x65, 0x68, 0xa6, 0x42, 0x55, 0x1f, 0xe8, 0xc1, 0xa9, 0x02, 0xca, 0x41, +0x40, 0x24, 0xa2, 0x42, 0xbe, 0x70, 0x05, 0xc2, 0x79, 0xc7, 0xce, 0x41, 0x7a, 0x45, 0xa6, 0x42, 0x19, 0x04, 0xf7, 0xc1, 0xda, 0x2c, 0x98, 0x41, 0xaa, 0x11, 0xaa, 0x42, 0xd8, 0xdf, 0xdb, 0xc1, 0x70, 0x4e, 0xd1, 0x41, 0xd1, 0x20, 0xaa, 0x42, 0xb8, 0x9e, 0xea, 0xc1, 0xab, 0x0f, 0x0b, 0x42, 0xcf, 0x15, 0xaa, 0x42, 0x00, 0x5e, 0xeb, 0xc1, 0x41, 0x20, 0x0c, 0x42, 0x26, 0x22, 0xa6, 0x42, 0xf2, 0x1f, 0xfa, 0xc1, 0x54, 0x52, 0x42, 0x41, 0x65, 0x68, 0xa6, 0x42, 0x1a, 0xaf, 0xcc, 0xc1, +0xe8, 0x02, 0x06, 0x41, 0x63, 0x5d, 0xa6, 0x42, 0x66, 0xe6, 0xa8, 0xc1, 0xc3, 0x0d, 0x1f, 0x41, 0xad, 0xd8, 0xa9, 0x42, 0xed, 0x8d, 0xa0, 0xc1, 0x24, 0x97, 0x5b, 0x41, 0x32, 0xf5, 0xa9, 0x42, 0xd5, 0xf8, 0xc1, 0xc1, 0x9d, 0x91, 0x45, 0x42, 0x69, 0x6f, 0x20, 0x41, 0xc1, 0x97, 0xda, 0xc1, 0x9d, 0x2f, 0x1b, 0x42, 0x9e, 0xcd, 0x20, 0x41, 0x9c, 0x73, 0x06, 0xc2, 0xf4, 0xfd, 0x62, 0x41, 0x05, 0xfa, 0x1e, 0x41, 0x69, 0x40, 0x1e, 0xc2, 0xb3, 0x7b, 0x6c, 0x41, 0x24, 0x28, 0x36, 0x41, +0xd1, 0x11, 0x30, 0xc2, 0x13, 0xe1, 0xcb, 0x41, 0x1d, 0x03, 0x1f, 0x41, 0x2e, 0xff, 0x17, 0xc2, 0xa3, 0xf0, 0xdd, 0x41, 0x45, 0xd8, 0x36, 0x41, 0x15, 0x9d, 0x28, 0xc2, 0xb0, 0x8f, 0x50, 0xc0, 0x27, 0x31, 0x36, 0x41, 0xb6, 0xe2, 0x2f, 0xc2, 0x00, 0x1e, 0x6d, 0xbf, 0x4d, 0x67, 0x1f, 0x41, 0x7e, 0x4c, 0x1e, 0xc2, 0xc3, 0x24, 0x5c, 0x42, 0x17, 0x48, 0x20, 0x41, 0xb6, 0x04, 0x98, 0xc1, 0xf8, 0x31, 0x7a, 0x41, 0x0a, 0x46, 0x5f, 0x41, 0xd0, 0x73, 0x3f, 0xc2, 0xbf, 0x9f, 0xf0, 0x41, +0x36, 0xab, 0x61, 0x41, 0xcb, 0x10, 0x37, 0xc2, 0x76, 0x60, 0x87, 0x41, 0xc5, 0x8f, 0x8b, 0x41, 0xf5, 0x39, 0x4b, 0xc2, 0x63, 0x2e, 0x03, 0x42, 0x94, 0x65, 0x8e, 0x41, 0x56, 0x3d, 0x43, 0xc2, 0x36, 0x3c, 0xbf, 0xc0, 0xaa, 0x60, 0x63, 0x41, 0xe6, 0x5d, 0x3e, 0xc2, 0xc2, 0x06, 0x11, 0xc1, 0xf8, 0x42, 0x91, 0x41, 0x09, 0x4a, 0x4a, 0xc2, 0x76, 0xcf, 0x96, 0x41, 0x16, 0x19, 0x11, 0x42, 0x0c, 0x42, 0x72, 0xc2, 0xcd, 0x3b, 0x36, 0x41, 0x72, 0xf9, 0x0e, 0x42, 0x43, 0x1c, 0x71, 0xc2, +0x81, 0x95, 0x93, 0x41, 0x00, 0x40, 0x20, 0x42, 0x55, 0xf0, 0x74, 0xc2, 0xa8, 0xc6, 0x2d, 0x41, 0x44, 0x29, 0x1f, 0x42, 0x4b, 0x99, 0x73, 0xc2, 0x27, 0x31, 0x27, 0x41, 0x88, 0xa3, 0x2f, 0x42, 0xdc, 0x57, 0x74, 0xc2, 0x6b, 0x1a, 0x93, 0x41, 0xa0, 0x49, 0x31, 0x42, 0x13, 0x50, 0x75, 0xc2, 0x01, 0xbc, 0xd4, 0x41, 0x38, 0x96, 0x32, 0x42, 0x45, 0x07, 0x74, 0xc2, 0x34, 0x91, 0xcc, 0x41, 0x08, 0x9b, 0x20, 0x42, 0x19, 0xb3, 0x73, 0xc2, 0x6b, 0x1a, 0x93, 0x41, 0xa0, 0x49, 0x31, 0x42, +0x13, 0x50, 0x75, 0xc2, 0x81, 0x95, 0x93, 0x41, 0x00, 0x40, 0x20, 0x42, 0x55, 0xf0, 0x74, 0xc2, 0xcf, 0xf7, 0xc1, 0x41, 0xec, 0x40, 0x14, 0x42, 0x25, 0x35, 0x72, 0xc2, 0x76, 0xcf, 0x96, 0x41, 0x16, 0x19, 0x11, 0x42, 0x0c, 0x42, 0x72, 0xc2, 0x9b, 0xe6, 0x8f, 0x41, 0xe1, 0x0b, 0x43, 0x42, 0xf3, 0x3d, 0x74, 0xc2, 0xf6, 0xc0, 0x1f, 0x41, 0xb3, 0x2a, 0x40, 0x42, 0x07, 0x1f, 0x73, 0xc2, 0xa7, 0x4b, 0x17, 0x41, 0xf4, 0xfd, 0x4f, 0x42, 0x5d, 0x1c, 0x70, 0xc2, 0x42, 0x60, 0x89, 0x41, +0x37, 0x1a, 0x54, 0x42, 0x64, 0xaa, 0x70, 0xc2, 0x42, 0x60, 0x89, 0x41, 0x37, 0x1a, 0x54, 0x42, 0x64, 0xaa, 0x70, 0xc2, 0x67, 0xb3, 0xcb, 0x41, 0xba, 0xf8, 0x59, 0x42, 0xf4, 0x1b, 0x6e, 0xc2, 0x9b, 0xe6, 0x8f, 0x41, 0xe1, 0x0b, 0x43, 0x42, 0xf3, 0x3d, 0x74, 0xc2, 0x74, 0xa4, 0xd5, 0x41, 0xa4, 0xce, 0x46, 0x42, 0x0e, 0x7e, 0x72, 0xc2, 0xdf, 0xe0, 0x81, 0x41, 0x3e, 0x17, 0x63, 0x42, 0x37, 0x78, 0x6b, 0xc2, 0x30, 0x64, 0x10, 0x41, 0x13, 0x83, 0x5e, 0x42, 0x83, 0x80, 0x6b, 0xc2, +0x47, 0x1b, 0x10, 0x41, 0xac, 0xfa, 0x6b, 0x42, 0x8a, 0x1f, 0x65, 0xc2, 0xce, 0x88, 0x7f, 0x41, 0x42, 0xe0, 0x6f, 0x42, 0xcb, 0x50, 0x65, 0xc2, 0xce, 0x88, 0x7f, 0x41, 0x42, 0xe0, 0x6f, 0x42, 0xcb, 0x50, 0x65, 0xc2, 0x5b, 0xb1, 0xaa, 0x41, 0xd5, 0x38, 0x72, 0x42, 0xd7, 0xd2, 0x64, 0xc2, 0xdf, 0xe0, 0x81, 0x41, 0x3e, 0x17, 0x63, 0x42, 0x37, 0x78, 0x6b, 0xc2, 0x86, 0x38, 0xba, 0x41, 0x2e, 0xee, 0x68, 0x42, 0x05, 0xd6, 0x68, 0xc2, 0xaa, 0x60, 0x79, 0x41, 0xae, 0x16, 0x8c, 0x42, +0x62, 0x50, 0x38, 0xc2, 0x30, 0xaa, 0x03, 0x42, 0xef, 0x18, 0x8c, 0x42, 0xfd, 0x65, 0x36, 0xc2, 0x01, 0x8d, 0x30, 0x42, 0xf8, 0xf3, 0x84, 0x42, 0x9c, 0xc4, 0x3d, 0xc2, 0xf4, 0xfd, 0x4c, 0x42, 0x54, 0xa3, 0x76, 0x42, 0x1c, 0xfc, 0x42, 0xc2, 0x10, 0x29, 0x5e, 0x42, 0xc8, 0x18, 0x5e, 0x42, 0x04, 0x16, 0x47, 0xc2, 0x29, 0x4b, 0x64, 0x42, 0x84, 0x3c, 0x43, 0x42, 0xf6, 0x46, 0x4a, 0xc2, 0xa8, 0x06, 0x60, 0x42, 0x0c, 0xd3, 0x27, 0x42, 0x07, 0x1f, 0x4d, 0xc2, 0xe4, 0x43, 0x52, 0x42, +0xe4, 0x54, 0x0d, 0x42, 0x5e, 0x69, 0x4e, 0xc2, 0x84, 0x0d, 0x3a, 0x42, 0xce, 0xcc, 0xe9, 0x41, 0x1f, 0x05, 0x4e, 0xc2, 0x78, 0x0b, 0x8c, 0x41, 0x45, 0x36, 0xab, 0x41, 0xcb, 0x90, 0x54, 0xc2, 0xf8, 0x02, 0x0f, 0x42, 0x63, 0x10, 0xba, 0x41, 0x19, 0xb3, 0x4d, 0xc2, 0xcc, 0x5d, 0x59, 0xc1, 0x3e, 0x79, 0xbf, 0x41, 0xde, 0x71, 0x52, 0xc2, 0x57, 0xec, 0xc6, 0xc1, 0xfa, 0xdc, 0xf2, 0x41, 0x75, 0x82, 0x53, 0xc2, 0x35, 0x8d, 0x01, 0xc2, 0x59, 0x39, 0x14, 0x42, 0x35, 0x8d, 0x52, 0xc2, +0x48, 0x61, 0x16, 0xc2, 0x6c, 0xb8, 0x32, 0x42, 0x6a, 0x0d, 0x4f, 0xc2, 0x85, 0xda, 0x2d, 0xc2, 0xc1, 0xca, 0x71, 0x42, 0x25, 0xf5, 0x3d, 0xc2, 0x1e, 0x45, 0x11, 0xc2, 0x2e, 0x2e, 0x62, 0x42, 0x06, 0x70, 0x4a, 0xc2, 0x42, 0xe0, 0x3a, 0xc2, 0xe7, 0x6a, 0x5d, 0x42, 0xbd, 0x63, 0x40, 0xc2, 0xf9, 0x60, 0x18, 0xc2, 0xf8, 0x71, 0x4b, 0x42, 0x0f, 0xad, 0x4d, 0xc2, 0xf6, 0xc6, 0x1c, 0xc2, 0x5d, 0x9c, 0x81, 0x42, 0xee, 0xda, 0x36, 0xc2, 0x57, 0x1b, 0x01, 0xc2, 0xc5, 0x0f, 0x78, 0x42, +0x05, 0xd2, 0x44, 0xc2, 0xca, 0x83, 0x04, 0xc2, 0x39, 0xc5, 0x8a, 0x42, 0x9c, 0xe2, 0x25, 0xc2, 0x06, 0x81, 0x50, 0xc1, 0xc7, 0xe9, 0x5c, 0x42, 0x93, 0x47, 0x66, 0xc2, 0x8a, 0x3c, 0xb8, 0xc0, 0x5a, 0xd3, 0x5a, 0x42, 0xd6, 0x05, 0x69, 0xc2, 0xaa, 0x0e, 0xb5, 0xc0, 0x6d, 0x34, 0x66, 0x42, 0xed, 0x4d, 0x64, 0xc2, 0xbb, 0x27, 0x33, 0xc1, 0x0a, 0x17, 0x65, 0x42, 0x19, 0xe2, 0x63, 0xc2, 0x7a, 0xdf, 0xb0, 0x3f, 0x6e, 0xf4, 0x89, 0x42, 0xdd, 0xd3, 0x37, 0xc2, 0x58, 0x28, 0x01, 0xc2, +0x40, 0x93, 0x2c, 0x42, 0x78, 0x8b, 0x54, 0xc2, 0xcd, 0xaa, 0xde, 0xc1, 0xd8, 0x70, 0x13, 0x42, 0xb1, 0x72, 0x57, 0xc2, 0x7e, 0x8c, 0xad, 0xc1, 0xc7, 0xfa, 0x15, 0x42, 0x05, 0x23, 0x61, 0xc2, 0x7b, 0xf2, 0xc6, 0xc1, 0x71, 0x2c, 0x14, 0x42, 0x86, 0x67, 0x5b, 0xc2, 0x20, 0xc1, 0xd1, 0xc1, 0x97, 0xbf, 0x2a, 0x42, 0x03, 0x67, 0x5e, 0xc2, 0x92, 0xcb, 0xec, 0xc1, 0xb1, 0xee, 0x2a, 0x42, 0x9c, 0x33, 0x58, 0xc2, 0x66, 0x66, 0x71, 0xc1, 0x69, 0x5e, 0x05, 0x42, 0xd3, 0x2b, 0x63, 0xc2, +0xbd, 0xc1, 0x8d, 0xc1, 0xee, 0x6b, 0x00, 0x42, 0x4b, 0x99, 0x5d, 0xc2, 0x33, 0x22, 0xa3, 0xc1, 0xd8, 0xdf, 0xf9, 0x41, 0xe5, 0x21, 0x59, 0xc2, 0xb7, 0x51, 0x03, 0xc2, 0xab, 0x7e, 0x5d, 0x42, 0x7e, 0xbb, 0x4d, 0xc2, 0xad, 0xfa, 0x06, 0xc2, 0x8f, 0x31, 0x45, 0x42, 0xe3, 0x94, 0x51, 0xc2, 0x40, 0x24, 0xe4, 0xc1, 0x94, 0x36, 0x42, 0x42, 0x8b, 0x1b, 0x5b, 0xc2, 0x34, 0x33, 0xfc, 0xc1, 0x40, 0x53, 0x43, 0x42, 0x2e, 0xb2, 0x54, 0xc2, 0x36, 0xbc, 0xe4, 0xc1, 0xbd, 0xd2, 0x59, 0x42, +0xc6, 0x8b, 0x57, 0xc2, 0x91, 0x5c, 0xf8, 0xc1, 0xa4, 0xce, 0x5b, 0x42, 0x76, 0xa0, 0x50, 0xc2, 0xf6, 0x06, 0xec, 0x41, 0xcc, 0x5d, 0xd0, 0x41, 0xe3, 0x54, 0x58, 0xc2, 0x92, 0x3a, 0x7e, 0x41, 0xc9, 0x54, 0xbf, 0x41, 0x8c, 0xec, 0x5a, 0xc2, 0xee, 0xc9, 0x55, 0x41, 0x73, 0x46, 0xde, 0x41, 0x9e, 0xde, 0x66, 0xc2, 0xcb, 0xff, 0xbd, 0x41, 0x80, 0xa6, 0xeb, 0x41, 0x55, 0xb0, 0x66, 0xc2, 0xd0, 0xb3, 0x67, 0x41, 0x58, 0x28, 0xcd, 0x41, 0x09, 0xe8, 0x5f, 0xc2, 0x09, 0x68, 0xd3, 0x41, +0x8a, 0x0e, 0xdc, 0x41, 0xa1, 0xa7, 0x5e, 0xc2, 0xcb, 0xff, 0xbd, 0x41, 0x80, 0xa6, 0xeb, 0x41, 0x55, 0xb0, 0x66, 0xc2, 0x62, 0x7f, 0xfe, 0x41, 0x1c, 0x7c, 0x04, 0x42, 0xfb, 0xba, 0x66, 0xc2, 0x09, 0x68, 0xd3, 0x41, 0x8a, 0x0e, 0xdc, 0x41, 0xa1, 0xa7, 0x5e, 0xc2, 0x54, 0xa3, 0x0e, 0x42, 0x12, 0x03, 0xfd, 0x41, 0xd5, 0x96, 0x5e, 0xc2, 0xcf, 0xb7, 0x1e, 0x42, 0x91, 0x7e, 0xf4, 0x41, 0xbc, 0x85, 0x57, 0xc2, 0x07, 0xce, 0x20, 0xc1, 0x1a, 0xaf, 0xd4, 0x41, 0xb4, 0x08, 0x5a, 0xc2, +0x89, 0xb0, 0xd9, 0xc0, 0xbd, 0xd2, 0xf0, 0x41, 0x2a, 0xd8, 0x64, 0xc2, 0x80, 0x60, 0x05, 0xc1, 0x39, 0x45, 0xe1, 0x41, 0x04, 0x05, 0x5f, 0xc2, 0x13, 0x03, 0x39, 0x42, 0x0a, 0xd7, 0x10, 0x42, 0x10, 0x29, 0x57, 0xc2, 0x62, 0x21, 0x14, 0x42, 0x33, 0x73, 0x18, 0x42, 0x0b, 0xe4, 0x66, 0xc2, 0x5f, 0xc7, 0x26, 0x42, 0x7b, 0x32, 0x14, 0x42, 0xab, 0xad, 0x5e, 0xc2, 0xd5, 0x38, 0x1f, 0x42, 0xda, 0xce, 0x2f, 0x42, 0xf4, 0x2c, 0x66, 0xc2, 0x7c, 0x50, 0x34, 0x42, 0xe4, 0xf2, 0x2c, 0x42, +0x1a, 0xef, 0x5d, 0xc2, 0x1b, 0x0d, 0x48, 0x42, 0xe3, 0x36, 0x2a, 0x42, 0xf4, 0x2c, 0x56, 0xc2, 0x57, 0x8e, 0x4c, 0x42, 0xd0, 0x04, 0x45, 0x42, 0xbb, 0xd6, 0x53, 0xc2, 0x6e, 0x74, 0x22, 0x42, 0xbc, 0xa3, 0x48, 0x42, 0x49, 0x1d, 0x64, 0xc2, 0x77, 0x6d, 0x38, 0x42, 0x27, 0x0f, 0x47, 0x42, 0x6d, 0xd6, 0x5b, 0xc2, 0x10, 0xa9, 0x1b, 0x42, 0xc8, 0x98, 0x60, 0x42, 0xe8, 0x59, 0x60, 0xc2, 0xa3, 0x12, 0x31, 0x42, 0xbc, 0x85, 0x60, 0x42, 0x86, 0x49, 0x58, 0xc2, 0xb5, 0x48, 0x45, 0x42, +0x1e, 0x56, 0x5f, 0x42, 0xd5, 0x56, 0x50, 0xc2, 0x89, 0x92, 0x14, 0x42, 0xbb, 0x96, 0x83, 0x42, 0x8f, 0x53, 0x47, 0xc2, 0x23, 0xdb, 0xd5, 0x41, 0x5d, 0x0d, 0x88, 0x42, 0x88, 0x23, 0x43, 0xc2, 0x75, 0x82, 0xa3, 0x41, 0x96, 0x92, 0x83, 0x42, 0xcb, 0x90, 0x54, 0xc2, 0x0f, 0x0b, 0xba, 0x41, 0xb5, 0x08, 0x86, 0x42, 0xba, 0x89, 0x4b, 0xc2, 0xdf, 0x3e, 0xe4, 0x41, 0xcd, 0xac, 0x80, 0x42, 0x0e, 0x7e, 0x57, 0xc2, 0xb7, 0x73, 0x02, 0x42, 0x1a, 0xb1, 0x82, 0x42, 0x3c, 0x3d, 0x4f, 0xc2, +0xb8, 0x1e, 0x2e, 0x41, 0xe4, 0x83, 0x82, 0x42, 0x0c, 0x71, 0x53, 0xc2, 0x86, 0x38, 0x44, 0x41, 0x32, 0x55, 0x85, 0x42, 0xac, 0x4b, 0x49, 0xc2, 0x75, 0x82, 0xa3, 0x41, 0x96, 0x92, 0x83, 0x42, 0xcb, 0x90, 0x54, 0xc2, 0x0f, 0x0b, 0xba, 0x41, 0xb5, 0x08, 0x86, 0x42, 0xba, 0x89, 0x4b, 0xc2, 0x74, 0x24, 0x5a, 0x41, 0xc0, 0xbb, 0x87, 0x42, 0x64, 0x8c, 0x42, 0xc2, 0x14, 0x7f, 0x32, 0x42, 0x15, 0x7b, 0x76, 0x42, 0x01, 0x0d, 0x4c, 0xc2, 0x98, 0x6e, 0x0b, 0x42, 0x9f, 0xbc, 0x74, 0x42, +0x14, 0xae, 0x5b, 0xc2, 0xde, 0xa4, 0x1e, 0x42, 0x14, 0x3f, 0x76, 0x42, 0x94, 0xc7, 0x53, 0xc2, 0x50, 0xeb, 0xe9, 0xc1, 0x5d, 0x2d, 0x73, 0x42, 0xd6, 0x05, 0x49, 0xc2, 0x9a, 0x99, 0x96, 0xc1, 0xae, 0xf6, 0x77, 0x42, 0xe5, 0x90, 0x53, 0xc2, 0xdc, 0xb5, 0xcb, 0xc1, 0xbc, 0xb4, 0x6c, 0x42, 0x96, 0xc3, 0x54, 0xc2, 0xb1, 0xd0, 0xa3, 0xc1, 0x2f, 0xcc, 0x7c, 0x42, 0xe9, 0x37, 0x49, 0xc2, 0x26, 0x06, 0xdd, 0xc1, 0xbc, 0x85, 0x70, 0x42, 0x9f, 0x7c, 0x4c, 0xc2, 0xbd, 0xef, 0x12, 0xc1, +0x5d, 0x6d, 0x7c, 0x42, 0x3d, 0x4a, 0x53, 0xc2, 0x34, 0x80, 0x22, 0xc1, 0xce, 0xe8, 0x80, 0x42, 0x77, 0x2d, 0x48, 0xc2, 0xda, 0x55, 0x8c, 0x3f, 0xd2, 0xa2, 0x7f, 0x42, 0xe1, 0x7a, 0x53, 0xc2, 0xe8, 0x4d, 0xbd, 0x3f, 0x97, 0x0e, 0x82, 0x42, 0x59, 0x17, 0x49, 0xc2, 0xfe, 0xc3, 0xa2, 0xc1, 0x8d, 0x46, 0x2c, 0x42, 0x0f, 0x3a, 0x65, 0xc2, 0xc8, 0x07, 0x87, 0xc1, 0xe3, 0x36, 0x1a, 0x42, 0xf3, 0x1f, 0x67, 0xc2, 0x92, 0xcb, 0x41, 0xc1, 0xfd, 0x25, 0x0c, 0x42, 0xf4, 0xac, 0x68, 0xc2, +0x4d, 0xf3, 0xb1, 0xc1, 0x9d, 0x80, 0x54, 0x42, 0xc9, 0x14, 0x60, 0xc2, 0x23, 0x39, 0xb2, 0xc1, 0x38, 0xa7, 0x40, 0x42, 0x9c, 0xc4, 0x62, 0xc2, 0xf2, 0xb0, 0xa7, 0x41, 0x21, 0x0e, 0x03, 0x42, 0x0a, 0x97, 0x6d, 0xc2, 0x7a, 0xa5, 0x44, 0x41, 0x48, 0xbf, 0xfd, 0x41, 0x09, 0xca, 0x6c, 0xc2, 0xf2, 0xb0, 0xa7, 0x41, 0x21, 0x0e, 0x03, 0x42, 0x0a, 0x97, 0x6d, 0xc2, 0x96, 0x10, 0xde, 0x41, 0x01, 0xcd, 0x0c, 0x42, 0x01, 0xfc, 0x6d, 0xc2, 0x9b, 0xfe, 0xa4, 0xc0, 0x5f, 0x98, 0x03, 0x42, +0x3f, 0x46, 0x6a, 0xc2, 0x48, 0x50, 0xfe, 0x41, 0x65, 0x2a, 0x1d, 0x42, 0x6d, 0x85, 0x6e, 0xc2, 0xa1, 0x96, 0x07, 0x42, 0xd3, 0xfc, 0x31, 0x42, 0xf4, 0x1b, 0x6e, 0xc2, 0x36, 0xfc, 0x08, 0x42, 0x35, 0xaf, 0x48, 0x42, 0x86, 0xf8, 0x6b, 0xc2, 0x91, 0xfe, 0x02, 0x42, 0x7a, 0x65, 0x5e, 0x42, 0xd3, 0xfc, 0x67, 0xc2, 0xb8, 0x8d, 0xc4, 0x41, 0xd4, 0x1a, 0x7a, 0x42, 0x64, 0x4c, 0x5f, 0xc2, 0xed, 0x1e, 0x8e, 0x41, 0x35, 0x8d, 0x7c, 0x42, 0x9e, 0x9e, 0x5d, 0xc2, 0xed, 0x1e, 0x8e, 0x41, +0x35, 0x8d, 0x7c, 0x42, 0x9e, 0x9e, 0x5d, 0xc2, 0x4e, 0x0b, 0x1b, 0x41, 0xfe, 0x43, 0x79, 0x42, 0x1d, 0x09, 0x5d, 0xc2, 0xcd, 0x2a, 0xeb, 0x41, 0xc2, 0xb5, 0x6f, 0x42, 0x77, 0x2d, 0x63, 0xc2, 0x41, 0xf1, 0x9f, 0xc1, 0x54, 0x52, 0x64, 0x42, 0x08, 0xec, 0x5d, 0xc2, 0x54, 0xc1, 0x6e, 0xc1, 0x75, 0x82, 0x6d, 0x42, 0x1f, 0xe3, 0x5c, 0xc2, 0xd7, 0xa3, 0xe7, 0xc0, 0x6f, 0x70, 0x71, 0x42, 0xe6, 0xd0, 0x5c, 0xc2, 0x84, 0x81, 0x9f, 0x3f, 0x1b, 0xde, 0x74, 0x42, 0x6b, 0xeb, 0x5c, 0xc2, +0x98, 0xc0, 0xc5, 0x3f, 0x50, 0x7c, 0x68, 0x42, 0xb2, 0xcc, 0x64, 0xc2, 0x99, 0x47, 0xd2, 0x3f, 0xb9, 0xab, 0x5b, 0x42, 0x07, 0x9f, 0x6a, 0xc2, 0xe2, 0x58, 0xe7, 0x3f, 0xa5, 0xbd, 0x4d, 0x42, 0x66, 0x95, 0x6e, 0xc2, 0x07, 0xb1, 0x09, 0x40, 0x01, 0x80, 0x3e, 0x42, 0x83, 0x1e, 0x71, 0xc2, 0x57, 0xad, 0x28, 0x40, 0x65, 0x88, 0x2e, 0x42, 0x04, 0x16, 0x72, 0xc2, 0x33, 0x16, 0x49, 0x40, 0xb4, 0x77, 0x1e, 0x42, 0xa0, 0xb8, 0x71, 0xc2, 0x6d, 0x1c, 0x5d, 0x40, 0x9c, 0xb3, 0x0e, 0x42, +0x69, 0x9e, 0x6f, 0xc2, 0xd1, 0x91, 0x54, 0x40, 0x14, 0x9d, 0xfe, 0x41, 0xe5, 0xa1, 0x6b, 0xc2, 0x9f, 0x59, 0x34, 0x40, 0xea, 0x73, 0xcf, 0x41, 0xe2, 0x07, 0x60, 0xc2, 0xc8, 0x41, 0x41, 0x40, 0xe6, 0x9d, 0xe2, 0x41, 0x15, 0x1d, 0x66, 0xc2, 0xb1, 0x50, 0x23, 0x40, 0xdc, 0xd7, 0xac, 0x41, 0xd7, 0x92, 0x55, 0xc2, 0xf0, 0xa7, 0x2e, 0x40, 0xbf, 0x6c, 0xc1, 0x41, 0xcb, 0x50, 0x5b, 0xc2, 0xfa, 0xed, 0x67, 0x40, 0x43, 0xad, 0x8c, 0x41, 0x89, 0x01, 0x4d, 0xc2, 0x45, 0xf0, 0x88, 0x40, +0x17, 0x48, 0x60, 0x41, 0x6d, 0x67, 0x41, 0xc2, 0xb8, 0x1e, 0x92, 0x40, 0x5f, 0x98, 0x36, 0x41, 0x7f, 0x2a, 0x32, 0xc2, 0x06, 0x2a, 0x93, 0x40, 0x03, 0xa1, 0x1f, 0x41, 0xfa, 0x5c, 0x20, 0xc2, 0x17, 0x26, 0x1b, 0xc2, 0x9d, 0x80, 0x3c, 0x41, 0x08, 0x3d, 0x26, 0xc1, 0x3e, 0x57, 0xfe, 0xc1, 0x64, 0xaa, 0x22, 0x41, 0xa8, 0xa4, 0x1f, 0xc1, 0x7a, 0x25, 0x35, 0xc2, 0xf6, 0x06, 0x68, 0x41, 0x54, 0x52, 0x2d, 0xc1, 0x87, 0x85, 0x4d, 0xc2, 0x30, 0xaa, 0x91, 0x41, 0xf0, 0x16, 0x32, 0xc1, +0x6b, 0xab, 0x5d, 0xc2, 0x9b, 0x46, 0xb6, 0x42, 0x28, 0x7e, 0x72, 0xc1, 0xba, 0x89, 0x45, 0xc2, 0x52, 0xf6, 0xb9, 0x42, 0x58, 0x17, 0x75, 0xc1, 0x95, 0x14, 0x83, 0xc2, 0x95, 0x94, 0x95, 0x42, 0x28, 0x7e, 0x32, 0xc1, 0xd9, 0x7d, 0x73, 0xc2, 0x8e, 0x35, 0xab, 0x42, 0xaf, 0x94, 0x63, 0xc1, 0xbe, 0xf0, 0x61, 0xc2, 0x75, 0x02, 0xb7, 0x41, 0xa0, 0x89, 0x33, 0xc1, 0x0c, 0x91, 0x86, 0xc2, 0x83, 0xef, 0x29, 0x42, 0x27, 0xa0, 0x2e, 0xc1, 0x0c, 0x91, 0x86, 0xc2, 0x83, 0xef, 0x29, 0x42, +0x27, 0xa0, 0x2e, 0xc1, 0xc3, 0x04, 0x8a, 0xc2, 0xdc, 0x86, 0x4e, 0x42, 0xb7, 0xf3, 0x29, 0xc1, 0xa9, 0xc2, 0x89, 0xc2, 0x84, 0xbc, 0x6a, 0x42, 0x97, 0xff, 0x26, 0xc1, 0x35, 0x4f, 0x87, 0xc2, 0x0e, 0x5e, 0x84, 0x42, 0x07, 0xce, 0x27, 0xc1, 0x8a, 0xab, 0xa5, 0x40, 0x6e, 0x03, 0xa6, 0x42, 0x7b, 0xf2, 0x27, 0xc1, 0x42, 0xec, 0xc9, 0x40, 0x35, 0x3e, 0xa9, 0x42, 0x62, 0x73, 0x19, 0xc1, 0x27, 0x31, 0xc1, 0x40, 0xfd, 0x25, 0xa6, 0x42, 0x63, 0x10, 0x81, 0xc1, 0xfa, 0xd0, 0xee, 0x40, +0xa3, 0xa1, 0xa9, 0x42, 0x3c, 0x2c, 0x72, 0xc1, 0xb9, 0xfc, 0xb0, 0x40, 0xea, 0x55, 0xad, 0x42, 0x2f, 0xe9, 0x13, 0xc1, 0x34, 0x29, 0x19, 0x40, 0xb2, 0xbd, 0xb4, 0x42, 0xa8, 0xb5, 0x1d, 0xc1, 0xb3, 0xb5, 0x1e, 0x41, 0x3a, 0xe1, 0xad, 0x42, 0x68, 0xa2, 0x9f, 0xc1, 0xf8, 0xda, 0xe3, 0x40, 0xda, 0xca, 0xad, 0x42, 0x07, 0x3d, 0x70, 0xc1, 0x49, 0x29, 0xa8, 0x40, 0x0b, 0xa4, 0xb3, 0x42, 0xb3, 0x9d, 0x81, 0xc1, 0xd3, 0xcd, 0x0a, 0x41, 0x33, 0x22, 0xb3, 0x42, 0x4d, 0xf3, 0xa7, 0xc1, +0x70, 0x5f, 0x99, 0x41, 0x3e, 0xf7, 0xad, 0x42, 0x78, 0x7a, 0xd9, 0xc1, 0xec, 0x2f, 0x5e, 0x41, 0x83, 0xe0, 0xad, 0x42, 0x0f, 0x7a, 0xc0, 0xc1, 0x07, 0x5f, 0x4f, 0x41, 0x94, 0xd8, 0xb2, 0x42, 0x2c, 0x43, 0xc7, 0xc1, 0x01, 0xcd, 0x92, 0x41, 0x8e, 0xd5, 0xb2, 0x42, 0xdc, 0xc6, 0xdf, 0xc1, 0xe2, 0xd8, 0xcf, 0x41, 0x5b, 0x31, 0xae, 0x42, 0x09, 0xac, 0xe7, 0xc1, 0xb6, 0x62, 0xc8, 0x41, 0x13, 0x21, 0xb3, 0x42, 0xcb, 0xa1, 0xef, 0xc1, 0x47, 0x32, 0x03, 0x42, 0x21, 0x6e, 0xb3, 0x42, +0xeb, 0x62, 0xf3, 0xc1, 0x18, 0x26, 0x08, 0x42, 0x98, 0x3b, 0xae, 0x42, 0xc7, 0x3a, 0xe8, 0xc1, 0x05, 0x74, 0x25, 0x42, 0xf6, 0x57, 0xb4, 0x42, 0xa8, 0xa4, 0xe5, 0xc1, 0x12, 0x54, 0x2b, 0x42, 0x92, 0x7a, 0xae, 0x42, 0x02, 0xab, 0xd4, 0xc1, 0xc5, 0xcf, 0x4b, 0x42, 0xec, 0xa0, 0xae, 0x42, 0x95, 0xd4, 0xa4, 0xc1, 0xbf, 0x7d, 0x4b, 0x42, 0x73, 0x57, 0xb5, 0x42, 0xcd, 0x2a, 0xbd, 0xc1, 0x04, 0xc5, 0x34, 0xc1, 0x4f, 0x62, 0xf5, 0x42, 0x22, 0x26, 0x1b, 0x41, 0xa4, 0xdf, 0x27, 0xc1, +0xb5, 0x88, 0xff, 0x42, 0x74, 0x24, 0x27, 0x41, 0x36, 0xab, 0x39, 0xc1, 0xe0, 0x8f, 0xf5, 0x42, 0xd1, 0xf4, 0x0a, 0x41, 0x05, 0xa3, 0x31, 0xc1, 0x55, 0xe3, 0xff, 0x42, 0x61, 0xa6, 0x06, 0x41, 0xcb, 0xa1, 0x2f, 0xc1, 0x65, 0xbb, 0xf4, 0x42, 0x53, 0x05, 0x2b, 0x41, 0x5f, 0xc1, 0x1d, 0xc1, 0x78, 0x3e, 0xfe, 0x42, 0x9c, 0xc4, 0x46, 0x41, 0x4c, 0xa6, 0x2a, 0xc1, 0xd7, 0xa3, 0xf3, 0x42, 0x42, 0x60, 0x39, 0x41, 0xde, 0xf1, 0x13, 0xc1, 0xf2, 0x12, 0xfc, 0x42, 0xe5, 0x61, 0x63, 0x41, +0x25, 0x06, 0x26, 0xc1, 0xf0, 0x27, 0xf2, 0x42, 0x12, 0x83, 0x45, 0x41, 0xa3, 0xe4, 0x0a, 0xc1, 0x3c, 0x1f, 0xf9, 0x42, 0x3f, 0xa4, 0x7b, 0x41, 0xad, 0xfa, 0x21, 0xc1, 0x9a, 0x59, 0xf0, 0x42, 0x19, 0xe2, 0x4e, 0x41, 0x01, 0xfb, 0x02, 0xc1, 0x2c, 0x87, 0xf5, 0x42, 0x24, 0x28, 0x87, 0x41, 0x3c, 0xb1, 0x1e, 0xc1, 0xe0, 0x4f, 0xee, 0x42, 0xf6, 0x06, 0x55, 0x41, 0xbb, 0x44, 0xf9, 0xc0, 0x4d, 0x77, 0xf1, 0x42, 0xd9, 0x4e, 0x8d, 0x41, 0x03, 0x5b, 0x1c, 0xc1, 0x4f, 0x22, 0xec, 0x42, +0x4f, 0xaf, 0x57, 0x41, 0x25, 0xc7, 0xef, 0xc0, 0x42, 0x20, 0xed, 0x42, 0x73, 0xc6, 0x8f, 0x41, 0xbc, 0x00, 0x1b, 0xc1, 0x85, 0xeb, 0xe9, 0x42, 0x67, 0xb3, 0x56, 0x41, 0x67, 0xb3, 0xea, 0xc0, 0xdc, 0xb9, 0xe8, 0x42, 0xc4, 0xc2, 0x8e, 0x41, 0xdc, 0xba, 0x1a, 0xc1, 0x26, 0xc6, 0xe7, 0x42, 0x46, 0x25, 0x52, 0x41, 0xe7, 0xde, 0xe9, 0xc0, 0x4c, 0x77, 0xe4, 0x42, 0x21, 0x30, 0x8a, 0x41, 0x83, 0x92, 0x1b, 0xc1, 0x4a, 0xcc, 0xe5, 0x42, 0x3c, 0x2c, 0x4a, 0x41, 0xbb, 0x61, 0xed, 0xc0, +0xc7, 0x8b, 0xe0, 0x42, 0xb8, 0x2f, 0x82, 0x41, 0x45, 0xbb, 0x1d, 0xc1, 0xc1, 0x0a, 0xe4, 0x42, 0x4e, 0x40, 0x3e, 0x41, 0xbe, 0x65, 0xf6, 0xc0, 0x69, 0x11, 0xdd, 0x42, 0x75, 0x93, 0x6c, 0x41, 0x51, 0x49, 0x22, 0xc1, 0x0d, 0x82, 0xe2, 0x42, 0xa7, 0x57, 0x2b, 0x41, 0xa4, 0x70, 0x04, 0xc1, 0xe6, 0x10, 0xda, 0x42, 0x2e, 0x90, 0x47, 0x41, 0x2e, 0x90, 0x2b, 0xc1, 0xf9, 0xd3, 0xe1, 0x42, 0x7e, 0x80, 0x0b, 0x41, 0x62, 0xb9, 0x15, 0xc1, 0xf5, 0x28, 0xd8, 0x42, 0xab, 0xad, 0x08, 0x41, +0x0d, 0x02, 0x27, 0xc1, 0x13, 0x03, 0xe2, 0x42, 0x12, 0xce, 0x1a, 0x41, 0x1c, 0x99, 0x0d, 0xc1, 0x3e, 0xca, 0xd8, 0x42, 0xf2, 0xb0, 0x26, 0x41, 0x04, 0xca, 0x10, 0xc1, 0xac, 0xbc, 0x04, 0x43, 0x2e, 0xb2, 0x2f, 0x41, 0x25, 0x4c, 0x1f, 0xc1, 0x7d, 0xff, 0x04, 0x43, 0xc8, 0xcd, 0xfe, 0x40, 0x60, 0xc8, 0x01, 0xc1, 0xf0, 0xc7, 0x03, 0x43, 0x96, 0x90, 0x5e, 0x41, 0x5e, 0x80, 0xe6, 0xc0, 0x4a, 0x2c, 0x02, 0x43, 0x4a, 0x7b, 0x84, 0x41, 0x17, 0xb7, 0xcb, 0xc0, 0xdc, 0xf9, 0xff, 0x42, +0xc2, 0x75, 0x96, 0x41, 0xd8, 0x7c, 0xb4, 0xc0, 0xf0, 0xa7, 0xfa, 0x42, 0xd8, 0x5f, 0xa4, 0x41, 0xdb, 0xdc, 0xa1, 0xc0, 0xd2, 0xa2, 0xf4, 0x42, 0x9d, 0x91, 0xad, 0x41, 0x23, 0xbe, 0x94, 0xc0, 0xb1, 0x32, 0xee, 0x42, 0xb8, 0x9e, 0xb1, 0x41, 0xbe, 0x87, 0x8d, 0xc0, 0xe4, 0xa5, 0xe7, 0x42, 0xbe, 0x30, 0xb0, 0x41, 0x38, 0xb9, 0x8c, 0xc0, 0xcc, 0x4c, 0xe1, 0x42, 0xdb, 0x79, 0xa9, 0x41, 0x9b, 0x03, 0x92, 0xc0, 0xf4, 0x7d, 0xdb, 0x42, 0x00, 0x80, 0x9d, 0x41, 0x38, 0x10, 0x9f, 0xc0, +0x09, 0x6c, 0xd6, 0x42, 0xe0, 0x1c, 0x8b, 0x41, 0xc0, 0x95, 0xba, 0xc0, 0xe1, 0xfa, 0xd1, 0x42, 0x57, 0x5b, 0x60, 0x41, 0x56, 0x0e, 0xd7, 0xc0, 0xb5, 0xc8, 0xcf, 0x42, 0xbe, 0x9f, 0x2f, 0x41, 0x81, 0x73, 0xe0, 0xc0, 0x79, 0x89, 0x09, 0x43, 0xd6, 0xc5, 0x34, 0x41, 0xfc, 0x46, 0x03, 0xc1, 0x07, 0xe1, 0x09, 0x43, 0x79, 0xc7, 0xea, 0x40, 0x39, 0x23, 0xb9, 0xc0, 0xb5, 0x48, 0x08, 0x43, 0xca, 0x32, 0x72, 0x41, 0xe9, 0x0e, 0x93, 0xc0, 0x0f, 0x2d, 0x06, 0x43, 0x54, 0xe3, 0x94, 0x41, +0x7e, 0xe3, 0x5f, 0xc0, 0x21, 0x50, 0x03, 0x43, 0x7b, 0x72, 0xac, 0x41, 0xec, 0xf5, 0x22, 0xc0, 0x6d, 0xa7, 0xff, 0x42, 0x49, 0xae, 0xbe, 0x41, 0x67, 0x5c, 0xe4, 0xbf, 0x19, 0xc4, 0xf7, 0x42, 0xcd, 0xbb, 0xca, 0x41, 0x9f, 0x8e, 0x9f, 0xbf, 0xf9, 0x53, 0xef, 0x42, 0x4a, 0x0c, 0xd0, 0x41, 0xfb, 0x77, 0x75, 0xbf, 0xe8, 0xbb, 0xe6, 0x42, 0xfa, 0x5c, 0xce, 0x41, 0x05, 0xa3, 0x6e, 0xbf, 0x6d, 0x67, 0xde, 0x42, 0x49, 0x9d, 0xc5, 0x41, 0x01, 0x13, 0x94, 0xbf, 0x6f, 0xd2, 0xd6, 0x42, +0xe3, 0x94, 0xb5, 0x41, 0xde, 0x1a, 0xdc, 0xbf, 0x21, 0x30, 0xd0, 0x42, 0x7b, 0x72, 0x9d, 0x41, 0xd1, 0xcb, 0x36, 0xc0, 0x38, 0x49, 0xca, 0x42, 0xe6, 0x1d, 0x75, 0x41, 0xe0, 0x62, 0x80, 0xc0, 0xe3, 0x54, 0xc7, 0x42, 0x0b, 0x24, 0x35, 0x41, 0x26, 0xfc, 0xbb, 0xc0, 0x19, 0x84, 0x0e, 0x43, 0xf8, 0x88, 0xd1, 0x40, 0x24, 0x5d, 0x8d, 0xc0, 0x17, 0x19, 0x0e, 0x43, 0x8f, 0x53, 0x36, 0x41, 0x83, 0xa3, 0x3a, 0xc0, 0xe6, 0x90, 0x0c, 0x43, 0x05, 0xb4, 0x80, 0x41, 0x26, 0xfc, 0xba, 0xbf, +0x30, 0xfd, 0x09, 0x43, 0x3c, 0xac, 0xa2, 0x41, 0x11, 0xe0, 0xf4, 0xbd, 0x30, 0x7d, 0x06, 0x43, 0x37, 0x78, 0xbf, 0x41, 0xf2, 0x98, 0x85, 0x3f, 0xa0, 0x3a, 0x02, 0x43, 0x8f, 0xc2, 0xd5, 0x41, 0x10, 0xe4, 0xfc, 0x3f, 0x63, 0xd0, 0xfa, 0x42, 0x5c, 0x7e, 0xe4, 0x41, 0xae, 0x7c, 0x28, 0x40, 0x7e, 0x7f, 0xf0, 0x42, 0x7e, 0xfb, 0xea, 0x41, 0xad, 0xfa, 0x3e, 0x40, 0xfb, 0xfe, 0xe5, 0x42, 0x2e, 0xee, 0xe8, 0x41, 0x80, 0xd4, 0x40, 0x40, 0x44, 0xcb, 0xdb, 0x42, 0x85, 0x6b, 0xde, 0x41, +0xa7, 0x3a, 0x2e, 0x40, 0xfb, 0x7e, 0xd2, 0x42, 0x4a, 0x0c, 0xcb, 0x41, 0x92, 0x3f, 0x00, 0x40, 0x48, 0xa1, 0xca, 0x42, 0xf4, 0xec, 0xab, 0x41, 0xfd, 0xd8, 0x30, 0x3f, 0x59, 0xd5, 0xc3, 0x42, 0xcb, 0x90, 0x82, 0x41, 0xff, 0x5e, 0x4e, 0xbf, 0x0f, 0xab, 0xbf, 0x42, 0x2c, 0xd4, 0x35, 0x41, 0x14, 0xe8, 0x3f, 0xc0, 0x0a, 0xd7, 0x12, 0x43, 0x5d, 0x6d, 0xb3, 0x40, 0x75, 0x02, 0xa6, 0xbf, 0x5f, 0x5a, 0x12, 0x43, 0x76, 0x4f, 0x34, 0x41, 0xff, 0x5b, 0xe9, 0x3e, 0x63, 0x90, 0x10, 0x43, +0x7e, 0xfb, 0x85, 0x41, 0x86, 0xe1, 0x09, 0x40, 0x56, 0x8e, 0x0d, 0x43, 0xc4, 0xa0, 0xad, 0x41, 0x3b, 0x19, 0x6e, 0x40, 0x52, 0x78, 0x09, 0x43, 0x48, 0x3f, 0xcf, 0x41, 0xba, 0x83, 0xa2, 0x40, 0x3c, 0x7f, 0x04, 0x43, 0x9b, 0x44, 0xe9, 0x41, 0x00, 0x52, 0xc5, 0x40, 0xee, 0xbc, 0xfd, 0x42, 0x94, 0x76, 0xfa, 0x41, 0x61, 0xe0, 0xdd, 0x40, 0x2e, 0xb2, 0xf1, 0x42, 0xa2, 0x05, 0x01, 0x42, 0x09, 0xf9, 0xea, 0x40, 0x9e, 0x6f, 0xe5, 0x42, 0x3f, 0xa4, 0xff, 0x41, 0x77, 0x10, 0xec, 0x40, +0x2c, 0x87, 0xd9, 0x42, 0x0d, 0x60, 0xf3, 0x41, 0x78, 0xd1, 0xe0, 0x40, 0x86, 0xab, 0xce, 0x42, 0xd9, 0xbd, 0xdc, 0x41, 0x47, 0x1b, 0xc5, 0x40, 0x13, 0xa1, 0xc5, 0x42, 0xa4, 0x5f, 0xb7, 0x41, 0x61, 0x89, 0x95, 0x40, 0xd3, 0xbc, 0xbd, 0x42, 0xdf, 0x3e, 0x87, 0x41, 0xe0, 0x45, 0x2f, 0x40, 0xd5, 0x27, 0xb9, 0x42, 0x9a, 0x99, 0x2f, 0x41, 0x03, 0x04, 0xc3, 0x3e, 0xfc, 0xc9, 0x16, 0x43, 0x14, 0xe8, 0x90, 0x40, 0xfc, 0x52, 0x13, 0x40, 0x30, 0x3d, 0x16, 0x43, 0x04, 0xc5, 0x2e, 0x41, +0x65, 0xfc, 0x88, 0x40, 0x52, 0x38, 0x14, 0x43, 0x51, 0xda, 0x88, 0x41, 0x29, 0x57, 0xc6, 0x40, 0x34, 0xd3, 0x10, 0x43, 0x08, 0x9b, 0xb5, 0x41, 0xf3, 0xe0, 0xfe, 0x40, 0x88, 0x36, 0x0c, 0x43, 0x21, 0x8e, 0xdb, 0x41, 0xc0, 0xf8, 0x17, 0x41, 0x9a, 0x99, 0x06, 0x43, 0xee, 0xeb, 0xf8, 0x41, 0xf9, 0xa0, 0x2b, 0x41, 0xfa, 0x3e, 0x00, 0x43, 0xe8, 0x2a, 0x06, 0x42, 0xd6, 0x78, 0x39, 0x41, 0x66, 0xe6, 0xf2, 0x42, 0xaa, 0x71, 0x0a, 0x42, 0x0d, 0xe0, 0x40, 0x41, 0xe0, 0x0f, 0xe5, 0x42, +0xbb, 0x16, 0x09, 0x42, 0xbf, 0x7d, 0x41, 0x41, 0xb8, 0x9e, 0xd7, 0x42, 0xb3, 0x2a, 0x02, 0x42, 0x27, 0x31, 0x3b, 0x41, 0x8a, 0x41, 0xcb, 0x42, 0xf6, 0x97, 0xeb, 0x41, 0x06, 0xf0, 0x2b, 0x41, 0xa3, 0xf2, 0xc0, 0x42, 0x13, 0x61, 0xc1, 0x41, 0xbe, 0xd9, 0x86, 0x40, 0x15, 0x4e, 0x1a, 0x43, 0x0c, 0xe5, 0x54, 0x40, 0xee, 0x77, 0xca, 0x40, 0x33, 0xb3, 0x19, 0x43, 0x33, 0xc4, 0x25, 0x41, 0x3b, 0x0d, 0x08, 0x41, 0x23, 0x7b, 0x17, 0x43, 0x3f, 0x46, 0x89, 0x41, 0x11, 0xc7, 0x29, 0x41, +0xbf, 0xbf, 0x13, 0x43, 0x4a, 0x7b, 0xba, 0x41, 0xf4, 0xdb, 0x48, 0x41, 0x50, 0xad, 0x0e, 0x43, 0x05, 0x34, 0xe4, 0x41, 0xcf, 0xd5, 0x63, 0x41, 0x48, 0x81, 0x08, 0x43, 0x2e, 0x3f, 0x02, 0x42, 0xb0, 0x72, 0x79, 0x41, 0xde, 0x84, 0x01, 0x43, 0x9f, 0xeb, 0x0c, 0x42, 0x9b, 0x55, 0x84, 0x41, 0x94, 0x18, 0xf4, 0x42, 0x07, 0x9f, 0x11, 0x42, 0x38, 0x67, 0x88, 0x41, 0xc5, 0xe0, 0xe4, 0x42, 0xe5, 0x21, 0x10, 0x42, 0x36, 0xbc, 0x88, 0x41, 0x99, 0x19, 0xd6, 0x42, 0xbc, 0x85, 0x08, 0x42, +0x6d, 0x45, 0x85, 0x41, 0x19, 0x84, 0xc8, 0x42, 0x85, 0xeb, 0xf5, 0x41, 0xa3, 0x92, 0x7b, 0x41, 0xaf, 0x74, 0xbd, 0x42, 0xf8, 0x53, 0xce, 0x41, 0x5c, 0x20, 0x07, 0x41, 0x88, 0x56, 0x1d, 0x43, 0x1d, 0x55, 0x01, 0x40, 0x87, 0x85, 0x2b, 0x41, 0xe0, 0xaf, 0x1c, 0x43, 0xe0, 0x73, 0x19, 0x41, 0x09, 0xf9, 0x50, 0x41, 0x8c, 0x4c, 0x1a, 0x43, 0xdf, 0x3e, 0x87, 0x41, 0xc3, 0x42, 0x75, 0x41, 0x73, 0x48, 0x16, 0x43, 0xe6, 0x2e, 0xbc, 0x41, 0xe8, 0x59, 0x8b, 0x41, 0xb7, 0xd3, 0x10, 0x43, +0x12, 0x14, 0xe9, 0x41, 0x98, 0xdd, 0x99, 0x41, 0x9e, 0x2f, 0x0a, 0x43, 0xdb, 0xe8, 0x05, 0x42, 0x1c, 0x7c, 0xa5, 0x41, 0x85, 0xab, 0x02, 0x43, 0x74, 0x64, 0x11, 0x42, 0xb1, 0xae, 0xad, 0x41, 0x13, 0x43, 0xf5, 0x42, 0xff, 0x72, 0x16, 0x42, 0x5c, 0x0f, 0xb2, 0x41, 0xd8, 0xe3, 0xe4, 0x42, 0xfc, 0xd8, 0x14, 0x42, 0x4a, 0x6a, 0xb2, 0x41, 0x71, 0xfd, 0xd4, 0x42, 0xc1, 0xa8, 0x0c, 0x42, 0x71, 0x9b, 0xae, 0x41, 0x19, 0x71, 0xc6, 0x42, 0x10, 0xe9, 0xfb, 0x41, 0x9a, 0x99, 0xa6, 0x41, +0x08, 0xcc, 0xba, 0x42, 0x04, 0xc5, 0xd4, 0x41, 0x7a, 0x36, 0x50, 0x41, 0x8e, 0xd7, 0x1f, 0x43, 0x00, 0xe0, 0x20, 0x3f, 0x2a, 0xa9, 0x76, 0x41, 0x6d, 0x27, 0x1f, 0x43, 0xd0, 0xfe, 0x09, 0x41, 0x99, 0x19, 0x8f, 0x41, 0x0d, 0xa2, 0x1c, 0x43, 0x8c, 0xca, 0x82, 0x41, 0x96, 0x43, 0xa2, 0x41, 0x5b, 0x64, 0x18, 0x43, 0xf8, 0xb1, 0xba, 0x41, 0x22, 0xec, 0xb3, 0x41, 0x8a, 0xa1, 0x12, 0x43, 0x30, 0x19, 0xea, 0x41, 0x42, 0x3e, 0xc3, 0x41, 0x36, 0x9e, 0x0b, 0x43, 0x74, 0x64, 0x07, 0x42, +0xe4, 0x83, 0xcf, 0x41, 0x98, 0xae, 0x03, 0x43, 0x19, 0x84, 0x13, 0x42, 0x36, 0x2b, 0xd8, 0x41, 0xd2, 0x62, 0xf6, 0x42, 0x43, 0xdc, 0x18, 0x42, 0x23, 0xca, 0xdc, 0x41, 0x17, 0x19, 0xe5, 0x42, 0xb3, 0x2a, 0x17, 0x42, 0x36, 0x2b, 0xdd, 0x41, 0x57, 0x4e, 0xd4, 0x42, 0xd0, 0x84, 0x0e, 0x42, 0xb1, 0x3f, 0xd9, 0x41, 0x24, 0xd7, 0xc4, 0x42, 0x88, 0x74, 0xfe, 0x41, 0xec, 0x9e, 0xd1, 0x41, 0xac, 0xab, 0xb8, 0x42, 0xf4, 0x5b, 0xd6, 0x41, 0x42, 0xcf, 0x8e, 0x41, 0xf0, 0xc7, 0x21, 0x43, +0x06, 0x48, 0x54, 0xbf, 0x3f, 0xc6, 0xa2, 0x41, 0x27, 0x11, 0x21, 0x43, 0x36, 0x37, 0xef, 0x40, 0x0d, 0x4f, 0xb7, 0x41, 0xf2, 0x72, 0x1e, 0x43, 0xb7, 0xf3, 0x77, 0x41, 0x74, 0x35, 0xcb, 0x41, 0x86, 0x0b, 0x1a, 0x43, 0xf6, 0x06, 0xb6, 0x41, 0x0f, 0x8b, 0xdd, 0x41, 0x21, 0x10, 0x14, 0x43, 0xf2, 0x41, 0xe7, 0x41, 0x81, 0x73, 0xed, 0x41, 0xae, 0xc7, 0x0c, 0x43, 0xa5, 0xac, 0x06, 0x42, 0x95, 0x32, 0xfa, 0x41, 0xfc, 0x89, 0x04, 0x43, 0x67, 0x44, 0x13, 0x42, 0xbb, 0x96, 0x01, 0x42, +0xb1, 0x72, 0xf7, 0x42, 0x13, 0xd0, 0x18, 0x42, 0xb5, 0x26, 0x04, 0x42, 0xc9, 0x76, 0xe5, 0x42, 0x43, 0x1c, 0x17, 0x42, 0xbf, 0x8e, 0x04, 0x42, 0x0d, 0x02, 0xd4, 0x42, 0x53, 0x34, 0x0e, 0x42, 0x5f, 0x58, 0x02, 0x42, 0x55, 0xf0, 0xc3, 0x42, 0x36, 0xbc, 0xfc, 0x41, 0x53, 0xb8, 0xff, 0x41, 0x55, 0xbf, 0xb6, 0x42, 0xd5, 0xd6, 0xd1, 0x41, 0x8f, 0xc2, 0xcb, 0x41, 0x77, 0x7e, 0x23, 0x43, 0x8f, 0xfc, 0x45, 0xc0, 0xec, 0x40, 0xe0, 0x41, 0xd1, 0xc2, 0x22, 0x43, 0x02, 0xd4, 0xad, 0x40, +0x54, 0x52, 0xf5, 0x41, 0xf2, 0x12, 0x20, 0x43, 0x6b, 0x9a, 0x5a, 0x41, 0x3c, 0xdf, 0x04, 0x42, 0x57, 0x8e, 0x1b, 0x43, 0x76, 0xe0, 0xa8, 0x41, 0x79, 0x47, 0x0e, 0x42, 0x7f, 0x6a, 0x15, 0x43, 0x88, 0x63, 0xdb, 0x41, 0x90, 0x71, 0x16, 0x42, 0x69, 0xf1, 0x0d, 0x43, 0xbf, 0x3d, 0x01, 0x42, 0xb3, 0xfb, 0x1c, 0x42, 0xac, 0x7c, 0x05, 0x43, 0xc7, 0x29, 0x0e, 0x42, 0xf8, 0x82, 0x21, 0x42, 0x47, 0xe1, 0xf8, 0x42, 0x89, 0x92, 0x13, 0x42, 0xab, 0x4f, 0x24, 0x42, 0x30, 0x5d, 0xe6, 0x42, +0x3f, 0x75, 0x11, 0x42, 0x58, 0x79, 0x25, 0x42, 0x84, 0x80, 0xd4, 0x42, 0x5c, 0x60, 0x09, 0x42, 0x1d, 0x49, 0x22, 0x42, 0x59, 0x06, 0xc4, 0x42, 0x6d, 0xc5, 0xf0, 0x41, 0x98, 0xee, 0x1d, 0x42, 0x83, 0xaf, 0xb5, 0x42, 0xf8, 0xb1, 0xc4, 0x41, 0x0d, 0x0f, 0x05, 0x42, 0x52, 0xf8, 0x23, 0x43, 0xdc, 0x29, 0xac, 0xc0, 0xbc, 0x45, 0x0f, 0x42, 0xb3, 0x3d, 0x23, 0x43, 0x31, 0x77, 0x47, 0x40, 0x9c, 0xc4, 0x19, 0x42, 0x63, 0x90, 0x20, 0x43, 0xe3, 0x14, 0x35, 0x41, 0xd8, 0xf0, 0x23, 0x42, +0xe0, 0x0f, 0x1c, 0x43, 0x61, 0xe5, 0x95, 0x41, 0xf3, 0x3d, 0x36, 0x42, 0xfc, 0x29, 0x16, 0x43, 0x30, 0x3b, 0xc1, 0x41, 0xa1, 0xd6, 0x3b, 0x42, 0x13, 0x83, 0x0f, 0x43, 0x1a, 0x40, 0xe4, 0x41, 0xa7, 0x17, 0x43, 0x42, 0x9c, 0x24, 0x08, 0x43, 0x07, 0xdf, 0xf7, 0x41, 0x5b, 0x82, 0x40, 0x42, 0x59, 0x39, 0xfa, 0x42, 0xe0, 0xad, 0x08, 0x42, 0x1b, 0x1e, 0x46, 0x42, 0xf9, 0x93, 0xe8, 0x42, 0xd3, 0xfc, 0x08, 0x42, 0xee, 0xab, 0x47, 0x42, 0xdc, 0x39, 0xd6, 0x42, 0x3a, 0xb4, 0x01, 0x42, +0xd8, 0xc1, 0x42, 0x42, 0x25, 0xa4, 0xc5, 0x42, 0x6b, 0x9a, 0xde, 0x41, 0xaf, 0xe5, 0x3c, 0x42, 0x8a, 0x41, 0xb7, 0x42, 0x8c, 0x6c, 0xb1, 0x41, 0x13, 0xd0, 0x19, 0x42, 0x7b, 0x74, 0x23, 0x43, 0x4f, 0x3b, 0xdc, 0xc0, 0x1b, 0xcd, 0x23, 0x42, 0xf4, 0xbd, 0x22, 0x43, 0xb7, 0xee, 0xb6, 0x3f, 0x82, 0x11, 0x2e, 0x42, 0x7d, 0x1f, 0x20, 0x43, 0xdd, 0x35, 0x17, 0x41, 0xd2, 0x2f, 0x3f, 0x42, 0x4a, 0x2c, 0x1b, 0x43, 0xf3, 0x1f, 0x8b, 0x41, 0xe4, 0xc3, 0x54, 0x42, 0x5b, 0x64, 0x01, 0x43, +0x1a, 0xaf, 0xf3, 0x41, 0x0a, 0xc6, 0x65, 0x42, 0xbf, 0x5f, 0xf0, 0x42, 0xf2, 0xd2, 0xf2, 0x41, 0xa1, 0x05, 0x67, 0x42, 0x13, 0xc3, 0xd9, 0x42, 0xa9, 0x93, 0xe9, 0x41, 0x07, 0x01, 0x62, 0x42, 0xb1, 0xb2, 0xc8, 0x42, 0xec, 0x1e, 0xc7, 0x41, 0x2c, 0xc3, 0x59, 0x42, 0xba, 0xfa, 0xba, 0x42, 0x40, 0x35, 0x95, 0x41, 0x10, 0x29, 0x2e, 0x42, 0x6f, 0x52, 0x22, 0x43, 0x40, 0x76, 0x05, 0xc1, 0xfc, 0xc7, 0x37, 0x42, 0xd1, 0xa2, 0x21, 0x43, 0x01, 0xbe, 0xab, 0xbe, 0x5e, 0xa9, 0x49, 0x42, +0xbf, 0x1f, 0x1e, 0x43, 0xd1, 0x3a, 0x1f, 0x41, 0xf3, 0xce, 0x41, 0x42, 0xc9, 0x96, 0x20, 0x43, 0x8d, 0xc0, 0x1b, 0xc1, 0x08, 0xec, 0x4a, 0x42, 0x63, 0xf0, 0x1f, 0x43, 0x19, 0xad, 0x09, 0xc0, 0xd6, 0x45, 0x59, 0x42, 0x30, 0x9d, 0x1d, 0x43, 0x77, 0x67, 0xc7, 0x40, 0xf1, 0xa3, 0x7f, 0x42, 0xb8, 0x1e, 0xdc, 0x42, 0xe2, 0xc7, 0xc5, 0x41, 0x94, 0x36, 0x7f, 0x42, 0x48, 0x21, 0xef, 0x42, 0xbb, 0x16, 0xcb, 0x41, 0xa1, 0x9a, 0x7b, 0x42, 0x21, 0x70, 0xcc, 0x42, 0xbb, 0x38, 0xa7, 0x41, +0x54, 0x12, 0x73, 0x42, 0xda, 0x2c, 0xc0, 0x42, 0x5d, 0x4b, 0x6b, 0x41, 0xe9, 0x77, 0x54, 0x42, 0xae, 0x47, 0x1e, 0x43, 0x64, 0xaa, 0x30, 0xc1, 0x55, 0xf0, 0x5c, 0x42, 0xcd, 0xac, 0x1d, 0x43, 0x62, 0x7f, 0x7f, 0xc0, 0x8f, 0xc2, 0x68, 0x42, 0x3c, 0xdf, 0x1b, 0x43, 0xc0, 0xad, 0x33, 0x40, 0x03, 0x98, 0x86, 0x42, 0x61, 0x25, 0xef, 0x42, 0xb4, 0x48, 0xa8, 0x41, 0xe5, 0x81, 0x87, 0x42, 0x00, 0x80, 0xde, 0x42, 0x09, 0x0a, 0xa0, 0x41, 0x21, 0xbf, 0x86, 0x42, 0x0a, 0xd7, 0xcf, 0x42, +0xcd, 0x2a, 0x89, 0x41, 0x05, 0x16, 0x82, 0x42, 0x0a, 0x48, 0xc4, 0x42, 0xee, 0x5a, 0x38, 0x41, 0x4f, 0xde, 0x65, 0x42, 0xd3, 0x6d, 0x1b, 0x43, 0x86, 0xeb, 0x43, 0xc1, 0x75, 0x93, 0x6d, 0x42, 0x07, 0xe1, 0x1a, 0x43, 0xb6, 0x9c, 0xba, 0xc0, 0x18, 0xc4, 0x78, 0x42, 0x65, 0xfb, 0x18, 0x43, 0x23, 0xf4, 0xd3, 0x3d, 0x7e, 0x9d, 0x8d, 0x42, 0xbb, 0x89, 0xe0, 0x42, 0x4f, 0x62, 0x7a, 0x41, 0x39, 0x65, 0x8b, 0x42, 0x2e, 0xb2, 0xef, 0x42, 0x45, 0xc7, 0x84, 0x41, 0xf2, 0xe1, 0x8c, 0x42, +0xf8, 0x13, 0xd4, 0x42, 0x4b, 0x59, 0x4e, 0x41, 0xe3, 0x16, 0x89, 0x42, 0x34, 0x73, 0xc9, 0x42, 0xa3, 0x2f, 0x03, 0x41, 0xb7, 0xc0, 0x75, 0x42, 0xb7, 0x13, 0x18, 0x43, 0x4c, 0x37, 0x55, 0xc1, 0x32, 0x95, 0x7c, 0x42, 0x0a, 0x97, 0x17, 0x43, 0xe7, 0x8c, 0xf4, 0xc0, 0x5c, 0x8f, 0x83, 0x42, 0x50, 0x6d, 0x15, 0x43, 0xa7, 0xcb, 0x02, 0xc0, 0x81, 0xa4, 0x91, 0x42, 0xcb, 0xe1, 0xef, 0x42, 0xb5, 0xa6, 0x2e, 0x41, 0x92, 0xfc, 0x91, 0x42, 0xb8, 0x1e, 0xe3, 0x42, 0xd4, 0x09, 0x23, 0x41, +0xf6, 0x37, 0x91, 0x42, 0xfb, 0x3e, 0xda, 0x42, 0xe5, 0x5c, 0xe7, 0x40, 0x1b, 0x4d, 0x8f, 0x42, 0xd6, 0xf8, 0xd1, 0x42, 0x86, 0x1c, 0x2f, 0x3f, 0x15, 0xac, 0x84, 0x42, 0xba, 0x78, 0xbe, 0x42, 0x12, 0xd8, 0x1c, 0x3e, 0x73, 0xd7, 0x8e, 0x42, 0x4e, 0x62, 0xcd, 0x42, 0x3f, 0xfb, 0xbd, 0xc0, 0x95, 0xb4, 0x80, 0x42, 0xcd, 0x9b, 0xbd, 0x42, 0x4c, 0x15, 0x48, 0xc1, 0xc9, 0x25, 0x70, 0x42, 0x7d, 0xce, 0xb6, 0x42, 0x82, 0x51, 0x31, 0xc1, 0x09, 0x39, 0x79, 0x42, 0xbf, 0x2c, 0xb9, 0x42, +0x6b, 0x9a, 0x3b, 0x40, 0x4a, 0x3b, 0x84, 0x42, 0x63, 0x50, 0x12, 0x43, 0x61, 0xe5, 0x68, 0xc1, 0xde, 0x42, 0x87, 0x42, 0xf0, 0xa7, 0x11, 0x43, 0xb7, 0xfa, 0x0d, 0xc1, 0xbf, 0xdf, 0x89, 0x42, 0x19, 0xa4, 0x10, 0x43, 0x4d, 0x67, 0x97, 0xc0, 0x90, 0xef, 0x87, 0x42, 0x63, 0x30, 0x0f, 0x43, 0x9e, 0x5e, 0x70, 0xc1, 0x9e, 0xaf, 0x8b, 0x42, 0x05, 0xd6, 0x0d, 0x43, 0x58, 0xee, 0x14, 0xc1, 0x8b, 0xfb, 0x8b, 0x42, 0x44, 0x2b, 0x0c, 0x43, 0x96, 0xb2, 0x78, 0xc1, 0x84, 0xc0, 0x8f, 0x42, +0xbf, 0xbf, 0x0a, 0x43, 0x65, 0x0d, 0x1b, 0xc1, 0xaf, 0x03, 0x36, 0xc1, 0x9c, 0x44, 0xeb, 0x42, 0x6d, 0x73, 0x0c, 0x41, 0x5a, 0x13, 0x77, 0x42, 0xee, 0xbc, 0x0a, 0x43, 0x15, 0x9d, 0x87, 0x41, 0x35, 0xcd, 0x7d, 0x42, 0xe8, 0x1b, 0x0c, 0x43, 0xfb, 0xcb, 0x74, 0x41, 0x13, 0x10, 0x73, 0x42, 0xec, 0x71, 0x0c, 0x43, 0x82, 0x51, 0x85, 0x41, 0x1c, 0x6b, 0x79, 0x42, 0x6f, 0x72, 0x0d, 0x43, 0x3a, 0x01, 0x73, 0x41, 0x81, 0x73, 0x6e, 0x42, 0x00, 0xc0, 0x0b, 0x43, 0xe3, 0xb6, 0x8c, 0x41, +0x1a, 0x40, 0x72, 0x42, 0x75, 0x93, 0x09, 0x43, 0xc8, 0x07, 0x90, 0x41, 0x0f, 0x7a, 0x70, 0x42, 0xe6, 0x10, 0x0e, 0x43, 0xba, 0xb8, 0x7f, 0x41, 0x4d, 0xb7, 0x6c, 0x42, 0xa4, 0xd0, 0x0d, 0x43, 0xe8, 0x59, 0x84, 0x41, 0xd4, 0xc9, 0x75, 0x42, 0x46, 0x96, 0x0e, 0x43, 0xd8, 0xa3, 0x6e, 0x41, 0x94, 0x36, 0x80, 0x42, 0xb8, 0x9e, 0x07, 0x43, 0x5d, 0x5c, 0x83, 0x41, 0x8a, 0x2e, 0x83, 0x42, 0xf4, 0x3d, 0x09, 0x43, 0x54, 0xc1, 0x6f, 0x41, 0x67, 0xc4, 0x7b, 0x42, 0x9a, 0x19, 0x09, 0x43, +0x8b, 0xfd, 0x86, 0x41, 0x12, 0x23, 0x81, 0x42, 0x09, 0xac, 0x0a, 0x43, 0x9a, 0x77, 0x73, 0x41, 0xb3, 0xfb, 0x76, 0x42, 0x40, 0x95, 0x07, 0x43, 0x3a, 0x92, 0x8e, 0x41, 0x03, 0x27, 0x7c, 0x42, 0xe8, 0xfb, 0x05, 0x43, 0x5e, 0x29, 0x89, 0x41, 0x5b, 0xe4, 0x83, 0x42, 0xd7, 0x63, 0x05, 0x43, 0x21, 0x8e, 0x6b, 0x41, 0x4b, 0x99, 0x85, 0x42, 0x90, 0xa2, 0x06, 0x43, 0xf3, 0x1f, 0x62, 0x41, 0x3d, 0x3b, 0x82, 0x42, 0x6b, 0x5c, 0x06, 0x43, 0x2b, 0x65, 0x7a, 0x41, 0x5b, 0xb1, 0x84, 0x42, +0x6b, 0xdc, 0x07, 0x43, 0xe7, 0x8c, 0x69, 0x41, 0x3c, 0xac, 0x80, 0x42, 0xb3, 0xdd, 0x04, 0x43, 0x00, 0x00, 0x81, 0x41, 0xbb, 0xd8, 0x82, 0x42, 0xd5, 0x18, 0x04, 0x43, 0xac, 0x8b, 0x6e, 0x41, 0x1e, 0xc7, 0x86, 0x42, 0xa8, 0xa6, 0x05, 0x43, 0x77, 0x2d, 0x53, 0x41, 0xfd, 0xe5, 0x85, 0x42, 0xc9, 0xb6, 0x05, 0x43, 0x05, 0x12, 0x5d, 0x41, 0xa2, 0x94, 0x86, 0x42, 0x63, 0xf0, 0x04, 0x43, 0xe8, 0xd9, 0x4d, 0x41, 0x74, 0x35, 0x85, 0x42, 0xfe, 0xd4, 0x04, 0x43, 0x8b, 0xdb, 0x5c, 0x41, +0x22, 0xbd, 0x84, 0x42, 0x7f, 0xca, 0x03, 0x43, 0xe2, 0xc7, 0x5a, 0x41, 0x49, 0x6e, 0x86, 0x42, 0xde, 0x04, 0x04, 0x43, 0xf3, 0x1f, 0x47, 0x41, 0x70, 0xee, 0x87, 0x42, 0xde, 0xe4, 0x04, 0x43, 0xe1, 0x0b, 0x35, 0x41, 0xbb, 0x07, 0x89, 0x42, 0x56, 0x4e, 0x06, 0x43, 0x61, 0x32, 0x25, 0x41, 0x9d, 0xd1, 0x87, 0x42, 0x5f, 0xba, 0x05, 0x43, 0x5d, 0xdc, 0x40, 0x41, 0x00, 0x8f, 0x88, 0x42, 0x4e, 0x02, 0x07, 0x43, 0x91, 0xed, 0x37, 0x41, 0xd6, 0x94, 0x87, 0x42, 0x73, 0x48, 0x06, 0x43, +0xd2, 0xde, 0x4b, 0x41, 0x65, 0x7b, 0x87, 0x42, 0x32, 0x48, 0x07, 0x43, 0xf1, 0xf4, 0x4d, 0x41, 0x53, 0xc5, 0x85, 0x42, 0xe0, 0x2f, 0x0a, 0x43, 0x12, 0x83, 0x4f, 0x41, 0x7e, 0xfb, 0x86, 0x42, 0x4a, 0xac, 0x08, 0x43, 0xaa, 0xcf, 0x4e, 0x41, 0xcf, 0x86, 0x87, 0x42, 0xe2, 0x5a, 0x0a, 0x43, 0xef, 0xc9, 0x2c, 0x41, 0xf4, 0x7d, 0x88, 0x42, 0x3c, 0x9f, 0x08, 0x43, 0x77, 0x2d, 0x31, 0x41, 0xfc, 0x58, 0x89, 0x42, 0x11, 0x18, 0x08, 0x43, 0x10, 0x3b, 0x18, 0x41, 0x8f, 0x93, 0x88, 0x42, +0x1b, 0x0f, 0x0a, 0x43, 0xc1, 0x73, 0x0f, 0x41, 0x05, 0xa3, 0x81, 0x42, 0x42, 0x20, 0x0d, 0x43, 0x2e, 0x6e, 0x52, 0x41, 0x3a, 0xe3, 0x83, 0x42, 0x69, 0xb1, 0x0b, 0x43, 0x21, 0x8e, 0x50, 0x41, 0xab, 0x4d, 0x83, 0x42, 0x5d, 0xaf, 0x0d, 0x43, 0xb5, 0xa6, 0x2e, 0x41, 0x84, 0xbe, 0x85, 0x42, 0xf8, 0x13, 0x0c, 0x43, 0x9b, 0xc4, 0x2b, 0x41, 0x16, 0xb9, 0x86, 0x42, 0xfc, 0x09, 0x0c, 0x43, 0xbf, 0x8e, 0x0c, 0x41, 0xae, 0x07, 0x84, 0x42, 0x5b, 0xe4, 0x0d, 0x43, 0x7e, 0xfb, 0x10, 0x41, +0x73, 0x17, 0x7a, 0x42, 0xcf, 0x57, 0x0f, 0x43, 0xc5, 0xfe, 0x53, 0x41, 0xb7, 0x6f, 0x7e, 0x42, 0x71, 0x5d, 0x0e, 0x43, 0x20, 0xb0, 0x53, 0x41, 0xab, 0x71, 0x7b, 0x42, 0x8e, 0xf7, 0x0f, 0x43, 0xb1, 0xbf, 0x3b, 0x41, 0xc3, 0x84, 0x80, 0x42, 0xd7, 0x03, 0x0f, 0x43, 0xe3, 0x36, 0x34, 0x41, 0xbb, 0xd6, 0x80, 0x42, 0xbf, 0x5f, 0x0f, 0x43, 0x22, 0x26, 0x1b, 0x41, 0xe5, 0x21, 0x7b, 0x42, 0xee, 0x5c, 0x10, 0x43, 0xc5, 0x8f, 0x29, 0x41, 0x04, 0x45, 0x74, 0x42, 0x2e, 0xf2, 0x0f, 0x43, +0x1e, 0xa7, 0x5d, 0x41, 0x39, 0x23, 0x77, 0x42, 0x48, 0x01, 0x10, 0x43, 0x4e, 0x40, 0x52, 0x41, 0x2d, 0x72, 0x72, 0x42, 0x6f, 0x32, 0x10, 0x43, 0x47, 0xe1, 0x59, 0x41, 0x64, 0x7b, 0x76, 0x42, 0xa8, 0x66, 0x10, 0x43, 0x5f, 0x07, 0x47, 0x41, 0x86, 0x49, 0x75, 0x42, 0xa2, 0xc5, 0x10, 0x43, 0x5d, 0x4b, 0x3c, 0x41, 0x3b, 0x70, 0x70, 0x42, 0xc9, 0x76, 0x10, 0x43, 0x53, 0x74, 0x55, 0x41, 0xf7, 0x24, 0x70, 0x42, 0x52, 0x58, 0x0f, 0x43, 0x0f, 0x0b, 0x6f, 0x41, 0x11, 0x36, 0x73, 0x42, +0x4c, 0x57, 0x0f, 0x43, 0x75, 0x02, 0x6b, 0x41, 0xc3, 0x53, 0x6d, 0x42, 0xfe, 0x74, 0x0f, 0x43, 0xc3, 0x42, 0x71, 0x41, 0x82, 0xd1, 0x6f, 0x42, 0x3a, 0x94, 0x09, 0x43, 0x4f, 0x9e, 0xa9, 0x41, 0xda, 0x1b, 0x76, 0x42, 0xf0, 0x87, 0x06, 0x43, 0xa5, 0x3d, 0xa5, 0x41, 0x08, 0xdb, 0x71, 0x42, 0xc9, 0x76, 0x09, 0x43, 0x05, 0x56, 0xa0, 0x41, 0x54, 0x81, 0x77, 0x42, 0xbd, 0xd4, 0x06, 0x43, 0xa2, 0xb4, 0x9c, 0x41, 0xa1, 0x56, 0x7e, 0x42, 0xf2, 0x72, 0x05, 0x43, 0x08, 0x3d, 0x8e, 0x41, +0xe6, 0xdd, 0x78, 0x42, 0x47, 0x21, 0x07, 0x43, 0xfc, 0x29, 0x94, 0x41, 0x20, 0xf0, 0x7d, 0x42, 0x65, 0xdb, 0x04, 0x43, 0xa2, 0x23, 0x96, 0x41, 0x33, 0x62, 0x72, 0x42, 0xa0, 0xba, 0x14, 0x43, 0x3a, 0x01, 0x69, 0x41, 0x53, 0x05, 0x6e, 0x42, 0xbd, 0x54, 0x13, 0x43, 0x7b, 0x83, 0x8a, 0x41, 0xd9, 0xfd, 0x72, 0x42, 0xae, 0x07, 0x13, 0x43, 0x2f, 0xdd, 0x61, 0x41, 0x27, 0x0f, 0x6f, 0x42, 0xc1, 0xca, 0x11, 0x43, 0x12, 0x14, 0x84, 0x41, 0x9a, 0x66, 0x6e, 0x42, 0x9c, 0x64, 0x0e, 0x43, +0x18, 0x26, 0x8b, 0x41, 0x10, 0x18, 0x70, 0x42, 0xc5, 0x40, 0x10, 0x43, 0x2f, 0x4c, 0x7b, 0x41, 0xbc, 0xc5, 0x6c, 0x42, 0xc3, 0x95, 0x0f, 0x43, 0x6f, 0x81, 0x93, 0x41, 0xf7, 0x24, 0x6b, 0x42, 0xea, 0xc6, 0x10, 0x43, 0x69, 0xde, 0x9b, 0x41, 0xc9, 0x54, 0x6b, 0x42, 0x3a, 0x34, 0x0d, 0x43, 0xde, 0x71, 0xa6, 0x41, 0xe5, 0xa1, 0x6d, 0x42, 0xe6, 0x90, 0x0c, 0x43, 0x64, 0x4c, 0x9d, 0x41, 0xa8, 0xe4, 0x73, 0x42, 0x99, 0x59, 0x09, 0x43, 0x27, 0x0f, 0x97, 0x41, 0x1a, 0xef, 0x6f, 0x42, +0x50, 0xed, 0x0b, 0x43, 0xea, 0x26, 0x94, 0x41, 0x63, 0xbd, 0x82, 0x42, 0xbd, 0xb4, 0x02, 0x43, 0xda, 0x0a, 0x95, 0x41, 0xa2, 0x54, 0x82, 0x42, 0xc5, 0x80, 0x03, 0x43, 0x9d, 0x91, 0x8d, 0x41, 0x25, 0x75, 0x7d, 0x42, 0x77, 0x3e, 0x04, 0x43, 0x6a, 0x3c, 0x9e, 0x41, 0x4c, 0x46, 0x84, 0x42, 0xe4, 0x85, 0x03, 0x43, 0xb7, 0xf3, 0x77, 0x41, 0x02, 0xda, 0x81, 0x42, 0xae, 0x47, 0x04, 0x43, 0xa1, 0x56, 0x86, 0x41, 0xe4, 0x25, 0x85, 0x42, 0x6d, 0xa7, 0x02, 0x43, 0xb9, 0x6b, 0x81, 0x41, +0x3f, 0x06, 0x86, 0x42, 0x96, 0xc3, 0x01, 0x43, 0xd4, 0x09, 0x87, 0x41, 0xe7, 0x9b, 0x88, 0x42, 0x13, 0x63, 0x01, 0x43, 0xf0, 0x16, 0x6c, 0x41, 0x36, 0x7c, 0x87, 0x42, 0x6f, 0x52, 0x02, 0x43, 0x6b, 0x2b, 0x66, 0x41, 0xee, 0x5a, 0x86, 0x42, 0x6b, 0x3c, 0x03, 0x43, 0x51, 0x49, 0x60, 0x41, 0x06, 0x32, 0x88, 0x42, 0xd5, 0x78, 0x03, 0x43, 0x7d, 0xae, 0x47, 0x41, 0xbb, 0x98, 0x89, 0x42, 0xbd, 0x94, 0x02, 0x43, 0xe8, 0x6a, 0x48, 0x41, 0x0d, 0xcf, 0x89, 0x42, 0xc3, 0x55, 0x04, 0x43, +0x82, 0xe2, 0x2f, 0x41, 0x61, 0xa5, 0x8b, 0x42, 0x6b, 0xbc, 0x03, 0x43, 0x9a, 0x08, 0x2b, 0x41, 0xaa, 0x11, 0x8b, 0x42, 0x90, 0xe2, 0x05, 0x43, 0xbf, 0x60, 0x1a, 0x41, 0xcc, 0x3d, 0x8d, 0x42, 0xd1, 0xa2, 0x05, 0x43, 0x5d, 0xf9, 0x0f, 0x41, 0xa2, 0x83, 0x8d, 0x42, 0x58, 0x19, 0x03, 0x43, 0xa3, 0x01, 0x25, 0x41, 0x82, 0x02, 0x8b, 0x42, 0x7b, 0xb4, 0x01, 0x43, 0x0e, 0x2d, 0x49, 0x41, 0xec, 0xe0, 0x8e, 0x42, 0x81, 0x15, 0x08, 0x43, 0xb9, 0x4e, 0xd5, 0x40, 0x3c, 0x4c, 0x8d, 0x42, +0xdc, 0xf9, 0x07, 0x43, 0x64, 0xaa, 0xf6, 0x40, 0x03, 0x29, 0x8f, 0x42, 0x9c, 0x64, 0x05, 0x43, 0xe5, 0x44, 0x03, 0x41, 0x09, 0x8a, 0x8b, 0x42, 0xb7, 0xf3, 0x07, 0x43, 0xef, 0x1b, 0x08, 0x41, 0xbb, 0xd8, 0x8a, 0x42, 0xe4, 0x45, 0x0a, 0x43, 0xc3, 0x5f, 0xf8, 0x40, 0xab, 0x0f, 0x8c, 0x42, 0x6d, 0x87, 0x0a, 0x43, 0xe6, 0x1d, 0xdc, 0x40, 0x1b, 0x5e, 0x8a, 0x42, 0x3a, 0xb4, 0x0d, 0x43, 0x9d, 0x29, 0xb4, 0x40, 0x4c, 0x95, 0x89, 0x42, 0xe8, 0x1b, 0x0d, 0x43, 0xd7, 0x12, 0xd4, 0x40, +0x23, 0x3b, 0x8d, 0x42, 0xe2, 0xda, 0x0a, 0x43, 0x06, 0xb6, 0xba, 0x40, 0x40, 0xc2, 0x88, 0x42, 0xb1, 0x92, 0x0c, 0x43, 0x7a, 0xdf, 0xf1, 0x40, 0xee, 0xab, 0x85, 0x42, 0x8a, 0xa1, 0x0e, 0x43, 0x01, 0xd9, 0xff, 0x40, 0x73, 0x28, 0x86, 0x42, 0x8f, 0x82, 0x0f, 0x43, 0xa9, 0x65, 0xe4, 0x40, 0x1a, 0x71, 0x82, 0x42, 0x0b, 0xb7, 0x12, 0x43, 0x7e, 0x6f, 0xf4, 0x40, 0x8e, 0x35, 0x82, 0x42, 0xc9, 0x76, 0x11, 0x43, 0xd4, 0x89, 0x04, 0x41, 0x6e, 0xa3, 0x86, 0x42, 0x1f, 0x65, 0x10, 0x43, +0xfd, 0xd9, 0xc8, 0x40, 0x8c, 0xf9, 0x81, 0x42, 0x46, 0x36, 0x10, 0x43, 0xf4, 0xdb, 0x0e, 0x41, 0x0e, 0x5c, 0x7d, 0x42, 0xb3, 0x3d, 0x11, 0x43, 0xb2, 0x0c, 0x23, 0x41, 0xe5, 0xa1, 0x7d, 0x42, 0xe0, 0xcf, 0x12, 0x43, 0x5b, 0x7c, 0x1d, 0x41, 0x90, 0xcf, 0x77, 0x42, 0x17, 0x19, 0x15, 0x43, 0x84, 0x0d, 0x3d, 0x41, 0x94, 0xe5, 0x77, 0x42, 0xa0, 0x5a, 0x13, 0x43, 0xda, 0x8a, 0x3c, 0x41, 0x03, 0xe7, 0x7d, 0x42, 0x0d, 0x62, 0x14, 0x43, 0x22, 0xec, 0x17, 0x41, 0x98, 0xfb, 0x77, 0x42, +0x6b, 0x9c, 0x11, 0x43, 0x53, 0x05, 0x3c, 0x41, 0x7f, 0x99, 0x73, 0x42, 0x7b, 0x54, 0x11, 0x43, 0xba, 0xb8, 0x5a, 0x41, 0x54, 0x63, 0x80, 0x42, 0x50, 0x0d, 0x04, 0x43, 0x00, 0xef, 0x82, 0x41, 0x04, 0xc5, 0x82, 0x42, 0xb1, 0x52, 0x03, 0x43, 0x56, 0x7d, 0x70, 0x41, 0x54, 0x63, 0x80, 0x42, 0x50, 0x0d, 0x04, 0x43, 0x00, 0xef, 0x82, 0x41, 0x2b, 0x47, 0x7b, 0x42, 0x1b, 0x2f, 0x05, 0x43, 0x46, 0xb6, 0x8b, 0x41, 0x2c, 0xd4, 0x6c, 0x42, 0x29, 0x7c, 0x0b, 0x43, 0x97, 0x7f, 0x90, 0x41, +0xe1, 0xa9, 0x70, 0x42, 0x5c, 0x0f, 0x09, 0x43, 0xf6, 0xa8, 0x93, 0x41, 0x2c, 0xd4, 0x6c, 0x42, 0x29, 0x7c, 0x0b, 0x43, 0x97, 0x7f, 0x90, 0x41, 0x72, 0x39, 0x6b, 0x42, 0x1f, 0xc5, 0x0d, 0x43, 0x48, 0xbf, 0x86, 0x41, 0x17, 0xa6, 0x75, 0x42, 0x13, 0xe3, 0x06, 0x43, 0xed, 0x8d, 0x91, 0x41, 0x2b, 0x47, 0x7b, 0x42, 0x1b, 0x2f, 0x05, 0x43, 0x46, 0xb6, 0x8b, 0x41, 0x17, 0xa6, 0x75, 0x42, 0x13, 0xe3, 0x06, 0x43, 0xed, 0x8d, 0x91, 0x41, 0xe1, 0xa9, 0x70, 0x42, 0x5c, 0x0f, 0x09, 0x43, +0xf6, 0xa8, 0x93, 0x41, 0x41, 0xd1, 0x84, 0x42, 0x09, 0x0c, 0x03, 0x43, 0xda, 0xce, 0x59, 0x41, 0xdf, 0x9e, 0x86, 0x42, 0x9e, 0x4f, 0x03, 0x43, 0x2e, 0xff, 0x42, 0x41, 0x41, 0xd1, 0x84, 0x42, 0x09, 0x0c, 0x03, 0x43, 0xda, 0xce, 0x59, 0x41, 0x04, 0xc5, 0x82, 0x42, 0xb1, 0x52, 0x03, 0x43, 0x56, 0x7d, 0x70, 0x41, 0x16, 0x2a, 0x6c, 0x42, 0x6f, 0x92, 0x0f, 0x43, 0x4f, 0xaf, 0x72, 0x41, 0x72, 0x39, 0x6b, 0x42, 0x1f, 0xc5, 0x0d, 0x43, 0x48, 0xbf, 0x86, 0x41, 0x16, 0x2a, 0x6c, 0x42, +0x6f, 0x92, 0x0f, 0x43, 0x4f, 0xaf, 0x72, 0x41, 0x4b, 0x99, 0x6f, 0x42, 0x84, 0xa0, 0x10, 0x43, 0xee, 0x5a, 0x53, 0x41, 0x95, 0x63, 0x89, 0x42, 0x6f, 0xb2, 0x05, 0x43, 0xcf, 0x14, 0x1a, 0x41, 0x09, 0x2a, 0x88, 0x42, 0x63, 0x30, 0x04, 0x43, 0x96, 0x43, 0x2d, 0x41, 0x09, 0x2a, 0x88, 0x42, 0x63, 0x30, 0x04, 0x43, 0x96, 0x43, 0x2d, 0x41, 0xdf, 0x9e, 0x86, 0x42, 0x9e, 0x4f, 0x03, 0x43, 0x2e, 0xff, 0x42, 0x41, 0x4b, 0x99, 0x6f, 0x42, 0x84, 0xa0, 0x10, 0x43, 0xee, 0x5a, 0x53, 0x41, +0x94, 0x98, 0x74, 0x42, 0x59, 0xf9, 0x10, 0x43, 0x13, 0xd0, 0x36, 0x41, 0x94, 0x98, 0x74, 0x42, 0x59, 0xf9, 0x10, 0x43, 0x13, 0xd0, 0x36, 0x41, 0x2b, 0xb6, 0x7a, 0x42, 0xb1, 0x92, 0x10, 0x43, 0xe3, 0x36, 0x20, 0x41, 0x55, 0x30, 0x89, 0x42, 0x73, 0xc8, 0x09, 0x43, 0xa2, 0x23, 0xfe, 0x40, 0xdb, 0xe8, 0x89, 0x42, 0xbf, 0x9f, 0x07, 0x43, 0x63, 0xdd, 0x09, 0x41, 0xdb, 0xe8, 0x89, 0x42, 0xbf, 0x9f, 0x07, 0x43, 0x63, 0xdd, 0x09, 0x41, 0x95, 0x63, 0x89, 0x42, 0x6f, 0xb2, 0x05, 0x43, +0xcf, 0x14, 0x1a, 0x41, 0x2b, 0xb6, 0x7a, 0x42, 0xb1, 0x92, 0x10, 0x43, 0xe3, 0x36, 0x20, 0x41, 0x94, 0xc7, 0x80, 0x42, 0xb5, 0x88, 0x0f, 0x43, 0xc1, 0xd6, 0x0d, 0x41, 0x94, 0xc7, 0x80, 0x42, 0xb5, 0x88, 0x0f, 0x43, 0xc1, 0xd6, 0x0d, 0x41, 0x4c, 0x46, 0x84, 0x42, 0xd5, 0xf8, 0x0d, 0x43, 0x4d, 0x84, 0x00, 0x41, 0x4c, 0x46, 0x84, 0x42, 0xd5, 0xf8, 0x0d, 0x43, 0x4d, 0x84, 0x00, 0x41, 0x03, 0x29, 0x87, 0x42, 0xb1, 0xf2, 0x0b, 0x43, 0x75, 0x54, 0xf7, 0x40, 0x03, 0x29, 0x87, 0x42, +0xb1, 0xf2, 0x0b, 0x43, 0x75, 0x54, 0xf7, 0x40, 0x55, 0x30, 0x89, 0x42, 0x73, 0xc8, 0x09, 0x43, 0xa2, 0x23, 0xfe, 0x40, 0x54, 0x63, 0x80, 0x42, 0x50, 0x0d, 0x04, 0x43, 0x00, 0xef, 0x82, 0x41, 0x04, 0xc5, 0x82, 0x42, 0xb1, 0x52, 0x03, 0x43, 0x56, 0x7d, 0x70, 0x41, 0x54, 0x63, 0x80, 0x42, 0x50, 0x0d, 0x04, 0x43, 0x00, 0xef, 0x82, 0x41, 0x2b, 0x47, 0x7b, 0x42, 0x1b, 0x2f, 0x05, 0x43, 0x46, 0xb6, 0x8b, 0x41, 0x2c, 0xd4, 0x6c, 0x42, 0x29, 0x7c, 0x0b, 0x43, 0x97, 0x7f, 0x90, 0x41, +0xe1, 0xa9, 0x70, 0x42, 0x5c, 0x0f, 0x09, 0x43, 0xf6, 0xa8, 0x93, 0x41, 0x72, 0x39, 0x6b, 0x42, 0x1f, 0xc5, 0x0d, 0x43, 0x48, 0xbf, 0x86, 0x41, 0x2c, 0xd4, 0x6c, 0x42, 0x29, 0x7c, 0x0b, 0x43, 0x97, 0x7f, 0x90, 0x41, 0x2b, 0x47, 0x7b, 0x42, 0x1b, 0x2f, 0x05, 0x43, 0x46, 0xb6, 0x8b, 0x41, 0x17, 0xa6, 0x75, 0x42, 0x13, 0xe3, 0x06, 0x43, 0xed, 0x8d, 0x91, 0x41, 0xe1, 0xa9, 0x70, 0x42, 0x5c, 0x0f, 0x09, 0x43, 0xf6, 0xa8, 0x93, 0x41, 0x17, 0xa6, 0x75, 0x42, 0x13, 0xe3, 0x06, 0x43, +0xed, 0x8d, 0x91, 0x41, 0x41, 0xd1, 0x84, 0x42, 0x09, 0x0c, 0x03, 0x43, 0xda, 0xce, 0x59, 0x41, 0xdf, 0x9e, 0x86, 0x42, 0x9e, 0x4f, 0x03, 0x43, 0x2e, 0xff, 0x42, 0x41, 0x04, 0xc5, 0x82, 0x42, 0xb1, 0x52, 0x03, 0x43, 0x56, 0x7d, 0x70, 0x41, 0x41, 0xd1, 0x84, 0x42, 0x09, 0x0c, 0x03, 0x43, 0xda, 0xce, 0x59, 0x41, 0x72, 0x39, 0x6b, 0x42, 0x1f, 0xc5, 0x0d, 0x43, 0x48, 0xbf, 0x86, 0x41, 0x16, 0x2a, 0x6c, 0x42, 0x6f, 0x92, 0x0f, 0x43, 0x4f, 0xaf, 0x72, 0x41, 0x4b, 0x99, 0x6f, 0x42, +0x84, 0xa0, 0x10, 0x43, 0xee, 0x5a, 0x53, 0x41, 0x16, 0x2a, 0x6c, 0x42, 0x6f, 0x92, 0x0f, 0x43, 0x4f, 0xaf, 0x72, 0x41, 0x09, 0x2a, 0x88, 0x42, 0x63, 0x30, 0x04, 0x43, 0x96, 0x43, 0x2d, 0x41, 0x95, 0x63, 0x89, 0x42, 0x6f, 0xb2, 0x05, 0x43, 0xcf, 0x14, 0x1a, 0x41, 0xdf, 0x9e, 0x86, 0x42, 0x9e, 0x4f, 0x03, 0x43, 0x2e, 0xff, 0x42, 0x41, 0x09, 0x2a, 0x88, 0x42, 0x63, 0x30, 0x04, 0x43, 0x96, 0x43, 0x2d, 0x41, 0x4b, 0x99, 0x6f, 0x42, 0x84, 0xa0, 0x10, 0x43, 0xee, 0x5a, 0x53, 0x41, +0x94, 0x98, 0x74, 0x42, 0x59, 0xf9, 0x10, 0x43, 0x13, 0xd0, 0x36, 0x41, 0x2b, 0xb6, 0x7a, 0x42, 0xb1, 0x92, 0x10, 0x43, 0xe3, 0x36, 0x20, 0x41, 0x94, 0x98, 0x74, 0x42, 0x59, 0xf9, 0x10, 0x43, 0x13, 0xd0, 0x36, 0x41, 0xdb, 0xe8, 0x89, 0x42, 0xbf, 0x9f, 0x07, 0x43, 0x63, 0xdd, 0x09, 0x41, 0x55, 0x30, 0x89, 0x42, 0x73, 0xc8, 0x09, 0x43, 0xa2, 0x23, 0xfe, 0x40, 0x95, 0x63, 0x89, 0x42, 0x6f, 0xb2, 0x05, 0x43, 0xcf, 0x14, 0x1a, 0x41, 0xdb, 0xe8, 0x89, 0x42, 0xbf, 0x9f, 0x07, 0x43, +0x63, 0xdd, 0x09, 0x41, 0x2b, 0xb6, 0x7a, 0x42, 0xb1, 0x92, 0x10, 0x43, 0xe3, 0x36, 0x20, 0x41, 0x94, 0xc7, 0x80, 0x42, 0xb5, 0x88, 0x0f, 0x43, 0xc1, 0xd6, 0x0d, 0x41, 0x4c, 0x46, 0x84, 0x42, 0xd5, 0xf8, 0x0d, 0x43, 0x4d, 0x84, 0x00, 0x41, 0x94, 0xc7, 0x80, 0x42, 0xb5, 0x88, 0x0f, 0x43, 0xc1, 0xd6, 0x0d, 0x41, 0x4c, 0x46, 0x84, 0x42, 0xd5, 0xf8, 0x0d, 0x43, 0x4d, 0x84, 0x00, 0x41, 0x03, 0x29, 0x87, 0x42, 0xb1, 0xf2, 0x0b, 0x43, 0x75, 0x54, 0xf7, 0x40, 0x55, 0x30, 0x89, 0x42, +0x73, 0xc8, 0x09, 0x43, 0xa2, 0x23, 0xfe, 0x40, 0x03, 0x29, 0x87, 0x42, 0xb1, 0xf2, 0x0b, 0x43, 0x75, 0x54, 0xf7, 0x40, 0xd2, 0x7e, 0x8f, 0x42, 0x67, 0x06, 0x02, 0x43, 0xad, 0x12, 0x19, 0x41, 0xee, 0x0b, 0x91, 0x42, 0xa6, 0xfb, 0x04, 0x43, 0xd6, 0xa8, 0xd6, 0x40, 0x1c, 0x9c, 0x8c, 0x42, 0xaa, 0x31, 0x00, 0x43, 0x14, 0xae, 0x4b, 0x41, 0x43, 0x3c, 0x90, 0x42, 0xeb, 0x51, 0x08, 0x43, 0x55, 0xbc, 0x98, 0x40, 0x73, 0xc6, 0x8d, 0x42, 0x75, 0xb3, 0x0b, 0x43, 0x12, 0xa0, 0x78, 0x40, +0x1c, 0x6b, 0x79, 0x42, 0x32, 0x28, 0x03, 0x43, 0x65, 0x08, 0xb6, 0x41, 0x3c, 0x2c, 0x6d, 0x42, 0x75, 0x33, 0x06, 0x43, 0xd7, 0x92, 0xbe, 0x41, 0xf5, 0x4a, 0x65, 0x42, 0x02, 0x2b, 0x0a, 0x43, 0x98, 0xcc, 0xc3, 0x41, 0x03, 0x29, 0x82, 0x42, 0xe8, 0x5b, 0x15, 0x43, 0xa4, 0x19, 0xbf, 0x40, 0xa5, 0xbd, 0x7a, 0x42, 0x34, 0x93, 0x17, 0x43, 0xdc, 0x9d, 0x02, 0x41, 0x03, 0xc9, 0x86, 0x42, 0x6d, 0x47, 0x12, 0x43, 0xa7, 0x3a, 0x8d, 0x40, 0xe8, 0x08, 0x60, 0x42, 0xb7, 0x53, 0x13, 0x43, +0x8e, 0x97, 0xad, 0x41, 0x9a, 0xc8, 0x63, 0x42, 0xb5, 0x68, 0x16, 0x43, 0x82, 0x51, 0x94, 0x41, 0x5a, 0x24, 0x6a, 0x42, 0xea, 0x26, 0x18, 0x43, 0x9c, 0xa2, 0x6c, 0x41, 0x6d, 0x85, 0x60, 0x42, 0x6f, 0xf2, 0x0e, 0x43, 0xa7, 0x57, 0xbe, 0x41, 0x25, 0xd5, 0x86, 0x42, 0xf8, 0x33, 0x00, 0x43, 0xea, 0x95, 0x94, 0x41, 0x50, 0x6d, 0x82, 0x42, 0x73, 0x48, 0x01, 0x43, 0xee, 0xeb, 0xa7, 0x41, 0x93, 0xe9, 0x89, 0x42, 0xe6, 0x90, 0xff, 0x42, 0xe2, 0xc7, 0x7c, 0x41, 0xfc, 0x98, 0x8a, 0x42, +0xee, 0xfc, 0x0e, 0x43, 0x83, 0x86, 0x6c, 0x40, 0x22, 0x30, 0x72, 0x42, 0x29, 0x9c, 0x18, 0x43, 0x15, 0xfb, 0x32, 0x41, 0x88, 0x34, 0x91, 0x42, 0xcc, 0x21, 0xff, 0x42, 0x62, 0x9c, 0x07, 0x41, 0x17, 0xe8, 0x91, 0x42, 0x42, 0xa0, 0x03, 0x43, 0xd8, 0xb6, 0x8a, 0x40, 0xe9, 0xb7, 0x8e, 0x42, 0x14, 0xae, 0xfa, 0x42, 0x26, 0xc2, 0x49, 0x41, 0x02, 0xcb, 0x90, 0x42, 0xd5, 0x18, 0x08, 0x43, 0x75, 0x3c, 0xda, 0x3f, 0xa6, 0xca, 0x8d, 0x42, 0xbb, 0x49, 0x0c, 0x43, 0xfb, 0xe8, 0x4c, 0x3f, +0x4b, 0x19, 0x62, 0x42, 0x30, 0x9d, 0x04, 0x43, 0x27, 0x8f, 0xdd, 0x41, 0x24, 0xa8, 0x71, 0x42, 0x29, 0x7c, 0x00, 0x43, 0xe2, 0xc7, 0xca, 0x41, 0x28, 0x6d, 0x55, 0x42, 0x36, 0x5e, 0x09, 0x43, 0xc1, 0xca, 0xe0, 0x41, 0x87, 0xc5, 0x7e, 0x42, 0x5d, 0xaf, 0x17, 0x43, 0x88, 0x9d, 0x45, 0x40, 0xc8, 0xb6, 0x70, 0x42, 0x3a, 0x74, 0x1a, 0x43, 0x47, 0xfe, 0xb4, 0x40, 0x46, 0xb4, 0x85, 0x42, 0xea, 0x26, 0x14, 0x43, 0x7c, 0xed, 0xc5, 0x3f, 0x88, 0x16, 0x50, 0x42, 0x4e, 0x02, 0x19, 0x43, +0xaa, 0x71, 0x97, 0x41, 0xf0, 0xd6, 0x49, 0x42, 0x2e, 0x52, 0x15, 0x43, 0xf0, 0xa7, 0xbb, 0x41, 0x2a, 0xe9, 0x59, 0x42, 0xa4, 0x30, 0x1b, 0x43, 0xfc, 0x87, 0x61, 0x41, 0xe5, 0x7f, 0x4c, 0x42, 0xdc, 0x39, 0x10, 0x43, 0x4f, 0xaf, 0xd6, 0x41, 0x2d, 0xf2, 0x7f, 0x42, 0x19, 0x04, 0xfd, 0x42, 0x8a, 0x1f, 0xb4, 0x41, 0xd9, 0x9d, 0x85, 0x42, 0x52, 0x38, 0xfb, 0x42, 0x6b, 0x1a, 0x9d, 0x41, 0xbe, 0x70, 0x8a, 0x42, 0xdc, 0x79, 0xfa, 0x42, 0xae, 0x47, 0x84, 0x41, 0xb3, 0x1b, 0x8a, 0x42, +0x27, 0x51, 0x10, 0x43, 0x78, 0x63, 0x31, 0x3f, 0xf3, 0xdf, 0x64, 0x42, 0x38, 0xa9, 0x1b, 0x43, 0x63, 0xfa, 0x18, 0x41, 0xf6, 0xe8, 0x93, 0x42, 0x3c, 0xdf, 0x01, 0x43, 0x00, 0xc5, 0x74, 0x3f, 0xf7, 0xa4, 0x93, 0x42, 0x1d, 0x1a, 0xf8, 0x42, 0xba, 0x66, 0xdc, 0x40, 0x50, 0xdc, 0x91, 0x42, 0x98, 0x6e, 0x07, 0x43, 0x75, 0x3c, 0x50, 0xc0, 0xf3, 0x3f, 0x8e, 0x42, 0xee, 0x3c, 0x0c, 0x43, 0x80, 0xcf, 0x77, 0xc0, 0x4c, 0xd7, 0x97, 0x42, 0xd4, 0x0d, 0xeb, 0x42, 0x2f, 0xd1, 0x16, 0xc1, +0x2c, 0x54, 0x98, 0x42, 0xde, 0x24, 0xe9, 0x42, 0x9e, 0x4d, 0x0d, 0xc1, 0x35, 0xed, 0x95, 0x42, 0x24, 0x1b, 0xe9, 0x42, 0xbd, 0xd2, 0x1b, 0xc1, 0x75, 0xf1, 0x97, 0x42, 0xf2, 0x12, 0xe8, 0x42, 0xf1, 0xc6, 0x1e, 0xc1, 0x78, 0x2b, 0x96, 0x42, 0x65, 0xbb, 0xe8, 0x42, 0x0a, 0xa9, 0x10, 0xc1, 0x44, 0x5a, 0x95, 0x42, 0xb7, 0x73, 0xea, 0x42, 0x38, 0xd6, 0x54, 0xc1, 0x45, 0xd6, 0x96, 0x42, 0x96, 0xc3, 0xe7, 0x42, 0x27, 0xa0, 0x5d, 0xc1, 0x59, 0x15, 0x94, 0x42, 0x63, 0x50, 0xea, 0x42, +0x11, 0x47, 0x81, 0xc1, 0x15, 0xbb, 0x95, 0x42, 0x42, 0xa0, 0xe7, 0x42, 0xff, 0x32, 0x83, 0xc1, 0x2a, 0x69, 0x97, 0x42, 0x3e, 0xca, 0xe7, 0x42, 0xa7, 0x57, 0x3b, 0xc1, 0x9d, 0x80, 0x95, 0x42, 0x85, 0xeb, 0xe9, 0x42, 0x03, 0x09, 0x34, 0xc1, 0xfc, 0x18, 0x98, 0x42, 0x42, 0xe0, 0xee, 0x42, 0x30, 0x99, 0x4a, 0xc1, 0xee, 0x7c, 0x97, 0x42, 0xc9, 0x76, 0xed, 0x42, 0x06, 0xf0, 0x2d, 0xc1, 0x33, 0xa4, 0x9b, 0x42, 0xda, 0x0e, 0xf3, 0x42, 0x40, 0x24, 0x8b, 0xc1, 0x94, 0x98, 0x9d, 0x42, +0x57, 0x0e, 0xf3, 0x42, 0xd7, 0x81, 0x5a, 0xc1, 0x59, 0x17, 0x96, 0x42, 0xf2, 0x52, 0xee, 0x42, 0xfa, 0x7e, 0x83, 0xc1, 0x66, 0x57, 0x9c, 0x42, 0x52, 0x38, 0xfe, 0x42, 0x1d, 0xac, 0x8e, 0xc0, 0xad, 0x38, 0x99, 0x42, 0x71, 0xfd, 0xfe, 0x42, 0xe4, 0x0f, 0x74, 0xc0, 0xc6, 0xed, 0x99, 0x42, 0xf7, 0x68, 0xf4, 0x42, 0xbb, 0x5c, 0x3c, 0x40, 0xf9, 0x40, 0x97, 0x42, 0xc9, 0xb6, 0xf3, 0x42, 0xbe, 0x0e, 0x6a, 0x40, 0x59, 0xf9, 0x95, 0x42, 0xb3, 0x9d, 0xf1, 0x42, 0x5d, 0x68, 0xc6, 0x40, +0x9c, 0x73, 0x96, 0x42, 0x47, 0x61, 0x00, 0x43, 0x4b, 0x59, 0x30, 0xc0, 0xa3, 0x01, 0x91, 0x42, 0x2e, 0x72, 0xd8, 0x42, 0xdc, 0x11, 0x06, 0xc0, 0x05, 0x16, 0x92, 0x42, 0x01, 0xc0, 0xd5, 0x42, 0x5f, 0x07, 0x25, 0xc1, 0xfb, 0xab, 0x97, 0x42, 0x63, 0x50, 0xd8, 0x42, 0xdd, 0x93, 0x8e, 0xc0, 0x35, 0xbe, 0x97, 0x42, 0x0f, 0xad, 0xd6, 0x42, 0x44, 0xfa, 0x2f, 0xc1, 0xba, 0x69, 0x96, 0x42, 0xcd, 0x0c, 0xd5, 0x42, 0x17, 0x37, 0x82, 0xc1, 0xe4, 0xa3, 0x90, 0x42, 0x21, 0xf0, 0xd3, 0x42, +0xc1, 0x39, 0x74, 0xc1, 0x05, 0x16, 0x92, 0x42, 0x01, 0xc0, 0xd5, 0x42, 0x5f, 0x07, 0x25, 0xc1, 0x00, 0x4f, 0x97, 0x42, 0xfe, 0x74, 0x03, 0x43, 0xa1, 0x62, 0xed, 0xc0, 0x9c, 0x73, 0x96, 0x42, 0x47, 0x61, 0x00, 0x43, 0x4b, 0x59, 0x30, 0xc0, 0xc8, 0x96, 0x94, 0x42, 0x79, 0xc9, 0x03, 0x43, 0xe9, 0xd4, 0xda, 0xc0, 0x4b, 0x59, 0x94, 0x42, 0xde, 0xc4, 0x06, 0x43, 0x3e, 0x57, 0x3f, 0xc1, 0xc8, 0x96, 0x94, 0x42, 0x79, 0xc9, 0x03, 0x43, 0xe9, 0xd4, 0xda, 0xc0, 0x8e, 0x04, 0x92, 0x42, +0x17, 0xb9, 0x06, 0x43, 0x8d, 0x06, 0x3a, 0xc1, 0x92, 0xfa, 0x97, 0x42, 0x0f, 0x2d, 0x06, 0x43, 0x1b, 0x0d, 0x47, 0xc1, 0xa8, 0x55, 0x9b, 0x42, 0x85, 0xeb, 0x02, 0x43, 0xb0, 0x1b, 0xff, 0xc0, 0x80, 0x88, 0xa3, 0x42, 0xf5, 0x3d, 0xff, 0x42, 0xea, 0x3e, 0xbd, 0xc0, 0xdc, 0xe6, 0x9f, 0x42, 0x19, 0xc4, 0xfe, 0x42, 0x9d, 0x0c, 0xa4, 0xc0, 0xf8, 0x31, 0xa3, 0x42, 0xfb, 0xbe, 0xf5, 0x42, 0x86, 0x1f, 0x54, 0x3f, 0xff, 0x30, 0x9f, 0x42, 0xe6, 0x90, 0xf5, 0x42, 0x65, 0x88, 0xff, 0x3f, +0x09, 0xd9, 0x98, 0x42, 0x5f, 0xba, 0xea, 0x42, 0x57, 0xe7, 0xef, 0x40, 0x48, 0xff, 0x9e, 0x42, 0xe0, 0x4f, 0xeb, 0x42, 0x21, 0x59, 0xd7, 0x40, 0xdd, 0x44, 0x99, 0x42, 0xf7, 0x68, 0xf0, 0x42, 0x18, 0x78, 0xc2, 0x40, 0x37, 0x38, 0x9f, 0x42, 0x52, 0xb8, 0xf0, 0x42, 0xa2, 0x5d, 0x9c, 0x40, 0x1a, 0x60, 0xa4, 0x42, 0xd6, 0x38, 0xea, 0x42, 0xc1, 0x51, 0x95, 0x40, 0x8d, 0xc8, 0xa4, 0x42, 0x3c, 0xdf, 0xef, 0x42, 0x00, 0x00, 0x52, 0x40, 0xf6, 0x17, 0x9f, 0x42, 0x2a, 0x9c, 0xe4, 0x42, +0x1d, 0x03, 0xbd, 0x40, 0x5d, 0x5c, 0x99, 0x42, 0x0b, 0x17, 0xe4, 0x42, 0x97, 0x51, 0xe6, 0x40, 0x20, 0xb2, 0x9c, 0x42, 0x28, 0xf1, 0xd8, 0x42, 0x9d, 0x9d, 0xb9, 0xc0, 0x7c, 0x10, 0x9e, 0x42, 0x19, 0x04, 0xdc, 0x42, 0x5c, 0x72, 0xd4, 0x3f, 0xe6, 0xdf, 0x98, 0x42, 0x84, 0xc0, 0xdb, 0x42, 0xa8, 0xa4, 0x58, 0x40, 0x22, 0xec, 0xa2, 0x42, 0xd4, 0xcd, 0xdd, 0x42, 0x0c, 0x01, 0x98, 0xbe, 0x82, 0x73, 0xa1, 0x42, 0xec, 0x91, 0xd9, 0x42, 0xd5, 0x21, 0xe4, 0xc0, 0x8d, 0x06, 0x9c, 0x42, +0x1f, 0x45, 0xd7, 0x42, 0x6d, 0x56, 0x40, 0xc1, 0xda, 0x3b, 0xa0, 0x42, 0xe8, 0x3b, 0xd8, 0x42, 0x09, 0xf9, 0x59, 0xc1, 0x05, 0xb2, 0x9a, 0x42, 0x51, 0xcd, 0xd5, 0x42, 0x51, 0x49, 0x87, 0xc1, 0x0f, 0xba, 0x9f, 0x42, 0xb3, 0x9d, 0xd6, 0x42, 0xd9, 0x3d, 0x8d, 0xc1, 0x82, 0xb1, 0x9b, 0x42, 0x63, 0x90, 0x05, 0x43, 0x2d, 0x21, 0x4f, 0xc1, 0xb8, 0x0d, 0x9f, 0x42, 0x0d, 0xc2, 0x02, 0x43, 0x07, 0xa5, 0x07, 0xc1, 0x0d, 0x40, 0xa0, 0x42, 0x8e, 0xd7, 0x04, 0x43, 0xe8, 0x48, 0x59, 0xc1, +0x92, 0xab, 0xa2, 0x42, 0x6b, 0x9c, 0x02, 0x43, 0x13, 0xfe, 0x10, 0xc1, 0xd7, 0x03, 0xa7, 0x42, 0xb9, 0x5e, 0xeb, 0x42, 0x32, 0xfe, 0x1d, 0x40, 0x4c, 0xf7, 0xa6, 0x42, 0x4a, 0x4c, 0xe8, 0x42, 0x18, 0x3e, 0x28, 0x40, 0x90, 0x00, 0xa6, 0x42, 0x51, 0x0d, 0xe4, 0x42, 0x4b, 0x3c, 0x60, 0x40, 0xb0, 0xc1, 0xb4, 0x42, 0x9c, 0x44, 0xdd, 0x42, 0xdb, 0x85, 0x12, 0xc1, 0xa2, 0x85, 0xb7, 0x42, 0x11, 0x58, 0xd9, 0x42, 0x19, 0x04, 0x62, 0xc1, 0x80, 0x57, 0xb6, 0x42, 0x96, 0x83, 0xe0, 0x42, +0xc9, 0xe5, 0x21, 0xc1, 0x29, 0xda, 0xb8, 0x42, 0x82, 0x15, 0xde, 0x42, 0xcf, 0xd5, 0x6c, 0xc1, 0xa2, 0x85, 0xb2, 0x42, 0xc1, 0xca, 0xd7, 0x42, 0x1e, 0x85, 0x4c, 0xc1, 0x80, 0xb7, 0xb1, 0x42, 0x40, 0x35, 0xda, 0x42, 0x8a, 0x59, 0x14, 0xc1, 0xd1, 0x40, 0xb8, 0x42, 0x2c, 0xc7, 0xdb, 0x42, 0x96, 0x10, 0x90, 0xc1, 0xa9, 0xa2, 0xb6, 0x42, 0xb5, 0x88, 0xd6, 0x42, 0x63, 0x6e, 0x8d, 0xc1, 0xfd, 0xc5, 0xb6, 0x42, 0xfd, 0xe9, 0xda, 0x42, 0x76, 0xcf, 0xa8, 0xc1, 0xbe, 0xf0, 0xb4, 0x42, +0x4e, 0x22, 0xd6, 0x42, 0x7c, 0xe1, 0xa5, 0xc1, 0xa6, 0x99, 0xb0, 0x42, 0xf8, 0x53, 0xd4, 0x42, 0xa8, 0xa4, 0xa0, 0xc1, 0xdd, 0xf3, 0xb1, 0x42, 0xff, 0x54, 0xd5, 0x42, 0xc8, 0xf6, 0x85, 0xc1, 0x92, 0xcb, 0xbc, 0x42, 0x25, 0x66, 0x0a, 0x43, 0x6c, 0x67, 0x89, 0xc1, 0x60, 0xb4, 0xbc, 0x42, 0xd3, 0xcd, 0x07, 0x43, 0xee, 0xeb, 0x35, 0xc1, 0x61, 0x32, 0xc0, 0x42, 0xfc, 0xc9, 0x08, 0x43, 0x98, 0xdd, 0x8b, 0xc1, 0x1c, 0x5c, 0xc0, 0x42, 0x79, 0x09, 0x06, 0x43, 0xb7, 0xd1, 0x37, 0xc1, +0xdd, 0xc4, 0xbb, 0x42, 0x1f, 0xa5, 0x03, 0x43, 0x3f, 0x8c, 0xee, 0xc0, 0xb1, 0xce, 0xbe, 0x42, 0xea, 0x66, 0x01, 0x43, 0xd4, 0x9a, 0xf2, 0xc0, 0xe4, 0x65, 0x9e, 0x42, 0x44, 0xcb, 0xe8, 0x42, 0x6b, 0xf1, 0xf7, 0xc0, 0x73, 0xf7, 0x9d, 0x42, 0x69, 0x51, 0xed, 0x42, 0xbb, 0x61, 0x15, 0xc1, 0x89, 0xf0, 0xa3, 0x42, 0x7a, 0x69, 0xeb, 0x42, 0xd6, 0x6e, 0xd2, 0xc0, 0x56, 0xae, 0xa4, 0x42, 0x73, 0x28, 0xef, 0x42, 0x40, 0x41, 0x14, 0xc1, 0xe3, 0xc5, 0xa4, 0x42, 0x82, 0x95, 0xe7, 0x42, +0x81, 0x95, 0x59, 0xc0, 0x3b, 0x3f, 0xa3, 0x42, 0x51, 0x0d, 0xe8, 0x42, 0x13, 0xed, 0xab, 0xc0, 0x22, 0x8c, 0x9c, 0x42, 0xc7, 0x8b, 0xe7, 0x42, 0x65, 0xaa, 0x1c, 0xc1, 0xbf, 0xae, 0xa1, 0x42, 0xee, 0xbc, 0xe6, 0x42, 0x83, 0x75, 0x1a, 0xc1, 0x15, 0xbd, 0x9f, 0x42, 0x6b, 0xfc, 0xe4, 0x42, 0x5d, 0x4b, 0x6e, 0xc1, 0xfe, 0xd4, 0x9a, 0x42, 0xc5, 0x20, 0xe6, 0x42, 0x9b, 0x55, 0x66, 0xc1, 0x5b, 0xa2, 0xa0, 0x42, 0x48, 0xa1, 0xe5, 0x42, 0x39, 0xb4, 0x47, 0xc1, 0x84, 0x9e, 0x9b, 0x42, +0xaf, 0x87, 0xe6, 0x42, 0x51, 0x49, 0x41, 0xc1, 0x30, 0xaa, 0x99, 0x42, 0x55, 0xe3, 0xe5, 0x42, 0x77, 0xad, 0x87, 0xc1, 0x23, 0x99, 0x9e, 0x42, 0x0b, 0x97, 0xe4, 0x42, 0xdc, 0x46, 0x8d, 0xc1, 0xf3, 0x5d, 0xa6, 0x42, 0x01, 0xc0, 0xf6, 0x42, 0x7d, 0xe6, 0x10, 0xbf, 0x0c, 0x13, 0xa7, 0x42, 0x8f, 0x02, 0x00, 0x43, 0x9f, 0x1f, 0xd9, 0xc0, 0x86, 0xa7, 0xa9, 0x42, 0xc2, 0x35, 0x01, 0x43, 0xd4, 0x60, 0xef, 0xc0, 0x66, 0x86, 0xaa, 0x42, 0x8c, 0x2c, 0xf9, 0x42, 0x96, 0xca, 0xe7, 0xbf, +0x0c, 0x13, 0xa7, 0x42, 0xc1, 0xca, 0xe9, 0x42, 0x58, 0x39, 0x46, 0xc0, 0x7b, 0x43, 0xa8, 0x42, 0x5b, 0x24, 0xed, 0x42, 0x65, 0x8d, 0xcb, 0xc0, 0x7d, 0x7d, 0xab, 0x42, 0xad, 0x9c, 0xeb, 0x42, 0x8b, 0xa6, 0x61, 0xc0, 0x86, 0x89, 0xac, 0x42, 0x42, 0xa0, 0xee, 0x42, 0x0a, 0x11, 0xd5, 0xc0, 0x4a, 0x8a, 0xa9, 0x42, 0x3a, 0xf4, 0xf0, 0x42, 0x9c, 0xf9, 0x15, 0xc1, 0x7a, 0xa5, 0xad, 0x42, 0xf9, 0xd3, 0xf2, 0x42, 0x41, 0x71, 0x18, 0xc1, 0xb5, 0xc6, 0xa6, 0x42, 0x69, 0x11, 0xea, 0x42, +0xf9, 0x49, 0xa5, 0xbe, 0x56, 0x6e, 0xab, 0x42, 0xc5, 0xa0, 0xeb, 0x42, 0x0f, 0x97, 0x8c, 0xbf, 0x0d, 0xc0, 0xa5, 0x42, 0xe6, 0x50, 0xe7, 0x42, 0x88, 0x65, 0x0b, 0xbf, 0xcd, 0xaa, 0xa5, 0x42, 0x48, 0x21, 0xe8, 0x42, 0x10, 0x58, 0x79, 0xbe, 0x40, 0x13, 0xa8, 0x42, 0xb8, 0x9e, 0xec, 0x42, 0xe7, 0xde, 0x9f, 0x3f, 0xc4, 0xd1, 0xab, 0x42, 0xa3, 0xc5, 0xed, 0x42, 0xf2, 0x7c, 0xa6, 0x3e, 0x74, 0x24, 0xaa, 0x42, 0x34, 0x73, 0xf6, 0x42, 0xfa, 0xed, 0x3d, 0xc1, 0x11, 0xf6, 0xa4, 0x42, +0x99, 0x19, 0xf4, 0x42, 0x2b, 0x87, 0x39, 0xc1, 0x84, 0x3c, 0xae, 0x42, 0x5d, 0xcf, 0xf8, 0x42, 0x5f, 0x07, 0x40, 0xc1, 0x8c, 0x4a, 0xa9, 0x42, 0xb5, 0x08, 0xf8, 0x42, 0x4a, 0x7b, 0x72, 0xc1, 0xf2, 0xe1, 0xac, 0x42, 0xeb, 0xd1, 0xf9, 0x42, 0x7d, 0xae, 0x79, 0xc1, 0x67, 0xf3, 0xa4, 0x42, 0x1e, 0x05, 0xf6, 0x42, 0x3c, 0x2c, 0x68, 0xc1, 0x61, 0xa3, 0xb1, 0x42, 0x67, 0x46, 0x00, 0x43, 0xe6, 0x22, 0x92, 0xc0, 0x4d, 0x64, 0xb4, 0x42, 0x40, 0xb5, 0x02, 0x43, 0xc9, 0xe5, 0xce, 0xc0, +0xe4, 0x65, 0xae, 0x42, 0xa8, 0xc6, 0x03, 0x43, 0xfb, 0x91, 0x12, 0xc1, 0x26, 0x33, 0xb0, 0x42, 0xa0, 0x3a, 0x05, 0x43, 0xe3, 0x36, 0x23, 0xc1, 0xd1, 0x80, 0xb1, 0x42, 0x7f, 0x6a, 0x06, 0x43, 0x26, 0xc2, 0x31, 0xc1, 0xc3, 0x64, 0xb6, 0x42, 0x44, 0x6b, 0x05, 0x43, 0x7e, 0x29, 0x10, 0xc1, 0x53, 0x94, 0xb8, 0x42, 0xd2, 0xa2, 0xf7, 0x42, 0x20, 0x7b, 0xe6, 0xc0, 0x30, 0x9d, 0xb7, 0x42, 0xfd, 0xa9, 0xf8, 0x42, 0xb1, 0x8a, 0x10, 0xc1, 0xc4, 0x80, 0xbc, 0x42, 0x65, 0xfb, 0xfd, 0x42, +0x29, 0x05, 0x1a, 0xc1, 0x23, 0xd9, 0xba, 0x42, 0xd7, 0xa3, 0xfd, 0x42, 0x5e, 0x4b, 0x2e, 0xc1, 0xd8, 0x21, 0xb7, 0x42, 0x9a, 0x99, 0xfa, 0x42, 0x20, 0xd2, 0x30, 0xc1, 0xf4, 0x8c, 0xb9, 0x42, 0x0f, 0xad, 0xfd, 0x42, 0x03, 0x09, 0x3e, 0xc1, 0xad, 0xe9, 0xb3, 0x42, 0x7e, 0x3f, 0xf7, 0x42, 0xd5, 0x78, 0x24, 0xc1, 0xf9, 0xe0, 0xb3, 0x42, 0x00, 0x80, 0xf4, 0x42, 0x9a, 0xce, 0xfc, 0xc0, 0x5a, 0x33, 0xb4, 0x42, 0x98, 0xae, 0xf2, 0x42, 0x75, 0x3c, 0xb9, 0xc0, 0x11, 0xf6, 0xb4, 0x42, +0x03, 0xeb, 0xf2, 0x42, 0x19, 0xca, 0x81, 0xc0, 0xcb, 0xf0, 0xb9, 0x42, 0x11, 0x18, 0xf8, 0x42, 0xc4, 0xe6, 0xb2, 0xc0, 0x27, 0xa0, 0xb5, 0x42, 0x6f, 0x12, 0xf5, 0x42, 0x72, 0xf9, 0x3b, 0xc0, 0x9c, 0xe2, 0xba, 0x42, 0x4d, 0xb7, 0xfa, 0x42, 0xcd, 0xc7, 0x91, 0xc0, 0x7e, 0x1b, 0xbe, 0x42, 0xd6, 0xb8, 0xff, 0x42, 0x30, 0xbb, 0x06, 0xc1, 0xa1, 0x36, 0xad, 0x42, 0x17, 0x99, 0x05, 0x43, 0xf7, 0x75, 0x38, 0xc1, 0xc0, 0x1b, 0xaf, 0x42, 0x32, 0xc8, 0x06, 0x43, 0xb6, 0xf3, 0x44, 0xc1, +0x5b, 0xe4, 0xab, 0x42, 0xa2, 0x05, 0x06, 0x43, 0x10, 0xe9, 0x75, 0xc1, 0xdf, 0xbe, 0xad, 0x42, 0xa6, 0x1b, 0x07, 0x43, 0xec, 0x9e, 0x7d, 0xc1, 0x32, 0x24, 0xb1, 0x42, 0x1d, 0xda, 0x07, 0x43, 0x42, 0xcf, 0x4e, 0xc1, 0xe8, 0x0a, 0xb0, 0x42, 0xb7, 0x53, 0x08, 0x43, 0x48, 0x3f, 0x83, 0xc1, 0xbb, 0xc9, 0xb6, 0x42, 0xb3, 0x9d, 0xff, 0x42, 0x80, 0xb7, 0x54, 0xc1, 0x32, 0xa4, 0xb3, 0x42, 0x15, 0xee, 0xfc, 0x42, 0xf8, 0x31, 0x4a, 0xc1, 0xca, 0xd2, 0xb9, 0x42, 0x27, 0xd1, 0x00, 0x43, +0x52, 0x96, 0x5e, 0xc1, 0x4d, 0xf3, 0xb5, 0x42, 0x5f, 0x7a, 0x00, 0x43, 0xa6, 0x1b, 0x87, 0xc1, 0xec, 0xaf, 0xb9, 0x42, 0x9c, 0x04, 0x02, 0x43, 0x51, 0x49, 0x8c, 0xc1, 0xea, 0x95, 0xb2, 0x42, 0xb1, 0xf2, 0xfd, 0x42, 0xee, 0xda, 0x82, 0xc1, 0xb5, 0x15, 0xb7, 0x42, 0x86, 0x8b, 0x08, 0x43, 0x46, 0x25, 0x44, 0xc1, 0xdf, 0x9e, 0xb6, 0x42, 0xfe, 0x94, 0x0a, 0x43, 0xc9, 0x76, 0x87, 0xc1, 0x9e, 0x2d, 0xbc, 0x42, 0xc9, 0x76, 0x01, 0x43, 0x82, 0x51, 0x5d, 0xc1, 0x42, 0xbe, 0xbc, 0x42, +0x07, 0x41, 0x03, 0x43, 0xed, 0x8d, 0x8f, 0xc1, 0xaf, 0x14, 0xbe, 0x42, 0x11, 0x58, 0x02, 0x43, 0xa2, 0xb4, 0x54, 0xc1, 0xda, 0xca, 0xbe, 0x42, 0x96, 0xc3, 0x04, 0x43, 0xd4, 0x09, 0x8f, 0xc1, 0x1c, 0xdc, 0xa5, 0x42, 0xa2, 0x05, 0xda, 0x42, 0x49, 0xcb, 0x05, 0xc1, 0x96, 0x61, 0xa7, 0x42, 0xd7, 0x23, 0xde, 0x42, 0xda, 0xc9, 0x04, 0xc0, 0x78, 0x7a, 0xab, 0x42, 0x2e, 0x72, 0xdd, 0x42, 0xa5, 0xb8, 0x68, 0xc0, 0xd4, 0xa9, 0xa9, 0x42, 0x46, 0xb6, 0xd9, 0x42, 0xbd, 0x35, 0x1a, 0xc1, +0xc4, 0x62, 0xa7, 0x42, 0x69, 0xd1, 0xe3, 0x42, 0xfe, 0x47, 0xc6, 0x3d, 0x24, 0x57, 0xab, 0x42, 0x84, 0xc0, 0xe2, 0x42, 0x7c, 0xed, 0x05, 0xc0, 0xab, 0xed, 0xa7, 0x42, 0xa0, 0xda, 0xe5, 0x42, 0x87, 0xfc, 0x3b, 0xbf, 0xe9, 0x06, 0xac, 0x42, 0xf4, 0x7d, 0xe5, 0x42, 0x9b, 0x1b, 0x31, 0xc0, 0xc8, 0x47, 0xa7, 0x42, 0x09, 0x2c, 0xe7, 0x42, 0x5b, 0x5a, 0xc7, 0xc0, 0xf8, 0x73, 0xa6, 0x42, 0x78, 0x3e, 0xe6, 0x42, 0x9a, 0x77, 0x25, 0xc1, 0x9f, 0x5c, 0xaa, 0x42, 0x1f, 0x45, 0xe4, 0x42, +0xc1, 0x39, 0x59, 0xc1, 0x72, 0x79, 0xa5, 0x42, 0x6b, 0x3c, 0xe5, 0x42, 0xb6, 0x84, 0x50, 0xc1, 0x89, 0x10, 0xab, 0x42, 0xb3, 0x5d, 0xe5, 0x42, 0xd6, 0x34, 0x2c, 0xc1, 0x59, 0x75, 0xa4, 0x42, 0x3e, 0x4a, 0xd8, 0x42, 0xc6, 0x4b, 0x60, 0xc1, 0x5d, 0x4d, 0xa8, 0x42, 0xee, 0xfc, 0xd7, 0x42, 0xb9, 0xfc, 0x69, 0xc1, 0x65, 0xbb, 0xa3, 0x42, 0x3a, 0xf4, 0xd5, 0x42, 0x23, 0xdb, 0x91, 0xc1, 0xa4, 0x30, 0xa7, 0x42, 0xc5, 0x20, 0xd6, 0x42, 0x82, 0xd1, 0x95, 0xc1, 0x73, 0x86, 0xa4, 0x42, +0x4c, 0x37, 0xe4, 0x42, 0x65, 0x19, 0x76, 0xc1, 0x45, 0xa7, 0xa3, 0x42, 0x03, 0x6b, 0xe3, 0x42, 0xd4, 0x89, 0x92, 0xc1, 0xae, 0x56, 0xa9, 0x42, 0xf5, 0xa8, 0xe3, 0x42, 0x93, 0x29, 0x80, 0xc1, 0xf5, 0x39, 0xa8, 0x42, 0x09, 0xec, 0xe2, 0x42, 0x66, 0xe6, 0x97, 0xc1, 0x8d, 0x28, 0xad, 0x42, 0xf2, 0x52, 0xd8, 0x42, 0x72, 0xf9, 0x30, 0xc1, 0x4e, 0x20, 0xaf, 0x42, 0xde, 0x24, 0xdc, 0x42, 0xe1, 0x06, 0xcc, 0xc0, 0xeb, 0x51, 0xb0, 0x42, 0xc5, 0xa0, 0xe0, 0x42, 0x8c, 0x9c, 0xa6, 0xc0, +0xc4, 0x51, 0xb1, 0x42, 0x66, 0xe6, 0xe3, 0x42, 0xff, 0x95, 0xb4, 0xc0, 0xf8, 0x11, 0xb1, 0x42, 0xe0, 0xcf, 0xe3, 0x42, 0xa9, 0xc6, 0x65, 0xc1, 0xbf, 0x6e, 0xb0, 0x42, 0x03, 0x2b, 0xe4, 0x42, 0xd8, 0xf0, 0x33, 0xc1, 0x1c, 0xcb, 0xaa, 0x42, 0xdc, 0xf9, 0xd4, 0x42, 0x57, 0xec, 0x99, 0xc1, 0x1e, 0xe5, 0xab, 0x42, 0xc5, 0xe0, 0xd6, 0x42, 0x54, 0xc1, 0x75, 0xc1, 0xfe, 0x83, 0xb0, 0x42, 0x7a, 0xe9, 0xe2, 0x42, 0x66, 0xe6, 0x88, 0xc1, 0xe4, 0x32, 0xaf, 0x42, 0x11, 0x58, 0xe2, 0x42, +0x47, 0x83, 0xa0, 0xc1, 0xcd, 0x3b, 0xa6, 0x42, 0x30, 0x9d, 0x02, 0x43, 0x9f, 0x0e, 0x1d, 0xc1, 0x5d, 0xfc, 0xa8, 0x42, 0xcd, 0x6c, 0x03, 0x43, 0x49, 0x9d, 0x24, 0xc1, 0xed, 0x1c, 0xa4, 0x42, 0x54, 0x63, 0x04, 0x43, 0xa0, 0x89, 0x62, 0xc1, 0x6e, 0xe3, 0xa7, 0x42, 0x29, 0x7c, 0x04, 0x43, 0x9f, 0x3c, 0x6a, 0xc1, 0xf6, 0xc6, 0xaf, 0x42, 0x4f, 0xa2, 0xfb, 0x42, 0x60, 0x54, 0x7f, 0xc1, 0xee, 0x0b, 0xb1, 0x42, 0xfd, 0xa9, 0xfa, 0x42, 0xc1, 0xa8, 0x43, 0xc1, 0x5b, 0xf1, 0xb0, 0x42, +0xf2, 0xd2, 0xf4, 0x42, 0x5d, 0xa7, 0x1c, 0xc1, 0x65, 0x79, 0xb5, 0x42, 0xab, 0x31, 0xfa, 0x42, 0xc9, 0x59, 0x22, 0xc0, 0x84, 0x1e, 0xb1, 0x42, 0x9e, 0x6f, 0xf5, 0x42, 0x3e, 0x78, 0x7d, 0xbf, 0x82, 0xe2, 0xb0, 0x42, 0xc7, 0x4b, 0xf0, 0x42, 0xec, 0x51, 0x88, 0xbf, 0xbe, 0xff, 0xab, 0x42, 0x61, 0xa5, 0xf2, 0x42, 0xfd, 0x69, 0x0f, 0x3f, 0xfb, 0x6b, 0xae, 0x42, 0x3a, 0x74, 0xfc, 0x42, 0xb3, 0x24, 0x42, 0xc0, 0x45, 0x38, 0xac, 0x42, 0x1b, 0x6f, 0x02, 0x43, 0x36, 0x2b, 0x04, 0xc1, +0x43, 0xab, 0xaf, 0x42, 0x78, 0xbe, 0xed, 0x42, 0xd4, 0x9a, 0x8d, 0xc0, 0x48, 0x3f, 0xb0, 0x42, 0xd2, 0x22, 0xf1, 0x42, 0x42, 0x95, 0xe4, 0xc0, 0xd1, 0xd1, 0xb8, 0x42, 0xc3, 0x15, 0x00, 0x43, 0xe6, 0xe8, 0x8e, 0xc0, 0x36, 0x7c, 0xa7, 0x42, 0x01, 0x40, 0xf1, 0x42, 0xa2, 0x40, 0xe3, 0x3f, 0x01, 0xbc, 0x94, 0x42, 0x0b, 0x97, 0xea, 0x42, 0x7f, 0x2b, 0xfc, 0x40, 0x59, 0xf9, 0x95, 0x42, 0xb3, 0x9d, 0xf1, 0x42, 0x5d, 0x68, 0xc6, 0x40, 0x47, 0x52, 0xa0, 0x42, 0xa7, 0x9b, 0xe0, 0x42, +0x0c, 0xb0, 0x84, 0x40, 0x8e, 0x04, 0x92, 0x42, 0x17, 0xb9, 0x06, 0x43, 0x8d, 0x06, 0x3a, 0xc1, 0x61, 0x52, 0x8f, 0x42, 0x6b, 0x1c, 0x08, 0x43, 0x09, 0xf9, 0x7e, 0xc1, 0x12, 0xb4, 0x91, 0x42, 0x88, 0x76, 0x08, 0x43, 0xed, 0x9e, 0x83, 0xc1, 0xae, 0xb6, 0x94, 0x42, 0x0d, 0xe2, 0x07, 0x43, 0x08, 0xbd, 0x85, 0xc1, 0x01, 0x3e, 0x99, 0x42, 0x02, 0x2b, 0x07, 0x43, 0x8e, 0xe4, 0x8a, 0xc1, 0x15, 0xec, 0x9d, 0x42, 0x15, 0x4e, 0x06, 0x43, 0xf8, 0x31, 0x90, 0xc1, 0x59, 0x26, 0xa2, 0x42, +0x5c, 0x8f, 0x05, 0x43, 0xed, 0xfc, 0x94, 0xc1, 0xe2, 0xe7, 0xa5, 0x42, 0x42, 0x20, 0x05, 0x43, 0x5e, 0x4b, 0x99, 0xc1, 0x80, 0x48, 0xaa, 0x42, 0x30, 0x1d, 0x05, 0x43, 0xcf, 0xd5, 0x6f, 0xc1, 0x76, 0x40, 0xa8, 0x42, 0x5f, 0x7a, 0x05, 0x43, 0x99, 0x19, 0x9c, 0xc1, 0x4b, 0xd9, 0xa9, 0x42, 0x7d, 0x3f, 0x06, 0x43, 0x43, 0x1c, 0x9e, 0xc1, 0x94, 0x96, 0xab, 0x42, 0xd5, 0x38, 0x07, 0x43, 0xbd, 0x52, 0xa0, 0xc1, 0xe1, 0xfa, 0xad, 0x42, 0xda, 0xae, 0x08, 0x43, 0xbd, 0x63, 0xa3, 0xc1, +0x49, 0xfd, 0xb4, 0x42, 0xda, 0x6e, 0x0b, 0x43, 0x59, 0x17, 0xac, 0xc1, 0x35, 0x6d, 0xbb, 0x42, 0x6f, 0x72, 0x0b, 0x43, 0x08, 0x9b, 0xb3, 0xc1, 0x0f, 0x2d, 0xc0, 0x42, 0x94, 0xb8, 0x06, 0x43, 0xc2, 0x17, 0x8d, 0xc1, 0xc4, 0x31, 0xbf, 0x42, 0x48, 0x01, 0x08, 0x43, 0x5d, 0x5c, 0xb7, 0xc1, 0xb1, 0xff, 0xbe, 0x42, 0xe4, 0x05, 0x0a, 0x43, 0xaf, 0x83, 0xb7, 0xc1, 0x4f, 0xfe, 0xbd, 0x42, 0xcf, 0xf7, 0x05, 0x43, 0x40, 0x93, 0xb5, 0xc1, 0xb4, 0x97, 0xbb, 0x42, 0x81, 0x35, 0x04, 0x43, +0x75, 0x71, 0xb2, 0xc1, 0xe5, 0x30, 0xb8, 0x42, 0x38, 0x89, 0x02, 0x43, 0x2a, 0x29, 0xae, 0xc1, 0x41, 0x40, 0xb4, 0x42, 0xa0, 0x9a, 0x00, 0x43, 0x2d, 0x32, 0xa9, 0xc1, 0x44, 0xba, 0xb0, 0x42, 0xfd, 0xa9, 0xfd, 0x42, 0xec, 0xc0, 0xa4, 0xc1, 0x16, 0x0a, 0xae, 0x42, 0x55, 0x63, 0xfb, 0x42, 0x60, 0x65, 0xa1, 0xc1, 0xde, 0x51, 0xab, 0x42, 0x85, 0xeb, 0xf9, 0x42, 0x1e, 0x16, 0x9e, 0xc1, 0xf5, 0x8a, 0xa7, 0x42, 0x88, 0x56, 0xf8, 0x42, 0x8d, 0x86, 0x99, 0xc1, 0x4b, 0xe8, 0xa2, 0x42, +0xbf, 0x1f, 0xf6, 0x42, 0x72, 0xe8, 0x93, 0xc1, 0x7a, 0x45, 0xb7, 0x42, 0xf5, 0x28, 0xdf, 0x42, 0x69, 0x80, 0x8f, 0xc1, 0xc1, 0xca, 0xb7, 0x42, 0xd6, 0xf8, 0xe0, 0x42, 0x4c, 0xa6, 0x6e, 0xc1, 0x11, 0xd6, 0xb5, 0x42, 0x5b, 0x64, 0xde, 0x42, 0xd1, 0x11, 0xa8, 0xc1, 0x1d, 0x98, 0xa8, 0x42, 0xbb, 0x09, 0xe7, 0x42, 0xad, 0x12, 0x20, 0xc0, 0xab, 0xfe, 0xa5, 0x42, 0xd4, 0x8d, 0xe6, 0x42, 0x3f, 0x35, 0xe2, 0x3f, 0x9d, 0x8f, 0xac, 0x42, 0x42, 0x60, 0xe6, 0x42, 0x3f, 0x00, 0x90, 0xc0, +0x84, 0x80, 0xab, 0x42, 0x0d, 0x42, 0xe6, 0x42, 0x2d, 0x04, 0xea, 0xc0, 0xa6, 0x2a, 0xb1, 0x42, 0xea, 0xe6, 0xe4, 0x42, 0x37, 0x1a, 0xdf, 0xc0, 0xbd, 0x41, 0xaf, 0x42, 0x65, 0x3b, 0xe5, 0x42, 0x82, 0x28, 0x07, 0xc1, 0x64, 0x2a, 0xb0, 0x42, 0xb7, 0xf3, 0xed, 0x42, 0x09, 0xbf, 0x10, 0xc0, 0xba, 0xd8, 0xb5, 0x42, 0x61, 0x65, 0xe2, 0x42, 0x47, 0x03, 0x2d, 0xc1, 0xfb, 0xab, 0xbf, 0x42, 0x79, 0xe9, 0x03, 0x43, 0x3d, 0x0a, 0x47, 0xc1, 0x59, 0xf9, 0x95, 0x42, 0xb3, 0x9d, 0xf1, 0x42, +0x5d, 0x68, 0xc6, 0x40, 0x9e, 0x0d, 0x9d, 0x42, 0x6d, 0xe7, 0xf0, 0x42, 0x84, 0x0d, 0x36, 0xc1, 0x0a, 0x77, 0xab, 0x42, 0xa0, 0x7a, 0x04, 0x43, 0xbf, 0x7d, 0x2c, 0xc1, 0xb4, 0xa8, 0x8e, 0x42, 0x65, 0xbb, 0x09, 0x43, 0x24, 0x06, 0x7e, 0xc1, 0x19, 0xf3, 0x91, 0x42, 0xbb, 0x49, 0x08, 0x43, 0xe4, 0xf2, 0x2a, 0xc1, 0x61, 0x52, 0x8f, 0x42, 0x6b, 0x1c, 0x08, 0x43, 0x09, 0xf9, 0x7e, 0xc1, 0x8e, 0x04, 0x92, 0x42, 0x17, 0xb9, 0x06, 0x43, 0x8d, 0x06, 0x3a, 0xc1, 0xf2, 0x50, 0x94, 0x42, +0x5f, 0x1a, 0x05, 0x43, 0x88, 0xd7, 0xa8, 0xc0, 0xfb, 0x6b, 0x96, 0x42, 0x34, 0xd3, 0x00, 0x43, 0x22, 0x37, 0xb3, 0xbf, 0x61, 0x25, 0x96, 0x42, 0xfb, 0x3e, 0xf4, 0x42, 0x76, 0xc3, 0xc6, 0x40, 0x9c, 0x73, 0x96, 0x42, 0x47, 0x61, 0x00, 0x43, 0x4b, 0x59, 0x30, 0xc0, 0x59, 0xf9, 0x95, 0x42, 0xb3, 0x9d, 0xf1, 0x42, 0x5d, 0x68, 0xc6, 0x40, 0x88, 0x94, 0x94, 0x42, 0x65, 0x3b, 0xed, 0x42, 0x6e, 0x69, 0x0d, 0x41, 0x40, 0x04, 0x94, 0x42, 0x19, 0x44, 0xe4, 0x42, 0xbc, 0xc6, 0xff, 0x40, +0x5e, 0xeb, 0x92, 0x42, 0xab, 0xb1, 0xdc, 0x42, 0xe0, 0x62, 0x9d, 0x40, 0x71, 0xfd, 0x93, 0x42, 0x7b, 0x94, 0xe4, 0x42, 0xe7, 0xfb, 0xdf, 0x40, 0x78, 0x3a, 0x92, 0x42, 0x33, 0xb3, 0xdd, 0x42, 0x07, 0x08, 0x64, 0x40, 0xe8, 0xca, 0x8e, 0x42, 0xa0, 0x5a, 0xd0, 0x42, 0x26, 0xc2, 0x71, 0xc1, 0x82, 0x91, 0x91, 0x42, 0x96, 0xc3, 0xd2, 0x42, 0xae, 0x42, 0xe8, 0xc0, 0x79, 0xe9, 0x8a, 0x42, 0x3a, 0x74, 0xc9, 0x42, 0x1e, 0x85, 0x67, 0xc1, 0x01, 0xbc, 0x94, 0x42, 0x0b, 0x97, 0xea, 0x42, +0x7f, 0x2b, 0xfc, 0x40, 0x71, 0xfd, 0x93, 0x42, 0x7b, 0x94, 0xe4, 0x42, 0xe7, 0xfb, 0xdf, 0x40, 0xa3, 0x01, 0x91, 0x42, 0x2e, 0x72, 0xd8, 0x42, 0xdc, 0x11, 0x06, 0xc0, 0x78, 0x3a, 0x92, 0x42, 0x33, 0xb3, 0xdd, 0x42, 0x07, 0x08, 0x64, 0x40, 0xbd, 0xa3, 0x91, 0x42, 0x29, 0xdc, 0xd5, 0x42, 0x86, 0xc6, 0x77, 0xbf, 0x78, 0x3a, 0x92, 0x42, 0x33, 0xb3, 0xdd, 0x42, 0x07, 0x08, 0x64, 0x40, 0x71, 0xfd, 0x93, 0x42, 0x7b, 0x94, 0xe4, 0x42, 0xe7, 0xfb, 0xdf, 0x40, 0x05, 0x16, 0x92, 0x42, +0x01, 0xc0, 0xd5, 0x42, 0x5f, 0x07, 0x25, 0xc1, 0xe4, 0xa3, 0x90, 0x42, 0x21, 0xf0, 0xd3, 0x42, 0xc1, 0x39, 0x74, 0xc1, 0x8e, 0x04, 0x92, 0x42, 0x17, 0xb9, 0x06, 0x43, 0x8d, 0x06, 0x3a, 0xc1, 0xc8, 0x96, 0x94, 0x42, 0x79, 0xc9, 0x03, 0x43, 0xe9, 0xd4, 0xda, 0xc0, 0xc8, 0x96, 0x94, 0x42, 0x79, 0xc9, 0x03, 0x43, 0xe9, 0xd4, 0xda, 0xc0, 0x9c, 0x73, 0x96, 0x42, 0x47, 0x61, 0x00, 0x43, 0x4b, 0x59, 0x30, 0xc0, 0x59, 0xf9, 0x95, 0x42, 0xb3, 0x9d, 0xf1, 0x42, 0x5d, 0x68, 0xc6, 0x40, +0x01, 0xbc, 0x94, 0x42, 0x0b, 0x97, 0xea, 0x42, 0x7f, 0x2b, 0xfc, 0x40, 0x01, 0xbc, 0x94, 0x42, 0x0b, 0x97, 0xea, 0x42, 0x7f, 0x2b, 0xfc, 0x40, 0x71, 0xfd, 0x93, 0x42, 0x7b, 0x94, 0xe4, 0x42, 0xe7, 0xfb, 0xdf, 0x40, 0x78, 0x3a, 0x92, 0x42, 0x33, 0xb3, 0xdd, 0x42, 0x07, 0x08, 0x64, 0x40, 0xa3, 0x01, 0x91, 0x42, 0x2e, 0x72, 0xd8, 0x42, 0xdc, 0x11, 0x06, 0xc0, 0xa3, 0x01, 0x91, 0x42, 0x2e, 0x72, 0xd8, 0x42, 0xdc, 0x11, 0x06, 0xc0, 0x05, 0x16, 0x92, 0x42, 0x01, 0xc0, 0xd5, 0x42, +0x5f, 0x07, 0x25, 0xc1, 0x2a, 0xe9, 0xa4, 0x42, 0x7b, 0x94, 0xe2, 0x42, 0x23, 0xa1, 0x0b, 0x40, 0xde, 0x24, 0x9f, 0x42, 0xc1, 0x0a, 0xdf, 0x42, 0xa7, 0xe8, 0x50, 0x40, 0xdc, 0xd7, 0x3a, 0xc1, 0x11, 0x58, 0xff, 0x42, 0xd5, 0x56, 0xcc, 0x40, 0xa2, 0x45, 0x3e, 0xc1, 0x3e, 0x4a, 0xf5, 0x42, 0xd7, 0x86, 0xf5, 0x40, 0xb1, 0x2e, 0x43, 0xc1, 0x36, 0xde, 0xfd, 0x42, 0x33, 0x16, 0x8d, 0x40, 0x47, 0x72, 0x42, 0xc1, 0x4a, 0x8c, 0xf4, 0x42, 0x26, 0xc2, 0xd5, 0x40, 0x1e, 0x16, 0x4a, 0xc1, +0xaf, 0x87, 0xfb, 0x42, 0x71, 0xac, 0x27, 0x40, 0x2c, 0xd4, 0x45, 0xc1, 0xb9, 0x5e, 0xf3, 0x42, 0x98, 0xfa, 0xb8, 0x40, 0xef, 0x38, 0x4f, 0xc1, 0x22, 0x70, 0xf8, 0x42, 0x23, 0x2d, 0x8d, 0x3f, 0x44, 0x8b, 0x48, 0xc1, 0x69, 0xd1, 0xf1, 0x42, 0xbb, 0x96, 0xa0, 0x40, 0x10, 0x58, 0x52, 0xc1, 0xee, 0xbc, 0xf4, 0x42, 0xc7, 0x67, 0x92, 0xbd, 0x19, 0x04, 0x4a, 0xc1, 0xbd, 0xf4, 0xef, 0x42, 0x34, 0xba, 0x8d, 0x40, 0xb1, 0x50, 0x53, 0xc1, 0x1d, 0x9a, 0xf0, 0x42, 0x7e, 0x37, 0x59, 0xbf, +0x05, 0x56, 0x4a, 0xc1, 0x42, 0xe0, 0xed, 0x42, 0x88, 0x4b, 0x81, 0x40, 0xb9, 0xfc, 0x51, 0xc1, 0xdc, 0x39, 0xec, 0x42, 0x01, 0x13, 0x98, 0xbf, 0x94, 0x87, 0x49, 0xc1, 0x14, 0xae, 0xeb, 0x42, 0x58, 0xc5, 0x77, 0x40, 0xc3, 0x64, 0x4e, 0xc1, 0xeb, 0xd1, 0xe7, 0x42, 0x3a, 0x75, 0x89, 0xbf, 0xa8, 0xa4, 0x47, 0xc1, 0xd0, 0x77, 0xe9, 0x42, 0xb5, 0x6c, 0x7b, 0x40, 0x8c, 0xb9, 0x44, 0xc1, 0x17, 0x59, 0xe7, 0x42, 0x2e, 0xa8, 0x86, 0x40, 0xfe, 0xb2, 0x48, 0xc1, 0x94, 0x98, 0xe3, 0x42, +0x7c, 0x0b, 0x03, 0xbf, 0xb6, 0xf3, 0x40, 0xc1, 0xfd, 0x69, 0xe5, 0x42, 0x1a, 0x69, 0x96, 0x40, 0xe8, 0x48, 0x41, 0xc1, 0x84, 0xc0, 0xdf, 0x42, 0xf4, 0xc0, 0xef, 0x3e, 0xa8, 0x35, 0x38, 0xc1, 0xea, 0x66, 0xdc, 0x42, 0xc7, 0x0c, 0xf4, 0x3f, 0x20, 0x41, 0x3c, 0xc1, 0x59, 0xb9, 0xe3, 0x42, 0x22, 0xe0, 0xad, 0x40, 0x7a, 0xa5, 0x2b, 0xc1, 0x36, 0x5e, 0xd9, 0x42, 0xe9, 0x60, 0x8b, 0x40, 0xe6, 0xae, 0x35, 0xc1, 0x19, 0x44, 0xe2, 0x42, 0x80, 0x43, 0xd4, 0x40, 0xa8, 0xa4, 0x22, 0xc1, +0x26, 0x86, 0xd8, 0x42, 0xff, 0xe7, 0xc6, 0x40, 0xa5, 0x2c, 0x31, 0xc1, 0x15, 0xee, 0xe1, 0x42, 0x36, 0x71, 0xf2, 0x40, 0x72, 0xf9, 0x2c, 0xc1, 0x94, 0x98, 0x04, 0x43, 0x85, 0x3d, 0x9e, 0x40, 0x4b, 0x59, 0x39, 0xc1, 0x83, 0x80, 0x03, 0x43, 0x15, 0x00, 0x01, 0x40, 0xc5, 0x8f, 0x43, 0xc1, 0xde, 0xc4, 0x01, 0x43, 0x86, 0x8d, 0x22, 0xbf, 0x99, 0x2a, 0x4b, 0xc1, 0x40, 0xf5, 0xfe, 0x42, 0xbe, 0x82, 0x38, 0xc0, 0xc1, 0xca, 0x4f, 0xc1, 0xdc, 0x79, 0xf9, 0x42, 0x84, 0xf0, 0x93, 0xc0, +0x92, 0x3a, 0x51, 0xc1, 0x17, 0x59, 0xf3, 0x42, 0x08, 0xc9, 0xb8, 0xc0, 0xad, 0x69, 0x4f, 0xc1, 0xad, 0xdc, 0xec, 0x42, 0x95, 0x09, 0xc9, 0xc0, 0x09, 0x68, 0x4a, 0xc1, 0xeb, 0x51, 0xe6, 0x42, 0xd7, 0xf5, 0xc3, 0xc0, 0x1f, 0x63, 0x42, 0xc1, 0x38, 0x09, 0xe0, 0x42, 0xe8, 0x9f, 0xa9, 0xc0, 0x38, 0x67, 0x37, 0xc1, 0x05, 0x56, 0xda, 0x42, 0x0e, 0xb9, 0x75, 0xc0, 0x0f, 0x2d, 0x2a, 0xc1, 0x55, 0x63, 0xd5, 0x42, 0xbb, 0x27, 0xdf, 0xbf, 0x00, 0x35, 0x17, 0xc1, 0x51, 0xcd, 0xd0, 0x42, +0x9f, 0x1f, 0xfa, 0x3f, 0xa4, 0xeb, 0x09, 0xc1, 0xf6, 0x68, 0xcf, 0x42, 0xfc, 0xa4, 0x97, 0x40, 0xde, 0x3c, 0x15, 0xc1, 0x1d, 0x5a, 0x09, 0x43, 0xd7, 0x12, 0x58, 0x40, 0x0c, 0x71, 0x25, 0xc1, 0x44, 0xeb, 0x07, 0x43, 0xf6, 0x08, 0xed, 0xbe, 0xcf, 0xd5, 0x32, 0xc1, 0xe4, 0xa5, 0x05, 0x43, 0x8f, 0xfc, 0x7b, 0xc0, 0xcd, 0xcc, 0x3c, 0xc1, 0x61, 0xa5, 0x02, 0x43, 0x5f, 0x41, 0xdc, 0xc0, 0xa4, 0xdf, 0x42, 0xc1, 0xa7, 0x1b, 0xfe, 0x42, 0x1b, 0x9e, 0x12, 0xc1, 0xb1, 0xbf, 0x44, 0xc1, +0xf9, 0x13, 0xf6, 0x42, 0x48, 0xbf, 0x2a, 0xc1, 0xfa, 0x5c, 0x42, 0xc1, 0xf9, 0x93, 0xed, 0x42, 0x66, 0x66, 0x35, 0xc1, 0xe5, 0xd0, 0x3b, 0xc1, 0x07, 0x01, 0xe5, 0x42, 0x12, 0x14, 0x32, 0xc1, 0xad, 0x69, 0x31, 0xc1, 0x0d, 0xc2, 0xdc, 0x42, 0xbf, 0xec, 0x20, 0xc1, 0x75, 0x02, 0x23, 0xc1, 0x4a, 0x4c, 0xd5, 0x42, 0x9f, 0x0e, 0x02, 0xc1, 0x3f, 0xd2, 0x11, 0xc1, 0x7c, 0xd4, 0xce, 0x42, 0x44, 0xa3, 0xac, 0xc0, 0xdc, 0xef, 0xf1, 0xc0, 0xe8, 0xfb, 0xc8, 0x42, 0x83, 0xa7, 0x20, 0xbf, +0x75, 0x71, 0xce, 0xc0, 0x7e, 0xff, 0xc6, 0x42, 0x23, 0xd6, 0x3c, 0x40, 0xbf, 0xec, 0xe7, 0xc0, 0xfa, 0xde, 0x0d, 0x43, 0xe3, 0xc2, 0xd9, 0x3f, 0x00, 0xc6, 0x07, 0xc1, 0x77, 0x1e, 0x0c, 0x43, 0x6f, 0x7c, 0x3f, 0xc0, 0xde, 0x24, 0x18, 0xc1, 0x11, 0x58, 0x09, 0x43, 0xad, 0x9e, 0xe7, 0xc0, 0x8f, 0x53, 0x24, 0xc1, 0x8c, 0xac, 0x05, 0x43, 0x5d, 0x6d, 0x2d, 0xc1, 0x0e, 0xbe, 0x2b, 0xc1, 0x73, 0x48, 0x01, 0x43, 0x32, 0x08, 0x5a, 0xc1, 0x0f, 0x0b, 0x2e, 0xc1, 0x01, 0xc0, 0xf8, 0x42, +0xf0, 0x85, 0x77, 0xc1, 0xf3, 0x1f, 0x2b, 0xc1, 0xa7, 0x5b, 0xee, 0x42, 0x3f, 0x46, 0x82, 0xc1, 0xe6, 0x1d, 0x23, 0xc1, 0x47, 0xe1, 0xe3, 0x42, 0x70, 0x3d, 0x80, 0xc1, 0x7b, 0x14, 0x16, 0xc1, 0xff, 0xd4, 0xd9, 0x42, 0x12, 0x14, 0x6b, 0xc1, 0xc2, 0xd8, 0x03, 0xc1, 0xeb, 0xd1, 0xd0, 0x42, 0x21, 0x1f, 0x44, 0xc1, 0x5d, 0xf9, 0xd9, 0xc0, 0x99, 0x19, 0xc9, 0x42, 0x09, 0x8a, 0x0a, 0xc1, 0xf8, 0x31, 0xa2, 0xc0, 0xda, 0x6a, 0xc2, 0x42, 0x78, 0x0b, 0x5e, 0xc0, 0xf9, 0xd5, 0x6e, 0xc0, +0xd0, 0x64, 0xbf, 0x42, 0x79, 0x5c, 0x7c, 0x3f, 0x9c, 0x4b, 0x93, 0xc0, 0x46, 0x16, 0x12, 0x43, 0x3c, 0xf7, 0x5e, 0xbd, 0x61, 0x89, 0xc1, 0xc0, 0xc1, 0x0a, 0x10, 0x43, 0x06, 0x0d, 0xb1, 0xc0, 0x60, 0xc8, 0xe7, 0xc0, 0x50, 0xcd, 0x0c, 0x43, 0x2c, 0xd4, 0x27, 0xc1, 0x61, 0x1a, 0x02, 0xc1, 0xde, 0x84, 0x08, 0x43, 0x58, 0x17, 0x6b, 0xc1, 0x41, 0xc3, 0x0a, 0xc1, 0x9c, 0x64, 0x03, 0x43, 0x12, 0x94, 0x8f, 0xc1, 0x9f, 0x71, 0x0d, 0xc1, 0xf9, 0x53, 0xfb, 0x42, 0x2f, 0xcc, 0xa0, 0xc1, +0xfe, 0x09, 0x0a, 0xc1, 0xb1, 0x32, 0xef, 0x42, 0x2c, 0x65, 0xa8, 0xc1, 0xdd, 0xb0, 0x00, 0xc1, 0xc9, 0xf6, 0xe2, 0x42, 0xf0, 0x05, 0xa6, 0xc1, 0xc2, 0xc0, 0xe2, 0xc0, 0x01, 0x40, 0xd7, 0x42, 0x3e, 0x68, 0x99, 0xc1, 0xba, 0xf2, 0xb8, 0xc0, 0xbd, 0xb4, 0xcc, 0x42, 0x92, 0xdc, 0x82, 0xc1, 0x38, 0x10, 0x84, 0xc0, 0x2c, 0xa5, 0xc3, 0x42, 0x2e, 0x6e, 0x44, 0xc1, 0x67, 0x44, 0xf1, 0xbf, 0xfc, 0xe7, 0xbb, 0x42, 0xda, 0x55, 0xcc, 0xc0, 0xf7, 0x77, 0xf6, 0xbe, 0xb6, 0xa2, 0xb7, 0x42, +0x7a, 0xc4, 0x00, 0xbf, 0xec, 0x2f, 0xb7, 0xbf, 0x63, 0xf0, 0x15, 0x43, 0x91, 0xd0, 0xee, 0xbf, 0xb9, 0xfc, 0x43, 0xc0, 0x8a, 0xa1, 0x13, 0x43, 0xb0, 0xc9, 0x00, 0xc1, 0x80, 0x26, 0x8d, 0xc0, 0x59, 0xf9, 0x0f, 0x43, 0x3b, 0x4e, 0x5a, 0xc1, 0x63, 0x40, 0xad, 0xc0, 0x96, 0x23, 0x0b, 0x43, 0x15, 0x1d, 0x93, 0xc1, 0x20, 0xcd, 0xc0, 0xc0, 0x5f, 0x5a, 0x05, 0x43, 0x62, 0x7f, 0xb0, 0xc1, 0xfd, 0xd9, 0xc6, 0xc0, 0xa3, 0xc5, 0xfd, 0x42, 0x69, 0xef, 0xc3, 0xc1, 0x06, 0x2a, 0xbf, 0xc0, +0x7b, 0x14, 0xf0, 0x42, 0x13, 0x83, 0xcc, 0xc1, 0x5e, 0x0c, 0xaa, 0xc0, 0xa2, 0x45, 0xe2, 0x42, 0xc9, 0xd4, 0xc9, 0xc1, 0xe2, 0x1e, 0x88, 0xc0, 0x9c, 0x04, 0xd5, 0x42, 0x20, 0xd2, 0xbb, 0xc1, 0x8d, 0x23, 0x34, 0xc0, 0x2c, 0x07, 0xc9, 0x42, 0x92, 0xdc, 0xa2, 0xc1, 0x08, 0x77, 0x5b, 0xbf, 0x8d, 0xc6, 0xbe, 0x42, 0x92, 0xcb, 0x7e, 0xc1, 0x0e, 0x86, 0xe2, 0x3e, 0xc3, 0x04, 0xb7, 0x42, 0x31, 0x7c, 0x34, 0x40, 0xd4, 0x26, 0x0e, 0x40, 0xfa, 0x5e, 0x19, 0x43, 0x72, 0x2e, 0x6d, 0xc0, +0xfe, 0xed, 0xda, 0x3e, 0xfe, 0xd4, 0x16, 0x43, 0x12, 0x14, 0x28, 0xc1, 0x6e, 0x12, 0x87, 0xbf, 0xe0, 0xcf, 0x12, 0x43, 0x83, 0x40, 0x85, 0xc1, 0xb3, 0x24, 0x0a, 0xc0, 0xfa, 0x7e, 0x0d, 0x43, 0xbf, 0xfd, 0xae, 0xc1, 0x33, 0x16, 0x35, 0xc0, 0x4e, 0x22, 0x07, 0x43, 0x98, 0x4c, 0xcf, 0xc1, 0xce, 0x6b, 0x42, 0xc0, 0x25, 0x06, 0x00, 0x43, 0x9f, 0xab, 0xe4, 0xc1, 0xf6, 0x7a, 0x31, 0xc0, 0x78, 0xfe, 0xf0, 0x42, 0x02, 0x1a, 0xee, 0xc1, 0x0c, 0x1f, 0x03, 0xc0, 0xe0, 0xcf, 0xe1, 0x42, +0x52, 0x27, 0xeb, 0xc1, 0x07, 0xb7, 0x65, 0xbf, 0x46, 0x36, 0xd3, 0x42, 0x94, 0xf6, 0xdb, 0xc1, 0x02, 0x7f, 0x28, 0x3f, 0xb2, 0xfd, 0xc5, 0x42, 0x5a, 0xe4, 0xc0, 0xc1, 0x33, 0xdc, 0x2a, 0x40, 0x2c, 0x74, 0xbb, 0x42, 0x30, 0x19, 0x9e, 0xc1, 0x49, 0x9d, 0xc9, 0x40, 0xfe, 0x54, 0x1c, 0x43, 0x93, 0x8c, 0xb1, 0xc0, 0x4d, 0xdb, 0x8b, 0x40, 0x1d, 0x9a, 0x19, 0x43, 0x13, 0xd0, 0x4d, 0xc1, 0x1b, 0x99, 0x31, 0x40, 0x67, 0x46, 0x15, 0x43, 0x57, 0xdb, 0x9b, 0xc1, 0xdd, 0x59, 0xcb, 0x3f, +0x56, 0x8e, 0x0f, 0x43, 0x61, 0xc3, 0xc8, 0xc1, 0xfa, 0xd4, 0x5d, 0x3f, 0x05, 0xb6, 0x08, 0x43, 0xf6, 0x86, 0xeb, 0xc1, 0x02, 0x83, 0x24, 0x3f, 0x9e, 0x0f, 0x01, 0x43, 0x41, 0x42, 0x01, 0xc2, 0x05, 0x34, 0x6d, 0x3f, 0x0f, 0xed, 0xf1, 0x42, 0x4c, 0x55, 0x06, 0xc2, 0xe2, 0x70, 0xda, 0x3f, 0x8e, 0x97, 0xe1, 0x42, 0x14, 0xbf, 0x04, 0xc2, 0x12, 0x83, 0x3c, 0x40, 0xcb, 0xe1, 0xd1, 0x42, 0xea, 0x26, 0xf9, 0xc1, 0x67, 0x96, 0x94, 0x40, 0x2d, 0xe1, 0xc3, 0x42, 0x92, 0xed, 0xdb, 0xc1, +0x6a, 0x30, 0xd6, 0x40, 0xa6, 0xca, 0xb9, 0x42, 0x53, 0xb8, 0xbb, 0xc1, 0x09, 0xf9, 0x2b, 0x41, 0xae, 0xc7, 0x1e, 0x43, 0x77, 0xb9, 0xeb, 0xc0, 0x87, 0x5c, 0x0b, 0x41, 0x61, 0xe5, 0x1b, 0x43, 0x19, 0x73, 0x71, 0xc1, 0x78, 0xd1, 0xe0, 0x40, 0xf8, 0x53, 0x17, 0x43, 0xd7, 0xa3, 0xb0, 0xc1, 0xc0, 0xb2, 0xb8, 0x40, 0xfc, 0x49, 0x11, 0x43, 0xc5, 0x0f, 0xe0, 0xc1, 0xe3, 0x4e, 0xa0, 0x40, 0x9e, 0x0f, 0x0a, 0x43, 0xff, 0x61, 0x02, 0xc2, 0x66, 0xbd, 0x98, 0x40, 0xa6, 0xfb, 0x01, 0x43, +0x3f, 0x86, 0x0e, 0xc2, 0x36, 0x59, 0xa2, 0x40, 0xad, 0xdc, 0xf2, 0x42, 0x62, 0xe1, 0x13, 0xc2, 0x35, 0xb5, 0xbc, 0x40, 0x30, 0x9d, 0xe1, 0x42, 0x6e, 0x34, 0x12, 0xc2, 0x47, 0x8f, 0xe6, 0x40, 0xa9, 0x06, 0xd1, 0x42, 0xdd, 0x93, 0x09, 0xc2, 0xb5, 0xe0, 0x10, 0x41, 0xc2, 0x95, 0xc2, 0x42, 0xb1, 0x72, 0xf4, 0xc1, 0x7f, 0xd9, 0x33, 0x41, 0x51, 0x29, 0xb9, 0x42, 0x86, 0xc9, 0xd7, 0xc1, 0x66, 0xf7, 0x77, 0x41, 0x92, 0xad, 0x20, 0x43, 0xa1, 0x21, 0x12, 0xc1, 0xda, 0x1b, 0x56, 0x41, +0x1b, 0xaf, 0x1d, 0x43, 0xd3, 0x3c, 0x89, 0xc1, 0x15, 0x1d, 0x3a, 0x41, 0xa4, 0xf0, 0x18, 0x43, 0xcc, 0x4c, 0xc3, 0xc1, 0x5e, 0x4b, 0x25, 0x41, 0x44, 0xab, 0x12, 0x43, 0x6b, 0x89, 0xf4, 0xc1, 0xc9, 0x9f, 0x18, 0x41, 0xbb, 0x29, 0x0b, 0x43, 0x46, 0x54, 0x0d, 0xc2, 0x8b, 0xb2, 0x14, 0x41, 0x67, 0xc6, 0x02, 0x43, 0x00, 0xef, 0x19, 0xc2, 0x1c, 0xb1, 0x19, 0x41, 0x3e, 0xca, 0xf3, 0x42, 0x48, 0x7f, 0x1f, 0xc2, 0x9e, 0x5e, 0x27, 0x41, 0xc5, 0xe0, 0xe1, 0x42, 0x5b, 0xc2, 0x1d, 0xc2, +0x37, 0x1a, 0x3d, 0x41, 0xea, 0xa6, 0xd0, 0x42, 0xcd, 0xcc, 0x14, 0xc2, 0xd8, 0xf0, 0x60, 0x41, 0x1e, 0xe7, 0xc1, 0x42, 0x05, 0x63, 0x05, 0xc2, 0xaf, 0x25, 0x85, 0x41, 0xeb, 0xf1, 0xb8, 0x42, 0x3f, 0xc6, 0xef, 0xc1, 0x9d, 0x6f, 0xb8, 0x41, 0xad, 0x5c, 0x22, 0x43, 0x19, 0xe2, 0x39, 0xc1, 0x2e, 0x10, 0xa7, 0x41, 0xfc, 0x49, 0x1f, 0x43, 0x51, 0xc9, 0x9e, 0xc1, 0x61, 0xb2, 0x98, 0x41, 0xc7, 0x6b, 0x1a, 0x43, 0xa4, 0x5f, 0xda, 0xc1, 0x1e, 0x05, 0x8e, 0x41, 0x6b, 0xfc, 0x13, 0x43, +0x9c, 0x73, 0x06, 0xc2, 0x7b, 0x83, 0x87, 0x41, 0xb5, 0x48, 0x0c, 0x43, 0xf2, 0x01, 0x1a, 0xc2, 0x2e, 0x7f, 0x85, 0x41, 0xcd, 0xac, 0x03, 0x43, 0xab, 0xf1, 0x26, 0xc2, 0x28, 0x0f, 0x88, 0x41, 0x42, 0x20, 0xf5, 0x42, 0x1e, 0xa7, 0x2c, 0xc2, 0x18, 0x15, 0x8f, 0x41, 0xfb, 0xbe, 0xe2, 0x42, 0x1b, 0xde, 0x2a, 0xc2, 0x99, 0x3b, 0x9a, 0x41, 0xec, 0x11, 0xd1, 0x42, 0x8b, 0xac, 0x21, 0xc2, 0x4f, 0xaf, 0xa9, 0x41, 0x7a, 0x05, 0xc2, 0x42, 0x1b, 0x0d, 0x11, 0xc2, 0x29, 0x5c, 0xbb, 0x41, +0x07, 0x6e, 0xb9, 0x42, 0x25, 0xa4, 0x01, 0xc2, 0xc0, 0xdb, 0xf6, 0x41, 0xcf, 0xd7, 0x22, 0x43, 0xa3, 0x01, 0x5e, 0xc1, 0xe7, 0x8c, 0xe5, 0x41, 0xf0, 0xc7, 0x1f, 0x43, 0x43, 0x9c, 0xb0, 0xc1, 0x76, 0x3e, 0xd7, 0x41, 0x56, 0xee, 0x1a, 0x43, 0x78, 0xfa, 0xeb, 0xc1, 0xc3, 0x64, 0xdf, 0x41, 0xbf, 0xbf, 0x14, 0x43, 0xd3, 0x0d, 0x11, 0xc2, 0x02, 0xab, 0xd6, 0x41, 0x61, 0xe5, 0x0d, 0x43, 0xc1, 0xa8, 0x21, 0xc2, 0xe1, 0x0b, 0xd9, 0x41, 0x2b, 0x67, 0x06, 0x43, 0x8a, 0x9f, 0x2c, 0xc2, +0x64, 0xaa, 0xc6, 0x41, 0x47, 0x61, 0xf6, 0x42, 0x59, 0x39, 0x35, 0xc2, 0x8d, 0xa8, 0xcd, 0x41, 0xe6, 0x10, 0xe4, 0x42, 0xc4, 0x71, 0x33, 0xc2, 0x9c, 0xc4, 0xd8, 0x41, 0x3a, 0x74, 0xd2, 0x42, 0x9a, 0x48, 0x2a, 0xc2, 0xe6, 0xd0, 0xe7, 0x41, 0x9e, 0x8d, 0xc3, 0x42, 0xea, 0x44, 0x19, 0xc2, 0x7b, 0x14, 0xf8, 0x41, 0x0e, 0x5c, 0xba, 0x42, 0x1a, 0x00, 0x07, 0xc2, 0xc3, 0x64, 0x10, 0x42, 0x1d, 0x5a, 0x22, 0x43, 0xfc, 0x18, 0x73, 0xc1, 0x28, 0xed, 0x07, 0x42, 0xa6, 0x5b, 0x1f, 0x43, +0x17, 0xb7, 0xb9, 0xc1, 0xc8, 0x87, 0x05, 0x42, 0xd8, 0x03, 0x1a, 0x43, 0xcf, 0xe6, 0xff, 0xc1, 0x68, 0xa2, 0xf9, 0x41, 0x11, 0x98, 0xff, 0x42, 0x54, 0xc1, 0x34, 0xc2, 0x13, 0x72, 0x08, 0x42, 0x7a, 0x29, 0xec, 0x42, 0x92, 0xdc, 0x3a, 0xc2, 0x94, 0x18, 0x0d, 0x42, 0x80, 0xea, 0xd5, 0x42, 0xc4, 0xe0, 0x32, 0xc2, 0xce, 0x88, 0x13, 0x42, 0x85, 0x9a, 0xc6, 0x42, 0x7c, 0xe1, 0x1d, 0xc2, 0x14, 0xbf, 0x1b, 0x42, 0xa9, 0x86, 0xbc, 0x42, 0x5f, 0x18, 0x07, 0xc2, 0xa1, 0x16, 0x25, 0x42, +0xd1, 0x42, 0x21, 0x43, 0x33, 0xc4, 0x82, 0xc1, 0xf7, 0x35, 0x1e, 0x42, 0x84, 0x40, 0x1d, 0x43, 0x3a, 0x12, 0xda, 0xc1, 0xae, 0x36, 0x39, 0x42, 0x40, 0x95, 0x1f, 0x43, 0xc8, 0x87, 0x8a, 0xc1, 0x9b, 0x66, 0x33, 0x42, 0xa0, 0xda, 0x1c, 0x43, 0x62, 0xa1, 0xd1, 0xc1, 0x64, 0xea, 0x2b, 0x42, 0x98, 0x2e, 0xd9, 0x42, 0x83, 0x2f, 0x35, 0xc2, 0x98, 0x4c, 0x2a, 0x42, 0xc1, 0x0a, 0xeb, 0x42, 0x04, 0xc5, 0x3a, 0xc2, 0x07, 0x01, 0x32, 0x42, 0xea, 0xe6, 0xc9, 0x42, 0x8c, 0x79, 0x22, 0xc2, +0xfc, 0x29, 0x3d, 0x42, 0xa6, 0xbb, 0xbd, 0x42, 0x0b, 0xb5, 0x05, 0xc2, 0x92, 0x7a, 0x4c, 0x42, 0x52, 0x58, 0x1d, 0x43, 0x23, 0xb9, 0x90, 0xc1, 0xa7, 0xe8, 0x47, 0x42, 0x88, 0x36, 0x1b, 0x43, 0xb8, 0x9e, 0xca, 0xc1, 0x00, 0xde, 0x42, 0x42, 0x09, 0xec, 0xdb, 0x42, 0xfa, 0x5c, 0x30, 0xc2, 0xd7, 0xd2, 0x40, 0x42, 0x80, 0x6a, 0xeb, 0x42, 0x78, 0x0b, 0x37, 0xc2, 0x5d, 0x6d, 0x49, 0x42, 0x9c, 0x04, 0xcd, 0x42, 0xa6, 0x1b, 0x20, 0xc2, 0x49, 0xee, 0x55, 0x42, 0x5c, 0x7e, 0xc1, 0x42, +0x6b, 0xab, 0x03, 0xc2, 0x65, 0x99, 0x5e, 0x42, 0xf8, 0x93, 0x1a, 0x43, 0x20, 0x41, 0x95, 0xc1, 0x15, 0x5d, 0x5b, 0x42, 0x5b, 0x64, 0x18, 0x43, 0x7d, 0x9d, 0xc8, 0xc1, 0xbf, 0x7d, 0x56, 0x42, 0xb7, 0xb3, 0xde, 0x42, 0x28, 0x2d, 0x25, 0xc2, 0x46, 0x25, 0x53, 0x42, 0x03, 0x6b, 0xec, 0x42, 0x4b, 0x08, 0x2d, 0xc2, 0x17, 0xf7, 0x5c, 0x42, 0xe0, 0x4f, 0xd1, 0x42, 0xad, 0x29, 0x18, 0xc2, 0x12, 0xf2, 0x6a, 0x42, 0xa4, 0xf0, 0xc6, 0x42, 0xc5, 0x8f, 0xfe, 0xc1, 0x7c, 0x50, 0x6f, 0x42, +0xb1, 0x52, 0x17, 0x43, 0xff, 0x10, 0x98, 0xc1, 0x2c, 0x43, 0x6c, 0x42, 0x54, 0xe3, 0x14, 0x43, 0xbc, 0x63, 0xc8, 0xc1, 0x64, 0x8c, 0x6a, 0x42, 0x44, 0x4b, 0xe1, 0x42, 0x63, 0xdd, 0x14, 0xc2, 0x1c, 0x6b, 0x69, 0x42, 0x6b, 0x7c, 0xed, 0x42, 0xa4, 0x1f, 0x19, 0xc2, 0xcf, 0x15, 0x70, 0x42, 0x4c, 0xb7, 0xd8, 0x42, 0xcb, 0x61, 0x09, 0xc2, 0x13, 0xa1, 0x7e, 0x42, 0xf8, 0x53, 0xce, 0x42, 0xde, 0xf1, 0xec, 0xc1, 0x6f, 0xb0, 0x77, 0x42, 0x1e, 0x56, 0xc1, 0x42, 0x70, 0xce, 0xba, 0xc1, +0x09, 0x79, 0x85, 0x42, 0x15, 0x6e, 0xca, 0x42, 0xdd, 0xa4, 0xb9, 0xc1, 0x65, 0x3b, 0x63, 0x42, 0x9b, 0xb5, 0xba, 0x42, 0x8a, 0x9f, 0xba, 0xc1, 0x34, 0xb1, 0x80, 0x42, 0x9c, 0x64, 0x11, 0x43, 0xde, 0x02, 0xa1, 0xc1, 0xf4, 0x2c, 0x7d, 0x42, 0xc7, 0x2b, 0x10, 0x43, 0xf4, 0xdb, 0xc1, 0xc1, 0xd0, 0xf3, 0x84, 0x42, 0xa0, 0x9a, 0x0d, 0x43, 0xad, 0xe9, 0xa6, 0xc1, 0x0b, 0xe4, 0x88, 0x42, 0xc1, 0x4a, 0x0a, 0x43, 0x98, 0x3b, 0xac, 0xc1, 0x86, 0x6b, 0x36, 0x42, 0x63, 0x70, 0x09, 0x43, +0x35, 0xaf, 0x19, 0xc2, 0x1a, 0x91, 0x33, 0x42, 0xc7, 0x2b, 0x0b, 0x43, 0xa6, 0xdb, 0x16, 0xc2, 0x6f, 0x92, 0x3f, 0x42, 0x6b, 0xdc, 0x0a, 0x43, 0xdc, 0xf9, 0x17, 0xc2, 0x50, 0x0d, 0x3c, 0x42, 0x0b, 0x37, 0x0c, 0x43, 0x23, 0x79, 0x15, 0xc2, 0x72, 0xb9, 0x2d, 0x42, 0x75, 0x73, 0x0a, 0x43, 0x07, 0x5f, 0x17, 0xc2, 0xb6, 0x22, 0x30, 0x42, 0xbf, 0x3f, 0x08, 0x43, 0x9a, 0x77, 0x1a, 0xc2, 0xea, 0xc4, 0x32, 0x42, 0xf8, 0xd3, 0x0c, 0x43, 0x7b, 0x72, 0x13, 0xc2, 0x24, 0x68, 0x2e, 0x42, +0x63, 0x90, 0x0c, 0x43, 0x73, 0x46, 0x13, 0xc2, 0xea, 0x84, 0x39, 0x42, 0x84, 0x60, 0x0d, 0x43, 0x49, 0xcc, 0x12, 0xc2, 0x6f, 0x92, 0x3f, 0x42, 0xe6, 0x50, 0x06, 0x43, 0xc4, 0x82, 0x1c, 0xc2, 0xcc, 0x9d, 0x3a, 0x42, 0x7f, 0xca, 0x07, 0x43, 0xb0, 0xb2, 0x1b, 0xc2, 0xad, 0x9c, 0x47, 0x42, 0xa6, 0xfb, 0x07, 0x43, 0xa2, 0x05, 0x1b, 0xc2, 0xf6, 0x97, 0x43, 0x42, 0xfc, 0x69, 0x09, 0x43, 0x6b, 0xda, 0x19, 0xc2, 0x12, 0x94, 0x34, 0x42, 0xfa, 0x3e, 0x06, 0x43, 0x65, 0x3b, 0x1c, 0xc2, +0xb9, 0x6b, 0x3a, 0x42, 0xf0, 0xa7, 0x04, 0x43, 0x5b, 0xa0, 0x1c, 0xc2, 0xa9, 0x82, 0x49, 0x42, 0x4e, 0x22, 0x04, 0x43, 0xad, 0x7a, 0x1a, 0xc2, 0x57, 0xac, 0x44, 0x42, 0x75, 0x13, 0x05, 0x43, 0x33, 0xf3, 0x1b, 0xc2, 0xb6, 0xa2, 0x4d, 0x42, 0xe4, 0x65, 0x05, 0x43, 0x55, 0x5f, 0x1a, 0xc2, 0xf3, 0x0e, 0x4b, 0x42, 0xe8, 0x9b, 0x06, 0x43, 0xf9, 0x20, 0x1b, 0xc2, 0x69, 0x00, 0x41, 0x42, 0x27, 0x91, 0x03, 0x43, 0x84, 0xbc, 0x1b, 0xc2, 0xa7, 0x57, 0x47, 0x42, 0x94, 0xd8, 0x02, 0x43, +0xc2, 0xc6, 0x19, 0xc2, 0x0e, 0xbe, 0x4d, 0x42, 0xe8, 0x9b, 0x03, 0x43, 0x0f, 0xad, 0x18, 0xc2, 0x02, 0xda, 0x4e, 0x42, 0xee, 0x7c, 0x04, 0x43, 0x25, 0x86, 0x19, 0xc2, 0x0a, 0x17, 0x52, 0x42, 0x00, 0xc0, 0x03, 0x43, 0x44, 0xe9, 0x16, 0xc2, 0x77, 0xad, 0x51, 0x42, 0x6f, 0x72, 0x04, 0x43, 0x87, 0x56, 0x18, 0xc2, 0x36, 0x3c, 0x4d, 0x42, 0xb1, 0x92, 0x02, 0x43, 0x7e, 0x8c, 0x17, 0xc2, 0xbc, 0xc5, 0x52, 0x42, 0xdc, 0xd9, 0x02, 0x43, 0x8e, 0x35, 0x15, 0xc2, 0x15, 0x4c, 0x58, 0x42, +0x77, 0xde, 0x05, 0x43, 0x99, 0xaa, 0x14, 0xc2, 0x74, 0xa4, 0x5b, 0x42, 0xc9, 0x36, 0x05, 0x43, 0x43, 0x1c, 0x11, 0xc2, 0x24, 0xe8, 0x55, 0x42, 0xaa, 0x91, 0x04, 0x43, 0x56, 0x8e, 0x15, 0xc2, 0x8c, 0xb9, 0x57, 0x42, 0x5b, 0xc4, 0x03, 0x43, 0x84, 0x0d, 0x13, 0xc2, 0x48, 0xff, 0x53, 0x42, 0x52, 0x18, 0x05, 0x43, 0x17, 0xb7, 0x17, 0xc2, 0x3a, 0x81, 0x53, 0x42, 0x88, 0x16, 0x06, 0x43, 0xca, 0x32, 0x18, 0xc2, 0x13, 0x03, 0x59, 0x42, 0x7d, 0x7f, 0x07, 0x43, 0x05, 0x74, 0x13, 0xc2, +0x78, 0x7a, 0x52, 0x42, 0xa0, 0x7a, 0x07, 0x43, 0xa9, 0x13, 0x18, 0xc2, 0x9c, 0xe2, 0x57, 0x42, 0x7d, 0x3f, 0x09, 0x43, 0xf5, 0xca, 0x11, 0xc2, 0x61, 0x43, 0x50, 0x42, 0x3c, 0xff, 0x08, 0x43, 0x35, 0x2f, 0x17, 0xc2, 0x63, 0x9d, 0x5d, 0x42, 0x67, 0x06, 0x09, 0x43, 0xc4, 0xb1, 0x0c, 0xc2, 0x9b, 0xd5, 0x5d, 0x42, 0x73, 0x08, 0x07, 0x43, 0xce, 0x08, 0x0f, 0xc2, 0xab, 0xed, 0x54, 0x42, 0xa6, 0xfb, 0x0a, 0x43, 0xf1, 0xf4, 0x0f, 0xc2, 0x8a, 0xdf, 0x4c, 0x42, 0xd1, 0x82, 0x0a, 0x43, +0xa2, 0xa3, 0x15, 0xc2, 0x93, 0x58, 0x50, 0x42, 0x94, 0x98, 0x0c, 0x43, 0x4c, 0x37, 0x0e, 0xc2, 0xbd, 0xc1, 0x48, 0x42, 0xb7, 0xf3, 0x0b, 0x43, 0x0f, 0xdc, 0x13, 0xc2, 0x4a, 0x8c, 0x55, 0x42, 0xc5, 0xe0, 0x0c, 0x43, 0xef, 0xc9, 0x08, 0xc2, 0xdc, 0xc6, 0x5a, 0x42, 0x61, 0x05, 0x0b, 0x43, 0x4f, 0x6f, 0x0a, 0xc2, 0x05, 0xd6, 0x4a, 0x42, 0x0f, 0xed, 0x0d, 0x43, 0x8a, 0x9f, 0x0c, 0xc2, 0xde, 0x71, 0x44, 0x42, 0x75, 0x33, 0x0d, 0x43, 0x84, 0xbc, 0x11, 0xc2, 0x0d, 0x0f, 0x45, 0x42, +0x00, 0xe0, 0x0e, 0x43, 0xe0, 0x5c, 0x0b, 0xc2, 0x75, 0xb1, 0x40, 0x42, 0xa4, 0x30, 0x0e, 0x43, 0xeb, 0xa2, 0x0f, 0xc2, 0x3e, 0x39, 0x47, 0x42, 0x2e, 0x52, 0x0f, 0x43, 0xb8, 0x6f, 0x07, 0xc2, 0x0f, 0xba, 0x4e, 0x42, 0xdc, 0x59, 0x0e, 0x43, 0xec, 0xc0, 0x07, 0xc2, 0x87, 0x56, 0x3f, 0x42, 0x44, 0x4b, 0x0f, 0x43, 0x7a, 0x25, 0x0b, 0xc2, 0x52, 0x67, 0x3e, 0x42, 0xf4, 0xdd, 0x0e, 0x43, 0x78, 0xcb, 0x0d, 0xc2, 0x93, 0x69, 0x39, 0x42, 0x50, 0x0d, 0x0f, 0x43, 0x44, 0xe9, 0x0c, 0xc2, +0xd6, 0x74, 0x3a, 0x42, 0xf6, 0xc8, 0x0e, 0x43, 0x8e, 0xa4, 0x0e, 0xc2, 0x9e, 0x4d, 0x38, 0x42, 0x46, 0x56, 0x0f, 0x43, 0xde, 0xf1, 0x0a, 0xc2, 0x8a, 0xc1, 0x3f, 0x42, 0xb1, 0xb2, 0x0f, 0x43, 0xf3, 0x4e, 0x08, 0xc2, 0x85, 0xab, 0x34, 0x42, 0xea, 0x26, 0x0e, 0x43, 0xfb, 0xfa, 0x0f, 0xc2, 0xc7, 0xcb, 0x37, 0x42, 0xe4, 0x25, 0x0e, 0x43, 0x45, 0xc7, 0x10, 0xc2, 0xf4, 0xfd, 0x31, 0x42, 0x5b, 0x44, 0x0e, 0x43, 0x9c, 0xf3, 0x0e, 0xc2, 0x97, 0x2e, 0x27, 0x42, 0x77, 0x1e, 0x08, 0x43, +0xe8, 0x08, 0x24, 0xc2, 0x8d, 0x68, 0x2b, 0x42, 0x4a, 0x0c, 0x08, 0x43, 0xf4, 0x2c, 0x21, 0xc2, 0x55, 0xb0, 0x2d, 0x42, 0x21, 0x10, 0x05, 0x43, 0xcd, 0x8c, 0x25, 0xc2, 0x83, 0x2f, 0x31, 0x42, 0x73, 0x68, 0x05, 0x43, 0x65, 0x99, 0x22, 0xc2, 0x6d, 0xe7, 0x3a, 0x42, 0x4c, 0x17, 0x04, 0x43, 0x55, 0xf0, 0x1f, 0xc2, 0x0e, 0x5c, 0x38, 0x42, 0x75, 0x73, 0x03, 0x43, 0x0d, 0x0f, 0x23, 0xc2, 0x69, 0xaf, 0x34, 0x42, 0x07, 0xc1, 0x05, 0x43, 0x2c, 0xa5, 0x1f, 0xc2, 0x65, 0x19, 0x37, 0x42, +0xfc, 0x89, 0x13, 0x43, 0xf6, 0xd7, 0x10, 0xc2, 0xf0, 0xa7, 0x38, 0x42, 0xe8, 0xdb, 0x11, 0x43, 0x55, 0x5f, 0x0f, 0xc2, 0xbd, 0x92, 0x2d, 0x42, 0x79, 0x09, 0x12, 0x43, 0xbc, 0x85, 0x17, 0xc2, 0x20, 0x41, 0x30, 0x42, 0xf0, 0x87, 0x10, 0x43, 0xee, 0x1a, 0x15, 0xc2, 0x86, 0xf8, 0x2d, 0x42, 0x59, 0x19, 0x0d, 0x43, 0x8e, 0x24, 0x17, 0xc2, 0x3d, 0x4a, 0x2a, 0x42, 0x00, 0x40, 0x0e, 0x43, 0x56, 0xfd, 0x19, 0xc2, 0xb1, 0xee, 0x32, 0x42, 0x67, 0x06, 0x0f, 0x43, 0xf2, 0xb0, 0x12, 0xc2, +0x0e, 0x9c, 0x26, 0x42, 0xa8, 0x66, 0x0f, 0x43, 0x0a, 0xd7, 0x1c, 0xc2, 0x85, 0x1a, 0x24, 0x42, 0x67, 0xc6, 0x0b, 0x43, 0x73, 0xc6, 0x20, 0xc2, 0xa0, 0x89, 0x28, 0x42, 0xd3, 0x2d, 0x0b, 0x43, 0x84, 0x0d, 0x1e, 0xc2, 0x68, 0xa2, 0x2f, 0x42, 0x5f, 0xfa, 0x07, 0x43, 0x62, 0x50, 0x1e, 0xc2, 0xe9, 0xf7, 0x2c, 0x42, 0x40, 0x95, 0x0a, 0x43, 0x95, 0x54, 0x1b, 0xc2, 0xd8, 0x1f, 0x3f, 0x42, 0xe0, 0x4f, 0x01, 0x43, 0xf3, 0x5f, 0x26, 0xc2, 0xe0, 0xcf, 0x35, 0x42, 0x1b, 0xcf, 0x02, 0x43, +0x7d, 0x2e, 0x26, 0xc2, 0xa6, 0x5b, 0x40, 0x42, 0x96, 0x23, 0x02, 0x43, 0x13, 0xd0, 0x22, 0xc2, 0xef, 0x78, 0x48, 0x42, 0xb9, 0x3e, 0x02, 0x43, 0xd6, 0x45, 0x1d, 0xc2, 0x5b, 0x71, 0x48, 0x42, 0xc9, 0x56, 0x01, 0x43, 0xc9, 0x76, 0x20, 0xc2, 0x73, 0x97, 0x41, 0x42, 0x8e, 0xf7, 0x02, 0x43, 0x7d, 0x3f, 0x1f, 0xc2, 0x6d, 0x67, 0x48, 0x42, 0xd9, 0x6e, 0x00, 0x43, 0x72, 0xa8, 0x23, 0xc2, 0xb3, 0x6a, 0x51, 0x42, 0xb8, 0x1e, 0x00, 0x43, 0x6a, 0x0d, 0x1f, 0xc2, 0x5a, 0x53, 0x50, 0x42, +0xa4, 0x10, 0x01, 0x43, 0xf3, 0xbd, 0x1c, 0xc2, 0xe7, 0x3b, 0x4f, 0x42, 0x4e, 0x02, 0x02, 0x43, 0x7d, 0x6e, 0x1a, 0xc2, 0x06, 0xb0, 0x55, 0x42, 0x7f, 0x4a, 0x02, 0x43, 0xcf, 0x26, 0x17, 0xc2, 0xd0, 0xf7, 0x57, 0x42, 0x4e, 0x62, 0x01, 0x43, 0x21, 0xb0, 0x18, 0xc2, 0x8e, 0x97, 0x5b, 0x42, 0xc9, 0x36, 0x03, 0x43, 0xd2, 0xef, 0x13, 0xc2, 0x78, 0x8b, 0x60, 0x42, 0x98, 0xce, 0x04, 0x43, 0xec, 0x00, 0x11, 0xc2, 0x25, 0x64, 0x5f, 0x42, 0xb8, 0x9e, 0x02, 0x43, 0x67, 0xc4, 0x14, 0xc2, +0xff, 0x21, 0x65, 0x42, 0x96, 0xa3, 0x04, 0x43, 0x45, 0xf6, 0x10, 0xc2, 0xb1, 0x7f, 0x63, 0x42, 0xc5, 0x00, 0x02, 0x43, 0x11, 0x76, 0x15, 0xc2, 0x3a, 0x41, 0x5a, 0x42, 0x6b, 0x7c, 0x00, 0x43, 0xb3, 0x3b, 0x1a, 0xc2, 0x82, 0x15, 0x6d, 0x42, 0x3c, 0x1f, 0x07, 0x43, 0x5b, 0x42, 0x0b, 0xc2, 0x86, 0x49, 0x6a, 0x42, 0xcb, 0x61, 0x04, 0x43, 0x86, 0x38, 0x10, 0xc2, 0x92, 0x0b, 0x68, 0x42, 0x83, 0x00, 0x07, 0x43, 0xd8, 0x1f, 0x0d, 0xc2, 0xfe, 0xc3, 0x63, 0x42, 0x0f, 0xed, 0x06, 0x43, +0x76, 0x20, 0x0e, 0xc2, 0x36, 0x2b, 0x64, 0x42, 0x3d, 0x4a, 0x09, 0x43, 0x9c, 0x44, 0x0b, 0xc2, 0xa7, 0xe8, 0x67, 0x42, 0xaa, 0x91, 0x09, 0x43, 0x50, 0x7c, 0x09, 0xc2, 0x86, 0xc9, 0x67, 0x42, 0x84, 0xc0, 0x0c, 0x43, 0x0a, 0x28, 0x04, 0xc2, 0x35, 0x0d, 0x6c, 0x42, 0xfe, 0xf4, 0x09, 0x43, 0x22, 0x2c, 0x07, 0xc2, 0xf3, 0x4e, 0x64, 0x42, 0x09, 0x2c, 0x0c, 0x43, 0x21, 0x5f, 0x06, 0xc2, 0x20, 0xd2, 0x60, 0x42, 0x52, 0x98, 0x0b, 0x43, 0x81, 0x95, 0x08, 0xc2, 0x6f, 0x92, 0x5a, 0x42, +0x2b, 0xa7, 0x0d, 0x43, 0xd6, 0x16, 0x07, 0xc2, 0x8f, 0x31, 0x5d, 0x42, 0xa4, 0x90, 0x0e, 0x43, 0xbe, 0xdf, 0x04, 0xc2, 0x06, 0xb0, 0x55, 0x42, 0x9c, 0xc4, 0x11, 0x43, 0x07, 0x1f, 0x03, 0xc2, 0xcb, 0xd0, 0x5f, 0x42, 0x1d, 0x7a, 0x0f, 0x43, 0x5e, 0xa9, 0x02, 0xc2, 0x6c, 0xf8, 0x53, 0x42, 0xf4, 0x7d, 0x10, 0x43, 0x8f, 0xd3, 0x04, 0xc2, 0xd1, 0x40, 0x52, 0x42, 0xc9, 0x36, 0x0f, 0x43, 0x17, 0x88, 0x06, 0xc2, 0x63, 0xee, 0x49, 0x42, 0x40, 0x35, 0x10, 0x43, 0x1c, 0x6b, 0x07, 0xc2, +0x7b, 0xd4, 0x4a, 0x42, 0xc1, 0xca, 0x11, 0x43, 0x93, 0xa9, 0x06, 0xc2, 0xdf, 0x8f, 0x41, 0x42, 0x4e, 0x02, 0x14, 0x43, 0xf1, 0x92, 0x0a, 0xc2, 0xc1, 0xb9, 0x4b, 0x42, 0x42, 0x60, 0x13, 0x43, 0xef, 0xe7, 0x05, 0xc2, 0x29, 0xcb, 0x41, 0x42, 0x9c, 0x44, 0x12, 0x43, 0x8e, 0x35, 0x0a, 0xc2, 0xa1, 0x05, 0x42, 0x42, 0x2b, 0x87, 0x10, 0x43, 0x2a, 0xd8, 0x09, 0xc2, 0x94, 0x36, 0x3a, 0x42, 0xd3, 0x2d, 0x10, 0x43, 0x87, 0xe7, 0x0d, 0xc2, 0xd3, 0xeb, 0x46, 0x42, 0x9e, 0x0f, 0x02, 0x43, +0x11, 0xe5, 0x19, 0xc2, 0x42, 0xfe, 0x3f, 0x42, 0x8f, 0xc2, 0x02, 0x43, 0x8a, 0x0e, 0x1c, 0xc2, 0x42, 0xfe, 0x3f, 0x42, 0x8f, 0xc2, 0x02, 0x43, 0x8a, 0x0e, 0x1c, 0xc2, 0x23, 0xf9, 0x38, 0x42, 0xa0, 0xda, 0x03, 0x43, 0x4c, 0x15, 0x1d, 0xc2, 0x24, 0xd7, 0x2d, 0x42, 0xcf, 0xb7, 0x07, 0x43, 0x94, 0x18, 0x1b, 0xc2, 0xd4, 0x5a, 0x2b, 0x42, 0x85, 0x2b, 0x0a, 0x43, 0x5e, 0x0b, 0x18, 0xc2, 0xd4, 0x5a, 0x2b, 0x42, 0x85, 0x2b, 0x0a, 0x43, 0x5e, 0x0b, 0x18, 0xc2, 0x26, 0x82, 0x2c, 0x42, +0xd1, 0x82, 0x0c, 0x43, 0xa0, 0x78, 0x13, 0xc2, 0x23, 0xf9, 0x38, 0x42, 0xa0, 0xda, 0x03, 0x43, 0x4c, 0x15, 0x1d, 0xc2, 0x52, 0xa7, 0x32, 0x42, 0xf6, 0x88, 0x05, 0x43, 0x87, 0xc5, 0x1c, 0xc2, 0x52, 0xa7, 0x32, 0x42, 0xf6, 0x88, 0x05, 0x43, 0x87, 0xc5, 0x1c, 0xc2, 0x24, 0xd7, 0x2d, 0x42, 0xcf, 0xb7, 0x07, 0x43, 0x94, 0x18, 0x1b, 0xc2, 0xa7, 0xa8, 0x53, 0x42, 0x54, 0x23, 0x02, 0x43, 0x4b, 0x59, 0x14, 0xc2, 0x54, 0x81, 0x4d, 0x42, 0x52, 0xd8, 0x01, 0x43, 0x79, 0x47, 0x17, 0xc2, +0x54, 0x81, 0x4d, 0x42, 0x52, 0xd8, 0x01, 0x43, 0x79, 0x47, 0x17, 0xc2, 0xd3, 0xeb, 0x46, 0x42, 0x9e, 0x0f, 0x02, 0x43, 0x11, 0xe5, 0x19, 0xc2, 0x26, 0x82, 0x2c, 0x42, 0xd1, 0x82, 0x0c, 0x43, 0xa0, 0x78, 0x13, 0xc2, 0xc5, 0xcf, 0x30, 0x42, 0xcb, 0x61, 0x0e, 0x43, 0x60, 0xa5, 0x0e, 0xc2, 0xc5, 0xcf, 0x30, 0x42, 0xcb, 0x61, 0x0e, 0x43, 0x60, 0xa5, 0x0e, 0xc2, 0x01, 0xde, 0x37, 0x42, 0x4e, 0x82, 0x0f, 0x43, 0x2c, 0x14, 0x0a, 0xc2, 0xa2, 0xc5, 0x5d, 0x42, 0xd1, 0xa2, 0x04, 0x43, +0xab, 0x0f, 0x0f, 0xc2, 0x2e, 0x32, 0x59, 0x42, 0xf8, 0x13, 0x03, 0x43, 0x29, 0x8b, 0x11, 0xc2, 0xa7, 0xa8, 0x53, 0x42, 0x54, 0x23, 0x02, 0x43, 0x4b, 0x59, 0x14, 0xc2, 0x2e, 0x32, 0x59, 0x42, 0xf8, 0x13, 0x03, 0x43, 0x29, 0x8b, 0x11, 0xc2, 0x01, 0xde, 0x37, 0x42, 0x4e, 0x82, 0x0f, 0x43, 0x2c, 0x14, 0x0a, 0xc2, 0xb5, 0xe6, 0x3f, 0x42, 0xc1, 0xea, 0x0f, 0x43, 0xff, 0xd0, 0x06, 0xc2, 0x15, 0x1d, 0x48, 0x42, 0x98, 0x8e, 0x0f, 0x43, 0xc8, 0x47, 0x05, 0xc2, 0xb5, 0xe6, 0x3f, 0x42, +0xc1, 0xea, 0x0f, 0x43, 0xff, 0xd0, 0x06, 0xc2, 0x19, 0xe2, 0x60, 0x42, 0xb5, 0xc8, 0x08, 0x43, 0x32, 0xd5, 0x09, 0xc2, 0x1b, 0xbc, 0x60, 0x42, 0x58, 0x99, 0x06, 0x43, 0xfc, 0x87, 0x0c, 0xc2, 0xa2, 0xc5, 0x5d, 0x42, 0xd1, 0xa2, 0x04, 0x43, 0xab, 0x0f, 0x0f, 0xc2, 0x1b, 0xbc, 0x60, 0x42, 0x58, 0x99, 0x06, 0x43, 0xfc, 0x87, 0x0c, 0xc2, 0x15, 0x1d, 0x48, 0x42, 0x98, 0x8e, 0x0f, 0x43, 0xc8, 0x47, 0x05, 0xc2, 0x8d, 0x68, 0x50, 0x42, 0x09, 0x8c, 0x0e, 0x43, 0x93, 0xe9, 0x04, 0xc2, +0x3c, 0x2c, 0x58, 0x42, 0x42, 0x00, 0x0d, 0x43, 0xb4, 0x99, 0x05, 0xc2, 0x8d, 0x68, 0x50, 0x42, 0x09, 0x8c, 0x0e, 0x43, 0x93, 0xe9, 0x04, 0xc2, 0x3c, 0x2c, 0x58, 0x42, 0x42, 0x00, 0x0d, 0x43, 0xb4, 0x99, 0x05, 0xc2, 0xf5, 0xca, 0x5d, 0x42, 0x17, 0xf9, 0x0a, 0x43, 0x18, 0x55, 0x07, 0xc2, 0x19, 0xe2, 0x60, 0x42, 0xb5, 0xc8, 0x08, 0x43, 0x32, 0xd5, 0x09, 0xc2, 0xf5, 0xca, 0x5d, 0x42, 0x17, 0xf9, 0x0a, 0x43, 0x18, 0x55, 0x07, 0xc2, 0x42, 0xfe, 0x3f, 0x42, 0x8f, 0xc2, 0x02, 0x43, +0x8a, 0x0e, 0x1c, 0xc2, 0xd3, 0xeb, 0x46, 0x42, 0x9e, 0x0f, 0x02, 0x43, 0x11, 0xe5, 0x19, 0xc2, 0x42, 0xfe, 0x3f, 0x42, 0x8f, 0xc2, 0x02, 0x43, 0x8a, 0x0e, 0x1c, 0xc2, 0x23, 0xf9, 0x38, 0x42, 0xa0, 0xda, 0x03, 0x43, 0x4c, 0x15, 0x1d, 0xc2, 0xd4, 0x5a, 0x2b, 0x42, 0x85, 0x2b, 0x0a, 0x43, 0x5e, 0x0b, 0x18, 0xc2, 0x24, 0xd7, 0x2d, 0x42, 0xcf, 0xb7, 0x07, 0x43, 0x94, 0x18, 0x1b, 0xc2, 0xd4, 0x5a, 0x2b, 0x42, 0x85, 0x2b, 0x0a, 0x43, 0x5e, 0x0b, 0x18, 0xc2, 0x26, 0x82, 0x2c, 0x42, +0xd1, 0x82, 0x0c, 0x43, 0xa0, 0x78, 0x13, 0xc2, 0x52, 0xa7, 0x32, 0x42, 0xf6, 0x88, 0x05, 0x43, 0x87, 0xc5, 0x1c, 0xc2, 0x23, 0xf9, 0x38, 0x42, 0xa0, 0xda, 0x03, 0x43, 0x4c, 0x15, 0x1d, 0xc2, 0x52, 0xa7, 0x32, 0x42, 0xf6, 0x88, 0x05, 0x43, 0x87, 0xc5, 0x1c, 0xc2, 0x24, 0xd7, 0x2d, 0x42, 0xcf, 0xb7, 0x07, 0x43, 0x94, 0x18, 0x1b, 0xc2, 0x54, 0x81, 0x4d, 0x42, 0x52, 0xd8, 0x01, 0x43, 0x79, 0x47, 0x17, 0xc2, 0xa7, 0xa8, 0x53, 0x42, 0x54, 0x23, 0x02, 0x43, 0x4b, 0x59, 0x14, 0xc2, +0x54, 0x81, 0x4d, 0x42, 0x52, 0xd8, 0x01, 0x43, 0x79, 0x47, 0x17, 0xc2, 0xd3, 0xeb, 0x46, 0x42, 0x9e, 0x0f, 0x02, 0x43, 0x11, 0xe5, 0x19, 0xc2, 0x26, 0x82, 0x2c, 0x42, 0xd1, 0x82, 0x0c, 0x43, 0xa0, 0x78, 0x13, 0xc2, 0xc5, 0xcf, 0x30, 0x42, 0xcb, 0x61, 0x0e, 0x43, 0x60, 0xa5, 0x0e, 0xc2, 0xc5, 0xcf, 0x30, 0x42, 0xcb, 0x61, 0x0e, 0x43, 0x60, 0xa5, 0x0e, 0xc2, 0x01, 0xde, 0x37, 0x42, 0x4e, 0x82, 0x0f, 0x43, 0x2c, 0x14, 0x0a, 0xc2, 0x2e, 0x32, 0x59, 0x42, 0xf8, 0x13, 0x03, 0x43, +0x29, 0x8b, 0x11, 0xc2, 0xa2, 0xc5, 0x5d, 0x42, 0xd1, 0xa2, 0x04, 0x43, 0xab, 0x0f, 0x0f, 0xc2, 0x2e, 0x32, 0x59, 0x42, 0xf8, 0x13, 0x03, 0x43, 0x29, 0x8b, 0x11, 0xc2, 0xa7, 0xa8, 0x53, 0x42, 0x54, 0x23, 0x02, 0x43, 0x4b, 0x59, 0x14, 0xc2, 0x01, 0xde, 0x37, 0x42, 0x4e, 0x82, 0x0f, 0x43, 0x2c, 0x14, 0x0a, 0xc2, 0xb5, 0xe6, 0x3f, 0x42, 0xc1, 0xea, 0x0f, 0x43, 0xff, 0xd0, 0x06, 0xc2, 0xb5, 0xe6, 0x3f, 0x42, 0xc1, 0xea, 0x0f, 0x43, 0xff, 0xd0, 0x06, 0xc2, 0x15, 0x1d, 0x48, 0x42, +0x98, 0x8e, 0x0f, 0x43, 0xc8, 0x47, 0x05, 0xc2, 0x1b, 0xbc, 0x60, 0x42, 0x58, 0x99, 0x06, 0x43, 0xfc, 0x87, 0x0c, 0xc2, 0x19, 0xe2, 0x60, 0x42, 0xb5, 0xc8, 0x08, 0x43, 0x32, 0xd5, 0x09, 0xc2, 0x1b, 0xbc, 0x60, 0x42, 0x58, 0x99, 0x06, 0x43, 0xfc, 0x87, 0x0c, 0xc2, 0xa2, 0xc5, 0x5d, 0x42, 0xd1, 0xa2, 0x04, 0x43, 0xab, 0x0f, 0x0f, 0xc2, 0x15, 0x1d, 0x48, 0x42, 0x98, 0x8e, 0x0f, 0x43, 0xc8, 0x47, 0x05, 0xc2, 0x8d, 0x68, 0x50, 0x42, 0x09, 0x8c, 0x0e, 0x43, 0x93, 0xe9, 0x04, 0xc2, +0x8d, 0x68, 0x50, 0x42, 0x09, 0x8c, 0x0e, 0x43, 0x93, 0xe9, 0x04, 0xc2, 0x3c, 0x2c, 0x58, 0x42, 0x42, 0x00, 0x0d, 0x43, 0xb4, 0x99, 0x05, 0xc2, 0xf5, 0xca, 0x5d, 0x42, 0x17, 0xf9, 0x0a, 0x43, 0x18, 0x55, 0x07, 0xc2, 0x3c, 0x2c, 0x58, 0x42, 0x42, 0x00, 0x0d, 0x43, 0xb4, 0x99, 0x05, 0xc2, 0xf5, 0xca, 0x5d, 0x42, 0x17, 0xf9, 0x0a, 0x43, 0x18, 0x55, 0x07, 0xc2, 0x19, 0xe2, 0x60, 0x42, 0xb5, 0xc8, 0x08, 0x43, 0x32, 0xd5, 0x09, 0xc2, 0xd7, 0x41, 0x70, 0x42, 0x98, 0xce, 0x03, 0x43, +0x77, 0xfe, 0x0c, 0xc2, 0x15, 0xdd, 0x68, 0x42, 0x32, 0xe8, 0x00, 0x43, 0x67, 0x55, 0x15, 0xc2, 0x38, 0x56, 0x5c, 0x42, 0x09, 0xec, 0xfd, 0x42, 0xf4, 0x2c, 0x1c, 0xc2, 0x13, 0x50, 0x71, 0x42, 0x7d, 0xdf, 0x0a, 0x43, 0x14, 0xae, 0x01, 0xc2, 0x43, 0x4b, 0x73, 0x42, 0x15, 0x4e, 0x07, 0x43, 0x0c, 0x53, 0x06, 0xc2, 0xcd, 0xcc, 0x2b, 0x42, 0xb8, 0x9e, 0x01, 0x43, 0x02, 0x9a, 0x2e, 0xc2, 0x7b, 0x43, 0x1f, 0x42, 0x83, 0xa0, 0x04, 0x43, 0xba, 0x89, 0x2b, 0xc2, 0xd9, 0x3d, 0x17, 0x42, +0x58, 0x99, 0x08, 0x43, 0x91, 0x7e, 0x29, 0xc2, 0x96, 0xc3, 0x4b, 0x42, 0xcb, 0xa1, 0x16, 0x43, 0xf6, 0x46, 0x00, 0xc2, 0x4a, 0xaa, 0x58, 0x42, 0xa6, 0x7b, 0x14, 0x43, 0x88, 0x52, 0xfb, 0xc1, 0xe7, 0x0c, 0x64, 0x42, 0xf2, 0x72, 0x11, 0x43, 0x8b, 0xdb, 0xf9, 0xc1, 0xb4, 0x59, 0x18, 0x42, 0x96, 0xe3, 0x11, 0x43, 0x39, 0xc5, 0x1e, 0xc2, 0x32, 0x26, 0x22, 0x42, 0x8e, 0x17, 0x15, 0x43, 0x5d, 0xad, 0x16, 0xc2, 0x3c, 0x7d, 0x2f, 0x42, 0x9a, 0xf9, 0x16, 0x43, 0x9c, 0xc4, 0x0d, 0xc2, +0xfb, 0x7a, 0x14, 0x42, 0xc7, 0x6b, 0x0d, 0x43, 0xdd, 0x53, 0x25, 0xc2, 0x0f, 0x0b, 0x46, 0x42, 0xa1, 0x9a, 0xfd, 0x42, 0x71, 0xbd, 0x2a, 0xc2, 0x0c, 0x42, 0x39, 0x42, 0xa7, 0x9b, 0xff, 0x42, 0xad, 0xba, 0x2e, 0xc2, 0xb6, 0x44, 0x51, 0x42, 0x3a, 0xf4, 0xfc, 0x42, 0x5b, 0xf1, 0x23, 0xc2, 0x9a, 0x77, 0x6c, 0x42, 0x0d, 0x22, 0x0e, 0x43, 0x60, 0x65, 0xfc, 0xc1, 0x48, 0xff, 0x3d, 0x42, 0xe0, 0x8f, 0x17, 0x43, 0x9a, 0x08, 0x06, 0xc2, 0x44, 0xba, 0x77, 0x42, 0xae, 0x47, 0x02, 0x43, +0xfd, 0x65, 0x06, 0xc2, 0x30, 0xdd, 0x6d, 0x42, 0xb7, 0x33, 0xfc, 0x42, 0xfa, 0x6d, 0x13, 0xc2, 0xec, 0xef, 0x5f, 0x42, 0x92, 0x6d, 0xf8, 0x42, 0x2a, 0x3a, 0x1f, 0xc2, 0x76, 0x13, 0x7b, 0x42, 0x02, 0xeb, 0x06, 0x43, 0xfe, 0x32, 0xf9, 0xc1, 0x28, 0xbe, 0x77, 0x42, 0x13, 0x83, 0x0b, 0x43, 0x48, 0xd0, 0xee, 0xc1, 0x03, 0x38, 0x20, 0x42, 0x69, 0x51, 0xfe, 0x42, 0x34, 0x80, 0x33, 0xc2, 0x17, 0x59, 0x0d, 0x42, 0xc1, 0xea, 0x02, 0x43, 0x81, 0x04, 0x33, 0xc2, 0xd4, 0x1a, 0x02, 0x42, +0x69, 0xb1, 0x07, 0x43, 0x70, 0x0e, 0x2d, 0xc2, 0xd7, 0x12, 0x5a, 0x42, 0xf2, 0xf2, 0x16, 0x43, 0x30, 0xbb, 0xe2, 0xc1, 0xf3, 0x8e, 0x48, 0x42, 0xe4, 0xa5, 0x19, 0x43, 0xd8, 0xdf, 0xe5, 0xc1, 0x93, 0x47, 0x68, 0x42, 0xfe, 0x74, 0x13, 0x43, 0x01, 0xcd, 0xe4, 0xc1, 0x0c, 0x93, 0x10, 0x42, 0xe8, 0xbb, 0x17, 0x43, 0xe8, 0xd9, 0x0d, 0xc2, 0x0c, 0xc2, 0x01, 0x42, 0xbf, 0xdf, 0x13, 0x43, 0x9a, 0x19, 0x19, 0xc2, 0x60, 0x25, 0x23, 0x42, 0x0a, 0x17, 0x1a, 0x43, 0x8c, 0x39, 0x03, 0xc2, +0x78, 0xfa, 0xf9, 0x41, 0x47, 0xa1, 0x0e, 0x43, 0xfc, 0x07, 0x25, 0xc2, 0xaa, 0x31, 0x42, 0x42, 0x32, 0xc8, 0xf7, 0x42, 0x34, 0x00, 0x31, 0xc2, 0x14, 0xee, 0x31, 0x42, 0x00, 0x80, 0xf9, 0x42, 0xa2, 0x45, 0x34, 0xc2, 0x5b, 0xe4, 0x50, 0x42, 0xb5, 0x88, 0xf7, 0x42, 0xeb, 0x51, 0x28, 0xc2, 0x68, 0x62, 0x71, 0x42, 0x29, 0xbc, 0x0f, 0x43, 0x48, 0x3f, 0xe8, 0xc1, 0x1b, 0x1e, 0x36, 0x42, 0x17, 0xb9, 0x1a, 0x43, 0x5d, 0xdc, 0xf3, 0xc1, 0x2b, 0xa7, 0x81, 0x42, 0x13, 0x23, 0x00, 0x43, +0xfd, 0x65, 0xf8, 0xc1, 0x05, 0xa3, 0x75, 0x42, 0x22, 0xb0, 0xf2, 0x42, 0x9b, 0x15, 0x10, 0xc2, 0xf6, 0x37, 0x81, 0x42, 0x21, 0x90, 0x0b, 0x43, 0x49, 0x2e, 0xcf, 0xc1, 0xb3, 0x0a, 0x84, 0x42, 0x70, 0x3d, 0x06, 0x43, 0xc1, 0xca, 0xd9, 0xc1, 0xd2, 0x4f, 0x91, 0x42, 0x65, 0xbb, 0xe8, 0x42, 0x12, 0x14, 0xbd, 0xc1, 0x22, 0x7d, 0x90, 0x42, 0x4f, 0xe2, 0xe8, 0x42, 0x6b, 0x9a, 0xb2, 0xc1, 0x44, 0x0b, 0x90, 0x42, 0x65, 0x7b, 0xe8, 0x42, 0xc7, 0x3a, 0xb7, 0xc1, 0x11, 0xc7, 0x91, 0x42, +0x9c, 0xc4, 0xe7, 0x42, 0x3d, 0x1b, 0xb5, 0xc1, 0x45, 0xc7, 0x92, 0x42, 0x32, 0x48, 0xea, 0x42, 0xed, 0x0d, 0x98, 0xc1, 0xed, 0x1c, 0x94, 0x42, 0xdc, 0x79, 0xe7, 0x42, 0x3a, 0x01, 0x97, 0xc1, 0x2d, 0x81, 0x91, 0x42, 0xd6, 0xb8, 0xe9, 0x42, 0xe4, 0xa5, 0xa7, 0xc1, 0x0f, 0x2d, 0x93, 0x42, 0x8c, 0xac, 0xe7, 0x42, 0x87, 0x05, 0xa8, 0xc1, 0x8e, 0xb5, 0x94, 0x42, 0xf4, 0xbd, 0xee, 0x42, 0x64, 0xaa, 0xa2, 0xc1, 0xd0, 0xd3, 0x92, 0x42, 0x7a, 0x29, 0xed, 0x42, 0x21, 0x1f, 0xaf, 0xc1, +0x73, 0x57, 0x99, 0x42, 0x7a, 0xe9, 0xf2, 0x42, 0xc8, 0x07, 0xa9, 0xc1, 0x27, 0x91, 0x81, 0x42, 0xc1, 0x0a, 0xf1, 0x42, 0x2c, 0x03, 0x07, 0xc2, 0xb0, 0x81, 0x8b, 0x42, 0x3e, 0xca, 0xfb, 0x42, 0xa3, 0xf0, 0xe0, 0xc1, 0x1a, 0x91, 0x84, 0x42, 0x80, 0xea, 0xf1, 0x42, 0x5e, 0xa9, 0x07, 0xc2, 0x1e, 0xc7, 0x8e, 0x42, 0x0b, 0x97, 0xfb, 0x42, 0x5f, 0xf6, 0xe2, 0xc1, 0xbc, 0xe5, 0x87, 0x42, 0x80, 0xaa, 0xfd, 0x42, 0x27, 0x0f, 0xe4, 0xc1, 0x19, 0xb3, 0x7a, 0x42, 0x65, 0x3b, 0xef, 0x42, +0xa6, 0xf9, 0x0e, 0xc2, 0x45, 0xd6, 0x91, 0x42, 0xb7, 0x33, 0xd6, 0x42, 0xe8, 0xea, 0xa8, 0xc1, 0xc2, 0x57, 0x8c, 0x42, 0x3e, 0x4a, 0xd5, 0x42, 0xc4, 0x31, 0xa1, 0xc1, 0x79, 0xb8, 0x8a, 0x42, 0x26, 0x46, 0xd7, 0x42, 0x4f, 0x1e, 0xd5, 0xc1, 0x56, 0xdd, 0x82, 0x42, 0x57, 0x0e, 0xd7, 0x42, 0x38, 0x56, 0xd7, 0xc1, 0xe4, 0xa3, 0x90, 0x42, 0x21, 0xf0, 0xd3, 0x42, 0xc1, 0x39, 0x74, 0xc1, 0xc2, 0x57, 0x8c, 0x42, 0x3e, 0x4a, 0xd5, 0x42, 0xc4, 0x31, 0xa1, 0xc1, 0xbc, 0xe5, 0x87, 0x42, +0x80, 0xaa, 0xfd, 0x42, 0x27, 0x0f, 0xe4, 0xc1, 0x71, 0x5b, 0x8d, 0x42, 0x83, 0x40, 0x02, 0x43, 0x6d, 0xd6, 0xc7, 0xc1, 0x9b, 0x64, 0x8a, 0x42, 0xe8, 0x7b, 0x02, 0x43, 0xe4, 0x83, 0xc6, 0xc1, 0x25, 0x04, 0x8d, 0x42, 0xaa, 0x51, 0x06, 0x43, 0x83, 0x2f, 0xa2, 0xc1, 0x3e, 0x59, 0x8f, 0x42, 0x23, 0x5b, 0x06, 0x43, 0xad, 0x1c, 0xa6, 0xc1, 0x9b, 0x64, 0x8a, 0x42, 0xe8, 0x7b, 0x02, 0x43, 0xe4, 0x83, 0xc6, 0xc1, 0xd6, 0xf4, 0x92, 0x42, 0x4e, 0xe2, 0x05, 0x43, 0x4a, 0x0c, 0xa9, 0xc1, +0x3f, 0x66, 0x91, 0x42, 0xa2, 0xe5, 0x01, 0x43, 0x04, 0xd6, 0xcb, 0xc1, 0xa4, 0xff, 0x89, 0x42, 0x2e, 0x32, 0xf3, 0x42, 0x22, 0x3d, 0x0a, 0xc2, 0x31, 0x59, 0x92, 0x42, 0x88, 0x96, 0xfc, 0x42, 0xe1, 0x7a, 0xe6, 0xc1, 0x88, 0x83, 0x8e, 0x42, 0x5f, 0xfa, 0xf3, 0x42, 0x3a, 0x23, 0x0b, 0xc2, 0x5e, 0x1a, 0x96, 0x42, 0x96, 0x83, 0xfd, 0x42, 0xb1, 0xae, 0xe9, 0xc1, 0xc6, 0x9c, 0x7c, 0x42, 0x4d, 0xb7, 0xe8, 0x42, 0xb3, 0x6a, 0x15, 0xc2, 0xfa, 0x6d, 0x80, 0x42, 0x7a, 0x69, 0xee, 0x42, +0xdf, 0xe0, 0x11, 0xc2, 0x94, 0xa5, 0x84, 0x42, 0x36, 0x1e, 0xe9, 0x42, 0x2e, 0xb2, 0x19, 0xc2, 0xd3, 0xbc, 0x86, 0x42, 0xd0, 0xb7, 0xee, 0x42, 0xf1, 0x34, 0x14, 0xc2, 0x6e, 0x32, 0x8d, 0x42, 0x80, 0xea, 0xed, 0x42, 0x22, 0xac, 0x14, 0xc2, 0x20, 0x72, 0x8b, 0x42, 0x88, 0x16, 0xe8, 0x42, 0xf3, 0x4e, 0x18, 0xc2, 0x45, 0x96, 0x85, 0x42, 0x6f, 0x92, 0xe2, 0x42, 0xce, 0x59, 0x16, 0xc2, 0x05, 0x23, 0x7e, 0x42, 0x70, 0x3d, 0xe2, 0x42, 0x57, 0xdb, 0x13, 0xc2, 0xde, 0x64, 0x90, 0x42, +0x3a, 0xf4, 0xd7, 0x42, 0xa6, 0xf9, 0xd6, 0xc1, 0x43, 0x7c, 0x89, 0x42, 0x30, 0x5d, 0xda, 0x42, 0xce, 0x59, 0x06, 0xc2, 0x21, 0x2e, 0x83, 0x42, 0xda, 0x0e, 0xda, 0x42, 0x33, 0x62, 0x06, 0xc2, 0xff, 0xd2, 0x95, 0x42, 0x55, 0xa3, 0xd8, 0x42, 0xc6, 0x5c, 0xd8, 0xc1, 0xba, 0xa9, 0x8f, 0x42, 0x0d, 0x42, 0xdc, 0x42, 0x0b, 0x24, 0x05, 0xc2, 0xfc, 0x89, 0x96, 0x42, 0x7c, 0xd4, 0xd6, 0x42, 0x6d, 0x56, 0xab, 0xc1, 0x7e, 0xcc, 0x9b, 0x42, 0xc5, 0xe0, 0xd7, 0x42, 0xa2, 0xc5, 0xa9, 0xc1, +0x43, 0xad, 0x96, 0x42, 0x4a, 0x4c, 0x05, 0x43, 0xd1, 0x11, 0xad, 0xc1, 0xdf, 0x3e, 0x9b, 0x42, 0xc9, 0x76, 0x04, 0x43, 0x20, 0xd2, 0xb1, 0xc1, 0x4b, 0x08, 0x95, 0x42, 0x4a, 0xec, 0x01, 0x43, 0x18, 0x15, 0xd0, 0xc1, 0xe4, 0xa3, 0x98, 0x42, 0x47, 0xe1, 0x01, 0x43, 0x5d, 0xdc, 0xd3, 0xc1, 0xe6, 0xff, 0x8f, 0x42, 0xe8, 0x7b, 0xe9, 0x42, 0xe4, 0xf2, 0x13, 0xc2, 0x21, 0xce, 0x8f, 0x42, 0x34, 0x73, 0xe6, 0x42, 0x3c, 0x3d, 0x14, 0xc2, 0xb4, 0x17, 0x8e, 0x42, 0xcb, 0x21, 0xe2, 0x42, +0x0f, 0xcb, 0x15, 0xc2, 0x69, 0x9e, 0xb1, 0x42, 0xf0, 0x27, 0xdd, 0x42, 0x21, 0x9f, 0xd7, 0xc1, 0x4c, 0xf5, 0xaf, 0x42, 0xee, 0xbc, 0xd8, 0x42, 0xc1, 0xa8, 0xd8, 0xc1, 0x05, 0x94, 0xaa, 0x42, 0x57, 0x4e, 0xdf, 0x42, 0xcb, 0x90, 0xf1, 0xc1, 0xda, 0x3b, 0xa8, 0x42, 0x13, 0x43, 0xdc, 0x42, 0x8b, 0xdb, 0xf4, 0xc1, 0x34, 0x51, 0xaa, 0x42, 0x4e, 0x22, 0xd7, 0x42, 0xbe, 0xb0, 0xd6, 0xc1, 0x4c, 0xd5, 0xa5, 0x42, 0x07, 0x41, 0xd9, 0x42, 0x87, 0x05, 0xed, 0xc1, 0xae, 0xb6, 0xb4, 0x42, +0xf2, 0x92, 0xdb, 0x42, 0x25, 0xf5, 0xc0, 0xc1, 0xf2, 0x10, 0xb3, 0x42, 0x7e, 0x3f, 0xd6, 0x42, 0x05, 0x56, 0xbe, 0xc1, 0x3a, 0x21, 0xae, 0x42, 0xa9, 0x06, 0xd5, 0x42, 0x11, 0x58, 0xba, 0xc1, 0xf3, 0xee, 0xb6, 0x42, 0xbb, 0x29, 0x0a, 0x43, 0x29, 0xba, 0xd9, 0xc1, 0x64, 0x2c, 0xba, 0x42, 0x09, 0x8c, 0x08, 0x43, 0xad, 0x69, 0xde, 0xc1, 0x21, 0xae, 0xb0, 0x42, 0xeb, 0x51, 0x07, 0x43, 0xd9, 0xbd, 0xff, 0xc1, 0x00, 0xef, 0xb3, 0x42, 0xbb, 0x89, 0x05, 0x43, 0xfc, 0x18, 0x03, 0xc2, +0xfc, 0x89, 0xae, 0x42, 0xbf, 0xbf, 0x00, 0x43, 0x37, 0xc9, 0x0d, 0xc2, 0xa7, 0xc8, 0xab, 0x42, 0xc5, 0x00, 0x03, 0x43, 0x05, 0x56, 0x0b, 0xc2, 0xea, 0x26, 0x9b, 0x42, 0x75, 0xd3, 0xed, 0x42, 0xc8, 0xf6, 0xd4, 0xc1, 0x8e, 0x84, 0x94, 0x42, 0xc7, 0x8b, 0xec, 0x42, 0xe0, 0x2d, 0xc7, 0xc1, 0xeb, 0xc2, 0x96, 0x42, 0xa3, 0x85, 0xea, 0x42, 0x68, 0x11, 0xe5, 0xc1, 0x11, 0x47, 0x94, 0x42, 0x66, 0xe6, 0xe7, 0x42, 0x18, 0x84, 0xd0, 0xc1, 0x5b, 0x51, 0x91, 0x42, 0x57, 0x8e, 0xea, 0x42, +0xb5, 0xc8, 0xb8, 0xc1, 0xec, 0x6f, 0x95, 0x42, 0xea, 0x66, 0xe6, 0x42, 0x80, 0x37, 0xea, 0xc1, 0xf4, 0x5b, 0x94, 0x42, 0xa9, 0x06, 0xe6, 0x42, 0x2c, 0x54, 0xfb, 0xc1, 0x25, 0x04, 0x95, 0x42, 0x2a, 0x1c, 0xe7, 0x42, 0xa1, 0x56, 0xbf, 0xc1, 0x68, 0x71, 0x98, 0x42, 0x46, 0xf6, 0xe5, 0x42, 0x77, 0x2d, 0xcb, 0xc1, 0x75, 0xa2, 0x9a, 0x42, 0x88, 0x56, 0xe5, 0x42, 0x62, 0x21, 0xb5, 0xc1, 0xbf, 0x6c, 0x96, 0x42, 0x6f, 0x52, 0xe6, 0x42, 0xff, 0xa1, 0xad, 0xc1, 0xc7, 0x8b, 0x9c, 0x42, +0xf9, 0xd3, 0xe4, 0x42, 0x5e, 0x29, 0xa2, 0xc1, 0x22, 0xec, 0x97, 0x42, 0x61, 0xe5, 0xe5, 0x42, 0x47, 0x83, 0x9b, 0xc1, 0x3a, 0xa3, 0x92, 0x42, 0x8f, 0x42, 0xf5, 0x42, 0xe4, 0x14, 0x0a, 0xc2, 0x1a, 0xe0, 0x99, 0x42, 0x8c, 0xac, 0xfe, 0x42, 0x8b, 0x5b, 0xec, 0xc1, 0x23, 0x5b, 0x97, 0x42, 0x4f, 0xa2, 0xf7, 0x42, 0x7b, 0x94, 0x0a, 0xc2, 0x37, 0x9a, 0x9c, 0x42, 0x9e, 0xaf, 0x00, 0x43, 0xc4, 0xb1, 0xee, 0xc1, 0xb4, 0xf9, 0x95, 0x42, 0x47, 0x61, 0xe8, 0x42, 0xe3, 0x36, 0x01, 0xc2, +0x43, 0x2b, 0x9a, 0x42, 0xab, 0x31, 0xea, 0x42, 0x2d, 0xb2, 0x04, 0xc2, 0x80, 0x48, 0x9a, 0x42, 0x5f, 0x3a, 0xec, 0x42, 0x02, 0x09, 0xf0, 0xc1, 0xbd, 0x74, 0x9e, 0x42, 0x52, 0x38, 0xed, 0x42, 0x28, 0xfe, 0xf6, 0xc1, 0xc9, 0x94, 0xa2, 0x42, 0xde, 0xa4, 0xf1, 0x42, 0xbf, 0xec, 0xe6, 0xc1, 0xb2, 0x7d, 0x9f, 0x42, 0x14, 0x2e, 0xef, 0x42, 0x19, 0x04, 0xde, 0xc1, 0x0a, 0x86, 0x97, 0x42, 0xaf, 0x07, 0xea, 0x42, 0x51, 0xc9, 0x0c, 0xc2, 0xce, 0xc8, 0x92, 0x42, 0x46, 0x76, 0xe8, 0x42, +0xbd, 0x41, 0x0a, 0xc2, 0xb7, 0x31, 0x92, 0x42, 0x77, 0xbe, 0xe5, 0x42, 0x36, 0x2b, 0x08, 0xc2, 0x16, 0xca, 0x91, 0x42, 0x38, 0x89, 0xe6, 0x42, 0x93, 0x29, 0x09, 0xc2, 0x64, 0x2c, 0x92, 0x42, 0xd8, 0xe3, 0xea, 0x42, 0xb3, 0x2a, 0x11, 0xc2, 0xf5, 0x4a, 0x96, 0x42, 0xc1, 0x0a, 0xec, 0x42, 0x1b, 0x2f, 0x12, 0xc2, 0x30, 0xb9, 0x9d, 0x42, 0xcc, 0x4c, 0xf4, 0x42, 0x55, 0xe3, 0xc8, 0xc1, 0xb2, 0xfd, 0xa1, 0x42, 0xf4, 0x3d, 0xf6, 0x42, 0xab, 0x3e, 0xd1, 0xc1, 0x04, 0x76, 0xa5, 0x42, +0x73, 0x28, 0xf8, 0x42, 0x2a, 0x98, 0xd8, 0xc1, 0x36, 0x2b, 0xa8, 0x42, 0x28, 0x71, 0xf9, 0x42, 0xb3, 0x6a, 0xbd, 0xc1, 0xed, 0xad, 0xa4, 0x42, 0x80, 0xaa, 0xf7, 0x42, 0x80, 0x6a, 0xb8, 0xc1, 0xaa, 0x60, 0xa0, 0x42, 0x03, 0xab, 0xf5, 0x42, 0xbe, 0x30, 0xb3, 0xc1, 0xeb, 0xf1, 0xa4, 0x42, 0xea, 0xc6, 0x04, 0x43, 0x04, 0xd6, 0xeb, 0xc1, 0x73, 0x86, 0xa4, 0x42, 0x2d, 0x12, 0x02, 0x43, 0x34, 0x91, 0x06, 0xc2, 0x11, 0x58, 0xa2, 0x42, 0x02, 0x4b, 0x03, 0x43, 0x94, 0x76, 0xee, 0xc1, +0xd5, 0x38, 0xa0, 0x42, 0xea, 0x26, 0xff, 0x42, 0x67, 0x95, 0x09, 0xc2, 0x62, 0xe1, 0xa8, 0x42, 0x83, 0xe0, 0x04, 0x43, 0x07, 0x9f, 0x00, 0xc2, 0x63, 0xfd, 0xa6, 0x42, 0x77, 0xfe, 0x05, 0x43, 0x56, 0xec, 0xe8, 0xc1, 0xd6, 0x05, 0xa9, 0x42, 0xd2, 0x62, 0xf6, 0x42, 0x52, 0x67, 0x07, 0xc2, 0x3d, 0xdb, 0xae, 0x42, 0x55, 0xe3, 0xfc, 0x42, 0x0d, 0x02, 0x04, 0xc2, 0xba, 0x29, 0xaa, 0x42, 0x05, 0x96, 0xf7, 0x42, 0x37, 0x49, 0x00, 0xc2, 0x05, 0xd4, 0xae, 0x42, 0x0f, 0xad, 0xfc, 0x42, +0x57, 0xdb, 0xfb, 0xc1, 0x8c, 0xca, 0xae, 0x42, 0x5d, 0xcf, 0xfc, 0x42, 0x19, 0x73, 0xf2, 0xc1, 0x6d, 0xe7, 0xab, 0x42, 0xb1, 0xb2, 0xf9, 0x42, 0x10, 0x47, 0xf2, 0xc1, 0xc2, 0x66, 0xa8, 0x42, 0xf2, 0x52, 0xf6, 0x42, 0x37, 0xf8, 0xef, 0xc1, 0x72, 0xd9, 0xa5, 0x42, 0xbf, 0x5f, 0xf3, 0x42, 0x81, 0x73, 0xff, 0xc1, 0x70, 0xdf, 0xa3, 0x42, 0xb9, 0x5e, 0xf1, 0x42, 0xdc, 0x06, 0x07, 0xc2, 0x7a, 0xa5, 0xa2, 0x42, 0xb1, 0x72, 0xf1, 0x42, 0xea, 0xb3, 0x0d, 0xc2, 0xe8, 0xf9, 0xa1, 0x42, +0x78, 0x7e, 0xf3, 0x42, 0xed, 0x5e, 0x12, 0xc2, 0xfa, 0x6d, 0xa8, 0x42, 0x22, 0xb0, 0xf6, 0x42, 0x9b, 0x55, 0x0e, 0xc2, 0x6d, 0x14, 0xa8, 0x42, 0xbd, 0x34, 0xf9, 0x42, 0xdf, 0x0f, 0x13, 0xc2, 0x95, 0xe3, 0xae, 0x42, 0x00, 0x80, 0xfe, 0x42, 0x41, 0xf1, 0x09, 0xc2, 0x37, 0xd8, 0xa3, 0x42, 0xd5, 0x38, 0x05, 0x43, 0x8e, 0x97, 0xdc, 0xc1, 0x1d, 0xda, 0xa6, 0x42, 0xeb, 0xd1, 0x05, 0x43, 0xc2, 0x06, 0xc0, 0xc1, 0xb7, 0x40, 0xa6, 0x42, 0x50, 0x6d, 0x06, 0x43, 0x20, 0xd2, 0xdb, 0xc1, +0xd5, 0xe7, 0xa8, 0x42, 0xfc, 0xe9, 0x06, 0x43, 0xaf, 0x25, 0xc1, 0xc1, 0x3e, 0x68, 0xab, 0x42, 0x19, 0x24, 0x08, 0x43, 0x32, 0xc4, 0xc2, 0xc1, 0x6b, 0x9a, 0xa8, 0x42, 0x4e, 0x82, 0x07, 0x43, 0x73, 0x68, 0xdc, 0xc1, 0xde, 0xa2, 0xaa, 0x42, 0x40, 0x35, 0xfc, 0x42, 0xb3, 0x7b, 0xe0, 0xc1, 0x52, 0xf6, 0xad, 0x42, 0x73, 0xe8, 0xfe, 0x42, 0x5d, 0x4b, 0xe3, 0xc1, 0x1d, 0x29, 0xb1, 0x42, 0x11, 0x78, 0x00, 0x43, 0x4d, 0x04, 0xe6, 0xc1, 0x93, 0xe9, 0xb4, 0x42, 0xb7, 0xd3, 0x01, 0x43, +0xba, 0xb8, 0xcd, 0xc1, 0x5e, 0x1a, 0xb1, 0x42, 0x73, 0x48, 0x00, 0x43, 0xa9, 0x82, 0xc9, 0xc1, 0xda, 0xbb, 0xad, 0x42, 0x5c, 0x8f, 0xfd, 0x42, 0xcf, 0x55, 0xc5, 0xc1, 0xd1, 0xe0, 0xac, 0x42, 0x90, 0x22, 0x08, 0x43, 0x56, 0xec, 0xed, 0xc1, 0x2b, 0x76, 0xb1, 0x42, 0x00, 0x60, 0x0a, 0x43, 0xa8, 0x24, 0xce, 0xc1, 0x40, 0x84, 0xb9, 0x42, 0x50, 0x8d, 0x04, 0x43, 0x38, 0x56, 0xd7, 0xc1, 0xbc, 0xe5, 0xb7, 0x42, 0x1b, 0x0f, 0x03, 0x43, 0x03, 0xf8, 0xd1, 0xc1, 0xd3, 0x0b, 0xb4, 0x42, +0xe6, 0xf0, 0x01, 0x43, 0xee, 0xda, 0xf3, 0xc1, 0x44, 0x0b, 0xb3, 0x42, 0x17, 0x19, 0x01, 0x43, 0x04, 0xd6, 0xeb, 0xc1, 0x29, 0xdc, 0x9a, 0x42, 0xd7, 0x23, 0xd9, 0x42, 0xb8, 0x9e, 0xd9, 0xc1, 0x95, 0x54, 0x95, 0x42, 0x28, 0xb1, 0xdc, 0x42, 0xa6, 0xf9, 0x03, 0xc2, 0x82, 0x71, 0x9f, 0x42, 0x5b, 0xe4, 0xd8, 0x42, 0xea, 0x26, 0xd9, 0xc1, 0xbb, 0x78, 0x9a, 0x42, 0x7b, 0x14, 0xdc, 0x42, 0xdf, 0x0f, 0x03, 0xc2, 0x0c, 0xb1, 0x99, 0x42, 0x59, 0x79, 0xe3, 0x42, 0x31, 0x19, 0x07, 0xc2, +0x3a, 0xa1, 0x98, 0x42, 0x01, 0x40, 0xe1, 0x42, 0x6f, 0x92, 0x08, 0xc2, 0xf4, 0x3d, 0x94, 0x42, 0xdc, 0x39, 0xe4, 0x42, 0x09, 0xb9, 0x09, 0xc2, 0x43, 0xed, 0x92, 0x42, 0x8c, 0x2c, 0xe2, 0x42, 0xb5, 0xc8, 0x0b, 0xc2, 0x46, 0xa5, 0x99, 0x42, 0xa9, 0xc6, 0xe5, 0x42, 0xb3, 0x6a, 0xec, 0xc1, 0x15, 0x0c, 0x9d, 0x42, 0x07, 0x81, 0xe5, 0x42, 0xc1, 0x97, 0xd0, 0xc1, 0x43, 0x5c, 0x9f, 0x42, 0x4c, 0xb7, 0xe4, 0x42, 0x2e, 0xff, 0xba, 0xc1, 0xe0, 0xcd, 0xa1, 0x42, 0xa9, 0x46, 0xe5, 0x42, +0xd9, 0xbd, 0xd5, 0xc1, 0x9c, 0x22, 0xa4, 0x42, 0xbb, 0x09, 0xe4, 0x42, 0x1d, 0xc9, 0xc0, 0xc1, 0x72, 0xc8, 0x9f, 0x42, 0x7a, 0xe9, 0xd7, 0x42, 0x9c, 0x33, 0xb0, 0xc1, 0x14, 0xae, 0xa3, 0x42, 0x36, 0x9e, 0xd7, 0x42, 0xcf, 0x55, 0xb4, 0xc1, 0x72, 0x39, 0xa1, 0x42, 0x61, 0x25, 0xe4, 0x42, 0xbd, 0x63, 0xa8, 0xc1, 0xb8, 0xaf, 0xa5, 0x42, 0x3a, 0xf4, 0xe2, 0x42, 0x0f, 0xfa, 0xad, 0xc1, 0xc5, 0xef, 0xa3, 0x42, 0x82, 0x95, 0xd7, 0x42, 0xa1, 0xd6, 0xd6, 0xc1, 0x82, 0x82, 0xa0, 0x42, +0x53, 0xf8, 0xda, 0x42, 0xf5, 0x4a, 0xfb, 0xc1, 0x82, 0x33, 0xa0, 0x42, 0x82, 0x55, 0xdf, 0x42, 0x3a, 0x41, 0x03, 0xc2, 0x95, 0x63, 0xa1, 0x42, 0x61, 0x65, 0xe2, 0x42, 0x5c, 0xfe, 0x02, 0xc2, 0xee, 0xba, 0xa6, 0x42, 0x61, 0x65, 0xe3, 0x42, 0xdb, 0x79, 0xdd, 0xc1, 0xee, 0x4b, 0xaa, 0x42, 0xbf, 0x9f, 0xe2, 0x42, 0xa0, 0x1a, 0xca, 0xc1, 0xbd, 0x83, 0xa7, 0x42, 0x26, 0x86, 0xd6, 0x42, 0x7f, 0xea, 0xb6, 0xc1, 0xf3, 0xff, 0xac, 0x42, 0xd8, 0x63, 0xe2, 0x42, 0xd1, 0x11, 0xb7, 0xc1, +0x23, 0xbb, 0xa2, 0x42, 0xea, 0x46, 0x04, 0x43, 0xfb, 0xcb, 0xbb, 0xc1, 0xd1, 0x00, 0x9f, 0x42, 0x25, 0x06, 0x03, 0x43, 0x6b, 0x1a, 0xdb, 0xc1, 0xfb, 0x1a, 0x9f, 0x42, 0xd3, 0x0d, 0x04, 0x43, 0x27, 0x31, 0xb6, 0xc1, 0x86, 0x58, 0x9c, 0x42, 0xea, 0x06, 0x02, 0x43, 0xa6, 0xf9, 0xd6, 0xc1, 0x24, 0xf7, 0xaa, 0x42, 0x7e, 0x3f, 0xfb, 0x42, 0x1e, 0x96, 0xc1, 0xc1, 0xc7, 0x09, 0xa8, 0x42, 0xa3, 0xf0, 0xf9, 0x42, 0x9b, 0x44, 0xdd, 0xc1, 0x07, 0x6e, 0xa5, 0x42, 0x51, 0xcd, 0xf3, 0x42, +0x81, 0x84, 0xec, 0xc1, 0x78, 0x5a, 0xa1, 0x42, 0xf9, 0x93, 0xf8, 0x42, 0xcb, 0xff, 0x13, 0xc2, 0x39, 0x14, 0x9c, 0x42, 0x7e, 0xbf, 0xf3, 0x42, 0x92, 0x1c, 0x14, 0xc2, 0x8d, 0x06, 0x9c, 0x42, 0x3c, 0x9f, 0xee, 0x42, 0x65, 0x2a, 0x13, 0xc2, 0x3a, 0x21, 0x96, 0x42, 0xd8, 0xe3, 0xf0, 0x42, 0xf0, 0x96, 0x13, 0xc2, 0x16, 0xea, 0x9b, 0x42, 0xd0, 0xf7, 0xfa, 0x42, 0x83, 0xef, 0x0a, 0xc2, 0x96, 0x92, 0x9f, 0x42, 0x0f, 0xed, 0x01, 0x43, 0x76, 0x60, 0xef, 0xc1, 0x53, 0xa5, 0x9e, 0x42, +0xbf, 0x5f, 0xec, 0x42, 0x3a, 0x52, 0x06, 0xc2, 0xb2, 0xfd, 0xa1, 0x42, 0xf0, 0xe7, 0xef, 0x42, 0x7e, 0x3f, 0xfc, 0xc1, 0x3c, 0x2c, 0xa6, 0x42, 0x09, 0xac, 0xfe, 0x42, 0x63, 0x9d, 0x11, 0xc2, 0x67, 0x15, 0x91, 0x42, 0x8c, 0x6c, 0xef, 0x42, 0x54, 0xa3, 0x12, 0xc2, 0x19, 0xb3, 0x7a, 0x42, 0x65, 0x3b, 0xef, 0x42, 0xa6, 0xf9, 0x0e, 0xc2, 0xfb, 0x7a, 0x74, 0x42, 0x75, 0x93, 0xe8, 0x42, 0x40, 0xd3, 0x11, 0xc2, 0x62, 0xb0, 0x88, 0x42, 0x7a, 0xa9, 0xde, 0x42, 0xb1, 0x7f, 0x11, 0xc2, +0x61, 0x52, 0x8f, 0x42, 0x6b, 0x1c, 0x08, 0x43, 0x09, 0xf9, 0x7e, 0xc1, 0x25, 0x04, 0x8d, 0x42, 0xaa, 0x51, 0x06, 0x43, 0x83, 0x2f, 0xa2, 0xc1, 0x01, 0x1c, 0xa5, 0x42, 0xf0, 0xe7, 0x04, 0x43, 0x76, 0xcf, 0xbe, 0xc1, 0x48, 0x5f, 0xba, 0x42, 0xee, 0x7c, 0x06, 0x43, 0x21, 0x9f, 0xdc, 0xc1, 0xee, 0xbc, 0xb3, 0x42, 0xfd, 0xe9, 0xde, 0x42, 0xdf, 0xe0, 0xbf, 0xc1, 0x45, 0xd8, 0xb0, 0x42, 0xc2, 0xf5, 0xdf, 0x42, 0xd2, 0x22, 0xd5, 0xc1, 0x22, 0xec, 0x8f, 0x42, 0x32, 0xc8, 0xe4, 0x42, +0x03, 0x27, 0x10, 0xc2, 0xe6, 0x8e, 0x96, 0x42, 0x28, 0xf1, 0xe4, 0x42, 0x25, 0x86, 0x04, 0xc2, 0x6e, 0x72, 0x9e, 0x42, 0xd6, 0xb8, 0xe5, 0x42, 0xad, 0xd8, 0xed, 0xc1, 0xb0, 0x12, 0x9c, 0x42, 0x96, 0x83, 0xe4, 0x42, 0x5d, 0xdc, 0x01, 0xc2, 0x0a, 0xc8, 0xa2, 0x42, 0x84, 0xc0, 0xe3, 0x42, 0x9a, 0x77, 0xfc, 0xc1, 0x59, 0xd5, 0xa2, 0x42, 0xd8, 0xe3, 0xe4, 0x42, 0xe3, 0x36, 0xee, 0xc1, 0x5d, 0xbc, 0x9c, 0x42, 0x5b, 0x64, 0xec, 0x42, 0xdb, 0x28, 0x0e, 0xc2, 0x92, 0xdc, 0xaa, 0x42, +0xff, 0x14, 0xe1, 0x42, 0xde, 0x24, 0xec, 0xc1, 0xd3, 0x6d, 0xb4, 0x42, 0xc2, 0x75, 0x03, 0x43, 0xa9, 0x93, 0xfd, 0xc1, 0x19, 0xb3, 0x7a, 0x42, 0x65, 0x3b, 0xef, 0x42, 0xa6, 0xf9, 0x0e, 0xc2, 0x50, 0x7c, 0x96, 0x42, 0xd6, 0xb8, 0xf1, 0x42, 0x7f, 0x59, 0xba, 0xc1, 0x5f, 0x98, 0xa1, 0x42, 0x40, 0x15, 0x04, 0x43, 0x4a, 0x7b, 0xdd, 0xc1, 0x25, 0x04, 0x8d, 0x42, 0xaa, 0x51, 0x06, 0x43, 0x83, 0x2f, 0xa2, 0xc1, 0x3a, 0xe3, 0x8b, 0x42, 0x19, 0xe4, 0x07, 0x43, 0xfb, 0x4b, 0xa9, 0xc1, +0x61, 0x52, 0x8f, 0x42, 0x6b, 0x1c, 0x08, 0x43, 0x09, 0xf9, 0x7e, 0xc1, 0x85, 0x7a, 0x88, 0x42, 0x85, 0xab, 0x03, 0x43, 0x62, 0xa1, 0xd1, 0xc1, 0xbc, 0xe5, 0x87, 0x42, 0x80, 0xaa, 0xfd, 0x42, 0x27, 0x0f, 0xe4, 0xc1, 0x19, 0xb3, 0x7a, 0x42, 0x65, 0x3b, 0xef, 0x42, 0xa6, 0xf9, 0x0e, 0xc2, 0x27, 0xe0, 0x86, 0x42, 0xa3, 0x45, 0xfe, 0x42, 0x5e, 0x29, 0xec, 0xc1, 0x84, 0x3c, 0x7b, 0x42, 0xbf, 0x5f, 0xf1, 0x42, 0x7a, 0xf6, 0x0f, 0xc2, 0x8a, 0x4e, 0x72, 0x42, 0x57, 0x4e, 0xeb, 0x42, +0xf1, 0x92, 0x15, 0xc2, 0x7a, 0x69, 0x7a, 0x42, 0x73, 0x28, 0xdc, 0x42, 0xb0, 0xe1, 0xfe, 0xc1, 0x4f, 0x5e, 0x78, 0x42, 0xad, 0x1c, 0xdb, 0x42, 0x29, 0x9c, 0x04, 0xc2, 0x8a, 0xce, 0x74, 0x42, 0x92, 0xed, 0xe2, 0x42, 0x85, 0x1a, 0x0d, 0xc2, 0xba, 0x1a, 0x73, 0x42, 0x77, 0x7e, 0xe2, 0x42, 0x98, 0xcc, 0x10, 0xc2, 0xd2, 0xef, 0x88, 0x42, 0x2a, 0x9c, 0xd1, 0x42, 0xcd, 0x4c, 0xb4, 0xc1, 0xfb, 0x7a, 0x74, 0x42, 0x75, 0x93, 0xe8, 0x42, 0x40, 0xd3, 0x11, 0xc2, 0x8a, 0xce, 0x74, 0x42, +0x92, 0xed, 0xe2, 0x42, 0x85, 0x1a, 0x0d, 0xc2, 0x56, 0xdd, 0x82, 0x42, 0x57, 0x0e, 0xd7, 0x42, 0x38, 0x56, 0xd7, 0xc1, 0x7a, 0x69, 0x7a, 0x42, 0x73, 0x28, 0xdc, 0x42, 0xb0, 0xe1, 0xfe, 0xc1, 0xc0, 0x7b, 0x82, 0x42, 0xb9, 0xde, 0xd3, 0x42, 0x3d, 0x79, 0xe1, 0xc1, 0x8a, 0xce, 0x74, 0x42, 0x92, 0xed, 0xe2, 0x42, 0x85, 0x1a, 0x0d, 0xc2, 0x7a, 0x69, 0x7a, 0x42, 0x73, 0x28, 0xdc, 0x42, 0xb0, 0xe1, 0xfe, 0xc1, 0xe4, 0xa3, 0x90, 0x42, 0x21, 0xf0, 0xd3, 0x42, 0xc1, 0x39, 0x74, 0xc1, +0xc2, 0x57, 0x8c, 0x42, 0x3e, 0x4a, 0xd5, 0x42, 0xc4, 0x31, 0xa1, 0xc1, 0x25, 0x04, 0x8d, 0x42, 0xaa, 0x51, 0x06, 0x43, 0x83, 0x2f, 0xa2, 0xc1, 0x9b, 0x64, 0x8a, 0x42, 0xe8, 0x7b, 0x02, 0x43, 0xe4, 0x83, 0xc6, 0xc1, 0x9b, 0x64, 0x8a, 0x42, 0xe8, 0x7b, 0x02, 0x43, 0xe4, 0x83, 0xc6, 0xc1, 0xbc, 0xe5, 0x87, 0x42, 0x80, 0xaa, 0xfd, 0x42, 0x27, 0x0f, 0xe4, 0xc1, 0xfb, 0x7a, 0x74, 0x42, 0x75, 0x93, 0xe8, 0x42, 0x40, 0xd3, 0x11, 0xc2, 0x19, 0xb3, 0x7a, 0x42, 0x65, 0x3b, 0xef, 0x42, +0xa6, 0xf9, 0x0e, 0xc2, 0x8a, 0xce, 0x74, 0x42, 0x92, 0xed, 0xe2, 0x42, 0x85, 0x1a, 0x0d, 0xc2, 0xfb, 0x7a, 0x74, 0x42, 0x75, 0x93, 0xe8, 0x42, 0x40, 0xd3, 0x11, 0xc2, 0x56, 0xdd, 0x82, 0x42, 0x57, 0x0e, 0xd7, 0x42, 0x38, 0x56, 0xd7, 0xc1, 0x7a, 0x69, 0x7a, 0x42, 0x73, 0x28, 0xdc, 0x42, 0xb0, 0xe1, 0xfe, 0xc1, 0xc2, 0x57, 0x8c, 0x42, 0x3e, 0x4a, 0xd5, 0x42, 0xc4, 0x31, 0xa1, 0xc1, 0x56, 0xdd, 0x82, 0x42, 0x57, 0x0e, 0xd7, 0x42, 0x38, 0x56, 0xd7, 0xc1, 0x56, 0x9d, 0x8e, 0x42, +0xbb, 0xc9, 0xe0, 0x42, 0x6b, 0x09, 0x10, 0xc2, 0xff, 0xa1, 0x88, 0x42, 0xe8, 0x3b, 0xdd, 0x42, 0x91, 0x2d, 0x0d, 0xc2, 0x08, 0xe6, 0xc4, 0x3f, 0x32, 0x75, 0x84, 0x42, 0x10, 0xe9, 0x42, 0xc2, 0xcc, 0xee, 0x2e, 0xc1, 0xad, 0xdc, 0xe1, 0x42, 0x1d, 0x72, 0x00, 0x41, 0x43, 0xc5, 0x1c, 0xc1, 0x8a, 0x41, 0xd8, 0x42, 0x3c, 0x2c, 0xe7, 0x40, 0x7b, 0x8f, 0x00, 0xc1, 0x15, 0xee, 0xce, 0x42, 0x64, 0xe4, 0xca, 0x40, 0x78, 0x5d, 0xb5, 0xc0, 0xd9, 0x3d, 0xc6, 0x42, 0x3f, 0xc6, 0xa8, 0x40, +0xab, 0x90, 0x34, 0xc0, 0x05, 0x52, 0xbe, 0x42, 0x2c, 0x82, 0x81, 0x40, 0xe4, 0x72, 0x87, 0xc2, 0x3a, 0xb4, 0x2a, 0x42, 0x27, 0xda, 0xf1, 0xbf, 0x0d, 0xc3, 0xa7, 0x3f, 0x2e, 0x10, 0xb7, 0x42, 0xbe, 0x82, 0xbd, 0x40, 0x5f, 0x98, 0xed, 0xc0, 0x19, 0xc4, 0xce, 0x42, 0x93, 0x7b, 0x03, 0x41, 0x25, 0x1e, 0x9d, 0xc0, 0x02, 0x0b, 0xc6, 0x42, 0x56, 0xec, 0xf7, 0x40, 0xec, 0xa3, 0xf3, 0xbf, 0x2e, 0x4e, 0xbe, 0x42, 0xbf, 0xd4, 0xe2, 0x40, 0x3a, 0xc1, 0x6c, 0x42, 0xda, 0x9b, 0xb7, 0x42, +0x1d, 0x3d, 0x0f, 0x41, 0xbf, 0x9f, 0x38, 0xc1, 0x7f, 0x6a, 0x22, 0x41, 0x8e, 0x64, 0x9f, 0x41, 0xc7, 0xf4, 0xaf, 0xc0, 0x2f, 0x4c, 0x22, 0x41, 0xa6, 0x8a, 0xae, 0x41, 0x2c, 0xd4, 0x7e, 0xc1, 0xf0, 0x85, 0x22, 0x41, 0x3d, 0x0a, 0x83, 0x41, 0xd7, 0xa3, 0x9a, 0xc1, 0x40, 0xa4, 0x22, 0x41, 0xd3, 0x2b, 0x3a, 0x41, 0x07, 0x4e, 0xb4, 0xc1, 0x89, 0xb0, 0x22, 0x41, 0x6a, 0xd9, 0x8c, 0x40, 0x63, 0x10, 0x21, 0x42, 0x8b, 0xfd, 0x21, 0x41, 0xb8, 0xaf, 0x5a, 0x41, 0x42, 0xe0, 0x02, 0x42, +0xb5, 0x15, 0x22, 0x41, 0x48, 0x3f, 0x94, 0x41, 0x2c, 0x65, 0xb6, 0x41, 0xff, 0x21, 0x22, 0x41, 0x55, 0x9f, 0xad, 0x41, 0xec, 0x9e, 0x63, 0x41, 0x05, 0x34, 0x22, 0x41, 0x9e, 0x5e, 0xb8, 0x41, 0x86, 0xe6, 0x2c, 0x40, 0x27, 0x31, 0x22, 0x41, 0x5d, 0xed, 0xb8, 0x41, 0xad, 0xa9, 0x31, 0x42, 0xb2, 0x0c, 0x22, 0x41, 0xa7, 0x3a, 0xf2, 0x40, 0x24, 0x45, 0xda, 0x40, 0x27, 0x31, 0x22, 0x41, 0x80, 0x26, 0xbd, 0x41, 0xa3, 0x52, 0x3a, 0x42, 0xed, 0x7c, 0x22, 0x41, 0xfd, 0xdb, 0x4d, 0x3f, +0x8c, 0x39, 0xc9, 0xc1, 0x5f, 0x98, 0x22, 0x41, 0x36, 0x3c, 0x0d, 0xc0, 0x24, 0x28, 0x3a, 0x42, 0x9e, 0x5e, 0x22, 0x41, 0xf4, 0xb2, 0x05, 0xc1, 0xbb, 0x96, 0x49, 0xc1, 0x7f, 0x6a, 0x22, 0x41, 0x71, 0x2c, 0xe2, 0xc1, 0xc0, 0x5b, 0xd2, 0xc0, 0x73, 0x46, 0x22, 0x41, 0x0e, 0xad, 0xf0, 0xc1, 0x09, 0xf9, 0x93, 0xc1, 0x62, 0xa1, 0x22, 0x41, 0x5a, 0xe4, 0xcc, 0xc1, 0x24, 0x97, 0xad, 0xc1, 0x86, 0xa7, 0x22, 0x41, 0xc1, 0x39, 0xa4, 0xc1, 0x6b, 0x2b, 0xad, 0xc1, 0x3a, 0x92, 0x22, 0x41, +0x4f, 0xaf, 0x64, 0xc1, 0xc9, 0xa5, 0x22, 0x42, 0xe0, 0x2d, 0x22, 0x41, 0xa6, 0x9b, 0xaf, 0xc1, 0x79, 0xd8, 0x03, 0x42, 0xc3, 0x64, 0x22, 0x41, 0x5d, 0x4b, 0xd9, 0xc1, 0x33, 0xb3, 0xb7, 0x41, 0xf3, 0x8e, 0x22, 0x41, 0xf0, 0xa7, 0xfe, 0xc1, 0xea, 0x73, 0x5d, 0x41, 0x84, 0x9e, 0x22, 0x41, 0x88, 0x96, 0x06, 0xc2, 0x0c, 0x76, 0x07, 0x40, 0x7c, 0x61, 0x22, 0x41, 0xa2, 0xc5, 0x01, 0xc2, 0x54, 0x12, 0x33, 0x42, 0xbb, 0x27, 0x22, 0x41, 0x36, 0x3c, 0x78, 0xc1, 0xbb, 0x61, 0xc1, 0x40, +0x7c, 0x61, 0x22, 0x41, 0xa0, 0x1a, 0x02, 0xc2, 0x51, 0xda, 0xb5, 0xc1, 0x40, 0xa4, 0x22, 0x41, 0x02, 0xc8, 0x0c, 0xc1, 0x82, 0x73, 0x49, 0x41, 0xd6, 0xc5, 0x22, 0x41, 0x33, 0x8a, 0x73, 0xc0, 0x58, 0xf9, 0x2a, 0xc2, 0x41, 0x80, 0xb9, 0x42, 0xa3, 0xaa, 0x4f, 0xc0, 0x36, 0xde, 0x43, 0xc2, 0x9c, 0xc2, 0xbc, 0x42, 0x3d, 0xb8, 0x5b, 0xc0, 0xe4, 0x72, 0x87, 0xc2, 0x3a, 0xb4, 0x2a, 0x42, 0x27, 0xda, 0xf1, 0xbf, 0xd5, 0x98, 0x8a, 0xc2, 0xa8, 0x24, 0x50, 0x42, 0x96, 0xe7, 0xfd, 0xbf, +0x0a, 0x28, 0x8a, 0xc2, 0x04, 0x45, 0x6c, 0x42, 0x55, 0x30, 0xfe, 0xbf, 0x8d, 0x06, 0x88, 0xc2, 0x8c, 0x2c, 0x85, 0x42, 0x92, 0x57, 0xfb, 0xbf, 0x3a, 0xa1, 0x84, 0xc2, 0xd6, 0xf4, 0x96, 0x42, 0xa6, 0x96, 0x07, 0xc0, 0x68, 0x80, 0x76, 0xc2, 0xe1, 0x5a, 0xad, 0x42, 0xb4, 0x59, 0x3d, 0xc0, 0x1d, 0xc9, 0x5d, 0xc2, 0x95, 0xf4, 0xb8, 0x42, 0x10, 0xc7, 0x58, 0xc0, 0x36, 0xde, 0x43, 0xc2, 0x9c, 0xc2, 0xbc, 0x42, 0x3d, 0xb8, 0x5b, 0xc0, 0x9e, 0x8d, 0x14, 0xc2, 0xe2, 0xe7, 0xb1, 0x42, +0x76, 0x89, 0x3e, 0xc0, 0xea, 0x73, 0x03, 0xc2, 0xf0, 0x05, 0xa7, 0x42, 0x31, 0xeb, 0xf9, 0xbf, 0xc9, 0x54, 0xe9, 0xc1, 0x42, 0xbe, 0xa0, 0x42, 0x71, 0xfe, 0xd6, 0xbf, 0x9c, 0xc4, 0xa8, 0xc1, 0x8d, 0x28, 0x81, 0x42, 0x37, 0xda, 0x26, 0x42, 0x2a, 0x29, 0xe2, 0xc1, 0xc9, 0x65, 0x76, 0x42, 0xc8, 0xb6, 0x2a, 0x42, 0x7a, 0x4e, 0xca, 0x3f, 0xb7, 0xa0, 0x85, 0x42, 0x5b, 0xf1, 0x24, 0x42, 0xb1, 0xbf, 0x29, 0xc1, 0xc2, 0x26, 0x83, 0x42, 0x05, 0x12, 0x25, 0x42, 0x60, 0xd4, 0xa4, 0xc1, +0xb6, 0xe2, 0xf4, 0x41, 0x8a, 0x41, 0x3c, 0x42, 0x30, 0x99, 0xdf, 0xc1, 0x18, 0xe6, 0x11, 0x42, 0xc0, 0x8a, 0x3a, 0x42, 0xc8, 0x07, 0x00, 0xc2, 0x2b, 0x47, 0x2d, 0x42, 0x59, 0x06, 0x37, 0x42, 0xcb, 0x50, 0x05, 0xc2, 0xe4, 0x83, 0x48, 0x42, 0x5d, 0x6d, 0x33, 0x42, 0x81, 0x78, 0x1d, 0xc1, 0xb6, 0x04, 0xd1, 0x41, 0xad, 0x9c, 0x3c, 0x42, 0xfb, 0x8b, 0x00, 0xc2, 0x88, 0xf4, 0x61, 0x42, 0xe3, 0x54, 0x2f, 0x42, 0x71, 0xe6, 0x47, 0x40, 0xde, 0x82, 0xc0, 0x41, 0x3b, 0x1f, 0x3d, 0x42, +0x9f, 0x3c, 0x83, 0x41, 0xaa, 0x71, 0xbf, 0x41, 0x7e, 0x3b, 0x3c, 0x42, 0xac, 0x7a, 0xef, 0x41, 0x05, 0x34, 0xcf, 0x41, 0x2a, 0x18, 0x3a, 0x42, 0x3e, 0x57, 0x5b, 0x41, 0x64, 0x8c, 0x89, 0x42, 0xcc, 0x6e, 0x24, 0x42, 0x7c, 0xe1, 0xd3, 0x41, 0x4d, 0x84, 0x8a, 0x42, 0x96, 0x32, 0x25, 0x42, 0x08, 0xe6, 0xc4, 0x3f, 0x32, 0x75, 0x84, 0x42, 0x10, 0xe9, 0x42, 0xc2, 0x8d, 0x28, 0x32, 0xc1, 0x5f, 0xfa, 0x82, 0x42, 0x65, 0xc8, 0x42, 0xc2, 0x35, 0xef, 0xad, 0xc1, 0x04, 0x05, 0x80, 0x42, +0x44, 0x29, 0x45, 0xc2, 0x50, 0xeb, 0xe9, 0xc1, 0x5d, 0x2d, 0x73, 0x42, 0xd6, 0x05, 0x49, 0xc2, 0x58, 0x28, 0x01, 0xc2, 0x40, 0x93, 0x2c, 0x42, 0x78, 0x8b, 0x54, 0xc2, 0xad, 0xfa, 0x06, 0xc2, 0x8f, 0x31, 0x45, 0x42, 0xe3, 0x94, 0x51, 0xc2, 0x33, 0x22, 0xa3, 0xc1, 0xd8, 0xdf, 0xf9, 0x41, 0xe5, 0x21, 0x59, 0xc2, 0xcd, 0xaa, 0xde, 0xc1, 0xd8, 0x70, 0x13, 0x42, 0xb1, 0x72, 0x57, 0xc2, 0x07, 0xce, 0x20, 0xc1, 0x1a, 0xaf, 0xd4, 0x41, 0xb4, 0x08, 0x5a, 0xc2, 0xb7, 0x51, 0x03, 0xc2, +0xab, 0x7e, 0x5d, 0x42, 0x7e, 0xbb, 0x4d, 0xc2, 0xf0, 0xa7, 0x2e, 0x40, 0xbf, 0x6c, 0xc1, 0x41, 0xcb, 0x50, 0x5b, 0xc2, 0x92, 0x3a, 0x7e, 0x41, 0xc9, 0x54, 0xbf, 0x41, 0x8c, 0xec, 0x5a, 0xc2, 0xf6, 0x06, 0xec, 0x41, 0xcc, 0x5d, 0xd0, 0x41, 0xe3, 0x54, 0x58, 0xc2, 0x74, 0x24, 0x5a, 0x41, 0xc0, 0xbb, 0x87, 0x42, 0x64, 0x8c, 0x42, 0xc2, 0x23, 0xdb, 0xd5, 0x41, 0x5d, 0x0d, 0x88, 0x42, 0x88, 0x23, 0x43, 0xc2 + }; + + + static byte[] k_rgIndices = + { + 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x05, 0x00, 0x05, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x05, 0x00, 0x05, 0x00, 0x10, 0x00, 0x12, 0x00, 0x10, 0x00, 0x13, 0x00, 0x12, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x13, 0x00, 0x10, 0x00, 0x15, 0x00, 0x15, 0x00, 0x10, 0x00, 0x11, 0x00, 0x16, 0x00, 0x06, 0x00, 0x12, 0x00, 0x12, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x09, 0x00, 0x09, 0x00, 0x16, 0x00, 0x17, 0x00, 0x16, 0x00, 0x18, 0x00, 0x17, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x18, 0x00, 0x16, 0x00, +0x14, 0x00, 0x14, 0x00, 0x16, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x0b, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x1e, 0x00, 0x1d, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x13, 0x00, 0x22, 0x00, 0x22, 0x00, 0x13, 0x00, 0x15, 0x00, 0x13, 0x00, 0x21, 0x00, 0x14, 0x00, 0x14, 0x00, 0x21, 0x00, 0x23, 0x00, +0x21, 0x00, 0x24, 0x00, 0x23, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x24, 0x00, 0x21, 0x00, 0x26, 0x00, 0x26, 0x00, 0x21, 0x00, 0x22, 0x00, 0x27, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x20, 0x00, 0x20, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2a, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0x29, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x29, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x29, 0x00, 0x28, 0x00, 0x28, 0x00, +0x29, 0x00, 0x20, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30, 0x00, 0x32, 0x00, 0x32, 0x00, 0x30, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x33, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x32, 0x00, 0x2c, 0x00, 0x33, 0x00, 0x34, 0x00, 0x32, 0x00, 0x32, 0x00, 0x34, 0x00, 0x31, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x37, 0x00, 0x36, 0x00, 0x38, 0x00, 0x36, 0x00, 0x2f, 0x00, +0x38, 0x00, 0x38, 0x00, 0x2f, 0x00, 0x31, 0x00, 0x34, 0x00, 0x39, 0x00, 0x31, 0x00, 0x31, 0x00, 0x39, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x3c, 0x00, 0x3e, 0x00, 0x3c, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x35, 0x00, 0x37, 0x00, 0x3a, 0x00, 0x3f, 0x00, 0x37, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x40, 0x00, 0x3d, 0x00, +0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x43, 0x00, 0x42, 0x00, 0x44, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x45, 0x00, 0x44, 0x00, 0x46, 0x00, 0x44, 0x00, 0x47, 0x00, 0x46, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x47, 0x00, 0x44, 0x00, 0x49, 0x00, 0x49, 0x00, 0x44, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4b, 0x00, 0x4d, 0x00, 0x4b, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4a, 0x00, 0x4f, 0x00, 0x4a, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x4f, 0x00, +0x43, 0x00, 0x45, 0x00, 0x43, 0x00, 0x4a, 0x00, 0x41, 0x00, 0x41, 0x00, 0x4a, 0x00, 0x4c, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x50, 0x00, 0x51, 0x00, 0x4f, 0x00, 0x45, 0x00, 0x50, 0x00, 0x50, 0x00, 0x45, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x55, 0x00, 0x54, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x59, 0x00, 0x58, 0x00, 0x5a, 0x00, 0x58, 0x00, 0x5b, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x54, 0x00, 0x53, 0x00, +0x5d, 0x00, 0x5d, 0x00, 0x53, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x61, 0x00, 0x60, 0x00, 0x62, 0x00, 0x60, 0x00, 0x53, 0x00, 0x62, 0x00, 0x62, 0x00, 0x53, 0x00, 0x55, 0x00, 0x53, 0x00, 0x60, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x60, 0x00, 0x63, 0x00, 0x60, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x64, 0x00, 0x64, 0x00, 0x66, 0x00, 0x63, 0x00, 0x66, 0x00, 0x67, 0x00, 0x63, 0x00, 0x63, 0x00, 0x67, 0x00, 0x5e, 0x00, +0x67, 0x00, 0x66, 0x00, 0x68, 0x00, 0x68, 0x00, 0x66, 0x00, 0x69, 0x00, 0x66, 0x00, 0x65, 0x00, 0x69, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, 0x6c, 0x00, 0x6b, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x71, 0x00, 0x18, 0x00, 0x23, 0x00, 0x23, 0x00, +0x18, 0x00, 0x14, 0x00, 0x18, 0x00, 0x71, 0x00, 0x19, 0x00, 0x19, 0x00, 0x71, 0x00, 0x72, 0x00, 0x71, 0x00, 0x73, 0x00, 0x72, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x73, 0x00, 0x71, 0x00, 0x25, 0x00, 0x25, 0x00, 0x71, 0x00, 0x23, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x77, 0x00, 0x76, 0x00, 0x78, 0x00, 0x76, 0x00, 0x79, 0x00, 0x78, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x24, 0x00, 0x7b, 0x00, 0x25, 0x00, 0x25, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7b, 0x00, 0x7d, 0x00, +0x7c, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7d, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7b, 0x00, 0x80, 0x00, 0x7b, 0x00, 0x24, 0x00, 0x80, 0x00, 0x80, 0x00, 0x24, 0x00, 0x26, 0x00, 0x73, 0x00, 0x81, 0x00, 0x74, 0x00, 0x74, 0x00, 0x81, 0x00, 0x82, 0x00, 0x81, 0x00, 0x83, 0x00, 0x82, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x83, 0x00, 0x81, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x81, 0x00, 0x7c, 0x00, 0x81, 0x00, 0x73, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x73, 0x00, 0x25, 0x00, +0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x87, 0x00, 0x86, 0x00, 0x88, 0x00, 0x79, 0x00, 0x85, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x85, 0x00, 0x87, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x8a, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x8e, 0x00, 0x4c, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x8f, 0x00, 0x41, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x92, 0x00, 0x91, 0x00, 0x93, 0x00, 0x91, 0x00, 0x94, 0x00, 0x93, 0x00, 0x93, 0x00, +0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x98, 0x00, 0x97, 0x00, 0x99, 0x00, 0x97, 0x00, 0x3b, 0x00, 0x99, 0x00, 0x99, 0x00, 0x3b, 0x00, 0x3d, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x49, 0x00, 0x49, 0x00, 0x9b, 0x00, 0x47, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x47, 0x00, 0x47, 0x00, 0x9c, 0x00, 0x48, 0x00, 0x9c, 0x00, 0x9b, 0x00, 0x96, 0x00, 0x96, 0x00, 0x9b, 0x00, 0x97, 0x00, 0x9b, 0x00, 0x9a, 0x00, 0x97, 0x00, 0x97, 0x00, 0x9a, 0x00, 0x3b, 0x00, 0x40, 0x00, 0x9d, 0x00, +0x3d, 0x00, 0x3d, 0x00, 0x9d, 0x00, 0x99, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x99, 0x00, 0x99, 0x00, 0x9e, 0x00, 0x98, 0x00, 0x9f, 0x00, 0x52, 0x00, 0x46, 0x00, 0x46, 0x00, 0x52, 0x00, 0x45, 0x00, 0x46, 0x00, 0x48, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x48, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0xa2, 0x00, 0x5a, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0xa3, 0x00, 0x59, 0x00, 0xa3, 0x00, 0xa2, 0x00, 0x95, 0x00, 0x95, 0x00, 0xa2, 0x00, 0x93, 0x00, +0xa2, 0x00, 0xa1, 0x00, 0x93, 0x00, 0x93, 0x00, 0xa1, 0x00, 0x92, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0xa5, 0x00, 0xa7, 0x00, 0xa5, 0x00, 0xa8, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xa8, 0x00, 0xa5, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0xa5, 0x00, 0x6e, 0x00, 0xa5, 0x00, 0xa4, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0xa4, 0x00, 0x6d, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0xab, 0x00, 0x92, 0x00, 0xac, 0x00, 0xad, 0x00, 0x68, 0x00, 0x68, 0x00, +0xad, 0x00, 0x67, 0x00, 0xad, 0x00, 0x5d, 0x00, 0x67, 0x00, 0x67, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5b, 0x00, 0xaa, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0xaa, 0x00, 0xa1, 0x00, 0x70, 0x00, 0xae, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0xae, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xae, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xae, 0x00, 0x5f, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x5f, 0x00, 0x61, 0x00, 0x5f, 0x00, 0xae, 0x00, 0x64, 0x00, 0x64, 0x00, 0xae, 0x00, 0x70, 0x00, 0x9e, 0x00, 0xb0, 0x00, +0x98, 0x00, 0x98, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb0, 0x00, 0xb2, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xb5, 0x00, 0xa0, 0x00, 0xb5, 0x00, 0xb4, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xb4, 0x00, 0xb8, 0x00, 0xb4, 0x00, 0xb9, 0x00, 0xb8, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xb9, 0x00, 0xb4, 0x00, 0x96, 0x00, 0x96, 0x00, 0xb4, 0x00, 0xb6, 0x00, 0xba, 0x00, 0xb9, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xb9, 0x00, 0xb1, 0x00, +0xb1, 0x00, 0xb9, 0x00, 0x98, 0x00, 0x98, 0x00, 0xb9, 0x00, 0x96, 0x00, 0xb5, 0x00, 0xbb, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xbb, 0x00, 0x9f, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xbc, 0x00, 0x52, 0x00, 0xbc, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xbb, 0x00, 0xbe, 0x00, 0xbb, 0x00, 0xb5, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xb5, 0x00, 0xb7, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xc0, 0x00, 0x0e, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc3, 0x00, +0xc2, 0x00, 0xc4, 0x00, 0xc2, 0x00, 0xbf, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0xbf, 0x00, 0x0f, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0x03, 0x00, 0x03, 0x00, 0xc6, 0x00, 0x02, 0x00, 0xc0, 0x00, 0xc7, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xc7, 0x00, 0x1b, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0xc9, 0x00, 0xc3, 0x00, 0xc9, 0x00, 0xc8, 0x00, 0xca, 0x00, 0xca, 0x00, 0xc8, 0x00, 0xcb, 0x00, 0xc8, 0x00, 0x0a, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0xc8, 0x00, +0x0f, 0x00, 0x0f, 0x00, 0xc8, 0x00, 0xc4, 0x00, 0xc6, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x02, 0x00, 0xcc, 0x00, 0x11, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0x11, 0x00, 0x11, 0x00, 0xcd, 0x00, 0x15, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xcf, 0x00, 0xd1, 0x00, 0xcf, 0x00, 0xd2, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd5, 0x00, 0xd7, 0x00, 0xd5, 0x00, 0xd4, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xd4, 0x00, 0xd9, 0x00, +0xd2, 0x00, 0xda, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0xda, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0xda, 0x00, 0xdd, 0x00, 0xde, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xdf, 0x00, 0xe1, 0x00, 0xdf, 0x00, 0xd6, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0xe3, 0x00, 0xdc, 0x00, 0xe3, 0x00, 0xe2, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0xe2, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe8, 0x00, +0xe7, 0x00, 0xe9, 0x00, 0xe7, 0x00, 0xde, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xde, 0x00, 0xe0, 0x00, 0xea, 0x00, 0x9a, 0x00, 0xeb, 0x00, 0xeb, 0x00, 0x9a, 0x00, 0x49, 0x00, 0x9a, 0x00, 0xea, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0xea, 0x00, 0x3c, 0x00, 0xea, 0x00, 0xec, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0xec, 0x00, 0x35, 0x00, 0x9c, 0x00, 0xb6, 0x00, 0x48, 0x00, 0x48, 0x00, 0xb6, 0x00, 0xa0, 0x00, 0xb6, 0x00, 0x9c, 0x00, 0x96, 0x00, 0xec, 0x00, 0xed, 0x00, 0x35, 0x00, 0x35, 0x00, 0xed, 0x00, +0x36, 0x00, 0xed, 0x00, 0xee, 0x00, 0x36, 0x00, 0x36, 0x00, 0xee, 0x00, 0x2f, 0x00, 0xee, 0x00, 0xef, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0xef, 0x00, 0x30, 0x00, 0x30, 0x00, 0xef, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0xef, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x2a, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2a, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xf4, 0x00, 0xca, 0x00, 0xf3, 0x00, 0x1d, 0x00, 0xf2, 0x00, +0xf2, 0x00, 0x1d, 0x00, 0x1f, 0x00, 0x1d, 0x00, 0xf3, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xf3, 0x00, 0xcb, 0x00, 0xcd, 0x00, 0xf5, 0x00, 0x15, 0x00, 0x15, 0x00, 0xf5, 0x00, 0x22, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0x22, 0x00, 0x22, 0x00, 0xf6, 0x00, 0x26, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0x26, 0x00, 0x26, 0x00, 0xf7, 0x00, 0x80, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0x80, 0x00, 0x80, 0x00, 0xf8, 0x00, 0x7f, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0xfa, 0x00, 0xfc, 0x00, 0xf8, 0x00, +0xf9, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0xf9, 0x00, 0xfb, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0xfe, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0xfd, 0x00, 0xff, 0x00, 0xff, 0x00, 0xfd, 0x00, 0x89, 0x00, 0x00, 0x01, 0x01, 0x01, 0x86, 0x00, 0x86, 0x00, 0x01, 0x01, 0x88, 0x00, 0x02, 0x01, 0x03, 0x01, 0x00, 0x01, 0x00, 0x01, 0x03, 0x01, 0x01, 0x01, 0x8b, 0x00, 0x8f, 0x00, 0x89, 0x00, 0x89, 0x00, 0x8f, 0x00, 0xff, 0x00, 0x04, 0x01, 0x42, 0x00, 0x8b, 0x00, 0x42, 0x00, 0x41, 0x00, +0x8b, 0x00, 0x8b, 0x00, 0x41, 0x00, 0x8f, 0x00, 0x05, 0x01, 0x06, 0x01, 0xf7, 0x00, 0xf7, 0x00, 0x06, 0x01, 0xf8, 0x00, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x09, 0x01, 0x08, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x07, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0x07, 0x01, 0x09, 0x01, 0x0d, 0x01, 0x05, 0x01, 0xf6, 0x00, 0xf6, 0x00, 0x05, 0x01, 0xf7, 0x00, 0x0e, 0x01, 0x0f, 0x01, 0xf9, 0x00, 0xf9, 0x00, 0x0f, 0x01, 0xfa, 0x00, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x12, 0x01, 0x11, 0x01, 0x13, 0x01, +0x08, 0x01, 0x10, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x10, 0x01, 0x12, 0x01, 0x06, 0x01, 0x0e, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0x0e, 0x01, 0xf9, 0x00, 0xf3, 0x00, 0x14, 0x01, 0xf4, 0x00, 0xf4, 0x00, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x18, 0x01, 0x17, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1b, 0x01, 0x1d, 0x01, 0x14, 0x01, 0xf3, 0x00, 0x1e, 0x01, 0x1e, 0x01, 0xf3, 0x00, 0xf2, 0x00, 0x1f, 0x01, 0x0d, 0x01, 0xf5, 0x00, 0xf5, 0x00, +0x0d, 0x01, 0xf6, 0x00, 0x20, 0x01, 0x0b, 0x01, 0x21, 0x01, 0x21, 0x01, 0x0b, 0x01, 0x0c, 0x01, 0xf1, 0x00, 0x22, 0x01, 0xf2, 0x00, 0xf2, 0x00, 0x22, 0x01, 0x1e, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x23, 0x01, 0x23, 0x01, 0x1d, 0x01, 0x24, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x25, 0x01, 0x24, 0x01, 0x26, 0x01, 0x22, 0x01, 0xf1, 0x00, 0x27, 0x01, 0x27, 0x01, 0xf1, 0x00, 0xf0, 0x00, 0xef, 0x00, 0x28, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0x28, 0x01, 0x27, 0x01, 0x25, 0x01, 0x26, 0x01, +0x29, 0x01, 0x29, 0x01, 0x26, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x29, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x2d, 0x01, 0x28, 0x01, 0xee, 0x00, 0xee, 0x00, 0x28, 0x01, 0xef, 0x00, 0x2e, 0x01, 0x2f, 0x01, 0xea, 0x00, 0xea, 0x00, 0x2f, 0x01, 0xec, 0x00, 0x30, 0x01, 0x31, 0x01, 0x32, 0x01, 0x32, 0x01, 0x31, 0x01, 0x33, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x36, 0x01, 0x35, 0x01, 0x37, 0x01, 0x38, 0x01, 0x2e, 0x01, 0xeb, 0x00, 0xeb, 0x00, 0x2e, 0x01, 0xea, 0x00, +0x39, 0x01, 0x2d, 0x01, 0xed, 0x00, 0xed, 0x00, 0x2d, 0x01, 0xee, 0x00, 0x3a, 0x01, 0x2b, 0x01, 0x3b, 0x01, 0x3b, 0x01, 0x2b, 0x01, 0x2c, 0x01, 0x31, 0x01, 0x3a, 0x01, 0x33, 0x01, 0x33, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x2f, 0x01, 0x39, 0x01, 0xec, 0x00, 0xec, 0x00, 0x39, 0x01, 0xed, 0x00, 0xfd, 0x00, 0x3c, 0x01, 0x89, 0x00, 0x89, 0x00, 0x3c, 0x01, 0x8a, 0x00, 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x3e, 0x01, 0x40, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x11, 0x01, 0x11, 0x01, +0x40, 0x01, 0x13, 0x01, 0x3c, 0x01, 0xfd, 0x00, 0x0f, 0x01, 0x0f, 0x01, 0xfd, 0x00, 0xfa, 0x00, 0x41, 0x01, 0x42, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x42, 0x01, 0x3e, 0x01, 0x43, 0x01, 0x44, 0x01, 0x41, 0x01, 0x41, 0x01, 0x44, 0x01, 0x42, 0x01, 0x45, 0x01, 0x46, 0x01, 0x7a, 0x00, 0x7a, 0x00, 0x46, 0x01, 0x78, 0x00, 0x77, 0x00, 0x78, 0x00, 0x47, 0x01, 0x47, 0x01, 0x78, 0x00, 0x46, 0x01, 0x48, 0x01, 0x49, 0x01, 0x88, 0x00, 0x88, 0x00, 0x49, 0x01, 0x87, 0x00, 0x7a, 0x00, 0x87, 0x00, +0x45, 0x01, 0x45, 0x01, 0x87, 0x00, 0x49, 0x01, 0x4a, 0x01, 0xce, 0x00, 0x4b, 0x01, 0x4b, 0x01, 0xce, 0x00, 0xd0, 0x00, 0xd9, 0x00, 0x4c, 0x01, 0xd8, 0x00, 0xd8, 0x00, 0x4c, 0x01, 0x4d, 0x01, 0x47, 0x01, 0x4e, 0x01, 0x77, 0x00, 0x77, 0x00, 0x4e, 0x01, 0x75, 0x00, 0xd8, 0x00, 0x4d, 0x01, 0xd5, 0x00, 0xd5, 0x00, 0x4d, 0x01, 0x4f, 0x01, 0xd5, 0x00, 0x4f, 0x01, 0xd7, 0x00, 0xd7, 0x00, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0x00, 0x50, 0x01, 0xe1, 0x00, 0xe1, 0x00, 0x50, 0x01, 0x51, 0x01, +0xe0, 0x00, 0xe1, 0x00, 0x52, 0x01, 0x52, 0x01, 0xe1, 0x00, 0x51, 0x01, 0x53, 0x01, 0x54, 0x01, 0xe8, 0x00, 0xe8, 0x00, 0x54, 0x01, 0xe6, 0x00, 0xe4, 0x00, 0xe5, 0x00, 0x55, 0x01, 0x55, 0x01, 0xe5, 0x00, 0x56, 0x01, 0x52, 0x01, 0x57, 0x01, 0xe0, 0x00, 0xe0, 0x00, 0x57, 0x01, 0xe9, 0x00, 0xe8, 0x00, 0xe9, 0x00, 0x53, 0x01, 0x53, 0x01, 0xe9, 0x00, 0x57, 0x01, 0x58, 0x01, 0x01, 0x01, 0x59, 0x01, 0x59, 0x01, 0x01, 0x01, 0x03, 0x01, 0x48, 0x01, 0x88, 0x00, 0x58, 0x01, 0x58, 0x01, +0x88, 0x00, 0x01, 0x01, 0x59, 0x01, 0x03, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0x03, 0x01, 0x02, 0x01, 0x5a, 0x01, 0x02, 0x01, 0x5b, 0x01, 0x5b, 0x01, 0x02, 0x01, 0x5c, 0x01, 0x5c, 0x01, 0xe4, 0x00, 0x5b, 0x01, 0x5b, 0x01, 0xe4, 0x00, 0x55, 0x01, 0x00, 0x01, 0x5d, 0x01, 0x02, 0x01, 0x02, 0x01, 0x5d, 0x01, 0x5c, 0x01, 0xe3, 0x00, 0x5d, 0x01, 0xdc, 0x00, 0xdc, 0x00, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x5e, 0x01, 0x85, 0x00, 0x85, 0x00, 0x5e, 0x01, 0x86, 0x00, 0x5f, 0x01, 0x60, 0x01, +0xdb, 0x00, 0xdb, 0x00, 0x60, 0x01, 0xd3, 0x00, 0x61, 0x01, 0x60, 0x01, 0x76, 0x00, 0x76, 0x00, 0x60, 0x01, 0x79, 0x00, 0x61, 0x01, 0x62, 0x01, 0xd1, 0x00, 0xd1, 0x00, 0x62, 0x01, 0xd0, 0x00, 0x62, 0x01, 0x75, 0x00, 0x63, 0x01, 0x63, 0x01, 0x75, 0x00, 0x4e, 0x01, 0x62, 0x01, 0x63, 0x01, 0xd0, 0x00, 0xd0, 0x00, 0x63, 0x01, 0x4b, 0x01, 0x64, 0x01, 0x20, 0x01, 0x65, 0x01, 0x65, 0x01, 0x20, 0x01, 0x21, 0x01, 0x66, 0x01, 0x67, 0x01, 0x15, 0x01, 0x15, 0x01, 0x67, 0x01, 0xf4, 0x00, +0x67, 0x01, 0x68, 0x01, 0xf4, 0x00, 0xf4, 0x00, 0x68, 0x01, 0xca, 0x00, 0x69, 0x01, 0x68, 0x01, 0xcc, 0x00, 0xcc, 0x00, 0x68, 0x01, 0xcd, 0x00, 0xc9, 0x00, 0x69, 0x01, 0xc3, 0x00, 0xc3, 0x00, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6a, 0x01, 0xc5, 0x00, 0xc5, 0x00, 0x6a, 0x01, 0xc6, 0x00, 0x10, 0x01, 0x08, 0x01, 0x49, 0x01, 0x49, 0x01, 0x08, 0x01, 0x45, 0x01, 0x11, 0x01, 0x10, 0x01, 0x48, 0x01, 0x48, 0x01, 0x10, 0x01, 0x49, 0x01, 0x0b, 0x01, 0x20, 0x01, 0x47, 0x01, 0x47, 0x01, +0x20, 0x01, 0x4e, 0x01, 0x08, 0x01, 0x07, 0x01, 0x45, 0x01, 0x45, 0x01, 0x07, 0x01, 0x46, 0x01, 0x07, 0x01, 0x0b, 0x01, 0x46, 0x01, 0x46, 0x01, 0x0b, 0x01, 0x47, 0x01, 0x58, 0x01, 0x3f, 0x01, 0x48, 0x01, 0x48, 0x01, 0x3f, 0x01, 0x11, 0x01, 0x3f, 0x01, 0x58, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x58, 0x01, 0x59, 0x01, 0x20, 0x01, 0x64, 0x01, 0x4e, 0x01, 0x4e, 0x01, 0x64, 0x01, 0x63, 0x01, 0x17, 0x01, 0x16, 0x01, 0x65, 0x01, 0x65, 0x01, 0x16, 0x01, 0x64, 0x01, 0x4f, 0x01, 0x23, 0x01, +0x50, 0x01, 0x50, 0x01, 0x23, 0x01, 0x25, 0x01, 0x23, 0x01, 0x4f, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x4f, 0x01, 0x4d, 0x01, 0x18, 0x01, 0x4a, 0x01, 0x16, 0x01, 0x16, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x1a, 0x01, 0x4d, 0x01, 0x4d, 0x01, 0x1a, 0x01, 0x1c, 0x01, 0x29, 0x01, 0x51, 0x01, 0x25, 0x01, 0x25, 0x01, 0x51, 0x01, 0x50, 0x01, 0x29, 0x01, 0x2b, 0x01, 0x51, 0x01, 0x51, 0x01, 0x2b, 0x01, 0x52, 0x01, 0x2b, 0x01, 0x3a, 0x01, 0x52, 0x01, 0x52, 0x01, 0x3a, 0x01, 0x57, 0x01, +0x3a, 0x01, 0x31, 0x01, 0x57, 0x01, 0x57, 0x01, 0x31, 0x01, 0x53, 0x01, 0x43, 0x01, 0x34, 0x01, 0x44, 0x01, 0x44, 0x01, 0x34, 0x01, 0x36, 0x01, 0x34, 0x01, 0x43, 0x01, 0x55, 0x01, 0x55, 0x01, 0x43, 0x01, 0x5b, 0x01, 0x31, 0x01, 0x30, 0x01, 0x53, 0x01, 0x53, 0x01, 0x30, 0x01, 0x54, 0x01, 0x35, 0x01, 0x34, 0x01, 0x56, 0x01, 0x56, 0x01, 0x34, 0x01, 0x55, 0x01, 0x5a, 0x01, 0x41, 0x01, 0x59, 0x01, 0x59, 0x01, 0x41, 0x01, 0x3d, 0x01, 0x1a, 0x00, 0x6c, 0x01, 0x1c, 0x00, 0x1c, 0x00, +0x6c, 0x01, 0x6d, 0x01, 0x6c, 0x01, 0x1a, 0x00, 0x6e, 0x01, 0x6e, 0x01, 0x1a, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x6f, 0x01, 0x28, 0x00, 0x28, 0x00, 0x6f, 0x01, 0x70, 0x01, 0x6f, 0x01, 0x27, 0x00, 0x6d, 0x01, 0x6d, 0x01, 0x27, 0x00, 0x1c, 0x00, 0x2d, 0x00, 0x71, 0x01, 0x2e, 0x00, 0x2e, 0x00, 0x71, 0x01, 0x72, 0x01, 0x71, 0x01, 0x2d, 0x00, 0x70, 0x01, 0x70, 0x01, 0x2d, 0x00, 0x28, 0x00, 0x73, 0x01, 0x74, 0x01, 0x33, 0x00, 0x33, 0x00, 0x74, 0x01, 0x34, 0x00, 0x72, 0x01, 0x73, 0x01, +0x2e, 0x00, 0x2e, 0x00, 0x73, 0x01, 0x33, 0x00, 0x75, 0x01, 0x76, 0x01, 0x39, 0x00, 0x39, 0x00, 0x76, 0x01, 0x3a, 0x00, 0x74, 0x01, 0x75, 0x01, 0x34, 0x00, 0x34, 0x00, 0x75, 0x01, 0x39, 0x00, 0x77, 0x01, 0x78, 0x01, 0x3f, 0x00, 0x3f, 0x00, 0x78, 0x01, 0x40, 0x00, 0x76, 0x01, 0x77, 0x01, 0x3a, 0x00, 0x3a, 0x00, 0x77, 0x01, 0x3f, 0x00, 0x79, 0x01, 0x7a, 0x01, 0x9d, 0x00, 0x9d, 0x00, 0x7a, 0x01, 0x9e, 0x00, 0x9d, 0x00, 0x40, 0x00, 0x79, 0x01, 0x79, 0x01, 0x40, 0x00, 0x78, 0x01, +0x7b, 0x01, 0x7c, 0x01, 0xb0, 0x00, 0xb0, 0x00, 0x7c, 0x01, 0xb2, 0x00, 0xb0, 0x00, 0x9e, 0x00, 0x7b, 0x01, 0x7b, 0x01, 0x9e, 0x00, 0x7a, 0x01, 0xc7, 0x00, 0x7d, 0x01, 0x1b, 0x00, 0x1b, 0x00, 0x7d, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x50, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0x50, 0x00, 0x52, 0x00, 0x50, 0x00, 0x7e, 0x01, 0x51, 0x00, 0x51, 0x00, 0x7e, 0x01, 0x7f, 0x01, 0x7e, 0x01, 0x80, 0x01, 0x7f, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x7e, 0x01, 0xbc, 0x00, 0x80, 0x01, 0x80, 0x01, +0xbc, 0x00, 0xbd, 0x00, 0x82, 0x01, 0x83, 0x01, 0xbd, 0x00, 0xbd, 0x00, 0x83, 0x01, 0x80, 0x01, 0x83, 0x01, 0x84, 0x01, 0x80, 0x01, 0x80, 0x01, 0x84, 0x01, 0x81, 0x01, 0x84, 0x01, 0x83, 0x01, 0x85, 0x01, 0x85, 0x01, 0x83, 0x01, 0x86, 0x01, 0x83, 0x01, 0x82, 0x01, 0x86, 0x01, 0x86, 0x01, 0x82, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0xb7, 0x00, 0xb7, 0x00, 0x89, 0x01, 0xbe, 0x00, 0x89, 0x01, 0x82, 0x01, 0xbe, 0x00, 0xbe, 0x00, 0x82, 0x01, 0xbd, 0x00, 0x82, 0x01, 0x89, 0x01, +0x87, 0x01, 0x87, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x89, 0x01, 0x88, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x88, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x88, 0x01, 0xb8, 0x00, 0xb8, 0x00, 0x88, 0x01, 0xb7, 0x00, 0x88, 0x01, 0x8c, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8d, 0x01, 0x8c, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0x8c, 0x01, 0x8f, 0x01, 0x8c, 0x01, 0xb8, 0x00, 0x8f, 0x01, 0x8f, 0x01, 0xb8, 0x00, 0xba, 0x00, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x90, 0x01, 0x8f, 0x01, 0x91, 0x01, +0x8f, 0x01, 0xba, 0x00, 0x91, 0x01, 0x91, 0x01, 0xba, 0x00, 0xb3, 0x00, 0xb2, 0x00, 0x92, 0x01, 0xb3, 0x00, 0xb3, 0x00, 0x92, 0x01, 0x91, 0x01, 0x91, 0x01, 0x92, 0x01, 0x90, 0x01, 0x90, 0x01, 0x92, 0x01, 0x93, 0x01, 0x7c, 0x01, 0x94, 0x01, 0xb2, 0x00, 0xb2, 0x00, 0x94, 0x01, 0x92, 0x01, 0x94, 0x01, 0x95, 0x01, 0x92, 0x01, 0x92, 0x01, 0x95, 0x01, 0x93, 0x01, 0x8b, 0x00, 0x8c, 0x00, 0x04, 0x01, 0x04, 0x01, 0x8c, 0x00, 0x96, 0x01, 0x04, 0x01, 0xeb, 0x00, 0x42, 0x00, 0x42, 0x00, +0xeb, 0x00, 0x49, 0x00, 0x96, 0x01, 0x38, 0x01, 0x04, 0x01, 0x04, 0x01, 0x38, 0x01, 0xeb, 0x00, 0x6a, 0x01, 0x6b, 0x01, 0xc3, 0x00, 0xc3, 0x00, 0x6b, 0x01, 0xc1, 0x00, 0x6a, 0x01, 0x69, 0x01, 0xc6, 0x00, 0xc6, 0x00, 0x69, 0x01, 0xcc, 0x00, 0xca, 0x00, 0x68, 0x01, 0xc9, 0x00, 0xc9, 0x00, 0x68, 0x01, 0x69, 0x01, 0x68, 0x01, 0x67, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0x67, 0x01, 0xf5, 0x00, 0xf5, 0x00, 0x67, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x67, 0x01, 0x66, 0x01, 0x63, 0x01, 0x64, 0x01, +0x4b, 0x01, 0x4b, 0x01, 0x64, 0x01, 0x16, 0x01, 0x62, 0x01, 0x61, 0x01, 0x75, 0x00, 0x75, 0x00, 0x61, 0x01, 0x76, 0x00, 0x60, 0x01, 0x61, 0x01, 0xd3, 0x00, 0xd3, 0x00, 0x61, 0x01, 0xd1, 0x00, 0x60, 0x01, 0x5f, 0x01, 0x79, 0x00, 0x79, 0x00, 0x5f, 0x01, 0x85, 0x00, 0xdc, 0x00, 0x5e, 0x01, 0xdb, 0x00, 0xdb, 0x00, 0x5e, 0x01, 0x5f, 0x01, 0x86, 0x00, 0x5e, 0x01, 0x00, 0x01, 0x00, 0x01, 0x5e, 0x01, 0x5d, 0x01, 0xe4, 0x00, 0x5c, 0x01, 0xe3, 0x00, 0xe3, 0x00, 0x5c, 0x01, 0x5d, 0x01, +0x5b, 0x01, 0x43, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0x43, 0x01, 0x41, 0x01, 0x08, 0x00, 0x09, 0x00, 0x97, 0x01, 0x97, 0x01, 0x09, 0x00, 0x98, 0x01, 0x09, 0x00, 0x17, 0x00, 0x98, 0x01, 0x98, 0x01, 0x17, 0x00, 0x99, 0x01, 0x17, 0x00, 0x19, 0x00, 0x99, 0x01, 0x99, 0x01, 0x19, 0x00, 0x9a, 0x01, 0x6c, 0x01, 0x9b, 0x01, 0x6d, 0x01, 0x6d, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x6e, 0x01, 0x9d, 0x01, 0x6c, 0x01, 0x6c, 0x01, 0x9d, 0x01, 0x9b, 0x01, 0x6f, 0x01, 0x9e, 0x01, 0x70, 0x01, 0x70, 0x01, +0x9e, 0x01, 0x9f, 0x01, 0x6f, 0x01, 0x6d, 0x01, 0x9e, 0x01, 0x9e, 0x01, 0x6d, 0x01, 0x9c, 0x01, 0x71, 0x01, 0xa0, 0x01, 0x72, 0x01, 0x72, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0x70, 0x01, 0x9f, 0x01, 0x71, 0x01, 0x71, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0x73, 0x01, 0xa2, 0x01, 0x74, 0x01, 0x74, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0x72, 0x01, 0xa1, 0x01, 0x73, 0x01, 0x73, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0x75, 0x01, 0xa4, 0x01, 0x76, 0x01, 0x76, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x74, 0x01, 0xa3, 0x01, +0x75, 0x01, 0x75, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0x78, 0x01, 0x77, 0x01, 0xa6, 0x01, 0xa6, 0x01, 0x77, 0x01, 0xa7, 0x01, 0x76, 0x01, 0xa5, 0x01, 0x77, 0x01, 0x77, 0x01, 0xa5, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xaa, 0x01, 0xa9, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0xad, 0x01, 0xa9, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xac, 0x01, 0xac, 0x01, 0xaf, 0x01, 0xad, 0x01, 0x55, 0x00, 0x56, 0x00, 0xb0, 0x01, 0xb0, 0x01, 0x56, 0x00, 0xb1, 0x01, +0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb3, 0x01, 0xb5, 0x01, 0x61, 0x00, 0x62, 0x00, 0xb6, 0x01, 0xb6, 0x01, 0x62, 0x00, 0xb7, 0x01, 0x62, 0x00, 0x55, 0x00, 0xb7, 0x01, 0xb7, 0x01, 0x55, 0x00, 0xb0, 0x01, 0x19, 0x00, 0x72, 0x00, 0x9a, 0x01, 0x9a, 0x01, 0x72, 0x00, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbb, 0x01, 0xba, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xbf, 0x01, 0xbe, 0x01, 0xc0, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xc1, 0x01, 0xc1, 0x01, +0xab, 0x01, 0xc2, 0x01, 0x79, 0x01, 0xc3, 0x01, 0x7a, 0x01, 0x7a, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0x78, 0x01, 0xa6, 0x01, 0x79, 0x01, 0x79, 0x01, 0xa6, 0x01, 0xc3, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xc6, 0x01, 0xb4, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc5, 0x01, 0xc5, 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xa6, 0x00, 0xa7, 0x00, 0xc7, 0x01, 0xc7, 0x01, 0xa7, 0x00, 0xc8, 0x01, 0xa7, 0x00, 0xa9, 0x00, 0xc8, 0x01, 0xc8, 0x01, 0xa9, 0x00, 0xc9, 0x01, 0xa9, 0x00, 0xaf, 0x00, +0xc9, 0x01, 0xc9, 0x01, 0xaf, 0x00, 0xca, 0x01, 0xaf, 0x00, 0x61, 0x00, 0xca, 0x01, 0xca, 0x01, 0x61, 0x00, 0xb6, 0x01, 0x7b, 0x01, 0xcb, 0x01, 0x7c, 0x01, 0x7c, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0x7a, 0x01, 0xc4, 0x01, 0x7b, 0x01, 0x7b, 0x01, 0xc4, 0x01, 0xcb, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xae, 0x01, 0xae, 0x01, 0xce, 0x01, 0xaf, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xcd, 0x01, 0xcd, 0x01, 0xd0, 0x01, 0xce, 0x01, 0x7d, 0x01, 0xd1, 0x01, 0x6e, 0x01, 0x6e, 0x01, 0xd1, 0x01, 0x9d, 0x01, +0xd2, 0x01, 0xd3, 0x01, 0xcf, 0x01, 0xcf, 0x01, 0xd3, 0x01, 0xd0, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd2, 0x01, 0xd2, 0x01, 0xd5, 0x01, 0xd3, 0x01, 0x95, 0x01, 0x94, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0x94, 0x01, 0xd7, 0x01, 0x94, 0x01, 0x7c, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0x7c, 0x01, 0xcc, 0x01, 0xd8, 0x01, 0xd9, 0x01, 0xda, 0x01, 0xda, 0x01, 0xd9, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xd8, 0x01, 0xdd, 0x01, 0xdd, 0x01, 0xd8, 0x01, 0xda, 0x01, 0xde, 0x01, 0xdc, 0x01, 0xdf, 0x01, 0xdf, 0x01, +0xdc, 0x01, 0xdd, 0x01, 0xe0, 0x01, 0xde, 0x01, 0xe1, 0x01, 0xe1, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe4, 0x01, 0xe3, 0x01, 0xe5, 0x01, 0xe3, 0x01, 0xe6, 0x01, 0xe5, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xd9, 0x01, 0xd8, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0xd8, 0x01, 0xe9, 0x01, 0xd8, 0x01, 0xdc, 0x01, 0xe9, 0x01, 0xe9, 0x01, 0xdc, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xea, 0x01, 0xea, 0x01, 0xec, 0x01, 0xe9, 0x01, 0xec, 0x01, 0xed, 0x01, +0xe9, 0x01, 0xe9, 0x01, 0xed, 0x01, 0xe8, 0x01, 0xdc, 0x01, 0xde, 0x01, 0xea, 0x01, 0xea, 0x01, 0xde, 0x01, 0xee, 0x01, 0xde, 0x01, 0xe0, 0x01, 0xee, 0x01, 0xee, 0x01, 0xe0, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xef, 0x01, 0xef, 0x01, 0xf1, 0x01, 0xee, 0x01, 0xf1, 0x01, 0xeb, 0x01, 0xee, 0x01, 0xee, 0x01, 0xeb, 0x01, 0xea, 0x01, 0xe6, 0x01, 0xe3, 0x01, 0xf2, 0x01, 0xf2, 0x01, 0xe3, 0x01, 0xf3, 0x01, 0xe3, 0x01, 0xe2, 0x01, 0xf3, 0x01, 0xf3, 0x01, 0xe2, 0x01, 0xf4, 0x01, +0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf6, 0x01, 0xf8, 0x01, 0xf6, 0x01, 0xe2, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xe2, 0x01, 0xe4, 0x01, 0xed, 0x01, 0xec, 0x01, 0xf9, 0x01, 0xf9, 0x01, 0xec, 0x01, 0xfa, 0x01, 0xec, 0x01, 0xeb, 0x01, 0xfa, 0x01, 0xfa, 0x01, 0xeb, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfb, 0x01, 0xfb, 0x01, 0xfd, 0x01, 0xfa, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xfa, 0x01, 0xfa, 0x01, 0xfe, 0x01, 0xf9, 0x01, 0xe2, 0x01, 0xf6, 0x01, 0xf4, 0x01, 0xf4, 0x01, +0xf6, 0x01, 0xff, 0x01, 0xf6, 0x01, 0xf5, 0x01, 0xff, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00, 0x02, 0x01, 0x02, 0xf5, 0x01, 0x02, 0x02, 0x02, 0x02, 0xf5, 0x01, 0xf7, 0x01, 0x03, 0x02, 0x01, 0x02, 0x04, 0x02, 0x04, 0x02, 0x01, 0x02, 0x02, 0x02, 0xf5, 0x01, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x01, 0x02, 0x05, 0x02, 0x01, 0x02, 0x03, 0x02, 0x05, 0x02, 0x05, 0x02, 0x03, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x09, 0x02, 0x08, 0x02, 0x0a, 0x02, 0x0a, 0x02, 0x03, 0x02, +0x09, 0x02, 0x09, 0x02, 0x03, 0x02, 0x04, 0x02, 0x03, 0x02, 0x0a, 0x02, 0x06, 0x02, 0x06, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x08, 0x02, 0x0c, 0x02, 0x0a, 0x02, 0x0a, 0x02, 0x0c, 0x02, 0x0b, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x0f, 0x02, 0x0e, 0x02, 0x10, 0x02, 0x08, 0x02, 0x07, 0x02, 0x10, 0x02, 0x10, 0x02, 0x07, 0x02, 0x0f, 0x02, 0x0c, 0x02, 0x08, 0x02, 0x11, 0x02, 0x11, 0x02, 0x08, 0x02, 0x10, 0x02, 0x0e, 0x02, 0x12, 0x02, 0x10, 0x02, 0x10, 0x02, 0x12, 0x02, 0x11, 0x02, +0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x15, 0x02, 0x14, 0x02, 0x16, 0x02, 0x0e, 0x02, 0x0d, 0x02, 0x16, 0x02, 0x16, 0x02, 0x0d, 0x02, 0x15, 0x02, 0x12, 0x02, 0x0e, 0x02, 0x17, 0x02, 0x17, 0x02, 0x0e, 0x02, 0x16, 0x02, 0x14, 0x02, 0x18, 0x02, 0x16, 0x02, 0x16, 0x02, 0x18, 0x02, 0x17, 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1b, 0x02, 0x1a, 0x02, 0x1c, 0x02, 0x1a, 0x02, 0x1d, 0x02, 0x1c, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x1e, 0x02, 0x1e, 0x02, +0x20, 0x02, 0x1c, 0x02, 0x20, 0x02, 0x21, 0x02, 0x1c, 0x02, 0x1c, 0x02, 0x21, 0x02, 0x1b, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x24, 0x02, 0x23, 0x02, 0x25, 0x02, 0x23, 0x02, 0x26, 0x02, 0x25, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x1d, 0x02, 0x1a, 0x02, 0x27, 0x02, 0x27, 0x02, 0x1a, 0x02, 0x25, 0x02, 0x1a, 0x02, 0x19, 0x02, 0x25, 0x02, 0x25, 0x02, 0x19, 0x02, 0x24, 0x02, 0x27, 0x02, 0x26, 0x02, 0x28, 0x02, 0x28, 0x02, 0x26, 0x02, 0x29, 0x02, 0x27, 0x02, 0x28, 0x02, +0x1d, 0x02, 0x1d, 0x02, 0x28, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2d, 0x02, 0x2c, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, 0x02, 0x31, 0x02, 0x30, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x32, 0x02, 0x32, 0x02, 0x34, 0x02, 0x31, 0x02, 0x35, 0x02, 0x2b, 0x02, 0x36, 0x02, 0x36, 0x02, 0x2b, 0x02, 0x2d, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x39, 0x02, 0x38, 0x02, 0x3a, 0x02, 0x2c, 0x02, 0x2b, 0x02, 0x3a, 0x02, 0x3a, 0x02, 0x2b, 0x02, 0x39, 0x02, +0x2b, 0x02, 0x35, 0x02, 0x39, 0x02, 0x39, 0x02, 0x35, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x37, 0x02, 0x3b, 0x02, 0x3b, 0x02, 0x37, 0x02, 0x39, 0x02, 0x3d, 0x02, 0x3c, 0x02, 0x3e, 0x02, 0x3e, 0x02, 0x3c, 0x02, 0x3b, 0x02, 0x35, 0x02, 0x3f, 0x02, 0x3b, 0x02, 0x3b, 0x02, 0x3f, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x3e, 0x02, 0x3e, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x3d, 0x02, 0x41, 0x02, 0x41, 0x02, 0x3d, 0x02, 0x3e, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x45, 0x02, +0x44, 0x02, 0x46, 0x02, 0x46, 0x02, 0x47, 0x02, 0x45, 0x02, 0x45, 0x02, 0x47, 0x02, 0x48, 0x02, 0x3c, 0x02, 0x3d, 0x02, 0x48, 0x02, 0x48, 0x02, 0x3d, 0x02, 0x45, 0x02, 0x42, 0x02, 0x43, 0x02, 0x3d, 0x02, 0x3d, 0x02, 0x43, 0x02, 0x45, 0x02, 0xeb, 0x01, 0xf1, 0x01, 0xfb, 0x01, 0xfb, 0x01, 0xf1, 0x01, 0x49, 0x02, 0xf1, 0x01, 0xf0, 0x01, 0x49, 0x02, 0x49, 0x02, 0xf0, 0x01, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4a, 0x02, 0x4a, 0x02, 0x4c, 0x02, 0x49, 0x02, 0x4c, 0x02, 0xfc, 0x01, +0x49, 0x02, 0x49, 0x02, 0xfc, 0x01, 0xfb, 0x01, 0x4d, 0x02, 0x4e, 0x02, 0x4f, 0x02, 0x4f, 0x02, 0x4e, 0x02, 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x50, 0x02, 0x50, 0x02, 0x52, 0x02, 0x4f, 0x02, 0xfd, 0x01, 0xfc, 0x01, 0x53, 0x02, 0x53, 0x02, 0xfc, 0x01, 0x54, 0x02, 0x55, 0x02, 0x56, 0x02, 0x54, 0x02, 0x54, 0x02, 0x56, 0x02, 0x53, 0x02, 0x56, 0x02, 0x57, 0x02, 0x53, 0x02, 0x53, 0x02, 0x57, 0x02, 0x58, 0x02, 0xfe, 0x01, 0xfd, 0x01, 0x58, 0x02, 0x58, 0x02, 0xfd, 0x01, 0x53, 0x02, +0x4c, 0x02, 0x4b, 0x02, 0x59, 0x02, 0x59, 0x02, 0x4b, 0x02, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x5a, 0x02, 0x5a, 0x02, 0x5c, 0x02, 0x59, 0x02, 0x5c, 0x02, 0x55, 0x02, 0x59, 0x02, 0x59, 0x02, 0x55, 0x02, 0x54, 0x02, 0xfc, 0x01, 0x4c, 0x02, 0x54, 0x02, 0x54, 0x02, 0x4c, 0x02, 0x59, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x5f, 0x02, 0x5e, 0x02, 0x60, 0x02, 0x52, 0x02, 0x51, 0x02, 0x60, 0x02, 0x60, 0x02, 0x51, 0x02, 0x5f, 0x02, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0x63, 0x02, +0x62, 0x02, 0x64, 0x02, 0x65, 0x02, 0x22, 0x02, 0x66, 0x02, 0x66, 0x02, 0x22, 0x02, 0x24, 0x02, 0x19, 0x02, 0x67, 0x02, 0x24, 0x02, 0x24, 0x02, 0x67, 0x02, 0x66, 0x02, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0x6a, 0x02, 0x69, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, 0x02, 0x6b, 0x02, 0x6b, 0x02, 0x6d, 0x02, 0x6a, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x70, 0x02, 0x70, 0x02, 0x6f, 0x02, 0x71, 0x02, 0x14, 0x02, 0x13, 0x02, 0x71, 0x02, 0x71, 0x02, 0x13, 0x02, 0x70, 0x02, 0x72, 0x02, 0x21, 0x02, +0x73, 0x02, 0x73, 0x02, 0x21, 0x02, 0x20, 0x02, 0x1f, 0x02, 0x74, 0x02, 0x20, 0x02, 0x20, 0x02, 0x74, 0x02, 0x73, 0x02, 0x74, 0x02, 0x6e, 0x02, 0x73, 0x02, 0x73, 0x02, 0x6e, 0x02, 0x70, 0x02, 0x13, 0x02, 0x72, 0x02, 0x70, 0x02, 0x70, 0x02, 0x72, 0x02, 0x73, 0x02, 0x18, 0x02, 0x14, 0x02, 0x75, 0x02, 0x75, 0x02, 0x14, 0x02, 0x71, 0x02, 0x6f, 0x02, 0x76, 0x02, 0x71, 0x02, 0x71, 0x02, 0x76, 0x02, 0x75, 0x02, 0x77, 0x02, 0x1e, 0x02, 0x2a, 0x02, 0x2a, 0x02, 0x1e, 0x02, 0x1d, 0x02, +0x78, 0x02, 0x1f, 0x02, 0x77, 0x02, 0x77, 0x02, 0x1f, 0x02, 0x1e, 0x02, 0x79, 0x02, 0x33, 0x02, 0x7a, 0x02, 0x7a, 0x02, 0x33, 0x02, 0x32, 0x02, 0x30, 0x02, 0x7b, 0x02, 0x32, 0x02, 0x32, 0x02, 0x7b, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x6c, 0x02, 0x7a, 0x02, 0x7a, 0x02, 0x6c, 0x02, 0x6b, 0x02, 0x69, 0x02, 0x79, 0x02, 0x6b, 0x02, 0x6b, 0x02, 0x79, 0x02, 0x7a, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x7e, 0x02, 0x7d, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, 0x02, 0x7f, 0x02, 0x7f, 0x02, +0x81, 0x02, 0x7e, 0x02, 0x81, 0x02, 0x47, 0x02, 0x7e, 0x02, 0x7e, 0x02, 0x47, 0x02, 0x46, 0x02, 0x44, 0x02, 0x7c, 0x02, 0x46, 0x02, 0x46, 0x02, 0x7c, 0x02, 0x7e, 0x02, 0x79, 0x02, 0x69, 0x02, 0x82, 0x02, 0x82, 0x02, 0x69, 0x02, 0x83, 0x02, 0x40, 0x02, 0x3f, 0x02, 0x84, 0x02, 0x84, 0x02, 0x3f, 0x02, 0x85, 0x02, 0x35, 0x02, 0x36, 0x02, 0x3f, 0x02, 0x3f, 0x02, 0x36, 0x02, 0x85, 0x02, 0x34, 0x02, 0x33, 0x02, 0x82, 0x02, 0x82, 0x02, 0x33, 0x02, 0x79, 0x02, 0x47, 0x02, 0x81, 0x02, +0x48, 0x02, 0x48, 0x02, 0x81, 0x02, 0x86, 0x02, 0x81, 0x02, 0x80, 0x02, 0x86, 0x02, 0x86, 0x02, 0x80, 0x02, 0x87, 0x02, 0x38, 0x02, 0x37, 0x02, 0x87, 0x02, 0x87, 0x02, 0x37, 0x02, 0x86, 0x02, 0x37, 0x02, 0x3c, 0x02, 0x86, 0x02, 0x86, 0x02, 0x3c, 0x02, 0x48, 0x02, 0x76, 0x02, 0x6f, 0x02, 0x88, 0x02, 0x88, 0x02, 0x6f, 0x02, 0x89, 0x02, 0x8a, 0x02, 0x8b, 0x02, 0x89, 0x02, 0x89, 0x02, 0x8b, 0x02, 0x88, 0x02, 0x78, 0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8d, 0x02, 0x8c, 0x02, 0x8e, 0x02, +0x8c, 0x02, 0x8f, 0x02, 0x8e, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, 0x02, 0x90, 0x02, 0x91, 0x02, 0x8e, 0x02, 0x8e, 0x02, 0x91, 0x02, 0x92, 0x02, 0x92, 0x02, 0x6e, 0x02, 0x8e, 0x02, 0x8e, 0x02, 0x6e, 0x02, 0x8d, 0x02, 0x91, 0x02, 0x8a, 0x02, 0x92, 0x02, 0x92, 0x02, 0x8a, 0x02, 0x89, 0x02, 0x6f, 0x02, 0x6e, 0x02, 0x89, 0x02, 0x89, 0x02, 0x6e, 0x02, 0x92, 0x02, 0x8c, 0x02, 0x78, 0x02, 0x93, 0x02, 0x93, 0x02, 0x78, 0x02, 0x77, 0x02, 0x2a, 0x02, 0x94, 0x02, 0x77, 0x02, 0x77, 0x02, +0x94, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, 0x02, 0x93, 0x02, 0x93, 0x02, 0x95, 0x02, 0x96, 0x02, 0x8f, 0x02, 0x8c, 0x02, 0x96, 0x02, 0x96, 0x02, 0x8c, 0x02, 0x93, 0x02, 0xe6, 0x01, 0x97, 0x02, 0xe7, 0x01, 0xe7, 0x01, 0x97, 0x02, 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9b, 0x02, 0x9a, 0x02, 0x9c, 0x02, 0xe7, 0x01, 0x98, 0x02, 0x9c, 0x02, 0x9c, 0x02, 0x98, 0x02, 0x9b, 0x02, 0xd9, 0x01, 0x9d, 0x02, 0xdb, 0x01, 0xdb, 0x01, 0x9d, 0x02, 0x9e, 0x02, 0x97, 0x02, 0xe6, 0x01, +0x9f, 0x02, 0x9f, 0x02, 0xe6, 0x01, 0xf2, 0x01, 0x9a, 0x02, 0xa0, 0x02, 0x9c, 0x02, 0x9c, 0x02, 0xa0, 0x02, 0xa1, 0x02, 0xa0, 0x02, 0xa2, 0x02, 0xa1, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0xa3, 0x02, 0xe4, 0x01, 0xe5, 0x01, 0xa3, 0x02, 0xa3, 0x02, 0xe5, 0x01, 0xa1, 0x02, 0xe5, 0x01, 0xe7, 0x01, 0xa1, 0x02, 0xa1, 0x02, 0xe7, 0x01, 0x9c, 0x02, 0x9d, 0x02, 0xd9, 0x01, 0xa4, 0x02, 0xa4, 0x02, 0xd9, 0x01, 0xe8, 0x01, 0xed, 0x01, 0xa5, 0x02, 0xe8, 0x01, 0xe8, 0x01, 0xa5, 0x02, 0xa4, 0x02, +0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa8, 0x02, 0xa7, 0x02, 0xa9, 0x02, 0xaa, 0x02, 0xab, 0x02, 0xa9, 0x02, 0xa9, 0x02, 0xab, 0x02, 0xa8, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xae, 0x02, 0xad, 0x02, 0xaf, 0x02, 0xad, 0x02, 0xb0, 0x02, 0xaf, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb1, 0x02, 0xab, 0x02, 0xaa, 0x02, 0xb2, 0x02, 0xb2, 0x02, 0xaa, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb3, 0x02, 0xb3, 0x02, 0xb5, 0x02, 0xb2, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb8, 0x02, +0xb7, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xac, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xac, 0x02, 0xae, 0x02, 0xb5, 0x02, 0xb4, 0x02, 0xba, 0x02, 0xba, 0x02, 0xb4, 0x02, 0xbb, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xba, 0x02, 0xba, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0xc1, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0xc1, 0x02, 0xc1, 0x02, 0xb6, 0x02, 0xc0, 0x02, 0x21, 0x02, 0x72, 0x02, 0xc2, 0x02, 0xc2, 0x02, 0x72, 0x02, 0xc3, 0x02, 0x72, 0x02, 0x13, 0x02, +0xc3, 0x02, 0xc3, 0x02, 0x13, 0x02, 0x15, 0x02, 0x0d, 0x02, 0xc4, 0x02, 0x15, 0x02, 0x15, 0x02, 0xc4, 0x02, 0xc3, 0x02, 0x1f, 0x02, 0x78, 0x02, 0x74, 0x02, 0x74, 0x02, 0x78, 0x02, 0x8d, 0x02, 0x8d, 0x02, 0x6e, 0x02, 0x74, 0x02, 0xc4, 0x02, 0x0d, 0x02, 0xc5, 0x02, 0xc5, 0x02, 0x0d, 0x02, 0x0f, 0x02, 0x07, 0x02, 0xc6, 0x02, 0x0f, 0x02, 0x0f, 0x02, 0xc6, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0x07, 0x02, 0xc7, 0x02, 0xc7, 0x02, 0x07, 0x02, 0x09, 0x02, 0x09, 0x02, 0x04, 0x02, 0xc7, 0x02, +0xc7, 0x02, 0x04, 0x02, 0xc8, 0x02, 0x04, 0x02, 0x02, 0x02, 0xc8, 0x02, 0xc8, 0x02, 0x02, 0x02, 0xc9, 0x02, 0x02, 0x02, 0xf7, 0x01, 0xc9, 0x02, 0xc9, 0x02, 0xf7, 0x01, 0xca, 0x02, 0xa2, 0x02, 0xcb, 0x02, 0xa3, 0x02, 0xa3, 0x02, 0xcb, 0x02, 0xcc, 0x02, 0xf7, 0x01, 0xf8, 0x01, 0xca, 0x02, 0xca, 0x02, 0xf8, 0x01, 0xcc, 0x02, 0xf8, 0x01, 0xe4, 0x01, 0xcc, 0x02, 0xcc, 0x02, 0xe4, 0x01, 0xa3, 0x02, 0xa5, 0x02, 0xed, 0x01, 0xcd, 0x02, 0xcd, 0x02, 0xed, 0x01, 0xf9, 0x01, 0xfe, 0x01, +0xce, 0x02, 0xf9, 0x01, 0xf9, 0x01, 0xce, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xfe, 0x01, 0xcf, 0x02, 0xcf, 0x02, 0xfe, 0x01, 0x58, 0x02, 0x57, 0x02, 0xd0, 0x02, 0x58, 0x02, 0x58, 0x02, 0xd0, 0x02, 0xcf, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd3, 0x02, 0xd2, 0x02, 0xd4, 0x02, 0xd0, 0x02, 0x57, 0x02, 0xd4, 0x02, 0xd4, 0x02, 0x57, 0x02, 0xd3, 0x02, 0xd1, 0x02, 0xd5, 0x02, 0xd2, 0x02, 0xd2, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd5, 0x02, 0xd7, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xd7, 0x02, +0x64, 0x02, 0x5d, 0x02, 0xd8, 0x02, 0x5e, 0x02, 0x5e, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xd9, 0x02, 0xdb, 0x02, 0xdb, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0x67, 0x02, 0x64, 0x02, 0x64, 0x02, 0x67, 0x02, 0x63, 0x02, 0xdc, 0x02, 0x63, 0x02, 0x1b, 0x02, 0x63, 0x02, 0x67, 0x02, 0x1b, 0x02, 0x67, 0x02, 0x19, 0x02, 0x1b, 0x02, 0xd0, 0x02, 0xdd, 0x02, 0xcf, 0x02, 0xcf, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe1, 0x02, 0xe0, 0x02, 0xe2, 0x02, +0xe3, 0x02, 0xe4, 0x02, 0xdf, 0x02, 0xdf, 0x02, 0xe4, 0x02, 0xe0, 0x02, 0xe5, 0x02, 0xce, 0x02, 0xde, 0x02, 0xde, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd2, 0x02, 0xe6, 0x02, 0xd4, 0x02, 0xd4, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xea, 0x02, 0xe9, 0x02, 0xeb, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe8, 0x02, 0xe8, 0x02, 0xe2, 0x02, 0xe9, 0x02, 0xdd, 0x02, 0xd0, 0x02, 0xe7, 0x02, 0xe7, 0x02, 0xd0, 0x02, 0xd4, 0x02, 0xcc, 0x02, 0xcb, 0x02, 0xec, 0x02, 0xec, 0x02, +0xcb, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf0, 0x02, 0xef, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf4, 0x02, 0xf3, 0x02, 0xf5, 0x02, 0xca, 0x02, 0xcc, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xcc, 0x02, 0xec, 0x02, 0xce, 0x02, 0xe5, 0x02, 0xcd, 0x02, 0xcd, 0x02, 0xe5, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xe3, 0x02, 0xe3, 0x02, 0xf9, 0x02, 0xe4, 0x02, 0xc9, 0x02, 0xca, 0x02, 0xfa, 0x02, 0xfa, 0x02, 0xca, 0x02, 0xf6, 0x02, 0xf3, 0x02, 0xfb, 0x02, +0xf5, 0x02, 0xf5, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfb, 0x02, 0xfd, 0x02, 0xfc, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xc8, 0x02, 0xc9, 0x02, 0xff, 0x02, 0xff, 0x02, 0xc9, 0x02, 0xfa, 0x02, 0xc7, 0x02, 0xc8, 0x02, 0x00, 0x03, 0x00, 0x03, 0xc8, 0x02, 0xff, 0x02, 0xfd, 0x02, 0x01, 0x03, 0xfe, 0x02, 0xfe, 0x02, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x01, 0x03, 0x01, 0x03, 0x04, 0x03, 0x02, 0x03, 0x05, 0x03, 0xc6, 0x02, 0x00, 0x03, 0x00, 0x03, 0xc6, 0x02, 0xc7, 0x02, +0xc4, 0x02, 0x06, 0x03, 0xc3, 0x02, 0xc3, 0x02, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0a, 0x03, 0x09, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0e, 0x03, 0x0d, 0x03, 0x0f, 0x03, 0x10, 0x03, 0xc2, 0x02, 0x07, 0x03, 0x07, 0x03, 0xc2, 0x02, 0xc3, 0x02, 0xc6, 0x02, 0x05, 0x03, 0xc5, 0x02, 0xc5, 0x02, 0x05, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x03, 0x03, 0x03, 0x03, 0x13, 0x03, 0x04, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x12, 0x03, 0x12, 0x03, +0x0b, 0x03, 0x13, 0x03, 0x06, 0x03, 0xc4, 0x02, 0x11, 0x03, 0x11, 0x03, 0xc4, 0x02, 0xc5, 0x02, 0xd6, 0x02, 0x64, 0x02, 0x14, 0x03, 0x14, 0x03, 0x64, 0x02, 0x62, 0x02, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0x18, 0x03, 0x16, 0x03, 0xea, 0x02, 0x18, 0x03, 0x18, 0x03, 0xea, 0x02, 0xeb, 0x02, 0xd2, 0x02, 0xd6, 0x02, 0xe6, 0x02, 0xe6, 0x02, 0xd6, 0x02, 0x14, 0x03, 0x19, 0x03, 0x15, 0x03, 0x1a, 0x03, 0x1a, 0x03, 0x15, 0x03, 0x17, 0x03, 0x1b, 0x03, 0x19, 0x03, +0x1c, 0x03, 0x1c, 0x03, 0x19, 0x03, 0x1a, 0x03, 0x1d, 0x03, 0x51, 0x02, 0x1e, 0x03, 0x1e, 0x03, 0x51, 0x02, 0x50, 0x02, 0x1e, 0x03, 0x50, 0x02, 0x1f, 0x03, 0x1f, 0x03, 0x50, 0x02, 0x4e, 0x02, 0x20, 0x03, 0x5d, 0x02, 0x21, 0x03, 0x21, 0x03, 0x5d, 0x02, 0x5f, 0x02, 0x21, 0x03, 0x5f, 0x02, 0x1d, 0x03, 0x1d, 0x03, 0x5f, 0x02, 0x51, 0x02, 0x22, 0x03, 0x23, 0x03, 0xa6, 0x02, 0xa6, 0x02, 0x23, 0x03, 0xa7, 0x02, 0xb1, 0x02, 0xb0, 0x02, 0x24, 0x03, 0x24, 0x03, 0xb0, 0x02, 0x25, 0x03, +0x1f, 0x03, 0x4e, 0x02, 0x26, 0x03, 0x26, 0x03, 0x4e, 0x02, 0x4d, 0x02, 0x27, 0x03, 0x25, 0x03, 0xad, 0x02, 0xad, 0x02, 0x25, 0x03, 0xb0, 0x02, 0xad, 0x02, 0xac, 0x02, 0x27, 0x03, 0x27, 0x03, 0xac, 0x02, 0x28, 0x03, 0x29, 0x03, 0x28, 0x03, 0xb9, 0x02, 0xb9, 0x02, 0x28, 0x03, 0xac, 0x02, 0x29, 0x03, 0xb9, 0x02, 0x2a, 0x03, 0x2a, 0x03, 0xb9, 0x02, 0xb7, 0x02, 0x2b, 0x03, 0xbf, 0x02, 0x2c, 0x03, 0x2c, 0x03, 0xbf, 0x02, 0xbe, 0x02, 0x2d, 0x03, 0xbd, 0x02, 0x2e, 0x03, 0x2e, 0x03, +0xbd, 0x02, 0xbc, 0x02, 0x2a, 0x03, 0xb7, 0x02, 0x2f, 0x03, 0x2f, 0x03, 0xb7, 0x02, 0xc1, 0x02, 0x2f, 0x03, 0xc1, 0x02, 0x2b, 0x03, 0x2b, 0x03, 0xc1, 0x02, 0xbf, 0x02, 0x30, 0x03, 0x31, 0x03, 0xd8, 0x02, 0xd8, 0x02, 0x31, 0x03, 0xdb, 0x02, 0xd8, 0x02, 0x5d, 0x02, 0x30, 0x03, 0x30, 0x03, 0x5d, 0x02, 0x20, 0x03, 0x31, 0x03, 0x32, 0x03, 0xdb, 0x02, 0xdb, 0x02, 0x32, 0x03, 0xda, 0x02, 0x32, 0x03, 0x33, 0x03, 0xda, 0x02, 0xda, 0x02, 0x33, 0x03, 0x34, 0x03, 0x2e, 0x03, 0xbc, 0x02, +0x33, 0x03, 0x33, 0x03, 0xbc, 0x02, 0x34, 0x03, 0xd9, 0x02, 0xda, 0x02, 0x35, 0x03, 0x35, 0x03, 0xda, 0x02, 0x34, 0x03, 0xb4, 0x02, 0x36, 0x03, 0xbb, 0x02, 0xbb, 0x02, 0x36, 0x03, 0x35, 0x03, 0x5e, 0x02, 0x36, 0x03, 0x60, 0x02, 0x60, 0x02, 0x36, 0x03, 0x37, 0x03, 0xaa, 0x02, 0x38, 0x03, 0xb3, 0x02, 0xb3, 0x02, 0x38, 0x03, 0x37, 0x03, 0x52, 0x02, 0x38, 0x03, 0x4f, 0x02, 0x4f, 0x02, 0x38, 0x03, 0x39, 0x03, 0xa7, 0x02, 0x3a, 0x03, 0xa9, 0x02, 0xa9, 0x02, 0x3a, 0x03, 0x39, 0x03, +0x26, 0x03, 0x4d, 0x02, 0x3b, 0x03, 0x3b, 0x03, 0x4d, 0x02, 0x3a, 0x03, 0x23, 0x03, 0x3b, 0x03, 0xa7, 0x02, 0xa7, 0x02, 0x3b, 0x03, 0x3a, 0x03, 0xf9, 0x02, 0xf8, 0x02, 0x3c, 0x03, 0x3c, 0x03, 0xf8, 0x02, 0x3d, 0x03, 0xcb, 0x02, 0x3e, 0x03, 0xed, 0x02, 0xed, 0x02, 0x3e, 0x03, 0x3f, 0x03, 0xa2, 0x02, 0x40, 0x03, 0xcb, 0x02, 0xcb, 0x02, 0x40, 0x03, 0x3e, 0x03, 0xa5, 0x02, 0x40, 0x03, 0xa4, 0x02, 0xa4, 0x02, 0x40, 0x03, 0x41, 0x03, 0xa0, 0x02, 0x9a, 0x02, 0x41, 0x03, 0x41, 0x03, +0x9a, 0x02, 0x42, 0x03, 0x9d, 0x02, 0x42, 0x03, 0x9e, 0x02, 0x9e, 0x02, 0x42, 0x03, 0x43, 0x03, 0x1d, 0x03, 0xe1, 0x02, 0x21, 0x03, 0x21, 0x03, 0xe1, 0x02, 0xe8, 0x02, 0xea, 0x02, 0x20, 0x03, 0xe8, 0x02, 0xe8, 0x02, 0x20, 0x03, 0x21, 0x03, 0xe3, 0x02, 0x1f, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0x1f, 0x03, 0x26, 0x03, 0xe1, 0x02, 0x1d, 0x03, 0xdf, 0x02, 0xdf, 0x02, 0x1d, 0x03, 0x1e, 0x03, 0x1f, 0x03, 0xe3, 0x02, 0x1e, 0x03, 0x1e, 0x03, 0xe3, 0x02, 0xdf, 0x02, 0x30, 0x03, 0x20, 0x03, +0x16, 0x03, 0x16, 0x03, 0x20, 0x03, 0xea, 0x02, 0x31, 0x03, 0x30, 0x03, 0x15, 0x03, 0x15, 0x03, 0x30, 0x03, 0x16, 0x03, 0xf8, 0x02, 0x26, 0x03, 0x3d, 0x03, 0x3d, 0x03, 0x26, 0x03, 0x3b, 0x03, 0x3d, 0x03, 0xee, 0x02, 0x3c, 0x03, 0x3c, 0x03, 0xee, 0x02, 0xf0, 0x02, 0x27, 0x03, 0x28, 0x03, 0xfb, 0x02, 0xfb, 0x02, 0x28, 0x03, 0xfd, 0x02, 0x25, 0x03, 0x27, 0x03, 0xf3, 0x02, 0xf3, 0x02, 0x27, 0x03, 0xfb, 0x02, 0x23, 0x03, 0x22, 0x03, 0xee, 0x02, 0xee, 0x02, 0x22, 0x03, 0xef, 0x02, +0x24, 0x03, 0x25, 0x03, 0xf2, 0x02, 0xf2, 0x02, 0x25, 0x03, 0xf3, 0x02, 0x28, 0x03, 0x29, 0x03, 0xfd, 0x02, 0xfd, 0x02, 0x29, 0x03, 0x01, 0x03, 0x2a, 0x03, 0x03, 0x03, 0x29, 0x03, 0x29, 0x03, 0x03, 0x03, 0x01, 0x03, 0x03, 0x03, 0x2a, 0x03, 0x12, 0x03, 0x12, 0x03, 0x2a, 0x03, 0x2f, 0x03, 0x2b, 0x03, 0x0a, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x0a, 0x03, 0x12, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x0c, 0x03, 0x0c, 0x03, 0x1c, 0x03, 0x0d, 0x03, 0x0c, 0x03, 0x2e, 0x03, 0x1b, 0x03, 0x1b, 0x03, +0x2e, 0x03, 0x33, 0x03, 0x0a, 0x03, 0x2b, 0x03, 0x08, 0x03, 0x08, 0x03, 0x2b, 0x03, 0x2c, 0x03, 0x2e, 0x03, 0x0c, 0x03, 0x2d, 0x03, 0x2d, 0x03, 0x0c, 0x03, 0x0e, 0x03, 0x32, 0x03, 0x31, 0x03, 0x19, 0x03, 0x19, 0x03, 0x31, 0x03, 0x15, 0x03, 0x44, 0x03, 0xe0, 0x01, 0x45, 0x03, 0x45, 0x03, 0xe0, 0x01, 0xe1, 0x01, 0xe0, 0x01, 0x44, 0x03, 0xef, 0x01, 0xef, 0x01, 0x44, 0x03, 0x46, 0x03, 0x47, 0x03, 0xf0, 0x01, 0x46, 0x03, 0x46, 0x03, 0xf0, 0x01, 0xef, 0x01, 0xf3, 0x01, 0xf4, 0x01, +0x9b, 0x01, 0x9b, 0x01, 0xf4, 0x01, 0x9c, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0x9d, 0x01, 0x9d, 0x01, 0xf3, 0x01, 0x9b, 0x01, 0xff, 0x01, 0x00, 0x02, 0x9e, 0x01, 0x9e, 0x01, 0x00, 0x02, 0x9f, 0x01, 0xf4, 0x01, 0xff, 0x01, 0x9c, 0x01, 0x9c, 0x01, 0xff, 0x01, 0x9e, 0x01, 0x06, 0x02, 0xa1, 0x01, 0x05, 0x02, 0x05, 0x02, 0xa1, 0x01, 0xa0, 0x01, 0x00, 0x02, 0x05, 0x02, 0x9f, 0x01, 0x9f, 0x01, 0x05, 0x02, 0xa0, 0x01, 0x0c, 0x02, 0xa3, 0x01, 0x0b, 0x02, 0x0b, 0x02, 0xa3, 0x01, 0xa2, 0x01, +0xa1, 0x01, 0x06, 0x02, 0xa2, 0x01, 0xa2, 0x01, 0x06, 0x02, 0x0b, 0x02, 0x12, 0x02, 0xa5, 0x01, 0x11, 0x02, 0x11, 0x02, 0xa5, 0x01, 0xa4, 0x01, 0xa3, 0x01, 0x0c, 0x02, 0xa4, 0x01, 0xa4, 0x01, 0x0c, 0x02, 0x11, 0x02, 0x18, 0x02, 0xa6, 0x01, 0x17, 0x02, 0x17, 0x02, 0xa6, 0x01, 0xa7, 0x01, 0xa5, 0x01, 0x12, 0x02, 0xa7, 0x01, 0xa7, 0x01, 0x12, 0x02, 0x17, 0x02, 0x23, 0x02, 0x22, 0x02, 0xa9, 0x01, 0xa9, 0x01, 0x22, 0x02, 0xab, 0x01, 0x26, 0x02, 0x23, 0x02, 0xad, 0x01, 0xad, 0x01, +0x23, 0x02, 0xa9, 0x01, 0x26, 0x02, 0xad, 0x01, 0x29, 0x02, 0x29, 0x02, 0xad, 0x01, 0xaf, 0x01, 0x2c, 0x02, 0x48, 0x03, 0x2e, 0x02, 0x2e, 0x02, 0x48, 0x03, 0x49, 0x03, 0xb4, 0x01, 0x30, 0x02, 0xb2, 0x01, 0xb2, 0x01, 0x30, 0x02, 0x2f, 0x02, 0x38, 0x02, 0x4a, 0x03, 0x3a, 0x02, 0x3a, 0x02, 0x4a, 0x03, 0x4b, 0x03, 0x48, 0x03, 0x2c, 0x02, 0x4b, 0x03, 0x4b, 0x03, 0x2c, 0x02, 0x3a, 0x02, 0xf0, 0x01, 0x47, 0x03, 0x4a, 0x02, 0x4a, 0x02, 0x47, 0x03, 0x4c, 0x03, 0xb9, 0x01, 0x4b, 0x02, +0x4c, 0x03, 0x4c, 0x03, 0x4b, 0x02, 0x4a, 0x02, 0x4b, 0x02, 0xb9, 0x01, 0x5a, 0x02, 0x5a, 0x02, 0xb9, 0x01, 0xbb, 0x01, 0x4d, 0x03, 0x5b, 0x02, 0xbb, 0x01, 0xbb, 0x01, 0x5b, 0x02, 0x5a, 0x02, 0x6c, 0x02, 0xc0, 0x01, 0x6d, 0x02, 0x6d, 0x02, 0xc0, 0x01, 0xbe, 0x01, 0xab, 0x01, 0x22, 0x02, 0xc2, 0x01, 0xc2, 0x01, 0x22, 0x02, 0x65, 0x02, 0x76, 0x02, 0xc4, 0x01, 0x75, 0x02, 0x75, 0x02, 0xc4, 0x01, 0xc3, 0x01, 0x75, 0x02, 0xc3, 0x01, 0x18, 0x02, 0x18, 0x02, 0xc3, 0x01, 0xa6, 0x01, +0x7b, 0x02, 0x30, 0x02, 0xc6, 0x01, 0xc6, 0x01, 0x30, 0x02, 0xb4, 0x01, 0x6c, 0x02, 0x7b, 0x02, 0xc0, 0x01, 0xc0, 0x01, 0x7b, 0x02, 0xc6, 0x01, 0x7d, 0x02, 0x4e, 0x03, 0x7f, 0x02, 0x7f, 0x02, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x80, 0x02, 0x4f, 0x03, 0x4f, 0x03, 0x80, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x50, 0x03, 0x87, 0x02, 0x87, 0x02, 0x50, 0x03, 0x51, 0x03, 0x4a, 0x03, 0x38, 0x02, 0x51, 0x03, 0x51, 0x03, 0x38, 0x02, 0x87, 0x02, 0x8b, 0x02, 0xcc, 0x01, 0x88, 0x02, 0x88, 0x02, +0xcc, 0x01, 0xcb, 0x01, 0x88, 0x02, 0xcb, 0x01, 0x76, 0x02, 0x76, 0x02, 0xcb, 0x01, 0xc4, 0x01, 0x29, 0x02, 0xaf, 0x01, 0x52, 0x03, 0x52, 0x03, 0xaf, 0x01, 0xce, 0x01, 0xd0, 0x01, 0x53, 0x03, 0xce, 0x01, 0xce, 0x01, 0x53, 0x03, 0x52, 0x03, 0x9f, 0x02, 0xf2, 0x01, 0xd1, 0x01, 0xd1, 0x01, 0xf2, 0x01, 0x9d, 0x01, 0x2a, 0x02, 0x28, 0x02, 0x94, 0x02, 0x94, 0x02, 0x28, 0x02, 0x54, 0x03, 0x28, 0x02, 0x29, 0x02, 0x54, 0x03, 0x54, 0x03, 0x29, 0x02, 0x52, 0x03, 0x53, 0x03, 0x55, 0x03, +0x52, 0x03, 0x52, 0x03, 0x55, 0x03, 0x54, 0x03, 0x55, 0x03, 0x95, 0x02, 0x54, 0x03, 0x54, 0x03, 0x95, 0x02, 0x94, 0x02, 0x53, 0x03, 0xd0, 0x01, 0x56, 0x03, 0x56, 0x03, 0xd0, 0x01, 0xd3, 0x01, 0x57, 0x03, 0x56, 0x03, 0xd5, 0x01, 0xd5, 0x01, 0x56, 0x03, 0xd3, 0x01, 0x95, 0x02, 0x55, 0x03, 0x58, 0x03, 0x58, 0x03, 0x55, 0x03, 0x59, 0x03, 0x55, 0x03, 0x53, 0x03, 0x59, 0x03, 0x59, 0x03, 0x53, 0x03, 0x56, 0x03, 0x57, 0x03, 0x5a, 0x03, 0x56, 0x03, 0x56, 0x03, 0x5a, 0x03, 0x59, 0x03, +0x5b, 0x03, 0x58, 0x03, 0x5a, 0x03, 0x5a, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5c, 0x03, 0x8f, 0x02, 0x5d, 0x03, 0x5d, 0x03, 0x8f, 0x02, 0x96, 0x02, 0x96, 0x02, 0x95, 0x02, 0x5d, 0x03, 0x5d, 0x03, 0x95, 0x02, 0x58, 0x03, 0x5b, 0x03, 0x5e, 0x03, 0x58, 0x03, 0x58, 0x03, 0x5e, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x5d, 0x03, 0x5d, 0x03, 0x5f, 0x03, 0x5c, 0x03, 0x90, 0x02, 0x8f, 0x02, 0x60, 0x03, 0x60, 0x03, 0x8f, 0x02, 0x5c, 0x03, 0x5f, 0x03, 0x61, 0x03, 0x5c, 0x03, 0x5c, 0x03, +0x61, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x60, 0x03, 0x60, 0x03, 0x62, 0x03, 0x63, 0x03, 0x91, 0x02, 0x90, 0x02, 0x63, 0x03, 0x63, 0x03, 0x90, 0x02, 0x60, 0x03, 0x62, 0x03, 0x64, 0x03, 0x63, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x8a, 0x02, 0x91, 0x02, 0x65, 0x03, 0x65, 0x03, 0x91, 0x02, 0x63, 0x03, 0x8b, 0x02, 0x8a, 0x02, 0x66, 0x03, 0x66, 0x03, 0x8a, 0x02, 0x65, 0x03, 0x64, 0x03, 0x67, 0x03, 0x65, 0x03, 0x65, 0x03, 0x67, 0x03, 0x66, 0x03, 0xcc, 0x01, 0x8b, 0x02, +0xd7, 0x01, 0xd7, 0x01, 0x8b, 0x02, 0x66, 0x03, 0x67, 0x03, 0xd6, 0x01, 0x66, 0x03, 0x66, 0x03, 0xd6, 0x01, 0xd7, 0x01, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6a, 0x03, 0x69, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x68, 0x03, 0x68, 0x03, 0x6d, 0x03, 0x69, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x6c, 0x03, 0x6c, 0x03, 0x6f, 0x03, 0x6d, 0x03, 0x70, 0x03, 0x71, 0x03, 0x6e, 0x03, 0x6e, 0x03, 0x71, 0x03, 0x6f, 0x03, 0x72, 0x03, 0x73, 0x03, 0x70, 0x03, 0x70, 0x03, 0x73, 0x03, 0x71, 0x03, +0x74, 0x03, 0x75, 0x03, 0x72, 0x03, 0x72, 0x03, 0x75, 0x03, 0x73, 0x03, 0x76, 0x03, 0x77, 0x03, 0x74, 0x03, 0x74, 0x03, 0x77, 0x03, 0x75, 0x03, 0x78, 0x03, 0x79, 0x03, 0x76, 0x03, 0x76, 0x03, 0x79, 0x03, 0x77, 0x03, 0x78, 0x03, 0x7a, 0x03, 0x79, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7a, 0x03, 0x7c, 0x03, 0x7b, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x7c, 0x03, 0x7c, 0x03, 0x7f, 0x03, 0x7d, 0x03, 0x80, 0x03, 0x81, 0x03, 0x7e, 0x03, 0x7e, 0x03, +0x81, 0x03, 0x7f, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x84, 0x03, 0x83, 0x03, 0x85, 0x03, 0x69, 0x03, 0x86, 0x03, 0x6b, 0x03, 0x6b, 0x03, 0x86, 0x03, 0x87, 0x03, 0x6d, 0x03, 0x88, 0x03, 0x69, 0x03, 0x69, 0x03, 0x88, 0x03, 0x86, 0x03, 0x6f, 0x03, 0x89, 0x03, 0x6d, 0x03, 0x6d, 0x03, 0x89, 0x03, 0x88, 0x03, 0x71, 0x03, 0x8a, 0x03, 0x6f, 0x03, 0x6f, 0x03, 0x8a, 0x03, 0x89, 0x03, 0x73, 0x03, 0x8b, 0x03, 0x71, 0x03, 0x71, 0x03, 0x8b, 0x03, 0x8a, 0x03, 0x75, 0x03, 0x8c, 0x03, +0x73, 0x03, 0x73, 0x03, 0x8c, 0x03, 0x8b, 0x03, 0x77, 0x03, 0x8d, 0x03, 0x75, 0x03, 0x75, 0x03, 0x8d, 0x03, 0x8c, 0x03, 0x79, 0x03, 0x8e, 0x03, 0x77, 0x03, 0x77, 0x03, 0x8e, 0x03, 0x8d, 0x03, 0x79, 0x03, 0x7b, 0x03, 0x8e, 0x03, 0x8e, 0x03, 0x7b, 0x03, 0x8f, 0x03, 0x7b, 0x03, 0x7d, 0x03, 0x8f, 0x03, 0x8f, 0x03, 0x7d, 0x03, 0x90, 0x03, 0x7f, 0x03, 0x91, 0x03, 0x7d, 0x03, 0x7d, 0x03, 0x91, 0x03, 0x90, 0x03, 0x92, 0x03, 0x81, 0x03, 0x93, 0x03, 0x93, 0x03, 0x81, 0x03, 0x85, 0x03, +0x86, 0x03, 0x94, 0x03, 0x87, 0x03, 0x87, 0x03, 0x94, 0x03, 0x95, 0x03, 0x88, 0x03, 0x96, 0x03, 0x86, 0x03, 0x86, 0x03, 0x96, 0x03, 0x94, 0x03, 0x89, 0x03, 0x97, 0x03, 0x88, 0x03, 0x88, 0x03, 0x97, 0x03, 0x96, 0x03, 0x8a, 0x03, 0x98, 0x03, 0x89, 0x03, 0x89, 0x03, 0x98, 0x03, 0x97, 0x03, 0x8b, 0x03, 0x99, 0x03, 0x8a, 0x03, 0x8a, 0x03, 0x99, 0x03, 0x98, 0x03, 0x8c, 0x03, 0x9a, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x9a, 0x03, 0x99, 0x03, 0x8d, 0x03, 0x9b, 0x03, 0x8c, 0x03, 0x8c, 0x03, +0x9b, 0x03, 0x9a, 0x03, 0x8e, 0x03, 0x9c, 0x03, 0x8d, 0x03, 0x8d, 0x03, 0x9c, 0x03, 0x9b, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x9c, 0x03, 0x9c, 0x03, 0x8f, 0x03, 0x9d, 0x03, 0x90, 0x03, 0x9e, 0x03, 0x8f, 0x03, 0x8f, 0x03, 0x9e, 0x03, 0x9d, 0x03, 0x91, 0x03, 0x9f, 0x03, 0x90, 0x03, 0x90, 0x03, 0x9f, 0x03, 0x9e, 0x03, 0xa0, 0x03, 0x92, 0x03, 0xa1, 0x03, 0xa1, 0x03, 0x92, 0x03, 0x93, 0x03, 0x95, 0x03, 0x94, 0x03, 0xa2, 0x03, 0xa2, 0x03, 0x94, 0x03, 0xa3, 0x03, 0x96, 0x03, 0xa4, 0x03, +0x94, 0x03, 0x94, 0x03, 0xa4, 0x03, 0xa3, 0x03, 0x97, 0x03, 0xa5, 0x03, 0x96, 0x03, 0x96, 0x03, 0xa5, 0x03, 0xa4, 0x03, 0x98, 0x03, 0xa6, 0x03, 0x97, 0x03, 0x97, 0x03, 0xa6, 0x03, 0xa5, 0x03, 0x99, 0x03, 0xa7, 0x03, 0x98, 0x03, 0x98, 0x03, 0xa7, 0x03, 0xa6, 0x03, 0x9a, 0x03, 0xa8, 0x03, 0x99, 0x03, 0x99, 0x03, 0xa8, 0x03, 0xa7, 0x03, 0x9b, 0x03, 0xa9, 0x03, 0x9a, 0x03, 0x9a, 0x03, 0xa9, 0x03, 0xa8, 0x03, 0x9c, 0x03, 0xaa, 0x03, 0x9b, 0x03, 0x9b, 0x03, 0xaa, 0x03, 0xa9, 0x03, +0x9c, 0x03, 0x9d, 0x03, 0xaa, 0x03, 0xaa, 0x03, 0x9d, 0x03, 0xab, 0x03, 0x9e, 0x03, 0xac, 0x03, 0x9d, 0x03, 0x9d, 0x03, 0xac, 0x03, 0xab, 0x03, 0x9f, 0x03, 0xad, 0x03, 0x9e, 0x03, 0x9e, 0x03, 0xad, 0x03, 0xac, 0x03, 0xae, 0x03, 0xa0, 0x03, 0xaf, 0x03, 0xaf, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa3, 0x03, 0xb0, 0x03, 0xb0, 0x03, 0xa3, 0x03, 0xb1, 0x03, 0xa4, 0x03, 0xb2, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xb2, 0x03, 0xb1, 0x03, 0xa5, 0x03, 0xb3, 0x03, 0xa4, 0x03, 0xa4, 0x03, +0xb3, 0x03, 0xb2, 0x03, 0xa6, 0x03, 0xb4, 0x03, 0xa5, 0x03, 0xa5, 0x03, 0xb4, 0x03, 0xb3, 0x03, 0xa7, 0x03, 0xb5, 0x03, 0xa6, 0x03, 0xa6, 0x03, 0xb5, 0x03, 0xb4, 0x03, 0xa8, 0x03, 0xb6, 0x03, 0xa7, 0x03, 0xa7, 0x03, 0xb6, 0x03, 0xb5, 0x03, 0xa9, 0x03, 0xb7, 0x03, 0xa8, 0x03, 0xa8, 0x03, 0xb7, 0x03, 0xb6, 0x03, 0xaa, 0x03, 0xb8, 0x03, 0xa9, 0x03, 0xa9, 0x03, 0xb8, 0x03, 0xb7, 0x03, 0xaa, 0x03, 0xab, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xab, 0x03, 0xb9, 0x03, 0xac, 0x03, 0xba, 0x03, +0xab, 0x03, 0xab, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xad, 0x03, 0xbb, 0x03, 0xac, 0x03, 0xac, 0x03, 0xbb, 0x03, 0xba, 0x03, 0xbc, 0x03, 0xae, 0x03, 0xbd, 0x03, 0xbd, 0x03, 0xae, 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb1, 0x03, 0xbe, 0x03, 0xbe, 0x03, 0xb1, 0x03, 0xbf, 0x03, 0xb2, 0x03, 0xc0, 0x03, 0xb1, 0x03, 0xb1, 0x03, 0xc0, 0x03, 0xbf, 0x03, 0xb3, 0x03, 0xc1, 0x03, 0xb2, 0x03, 0xb2, 0x03, 0xc1, 0x03, 0xc0, 0x03, 0xb4, 0x03, 0xc2, 0x03, 0xb3, 0x03, 0xb3, 0x03, 0xc2, 0x03, 0xc1, 0x03, +0xb5, 0x03, 0xc3, 0x03, 0xb4, 0x03, 0xb4, 0x03, 0xc3, 0x03, 0xc2, 0x03, 0xb6, 0x03, 0xc4, 0x03, 0xb5, 0x03, 0xb5, 0x03, 0xc4, 0x03, 0xc3, 0x03, 0xb7, 0x03, 0xc5, 0x03, 0xb6, 0x03, 0xb6, 0x03, 0xc5, 0x03, 0xc4, 0x03, 0xb8, 0x03, 0xc6, 0x03, 0xb7, 0x03, 0xb7, 0x03, 0xc6, 0x03, 0xc5, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xc6, 0x03, 0xc6, 0x03, 0xb9, 0x03, 0xc7, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xc7, 0x03, 0xc7, 0x03, 0xba, 0x03, 0xc8, 0x03, 0xbb, 0x03, 0xc9, 0x03, 0xba, 0x03, 0xba, 0x03, +0xc9, 0x03, 0xc8, 0x03, 0x87, 0x01, 0xbc, 0x03, 0x86, 0x01, 0x86, 0x01, 0xbc, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xca, 0x03, 0xca, 0x03, 0xbf, 0x03, 0xcb, 0x03, 0xc0, 0x03, 0xcc, 0x03, 0xbf, 0x03, 0xbf, 0x03, 0xcc, 0x03, 0xcb, 0x03, 0xc1, 0x03, 0xcd, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xcd, 0x03, 0xcc, 0x03, 0xc2, 0x03, 0xce, 0x03, 0xc1, 0x03, 0xc1, 0x03, 0xce, 0x03, 0xcd, 0x03, 0xc3, 0x03, 0xcf, 0x03, 0xc2, 0x03, 0xc2, 0x03, 0xcf, 0x03, 0xce, 0x03, 0xc4, 0x03, 0xd0, 0x03, +0xc3, 0x03, 0xc3, 0x03, 0xd0, 0x03, 0xcf, 0x03, 0xc5, 0x03, 0xd1, 0x03, 0xc4, 0x03, 0xc4, 0x03, 0xd1, 0x03, 0xd0, 0x03, 0xc6, 0x03, 0xd2, 0x03, 0xc5, 0x03, 0xc5, 0x03, 0xd2, 0x03, 0xd1, 0x03, 0xc6, 0x03, 0xc7, 0x03, 0xd2, 0x03, 0xd2, 0x03, 0xc7, 0x03, 0xd3, 0x03, 0xc7, 0x03, 0xc8, 0x03, 0xd3, 0x03, 0xd3, 0x03, 0xc8, 0x03, 0xd4, 0x03, 0xc9, 0x03, 0xd5, 0x03, 0xc8, 0x03, 0xc8, 0x03, 0xd5, 0x03, 0xd4, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xd6, 0x03, 0xd6, 0x03, 0xcb, 0x03, 0xd7, 0x03, +0xcc, 0x03, 0xd8, 0x03, 0xcb, 0x03, 0xcb, 0x03, 0xd8, 0x03, 0xd7, 0x03, 0xcd, 0x03, 0xd9, 0x03, 0xcc, 0x03, 0xcc, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xce, 0x03, 0xda, 0x03, 0xcd, 0x03, 0xcd, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xcf, 0x03, 0xdb, 0x03, 0xce, 0x03, 0xce, 0x03, 0xdb, 0x03, 0xda, 0x03, 0xd0, 0x03, 0xdc, 0x03, 0xcf, 0x03, 0xcf, 0x03, 0xdc, 0x03, 0xdb, 0x03, 0xd1, 0x03, 0xdd, 0x03, 0xd0, 0x03, 0xd0, 0x03, 0xdd, 0x03, 0xdc, 0x03, 0xd2, 0x03, 0xde, 0x03, 0xd1, 0x03, 0xd1, 0x03, +0xde, 0x03, 0xdd, 0x03, 0xd2, 0x03, 0xd3, 0x03, 0xde, 0x03, 0xde, 0x03, 0xd3, 0x03, 0xdf, 0x03, 0xd3, 0x03, 0xd4, 0x03, 0xdf, 0x03, 0xdf, 0x03, 0xd4, 0x03, 0xe0, 0x03, 0xd5, 0x03, 0xe1, 0x03, 0xd4, 0x03, 0xd4, 0x03, 0xe1, 0x03, 0xe0, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xe2, 0x03, 0xe2, 0x03, 0xd7, 0x03, 0xe3, 0x03, 0xd8, 0x03, 0xe4, 0x03, 0xd7, 0x03, 0xd7, 0x03, 0xe4, 0x03, 0xe3, 0x03, 0xd9, 0x03, 0xe5, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xe5, 0x03, 0xe4, 0x03, 0xda, 0x03, 0xe6, 0x03, +0xd9, 0x03, 0xd9, 0x03, 0xe6, 0x03, 0xe5, 0x03, 0xdb, 0x03, 0xe7, 0x03, 0xda, 0x03, 0xda, 0x03, 0xe7, 0x03, 0xe6, 0x03, 0xdc, 0x03, 0xe8, 0x03, 0xdb, 0x03, 0xdb, 0x03, 0xe8, 0x03, 0xe7, 0x03, 0xdd, 0x03, 0xe9, 0x03, 0xdc, 0x03, 0xdc, 0x03, 0xe9, 0x03, 0xe8, 0x03, 0xde, 0x03, 0xea, 0x03, 0xdd, 0x03, 0xdd, 0x03, 0xea, 0x03, 0xe9, 0x03, 0xde, 0x03, 0xdf, 0x03, 0xea, 0x03, 0xea, 0x03, 0xdf, 0x03, 0xeb, 0x03, 0xdf, 0x03, 0xe0, 0x03, 0xeb, 0x03, 0xeb, 0x03, 0xe0, 0x03, 0xec, 0x03, +0xe1, 0x03, 0xed, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xed, 0x03, 0xec, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xee, 0x03, 0xee, 0x03, 0xe3, 0x03, 0xef, 0x03, 0xe4, 0x03, 0xf0, 0x03, 0xe3, 0x03, 0xe3, 0x03, 0xf0, 0x03, 0xef, 0x03, 0xe5, 0x03, 0xf1, 0x03, 0xe4, 0x03, 0xe4, 0x03, 0xf1, 0x03, 0xf0, 0x03, 0xe6, 0x03, 0xf2, 0x03, 0xe5, 0x03, 0xe5, 0x03, 0xf2, 0x03, 0xf1, 0x03, 0xe7, 0x03, 0xf3, 0x03, 0xe6, 0x03, 0xe6, 0x03, 0xf3, 0x03, 0xf2, 0x03, 0xe8, 0x03, 0xf4, 0x03, 0xe7, 0x03, 0xe7, 0x03, +0xf4, 0x03, 0xf3, 0x03, 0xe9, 0x03, 0xf5, 0x03, 0xe8, 0x03, 0xe8, 0x03, 0xf5, 0x03, 0xf4, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xea, 0x03, 0xf6, 0x03, 0xea, 0x03, 0xeb, 0x03, 0xf6, 0x03, 0xf6, 0x03, 0xeb, 0x03, 0xf7, 0x03, 0xeb, 0x03, 0xec, 0x03, 0xf7, 0x03, 0xf7, 0x03, 0xec, 0x03, 0xf8, 0x03, 0xec, 0x03, 0xed, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xed, 0x03, 0xf9, 0x03, 0xee, 0x03, 0xef, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xef, 0x03, 0xfb, 0x03, 0xf0, 0x03, 0xfc, 0x03, +0xef, 0x03, 0xef, 0x03, 0xfc, 0x03, 0xfb, 0x03, 0xf1, 0x03, 0xfd, 0x03, 0xf0, 0x03, 0xf0, 0x03, 0xfd, 0x03, 0xfc, 0x03, 0xf2, 0x03, 0xfe, 0x03, 0xf1, 0x03, 0xf1, 0x03, 0xfe, 0x03, 0xfd, 0x03, 0xf3, 0x03, 0xff, 0x03, 0xf2, 0x03, 0xf2, 0x03, 0xff, 0x03, 0xfe, 0x03, 0xf4, 0x03, 0x00, 0x04, 0xf3, 0x03, 0xf3, 0x03, 0x00, 0x04, 0xff, 0x03, 0xf5, 0x03, 0x01, 0x04, 0xf4, 0x03, 0xf4, 0x03, 0x01, 0x04, 0x00, 0x04, 0xf5, 0x03, 0xf6, 0x03, 0x01, 0x04, 0x01, 0x04, 0xf6, 0x03, 0x02, 0x04, +0xf6, 0x03, 0xf7, 0x03, 0x02, 0x04, 0x02, 0x04, 0xf7, 0x03, 0x03, 0x04, 0xf8, 0x03, 0x04, 0x04, 0xf7, 0x03, 0xf7, 0x03, 0x04, 0x04, 0x03, 0x04, 0xf8, 0x03, 0xf9, 0x03, 0x04, 0x04, 0x04, 0x04, 0xf9, 0x03, 0x05, 0x04, 0xfa, 0x03, 0xfb, 0x03, 0x06, 0x04, 0x06, 0x04, 0xfb, 0x03, 0x07, 0x04, 0xfb, 0x03, 0xfc, 0x03, 0x07, 0x04, 0x07, 0x04, 0xfc, 0x03, 0x08, 0x04, 0xfc, 0x03, 0xfd, 0x03, 0x08, 0x04, 0x08, 0x04, 0xfd, 0x03, 0x09, 0x04, 0xfd, 0x03, 0xfe, 0x03, 0x09, 0x04, 0x09, 0x04, +0xfe, 0x03, 0x0a, 0x04, 0xff, 0x03, 0x0b, 0x04, 0xfe, 0x03, 0xfe, 0x03, 0x0b, 0x04, 0x0a, 0x04, 0x00, 0x04, 0x0c, 0x04, 0xff, 0x03, 0xff, 0x03, 0x0c, 0x04, 0x0b, 0x04, 0x01, 0x04, 0x0d, 0x04, 0x00, 0x04, 0x00, 0x04, 0x0d, 0x04, 0x0c, 0x04, 0x01, 0x04, 0x02, 0x04, 0x0d, 0x04, 0x0d, 0x04, 0x02, 0x04, 0x0e, 0x04, 0x03, 0x04, 0x0f, 0x04, 0x02, 0x04, 0x02, 0x04, 0x0f, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x10, 0x04, 0x03, 0x04, 0x03, 0x04, 0x10, 0x04, 0x0f, 0x04, 0x05, 0x04, 0x11, 0x04, +0x04, 0x04, 0x04, 0x04, 0x11, 0x04, 0x10, 0x04, 0x06, 0x04, 0x07, 0x04, 0x12, 0x04, 0x12, 0x04, 0x07, 0x04, 0x13, 0x04, 0x07, 0x04, 0x08, 0x04, 0x13, 0x04, 0x13, 0x04, 0x08, 0x04, 0x14, 0x04, 0x08, 0x04, 0x09, 0x04, 0x14, 0x04, 0x14, 0x04, 0x09, 0x04, 0x15, 0x04, 0x0c, 0x04, 0x0d, 0x04, 0x16, 0x04, 0x0e, 0x04, 0x17, 0x04, 0x0d, 0x04, 0x0d, 0x04, 0x17, 0x04, 0x16, 0x04, 0x0f, 0x04, 0x18, 0x04, 0x0e, 0x04, 0x0e, 0x04, 0x18, 0x04, 0x17, 0x04, 0x10, 0x04, 0x19, 0x04, 0x0f, 0x04, +0x0f, 0x04, 0x19, 0x04, 0x18, 0x04, 0x11, 0x04, 0x1a, 0x04, 0x10, 0x04, 0x10, 0x04, 0x1a, 0x04, 0x19, 0x04, 0x12, 0x04, 0x13, 0x04, 0x1b, 0x04, 0x1b, 0x04, 0x13, 0x04, 0x1c, 0x04, 0x13, 0x04, 0x14, 0x04, 0x1c, 0x04, 0x1c, 0x04, 0x14, 0x04, 0x1d, 0x04, 0x1b, 0x04, 0x1c, 0x04, 0x1e, 0x04, 0x1e, 0x04, 0x1c, 0x04, 0x1f, 0x04, 0x1d, 0x04, 0x20, 0x04, 0x1c, 0x04, 0x1c, 0x04, 0x20, 0x04, 0x1f, 0x04, 0x21, 0x04, 0x22, 0x04, 0x18, 0x04, 0x18, 0x04, 0x22, 0x04, 0x17, 0x04, 0x19, 0x04, +0x23, 0x04, 0x18, 0x04, 0x18, 0x04, 0x23, 0x04, 0x21, 0x04, 0x1a, 0x04, 0x24, 0x04, 0x19, 0x04, 0x19, 0x04, 0x24, 0x04, 0x23, 0x04, 0x1e, 0x04, 0x1f, 0x04, 0x25, 0x04, 0x25, 0x04, 0x1f, 0x04, 0x26, 0x04, 0x20, 0x04, 0x27, 0x04, 0x1f, 0x04, 0x1f, 0x04, 0x27, 0x04, 0x26, 0x04, 0x28, 0x04, 0x22, 0x04, 0x29, 0x04, 0x29, 0x04, 0x22, 0x04, 0x21, 0x04, 0x21, 0x04, 0x23, 0x04, 0x29, 0x04, 0x29, 0x04, 0x23, 0x04, 0x2a, 0x04, 0x24, 0x04, 0x2b, 0x04, 0x23, 0x04, 0x23, 0x04, 0x2b, 0x04, +0x2a, 0x04, 0x25, 0x04, 0x26, 0x04, 0x2c, 0x04, 0x2c, 0x04, 0x26, 0x04, 0x2d, 0x04, 0x26, 0x04, 0x27, 0x04, 0x2d, 0x04, 0x2d, 0x04, 0x27, 0x04, 0x2e, 0x04, 0x2f, 0x04, 0x30, 0x04, 0x29, 0x04, 0x29, 0x04, 0x30, 0x04, 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2f, 0x04, 0x2f, 0x04, 0x2a, 0x04, 0x31, 0x04, 0x2b, 0x04, 0x32, 0x04, 0x2a, 0x04, 0x2a, 0x04, 0x32, 0x04, 0x31, 0x04, 0x2c, 0x04, 0x2d, 0x04, 0x33, 0x04, 0x33, 0x04, 0x2d, 0x04, 0x34, 0x04, 0x2d, 0x04, 0x2e, 0x04, 0x34, 0x04, +0x34, 0x04, 0x2e, 0x04, 0x35, 0x04, 0x30, 0x04, 0x2f, 0x04, 0x36, 0x04, 0x36, 0x04, 0x2f, 0x04, 0x37, 0x04, 0x2f, 0x04, 0x31, 0x04, 0x37, 0x04, 0x37, 0x04, 0x31, 0x04, 0x38, 0x04, 0x31, 0x04, 0x32, 0x04, 0x38, 0x04, 0x38, 0x04, 0x32, 0x04, 0x39, 0x04, 0x32, 0x04, 0x3a, 0x04, 0x39, 0x04, 0x39, 0x04, 0x3a, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3a, 0x04, 0x3d, 0x04, 0x3d, 0x04, 0x3a, 0x04, 0x3e, 0x04, 0x33, 0x04, 0x34, 0x04, 0x3f, 0x04, 0x3f, 0x04, 0x34, 0x04, 0x40, 0x04, 0x34, 0x04, +0x35, 0x04, 0x40, 0x04, 0x40, 0x04, 0x35, 0x04, 0x41, 0x04, 0x42, 0x04, 0x43, 0x04, 0x44, 0x04, 0x44, 0x04, 0x43, 0x04, 0x45, 0x04, 0x68, 0x03, 0x6a, 0x03, 0x46, 0x04, 0x6c, 0x03, 0x68, 0x03, 0x46, 0x04, 0x6e, 0x03, 0x6c, 0x03, 0x46, 0x04, 0x70, 0x03, 0x6e, 0x03, 0x46, 0x04, 0x72, 0x03, 0x70, 0x03, 0x46, 0x04, 0x74, 0x03, 0x72, 0x03, 0x46, 0x04, 0x76, 0x03, 0x74, 0x03, 0x46, 0x04, 0x78, 0x03, 0x76, 0x03, 0x46, 0x04, 0x7a, 0x03, 0x78, 0x03, 0x46, 0x04, 0x7c, 0x03, 0x7a, 0x03, +0x46, 0x04, 0x7e, 0x03, 0x7c, 0x03, 0x46, 0x04, 0x7e, 0x03, 0x46, 0x04, 0x80, 0x03, 0x82, 0x03, 0x84, 0x03, 0x46, 0x04, 0x47, 0x04, 0x48, 0x04, 0x49, 0x04, 0x49, 0x04, 0x48, 0x04, 0x4a, 0x04, 0x49, 0x04, 0x4b, 0x04, 0x47, 0x04, 0x47, 0x04, 0x4b, 0x04, 0x4c, 0x04, 0x4d, 0x04, 0x4e, 0x04, 0x49, 0x04, 0x49, 0x04, 0x4e, 0x04, 0x4b, 0x04, 0x49, 0x04, 0x4a, 0x04, 0x4d, 0x04, 0x4d, 0x04, 0x4a, 0x04, 0x4f, 0x04, 0x50, 0x04, 0x51, 0x04, 0x52, 0x04, 0x52, 0x04, 0x51, 0x04, 0x53, 0x04, +0x52, 0x04, 0x54, 0x04, 0x50, 0x04, 0x50, 0x04, 0x54, 0x04, 0x55, 0x04, 0x47, 0x04, 0x4c, 0x04, 0x52, 0x04, 0x52, 0x04, 0x4c, 0x04, 0x54, 0x04, 0x52, 0x04, 0x53, 0x04, 0x47, 0x04, 0x47, 0x04, 0x53, 0x04, 0x48, 0x04, 0x56, 0x04, 0x57, 0x04, 0x58, 0x04, 0x58, 0x04, 0x57, 0x04, 0x59, 0x04, 0x58, 0x04, 0x5a, 0x04, 0x56, 0x04, 0x56, 0x04, 0x5a, 0x04, 0x5b, 0x04, 0x50, 0x04, 0x55, 0x04, 0x58, 0x04, 0x58, 0x04, 0x55, 0x04, 0x5a, 0x04, 0x58, 0x04, 0x59, 0x04, 0x50, 0x04, 0x50, 0x04, +0x59, 0x04, 0x51, 0x04, 0x5c, 0x04, 0x5d, 0x04, 0x5e, 0x04, 0x5e, 0x04, 0x5d, 0x04, 0x5f, 0x04, 0x5f, 0x04, 0x60, 0x04, 0x5e, 0x04, 0x5e, 0x04, 0x60, 0x04, 0x61, 0x04, 0x56, 0x04, 0x5b, 0x04, 0x5f, 0x04, 0x5f, 0x04, 0x5b, 0x04, 0x60, 0x04, 0x5f, 0x04, 0x5d, 0x04, 0x56, 0x04, 0x56, 0x04, 0x5d, 0x04, 0x57, 0x04, 0x62, 0x04, 0x63, 0x04, 0x64, 0x04, 0x64, 0x04, 0x63, 0x04, 0x65, 0x04, 0x61, 0x04, 0x62, 0x04, 0x5e, 0x04, 0x5e, 0x04, 0x62, 0x04, 0x64, 0x04, 0x64, 0x04, 0x65, 0x04, +0x66, 0x04, 0x66, 0x04, 0x65, 0x04, 0x67, 0x04, 0x68, 0x04, 0x69, 0x04, 0x6a, 0x04, 0x6a, 0x04, 0x69, 0x04, 0x6b, 0x04, 0x6c, 0x04, 0x6d, 0x04, 0x6b, 0x04, 0x6b, 0x04, 0x6d, 0x04, 0x6a, 0x04, 0x63, 0x04, 0x6c, 0x04, 0x65, 0x04, 0x65, 0x04, 0x6c, 0x04, 0x6b, 0x04, 0x69, 0x04, 0x67, 0x04, 0x6b, 0x04, 0x6b, 0x04, 0x67, 0x04, 0x65, 0x04, 0x6e, 0x04, 0x6f, 0x04, 0x70, 0x04, 0x70, 0x04, 0x6f, 0x04, 0x71, 0x04, 0x72, 0x04, 0x73, 0x04, 0x71, 0x04, 0x71, 0x04, 0x73, 0x04, 0x70, 0x04, +0x6d, 0x04, 0x72, 0x04, 0x6a, 0x04, 0x6a, 0x04, 0x72, 0x04, 0x71, 0x04, 0x6f, 0x04, 0x68, 0x04, 0x71, 0x04, 0x71, 0x04, 0x68, 0x04, 0x6a, 0x04, 0x74, 0x04, 0x75, 0x04, 0x76, 0x04, 0x76, 0x04, 0x75, 0x04, 0x77, 0x04, 0x78, 0x04, 0x79, 0x04, 0x77, 0x04, 0x77, 0x04, 0x79, 0x04, 0x76, 0x04, 0x73, 0x04, 0x78, 0x04, 0x70, 0x04, 0x70, 0x04, 0x78, 0x04, 0x77, 0x04, 0x75, 0x04, 0x6e, 0x04, 0x77, 0x04, 0x77, 0x04, 0x6e, 0x04, 0x70, 0x04, 0x7a, 0x04, 0x7b, 0x04, 0x7c, 0x04, 0x7c, 0x04, +0x7b, 0x04, 0x7d, 0x04, 0x7e, 0x04, 0x7f, 0x04, 0x7d, 0x04, 0x7d, 0x04, 0x7f, 0x04, 0x7c, 0x04, 0x79, 0x04, 0x7e, 0x04, 0x76, 0x04, 0x76, 0x04, 0x7e, 0x04, 0x7d, 0x04, 0x7b, 0x04, 0x74, 0x04, 0x7d, 0x04, 0x7d, 0x04, 0x74, 0x04, 0x76, 0x04, 0x4d, 0x04, 0x4f, 0x04, 0x80, 0x04, 0x80, 0x04, 0x4f, 0x04, 0x81, 0x04, 0x80, 0x04, 0x82, 0x04, 0x4d, 0x04, 0x4d, 0x04, 0x82, 0x04, 0x4e, 0x04, 0x7c, 0x04, 0x7f, 0x04, 0x80, 0x04, 0x80, 0x04, 0x7f, 0x04, 0x82, 0x04, 0x80, 0x04, 0x81, 0x04, +0x7c, 0x04, 0x7c, 0x04, 0x81, 0x04, 0x7a, 0x04, 0x75, 0x04, 0x74, 0x04, 0x4a, 0x04, 0x4a, 0x04, 0x74, 0x04, 0x4f, 0x04, 0x83, 0x04, 0x84, 0x04, 0x85, 0x04, 0x85, 0x04, 0x84, 0x04, 0x86, 0x04, 0x87, 0x04, 0x88, 0x04, 0x89, 0x04, 0x89, 0x04, 0x88, 0x04, 0x86, 0x04, 0x8a, 0x04, 0x8b, 0x04, 0x8c, 0x04, 0x8c, 0x04, 0x8b, 0x04, 0x8d, 0x04, 0x8e, 0x04, 0x8f, 0x04, 0x90, 0x04, 0x90, 0x04, 0x8f, 0x04, 0x8d, 0x04, 0x91, 0x04, 0x92, 0x04, 0x90, 0x04, 0x90, 0x04, 0x92, 0x04, 0x93, 0x04, +0x94, 0x04, 0x95, 0x04, 0x85, 0x04, 0x85, 0x04, 0x95, 0x04, 0x93, 0x04, 0x96, 0x04, 0x97, 0x04, 0x98, 0x04, 0x98, 0x04, 0x97, 0x04, 0x89, 0x04, 0x99, 0x04, 0x9a, 0x04, 0x9b, 0x04, 0x9b, 0x04, 0x9a, 0x04, 0x97, 0x04, 0x9c, 0x04, 0x9d, 0x04, 0x9b, 0x04, 0x9b, 0x04, 0x9d, 0x04, 0x9e, 0x04, 0x9f, 0x04, 0x9e, 0x04, 0xa0, 0x04, 0xa0, 0x04, 0x9e, 0x04, 0xa1, 0x04, 0xa2, 0x04, 0xa3, 0x04, 0xa4, 0x04, 0xa4, 0x04, 0xa3, 0x04, 0xa5, 0x04, 0xa6, 0x04, 0xa3, 0x04, 0xa7, 0x04, 0xa7, 0x04, +0xa3, 0x04, 0xa1, 0x04, 0xa8, 0x04, 0xa9, 0x04, 0xaa, 0x04, 0xaa, 0x04, 0xa9, 0x04, 0xa5, 0x04, 0xab, 0x04, 0xa9, 0x04, 0xac, 0x04, 0xac, 0x04, 0xa9, 0x04, 0xad, 0x04, 0xae, 0x04, 0xaf, 0x04, 0xb0, 0x04, 0xb0, 0x04, 0xaf, 0x04, 0xad, 0x04, 0xb1, 0x04, 0xaf, 0x04, 0xb2, 0x04, 0xb2, 0x04, 0xaf, 0x04, 0xb3, 0x04, 0xb4, 0x04, 0xb5, 0x04, 0xb6, 0x04, 0xb6, 0x04, 0xb5, 0x04, 0xb3, 0x04, 0xb7, 0x04, 0xb5, 0x04, 0xb8, 0x04, 0xb8, 0x04, 0xb5, 0x04, 0xb9, 0x04, 0xba, 0x04, 0xbb, 0x04, +0xbc, 0x04, 0xbc, 0x04, 0xbb, 0x04, 0xb9, 0x04, 0xbd, 0x04, 0xbb, 0x04, 0xbe, 0x04, 0xbe, 0x04, 0xbb, 0x04, 0x8c, 0x04, 0x5a, 0x04, 0xbf, 0x04, 0x5b, 0x04, 0x5b, 0x04, 0xbf, 0x04, 0xc0, 0x04, 0xc1, 0x04, 0x5a, 0x04, 0xc2, 0x04, 0xc2, 0x04, 0x5a, 0x04, 0x55, 0x04, 0x4b, 0x04, 0xc3, 0x04, 0x4c, 0x04, 0x4c, 0x04, 0xc3, 0x04, 0xc4, 0x04, 0xc5, 0x04, 0x4b, 0x04, 0xc6, 0x04, 0xc6, 0x04, 0x4b, 0x04, 0x4e, 0x04, 0x54, 0x04, 0xc7, 0x04, 0x55, 0x04, 0x55, 0x04, 0xc7, 0x04, 0xc8, 0x04, +0xc9, 0x04, 0x54, 0x04, 0xca, 0x04, 0xca, 0x04, 0x54, 0x04, 0x4c, 0x04, 0x60, 0x04, 0xcb, 0x04, 0x61, 0x04, 0x61, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0x60, 0x04, 0xce, 0x04, 0xce, 0x04, 0x60, 0x04, 0x5b, 0x04, 0x82, 0x04, 0xcf, 0x04, 0x4e, 0x04, 0x4e, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd1, 0x04, 0x82, 0x04, 0xd2, 0x04, 0xd2, 0x04, 0x82, 0x04, 0x7f, 0x04, 0x63, 0x04, 0x62, 0x04, 0xd3, 0x04, 0xd3, 0x04, 0x62, 0x04, 0xd4, 0x04, 0x62, 0x04, 0x61, 0x04, 0xd5, 0x04, 0xd5, 0x04, +0x61, 0x04, 0xd6, 0x04, 0x7f, 0x04, 0x7e, 0x04, 0xd7, 0x04, 0xd7, 0x04, 0x7e, 0x04, 0xd8, 0x04, 0x7e, 0x04, 0x79, 0x04, 0xd9, 0x04, 0xd9, 0x04, 0x79, 0x04, 0xda, 0x04, 0x6d, 0x04, 0x6c, 0x04, 0xdb, 0x04, 0xdb, 0x04, 0x6c, 0x04, 0xdc, 0x04, 0x6c, 0x04, 0x63, 0x04, 0xdd, 0x04, 0xdd, 0x04, 0x63, 0x04, 0xde, 0x04, 0x79, 0x04, 0x78, 0x04, 0xdf, 0x04, 0xdf, 0x04, 0x78, 0x04, 0xe0, 0x04, 0x78, 0x04, 0x73, 0x04, 0xe1, 0x04, 0xe1, 0x04, 0x73, 0x04, 0xe2, 0x04, 0x73, 0x04, 0x72, 0x04, +0xe3, 0x04, 0xe3, 0x04, 0x72, 0x04, 0xe4, 0x04, 0x72, 0x04, 0x6d, 0x04, 0xe5, 0x04, 0xe5, 0x04, 0x6d, 0x04, 0xe6, 0x04, 0xe7, 0x04, 0x9a, 0x04, 0xe8, 0x04, 0xe8, 0x04, 0x9a, 0x04, 0x99, 0x04, 0x9a, 0x04, 0xe9, 0x04, 0x87, 0x04, 0x87, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0x95, 0x04, 0xec, 0x04, 0xec, 0x04, 0x95, 0x04, 0x94, 0x04, 0x8e, 0x04, 0x95, 0x04, 0xed, 0x04, 0xed, 0x04, 0x95, 0x04, 0xee, 0x04, 0x87, 0x04, 0xef, 0x04, 0x88, 0x04, 0x88, 0x04, 0xef, 0x04, 0xf0, 0x04, +0xf1, 0x04, 0x94, 0x04, 0xf2, 0x04, 0xf2, 0x04, 0x94, 0x04, 0x88, 0x04, 0xf3, 0x04, 0x9f, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0x9f, 0x04, 0xa0, 0x04, 0xf5, 0x04, 0x99, 0x04, 0xf6, 0x04, 0xf6, 0x04, 0x99, 0x04, 0x9f, 0x04, 0xf7, 0x04, 0xf8, 0x04, 0x8e, 0x04, 0x8e, 0x04, 0xf8, 0x04, 0x8f, 0x04, 0xbe, 0x04, 0x8f, 0x04, 0xf9, 0x04, 0xf9, 0x04, 0x8f, 0x04, 0xfa, 0x04, 0xfb, 0x04, 0xa2, 0x04, 0xfc, 0x04, 0xfc, 0x04, 0xa2, 0x04, 0xa4, 0x04, 0xfd, 0x04, 0xa0, 0x04, 0xfe, 0x04, 0xfe, 0x04, +0xa0, 0x04, 0xa2, 0x04, 0xff, 0x04, 0x00, 0x05, 0xbe, 0x04, 0xbe, 0x04, 0x00, 0x05, 0xbd, 0x04, 0xb8, 0x04, 0xbd, 0x04, 0x01, 0x05, 0x01, 0x05, 0xbd, 0x04, 0x02, 0x05, 0x03, 0x05, 0xab, 0x04, 0x04, 0x05, 0x04, 0x05, 0xab, 0x04, 0xac, 0x04, 0x05, 0x05, 0xa4, 0x04, 0x06, 0x05, 0x06, 0x05, 0xa4, 0x04, 0xab, 0x04, 0x07, 0x05, 0x08, 0x05, 0xb8, 0x04, 0xb8, 0x04, 0x08, 0x05, 0xb7, 0x04, 0xb2, 0x04, 0xb7, 0x04, 0x09, 0x05, 0x09, 0x05, 0xb7, 0x04, 0x0a, 0x05, 0xb2, 0x04, 0x0b, 0x05, +0xb1, 0x04, 0xb1, 0x04, 0x0b, 0x05, 0x0c, 0x05, 0x0d, 0x05, 0xac, 0x04, 0x0e, 0x05, 0x0e, 0x05, 0xac, 0x04, 0xb1, 0x04, 0xa6, 0x04, 0x0f, 0x05, 0xaa, 0x04, 0xaa, 0x04, 0x0f, 0x05, 0x10, 0x05, 0xa6, 0x04, 0xa7, 0x04, 0x0f, 0x05, 0x0f, 0x05, 0xa7, 0x04, 0x11, 0x05, 0xa8, 0x04, 0x12, 0x05, 0xb0, 0x04, 0xb0, 0x04, 0x12, 0x05, 0x13, 0x05, 0x12, 0x05, 0xa8, 0x04, 0x10, 0x05, 0x10, 0x05, 0xa8, 0x04, 0xaa, 0x04, 0x98, 0x04, 0x84, 0x04, 0x14, 0x05, 0x14, 0x05, 0x84, 0x04, 0x15, 0x05, +0x84, 0x04, 0x83, 0x04, 0x15, 0x05, 0x15, 0x05, 0x83, 0x04, 0x16, 0x05, 0xb4, 0x04, 0x17, 0x05, 0xbc, 0x04, 0xbc, 0x04, 0x17, 0x05, 0x18, 0x05, 0x17, 0x05, 0xb4, 0x04, 0x19, 0x05, 0x19, 0x05, 0xb4, 0x04, 0xb6, 0x04, 0x91, 0x04, 0x8b, 0x04, 0x1a, 0x05, 0x1a, 0x05, 0x8b, 0x04, 0x1b, 0x05, 0x1b, 0x05, 0x8b, 0x04, 0x1c, 0x05, 0x1c, 0x05, 0x8b, 0x04, 0x8a, 0x04, 0x83, 0x04, 0x92, 0x04, 0x16, 0x05, 0x16, 0x05, 0x92, 0x04, 0x1d, 0x05, 0x92, 0x04, 0x91, 0x04, 0x1d, 0x05, 0x1d, 0x05, +0x91, 0x04, 0x1a, 0x05, 0x9c, 0x04, 0x96, 0x04, 0x1e, 0x05, 0x1e, 0x05, 0x96, 0x04, 0x1f, 0x05, 0x96, 0x04, 0x98, 0x04, 0x1f, 0x05, 0x1f, 0x05, 0x98, 0x04, 0x14, 0x05, 0xa7, 0x04, 0x9d, 0x04, 0x11, 0x05, 0x11, 0x05, 0x9d, 0x04, 0x20, 0x05, 0x9d, 0x04, 0x9c, 0x04, 0x20, 0x05, 0x20, 0x05, 0x9c, 0x04, 0x1e, 0x05, 0xae, 0x04, 0x21, 0x05, 0xb6, 0x04, 0xb6, 0x04, 0x21, 0x05, 0x19, 0x05, 0x21, 0x05, 0xae, 0x04, 0x13, 0x05, 0x13, 0x05, 0xae, 0x04, 0xb0, 0x04, 0xba, 0x04, 0x22, 0x05, +0x8a, 0x04, 0x8a, 0x04, 0x22, 0x05, 0x1c, 0x05, 0x22, 0x05, 0xba, 0x04, 0x18, 0x05, 0x18, 0x05, 0xba, 0x04, 0xbc, 0x04, 0x23, 0x05, 0x24, 0x05, 0x0f, 0x05, 0x0f, 0x05, 0x24, 0x05, 0x10, 0x05, 0x25, 0x05, 0x23, 0x05, 0x11, 0x05, 0x11, 0x05, 0x23, 0x05, 0x0f, 0x05, 0x12, 0x05, 0x26, 0x05, 0x13, 0x05, 0x13, 0x05, 0x26, 0x05, 0x27, 0x05, 0x26, 0x05, 0x12, 0x05, 0x24, 0x05, 0x24, 0x05, 0x12, 0x05, 0x10, 0x05, 0x28, 0x05, 0x29, 0x05, 0x15, 0x05, 0x15, 0x05, 0x29, 0x05, 0x14, 0x05, +0x2a, 0x05, 0x28, 0x05, 0x16, 0x05, 0x16, 0x05, 0x28, 0x05, 0x15, 0x05, 0x17, 0x05, 0x2b, 0x05, 0x18, 0x05, 0x18, 0x05, 0x2b, 0x05, 0x2c, 0x05, 0x2b, 0x05, 0x17, 0x05, 0x2d, 0x05, 0x2d, 0x05, 0x17, 0x05, 0x19, 0x05, 0x1b, 0x05, 0x2e, 0x05, 0x1a, 0x05, 0x1a, 0x05, 0x2e, 0x05, 0x2f, 0x05, 0x2e, 0x05, 0x1b, 0x05, 0x30, 0x05, 0x30, 0x05, 0x1b, 0x05, 0x1c, 0x05, 0x31, 0x05, 0x2a, 0x05, 0x1d, 0x05, 0x1d, 0x05, 0x2a, 0x05, 0x16, 0x05, 0x2f, 0x05, 0x31, 0x05, 0x1a, 0x05, 0x1a, 0x05, +0x31, 0x05, 0x1d, 0x05, 0x32, 0x05, 0x33, 0x05, 0x1f, 0x05, 0x1f, 0x05, 0x33, 0x05, 0x1e, 0x05, 0x29, 0x05, 0x32, 0x05, 0x14, 0x05, 0x14, 0x05, 0x32, 0x05, 0x1f, 0x05, 0x34, 0x05, 0x25, 0x05, 0x20, 0x05, 0x20, 0x05, 0x25, 0x05, 0x11, 0x05, 0x33, 0x05, 0x34, 0x05, 0x1e, 0x05, 0x1e, 0x05, 0x34, 0x05, 0x20, 0x05, 0x21, 0x05, 0x35, 0x05, 0x19, 0x05, 0x19, 0x05, 0x35, 0x05, 0x2d, 0x05, 0x35, 0x05, 0x21, 0x05, 0x27, 0x05, 0x27, 0x05, 0x21, 0x05, 0x13, 0x05, 0x22, 0x05, 0x36, 0x05, +0x1c, 0x05, 0x1c, 0x05, 0x36, 0x05, 0x30, 0x05, 0x36, 0x05, 0x22, 0x05, 0x2c, 0x05, 0x2c, 0x05, 0x22, 0x05, 0x18, 0x05, 0x7b, 0x04, 0x7a, 0x04, 0x74, 0x04, 0x74, 0x04, 0x7a, 0x04, 0x4f, 0x04, 0x7a, 0x04, 0x81, 0x04, 0x4f, 0x04, 0x48, 0x04, 0x53, 0x04, 0x6e, 0x04, 0x6e, 0x04, 0x53, 0x04, 0x6f, 0x04, 0x4a, 0x04, 0x48, 0x04, 0x75, 0x04, 0x75, 0x04, 0x48, 0x04, 0x6e, 0x04, 0x53, 0x04, 0x51, 0x04, 0x6f, 0x04, 0x6f, 0x04, 0x51, 0x04, 0x68, 0x04, 0x5d, 0x04, 0x5c, 0x04, 0x57, 0x04, +0x67, 0x04, 0x57, 0x04, 0x66, 0x04, 0x57, 0x04, 0x5c, 0x04, 0x66, 0x04, 0x59, 0x04, 0x69, 0x04, 0x51, 0x04, 0x51, 0x04, 0x69, 0x04, 0x68, 0x04, 0x66, 0x04, 0x5c, 0x04, 0x64, 0x04, 0x64, 0x04, 0x5c, 0x04, 0x5e, 0x04, 0x57, 0x04, 0x67, 0x04, 0x59, 0x04, 0x59, 0x04, 0x67, 0x04, 0x69, 0x04, 0x24, 0x05, 0x23, 0x05, 0x37, 0x05, 0x37, 0x05, 0x23, 0x05, 0x38, 0x05, 0x23, 0x05, 0x25, 0x05, 0x38, 0x05, 0x38, 0x05, 0x25, 0x05, 0x36, 0x04, 0x26, 0x05, 0x39, 0x05, 0x27, 0x05, 0x27, 0x05, +0x39, 0x05, 0x3a, 0x05, 0x28, 0x05, 0x16, 0x04, 0x29, 0x05, 0x29, 0x05, 0x16, 0x04, 0x17, 0x04, 0x28, 0x05, 0x2a, 0x05, 0x16, 0x04, 0x16, 0x04, 0x2a, 0x05, 0x0c, 0x04, 0x2b, 0x05, 0x2e, 0x04, 0x2c, 0x05, 0x2c, 0x05, 0x2e, 0x04, 0x27, 0x04, 0x2d, 0x05, 0x35, 0x04, 0x2b, 0x05, 0x2b, 0x05, 0x35, 0x04, 0x2e, 0x04, 0x2f, 0x05, 0x2e, 0x05, 0x0a, 0x04, 0x0a, 0x04, 0x2e, 0x05, 0x15, 0x04, 0x2e, 0x05, 0x30, 0x05, 0x15, 0x04, 0x15, 0x04, 0x30, 0x05, 0x1d, 0x04, 0x31, 0x05, 0x0b, 0x04, +0x2a, 0x05, 0x2a, 0x05, 0x0b, 0x04, 0x0c, 0x04, 0x31, 0x05, 0x2f, 0x05, 0x0b, 0x04, 0x0b, 0x04, 0x2f, 0x05, 0x0a, 0x04, 0x33, 0x05, 0x32, 0x05, 0x28, 0x04, 0x28, 0x04, 0x32, 0x05, 0x22, 0x04, 0x32, 0x05, 0x29, 0x05, 0x22, 0x04, 0x22, 0x04, 0x29, 0x05, 0x17, 0x04, 0x34, 0x05, 0x33, 0x05, 0x30, 0x04, 0x30, 0x04, 0x33, 0x05, 0x28, 0x04, 0x2d, 0x05, 0x35, 0x05, 0x35, 0x04, 0x35, 0x04, 0x35, 0x05, 0x41, 0x04, 0x27, 0x05, 0x3a, 0x05, 0x35, 0x05, 0x35, 0x05, 0x3a, 0x05, 0x41, 0x04, +0x30, 0x05, 0x36, 0x05, 0x1d, 0x04, 0x1d, 0x04, 0x36, 0x05, 0x20, 0x04, 0x36, 0x05, 0x2c, 0x05, 0x20, 0x04, 0x20, 0x04, 0x2c, 0x05, 0x27, 0x04, 0x24, 0x05, 0x37, 0x05, 0x26, 0x05, 0x26, 0x05, 0x37, 0x05, 0x39, 0x05, 0x1d, 0x04, 0x14, 0x04, 0x15, 0x04, 0x15, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x34, 0x05, 0x30, 0x04, 0x25, 0x05, 0x25, 0x05, 0x30, 0x04, 0x36, 0x04, 0x3b, 0x05, 0x3c, 0x05, 0x3d, 0x05, 0x3c, 0x05, 0x3e, 0x05, 0x3f, 0x05, 0x3f, 0x05, 0x3e, 0x05, 0x3d, 0x05, 0x40, 0x05, +0x41, 0x05, 0x42, 0x05, 0x42, 0x05, 0x41, 0x05, 0x43, 0x05, 0x41, 0x05, 0x40, 0x05, 0x44, 0x05, 0x44, 0x05, 0x40, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, 0x05, 0x40, 0x05, 0x40, 0x05, 0x47, 0x05, 0x45, 0x05, 0x48, 0x05, 0x49, 0x05, 0x4a, 0x05, 0x4a, 0x05, 0x49, 0x05, 0x46, 0x05, 0x46, 0x05, 0x40, 0x05, 0x4a, 0x05, 0x4a, 0x05, 0x40, 0x05, 0x42, 0x05, 0x4b, 0x05, 0x4c, 0x05, 0x4d, 0x05, 0x4d, 0x05, 0x4c, 0x05, 0x4e, 0x05, 0x4f, 0x05, 0x4e, 0x05, 0x50, 0x05, 0x50, 0x05, 0x4e, 0x05, +0x4c, 0x05, 0x51, 0x05, 0x52, 0x05, 0x53, 0x05, 0x53, 0x05, 0x52, 0x05, 0x54, 0x05, 0x55, 0x05, 0x54, 0x05, 0x56, 0x05, 0x56, 0x05, 0x54, 0x05, 0x57, 0x05, 0x4c, 0x05, 0x58, 0x05, 0x59, 0x05, 0x59, 0x05, 0x58, 0x05, 0x5a, 0x05, 0x58, 0x05, 0x5b, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5b, 0x05, 0x5d, 0x05, 0x5b, 0x05, 0x58, 0x05, 0x5e, 0x05, 0x5e, 0x05, 0x58, 0x05, 0x5f, 0x05, 0x58, 0x05, 0x4c, 0x05, 0x5f, 0x05, 0x5f, 0x05, 0x4c, 0x05, 0x4b, 0x05, 0x60, 0x05, 0x61, 0x05, 0x62, 0x05, +0x62, 0x05, 0x61, 0x05, 0x63, 0x05, 0x4d, 0x05, 0x63, 0x05, 0x4b, 0x05, 0x4b, 0x05, 0x63, 0x05, 0x61, 0x05, 0x64, 0x05, 0x65, 0x05, 0x66, 0x05, 0x66, 0x05, 0x65, 0x05, 0x67, 0x05, 0x65, 0x05, 0x68, 0x05, 0x67, 0x05, 0x67, 0x05, 0x68, 0x05, 0x69, 0x05, 0x68, 0x05, 0x65, 0x05, 0x6a, 0x05, 0x6a, 0x05, 0x65, 0x05, 0x6b, 0x05, 0x6b, 0x05, 0x65, 0x05, 0x64, 0x05, 0x6c, 0x05, 0x6d, 0x05, 0x53, 0x05, 0x53, 0x05, 0x6d, 0x05, 0x6e, 0x05, 0x6d, 0x05, 0x6c, 0x05, 0x6f, 0x05, 0x6f, 0x05, +0x6c, 0x05, 0x70, 0x05, 0x6c, 0x05, 0x71, 0x05, 0x70, 0x05, 0x70, 0x05, 0x71, 0x05, 0x72, 0x05, 0x71, 0x05, 0x73, 0x05, 0x72, 0x05, 0x72, 0x05, 0x73, 0x05, 0x74, 0x05, 0x73, 0x05, 0x71, 0x05, 0x55, 0x05, 0x55, 0x05, 0x71, 0x05, 0x54, 0x05, 0x71, 0x05, 0x6c, 0x05, 0x54, 0x05, 0x54, 0x05, 0x6c, 0x05, 0x53, 0x05, 0x75, 0x05, 0x76, 0x05, 0x77, 0x05, 0x77, 0x05, 0x76, 0x05, 0x78, 0x05, 0x78, 0x05, 0x76, 0x05, 0x60, 0x05, 0x60, 0x05, 0x76, 0x05, 0x61, 0x05, 0x76, 0x05, 0x5f, 0x05, +0x61, 0x05, 0x61, 0x05, 0x5f, 0x05, 0x4b, 0x05, 0x76, 0x05, 0x75, 0x05, 0x5f, 0x05, 0x5f, 0x05, 0x75, 0x05, 0x5e, 0x05, 0x69, 0x05, 0x68, 0x05, 0x79, 0x05, 0x79, 0x05, 0x68, 0x05, 0x7a, 0x05, 0x7a, 0x05, 0x68, 0x05, 0x7b, 0x05, 0x7c, 0x05, 0x7d, 0x05, 0x7e, 0x05, 0x7e, 0x05, 0x7d, 0x05, 0x7f, 0x05, 0x7d, 0x05, 0x7c, 0x05, 0x80, 0x05, 0x80, 0x05, 0x7c, 0x05, 0x81, 0x05, 0x82, 0x05, 0x83, 0x05, 0x84, 0x05, 0x84, 0x05, 0x83, 0x05, 0x85, 0x05, 0x85, 0x05, 0x83, 0x05, 0x86, 0x05, +0x86, 0x05, 0x83, 0x05, 0x87, 0x05, 0x83, 0x05, 0x7d, 0x05, 0x87, 0x05, 0x87, 0x05, 0x7d, 0x05, 0x80, 0x05, 0x83, 0x05, 0x82, 0x05, 0x7d, 0x05, 0x7d, 0x05, 0x82, 0x05, 0x7f, 0x05, 0x88, 0x05, 0x89, 0x05, 0x8a, 0x05, 0x8a, 0x05, 0x89, 0x05, 0x8b, 0x05, 0x89, 0x05, 0x8c, 0x05, 0x8b, 0x05, 0x8b, 0x05, 0x8c, 0x05, 0x8d, 0x05, 0x8e, 0x05, 0x8f, 0x05, 0x90, 0x05, 0x90, 0x05, 0x8f, 0x05, 0x91, 0x05, 0x8e, 0x05, 0x3c, 0x05, 0x8f, 0x05, 0x8f, 0x05, 0x3c, 0x05, 0x3b, 0x05, 0x92, 0x05, +0x93, 0x05, 0x90, 0x05, 0x90, 0x05, 0x93, 0x05, 0x8e, 0x05, 0x8e, 0x05, 0x94, 0x05, 0x3c, 0x05, 0x3c, 0x05, 0x94, 0x05, 0x3e, 0x05, 0x94, 0x05, 0x8e, 0x05, 0x95, 0x05, 0x95, 0x05, 0x8e, 0x05, 0x93, 0x05, 0x96, 0x05, 0x97, 0x05, 0x98, 0x05, 0x98, 0x05, 0x97, 0x05, 0x99, 0x05, 0x97, 0x05, 0x41, 0x05, 0x99, 0x05, 0x99, 0x05, 0x41, 0x05, 0x44, 0x05, 0x41, 0x05, 0x97, 0x05, 0x43, 0x05, 0x43, 0x05, 0x97, 0x05, 0x9a, 0x05, 0x97, 0x05, 0x96, 0x05, 0x9a, 0x05, 0x9a, 0x05, 0x96, 0x05, +0x9b, 0x05, 0x62, 0x05, 0x9c, 0x05, 0x60, 0x05, 0x60, 0x05, 0x9c, 0x05, 0x9d, 0x05, 0x9e, 0x05, 0x9d, 0x05, 0x9f, 0x05, 0x9f, 0x05, 0x9d, 0x05, 0x9c, 0x05, 0xa0, 0x05, 0xa1, 0x05, 0xa2, 0x05, 0xa2, 0x05, 0xa1, 0x05, 0xa3, 0x05, 0xa1, 0x05, 0xa4, 0x05, 0xa3, 0x05, 0xa3, 0x05, 0xa4, 0x05, 0xa5, 0x05, 0xa4, 0x05, 0xa1, 0x05, 0x91, 0x05, 0x91, 0x05, 0xa1, 0x05, 0x90, 0x05, 0xa6, 0x05, 0xa0, 0x05, 0xa7, 0x05, 0xa7, 0x05, 0xa0, 0x05, 0xa2, 0x05, 0x93, 0x05, 0x92, 0x05, 0xa8, 0x05, +0xa9, 0x05, 0xa8, 0x05, 0x92, 0x05, 0xa9, 0x05, 0xa6, 0x05, 0x79, 0x05, 0x79, 0x05, 0xa6, 0x05, 0xaa, 0x05, 0xa6, 0x05, 0xa7, 0x05, 0xaa, 0x05, 0xaa, 0x05, 0xa7, 0x05, 0xab, 0x05, 0xac, 0x05, 0xa4, 0x05, 0xad, 0x05, 0xad, 0x05, 0xa4, 0x05, 0x91, 0x05, 0xa4, 0x05, 0xac, 0x05, 0xa5, 0x05, 0xa5, 0x05, 0xac, 0x05, 0xae, 0x05, 0xac, 0x05, 0xaf, 0x05, 0xae, 0x05, 0xae, 0x05, 0xaf, 0x05, 0xb0, 0x05, 0xaf, 0x05, 0xac, 0x05, 0xb1, 0x05, 0xb1, 0x05, 0xac, 0x05, 0xad, 0x05, 0xb2, 0x05, +0xb3, 0x05, 0xb4, 0x05, 0xb4, 0x05, 0xb3, 0x05, 0xb5, 0x05, 0xb6, 0x05, 0xb5, 0x05, 0xb7, 0x05, 0xb7, 0x05, 0xb5, 0x05, 0xb3, 0x05, 0xb8, 0x05, 0xb9, 0x05, 0xba, 0x05, 0xba, 0x05, 0xb9, 0x05, 0xbb, 0x05, 0xb9, 0x05, 0xbc, 0x05, 0xbb, 0x05, 0xbb, 0x05, 0xbc, 0x05, 0xbd, 0x05, 0xbc, 0x05, 0xb9, 0x05, 0xbe, 0x05, 0xbe, 0x05, 0xb9, 0x05, 0xbf, 0x05, 0xb9, 0x05, 0xb8, 0x05, 0xbf, 0x05, 0xbf, 0x05, 0xb8, 0x05, 0xc0, 0x05, 0xc1, 0x05, 0xc2, 0x05, 0xc3, 0x05, 0xc3, 0x05, 0xc2, 0x05, +0xc4, 0x05, 0xc2, 0x05, 0xc5, 0x05, 0xc4, 0x05, 0xc4, 0x05, 0xc5, 0x05, 0x8d, 0x05, 0xc2, 0x05, 0xb8, 0x05, 0xc5, 0x05, 0xc5, 0x05, 0xb8, 0x05, 0xba, 0x05, 0xb8, 0x05, 0xc2, 0x05, 0xc0, 0x05, 0xc0, 0x05, 0xc2, 0x05, 0xc1, 0x05, 0xc6, 0x05, 0xc7, 0x05, 0xc8, 0x05, 0xc8, 0x05, 0xc7, 0x05, 0xc9, 0x05, 0xc7, 0x05, 0xca, 0x05, 0xc9, 0x05, 0xc9, 0x05, 0xca, 0x05, 0xcb, 0x05, 0xca, 0x05, 0xc7, 0x05, 0xb6, 0x05, 0xb6, 0x05, 0xc7, 0x05, 0xb5, 0x05, 0xc7, 0x05, 0xc6, 0x05, 0xb5, 0x05, +0xb5, 0x05, 0xc6, 0x05, 0xb4, 0x05, 0xcc, 0x05, 0xbc, 0x05, 0xcd, 0x05, 0xcd, 0x05, 0xbc, 0x05, 0xbe, 0x05, 0xbc, 0x05, 0xcc, 0x05, 0xbd, 0x05, 0xbd, 0x05, 0xcc, 0x05, 0xce, 0x05, 0xcc, 0x05, 0xcf, 0x05, 0xce, 0x05, 0xce, 0x05, 0xcf, 0x05, 0xd0, 0x05, 0xcf, 0x05, 0xcc, 0x05, 0xd1, 0x05, 0xd1, 0x05, 0xcc, 0x05, 0xcd, 0x05, 0xb7, 0x05, 0xd2, 0x05, 0xb6, 0x05, 0xb6, 0x05, 0xd2, 0x05, 0xca, 0x05, 0xd3, 0x05, 0xcb, 0x05, 0xd2, 0x05, 0xd2, 0x05, 0xcb, 0x05, 0xca, 0x05, 0xd4, 0x05, +0xd5, 0x05, 0xd6, 0x05, 0xd6, 0x05, 0xd5, 0x05, 0xd7, 0x05, 0xd5, 0x05, 0xd4, 0x05, 0xd0, 0x05, 0xd0, 0x05, 0xd4, 0x05, 0xce, 0x05, 0xce, 0x05, 0xd4, 0x05, 0xbd, 0x05, 0xbd, 0x05, 0xd4, 0x05, 0xbb, 0x05, 0xd4, 0x05, 0xd6, 0x05, 0xbb, 0x05, 0xbb, 0x05, 0xd6, 0x05, 0xba, 0x05, 0xd8, 0x05, 0xd9, 0x05, 0x70, 0x05, 0x70, 0x05, 0xd9, 0x05, 0x6f, 0x05, 0xd9, 0x05, 0xd8, 0x05, 0xda, 0x05, 0xda, 0x05, 0xd8, 0x05, 0xdb, 0x05, 0xdc, 0x05, 0xdd, 0x05, 0xde, 0x05, 0xde, 0x05, 0xdd, 0x05, +0xdf, 0x05, 0x93, 0x05, 0xe0, 0x05, 0x95, 0x05, 0x95, 0x05, 0xe0, 0x05, 0xe1, 0x05, 0xe2, 0x05, 0xe3, 0x05, 0xe4, 0x05, 0xe4, 0x05, 0xe3, 0x05, 0xe1, 0x05, 0xd8, 0x05, 0xe5, 0x05, 0xdb, 0x05, 0xdb, 0x05, 0xe5, 0x05, 0xe6, 0x05, 0xe5, 0x05, 0xe7, 0x05, 0xe6, 0x05, 0xe6, 0x05, 0xe7, 0x05, 0xe8, 0x05, 0xe7, 0x05, 0xe5, 0x05, 0x74, 0x05, 0x74, 0x05, 0xe5, 0x05, 0x72, 0x05, 0xe5, 0x05, 0xd8, 0x05, 0x72, 0x05, 0x72, 0x05, 0xd8, 0x05, 0x70, 0x05, 0xe9, 0x05, 0x96, 0x05, 0xe3, 0x05, +0xe3, 0x05, 0x96, 0x05, 0x98, 0x05, 0x96, 0x05, 0xe9, 0x05, 0x9b, 0x05, 0x9b, 0x05, 0xe9, 0x05, 0xea, 0x05, 0xe9, 0x05, 0xeb, 0x05, 0xea, 0x05, 0xea, 0x05, 0xeb, 0x05, 0xec, 0x05, 0xeb, 0x05, 0xe9, 0x05, 0xe2, 0x05, 0xe2, 0x05, 0xe9, 0x05, 0xe3, 0x05, 0xed, 0x05, 0xee, 0x05, 0xdb, 0x05, 0xdb, 0x05, 0xee, 0x05, 0xda, 0x05, 0xdd, 0x05, 0xef, 0x05, 0xdf, 0x05, 0xdf, 0x05, 0xef, 0x05, 0xf0, 0x05, 0xf1, 0x05, 0xe2, 0x05, 0xf2, 0x05, 0xf2, 0x05, 0xe2, 0x05, 0xe4, 0x05, 0xf3, 0x05, +0xf4, 0x05, 0xe8, 0x05, 0xe8, 0x05, 0xf4, 0x05, 0xe6, 0x05, 0xf4, 0x05, 0xed, 0x05, 0xe6, 0x05, 0xe6, 0x05, 0xed, 0x05, 0xdb, 0x05, 0xeb, 0x05, 0xf5, 0x05, 0xec, 0x05, 0xec, 0x05, 0xf5, 0x05, 0xf6, 0x05, 0xf5, 0x05, 0xeb, 0x05, 0xf1, 0x05, 0xf1, 0x05, 0xeb, 0x05, 0xe2, 0x05, 0xef, 0x05, 0x7c, 0x05, 0xf0, 0x05, 0xf0, 0x05, 0x7c, 0x05, 0x7e, 0x05, 0x86, 0x05, 0x87, 0x05, 0xf3, 0x05, 0xf3, 0x05, 0x87, 0x05, 0xf4, 0x05, 0x87, 0x05, 0x80, 0x05, 0xf4, 0x05, 0xf4, 0x05, 0x80, 0x05, +0xed, 0x05, 0xf7, 0x05, 0xf8, 0x05, 0xf9, 0x05, 0xf9, 0x05, 0xf8, 0x05, 0xfa, 0x05, 0xf8, 0x05, 0xf7, 0x05, 0x9e, 0x05, 0x9e, 0x05, 0xf7, 0x05, 0x9d, 0x05, 0xf7, 0x05, 0x78, 0x05, 0x9d, 0x05, 0x9d, 0x05, 0x78, 0x05, 0x60, 0x05, 0x78, 0x05, 0xf7, 0x05, 0x77, 0x05, 0x77, 0x05, 0xf7, 0x05, 0xf9, 0x05, 0xfb, 0x05, 0xfc, 0x05, 0xb0, 0x05, 0xb0, 0x05, 0xfc, 0x05, 0xae, 0x05, 0xfc, 0x05, 0xfd, 0x05, 0xae, 0x05, 0xae, 0x05, 0xfd, 0x05, 0xa5, 0x05, 0xfd, 0x05, 0xfc, 0x05, 0xbe, 0x05, +0xbe, 0x05, 0xfc, 0x05, 0xcd, 0x05, 0xfc, 0x05, 0xfb, 0x05, 0xcd, 0x05, 0xcd, 0x05, 0xfb, 0x05, 0xd1, 0x05, 0xfe, 0x05, 0xff, 0x05, 0xc3, 0x05, 0xc3, 0x05, 0xff, 0x05, 0x00, 0x06, 0xff, 0x05, 0x01, 0x06, 0x00, 0x06, 0x00, 0x06, 0x01, 0x06, 0xab, 0x05, 0x9f, 0x05, 0x02, 0x06, 0x9e, 0x05, 0x9e, 0x05, 0x02, 0x06, 0x03, 0x06, 0xb4, 0x05, 0x03, 0x06, 0xb2, 0x05, 0xb2, 0x05, 0x03, 0x06, 0x02, 0x06, 0x04, 0x06, 0x05, 0x06, 0xc0, 0x05, 0xc0, 0x05, 0x05, 0x06, 0xbf, 0x05, 0x05, 0x06, +0xfd, 0x05, 0xbf, 0x05, 0xbf, 0x05, 0xfd, 0x05, 0xbe, 0x05, 0xfd, 0x05, 0x05, 0x06, 0xa5, 0x05, 0xa5, 0x05, 0x05, 0x06, 0xa3, 0x05, 0x05, 0x06, 0x04, 0x06, 0xa3, 0x05, 0xa3, 0x05, 0x04, 0x06, 0xa2, 0x05, 0xd3, 0x05, 0xd2, 0x05, 0x88, 0x05, 0x88, 0x05, 0xd2, 0x05, 0x89, 0x05, 0xd2, 0x05, 0xb7, 0x05, 0x89, 0x05, 0x89, 0x05, 0xb7, 0x05, 0x8c, 0x05, 0xb7, 0x05, 0xb3, 0x05, 0x8c, 0x05, 0x8c, 0x05, 0xb3, 0x05, 0x06, 0x06, 0xb3, 0x05, 0xb2, 0x05, 0x06, 0x06, 0x06, 0x06, 0xb2, 0x05, +0xfe, 0x05, 0x9f, 0x05, 0x9c, 0x05, 0x01, 0x06, 0x01, 0x06, 0x9c, 0x05, 0x07, 0x06, 0x9c, 0x05, 0x62, 0x05, 0x07, 0x06, 0x07, 0x06, 0x62, 0x05, 0x69, 0x05, 0x62, 0x05, 0x63, 0x05, 0x69, 0x05, 0x69, 0x05, 0x63, 0x05, 0x67, 0x05, 0x63, 0x05, 0x4d, 0x05, 0x67, 0x05, 0x67, 0x05, 0x4d, 0x05, 0x66, 0x05, 0x08, 0x06, 0x64, 0x05, 0x09, 0x06, 0x09, 0x06, 0x64, 0x05, 0x66, 0x05, 0x0a, 0x06, 0x6a, 0x05, 0x6b, 0x05, 0xdc, 0x05, 0xd9, 0x05, 0xdd, 0x05, 0xdd, 0x05, 0xd9, 0x05, 0xda, 0x05, +0xee, 0x05, 0xef, 0x05, 0xda, 0x05, 0xda, 0x05, 0xef, 0x05, 0xdd, 0x05, 0x81, 0x05, 0x7c, 0x05, 0xee, 0x05, 0xee, 0x05, 0x7c, 0x05, 0xef, 0x05, 0x0b, 0x06, 0x5b, 0x05, 0x0c, 0x06, 0x0c, 0x06, 0x5b, 0x05, 0x0d, 0x06, 0x0d, 0x06, 0x5b, 0x05, 0x0e, 0x06, 0x0e, 0x06, 0x5b, 0x05, 0x5e, 0x05, 0x75, 0x05, 0x0f, 0x06, 0x5e, 0x05, 0x5e, 0x05, 0x0f, 0x06, 0x0e, 0x06, 0x0f, 0x06, 0x75, 0x05, 0x10, 0x06, 0x10, 0x06, 0x75, 0x05, 0x77, 0x05, 0xf9, 0x05, 0x11, 0x06, 0x77, 0x05, 0x77, 0x05, +0x11, 0x06, 0x10, 0x06, 0xf9, 0x05, 0xfa, 0x05, 0x11, 0x06, 0x11, 0x06, 0xfa, 0x05, 0x12, 0x06, 0xfa, 0x05, 0x13, 0x06, 0x12, 0x06, 0x12, 0x06, 0x13, 0x06, 0x14, 0x06, 0x13, 0x06, 0xc8, 0x05, 0x14, 0x06, 0x14, 0x06, 0xc8, 0x05, 0x15, 0x06, 0xc8, 0x05, 0xc9, 0x05, 0x15, 0x06, 0x15, 0x06, 0xc9, 0x05, 0x16, 0x06, 0xc9, 0x05, 0xcb, 0x05, 0x16, 0x06, 0x16, 0x06, 0xcb, 0x05, 0x17, 0x06, 0xcb, 0x05, 0xd3, 0x05, 0x17, 0x06, 0x17, 0x06, 0xd3, 0x05, 0x18, 0x06, 0xd3, 0x05, 0x88, 0x05, +0x18, 0x06, 0x18, 0x06, 0x88, 0x05, 0x19, 0x06, 0x1a, 0x06, 0x1b, 0x06, 0x8a, 0x05, 0x8a, 0x05, 0x1b, 0x06, 0x1c, 0x06, 0x1b, 0x06, 0x1a, 0x06, 0x1d, 0x06, 0x1d, 0x06, 0x1a, 0x06, 0xd7, 0x05, 0x1e, 0x06, 0xd5, 0x05, 0x1f, 0x06, 0x1f, 0x06, 0xd5, 0x05, 0xd0, 0x05, 0xd5, 0x05, 0x1e, 0x06, 0xd7, 0x05, 0xd7, 0x05, 0x1e, 0x06, 0x1d, 0x06, 0xcf, 0x05, 0x20, 0x06, 0xd0, 0x05, 0xd0, 0x05, 0x20, 0x06, 0x1f, 0x06, 0x20, 0x06, 0xcf, 0x05, 0x21, 0x06, 0x21, 0x06, 0xcf, 0x05, 0xd1, 0x05, +0x22, 0x06, 0xfb, 0x05, 0x23, 0x06, 0x23, 0x06, 0xfb, 0x05, 0xb0, 0x05, 0xfb, 0x05, 0x22, 0x06, 0xd1, 0x05, 0xd1, 0x05, 0x22, 0x06, 0x21, 0x06, 0xaf, 0x05, 0x24, 0x06, 0xb0, 0x05, 0xb0, 0x05, 0x24, 0x06, 0x23, 0x06, 0x24, 0x06, 0xaf, 0x05, 0x25, 0x06, 0x25, 0x06, 0xaf, 0x05, 0xb1, 0x05, 0x49, 0x05, 0x48, 0x05, 0xb1, 0x05, 0xb1, 0x05, 0x48, 0x05, 0x25, 0x06, 0x82, 0x05, 0x26, 0x06, 0x7f, 0x05, 0x7f, 0x05, 0x26, 0x06, 0x27, 0x06, 0x26, 0x06, 0xf5, 0x05, 0x27, 0x06, 0x27, 0x06, +0xf5, 0x05, 0xf1, 0x05, 0xf5, 0x05, 0x26, 0x06, 0xf6, 0x05, 0xf6, 0x05, 0x26, 0x06, 0x28, 0x06, 0x26, 0x06, 0x82, 0x05, 0x28, 0x06, 0x28, 0x06, 0x82, 0x05, 0x84, 0x05, 0x19, 0x06, 0x88, 0x05, 0x1c, 0x06, 0x1c, 0x06, 0x88, 0x05, 0x8a, 0x05, 0x29, 0x06, 0xa8, 0x05, 0xde, 0x05, 0xde, 0x05, 0xa8, 0x05, 0x2a, 0x06, 0xa8, 0x05, 0x29, 0x06, 0x93, 0x05, 0x93, 0x05, 0x29, 0x06, 0xe0, 0x05, 0x29, 0x06, 0x2b, 0x06, 0xe0, 0x05, 0xe0, 0x05, 0x2b, 0x06, 0x2c, 0x06, 0x2b, 0x06, 0x29, 0x06, +0xdf, 0x05, 0xdf, 0x05, 0x29, 0x06, 0xde, 0x05, 0x01, 0x06, 0x07, 0x06, 0xab, 0x05, 0xab, 0x05, 0x07, 0x06, 0xaa, 0x05, 0xaa, 0x05, 0x07, 0x06, 0x79, 0x05, 0x79, 0x05, 0x07, 0x06, 0x69, 0x05, 0x2d, 0x06, 0x2b, 0x06, 0xf0, 0x05, 0xf0, 0x05, 0x2b, 0x06, 0xdf, 0x05, 0x2b, 0x06, 0x2d, 0x06, 0x2c, 0x06, 0x2c, 0x06, 0x2d, 0x06, 0x2e, 0x06, 0x04, 0x06, 0x2f, 0x06, 0xa2, 0x05, 0xa2, 0x05, 0x2f, 0x06, 0xa7, 0x05, 0xa7, 0x05, 0x2f, 0x06, 0xab, 0x05, 0xab, 0x05, 0x2f, 0x06, 0x00, 0x06, +0x2f, 0x06, 0xc1, 0x05, 0x00, 0x06, 0x00, 0x06, 0xc1, 0x05, 0xc3, 0x05, 0x2f, 0x06, 0x04, 0x06, 0xc1, 0x05, 0xc1, 0x05, 0x04, 0x06, 0xc0, 0x05, 0x30, 0x06, 0x2d, 0x06, 0x7e, 0x05, 0x7e, 0x05, 0x2d, 0x06, 0xf0, 0x05, 0x2d, 0x06, 0x30, 0x06, 0x2e, 0x06, 0x2e, 0x06, 0x30, 0x06, 0xf2, 0x05, 0x8c, 0x05, 0x06, 0x06, 0x8d, 0x05, 0x8d, 0x05, 0x06, 0x06, 0xc4, 0x05, 0x06, 0x06, 0xfe, 0x05, 0xc4, 0x05, 0xc4, 0x05, 0xfe, 0x05, 0xc3, 0x05, 0x27, 0x06, 0x30, 0x06, 0x7f, 0x05, 0x7f, 0x05, +0x30, 0x06, 0x7e, 0x05, 0x1a, 0x06, 0x31, 0x06, 0xd7, 0x05, 0xd7, 0x05, 0x31, 0x06, 0xd6, 0x05, 0x31, 0x06, 0xc5, 0x05, 0xd6, 0x05, 0xd6, 0x05, 0xc5, 0x05, 0xba, 0x05, 0xc5, 0x05, 0x31, 0x06, 0x8d, 0x05, 0x8d, 0x05, 0x31, 0x06, 0x8b, 0x05, 0x31, 0x06, 0x1a, 0x06, 0x8b, 0x05, 0x8b, 0x05, 0x1a, 0x06, 0x8a, 0x05, 0x80, 0x05, 0x81, 0x05, 0xed, 0x05, 0xed, 0x05, 0x81, 0x05, 0xee, 0x05, 0x4d, 0x05, 0x4e, 0x05, 0x66, 0x05, 0x66, 0x05, 0x4e, 0x05, 0x32, 0x06, 0x79, 0x05, 0x7a, 0x05, +0xa9, 0x05, 0x7a, 0x05, 0x2a, 0x06, 0xa9, 0x05, 0xa8, 0x05, 0xa9, 0x05, 0x2a, 0x06, 0x33, 0x06, 0x49, 0x05, 0xad, 0x05, 0xad, 0x05, 0x49, 0x05, 0xb1, 0x05, 0x49, 0x05, 0x33, 0x06, 0x46, 0x05, 0x46, 0x05, 0x33, 0x06, 0x47, 0x05, 0x8f, 0x05, 0x33, 0x06, 0x91, 0x05, 0x91, 0x05, 0x33, 0x06, 0xad, 0x05, 0xf8, 0x05, 0x34, 0x06, 0xfa, 0x05, 0xfa, 0x05, 0x34, 0x06, 0x13, 0x06, 0x34, 0x06, 0xc6, 0x05, 0x13, 0x06, 0x13, 0x06, 0xc6, 0x05, 0xc8, 0x05, 0xc6, 0x05, 0x34, 0x06, 0xb4, 0x05, +0xb4, 0x05, 0x34, 0x06, 0x03, 0x06, 0x34, 0x06, 0xf8, 0x05, 0x03, 0x06, 0x03, 0x06, 0xf8, 0x05, 0x9e, 0x05, 0xb2, 0x05, 0x02, 0x06, 0xfe, 0x05, 0xfe, 0x05, 0x02, 0x06, 0xff, 0x05, 0x02, 0x06, 0x9f, 0x05, 0xff, 0x05, 0xff, 0x05, 0x9f, 0x05, 0x01, 0x06, 0x92, 0x05, 0xa0, 0x05, 0xa9, 0x05, 0xa9, 0x05, 0xa0, 0x05, 0xa6, 0x05, 0xa1, 0x05, 0xa0, 0x05, 0x90, 0x05, 0x90, 0x05, 0xa0, 0x05, 0x92, 0x05, 0x2c, 0x06, 0x2e, 0x06, 0xe4, 0x05, 0xe4, 0x05, 0x2e, 0x06, 0xf2, 0x05, 0xe0, 0x05, +0x2c, 0x06, 0xe1, 0x05, 0xe1, 0x05, 0x2c, 0x06, 0xe4, 0x05, 0xf2, 0x05, 0x30, 0x06, 0xf1, 0x05, 0xf1, 0x05, 0x30, 0x06, 0x27, 0x06, 0xe3, 0x05, 0x98, 0x05, 0xe1, 0x05, 0xe1, 0x05, 0x98, 0x05, 0x95, 0x05, 0x99, 0x05, 0x94, 0x05, 0x98, 0x05, 0x98, 0x05, 0x94, 0x05, 0x95, 0x05, 0x94, 0x05, 0x99, 0x05, 0x3e, 0x05, 0x3e, 0x05, 0x99, 0x05, 0x44, 0x05, 0x44, 0x05, 0x45, 0x05, 0x3e, 0x05, 0x3e, 0x05, 0x45, 0x05, 0x3d, 0x05, 0x47, 0x05, 0x3b, 0x05, 0x45, 0x05, 0x45, 0x05, 0x3b, 0x05, +0x3d, 0x05, 0x33, 0x06, 0x8f, 0x05, 0x47, 0x05, 0x47, 0x05, 0x8f, 0x05, 0x3b, 0x05, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x37, 0x06, 0x36, 0x06, 0x38, 0x06, 0x39, 0x06, 0x36, 0x06, 0x39, 0x05, 0x39, 0x05, 0x36, 0x06, 0x45, 0x04, 0x39, 0x05, 0x45, 0x04, 0x3a, 0x05, 0x3a, 0x05, 0x45, 0x04, 0x43, 0x04, 0x40, 0x04, 0x41, 0x04, 0x43, 0x04, 0x43, 0x04, 0x41, 0x04, 0x3a, 0x05, 0x3f, 0x04, 0x40, 0x04, 0x42, 0x04, 0x42, 0x04, 0x40, 0x04, 0x43, 0x04, 0x3a, 0x06, 0x3b, 0x06, 0x3c, 0x06, +0x3c, 0x06, 0x3b, 0x06, 0x3d, 0x06, 0x3e, 0x06, 0x3b, 0x06, 0x36, 0x04, 0x36, 0x04, 0x3b, 0x06, 0x38, 0x05, 0x3f, 0x06, 0x40, 0x06, 0x41, 0x06, 0x41, 0x06, 0x40, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x45, 0x06, 0x44, 0x06, 0x3b, 0x04, 0x3a, 0x06, 0x39, 0x06, 0x37, 0x05, 0x37, 0x05, 0x39, 0x06, 0x39, 0x05, 0x3f, 0x06, 0x3e, 0x06, 0x37, 0x04, 0x37, 0x04, 0x3e, 0x06, 0x36, 0x04, 0x46, 0x06, 0x47, 0x06, 0x64, 0x05, 0x64, 0x05, 0x47, 0x06, 0x6b, 0x05, 0x53, 0x05, +0x6e, 0x05, 0x48, 0x06, 0x48, 0x06, 0x6e, 0x05, 0x49, 0x06, 0x4a, 0x06, 0x40, 0x06, 0x39, 0x04, 0x39, 0x04, 0x40, 0x06, 0x38, 0x04, 0x6e, 0x05, 0x6b, 0x05, 0x4b, 0x06, 0x4b, 0x06, 0x6b, 0x05, 0x4c, 0x06, 0x36, 0x06, 0x35, 0x06, 0x45, 0x04, 0x45, 0x04, 0x35, 0x06, 0x44, 0x04, 0x44, 0x06, 0x43, 0x06, 0x4d, 0x06, 0x4d, 0x06, 0x43, 0x06, 0x4e, 0x06, 0x4f, 0x06, 0x36, 0x06, 0x50, 0x06, 0x50, 0x06, 0x36, 0x06, 0x39, 0x06, 0x51, 0x06, 0x39, 0x06, 0x52, 0x06, 0x52, 0x06, 0x39, 0x06, +0x3a, 0x06, 0x38, 0x05, 0x3b, 0x06, 0x37, 0x05, 0x37, 0x05, 0x3b, 0x06, 0x3a, 0x06, 0x3b, 0x06, 0x3e, 0x06, 0x53, 0x06, 0x53, 0x06, 0x3e, 0x06, 0x54, 0x06, 0x3e, 0x06, 0x3f, 0x06, 0x55, 0x06, 0x55, 0x06, 0x3f, 0x06, 0x56, 0x06, 0x40, 0x06, 0x3f, 0x06, 0x38, 0x04, 0x38, 0x04, 0x3f, 0x06, 0x37, 0x04, 0x40, 0x06, 0x4a, 0x06, 0x57, 0x06, 0x57, 0x06, 0x4a, 0x06, 0x58, 0x06, 0x4a, 0x06, 0x44, 0x06, 0x59, 0x06, 0x59, 0x06, 0x44, 0x06, 0x5a, 0x06, 0x5b, 0x06, 0xdc, 0x05, 0x2a, 0x06, +0x2a, 0x06, 0xdc, 0x05, 0xde, 0x05, 0xd9, 0x05, 0xdc, 0x05, 0x6f, 0x05, 0x6f, 0x05, 0xdc, 0x05, 0x5b, 0x06, 0x6d, 0x05, 0x6f, 0x05, 0x5c, 0x06, 0x5c, 0x06, 0x6f, 0x05, 0x5b, 0x06, 0x5b, 0x06, 0x2a, 0x06, 0x7b, 0x05, 0x7b, 0x05, 0x2a, 0x06, 0x7a, 0x05, 0x5c, 0x06, 0x5b, 0x06, 0x0a, 0x06, 0x0a, 0x06, 0x5b, 0x06, 0x7b, 0x05, 0x5c, 0x06, 0x0a, 0x06, 0x6e, 0x05, 0x6e, 0x05, 0x0a, 0x06, 0x6b, 0x05, 0x6e, 0x05, 0x6d, 0x05, 0x5c, 0x06, 0x0a, 0x06, 0x7b, 0x05, 0x6a, 0x05, 0x6a, 0x05, +0x7b, 0x05, 0x68, 0x05, 0x39, 0x04, 0x3b, 0x04, 0x4a, 0x06, 0x4a, 0x06, 0x3b, 0x04, 0x44, 0x06, 0x81, 0x03, 0x92, 0x03, 0x7f, 0x03, 0x7f, 0x03, 0x92, 0x03, 0x91, 0x03, 0x92, 0x03, 0xa0, 0x03, 0x91, 0x03, 0x91, 0x03, 0xa0, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xae, 0x03, 0x9f, 0x03, 0x9f, 0x03, 0xae, 0x03, 0xad, 0x03, 0xae, 0x03, 0xbc, 0x03, 0xad, 0x03, 0xad, 0x03, 0xbc, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xc9, 0x03, 0xc9, 0x03, 0xbc, 0x03, 0x87, 0x01, 0x87, 0x01, 0x8a, 0x01, +0xc9, 0x03, 0xc9, 0x03, 0x8a, 0x01, 0xd5, 0x03, 0x2b, 0x04, 0x3e, 0x04, 0x32, 0x04, 0x32, 0x04, 0x3e, 0x04, 0x3a, 0x04, 0x6b, 0x03, 0x5d, 0x06, 0x6a, 0x03, 0x6a, 0x03, 0x5d, 0x06, 0x5e, 0x06, 0x5d, 0x06, 0x5f, 0x06, 0x5e, 0x06, 0x5e, 0x06, 0x5f, 0x06, 0x60, 0x06, 0x5f, 0x06, 0x61, 0x06, 0x60, 0x06, 0x60, 0x06, 0x61, 0x06, 0x62, 0x06, 0x61, 0x06, 0x63, 0x06, 0x62, 0x06, 0x62, 0x06, 0x63, 0x06, 0x64, 0x06, 0x63, 0x06, 0x65, 0x06, 0x64, 0x06, 0x64, 0x06, 0x65, 0x06, 0x66, 0x06, +0x65, 0x06, 0x67, 0x06, 0x66, 0x06, 0x66, 0x06, 0x67, 0x06, 0x68, 0x06, 0x67, 0x06, 0x69, 0x06, 0x68, 0x06, 0x68, 0x06, 0x69, 0x06, 0x6a, 0x06, 0x69, 0x06, 0x6b, 0x06, 0x6a, 0x06, 0x6a, 0x06, 0x6b, 0x06, 0x6c, 0x06, 0x6c, 0x06, 0x6b, 0x06, 0x6d, 0x06, 0x6d, 0x06, 0x6b, 0x06, 0x6e, 0x06, 0x6d, 0x06, 0x6e, 0x06, 0x6f, 0x06, 0x6f, 0x06, 0x6e, 0x06, 0x70, 0x06, 0x70, 0x06, 0x71, 0x06, 0x6f, 0x06, 0x6f, 0x06, 0x71, 0x06, 0x72, 0x06, 0x71, 0x06, 0x73, 0x06, 0x72, 0x06, 0x72, 0x06, +0x73, 0x06, 0x74, 0x06, 0x73, 0x06, 0x75, 0x06, 0x74, 0x06, 0x74, 0x06, 0x75, 0x06, 0x76, 0x06, 0x87, 0x03, 0x77, 0x06, 0x6b, 0x03, 0x6b, 0x03, 0x77, 0x06, 0x5d, 0x06, 0x77, 0x06, 0x78, 0x06, 0x5d, 0x06, 0x5d, 0x06, 0x78, 0x06, 0x5f, 0x06, 0x78, 0x06, 0x79, 0x06, 0x5f, 0x06, 0x5f, 0x06, 0x79, 0x06, 0x61, 0x06, 0x79, 0x06, 0x7a, 0x06, 0x61, 0x06, 0x61, 0x06, 0x7a, 0x06, 0x63, 0x06, 0x7a, 0x06, 0x7b, 0x06, 0x63, 0x06, 0x63, 0x06, 0x7b, 0x06, 0x65, 0x06, 0x7b, 0x06, 0x7c, 0x06, +0x65, 0x06, 0x65, 0x06, 0x7c, 0x06, 0x67, 0x06, 0x7c, 0x06, 0x7d, 0x06, 0x67, 0x06, 0x67, 0x06, 0x7d, 0x06, 0x69, 0x06, 0x7d, 0x06, 0x7e, 0x06, 0x69, 0x06, 0x69, 0x06, 0x7e, 0x06, 0x6b, 0x06, 0x6b, 0x06, 0x7e, 0x06, 0x6e, 0x06, 0x6e, 0x06, 0x7e, 0x06, 0x7f, 0x06, 0x6e, 0x06, 0x7f, 0x06, 0x70, 0x06, 0x70, 0x06, 0x7f, 0x06, 0x80, 0x06, 0x80, 0x06, 0x81, 0x06, 0x70, 0x06, 0x70, 0x06, 0x81, 0x06, 0x71, 0x06, 0x82, 0x06, 0x83, 0x06, 0x73, 0x06, 0x73, 0x06, 0x83, 0x06, 0x75, 0x06, +0x95, 0x03, 0x84, 0x06, 0x87, 0x03, 0x87, 0x03, 0x84, 0x06, 0x77, 0x06, 0x84, 0x06, 0x85, 0x06, 0x77, 0x06, 0x77, 0x06, 0x85, 0x06, 0x78, 0x06, 0x85, 0x06, 0x86, 0x06, 0x78, 0x06, 0x78, 0x06, 0x86, 0x06, 0x79, 0x06, 0x86, 0x06, 0x87, 0x06, 0x79, 0x06, 0x79, 0x06, 0x87, 0x06, 0x7a, 0x06, 0x87, 0x06, 0x88, 0x06, 0x7a, 0x06, 0x7a, 0x06, 0x88, 0x06, 0x7b, 0x06, 0x88, 0x06, 0x89, 0x06, 0x7b, 0x06, 0x7b, 0x06, 0x89, 0x06, 0x7c, 0x06, 0x89, 0x06, 0x8a, 0x06, 0x7c, 0x06, 0x7c, 0x06, +0x8a, 0x06, 0x7d, 0x06, 0x8a, 0x06, 0x8b, 0x06, 0x7d, 0x06, 0x7d, 0x06, 0x8b, 0x06, 0x7e, 0x06, 0x7e, 0x06, 0x8b, 0x06, 0x7f, 0x06, 0x7f, 0x06, 0x8b, 0x06, 0x8c, 0x06, 0x7f, 0x06, 0x8c, 0x06, 0x80, 0x06, 0x80, 0x06, 0x8c, 0x06, 0x8d, 0x06, 0x80, 0x06, 0x8d, 0x06, 0x81, 0x06, 0x81, 0x06, 0x8d, 0x06, 0x8e, 0x06, 0x8f, 0x06, 0x90, 0x06, 0x82, 0x06, 0x82, 0x06, 0x90, 0x06, 0x83, 0x06, 0x95, 0x03, 0xa2, 0x03, 0x84, 0x06, 0x84, 0x06, 0xa2, 0x03, 0x91, 0x06, 0x91, 0x06, 0x92, 0x06, +0x84, 0x06, 0x84, 0x06, 0x92, 0x06, 0x85, 0x06, 0x92, 0x06, 0x93, 0x06, 0x85, 0x06, 0x85, 0x06, 0x93, 0x06, 0x86, 0x06, 0x93, 0x06, 0x94, 0x06, 0x86, 0x06, 0x86, 0x06, 0x94, 0x06, 0x87, 0x06, 0x94, 0x06, 0x95, 0x06, 0x87, 0x06, 0x87, 0x06, 0x95, 0x06, 0x88, 0x06, 0x95, 0x06, 0x96, 0x06, 0x88, 0x06, 0x88, 0x06, 0x96, 0x06, 0x89, 0x06, 0x96, 0x06, 0x97, 0x06, 0x89, 0x06, 0x89, 0x06, 0x97, 0x06, 0x8a, 0x06, 0x97, 0x06, 0x98, 0x06, 0x8a, 0x06, 0x8a, 0x06, 0x98, 0x06, 0x8b, 0x06, +0x8b, 0x06, 0x98, 0x06, 0x8c, 0x06, 0x8c, 0x06, 0x98, 0x06, 0x99, 0x06, 0x99, 0x06, 0x9a, 0x06, 0x8c, 0x06, 0x8c, 0x06, 0x9a, 0x06, 0x8d, 0x06, 0x8d, 0x06, 0x9a, 0x06, 0x8e, 0x06, 0x8e, 0x06, 0x9a, 0x06, 0x9b, 0x06, 0x9c, 0x06, 0x9d, 0x06, 0x8f, 0x06, 0x8f, 0x06, 0x9d, 0x06, 0x90, 0x06, 0xa2, 0x03, 0xb0, 0x03, 0x91, 0x06, 0x91, 0x06, 0xb0, 0x03, 0x9e, 0x06, 0x9e, 0x06, 0x9f, 0x06, 0x91, 0x06, 0x91, 0x06, 0x9f, 0x06, 0x92, 0x06, 0x9f, 0x06, 0xa0, 0x06, 0x92, 0x06, 0x92, 0x06, +0xa0, 0x06, 0x93, 0x06, 0xa0, 0x06, 0xa1, 0x06, 0x93, 0x06, 0x93, 0x06, 0xa1, 0x06, 0x94, 0x06, 0xa1, 0x06, 0xa2, 0x06, 0x94, 0x06, 0x94, 0x06, 0xa2, 0x06, 0x95, 0x06, 0xa2, 0x06, 0xa3, 0x06, 0x95, 0x06, 0x95, 0x06, 0xa3, 0x06, 0x96, 0x06, 0xa3, 0x06, 0xa4, 0x06, 0x96, 0x06, 0x96, 0x06, 0xa4, 0x06, 0x97, 0x06, 0xa4, 0x06, 0xa5, 0x06, 0x97, 0x06, 0x97, 0x06, 0xa5, 0x06, 0x98, 0x06, 0x98, 0x06, 0xa5, 0x06, 0x99, 0x06, 0x99, 0x06, 0xa5, 0x06, 0xa6, 0x06, 0xa6, 0x06, 0xa7, 0x06, +0x99, 0x06, 0x99, 0x06, 0xa7, 0x06, 0x9a, 0x06, 0xa7, 0x06, 0xa8, 0x06, 0x9a, 0x06, 0x9a, 0x06, 0xa8, 0x06, 0x9b, 0x06, 0xa9, 0x06, 0xaa, 0x06, 0x9c, 0x06, 0x9c, 0x06, 0xaa, 0x06, 0x9d, 0x06, 0xb0, 0x03, 0xbe, 0x03, 0x9e, 0x06, 0x9e, 0x06, 0xbe, 0x03, 0xab, 0x06, 0xab, 0x06, 0xac, 0x06, 0x9e, 0x06, 0x9e, 0x06, 0xac, 0x06, 0x9f, 0x06, 0xac, 0x06, 0xad, 0x06, 0x9f, 0x06, 0x9f, 0x06, 0xad, 0x06, 0xa0, 0x06, 0xad, 0x06, 0xae, 0x06, 0xa0, 0x06, 0xa0, 0x06, 0xae, 0x06, 0xa1, 0x06, +0xae, 0x06, 0xaf, 0x06, 0xa1, 0x06, 0xa1, 0x06, 0xaf, 0x06, 0xa2, 0x06, 0xaf, 0x06, 0xb0, 0x06, 0xa2, 0x06, 0xa2, 0x06, 0xb0, 0x06, 0xa3, 0x06, 0xb0, 0x06, 0xb1, 0x06, 0xa3, 0x06, 0xa3, 0x06, 0xb1, 0x06, 0xa4, 0x06, 0xb1, 0x06, 0xb2, 0x06, 0xa4, 0x06, 0xa4, 0x06, 0xb2, 0x06, 0xa5, 0x06, 0xa5, 0x06, 0xb2, 0x06, 0xa6, 0x06, 0xa6, 0x06, 0xb2, 0x06, 0xb3, 0x06, 0xb3, 0x06, 0xb4, 0x06, 0xa6, 0x06, 0xa6, 0x06, 0xb4, 0x06, 0xa7, 0x06, 0xb4, 0x06, 0xb5, 0x06, 0xa7, 0x06, 0xa7, 0x06, +0xb5, 0x06, 0xa8, 0x06, 0xb6, 0x06, 0xaa, 0x06, 0xd4, 0x01, 0xd4, 0x01, 0xaa, 0x06, 0xd5, 0x01, 0xbe, 0x03, 0xca, 0x03, 0xab, 0x06, 0xab, 0x06, 0xca, 0x03, 0xb7, 0x06, 0xb7, 0x06, 0xb8, 0x06, 0xab, 0x06, 0xab, 0x06, 0xb8, 0x06, 0xac, 0x06, 0xb8, 0x06, 0xb9, 0x06, 0xac, 0x06, 0xac, 0x06, 0xb9, 0x06, 0xad, 0x06, 0xb9, 0x06, 0xba, 0x06, 0xad, 0x06, 0xad, 0x06, 0xba, 0x06, 0xae, 0x06, 0xba, 0x06, 0xbb, 0x06, 0xae, 0x06, 0xae, 0x06, 0xbb, 0x06, 0xaf, 0x06, 0xbb, 0x06, 0xbc, 0x06, +0xaf, 0x06, 0xaf, 0x06, 0xbc, 0x06, 0xb0, 0x06, 0xbc, 0x06, 0xbd, 0x06, 0xb0, 0x06, 0xb0, 0x06, 0xbd, 0x06, 0xb1, 0x06, 0xbd, 0x06, 0xbe, 0x06, 0xb1, 0x06, 0xb1, 0x06, 0xbe, 0x06, 0xb2, 0x06, 0xb2, 0x06, 0xbe, 0x06, 0xb3, 0x06, 0xb3, 0x06, 0xbe, 0x06, 0xbf, 0x06, 0xb3, 0x06, 0xbf, 0x06, 0xb4, 0x06, 0xb4, 0x06, 0xbf, 0x06, 0xc0, 0x06, 0xc0, 0x06, 0xc1, 0x06, 0xb4, 0x06, 0xb4, 0x06, 0xc1, 0x06, 0xb5, 0x06, 0xca, 0x03, 0xd6, 0x03, 0xb7, 0x06, 0xb7, 0x06, 0xd6, 0x03, 0xc2, 0x06, +0xc2, 0x06, 0xc3, 0x06, 0xb7, 0x06, 0xb7, 0x06, 0xc3, 0x06, 0xb8, 0x06, 0xc3, 0x06, 0xc4, 0x06, 0xb8, 0x06, 0xb8, 0x06, 0xc4, 0x06, 0xb9, 0x06, 0xc4, 0x06, 0xc5, 0x06, 0xb9, 0x06, 0xb9, 0x06, 0xc5, 0x06, 0xba, 0x06, 0xc5, 0x06, 0xc6, 0x06, 0xba, 0x06, 0xba, 0x06, 0xc6, 0x06, 0xbb, 0x06, 0xc6, 0x06, 0xc7, 0x06, 0xbb, 0x06, 0xbb, 0x06, 0xc7, 0x06, 0xbc, 0x06, 0xc7, 0x06, 0xc8, 0x06, 0xbc, 0x06, 0xbc, 0x06, 0xc8, 0x06, 0xbd, 0x06, 0xc8, 0x06, 0xc9, 0x06, 0xbd, 0x06, 0xbd, 0x06, +0xc9, 0x06, 0xbe, 0x06, 0xbe, 0x06, 0xc9, 0x06, 0xbf, 0x06, 0xbf, 0x06, 0xc9, 0x06, 0xca, 0x06, 0xca, 0x06, 0xcb, 0x06, 0xbf, 0x06, 0xbf, 0x06, 0xcb, 0x06, 0xc0, 0x06, 0xcb, 0x06, 0xcc, 0x06, 0xc0, 0x06, 0xc0, 0x06, 0xcc, 0x06, 0xc1, 0x06, 0xd6, 0x03, 0xe2, 0x03, 0xc2, 0x06, 0xc2, 0x06, 0xe2, 0x03, 0xcd, 0x06, 0xcd, 0x06, 0xce, 0x06, 0xc2, 0x06, 0xc2, 0x06, 0xce, 0x06, 0xc3, 0x06, 0xce, 0x06, 0xcf, 0x06, 0xc3, 0x06, 0xc3, 0x06, 0xcf, 0x06, 0xc4, 0x06, 0xcf, 0x06, 0xd0, 0x06, +0xc4, 0x06, 0xc4, 0x06, 0xd0, 0x06, 0xc5, 0x06, 0xd0, 0x06, 0xd1, 0x06, 0xc5, 0x06, 0xc5, 0x06, 0xd1, 0x06, 0xc6, 0x06, 0xd1, 0x06, 0xd2, 0x06, 0xc6, 0x06, 0xc6, 0x06, 0xd2, 0x06, 0xc7, 0x06, 0xd2, 0x06, 0xd3, 0x06, 0xc7, 0x06, 0xc7, 0x06, 0xd3, 0x06, 0xc8, 0x06, 0xd3, 0x06, 0xd4, 0x06, 0xc8, 0x06, 0xc8, 0x06, 0xd4, 0x06, 0xc9, 0x06, 0xc9, 0x06, 0xd4, 0x06, 0xca, 0x06, 0xca, 0x06, 0xd4, 0x06, 0xd5, 0x06, 0xd5, 0x06, 0xd6, 0x06, 0xca, 0x06, 0xca, 0x06, 0xd6, 0x06, 0xcb, 0x06, +0xd6, 0x06, 0xd7, 0x06, 0xcb, 0x06, 0xcb, 0x06, 0xd7, 0x06, 0xcc, 0x06, 0xe2, 0x03, 0xee, 0x03, 0xcd, 0x06, 0xcd, 0x06, 0xee, 0x03, 0xd8, 0x06, 0xd8, 0x06, 0xd9, 0x06, 0xcd, 0x06, 0xcd, 0x06, 0xd9, 0x06, 0xce, 0x06, 0xd9, 0x06, 0xda, 0x06, 0xce, 0x06, 0xce, 0x06, 0xda, 0x06, 0xcf, 0x06, 0xda, 0x06, 0xdb, 0x06, 0xcf, 0x06, 0xcf, 0x06, 0xdb, 0x06, 0xd0, 0x06, 0xdb, 0x06, 0xdc, 0x06, 0xd0, 0x06, 0xd0, 0x06, 0xdc, 0x06, 0xd1, 0x06, 0xdc, 0x06, 0xdd, 0x06, 0xd1, 0x06, 0xd1, 0x06, +0xdd, 0x06, 0xd2, 0x06, 0xdd, 0x06, 0xde, 0x06, 0xd2, 0x06, 0xd2, 0x06, 0xde, 0x06, 0xd3, 0x06, 0xde, 0x06, 0xdf, 0x06, 0xd3, 0x06, 0xd3, 0x06, 0xdf, 0x06, 0xd4, 0x06, 0xd4, 0x06, 0xdf, 0x06, 0xd5, 0x06, 0xd5, 0x06, 0xdf, 0x06, 0xe0, 0x06, 0xd5, 0x06, 0xe0, 0x06, 0xd6, 0x06, 0xd6, 0x06, 0xe0, 0x06, 0xe1, 0x06, 0xd6, 0x06, 0xe1, 0x06, 0xd7, 0x06, 0xd7, 0x06, 0xe1, 0x06, 0xe2, 0x06, 0xee, 0x03, 0xfa, 0x03, 0xd8, 0x06, 0xd8, 0x06, 0xfa, 0x03, 0xe3, 0x06, 0xe3, 0x06, 0xe4, 0x06, +0xd8, 0x06, 0xd8, 0x06, 0xe4, 0x06, 0xd9, 0x06, 0xe4, 0x06, 0xe5, 0x06, 0xd9, 0x06, 0xd9, 0x06, 0xe5, 0x06, 0xda, 0x06, 0xe5, 0x06, 0xe6, 0x06, 0xda, 0x06, 0xda, 0x06, 0xe6, 0x06, 0xdb, 0x06, 0xe6, 0x06, 0xe7, 0x06, 0xdb, 0x06, 0xdb, 0x06, 0xe7, 0x06, 0xdc, 0x06, 0xe7, 0x06, 0xe8, 0x06, 0xdc, 0x06, 0xdc, 0x06, 0xe8, 0x06, 0xdd, 0x06, 0xe8, 0x06, 0xe9, 0x06, 0xdd, 0x06, 0xdd, 0x06, 0xe9, 0x06, 0xde, 0x06, 0xde, 0x06, 0xe9, 0x06, 0xdf, 0x06, 0xdf, 0x06, 0xe9, 0x06, 0xea, 0x06, +0xdf, 0x06, 0xea, 0x06, 0xe0, 0x06, 0xe0, 0x06, 0xea, 0x06, 0xeb, 0x06, 0xe0, 0x06, 0xeb, 0x06, 0xe1, 0x06, 0xe1, 0x06, 0xeb, 0x06, 0xec, 0x06, 0xe1, 0x06, 0xec, 0x06, 0xe2, 0x06, 0xe2, 0x06, 0xec, 0x06, 0xed, 0x06, 0xfa, 0x03, 0x06, 0x04, 0xe3, 0x06, 0xe3, 0x06, 0x06, 0x04, 0xee, 0x06, 0xe3, 0x06, 0xee, 0x06, 0xe4, 0x06, 0xe4, 0x06, 0xee, 0x06, 0xef, 0x06, 0xe4, 0x06, 0xef, 0x06, 0xe5, 0x06, 0xe5, 0x06, 0xef, 0x06, 0xf0, 0x06, 0xe5, 0x06, 0xf0, 0x06, 0xe6, 0x06, 0xe6, 0x06, +0xf0, 0x06, 0xf1, 0x06, 0xf1, 0x06, 0xf2, 0x06, 0xe6, 0x06, 0xe6, 0x06, 0xf2, 0x06, 0xe7, 0x06, 0xf2, 0x06, 0xf3, 0x06, 0xe7, 0x06, 0xe7, 0x06, 0xf3, 0x06, 0xe8, 0x06, 0xf3, 0x06, 0xf4, 0x06, 0xe8, 0x06, 0xe8, 0x06, 0xf4, 0x06, 0xe9, 0x06, 0xe9, 0x06, 0xf4, 0x06, 0xea, 0x06, 0xea, 0x06, 0xf4, 0x06, 0xf5, 0x06, 0xea, 0x06, 0xf5, 0x06, 0xeb, 0x06, 0xeb, 0x06, 0xf5, 0x06, 0xf6, 0x06, 0xeb, 0x06, 0xf6, 0x06, 0xec, 0x06, 0xec, 0x06, 0xf6, 0x06, 0xf7, 0x06, 0xec, 0x06, 0xf7, 0x06, +0xed, 0x06, 0xed, 0x06, 0xf7, 0x06, 0xf8, 0x06, 0x06, 0x04, 0x12, 0x04, 0xee, 0x06, 0xee, 0x06, 0x12, 0x04, 0xf9, 0x06, 0xee, 0x06, 0xf9, 0x06, 0xef, 0x06, 0xef, 0x06, 0xf9, 0x06, 0xfa, 0x06, 0xef, 0x06, 0xfa, 0x06, 0xf0, 0x06, 0xf0, 0x06, 0xfa, 0x06, 0xfb, 0x06, 0xf3, 0x06, 0xfc, 0x06, 0xf4, 0x06, 0xfc, 0x06, 0xfd, 0x06, 0xf4, 0x06, 0xf4, 0x06, 0xfd, 0x06, 0xf5, 0x06, 0xfd, 0x06, 0xfe, 0x06, 0xf5, 0x06, 0xf5, 0x06, 0xfe, 0x06, 0xf6, 0x06, 0xfe, 0x06, 0xff, 0x06, 0xf6, 0x06, +0xf6, 0x06, 0xff, 0x06, 0xf7, 0x06, 0xf7, 0x06, 0xff, 0x06, 0xf8, 0x06, 0xf8, 0x06, 0xff, 0x06, 0x00, 0x07, 0x12, 0x04, 0x1b, 0x04, 0xf9, 0x06, 0xf9, 0x06, 0x1b, 0x04, 0x01, 0x07, 0xf9, 0x06, 0x01, 0x07, 0xfa, 0x06, 0xfa, 0x06, 0x01, 0x07, 0x02, 0x07, 0x1b, 0x04, 0x1e, 0x04, 0x01, 0x07, 0x01, 0x07, 0x1e, 0x04, 0x03, 0x07, 0x03, 0x07, 0x04, 0x07, 0x01, 0x07, 0x01, 0x07, 0x04, 0x07, 0x02, 0x07, 0x05, 0x07, 0xfe, 0x06, 0x06, 0x07, 0x06, 0x07, 0xfe, 0x06, 0xfd, 0x06, 0x05, 0x07, +0x07, 0x07, 0xfe, 0x06, 0xfe, 0x06, 0x07, 0x07, 0xff, 0x06, 0xff, 0x06, 0x07, 0x07, 0x00, 0x07, 0x00, 0x07, 0x07, 0x07, 0x08, 0x07, 0x1e, 0x04, 0x25, 0x04, 0x03, 0x07, 0x03, 0x07, 0x25, 0x04, 0x09, 0x07, 0x09, 0x07, 0x0a, 0x07, 0x03, 0x07, 0x03, 0x07, 0x0a, 0x07, 0x04, 0x07, 0x05, 0x07, 0x06, 0x07, 0x0b, 0x07, 0x0b, 0x07, 0x06, 0x07, 0x0c, 0x07, 0x05, 0x07, 0x0b, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0b, 0x07, 0x0d, 0x07, 0x07, 0x07, 0x0d, 0x07, 0x08, 0x07, 0x08, 0x07, 0x0d, 0x07, +0x0e, 0x07, 0x25, 0x04, 0x2c, 0x04, 0x09, 0x07, 0x09, 0x07, 0x2c, 0x04, 0x0f, 0x07, 0x09, 0x07, 0x0f, 0x07, 0x0a, 0x07, 0x0a, 0x07, 0x0f, 0x07, 0x10, 0x07, 0x11, 0x07, 0x0b, 0x07, 0x12, 0x07, 0x12, 0x07, 0x0b, 0x07, 0x0c, 0x07, 0x0b, 0x07, 0x11, 0x07, 0x0d, 0x07, 0x0d, 0x07, 0x11, 0x07, 0x13, 0x07, 0x0d, 0x07, 0x13, 0x07, 0x0e, 0x07, 0x0e, 0x07, 0x13, 0x07, 0x14, 0x07, 0x2c, 0x04, 0x33, 0x04, 0x0f, 0x07, 0x0f, 0x07, 0x33, 0x04, 0x15, 0x07, 0x0f, 0x07, 0x15, 0x07, 0x10, 0x07, +0x10, 0x07, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x11, 0x07, 0x18, 0x07, 0x18, 0x07, 0x11, 0x07, 0x12, 0x07, 0x11, 0x07, 0x17, 0x07, 0x13, 0x07, 0x13, 0x07, 0x17, 0x07, 0x19, 0x07, 0x13, 0x07, 0x19, 0x07, 0x14, 0x07, 0x14, 0x07, 0x19, 0x07, 0x1a, 0x07, 0x14, 0x07, 0x1a, 0x07, 0x1b, 0x07, 0x1b, 0x07, 0x1a, 0x07, 0x1c, 0x07, 0x1b, 0x07, 0x3c, 0x04, 0x1d, 0x07, 0x1d, 0x07, 0x3c, 0x04, 0x3d, 0x04, 0x33, 0x04, 0x3f, 0x04, 0x15, 0x07, 0x15, 0x07, 0x3f, 0x04, 0x1e, 0x07, 0x15, 0x07, +0x1e, 0x07, 0x16, 0x07, 0x16, 0x07, 0x1e, 0x07, 0x1f, 0x07, 0x42, 0x04, 0x44, 0x04, 0x20, 0x07, 0x20, 0x07, 0x44, 0x04, 0x21, 0x07, 0x5e, 0x06, 0x46, 0x04, 0x6a, 0x03, 0x60, 0x06, 0x46, 0x04, 0x5e, 0x06, 0x62, 0x06, 0x46, 0x04, 0x60, 0x06, 0x64, 0x06, 0x46, 0x04, 0x62, 0x06, 0x66, 0x06, 0x46, 0x04, 0x64, 0x06, 0x68, 0x06, 0x46, 0x04, 0x66, 0x06, 0x6a, 0x06, 0x46, 0x04, 0x68, 0x06, 0x6c, 0x06, 0x46, 0x04, 0x6a, 0x06, 0x6d, 0x06, 0x46, 0x04, 0x6c, 0x06, 0x6f, 0x06, 0x46, 0x04, +0x6d, 0x06, 0x72, 0x06, 0x46, 0x04, 0x6f, 0x06, 0x72, 0x06, 0x74, 0x06, 0x46, 0x04, 0x76, 0x06, 0x46, 0x04, 0x74, 0x06, 0x22, 0x07, 0x23, 0x07, 0x24, 0x07, 0x24, 0x07, 0x23, 0x07, 0x25, 0x07, 0x23, 0x07, 0x22, 0x07, 0x26, 0x07, 0x26, 0x07, 0x22, 0x07, 0x27, 0x07, 0x28, 0x07, 0x23, 0x07, 0x29, 0x07, 0x29, 0x07, 0x23, 0x07, 0x26, 0x07, 0x23, 0x07, 0x28, 0x07, 0x25, 0x07, 0x25, 0x07, 0x28, 0x07, 0x2a, 0x07, 0x2b, 0x07, 0x2c, 0x07, 0x2d, 0x07, 0x2d, 0x07, 0x2c, 0x07, 0x2e, 0x07, +0x2c, 0x07, 0x2b, 0x07, 0x2f, 0x07, 0x2f, 0x07, 0x2b, 0x07, 0x30, 0x07, 0x22, 0x07, 0x2c, 0x07, 0x27, 0x07, 0x27, 0x07, 0x2c, 0x07, 0x2f, 0x07, 0x2c, 0x07, 0x22, 0x07, 0x2e, 0x07, 0x2e, 0x07, 0x22, 0x07, 0x24, 0x07, 0x31, 0x07, 0x32, 0x07, 0x33, 0x07, 0x33, 0x07, 0x32, 0x07, 0x34, 0x07, 0x32, 0x07, 0x31, 0x07, 0x35, 0x07, 0x35, 0x07, 0x31, 0x07, 0x36, 0x07, 0x2b, 0x07, 0x32, 0x07, 0x30, 0x07, 0x30, 0x07, 0x32, 0x07, 0x35, 0x07, 0x32, 0x07, 0x2b, 0x07, 0x34, 0x07, 0x34, 0x07, +0x2b, 0x07, 0x2d, 0x07, 0x37, 0x07, 0x38, 0x07, 0x39, 0x07, 0x39, 0x07, 0x38, 0x07, 0x3a, 0x07, 0x37, 0x07, 0x39, 0x07, 0x3b, 0x07, 0x3b, 0x07, 0x39, 0x07, 0x3c, 0x07, 0x31, 0x07, 0x37, 0x07, 0x36, 0x07, 0x36, 0x07, 0x37, 0x07, 0x3b, 0x07, 0x37, 0x07, 0x31, 0x07, 0x38, 0x07, 0x38, 0x07, 0x31, 0x07, 0x33, 0x07, 0x3d, 0x07, 0x3e, 0x07, 0x3f, 0x07, 0x3f, 0x07, 0x3e, 0x07, 0x40, 0x07, 0x3f, 0x07, 0x40, 0x07, 0x39, 0x07, 0x39, 0x07, 0x40, 0x07, 0x3c, 0x07, 0x3f, 0x07, 0x41, 0x07, +0x3d, 0x07, 0x3d, 0x07, 0x41, 0x07, 0x42, 0x07, 0x43, 0x07, 0x44, 0x07, 0x45, 0x07, 0x45, 0x07, 0x44, 0x07, 0x46, 0x07, 0x45, 0x07, 0x47, 0x07, 0x43, 0x07, 0x43, 0x07, 0x47, 0x07, 0x48, 0x07, 0x43, 0x07, 0x48, 0x07, 0x3d, 0x07, 0x3d, 0x07, 0x48, 0x07, 0x3e, 0x07, 0x3d, 0x07, 0x42, 0x07, 0x43, 0x07, 0x43, 0x07, 0x42, 0x07, 0x44, 0x07, 0x49, 0x07, 0x4a, 0x07, 0x4b, 0x07, 0x4b, 0x07, 0x4a, 0x07, 0x4c, 0x07, 0x4b, 0x07, 0x4d, 0x07, 0x49, 0x07, 0x49, 0x07, 0x4d, 0x07, 0x4e, 0x07, +0x49, 0x07, 0x4e, 0x07, 0x45, 0x07, 0x45, 0x07, 0x4e, 0x07, 0x47, 0x07, 0x45, 0x07, 0x46, 0x07, 0x49, 0x07, 0x49, 0x07, 0x46, 0x07, 0x4a, 0x07, 0x4f, 0x07, 0x50, 0x07, 0x51, 0x07, 0x51, 0x07, 0x50, 0x07, 0x52, 0x07, 0x51, 0x07, 0x53, 0x07, 0x4f, 0x07, 0x4f, 0x07, 0x53, 0x07, 0x54, 0x07, 0x4f, 0x07, 0x54, 0x07, 0x4b, 0x07, 0x4b, 0x07, 0x54, 0x07, 0x4d, 0x07, 0x4b, 0x07, 0x4c, 0x07, 0x4f, 0x07, 0x4f, 0x07, 0x4c, 0x07, 0x50, 0x07, 0x55, 0x07, 0x56, 0x07, 0x57, 0x07, 0x57, 0x07, +0x56, 0x07, 0x58, 0x07, 0x57, 0x07, 0x59, 0x07, 0x55, 0x07, 0x55, 0x07, 0x59, 0x07, 0x5a, 0x07, 0x55, 0x07, 0x5a, 0x07, 0x51, 0x07, 0x51, 0x07, 0x5a, 0x07, 0x53, 0x07, 0x51, 0x07, 0x52, 0x07, 0x55, 0x07, 0x55, 0x07, 0x52, 0x07, 0x56, 0x07, 0x28, 0x07, 0x5b, 0x07, 0x2a, 0x07, 0x2a, 0x07, 0x5b, 0x07, 0x5c, 0x07, 0x5b, 0x07, 0x28, 0x07, 0x5d, 0x07, 0x5d, 0x07, 0x28, 0x07, 0x29, 0x07, 0x57, 0x07, 0x5b, 0x07, 0x59, 0x07, 0x59, 0x07, 0x5b, 0x07, 0x5d, 0x07, 0x5b, 0x07, 0x57, 0x07, +0x5c, 0x07, 0x5c, 0x07, 0x57, 0x07, 0x58, 0x07, 0x2a, 0x07, 0x52, 0x07, 0x25, 0x07, 0x25, 0x07, 0x52, 0x07, 0x50, 0x07, 0x5e, 0x07, 0x5f, 0x07, 0x60, 0x07, 0x60, 0x07, 0x5f, 0x07, 0x61, 0x07, 0x62, 0x07, 0x63, 0x07, 0x64, 0x07, 0x64, 0x07, 0x63, 0x07, 0x61, 0x07, 0x65, 0x07, 0x66, 0x07, 0x67, 0x07, 0x67, 0x07, 0x66, 0x07, 0x68, 0x07, 0x69, 0x07, 0x6a, 0x07, 0x6b, 0x07, 0x6b, 0x07, 0x6a, 0x07, 0x68, 0x07, 0x6c, 0x07, 0x6a, 0x07, 0x6d, 0x07, 0x6d, 0x07, 0x6a, 0x07, 0x6e, 0x07, +0x6f, 0x07, 0x5f, 0x07, 0x70, 0x07, 0x70, 0x07, 0x5f, 0x07, 0x6e, 0x07, 0x71, 0x07, 0x72, 0x07, 0x73, 0x07, 0x73, 0x07, 0x72, 0x07, 0x63, 0x07, 0x74, 0x07, 0x75, 0x07, 0x76, 0x07, 0x76, 0x07, 0x75, 0x07, 0x73, 0x07, 0x77, 0x07, 0x75, 0x07, 0x78, 0x07, 0x78, 0x07, 0x75, 0x07, 0x79, 0x07, 0x7a, 0x07, 0x7b, 0x07, 0x79, 0x07, 0x79, 0x07, 0x7b, 0x07, 0x7c, 0x07, 0x7d, 0x07, 0x7e, 0x07, 0x7f, 0x07, 0x7f, 0x07, 0x7e, 0x07, 0x80, 0x07, 0x81, 0x07, 0x82, 0x07, 0x7f, 0x07, 0x7f, 0x07, +0x82, 0x07, 0x7c, 0x07, 0x83, 0x07, 0x84, 0x07, 0x85, 0x07, 0x85, 0x07, 0x84, 0x07, 0x80, 0x07, 0x86, 0x07, 0x87, 0x07, 0x85, 0x07, 0x85, 0x07, 0x87, 0x07, 0x88, 0x07, 0x89, 0x07, 0x8a, 0x07, 0x8b, 0x07, 0x8b, 0x07, 0x8a, 0x07, 0x88, 0x07, 0x8c, 0x07, 0x8d, 0x07, 0x8b, 0x07, 0x8b, 0x07, 0x8d, 0x07, 0x8e, 0x07, 0x8f, 0x07, 0x90, 0x07, 0x91, 0x07, 0x91, 0x07, 0x90, 0x07, 0x8e, 0x07, 0x92, 0x07, 0x93, 0x07, 0x91, 0x07, 0x91, 0x07, 0x93, 0x07, 0x94, 0x07, 0x95, 0x07, 0x96, 0x07, +0x97, 0x07, 0x97, 0x07, 0x96, 0x07, 0x94, 0x07, 0x98, 0x07, 0x99, 0x07, 0x97, 0x07, 0x97, 0x07, 0x99, 0x07, 0x66, 0x07, 0x9a, 0x07, 0x9b, 0x07, 0x36, 0x07, 0x36, 0x07, 0x9b, 0x07, 0x35, 0x07, 0x9c, 0x07, 0x9d, 0x07, 0x35, 0x07, 0x35, 0x07, 0x9d, 0x07, 0x30, 0x07, 0x9e, 0x07, 0x9f, 0x07, 0x27, 0x07, 0x27, 0x07, 0x9f, 0x07, 0x26, 0x07, 0xa0, 0x07, 0xa1, 0x07, 0x26, 0x07, 0x26, 0x07, 0xa1, 0x07, 0x29, 0x07, 0xa2, 0x07, 0xa3, 0x07, 0x30, 0x07, 0x30, 0x07, 0xa3, 0x07, 0x2f, 0x07, +0xa4, 0x07, 0xa5, 0x07, 0x2f, 0x07, 0x2f, 0x07, 0xa5, 0x07, 0x27, 0x07, 0xa6, 0x07, 0xa7, 0x07, 0x3c, 0x07, 0x3c, 0x07, 0xa7, 0x07, 0x3b, 0x07, 0xa8, 0x07, 0xa9, 0x07, 0x3b, 0x07, 0x3b, 0x07, 0xa9, 0x07, 0x36, 0x07, 0xaa, 0x07, 0xab, 0x07, 0x29, 0x07, 0x29, 0x07, 0xab, 0x07, 0x5d, 0x07, 0xac, 0x07, 0xad, 0x07, 0x5d, 0x07, 0x5d, 0x07, 0xad, 0x07, 0x59, 0x07, 0x3e, 0x07, 0xae, 0x07, 0x40, 0x07, 0x40, 0x07, 0xae, 0x07, 0xaf, 0x07, 0xb0, 0x07, 0x3c, 0x07, 0xb1, 0x07, 0xb1, 0x07, +0x3c, 0x07, 0x40, 0x07, 0x59, 0x07, 0xb2, 0x07, 0x5a, 0x07, 0x5a, 0x07, 0xb2, 0x07, 0xb3, 0x07, 0xb4, 0x07, 0x53, 0x07, 0xb5, 0x07, 0xb5, 0x07, 0x53, 0x07, 0x5a, 0x07, 0x47, 0x07, 0xb6, 0x07, 0x48, 0x07, 0x48, 0x07, 0xb6, 0x07, 0xb7, 0x07, 0xb8, 0x07, 0x3e, 0x07, 0xb9, 0x07, 0xb9, 0x07, 0x3e, 0x07, 0x48, 0x07, 0x53, 0x07, 0xba, 0x07, 0x54, 0x07, 0x54, 0x07, 0xba, 0x07, 0xbb, 0x07, 0xbc, 0x07, 0x4d, 0x07, 0xbd, 0x07, 0xbd, 0x07, 0x4d, 0x07, 0x54, 0x07, 0x4d, 0x07, 0xbe, 0x07, +0x4e, 0x07, 0x4e, 0x07, 0xbe, 0x07, 0xbf, 0x07, 0xc0, 0x07, 0x47, 0x07, 0xc1, 0x07, 0xc1, 0x07, 0x47, 0x07, 0x4e, 0x07, 0xc2, 0x07, 0xc3, 0x07, 0x76, 0x07, 0x76, 0x07, 0xc3, 0x07, 0x74, 0x07, 0x76, 0x07, 0x62, 0x07, 0xc4, 0x07, 0xc4, 0x07, 0x62, 0x07, 0xc5, 0x07, 0xc6, 0x07, 0xc7, 0x07, 0x70, 0x07, 0x70, 0x07, 0xc7, 0x07, 0x6f, 0x07, 0xc8, 0x07, 0x70, 0x07, 0xc9, 0x07, 0xc9, 0x07, 0x70, 0x07, 0x69, 0x07, 0xca, 0x07, 0xcb, 0x07, 0x64, 0x07, 0x64, 0x07, 0xcb, 0x07, 0x62, 0x07, +0x64, 0x07, 0x6f, 0x07, 0xcc, 0x07, 0xcc, 0x07, 0x6f, 0x07, 0xcd, 0x07, 0xce, 0x07, 0xcf, 0x07, 0x7a, 0x07, 0x7a, 0x07, 0xcf, 0x07, 0x7b, 0x07, 0x7a, 0x07, 0x74, 0x07, 0xd0, 0x07, 0xd0, 0x07, 0x74, 0x07, 0xd1, 0x07, 0xd2, 0x07, 0x69, 0x07, 0xd3, 0x07, 0xd3, 0x07, 0x69, 0x07, 0x6b, 0x07, 0xd4, 0x07, 0x6b, 0x07, 0xd5, 0x07, 0xd5, 0x07, 0x6b, 0x07, 0x99, 0x07, 0xd6, 0x07, 0xd7, 0x07, 0x7d, 0x07, 0x7d, 0x07, 0xd7, 0x07, 0x7e, 0x07, 0x7d, 0x07, 0x7b, 0x07, 0xd8, 0x07, 0xd8, 0x07, +0x7b, 0x07, 0xd9, 0x07, 0xda, 0x07, 0x99, 0x07, 0xdb, 0x07, 0xdb, 0x07, 0x99, 0x07, 0x98, 0x07, 0xdc, 0x07, 0x98, 0x07, 0xdd, 0x07, 0xdd, 0x07, 0x98, 0x07, 0x93, 0x07, 0xde, 0x07, 0xdf, 0x07, 0x86, 0x07, 0x86, 0x07, 0xdf, 0x07, 0x87, 0x07, 0x86, 0x07, 0x7e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x7e, 0x07, 0xe1, 0x07, 0xe2, 0x07, 0x93, 0x07, 0xe3, 0x07, 0xe3, 0x07, 0x93, 0x07, 0x92, 0x07, 0xe4, 0x07, 0x92, 0x07, 0xe5, 0x07, 0xe5, 0x07, 0x92, 0x07, 0x8d, 0x07, 0xe6, 0x07, 0xe7, 0x07, +0x8c, 0x07, 0x8c, 0x07, 0xe7, 0x07, 0x8d, 0x07, 0x8c, 0x07, 0x87, 0x07, 0xe8, 0x07, 0xe8, 0x07, 0x87, 0x07, 0xe9, 0x07, 0xea, 0x07, 0xeb, 0x07, 0x84, 0x07, 0x84, 0x07, 0xeb, 0x07, 0x81, 0x07, 0xec, 0x07, 0x82, 0x07, 0xeb, 0x07, 0xeb, 0x07, 0x82, 0x07, 0x81, 0x07, 0xed, 0x07, 0xee, 0x07, 0x8a, 0x07, 0x8a, 0x07, 0xee, 0x07, 0x83, 0x07, 0xee, 0x07, 0xea, 0x07, 0x83, 0x07, 0x83, 0x07, 0xea, 0x07, 0x84, 0x07, 0x72, 0x07, 0xef, 0x07, 0x60, 0x07, 0x60, 0x07, 0xef, 0x07, 0xf0, 0x07, +0xf1, 0x07, 0x5e, 0x07, 0xf0, 0x07, 0xf0, 0x07, 0x5e, 0x07, 0x60, 0x07, 0xf2, 0x07, 0xf3, 0x07, 0x96, 0x07, 0x96, 0x07, 0xf3, 0x07, 0x8f, 0x07, 0xf3, 0x07, 0xf4, 0x07, 0x8f, 0x07, 0x8f, 0x07, 0xf4, 0x07, 0x90, 0x07, 0x6c, 0x07, 0xf5, 0x07, 0x67, 0x07, 0x67, 0x07, 0xf5, 0x07, 0xf6, 0x07, 0xf6, 0x07, 0xf7, 0x07, 0x67, 0x07, 0x67, 0x07, 0xf7, 0x07, 0x65, 0x07, 0x5e, 0x07, 0xf1, 0x07, 0x6d, 0x07, 0x6d, 0x07, 0xf1, 0x07, 0xf8, 0x07, 0xf5, 0x07, 0x6c, 0x07, 0xf8, 0x07, 0xf8, 0x07, +0x6c, 0x07, 0x6d, 0x07, 0x77, 0x07, 0xf9, 0x07, 0x71, 0x07, 0x71, 0x07, 0xf9, 0x07, 0xfa, 0x07, 0xef, 0x07, 0x72, 0x07, 0xfa, 0x07, 0xfa, 0x07, 0x72, 0x07, 0x71, 0x07, 0x82, 0x07, 0xec, 0x07, 0x78, 0x07, 0x78, 0x07, 0xec, 0x07, 0xfb, 0x07, 0xf9, 0x07, 0x77, 0x07, 0xfb, 0x07, 0xfb, 0x07, 0x77, 0x07, 0x78, 0x07, 0xf4, 0x07, 0xfc, 0x07, 0x90, 0x07, 0x90, 0x07, 0xfc, 0x07, 0x89, 0x07, 0xfc, 0x07, 0xed, 0x07, 0x89, 0x07, 0x89, 0x07, 0xed, 0x07, 0x8a, 0x07, 0xf7, 0x07, 0xfd, 0x07, +0x65, 0x07, 0x65, 0x07, 0xfd, 0x07, 0x95, 0x07, 0xfd, 0x07, 0xf2, 0x07, 0x95, 0x07, 0x95, 0x07, 0xf2, 0x07, 0x96, 0x07, 0xea, 0x07, 0xfe, 0x07, 0xeb, 0x07, 0xeb, 0x07, 0xfe, 0x07, 0xff, 0x07, 0x00, 0x08, 0xec, 0x07, 0xff, 0x07, 0xff, 0x07, 0xec, 0x07, 0xeb, 0x07, 0xee, 0x07, 0xed, 0x07, 0x01, 0x08, 0x01, 0x08, 0xed, 0x07, 0x02, 0x08, 0xea, 0x07, 0xee, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xee, 0x07, 0x01, 0x08, 0xef, 0x07, 0x03, 0x08, 0xf0, 0x07, 0xf0, 0x07, 0x03, 0x08, 0x04, 0x08, +0x05, 0x08, 0xf1, 0x07, 0x04, 0x08, 0x04, 0x08, 0xf1, 0x07, 0xf0, 0x07, 0xf3, 0x07, 0xf2, 0x07, 0x06, 0x08, 0x06, 0x08, 0xf2, 0x07, 0x07, 0x08, 0xf4, 0x07, 0xf3, 0x07, 0x08, 0x08, 0x08, 0x08, 0xf3, 0x07, 0x06, 0x08, 0xf6, 0x07, 0xf5, 0x07, 0x09, 0x08, 0x09, 0x08, 0xf5, 0x07, 0x0a, 0x08, 0xf7, 0x07, 0xf6, 0x07, 0x0b, 0x08, 0x0b, 0x08, 0xf6, 0x07, 0x09, 0x08, 0xf1, 0x07, 0x05, 0x08, 0xf8, 0x07, 0xf8, 0x07, 0x05, 0x08, 0x0c, 0x08, 0x0a, 0x08, 0xf5, 0x07, 0x0c, 0x08, 0x0c, 0x08, +0xf5, 0x07, 0xf8, 0x07, 0xf9, 0x07, 0x0d, 0x08, 0xfa, 0x07, 0xfa, 0x07, 0x0d, 0x08, 0x0e, 0x08, 0x03, 0x08, 0xef, 0x07, 0x0e, 0x08, 0x0e, 0x08, 0xef, 0x07, 0xfa, 0x07, 0xec, 0x07, 0x00, 0x08, 0xfb, 0x07, 0xfb, 0x07, 0x00, 0x08, 0x0f, 0x08, 0x0d, 0x08, 0xf9, 0x07, 0x0f, 0x08, 0x0f, 0x08, 0xf9, 0x07, 0xfb, 0x07, 0xfc, 0x07, 0xf4, 0x07, 0x10, 0x08, 0x10, 0x08, 0xf4, 0x07, 0x08, 0x08, 0xed, 0x07, 0xfc, 0x07, 0x02, 0x08, 0x02, 0x08, 0xfc, 0x07, 0x10, 0x08, 0xfd, 0x07, 0xf7, 0x07, +0x11, 0x08, 0x11, 0x08, 0xf7, 0x07, 0x0b, 0x08, 0xf2, 0x07, 0xfd, 0x07, 0x07, 0x08, 0x07, 0x08, 0xfd, 0x07, 0x11, 0x08, 0x56, 0x07, 0x52, 0x07, 0x58, 0x07, 0x52, 0x07, 0x2a, 0x07, 0x58, 0x07, 0x2a, 0x07, 0x5c, 0x07, 0x58, 0x07, 0x24, 0x07, 0x4c, 0x07, 0x2e, 0x07, 0x2e, 0x07, 0x4c, 0x07, 0x4a, 0x07, 0x25, 0x07, 0x50, 0x07, 0x24, 0x07, 0x24, 0x07, 0x50, 0x07, 0x4c, 0x07, 0x2e, 0x07, 0x4a, 0x07, 0x2d, 0x07, 0x2d, 0x07, 0x4a, 0x07, 0x46, 0x07, 0x38, 0x07, 0x33, 0x07, 0x3a, 0x07, +0x42, 0x07, 0x41, 0x07, 0x33, 0x07, 0x33, 0x07, 0x41, 0x07, 0x3a, 0x07, 0x46, 0x07, 0x44, 0x07, 0x2d, 0x07, 0x2d, 0x07, 0x44, 0x07, 0x34, 0x07, 0x39, 0x07, 0x3a, 0x07, 0x3f, 0x07, 0x3f, 0x07, 0x3a, 0x07, 0x41, 0x07, 0x33, 0x07, 0x34, 0x07, 0x42, 0x07, 0x42, 0x07, 0x34, 0x07, 0x44, 0x07, 0xfe, 0x07, 0x12, 0x08, 0xff, 0x07, 0xff, 0x07, 0x12, 0x08, 0x13, 0x08, 0xff, 0x07, 0x13, 0x08, 0x00, 0x08, 0x00, 0x08, 0x13, 0x08, 0x18, 0x07, 0x14, 0x08, 0x15, 0x08, 0x02, 0x08, 0x02, 0x08, +0x15, 0x08, 0x01, 0x08, 0xfd, 0x06, 0xfc, 0x06, 0x03, 0x08, 0x03, 0x08, 0xfc, 0x06, 0x04, 0x08, 0x04, 0x08, 0xfc, 0x06, 0x05, 0x08, 0x05, 0x08, 0xfc, 0x06, 0xf3, 0x06, 0x0a, 0x07, 0x10, 0x07, 0x07, 0x08, 0x07, 0x08, 0x10, 0x07, 0x06, 0x08, 0x10, 0x07, 0x16, 0x07, 0x06, 0x08, 0x06, 0x08, 0x16, 0x07, 0x08, 0x08, 0x0a, 0x08, 0xf1, 0x06, 0x09, 0x08, 0x09, 0x08, 0xf1, 0x06, 0xfb, 0x06, 0x09, 0x08, 0xfb, 0x06, 0x0b, 0x08, 0x0b, 0x08, 0xfb, 0x06, 0x02, 0x07, 0xf3, 0x06, 0xf2, 0x06, +0x05, 0x08, 0x05, 0x08, 0xf2, 0x06, 0x0c, 0x08, 0x0c, 0x08, 0xf2, 0x06, 0x0a, 0x08, 0x0a, 0x08, 0xf2, 0x06, 0xf1, 0x06, 0x0d, 0x08, 0x0c, 0x07, 0x0e, 0x08, 0x0e, 0x08, 0x0c, 0x07, 0x06, 0x07, 0x0e, 0x08, 0x06, 0x07, 0x03, 0x08, 0x03, 0x08, 0x06, 0x07, 0xfd, 0x06, 0x0f, 0x08, 0x12, 0x07, 0x0d, 0x08, 0x0d, 0x08, 0x12, 0x07, 0x0c, 0x07, 0x08, 0x08, 0x16, 0x07, 0x10, 0x08, 0x10, 0x08, 0x16, 0x07, 0x1f, 0x07, 0x1f, 0x07, 0x14, 0x08, 0x10, 0x08, 0x10, 0x08, 0x14, 0x08, 0x02, 0x08, +0x0b, 0x08, 0x02, 0x07, 0x11, 0x08, 0x11, 0x08, 0x02, 0x07, 0x04, 0x07, 0x11, 0x08, 0x04, 0x07, 0x07, 0x08, 0x07, 0x08, 0x04, 0x07, 0x0a, 0x07, 0x15, 0x08, 0x12, 0x08, 0x01, 0x08, 0x01, 0x08, 0x12, 0x08, 0xfe, 0x07, 0x02, 0x07, 0xfb, 0x06, 0xfa, 0x06, 0xfb, 0x06, 0xf1, 0x06, 0xf0, 0x06, 0x0f, 0x08, 0x00, 0x08, 0x12, 0x07, 0x12, 0x07, 0x00, 0x08, 0x18, 0x07, 0x16, 0x08, 0x17, 0x08, 0x18, 0x08, 0x17, 0x08, 0x19, 0x08, 0x18, 0x08, 0x18, 0x08, 0x19, 0x08, 0x16, 0x08, 0x1a, 0x08, +0x42, 0x05, 0x1b, 0x08, 0x1b, 0x08, 0x42, 0x05, 0x43, 0x05, 0x1c, 0x08, 0x1a, 0x08, 0x1d, 0x08, 0x1d, 0x08, 0x1a, 0x08, 0x1b, 0x08, 0x1a, 0x08, 0x1c, 0x08, 0x1e, 0x08, 0x1e, 0x08, 0x1c, 0x08, 0x1f, 0x08, 0x4a, 0x05, 0x1e, 0x08, 0x48, 0x05, 0x48, 0x05, 0x1e, 0x08, 0x20, 0x08, 0x42, 0x05, 0x1a, 0x08, 0x4a, 0x05, 0x4a, 0x05, 0x1a, 0x08, 0x1e, 0x08, 0x21, 0x08, 0x22, 0x08, 0x23, 0x08, 0x23, 0x08, 0x22, 0x08, 0x24, 0x08, 0x22, 0x08, 0x21, 0x08, 0x25, 0x08, 0x25, 0x08, 0x21, 0x08, +0x26, 0x08, 0x27, 0x08, 0x28, 0x08, 0x29, 0x08, 0x29, 0x08, 0x28, 0x08, 0x2a, 0x08, 0x55, 0x05, 0x2b, 0x08, 0x27, 0x08, 0x27, 0x08, 0x2b, 0x08, 0x2c, 0x08, 0x22, 0x08, 0x2d, 0x08, 0x2e, 0x08, 0x2e, 0x08, 0x2d, 0x08, 0x2f, 0x08, 0x30, 0x08, 0x31, 0x08, 0x32, 0x08, 0x32, 0x08, 0x31, 0x08, 0x2e, 0x08, 0x31, 0x08, 0x33, 0x08, 0x2e, 0x08, 0x2e, 0x08, 0x33, 0x08, 0x34, 0x08, 0x24, 0x08, 0x22, 0x08, 0x34, 0x08, 0x34, 0x08, 0x22, 0x08, 0x2e, 0x08, 0x35, 0x08, 0x36, 0x08, 0x37, 0x08, +0x37, 0x08, 0x36, 0x08, 0x38, 0x08, 0x23, 0x08, 0x24, 0x08, 0x35, 0x08, 0x35, 0x08, 0x24, 0x08, 0x36, 0x08, 0x39, 0x08, 0x3a, 0x08, 0x3b, 0x08, 0x3b, 0x08, 0x3a, 0x08, 0x3c, 0x08, 0x3d, 0x08, 0x3e, 0x08, 0x3c, 0x08, 0x3c, 0x08, 0x3e, 0x08, 0x3b, 0x08, 0x3e, 0x08, 0x3f, 0x08, 0x3b, 0x08, 0x3f, 0x08, 0x40, 0x08, 0x3b, 0x08, 0x3b, 0x08, 0x40, 0x08, 0x39, 0x08, 0x41, 0x08, 0x29, 0x08, 0x42, 0x08, 0x42, 0x08, 0x29, 0x08, 0x43, 0x08, 0x44, 0x08, 0x41, 0x08, 0x45, 0x08, 0x45, 0x08, +0x41, 0x08, 0x42, 0x08, 0x41, 0x08, 0x44, 0x08, 0x46, 0x08, 0x46, 0x08, 0x44, 0x08, 0x47, 0x08, 0x74, 0x05, 0x73, 0x05, 0x47, 0x08, 0x47, 0x08, 0x73, 0x05, 0x46, 0x08, 0x73, 0x05, 0x55, 0x05, 0x46, 0x08, 0x46, 0x08, 0x55, 0x05, 0x27, 0x08, 0x29, 0x08, 0x41, 0x08, 0x27, 0x08, 0x27, 0x08, 0x41, 0x08, 0x46, 0x08, 0x48, 0x08, 0x49, 0x08, 0x4a, 0x08, 0x4a, 0x08, 0x49, 0x08, 0x4b, 0x08, 0x4b, 0x08, 0x38, 0x08, 0x4a, 0x08, 0x4a, 0x08, 0x38, 0x08, 0x36, 0x08, 0x24, 0x08, 0x34, 0x08, +0x36, 0x08, 0x36, 0x08, 0x34, 0x08, 0x4a, 0x08, 0x33, 0x08, 0x48, 0x08, 0x34, 0x08, 0x34, 0x08, 0x48, 0x08, 0x4a, 0x08, 0x3d, 0x08, 0x4c, 0x08, 0x3e, 0x08, 0x3e, 0x08, 0x4c, 0x08, 0x4d, 0x08, 0x4d, 0x08, 0x4e, 0x08, 0x3e, 0x08, 0x4f, 0x08, 0x50, 0x08, 0x51, 0x08, 0x51, 0x08, 0x50, 0x08, 0x52, 0x08, 0x50, 0x08, 0x53, 0x08, 0x52, 0x08, 0x52, 0x08, 0x53, 0x08, 0x54, 0x08, 0x55, 0x08, 0x84, 0x05, 0x56, 0x08, 0x56, 0x08, 0x84, 0x05, 0x85, 0x05, 0x85, 0x05, 0x86, 0x05, 0x56, 0x08, +0x56, 0x08, 0x86, 0x05, 0x57, 0x08, 0x53, 0x08, 0x50, 0x08, 0x57, 0x08, 0x57, 0x08, 0x50, 0x08, 0x56, 0x08, 0x4f, 0x08, 0x55, 0x08, 0x50, 0x08, 0x50, 0x08, 0x55, 0x08, 0x56, 0x08, 0x58, 0x08, 0x59, 0x08, 0x5a, 0x08, 0x5a, 0x08, 0x59, 0x08, 0x5b, 0x08, 0x5c, 0x08, 0x5d, 0x08, 0x5b, 0x08, 0x5b, 0x08, 0x5d, 0x08, 0x5a, 0x08, 0x5e, 0x08, 0x5f, 0x08, 0x60, 0x08, 0x60, 0x08, 0x5f, 0x08, 0x61, 0x08, 0x62, 0x08, 0x16, 0x08, 0x5f, 0x08, 0x5f, 0x08, 0x16, 0x08, 0x61, 0x08, 0x61, 0x08, +0x63, 0x08, 0x60, 0x08, 0x60, 0x08, 0x63, 0x08, 0x64, 0x08, 0x19, 0x08, 0x65, 0x08, 0x16, 0x08, 0x16, 0x08, 0x65, 0x08, 0x61, 0x08, 0x65, 0x08, 0x66, 0x08, 0x61, 0x08, 0x61, 0x08, 0x66, 0x08, 0x63, 0x08, 0x67, 0x08, 0x68, 0x08, 0x69, 0x08, 0x69, 0x08, 0x68, 0x08, 0x6a, 0x08, 0x68, 0x08, 0x1d, 0x08, 0x6a, 0x08, 0x6a, 0x08, 0x1d, 0x08, 0x1b, 0x08, 0x1b, 0x08, 0x43, 0x05, 0x6a, 0x08, 0x6a, 0x08, 0x43, 0x05, 0x9a, 0x05, 0x9b, 0x05, 0x69, 0x08, 0x9a, 0x05, 0x9a, 0x05, 0x69, 0x08, +0x6a, 0x08, 0x37, 0x08, 0x38, 0x08, 0x6b, 0x08, 0x6b, 0x08, 0x38, 0x08, 0x6c, 0x08, 0x6b, 0x08, 0x6c, 0x08, 0x6d, 0x08, 0x6d, 0x08, 0x6c, 0x08, 0x6e, 0x08, 0x6f, 0x08, 0x70, 0x08, 0x71, 0x08, 0x71, 0x08, 0x70, 0x08, 0x72, 0x08, 0x73, 0x08, 0x74, 0x08, 0x72, 0x08, 0x72, 0x08, 0x74, 0x08, 0x71, 0x08, 0x74, 0x08, 0x5e, 0x08, 0x71, 0x08, 0x71, 0x08, 0x5e, 0x08, 0x60, 0x08, 0x70, 0x08, 0x6f, 0x08, 0x75, 0x08, 0x75, 0x08, 0x6f, 0x08, 0x76, 0x08, 0x63, 0x08, 0x77, 0x08, 0x64, 0x08, +0x78, 0x08, 0x64, 0x08, 0x77, 0x08, 0x78, 0x08, 0x4c, 0x08, 0x76, 0x08, 0x76, 0x08, 0x4c, 0x08, 0x79, 0x08, 0x7a, 0x08, 0x75, 0x08, 0x79, 0x08, 0x79, 0x08, 0x75, 0x08, 0x76, 0x08, 0x5e, 0x08, 0x74, 0x08, 0x7b, 0x08, 0x7b, 0x08, 0x74, 0x08, 0x7c, 0x08, 0x74, 0x08, 0x73, 0x08, 0x7c, 0x08, 0x7c, 0x08, 0x73, 0x08, 0x7d, 0x08, 0x7e, 0x08, 0x7f, 0x08, 0x7d, 0x08, 0x7d, 0x08, 0x7f, 0x08, 0x7c, 0x08, 0x7f, 0x08, 0x80, 0x08, 0x7c, 0x08, 0x7c, 0x08, 0x80, 0x08, 0x7b, 0x08, 0x81, 0x08, +0x82, 0x08, 0x83, 0x08, 0x83, 0x08, 0x82, 0x08, 0x84, 0x08, 0x82, 0x08, 0x81, 0x08, 0x85, 0x08, 0x85, 0x08, 0x81, 0x08, 0x86, 0x08, 0x87, 0x08, 0x88, 0x08, 0x89, 0x08, 0x89, 0x08, 0x88, 0x08, 0x8a, 0x08, 0x8b, 0x08, 0x8c, 0x08, 0x8a, 0x08, 0x8a, 0x08, 0x8c, 0x08, 0x89, 0x08, 0x8c, 0x08, 0x8d, 0x08, 0x89, 0x08, 0x89, 0x08, 0x8d, 0x08, 0x8e, 0x08, 0x8f, 0x08, 0x87, 0x08, 0x8e, 0x08, 0x8e, 0x08, 0x87, 0x08, 0x89, 0x08, 0x90, 0x08, 0x91, 0x08, 0x92, 0x08, 0x92, 0x08, 0x91, 0x08, +0x93, 0x08, 0x5c, 0x08, 0x94, 0x08, 0x93, 0x08, 0x93, 0x08, 0x94, 0x08, 0x92, 0x08, 0x88, 0x08, 0x87, 0x08, 0x94, 0x08, 0x94, 0x08, 0x87, 0x08, 0x92, 0x08, 0x87, 0x08, 0x8f, 0x08, 0x92, 0x08, 0x92, 0x08, 0x8f, 0x08, 0x90, 0x08, 0x95, 0x08, 0x96, 0x08, 0x97, 0x08, 0x97, 0x08, 0x96, 0x08, 0x98, 0x08, 0x99, 0x08, 0x9a, 0x08, 0x98, 0x08, 0x98, 0x08, 0x9a, 0x08, 0x97, 0x08, 0x9a, 0x08, 0x86, 0x08, 0x97, 0x08, 0x97, 0x08, 0x86, 0x08, 0x81, 0x08, 0x83, 0x08, 0x95, 0x08, 0x81, 0x08, +0x81, 0x08, 0x95, 0x08, 0x97, 0x08, 0x8d, 0x08, 0x8c, 0x08, 0x9b, 0x08, 0x9b, 0x08, 0x8c, 0x08, 0x9c, 0x08, 0x8c, 0x08, 0x8b, 0x08, 0x9c, 0x08, 0x9c, 0x08, 0x8b, 0x08, 0x9d, 0x08, 0x9e, 0x08, 0x9f, 0x08, 0x9d, 0x08, 0x9d, 0x08, 0x9f, 0x08, 0x9c, 0x08, 0x9f, 0x08, 0xa0, 0x08, 0x9c, 0x08, 0x9c, 0x08, 0xa0, 0x08, 0x9b, 0x08, 0x85, 0x08, 0x86, 0x08, 0xa1, 0x08, 0xa1, 0x08, 0x86, 0x08, 0x9a, 0x08, 0xa2, 0x08, 0xa1, 0x08, 0x99, 0x08, 0x99, 0x08, 0xa1, 0x08, 0x9a, 0x08, 0xa3, 0x08, +0xa4, 0x08, 0xa5, 0x08, 0xa5, 0x08, 0xa4, 0x08, 0xa6, 0x08, 0xa4, 0x08, 0x9e, 0x08, 0xa6, 0x08, 0xa6, 0x08, 0x9e, 0x08, 0x9d, 0x08, 0x9d, 0x08, 0x8b, 0x08, 0xa6, 0x08, 0xa6, 0x08, 0x8b, 0x08, 0x8a, 0x08, 0x88, 0x08, 0xa5, 0x08, 0x8a, 0x08, 0x8a, 0x08, 0xa5, 0x08, 0xa6, 0x08, 0xa7, 0x08, 0x44, 0x08, 0xa8, 0x08, 0xa8, 0x08, 0x44, 0x08, 0x45, 0x08, 0xa9, 0x08, 0xa7, 0x08, 0xaa, 0x08, 0xaa, 0x08, 0xa7, 0x08, 0xa8, 0x08, 0xab, 0x08, 0xac, 0x08, 0xad, 0x08, 0xad, 0x08, 0xac, 0x08, +0xae, 0x08, 0x63, 0x08, 0x66, 0x08, 0xaf, 0x08, 0xaf, 0x08, 0x66, 0x08, 0xb0, 0x08, 0xb0, 0x08, 0xb1, 0x08, 0xb2, 0x08, 0xb2, 0x08, 0xb1, 0x08, 0xb3, 0x08, 0xa7, 0x08, 0xa9, 0x08, 0xb4, 0x08, 0xb4, 0x08, 0xa9, 0x08, 0xb5, 0x08, 0xe8, 0x05, 0xe7, 0x05, 0xb5, 0x08, 0xb5, 0x08, 0xe7, 0x05, 0xb4, 0x08, 0xe7, 0x05, 0x74, 0x05, 0xb4, 0x08, 0xb4, 0x08, 0x74, 0x05, 0x47, 0x08, 0x44, 0x08, 0xa7, 0x08, 0x47, 0x08, 0x47, 0x08, 0xa7, 0x08, 0xb4, 0x08, 0x67, 0x08, 0x69, 0x08, 0xb1, 0x08, +0xb1, 0x08, 0x69, 0x08, 0xb6, 0x08, 0x69, 0x08, 0x9b, 0x05, 0xb6, 0x08, 0xb6, 0x08, 0x9b, 0x05, 0xea, 0x05, 0xec, 0x05, 0xb7, 0x08, 0xea, 0x05, 0xea, 0x05, 0xb7, 0x08, 0xb6, 0x08, 0xb7, 0x08, 0xb3, 0x08, 0xb6, 0x08, 0xb6, 0x08, 0xb3, 0x08, 0xb1, 0x08, 0xb8, 0x08, 0xa9, 0x08, 0xb9, 0x08, 0xb9, 0x08, 0xa9, 0x08, 0xaa, 0x08, 0xac, 0x08, 0xab, 0x08, 0xba, 0x08, 0xba, 0x08, 0xab, 0x08, 0xbb, 0x08, 0xb2, 0x08, 0xb3, 0x08, 0xbc, 0x08, 0xbc, 0x08, 0xb3, 0x08, 0xbd, 0x08, 0xf3, 0x05, +0xe8, 0x05, 0xbe, 0x08, 0xbe, 0x08, 0xe8, 0x05, 0xb5, 0x08, 0xa9, 0x08, 0xb8, 0x08, 0xb5, 0x08, 0xb5, 0x08, 0xb8, 0x08, 0xbe, 0x08, 0xb7, 0x08, 0xec, 0x05, 0xbf, 0x08, 0xbf, 0x08, 0xec, 0x05, 0xf6, 0x05, 0xb3, 0x08, 0xb7, 0x08, 0xbd, 0x08, 0xbd, 0x08, 0xb7, 0x08, 0xbf, 0x08, 0xba, 0x08, 0xbb, 0x08, 0x52, 0x08, 0x52, 0x08, 0xbb, 0x08, 0x51, 0x08, 0x86, 0x05, 0xf3, 0x05, 0x57, 0x08, 0x57, 0x08, 0xf3, 0x05, 0xbe, 0x08, 0xb8, 0x08, 0x53, 0x08, 0xbe, 0x08, 0xbe, 0x08, 0x53, 0x08, +0x57, 0x08, 0xc0, 0x08, 0xc1, 0x08, 0xc2, 0x08, 0xc2, 0x08, 0xc1, 0x08, 0xc3, 0x08, 0xc1, 0x08, 0x6e, 0x08, 0xc3, 0x08, 0xc3, 0x08, 0x6e, 0x08, 0x6c, 0x08, 0x38, 0x08, 0x4b, 0x08, 0x6c, 0x08, 0x6c, 0x08, 0x4b, 0x08, 0xc3, 0x08, 0x4b, 0x08, 0x49, 0x08, 0xc3, 0x08, 0xc3, 0x08, 0x49, 0x08, 0xc2, 0x08, 0xc4, 0x08, 0x7e, 0x08, 0xc5, 0x08, 0xc5, 0x08, 0x7e, 0x08, 0x7d, 0x08, 0x73, 0x08, 0xc6, 0x08, 0x7d, 0x08, 0x7d, 0x08, 0xc6, 0x08, 0xc5, 0x08, 0xc6, 0x08, 0x8d, 0x08, 0xc5, 0x08, +0xc5, 0x08, 0x8d, 0x08, 0x9b, 0x08, 0xa0, 0x08, 0xc4, 0x08, 0x9b, 0x08, 0x9b, 0x08, 0xc4, 0x08, 0xc5, 0x08, 0xc7, 0x08, 0x91, 0x08, 0xc8, 0x08, 0xc8, 0x08, 0x91, 0x08, 0xc9, 0x08, 0x7a, 0x08, 0xca, 0x08, 0xc9, 0x08, 0xc9, 0x08, 0xca, 0x08, 0xc8, 0x08, 0x6d, 0x08, 0x6e, 0x08, 0xcb, 0x08, 0xcb, 0x08, 0x6e, 0x08, 0xcc, 0x08, 0x83, 0x08, 0x84, 0x08, 0xcc, 0x08, 0xcc, 0x08, 0x84, 0x08, 0xcb, 0x08, 0xcd, 0x08, 0x8f, 0x08, 0xce, 0x08, 0xce, 0x08, 0x8f, 0x08, 0x8e, 0x08, 0x8d, 0x08, +0xc6, 0x08, 0x8e, 0x08, 0x8e, 0x08, 0xc6, 0x08, 0xce, 0x08, 0xc6, 0x08, 0x73, 0x08, 0xce, 0x08, 0xce, 0x08, 0x73, 0x08, 0x72, 0x08, 0x70, 0x08, 0xcd, 0x08, 0x72, 0x08, 0x72, 0x08, 0xcd, 0x08, 0xce, 0x08, 0xa2, 0x08, 0x58, 0x08, 0xa1, 0x08, 0xa1, 0x08, 0x58, 0x08, 0x5a, 0x08, 0x5d, 0x08, 0x85, 0x08, 0x5a, 0x08, 0x5a, 0x08, 0x85, 0x08, 0xa1, 0x08, 0x85, 0x08, 0x5d, 0x08, 0x82, 0x08, 0x82, 0x08, 0x5d, 0x08, 0xcf, 0x08, 0xc7, 0x08, 0x84, 0x08, 0xcf, 0x08, 0xcf, 0x08, 0x84, 0x08, +0x82, 0x08, 0x6d, 0x08, 0xca, 0x08, 0x6b, 0x08, 0x6b, 0x08, 0xca, 0x08, 0xd0, 0x08, 0x3d, 0x08, 0x37, 0x08, 0xd0, 0x08, 0xd0, 0x08, 0x37, 0x08, 0x6b, 0x08, 0x37, 0x08, 0x3d, 0x08, 0x35, 0x08, 0x35, 0x08, 0x3d, 0x08, 0x3c, 0x08, 0x3a, 0x08, 0x23, 0x08, 0x3c, 0x08, 0x3c, 0x08, 0x23, 0x08, 0x35, 0x08, 0x3a, 0x08, 0x39, 0x08, 0xd1, 0x08, 0xd1, 0x08, 0x39, 0x08, 0xd2, 0x08, 0xd3, 0x08, 0x40, 0x08, 0x3f, 0x08, 0xae, 0x08, 0xac, 0x08, 0xa8, 0x08, 0xa8, 0x08, 0xac, 0x08, 0xaa, 0x08, +0xac, 0x08, 0xba, 0x08, 0xaa, 0x08, 0xaa, 0x08, 0xba, 0x08, 0xb9, 0x08, 0xba, 0x08, 0x52, 0x08, 0xb9, 0x08, 0xb9, 0x08, 0x52, 0x08, 0x54, 0x08, 0xd4, 0x08, 0x0d, 0x06, 0xd5, 0x08, 0xd5, 0x08, 0x0d, 0x06, 0x31, 0x08, 0x0d, 0x06, 0x0e, 0x06, 0x31, 0x08, 0x31, 0x08, 0x0e, 0x06, 0x33, 0x08, 0x0e, 0x06, 0x0f, 0x06, 0x33, 0x08, 0x33, 0x08, 0x0f, 0x06, 0x48, 0x08, 0x0f, 0x06, 0x10, 0x06, 0x48, 0x08, 0x48, 0x08, 0x10, 0x06, 0x49, 0x08, 0x10, 0x06, 0x11, 0x06, 0x49, 0x08, 0x49, 0x08, +0x11, 0x06, 0xc2, 0x08, 0x12, 0x06, 0xc0, 0x08, 0x11, 0x06, 0x11, 0x06, 0xc0, 0x08, 0xc2, 0x08, 0xc0, 0x08, 0x12, 0x06, 0xd6, 0x08, 0xd6, 0x08, 0x12, 0x06, 0x14, 0x06, 0x15, 0x06, 0x96, 0x08, 0x14, 0x06, 0x14, 0x06, 0x96, 0x08, 0xd6, 0x08, 0x96, 0x08, 0x15, 0x06, 0x98, 0x08, 0x98, 0x08, 0x15, 0x06, 0x16, 0x06, 0x17, 0x06, 0x99, 0x08, 0x16, 0x06, 0x16, 0x06, 0x99, 0x08, 0x98, 0x08, 0x18, 0x06, 0xa2, 0x08, 0x17, 0x06, 0x17, 0x06, 0xa2, 0x08, 0x99, 0x08, 0x19, 0x06, 0x58, 0x08, +0x18, 0x06, 0x18, 0x06, 0x58, 0x08, 0xa2, 0x08, 0x1c, 0x06, 0x1b, 0x06, 0x59, 0x08, 0x59, 0x08, 0x1b, 0x06, 0xd7, 0x08, 0x1b, 0x06, 0x1d, 0x06, 0xd7, 0x08, 0xd7, 0x08, 0x1d, 0x06, 0xa3, 0x08, 0x1e, 0x06, 0x1f, 0x06, 0xa4, 0x08, 0xa4, 0x08, 0x1f, 0x06, 0x9e, 0x08, 0x1d, 0x06, 0x1e, 0x06, 0xa3, 0x08, 0xa3, 0x08, 0x1e, 0x06, 0xa4, 0x08, 0x1f, 0x06, 0x20, 0x06, 0x9e, 0x08, 0x9e, 0x08, 0x20, 0x06, 0x9f, 0x08, 0x20, 0x06, 0x21, 0x06, 0x9f, 0x08, 0x9f, 0x08, 0x21, 0x06, 0xa0, 0x08, +0x22, 0x06, 0x23, 0x06, 0xc4, 0x08, 0xc4, 0x08, 0x23, 0x06, 0x7e, 0x08, 0x21, 0x06, 0x22, 0x06, 0xa0, 0x08, 0xa0, 0x08, 0x22, 0x06, 0xc4, 0x08, 0x23, 0x06, 0x24, 0x06, 0x7e, 0x08, 0x7e, 0x08, 0x24, 0x06, 0x7f, 0x08, 0x24, 0x06, 0x25, 0x06, 0x7f, 0x08, 0x7f, 0x08, 0x25, 0x06, 0x80, 0x08, 0x25, 0x06, 0x48, 0x05, 0x80, 0x08, 0x80, 0x08, 0x48, 0x05, 0x20, 0x08, 0x55, 0x08, 0x4f, 0x08, 0xd8, 0x08, 0xd8, 0x08, 0x4f, 0x08, 0xd9, 0x08, 0xbd, 0x08, 0xbf, 0x08, 0xd9, 0x08, 0xd9, 0x08, +0xbf, 0x08, 0xd8, 0x08, 0xbf, 0x08, 0xf6, 0x05, 0xd8, 0x08, 0xd8, 0x08, 0xf6, 0x05, 0x28, 0x06, 0x84, 0x05, 0x55, 0x08, 0x28, 0x06, 0x28, 0x06, 0x55, 0x08, 0xd8, 0x08, 0x19, 0x06, 0x1c, 0x06, 0x58, 0x08, 0x58, 0x08, 0x1c, 0x06, 0x59, 0x08, 0xda, 0x08, 0x77, 0x08, 0xad, 0x08, 0xad, 0x08, 0x77, 0x08, 0xdb, 0x08, 0x77, 0x08, 0x63, 0x08, 0xdb, 0x08, 0xdb, 0x08, 0x63, 0x08, 0xaf, 0x08, 0xdc, 0x08, 0xdd, 0x08, 0xaf, 0x08, 0xaf, 0x08, 0xdd, 0x08, 0xdb, 0x08, 0xdd, 0x08, 0xab, 0x08, +0xdb, 0x08, 0xdb, 0x08, 0xab, 0x08, 0xad, 0x08, 0xca, 0x08, 0x7a, 0x08, 0xd0, 0x08, 0xd0, 0x08, 0x7a, 0x08, 0x79, 0x08, 0x3d, 0x08, 0xd0, 0x08, 0x4c, 0x08, 0x4c, 0x08, 0xd0, 0x08, 0x79, 0x08, 0xab, 0x08, 0xdd, 0x08, 0xbb, 0x08, 0xbb, 0x08, 0xdd, 0x08, 0xde, 0x08, 0xdd, 0x08, 0xdc, 0x08, 0xde, 0x08, 0xde, 0x08, 0xdc, 0x08, 0xdf, 0x08, 0xcd, 0x08, 0x70, 0x08, 0xe0, 0x08, 0xe0, 0x08, 0x70, 0x08, 0x75, 0x08, 0x75, 0x08, 0x7a, 0x08, 0xe0, 0x08, 0xe0, 0x08, 0x7a, 0x08, 0xc9, 0x08, +0x91, 0x08, 0x90, 0x08, 0xc9, 0x08, 0xc9, 0x08, 0x90, 0x08, 0xe0, 0x08, 0x8f, 0x08, 0xcd, 0x08, 0x90, 0x08, 0x90, 0x08, 0xcd, 0x08, 0xe0, 0x08, 0xbb, 0x08, 0xde, 0x08, 0x51, 0x08, 0x51, 0x08, 0xde, 0x08, 0xe1, 0x08, 0xdf, 0x08, 0xbc, 0x08, 0xde, 0x08, 0xde, 0x08, 0xbc, 0x08, 0xe1, 0x08, 0x5d, 0x08, 0x5c, 0x08, 0xcf, 0x08, 0xcf, 0x08, 0x5c, 0x08, 0x93, 0x08, 0x91, 0x08, 0xc7, 0x08, 0x93, 0x08, 0x93, 0x08, 0xc7, 0x08, 0xcf, 0x08, 0xd9, 0x08, 0x4f, 0x08, 0xe1, 0x08, 0xe1, 0x08, +0x4f, 0x08, 0x51, 0x08, 0xd7, 0x08, 0xa3, 0x08, 0xe2, 0x08, 0xe2, 0x08, 0xa3, 0x08, 0xa5, 0x08, 0x88, 0x08, 0x94, 0x08, 0xa5, 0x08, 0xa5, 0x08, 0x94, 0x08, 0xe2, 0x08, 0x94, 0x08, 0x5c, 0x08, 0xe2, 0x08, 0xe2, 0x08, 0x5c, 0x08, 0x5b, 0x08, 0x59, 0x08, 0xd7, 0x08, 0x5b, 0x08, 0x5b, 0x08, 0xd7, 0x08, 0xe2, 0x08, 0x53, 0x08, 0xb8, 0x08, 0x54, 0x08, 0x54, 0x08, 0xb8, 0x08, 0xb9, 0x08, 0x23, 0x08, 0x3a, 0x08, 0x21, 0x08, 0x21, 0x08, 0x3a, 0x08, 0xe3, 0x08, 0x4c, 0x08, 0x78, 0x08, +0x4d, 0x08, 0x4d, 0x08, 0x78, 0x08, 0xda, 0x08, 0x77, 0x08, 0xda, 0x08, 0x78, 0x08, 0x80, 0x08, 0x20, 0x08, 0x7b, 0x08, 0x7b, 0x08, 0x20, 0x08, 0xe4, 0x08, 0x20, 0x08, 0x1e, 0x08, 0xe4, 0x08, 0x1e, 0x08, 0x1f, 0x08, 0xe4, 0x08, 0x5f, 0x08, 0x5e, 0x08, 0xe4, 0x08, 0xe4, 0x08, 0x5e, 0x08, 0x7b, 0x08, 0xc1, 0x08, 0xc0, 0x08, 0xe5, 0x08, 0xe5, 0x08, 0xc0, 0x08, 0xd6, 0x08, 0x96, 0x08, 0x95, 0x08, 0xd6, 0x08, 0xd6, 0x08, 0x95, 0x08, 0xe5, 0x08, 0x95, 0x08, 0x83, 0x08, 0xe5, 0x08, +0xe5, 0x08, 0x83, 0x08, 0xcc, 0x08, 0x6e, 0x08, 0xc1, 0x08, 0xcc, 0x08, 0xcc, 0x08, 0xc1, 0x08, 0xe5, 0x08, 0x84, 0x08, 0xc7, 0x08, 0xcb, 0x08, 0xcb, 0x08, 0xc7, 0x08, 0xc8, 0x08, 0xca, 0x08, 0x6d, 0x08, 0xc8, 0x08, 0xc8, 0x08, 0x6d, 0x08, 0xcb, 0x08, 0x64, 0x08, 0x78, 0x08, 0x6f, 0x08, 0x6f, 0x08, 0x78, 0x08, 0x76, 0x08, 0x64, 0x08, 0x6f, 0x08, 0x60, 0x08, 0x60, 0x08, 0x6f, 0x08, 0x71, 0x08, 0xdc, 0x08, 0xb2, 0x08, 0xdf, 0x08, 0xdf, 0x08, 0xb2, 0x08, 0xbc, 0x08, 0xb2, 0x08, +0xdc, 0x08, 0xb0, 0x08, 0xb0, 0x08, 0xdc, 0x08, 0xaf, 0x08, 0xbc, 0x08, 0xbd, 0x08, 0xe1, 0x08, 0xe1, 0x08, 0xbd, 0x08, 0xd9, 0x08, 0x66, 0x08, 0x67, 0x08, 0xb0, 0x08, 0xb0, 0x08, 0x67, 0x08, 0xb1, 0x08, 0x68, 0x08, 0x67, 0x08, 0x65, 0x08, 0x65, 0x08, 0x67, 0x08, 0x66, 0x08, 0x65, 0x08, 0x19, 0x08, 0x68, 0x08, 0x68, 0x08, 0x19, 0x08, 0x1d, 0x08, 0x17, 0x08, 0x1c, 0x08, 0x19, 0x08, 0x19, 0x08, 0x1c, 0x08, 0x1d, 0x08, 0x1f, 0x08, 0x1c, 0x08, 0x62, 0x08, 0x62, 0x08, 0x1c, 0x08, +0x17, 0x08, 0xe4, 0x08, 0x1f, 0x08, 0x5f, 0x08, 0x5f, 0x08, 0x1f, 0x08, 0x62, 0x08, 0xe6, 0x08, 0xe7, 0x08, 0xe8, 0x08, 0xe8, 0x08, 0xe7, 0x08, 0x35, 0x06, 0x21, 0x07, 0xe7, 0x08, 0x15, 0x08, 0x15, 0x08, 0xe7, 0x08, 0xe9, 0x08, 0x15, 0x08, 0x14, 0x08, 0x21, 0x07, 0x21, 0x07, 0x14, 0x08, 0x20, 0x07, 0x14, 0x08, 0x1f, 0x07, 0x20, 0x07, 0x20, 0x07, 0x1f, 0x07, 0x1e, 0x07, 0x3f, 0x04, 0x42, 0x04, 0x1e, 0x07, 0x1e, 0x07, 0x42, 0x04, 0x20, 0x07, 0xea, 0x08, 0xeb, 0x08, 0xec, 0x08, +0xec, 0x08, 0xeb, 0x08, 0xed, 0x08, 0x18, 0x07, 0x13, 0x08, 0xee, 0x08, 0xee, 0x08, 0x13, 0x08, 0xed, 0x08, 0xef, 0x08, 0xf0, 0x08, 0xf1, 0x08, 0xf1, 0x08, 0xf0, 0x08, 0xf2, 0x08, 0x1c, 0x07, 0xf3, 0x08, 0x45, 0x06, 0x45, 0x06, 0xf3, 0x08, 0x43, 0x06, 0x15, 0x08, 0xe9, 0x08, 0x12, 0x08, 0x12, 0x08, 0xe9, 0x08, 0xec, 0x08, 0x18, 0x07, 0xee, 0x08, 0x17, 0x07, 0x17, 0x07, 0xee, 0x08, 0xf2, 0x08, 0x39, 0x08, 0x40, 0x08, 0xf4, 0x08, 0xf4, 0x08, 0x40, 0x08, 0xf5, 0x08, 0x29, 0x08, +0xf6, 0x08, 0x43, 0x08, 0x43, 0x08, 0xf6, 0x08, 0xf7, 0x08, 0x19, 0x07, 0xf0, 0x08, 0x1a, 0x07, 0x1a, 0x07, 0xf0, 0x08, 0xf8, 0x08, 0xf9, 0x08, 0x40, 0x08, 0xfa, 0x08, 0xfa, 0x08, 0x40, 0x08, 0x43, 0x08, 0x44, 0x04, 0x35, 0x06, 0x21, 0x07, 0x21, 0x07, 0x35, 0x06, 0xe7, 0x08, 0xfb, 0x08, 0x43, 0x06, 0xfc, 0x08, 0xfc, 0x08, 0x43, 0x06, 0xf3, 0x08, 0xfd, 0x08, 0xfe, 0x08, 0xe7, 0x08, 0xe7, 0x08, 0xfe, 0x08, 0xe9, 0x08, 0xff, 0x08, 0x00, 0x09, 0xe9, 0x08, 0xe9, 0x08, 0x00, 0x09, +0xec, 0x08, 0x13, 0x08, 0x12, 0x08, 0xed, 0x08, 0xed, 0x08, 0x12, 0x08, 0xec, 0x08, 0x01, 0x09, 0xee, 0x08, 0x02, 0x09, 0x02, 0x09, 0xee, 0x08, 0xed, 0x08, 0x03, 0x09, 0xf2, 0x08, 0x04, 0x09, 0x04, 0x09, 0xf2, 0x08, 0xee, 0x08, 0x17, 0x07, 0xf2, 0x08, 0x19, 0x07, 0x19, 0x07, 0xf2, 0x08, 0xf0, 0x08, 0x05, 0x09, 0xf8, 0x08, 0x06, 0x09, 0x06, 0x09, 0xf8, 0x08, 0xf0, 0x08, 0x07, 0x09, 0xf3, 0x08, 0x08, 0x09, 0x08, 0x09, 0xf3, 0x08, 0xf8, 0x08, 0x09, 0x09, 0xda, 0x08, 0xae, 0x08, +0xae, 0x08, 0xda, 0x08, 0xad, 0x08, 0x09, 0x09, 0xae, 0x08, 0x45, 0x08, 0x45, 0x08, 0xae, 0x08, 0xa8, 0x08, 0x09, 0x09, 0x45, 0x08, 0x0a, 0x09, 0x0a, 0x09, 0x45, 0x08, 0x42, 0x08, 0x4d, 0x08, 0xda, 0x08, 0x4e, 0x08, 0x4e, 0x08, 0xda, 0x08, 0x09, 0x09, 0x4e, 0x08, 0x09, 0x09, 0xd3, 0x08, 0xd3, 0x08, 0x09, 0x09, 0x0a, 0x09, 0x40, 0x08, 0xd3, 0x08, 0x43, 0x08, 0x43, 0x08, 0xd3, 0x08, 0x0a, 0x09, 0x43, 0x08, 0x0a, 0x09, 0x42, 0x08, 0x3e, 0x08, 0x4e, 0x08, 0x3f, 0x08, 0x3f, 0x08, +0x4e, 0x08, 0xd3, 0x08, 0x1a, 0x07, 0xf8, 0x08, 0x1c, 0x07, 0x1c, 0x07, 0xf8, 0x08, 0xf3, 0x08, 0x81, 0x06, 0x82, 0x06, 0x71, 0x06, 0x71, 0x06, 0x82, 0x06, 0x73, 0x06, 0x8e, 0x06, 0x8f, 0x06, 0x81, 0x06, 0x81, 0x06, 0x8f, 0x06, 0x82, 0x06, 0x9b, 0x06, 0x9c, 0x06, 0x8e, 0x06, 0x8e, 0x06, 0x9c, 0x06, 0x8f, 0x06, 0xa8, 0x06, 0xa9, 0x06, 0x9b, 0x06, 0x9b, 0x06, 0xa9, 0x06, 0x9c, 0x06, 0xa8, 0x06, 0xb5, 0x06, 0xa9, 0x06, 0xa9, 0x06, 0xb5, 0x06, 0x57, 0x03, 0xc1, 0x06, 0x5a, 0x03, +0xb5, 0x06, 0xb5, 0x06, 0x5a, 0x03, 0x57, 0x03, 0x08, 0x07, 0x1d, 0x07, 0x67, 0x03, 0x0e, 0x07, 0x14, 0x07, 0x1d, 0x07, 0x1d, 0x07, 0x14, 0x07, 0x1b, 0x07, 0x92, 0x04, 0x83, 0x04, 0x93, 0x04, 0x93, 0x04, 0x83, 0x04, 0x85, 0x04, 0x84, 0x04, 0x98, 0x04, 0x86, 0x04, 0x86, 0x04, 0x98, 0x04, 0x89, 0x04, 0x88, 0x04, 0x94, 0x04, 0x86, 0x04, 0x86, 0x04, 0x94, 0x04, 0x85, 0x04, 0x95, 0x04, 0x8e, 0x04, 0x93, 0x04, 0x93, 0x04, 0x8e, 0x04, 0x90, 0x04, 0x9a, 0x04, 0x87, 0x04, 0x97, 0x04, +0x97, 0x04, 0x87, 0x04, 0x89, 0x04, 0x8b, 0x04, 0x91, 0x04, 0x8d, 0x04, 0x8d, 0x04, 0x91, 0x04, 0x90, 0x04, 0x96, 0x04, 0x9c, 0x04, 0x97, 0x04, 0x97, 0x04, 0x9c, 0x04, 0x9b, 0x04, 0x8f, 0x04, 0xbe, 0x04, 0x8d, 0x04, 0x8d, 0x04, 0xbe, 0x04, 0x8c, 0x04, 0x9f, 0x04, 0x99, 0x04, 0x9e, 0x04, 0x9e, 0x04, 0x99, 0x04, 0x9b, 0x04, 0x8a, 0x04, 0x8c, 0x04, 0xba, 0x04, 0xba, 0x04, 0x8c, 0x04, 0xbb, 0x04, 0xa7, 0x04, 0xa1, 0x04, 0x9d, 0x04, 0x9d, 0x04, 0xa1, 0x04, 0x9e, 0x04, 0xb8, 0x04, +0xb9, 0x04, 0xbd, 0x04, 0xbd, 0x04, 0xb9, 0x04, 0xbb, 0x04, 0xa0, 0x04, 0xa1, 0x04, 0xa2, 0x04, 0xa2, 0x04, 0xa1, 0x04, 0xa3, 0x04, 0xbc, 0x04, 0xb9, 0x04, 0xb4, 0x04, 0xb4, 0x04, 0xb9, 0x04, 0xb5, 0x04, 0xaa, 0x04, 0xa5, 0x04, 0xa6, 0x04, 0xa6, 0x04, 0xa5, 0x04, 0xa3, 0x04, 0xb2, 0x04, 0xb3, 0x04, 0xb7, 0x04, 0xb7, 0x04, 0xb3, 0x04, 0xb5, 0x04, 0xa4, 0x04, 0xa5, 0x04, 0xab, 0x04, 0xab, 0x04, 0xa5, 0x04, 0xa9, 0x04, 0xb6, 0x04, 0xb3, 0x04, 0xae, 0x04, 0xae, 0x04, 0xb3, 0x04, +0xaf, 0x04, 0xb0, 0x04, 0xad, 0x04, 0xa8, 0x04, 0xa8, 0x04, 0xad, 0x04, 0xa9, 0x04, 0xac, 0x04, 0xad, 0x04, 0xb1, 0x04, 0xb1, 0x04, 0xad, 0x04, 0xaf, 0x04, 0x60, 0x07, 0x61, 0x07, 0x72, 0x07, 0x72, 0x07, 0x61, 0x07, 0x63, 0x07, 0x6d, 0x07, 0x6e, 0x07, 0x5e, 0x07, 0x5e, 0x07, 0x6e, 0x07, 0x5f, 0x07, 0x64, 0x07, 0x61, 0x07, 0x6f, 0x07, 0x6f, 0x07, 0x61, 0x07, 0x5f, 0x07, 0x76, 0x07, 0x73, 0x07, 0x62, 0x07, 0x62, 0x07, 0x73, 0x07, 0x63, 0x07, 0x70, 0x07, 0x6e, 0x07, 0x69, 0x07, +0x69, 0x07, 0x6e, 0x07, 0x6a, 0x07, 0x71, 0x07, 0x73, 0x07, 0x77, 0x07, 0x77, 0x07, 0x73, 0x07, 0x75, 0x07, 0x67, 0x07, 0x68, 0x07, 0x6c, 0x07, 0x6c, 0x07, 0x68, 0x07, 0x6a, 0x07, 0x7a, 0x07, 0x79, 0x07, 0x74, 0x07, 0x74, 0x07, 0x79, 0x07, 0x75, 0x07, 0x6b, 0x07, 0x68, 0x07, 0x99, 0x07, 0x99, 0x07, 0x68, 0x07, 0x66, 0x07, 0x82, 0x07, 0x78, 0x07, 0x7c, 0x07, 0x7c, 0x07, 0x78, 0x07, 0x79, 0x07, 0x65, 0x07, 0x95, 0x07, 0x66, 0x07, 0x66, 0x07, 0x95, 0x07, 0x97, 0x07, 0x7b, 0x07, +0x7d, 0x07, 0x7c, 0x07, 0x7c, 0x07, 0x7d, 0x07, 0x7f, 0x07, 0x93, 0x07, 0x98, 0x07, 0x94, 0x07, 0x94, 0x07, 0x98, 0x07, 0x97, 0x07, 0x84, 0x07, 0x81, 0x07, 0x80, 0x07, 0x80, 0x07, 0x81, 0x07, 0x7f, 0x07, 0x96, 0x07, 0x8f, 0x07, 0x94, 0x07, 0x94, 0x07, 0x8f, 0x07, 0x91, 0x07, 0x7e, 0x07, 0x86, 0x07, 0x80, 0x07, 0x80, 0x07, 0x86, 0x07, 0x85, 0x07, 0x8d, 0x07, 0x92, 0x07, 0x8e, 0x07, 0x8e, 0x07, 0x92, 0x07, 0x91, 0x07, 0x8a, 0x07, 0x83, 0x07, 0x88, 0x07, 0x88, 0x07, 0x83, 0x07, +0x85, 0x07, 0x90, 0x07, 0x89, 0x07, 0x8e, 0x07, 0x8e, 0x07, 0x89, 0x07, 0x8b, 0x07, 0x87, 0x07, 0x8c, 0x07, 0x88, 0x07, 0x88, 0x07, 0x8c, 0x07, 0x8b, 0x07, 0x63, 0x02, 0xdc, 0x02, 0x61, 0x02, 0x61, 0x02, 0xdc, 0x02, 0x0b, 0x09, 0x21, 0x02, 0xc2, 0x02, 0x1b, 0x02, 0x1b, 0x02, 0xc2, 0x02, 0xdc, 0x02, 0x0b, 0x09, 0xdc, 0x02, 0x10, 0x03, 0x10, 0x03, 0xdc, 0x02, 0xc2, 0x02, 0x9a, 0x02, 0x99, 0x02, 0x42, 0x03, 0x42, 0x03, 0x99, 0x02, 0x43, 0x03, 0xa4, 0x02, 0x41, 0x03, 0x9d, 0x02, +0x9d, 0x02, 0x41, 0x03, 0x42, 0x03, 0xa2, 0x02, 0xa0, 0x02, 0x40, 0x03, 0x40, 0x03, 0xa0, 0x02, 0x41, 0x03, 0xcd, 0x02, 0x3e, 0x03, 0xa5, 0x02, 0xa5, 0x02, 0x3e, 0x03, 0x40, 0x03, 0xcd, 0x02, 0xf7, 0x02, 0x3e, 0x03, 0x3e, 0x03, 0xf7, 0x02, 0x3f, 0x03, 0xee, 0x02, 0x3d, 0x03, 0x23, 0x03, 0x23, 0x03, 0x3d, 0x03, 0x3b, 0x03, 0x4f, 0x02, 0x39, 0x03, 0x4d, 0x02, 0x4d, 0x02, 0x39, 0x03, 0x3a, 0x03, 0xa9, 0x02, 0x39, 0x03, 0xaa, 0x02, 0xaa, 0x02, 0x39, 0x03, 0x38, 0x03, 0x60, 0x02, +0x37, 0x03, 0x52, 0x02, 0x52, 0x02, 0x37, 0x03, 0x38, 0x03, 0xb3, 0x02, 0x37, 0x03, 0xb4, 0x02, 0xb4, 0x02, 0x37, 0x03, 0x36, 0x03, 0x5e, 0x02, 0xd9, 0x02, 0x36, 0x03, 0x36, 0x03, 0xd9, 0x02, 0x35, 0x03, 0xbc, 0x02, 0xbb, 0x02, 0x34, 0x03, 0x34, 0x03, 0xbb, 0x02, 0x35, 0x03, 0x19, 0x03, 0x1b, 0x03, 0x32, 0x03, 0x32, 0x03, 0x1b, 0x03, 0x33, 0x03, 0xed, 0x06, 0xf8, 0x06, 0x61, 0x03, 0x61, 0x03, 0xf8, 0x06, 0x62, 0x03, 0xe2, 0x06, 0xed, 0x06, 0x5f, 0x03, 0x5f, 0x03, 0xed, 0x06, +0x61, 0x03, 0xd7, 0x06, 0xe2, 0x06, 0x5e, 0x03, 0x5e, 0x03, 0xe2, 0x06, 0x5f, 0x03, 0xcc, 0x06, 0xd7, 0x06, 0x5b, 0x03, 0x5b, 0x03, 0xd7, 0x06, 0x5e, 0x03, 0x64, 0x03, 0x62, 0x03, 0x00, 0x07, 0x00, 0x07, 0x62, 0x03, 0xf8, 0x06, 0x67, 0x03, 0x64, 0x03, 0x08, 0x07, 0x08, 0x07, 0x64, 0x03, 0x00, 0x07, 0x67, 0x03, 0x1d, 0x07, 0xd6, 0x01, 0xd6, 0x01, 0x1d, 0x07, 0x3d, 0x04, 0xd6, 0x01, 0x3d, 0x04, 0x95, 0x01, 0x95, 0x01, 0x3d, 0x04, 0x3e, 0x04, 0x5a, 0x03, 0xc1, 0x06, 0x5b, 0x03, +0x5b, 0x03, 0xc1, 0x06, 0xcc, 0x06, 0x0c, 0x09, 0x76, 0x06, 0x0d, 0x09, 0x0d, 0x09, 0x76, 0x06, 0x75, 0x06, 0x57, 0x03, 0xd5, 0x01, 0xa9, 0x06, 0xa9, 0x06, 0xd5, 0x01, 0xaa, 0x06, 0x0e, 0x09, 0x0d, 0x09, 0x83, 0x06, 0x83, 0x06, 0x0d, 0x09, 0x75, 0x06, 0x0f, 0x09, 0x0e, 0x09, 0x90, 0x06, 0x90, 0x06, 0x0e, 0x09, 0x83, 0x06, 0x0f, 0x09, 0x90, 0x06, 0x10, 0x09, 0x10, 0x09, 0x90, 0x06, 0x9d, 0x06, 0xb6, 0x06, 0x10, 0x09, 0xaa, 0x06, 0xaa, 0x06, 0x10, 0x09, 0x9d, 0x06, 0xbb, 0x01, +0xbc, 0x01, 0x4d, 0x03, 0x4d, 0x03, 0xbc, 0x01, 0x11, 0x09, 0x72, 0x00, 0x74, 0x00, 0xb8, 0x01, 0xb8, 0x01, 0x74, 0x00, 0xba, 0x01, 0x11, 0x04, 0x90, 0x01, 0x1a, 0x04, 0x1a, 0x04, 0x90, 0x01, 0x93, 0x01, 0x11, 0x04, 0x05, 0x04, 0x90, 0x01, 0x90, 0x01, 0x05, 0x04, 0x8e, 0x01, 0x81, 0x03, 0x80, 0x03, 0x85, 0x03, 0x85, 0x03, 0x80, 0x03, 0x84, 0x03, 0x85, 0x01, 0x86, 0x01, 0x12, 0x09, 0x12, 0x09, 0x86, 0x01, 0xbd, 0x03, 0x13, 0x09, 0x93, 0x03, 0x83, 0x03, 0x83, 0x03, 0x93, 0x03, +0x85, 0x03, 0x14, 0x09, 0xa1, 0x03, 0x13, 0x09, 0x13, 0x09, 0xa1, 0x03, 0x93, 0x03, 0x15, 0x09, 0xaf, 0x03, 0x14, 0x09, 0x14, 0x09, 0xaf, 0x03, 0xa1, 0x03, 0x12, 0x09, 0xbd, 0x03, 0x15, 0x09, 0x15, 0x09, 0xbd, 0x03, 0xaf, 0x03, 0xe1, 0x03, 0xd5, 0x03, 0x8b, 0x01, 0x8b, 0x01, 0xd5, 0x03, 0x8a, 0x01, 0x8b, 0x01, 0x8d, 0x01, 0xe1, 0x03, 0xe1, 0x03, 0x8d, 0x01, 0xed, 0x03, 0xed, 0x03, 0x8d, 0x01, 0xf9, 0x03, 0xf9, 0x03, 0x8d, 0x01, 0x8e, 0x01, 0x05, 0x04, 0xf9, 0x03, 0x8e, 0x01, +0x95, 0x01, 0x3e, 0x04, 0x16, 0x09, 0x16, 0x09, 0x93, 0x01, 0x95, 0x01, 0x1c, 0x07, 0x45, 0x06, 0x1b, 0x07, 0x1b, 0x07, 0x45, 0x06, 0x3c, 0x04, 0x3a, 0x04, 0x3c, 0x04, 0x3b, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x45, 0x06, 0x01, 0x00, 0x17, 0x09, 0x03, 0x00, 0x03, 0x00, 0x17, 0x09, 0x18, 0x09, 0x04, 0x00, 0x19, 0x09, 0x01, 0x00, 0x01, 0x00, 0x19, 0x09, 0x17, 0x09, 0x07, 0x00, 0x1a, 0x09, 0x04, 0x00, 0x04, 0x00, 0x1a, 0x09, 0x19, 0x09, 0x08, 0x00, 0x1b, 0x09, 0x07, 0x00, 0x07, 0x00, +0x1b, 0x09, 0x1a, 0x09, 0xc0, 0x00, 0xbf, 0x00, 0x1c, 0x09, 0x1c, 0x09, 0xbf, 0x00, 0x1d, 0x09, 0xc2, 0x00, 0xc1, 0x00, 0x1e, 0x09, 0x1e, 0x09, 0xc1, 0x00, 0x1f, 0x09, 0xbf, 0x00, 0xc2, 0x00, 0x1d, 0x09, 0x1d, 0x09, 0xc2, 0x00, 0x1e, 0x09, 0x03, 0x00, 0x18, 0x09, 0xc5, 0x00, 0xc5, 0x00, 0x18, 0x09, 0x20, 0x09, 0xc7, 0x00, 0xc0, 0x00, 0x21, 0x09, 0x21, 0x09, 0xc0, 0x00, 0x1c, 0x09, 0xc5, 0x00, 0x20, 0x09, 0x6b, 0x01, 0x6b, 0x01, 0x20, 0x09, 0x22, 0x09, 0x7d, 0x01, 0xc7, 0x00, +0x23, 0x09, 0x23, 0x09, 0xc7, 0x00, 0x21, 0x09, 0x6b, 0x01, 0x22, 0x09, 0xc1, 0x00, 0xc1, 0x00, 0x22, 0x09, 0x1f, 0x09, 0x1b, 0x09, 0x08, 0x00, 0x24, 0x09, 0x24, 0x09, 0x08, 0x00, 0x97, 0x01, 0x7d, 0x01, 0x23, 0x09, 0xd1, 0x01, 0xd1, 0x01, 0x23, 0x09, 0x25, 0x09, 0xda, 0x01, 0xdb, 0x01, 0x26, 0x09, 0x26, 0x09, 0xdb, 0x01, 0x27, 0x09, 0xdd, 0x01, 0xda, 0x01, 0x28, 0x09, 0x28, 0x09, 0xda, 0x01, 0x26, 0x09, 0xdf, 0x01, 0xdd, 0x01, 0x29, 0x09, 0x29, 0x09, 0xdd, 0x01, 0x28, 0x09, +0xdf, 0x01, 0x29, 0x09, 0xe1, 0x01, 0xe1, 0x01, 0x29, 0x09, 0x2a, 0x09, 0x97, 0x02, 0x2b, 0x09, 0x98, 0x02, 0x98, 0x02, 0x2b, 0x09, 0x2c, 0x09, 0x9b, 0x02, 0x2d, 0x09, 0x99, 0x02, 0x99, 0x02, 0x2d, 0x09, 0x2e, 0x09, 0x98, 0x02, 0x2c, 0x09, 0x9b, 0x02, 0x9b, 0x02, 0x2c, 0x09, 0x2d, 0x09, 0xdb, 0x01, 0x9e, 0x02, 0x27, 0x09, 0x27, 0x09, 0x9e, 0x02, 0x2f, 0x09, 0x9f, 0x02, 0x30, 0x09, 0x97, 0x02, 0x97, 0x02, 0x30, 0x09, 0x2b, 0x09, 0x9e, 0x02, 0x43, 0x03, 0x2f, 0x09, 0x2f, 0x09, +0x43, 0x03, 0x31, 0x09, 0xe1, 0x01, 0x2a, 0x09, 0x45, 0x03, 0x45, 0x03, 0x2a, 0x09, 0x32, 0x09, 0xd1, 0x01, 0x25, 0x09, 0x9f, 0x02, 0x9f, 0x02, 0x25, 0x09, 0x30, 0x09, 0x43, 0x03, 0x99, 0x02, 0x31, 0x09, 0x31, 0x09, 0x99, 0x02, 0x2e, 0x09, 0x18, 0x09, 0x17, 0x09, 0x33, 0x09, 0x17, 0x09, 0x19, 0x09, 0x33, 0x09, 0x19, 0x09, 0x1a, 0x09, 0x33, 0x09, 0x1a, 0x09, 0x1b, 0x09, 0x33, 0x09, 0x1c, 0x09, 0x1d, 0x09, 0x33, 0x09, 0x1e, 0x09, 0x1f, 0x09, 0x33, 0x09, 0x1d, 0x09, 0x1e, 0x09, +0x33, 0x09, 0x20, 0x09, 0x18, 0x09, 0x33, 0x09, 0x21, 0x09, 0x1c, 0x09, 0x33, 0x09, 0x22, 0x09, 0x20, 0x09, 0x33, 0x09, 0x23, 0x09, 0x21, 0x09, 0x33, 0x09, 0x1f, 0x09, 0x22, 0x09, 0x33, 0x09, 0x1b, 0x09, 0x24, 0x09, 0x33, 0x09, 0x24, 0x09, 0x32, 0x09, 0x33, 0x09, 0x25, 0x09, 0x23, 0x09, 0x33, 0x09, 0x26, 0x09, 0x27, 0x09, 0x33, 0x09, 0x28, 0x09, 0x26, 0x09, 0x33, 0x09, 0x29, 0x09, 0x28, 0x09, 0x33, 0x09, 0x2a, 0x09, 0x29, 0x09, 0x33, 0x09, 0x2c, 0x09, 0x2b, 0x09, 0x33, 0x09, +0x2e, 0x09, 0x2d, 0x09, 0x33, 0x09, 0x2d, 0x09, 0x2c, 0x09, 0x33, 0x09, 0x27, 0x09, 0x2f, 0x09, 0x33, 0x09, 0x2b, 0x09, 0x30, 0x09, 0x33, 0x09, 0x2f, 0x09, 0x31, 0x09, 0x33, 0x09, 0x32, 0x09, 0x2a, 0x09, 0x33, 0x09, 0x30, 0x09, 0x25, 0x09, 0x33, 0x09, 0x31, 0x09, 0x2e, 0x09, 0x33, 0x09, 0x3e, 0x04, 0x2b, 0x04, 0x16, 0x09, 0x16, 0x09, 0x2b, 0x04, 0x24, 0x04, 0x1a, 0x04, 0x93, 0x01, 0x24, 0x04, 0x24, 0x04, 0x93, 0x01, 0x16, 0x09, 0x08, 0x07, 0x0e, 0x07, 0x1d, 0x07, 0x32, 0x09, +0x24, 0x09, 0x45, 0x03, 0x45, 0x03, 0x24, 0x09, 0x97, 0x01, 0x59, 0x00, 0x34, 0x09, 0x57, 0x00, 0x57, 0x00, 0x34, 0x09, 0x35, 0x09, 0x46, 0x03, 0x44, 0x03, 0x99, 0x01, 0x99, 0x01, 0x44, 0x03, 0x98, 0x01, 0x44, 0x03, 0x45, 0x03, 0x98, 0x01, 0x98, 0x01, 0x45, 0x03, 0x97, 0x01, 0x47, 0x03, 0x46, 0x03, 0x9a, 0x01, 0x9a, 0x01, 0x46, 0x03, 0x99, 0x01, 0x47, 0x03, 0x9a, 0x01, 0x4c, 0x03, 0x4c, 0x03, 0x9a, 0x01, 0xb8, 0x01, 0x4c, 0x03, 0xb8, 0x01, 0xb9, 0x01, 0xb9, 0x01, 0xb8, 0x01, +0xba, 0x01, 0x74, 0x00, 0x82, 0x00, 0xba, 0x01, 0xba, 0x01, 0x82, 0x00, 0xbc, 0x01, 0x82, 0x00, 0x84, 0x00, 0xbc, 0x01, 0xbc, 0x01, 0x84, 0x00, 0x11, 0x09, 0x4e, 0x03, 0x36, 0x09, 0x4f, 0x03, 0x4f, 0x03, 0x36, 0x09, 0x37, 0x09, 0x4f, 0x03, 0x37, 0x09, 0x50, 0x03, 0x50, 0x03, 0x37, 0x09, 0x38, 0x09, 0x50, 0x03, 0x38, 0x09, 0x51, 0x03, 0x51, 0x03, 0x38, 0x09, 0x39, 0x09, 0x51, 0x03, 0x39, 0x09, 0x4a, 0x03, 0x4a, 0x03, 0x39, 0x09, 0x3a, 0x09, 0x4b, 0x03, 0x4a, 0x03, 0x3b, 0x09, +0x3b, 0x09, 0x4a, 0x03, 0x3a, 0x09, 0x48, 0x03, 0x4b, 0x03, 0x3c, 0x09, 0x3c, 0x09, 0x4b, 0x03, 0x3b, 0x09, 0x48, 0x03, 0x3c, 0x09, 0x49, 0x03, 0x49, 0x03, 0x3c, 0x09, 0x3d, 0x09, 0x34, 0x09, 0x59, 0x00, 0x3e, 0x09, 0x3e, 0x09, 0x59, 0x00, 0xa3, 0x00, 0x95, 0x00, 0x3f, 0x09, 0xa3, 0x00, 0xa3, 0x00, 0x3f, 0x09, 0x3e, 0x09, 0x94, 0x00, 0x40, 0x09, 0x95, 0x00, 0x95, 0x00, 0x40, 0x09, 0x3f, 0x09, 0x8d, 0x00, 0x4d, 0x00, 0xc1, 0x01, 0xc1, 0x01, 0x4d, 0x00, 0xaa, 0x01, 0x4b, 0x00, +0xa8, 0x01, 0x4d, 0x00, 0x4d, 0x00, 0xa8, 0x01, 0xaa, 0x01, 0x4e, 0x00, 0xac, 0x01, 0x4b, 0x00, 0x4b, 0x00, 0xac, 0x01, 0xa8, 0x01, 0x4e, 0x00, 0x51, 0x00, 0xac, 0x01, 0xac, 0x01, 0x51, 0x00, 0xae, 0x01, 0x51, 0x00, 0x7f, 0x01, 0xae, 0x01, 0xae, 0x01, 0x7f, 0x01, 0xcd, 0x01, 0x7f, 0x01, 0x81, 0x01, 0xcd, 0x01, 0xcd, 0x01, 0x81, 0x01, 0xcf, 0x01, 0x84, 0x01, 0xd2, 0x01, 0x81, 0x01, 0x81, 0x01, 0xd2, 0x01, 0xcf, 0x01, 0x85, 0x01, 0xd4, 0x01, 0x84, 0x01, 0x84, 0x01, 0xd4, 0x01, +0xd2, 0x01, 0x12, 0x09, 0xb6, 0x06, 0x85, 0x01, 0x85, 0x01, 0xb6, 0x06, 0xd4, 0x01, 0x15, 0x09, 0x10, 0x09, 0x12, 0x09, 0x12, 0x09, 0x10, 0x09, 0xb6, 0x06, 0x15, 0x09, 0x14, 0x09, 0x10, 0x09, 0x10, 0x09, 0x14, 0x09, 0x0f, 0x09, 0x14, 0x09, 0x13, 0x09, 0x0f, 0x09, 0x0f, 0x09, 0x13, 0x09, 0x0e, 0x09, 0x13, 0x09, 0x83, 0x03, 0x0e, 0x09, 0x0e, 0x09, 0x83, 0x03, 0x0d, 0x09, 0x83, 0x03, 0x82, 0x03, 0x0d, 0x09, 0x0d, 0x09, 0x82, 0x03, 0x0c, 0x09, 0x46, 0x04, 0x0c, 0x09, 0x82, 0x03, +0x76, 0x06, 0x0c, 0x09, 0x46, 0x04, 0x46, 0x04, 0x84, 0x03, 0x80, 0x03, 0x3e, 0x01, 0x41, 0x09, 0x40, 0x01, 0x40, 0x01, 0x41, 0x09, 0x42, 0x09, 0x44, 0x01, 0x43, 0x09, 0x42, 0x01, 0x42, 0x01, 0x43, 0x09, 0x44, 0x09, 0x42, 0x01, 0x44, 0x09, 0x3e, 0x01, 0x3e, 0x01, 0x44, 0x09, 0x41, 0x09, 0x0c, 0x01, 0x09, 0x01, 0x45, 0x09, 0x45, 0x09, 0x09, 0x01, 0x46, 0x09, 0x0a, 0x01, 0x12, 0x01, 0x47, 0x09, 0x47, 0x09, 0x12, 0x01, 0x48, 0x09, 0x09, 0x01, 0x0a, 0x01, 0x46, 0x09, 0x46, 0x09, +0x0a, 0x01, 0x47, 0x09, 0x21, 0x01, 0x0c, 0x01, 0x49, 0x09, 0x49, 0x09, 0x0c, 0x01, 0x45, 0x09, 0x40, 0x01, 0x42, 0x09, 0x13, 0x01, 0x13, 0x01, 0x42, 0x09, 0x4a, 0x09, 0x12, 0x01, 0x13, 0x01, 0x48, 0x09, 0x48, 0x09, 0x13, 0x01, 0x4a, 0x09, 0x1b, 0x01, 0x14, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x14, 0x01, 0x1e, 0x01, 0x65, 0x01, 0x4b, 0x09, 0x17, 0x01, 0x17, 0x01, 0x4b, 0x09, 0x4c, 0x09, 0x17, 0x01, 0x4c, 0x09, 0x19, 0x01, 0x19, 0x01, 0x4c, 0x09, 0x4d, 0x09, 0x1d, 0x01, 0x1e, 0x01, +0x24, 0x01, 0x24, 0x01, 0x1e, 0x01, 0x22, 0x01, 0x65, 0x01, 0x21, 0x01, 0x4b, 0x09, 0x4b, 0x09, 0x21, 0x01, 0x49, 0x09, 0x24, 0x01, 0x22, 0x01, 0x26, 0x01, 0x26, 0x01, 0x22, 0x01, 0x27, 0x01, 0x26, 0x01, 0x27, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x27, 0x01, 0x28, 0x01, 0x2c, 0x01, 0x2a, 0x01, 0x2d, 0x01, 0x2d, 0x01, 0x2a, 0x01, 0x28, 0x01, 0x3b, 0x01, 0x2c, 0x01, 0x39, 0x01, 0x39, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x36, 0x01, 0x37, 0x01, 0x4e, 0x09, 0x4e, 0x09, 0x37, 0x01, 0x4f, 0x09, +0x33, 0x01, 0x3b, 0x01, 0x2f, 0x01, 0x2f, 0x01, 0x3b, 0x01, 0x39, 0x01, 0x32, 0x01, 0x33, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x33, 0x01, 0x2f, 0x01, 0x44, 0x01, 0x36, 0x01, 0x43, 0x09, 0x43, 0x09, 0x36, 0x01, 0x4e, 0x09, 0x1c, 0x03, 0x1a, 0x03, 0x50, 0x09, 0x50, 0x09, 0x1a, 0x03, 0x51, 0x09, 0x17, 0x03, 0x18, 0x03, 0x52, 0x09, 0x52, 0x09, 0x18, 0x03, 0x53, 0x09, 0x1a, 0x03, 0x17, 0x03, 0x51, 0x09, 0x51, 0x09, 0x17, 0x03, 0x52, 0x09, 0xe2, 0x02, 0x54, 0x09, 0xe9, 0x02, 0xe9, 0x02, +0x54, 0x09, 0x55, 0x09, 0xe4, 0x02, 0x56, 0x09, 0xe0, 0x02, 0xe0, 0x02, 0x56, 0x09, 0x57, 0x09, 0xe0, 0x02, 0x57, 0x09, 0xe2, 0x02, 0xe2, 0x02, 0x57, 0x09, 0x54, 0x09, 0xf9, 0x02, 0x58, 0x09, 0xe4, 0x02, 0xe4, 0x02, 0x58, 0x09, 0x56, 0x09, 0x18, 0x03, 0xeb, 0x02, 0x53, 0x09, 0x53, 0x09, 0xeb, 0x02, 0x59, 0x09, 0xe9, 0x02, 0x55, 0x09, 0xeb, 0x02, 0xeb, 0x02, 0x55, 0x09, 0x59, 0x09, 0x3c, 0x03, 0xf0, 0x02, 0x5a, 0x09, 0x5a, 0x09, 0xf0, 0x02, 0x5b, 0x09, 0xf4, 0x02, 0xf5, 0x02, +0xec, 0x02, 0xec, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0x5b, 0x09, 0x5b, 0x09, 0xf1, 0x02, 0x5c, 0x09, 0xf5, 0x02, 0xfc, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xfc, 0x02, 0xfa, 0x02, 0x3c, 0x03, 0x5a, 0x09, 0xf9, 0x02, 0xf9, 0x02, 0x5a, 0x09, 0x58, 0x09, 0xfc, 0x02, 0xfe, 0x02, 0xfa, 0x02, 0xfa, 0x02, 0xfe, 0x02, 0xff, 0x02, 0xfe, 0x02, 0x02, 0x03, 0xff, 0x02, 0xff, 0x02, 0x02, 0x03, 0x00, 0x03, 0x04, 0x03, 0x05, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x03, 0x00, 0x03, +0x13, 0x03, 0x11, 0x03, 0x04, 0x03, 0x04, 0x03, 0x11, 0x03, 0x05, 0x03, 0x0b, 0x03, 0x06, 0x03, 0x13, 0x03, 0x13, 0x03, 0x06, 0x03, 0x11, 0x03, 0x0d, 0x03, 0x5d, 0x09, 0x0f, 0x03, 0x0f, 0x03, 0x5d, 0x09, 0x5e, 0x09, 0x09, 0x03, 0x07, 0x03, 0x0b, 0x03, 0x0b, 0x03, 0x07, 0x03, 0x06, 0x03, 0x1c, 0x03, 0x50, 0x09, 0x0d, 0x03, 0x0d, 0x03, 0x50, 0x09, 0x5d, 0x09, 0x62, 0x08, 0x17, 0x08, 0x16, 0x08, 0x3d, 0x05, 0x3c, 0x05, 0x3f, 0x05 + }; + + static byte[] k_rgNormals = + { +0x39, 0xb8, 0x44, 0xbe, 0xea, 0x3f, 0x6f, 0xbf, 0x8f, 0x52, 0x99, 0x3e, 0xc9, 0x54, 0x81, 0xbd, 0x14, 0x5e, 0x7e, 0xbf, 0x2b, 0x4c, 0xbf, 0x3d, 0x7b, 0x83, 0xef, 0xbd, 0x2b, 0xdb, 0x6b, 0xbf, 0x98, 0xdb, 0xbd, 0x3e, 0x25, 0xca, 0x1e, 0xbd, 0x93, 0x35, 0x7e, 0xbf, 0xcb, 0x68, 0xe4, 0x3d, 0xe4, 0x9e, 0xae, 0xbd, 0x00, 0x72, 0x7e, 0xbf, 0xb7, 0x7a, 0x8e, 0x3d, 0x1a, 0x34, 0x84, 0xbe, 0xe5, 0x2b, 0x71, 0xbf, 0x05, 0x32, 0x5b, 0x3e, 0x28, 0x48, 0x9c, 0xbe, 0x84, 0xb9, 0x71, 0xbf, +0x69, 0xdf, 0xfc, 0x3d, 0xf5, 0xf7, 0xd2, 0xbd, 0x76, 0x6e, 0x7e, 0xbf, 0x70, 0x20, 0x24, 0x3d, 0x83, 0xf8, 0xe0, 0xbd, 0xfe, 0x62, 0x7e, 0xbf, 0x6e, 0xd8, 0xb6, 0x3c, 0x22, 0xc6, 0xa3, 0xbe, 0xee, 0x09, 0x72, 0xbf, 0x09, 0xdf, 0x7b, 0x3d, 0x77, 0xba, 0x73, 0x3e, 0x54, 0x37, 0x4f, 0xbf, 0x0d, 0x6c, 0x09, 0x3f, 0xc5, 0x8a, 0xca, 0x3e, 0x11, 0x51, 0x54, 0xbf, 0x10, 0x02, 0xca, 0x3e, 0x26, 0xdf, 0xa4, 0x3e, 0xe4, 0x31, 0x27, 0xbf, 0xb8, 0x75, 0x2f, 0x3f, 0x34, 0x0f, 0x0c, 0x3f, +0x5d, 0x70, 0x2a, 0xbf, 0x58, 0xe2, 0x01, 0x3f, 0xfe, 0xd4, 0x68, 0x3e, 0xe7, 0x70, 0x71, 0xbf, 0xf8, 0x52, 0x78, 0x3e, 0xa5, 0xdd, 0x18, 0x3e, 0x96, 0x07, 0x6d, 0xbf, 0xea, 0xad, 0xb1, 0x3e, 0xa0, 0xff, 0x9e, 0xbe, 0x3b, 0x17, 0x52, 0xbf, 0x35, 0x95, 0xf5, 0x3e, 0xff, 0x79, 0x3a, 0xbe, 0x8c, 0x4a, 0x4a, 0xbf, 0x81, 0xcd, 0x15, 0x3f, 0x57, 0x24, 0xd6, 0xbe, 0x34, 0x65, 0x57, 0xbf, 0xa7, 0x3b, 0xaf, 0x3e, 0x6b, 0x82, 0xd0, 0xbe, 0x75, 0x04, 0x2c, 0xbf, 0x64, 0x5b, 0x1e, 0x3f, +0xfa, 0x7d, 0x0b, 0xbf, 0x46, 0x3f, 0x36, 0xbf, 0xcb, 0xd6, 0xe2, 0x3e, 0xf4, 0xfe, 0x6f, 0xbe, 0xde, 0x3b, 0x1e, 0xbf, 0xbe, 0x16, 0x40, 0x3f, 0xc4, 0xd0, 0xf2, 0xbe, 0x29, 0x7b, 0x5b, 0xbf, 0x10, 0xe8, 0x4c, 0x3e, 0x7c, 0xed, 0xf1, 0xbe, 0x00, 0x1b, 0x60, 0xbf, 0x79, 0xb1, 0xd0, 0x3d, 0x97, 0xe3, 0x19, 0xbf, 0x29, 0x25, 0x40, 0xbf, 0xa2, 0x7d, 0x8c, 0x3e, 0x4f, 0xea, 0x17, 0xbf, 0xf6, 0x9a, 0x4a, 0xbf, 0xc4, 0x22, 0x16, 0x3e, 0x86, 0x91, 0xfe, 0x3e, 0x27, 0x6b, 0x58, 0xbf, +0x96, 0xe9, 0x47, 0x3e, 0xdc, 0x83, 0x90, 0x3e, 0x7e, 0x19, 0x74, 0xbf, 0x51, 0x2f, 0xd8, 0x3d, 0x8a, 0x20, 0x2e, 0x3f, 0x49, 0xbb, 0x2d, 0xbf, 0x97, 0xe3, 0x8d, 0x3e, 0xfd, 0x15, 0xca, 0x3e, 0xa5, 0x12, 0x02, 0xbf, 0x5d, 0xfa, 0x43, 0x3f, 0x1a, 0xdc, 0x26, 0x3f, 0xe9, 0xef, 0x01, 0xbf, 0xee, 0x41, 0x10, 0x3f, 0xe8, 0x6a, 0xf3, 0x3e, 0x10, 0xe7, 0xc1, 0xbe, 0x1b, 0x48, 0x4b, 0x3f, 0x00, 0x8d, 0x3a, 0x3f, 0x78, 0x7a, 0xb5, 0xbe, 0x04, 0x01, 0x16, 0x3f, 0xfe, 0xb4, 0xf1, 0xbe, +0x95, 0x09, 0x07, 0xbf, 0x85, 0xd1, 0x34, 0x3f, 0x4d, 0x67, 0x8f, 0xbe, 0xfd, 0xfa, 0xe9, 0xbe, 0xef, 0x1e, 0x58, 0x3f, 0x56, 0x44, 0x21, 0xbf, 0x06, 0xf0, 0x16, 0xbf, 0xc7, 0x68, 0x01, 0x3f, 0x01, 0x89, 0x06, 0xbf, 0x81, 0x3d, 0xce, 0xbe, 0x0a, 0xd7, 0x3f, 0x3f, 0x66, 0x32, 0x30, 0xbf, 0xb9, 0x88, 0xf7, 0xbe, 0xea, 0x76, 0x0a, 0x3f, 0x11, 0xff, 0xb0, 0xbe, 0x41, 0xd3, 0xaa, 0xbe, 0xd7, 0x84, 0x60, 0x3f, 0x91, 0x28, 0x4c, 0x3f, 0xd0, 0xb4, 0x00, 0xbf, 0x44, 0xc3, 0xaa, 0x3e, +0x6a, 0x6d, 0x5e, 0x3f, 0x45, 0x11, 0xaa, 0xbe, 0x38, 0xf3, 0xbb, 0x3e, 0x03, 0x7c, 0x47, 0x3f, 0xa0, 0x52, 0x55, 0xbe, 0xf0, 0x51, 0x17, 0x3f, 0x0e, 0x86, 0x0e, 0x3f, 0x53, 0xeb, 0x6d, 0xbe, 0x62, 0x2b, 0x4c, 0x3f, 0xf5, 0x85, 0x1c, 0x3f, 0xe4, 0x13, 0xb2, 0xbd, 0x0c, 0x59, 0x49, 0x3f, 0x61, 0x54, 0x4e, 0x3f, 0xf3, 0xc8, 0x9f, 0xbd, 0x9b, 0x37, 0x16, 0x3f, 0x0d, 0xa9, 0x66, 0x3f, 0xe8, 0x4f, 0x4b, 0xbe, 0x75, 0x77, 0xc5, 0x3e, 0x5a, 0xb7, 0x69, 0x3f, 0x2f, 0xfb, 0x95, 0xbd, +0x26, 0x89, 0xcd, 0x3e, 0xe2, 0x59, 0x16, 0x3f, 0xa6, 0x44, 0xa2, 0x3e, 0xa0, 0xa6, 0x3e, 0x3f, 0x11, 0x55, 0x20, 0x3f, 0x1b, 0xf4, 0xe5, 0x3d, 0x13, 0x7e, 0x45, 0x3f, 0x02, 0x7f, 0x44, 0x3f, 0xe2, 0xb1, 0x97, 0x3e, 0xf1, 0x81, 0x11, 0x3f, 0xbe, 0xbe, 0x4e, 0x3f, 0x05, 0x34, 0xd1, 0x3d, 0x8e, 0xb0, 0x14, 0x3f, 0xee, 0xec, 0x67, 0x3f, 0x0b, 0xeb, 0xc6, 0x3d, 0x5d, 0xfb, 0xd2, 0x3e, 0xf3, 0x74, 0x5e, 0x3f, 0x0e, 0xda, 0x8b, 0x3e, 0x56, 0x46, 0xd3, 0x3e, 0x99, 0xf3, 0xbc, 0x3e, +0x0a, 0x0f, 0x2a, 0x3f, 0x73, 0x67, 0x26, 0x3f, 0x6d, 0x1e, 0xff, 0x3e, 0xcc, 0x9a, 0x00, 0x3f, 0xe2, 0xe6, 0x34, 0x3f, 0xd5, 0x97, 0x15, 0x3f, 0x1a, 0x14, 0x19, 0x3f, 0x08, 0x72, 0x0c, 0x3f, 0x89, 0x5f, 0x31, 0x3f, 0x5d, 0x16, 0xeb, 0x3e, 0xd6, 0x54, 0x0e, 0x3f, 0x29, 0x25, 0x50, 0x3f, 0xbd, 0x8a, 0xd4, 0x3e, 0xbe, 0xfa, 0xd0, 0x3e, 0x02, 0x49, 0x40, 0x3f, 0xf8, 0xde, 0x03, 0x3f, 0x51, 0x66, 0xd3, 0x3e, 0x00, 0xfb, 0x48, 0x3e, 0xa8, 0x55, 0x44, 0x3f, 0xfd, 0x68, 0x1c, 0x3f, +0xe2, 0x3e, 0x8a, 0x3e, 0x8f, 0x31, 0x37, 0x3f, 0x25, 0xeb, 0x24, 0x3f, 0x03, 0x04, 0xc3, 0x3e, 0xd1, 0x1e, 0x3b, 0x3f, 0x6a, 0xf6, 0x10, 0x3f, 0x00, 0x70, 0xf4, 0x3e, 0x88, 0x0f, 0x2c, 0x3f, 0x54, 0xe4, 0x10, 0x3f, 0xe0, 0x65, 0x2a, 0x3f, 0x8d, 0x24, 0x1d, 0x3f, 0x40, 0x51, 0xd9, 0x3e, 0xb6, 0x62, 0x0f, 0x3f, 0x1b, 0x83, 0x36, 0x3f, 0x96, 0x04, 0xd8, 0x3e, 0x93, 0xa6, 0x11, 0xbe, 0x2c, 0x81, 0x64, 0x3f, 0xed, 0x0c, 0xdb, 0x3e, 0x2f, 0x69, 0xec, 0xbd, 0xbe, 0x4b, 0x4d, 0x3f, +0xdc, 0x0d, 0x16, 0x3f, 0xfb, 0x23, 0x3c, 0xbe, 0xad, 0xbe, 0x66, 0x3f, 0xea, 0xcd, 0xc8, 0x3e, 0xd4, 0x46, 0x15, 0xbe, 0xd4, 0xb9, 0x52, 0x3f, 0xd4, 0x7d, 0x0c, 0x3f, 0x79, 0xb2, 0x4b, 0xbe, 0xfc, 0xc1, 0x70, 0x3f, 0xcd, 0x1d, 0x8d, 0x3e, 0x3e, 0xb1, 0x2e, 0xbe, 0x62, 0x65, 0x64, 0x3f, 0xd1, 0x23, 0xd6, 0x3e, 0x94, 0xda, 0xab, 0xbd, 0xa9, 0xdc, 0x48, 0x3f, 0x31, 0x41, 0x1d, 0x3f, 0xcd, 0x94, 0xd6, 0xbd, 0xb7, 0x40, 0x56, 0x3f, 0x9d, 0x85, 0x09, 0x3f, 0x3f, 0xfb, 0x91, 0xbd, +0x30, 0x47, 0x43, 0x3f, 0x23, 0x87, 0x24, 0x3f, 0x58, 0xaa, 0x1b, 0xbe, 0x59, 0xc2, 0x76, 0x3f, 0xd8, 0xd6, 0x5f, 0x3e, 0x97, 0x3b, 0x33, 0xbd, 0x84, 0xd7, 0x7e, 0x3f, 0xf9, 0xba, 0xac, 0x3d, 0xaf, 0x7b, 0xab, 0xbd, 0xf9, 0x49, 0x75, 0x3f, 0xd9, 0x23, 0x8c, 0x3e, 0xd8, 0x25, 0xea, 0x3d, 0x32, 0xaf, 0x7b, 0x3f, 0x97, 0x1d, 0x12, 0x3e, 0xe2, 0x5a, 0x1d, 0xbe, 0x59, 0xa1, 0x7c, 0x3f, 0x22, 0x6e, 0x4e, 0x3d, 0x2f, 0x17, 0x41, 0xbe, 0xaf, 0x99, 0x78, 0x3f, 0x77, 0xdb, 0x15, 0x3e, +0x06, 0x46, 0x8e, 0xbe, 0xc3, 0x81, 0x74, 0x3f, 0xa4, 0x6f, 0xd2, 0x3d, 0x39, 0x9b, 0x8e, 0xbe, 0x14, 0xb4, 0x75, 0x3f, 0xaf, 0x95, 0x10, 0x3d, 0x09, 0x4f, 0x88, 0xbe, 0x72, 0xa6, 0x71, 0x3f, 0xcf, 0xd8, 0x47, 0x3e, 0x84, 0x2a, 0xfd, 0xbe, 0xe9, 0x61, 0x24, 0x3f, 0x6e, 0xf8, 0x15, 0x3f, 0xe4, 0x4a, 0xfd, 0xbd, 0x77, 0x81, 0x3e, 0x3f, 0x0b, 0x0d, 0x28, 0x3f, 0x8c, 0xa0, 0x05, 0xbf, 0xf4, 0xdc, 0x46, 0x3f, 0x91, 0x5e, 0xb4, 0x3e, 0xa6, 0x26, 0xc1, 0xbd, 0xa5, 0x6a, 0x6b, 0x3f, +0xfa, 0x43, 0xc3, 0x3e, 0xa6, 0x26, 0xc1, 0xbd, 0xa5, 0x6a, 0x6b, 0x3f, 0xfa, 0x43, 0xc3, 0x3e, 0xe4, 0x4a, 0xfd, 0xbd, 0x77, 0x81, 0x3e, 0x3f, 0x0b, 0x0d, 0x28, 0x3f, 0x84, 0xbb, 0xb3, 0x3e, 0x4c, 0xc6, 0x5d, 0x3f, 0x24, 0xf2, 0xb5, 0x3e, 0x7b, 0x2e, 0x93, 0x3e, 0x6e, 0xa3, 0x39, 0x3f, 0xfd, 0x2e, 0x20, 0x3f, 0xac, 0xe5, 0xae, 0xbd, 0xae, 0xbc, 0x28, 0x3f, 0x45, 0x46, 0x3f, 0x3f, 0xaa, 0x63, 0x65, 0x3e, 0x53, 0x97, 0x30, 0x3f, 0x2d, 0x3f, 0x30, 0x3f, 0xac, 0xe5, 0xae, 0xbd, +0xae, 0xbc, 0x28, 0x3f, 0x45, 0x46, 0x3f, 0x3f, 0x93, 0xa9, 0xd2, 0xbe, 0x13, 0x9e, 0x10, 0x3f, 0xb0, 0x1a, 0x37, 0x3f, 0xe5, 0x7c, 0x65, 0xbf, 0xd1, 0xcc, 0x9b, 0x3e, 0x90, 0xf5, 0xa4, 0x3e, 0x0e, 0x87, 0x41, 0xbf, 0x3a, 0xad, 0xf3, 0x3e, 0x0c, 0x1e, 0xe6, 0x3e, 0xcc, 0x09, 0x6e, 0xbf, 0xa1, 0x65, 0x9d, 0x3e, 0xb1, 0x16, 0x4f, 0x3e, 0x77, 0xd7, 0x4d, 0xbf, 0x38, 0xbe, 0x06, 0x3f, 0x65, 0x8e, 0x8d, 0x3e, 0x87, 0xc3, 0x26, 0xbf, 0xb7, 0x43, 0xdb, 0x3e, 0x43, 0x55, 0x20, 0x3f, +0x27, 0x16, 0x50, 0xbf, 0x42, 0xb1, 0x85, 0x3e, 0x9d, 0x4b, 0x05, 0x3f, 0x77, 0x69, 0x33, 0xbf, 0xe8, 0xf6, 0x12, 0x3e, 0xd2, 0xe0, 0x32, 0x3f, 0xc6, 0x6a, 0x07, 0xbf, 0xfc, 0x19, 0xae, 0x3e, 0x78, 0x0c, 0x47, 0x3f, 0x2e, 0xaa, 0xa5, 0xbe, 0xc6, 0x6c, 0x01, 0x3f, 0xf0, 0xc0, 0x4c, 0x3f, 0x5a, 0x0d, 0x89, 0xbe, 0x30, 0x12, 0xd2, 0x3e, 0x2c, 0x2d, 0x5f, 0x3f, 0x99, 0xf3, 0xc4, 0xbe, 0xb6, 0xf6, 0x5e, 0x3e, 0x1f, 0xa2, 0x65, 0x3f, 0x1e, 0x6d, 0x04, 0xbf, 0x7e, 0xc4, 0xaf, 0xbc, +0xbc, 0x04, 0x5b, 0x3f, 0x19, 0x02, 0x34, 0xbf, 0x36, 0x3c, 0x3d, 0xbe, 0xf4, 0xc4, 0x2f, 0x3f, 0x3d, 0x65, 0x4d, 0xbf, 0x79, 0x94, 0x0a, 0xbd, 0xac, 0x8e, 0x18, 0x3f, 0x19, 0x59, 0x4e, 0xbf, 0x2c, 0xbb, 0x88, 0xbe, 0x8b, 0x36, 0x07, 0x3f, 0x2b, 0xbf, 0x60, 0xbf, 0x6e, 0xfa, 0x13, 0xbe, 0x45, 0xb8, 0xe9, 0x3e, 0xc0, 0x04, 0x6e, 0xbf, 0x95, 0x26, 0x25, 0xbb, 0x13, 0x7f, 0xbc, 0x3e, 0xb8, 0xaa, 0x64, 0xbf, 0x8d, 0x61, 0xee, 0x3d, 0x08, 0x59, 0xde, 0x3e, 0x72, 0x87, 0x31, 0xbf, +0x88, 0xd6, 0x22, 0xbf, 0x0c, 0x3e, 0xad, 0x3e, 0x53, 0x93, 0x34, 0xbf, 0x2c, 0x0e, 0x2f, 0xbf, 0x30, 0x2c, 0x3f, 0x3e, 0xb2, 0x80, 0x41, 0xbf, 0x22, 0x51, 0x08, 0xbf, 0xf6, 0x0a, 0xc3, 0x3e, 0x70, 0xea, 0x4b, 0xbf, 0x18, 0x05, 0x11, 0xbf, 0xb2, 0x47, 0x58, 0x3e, 0xce, 0x8c, 0x9e, 0xbd, 0x66, 0x4b, 0x76, 0xbe, 0x6c, 0xb1, 0x77, 0x3f, 0x04, 0xe8, 0xb7, 0xbd, 0xd3, 0xf4, 0x09, 0xbe, 0x51, 0x9f, 0x7c, 0x3f, 0xf9, 0xd8, 0x0d, 0xbe, 0x7f, 0xbd, 0x62, 0xbe, 0x2e, 0x1d, 0x77, 0x3f, +0xdb, 0x87, 0x2c, 0xbe, 0xc6, 0x87, 0xf9, 0xbd, 0xb6, 0x67, 0x7a, 0x3f, 0xcc, 0x7f, 0xe8, 0xbd, 0xb2, 0x82, 0x1f, 0xbd, 0x4e, 0x26, 0x7e, 0x3f, 0xea, 0xb2, 0x48, 0xbe, 0xfe, 0x42, 0x8f, 0xbc, 0xb5, 0xfe, 0x7a, 0x3f, 0x74, 0x29, 0x1a, 0xbf, 0x9b, 0xe3, 0x94, 0xbe, 0x36, 0x56, 0x3e, 0x3f, 0x7b, 0x10, 0x3e, 0xbf, 0x1b, 0xf2, 0xbf, 0xbe, 0x21, 0x21, 0x0e, 0x3f, 0x19, 0x02, 0x34, 0xbf, 0x36, 0x3c, 0x3d, 0xbe, 0xf4, 0xc4, 0x2f, 0x3f, 0x19, 0x59, 0x4e, 0xbf, 0x2c, 0xbb, 0x88, 0xbe, +0x8b, 0x36, 0x07, 0x3f, 0x1e, 0x6d, 0x04, 0xbf, 0x7e, 0xc4, 0xaf, 0xbc, 0xbc, 0x04, 0x5b, 0x3f, 0x6e, 0xa7, 0xdd, 0xbe, 0x8f, 0x18, 0x4d, 0xbe, 0xa8, 0xff, 0x60, 0x3f, 0x33, 0x6f, 0x51, 0xbf, 0x7d, 0xeb, 0xd3, 0xbe, 0xa9, 0x68, 0xcc, 0x3e, 0xe6, 0x3a, 0x61, 0xbf, 0x93, 0xe3, 0xd6, 0xbe, 0xd0, 0x7e, 0x64, 0x3e, 0x65, 0x19, 0x62, 0xbf, 0xa8, 0xfe, 0x91, 0xbe, 0x94, 0xa5, 0xbe, 0x3e, 0x01, 0xbd, 0x70, 0xbf, 0xe0, 0xd9, 0x86, 0xbe, 0x14, 0x5c, 0x5c, 0x3e, 0x0a, 0x29, 0xff, 0xbd, +0x94, 0x4e, 0xa4, 0x3d, 0x6b, 0x2c, 0x7d, 0x3f, 0xac, 0x52, 0xfa, 0xbd, 0x4f, 0x3c, 0x37, 0x3e, 0xbc, 0xea, 0x79, 0x3f, 0x43, 0x3c, 0x52, 0xbe, 0x3c, 0xf4, 0xbd, 0x3d, 0x44, 0x6b, 0x79, 0x3f, 0xae, 0xb8, 0x48, 0xbe, 0xbf, 0x7c, 0x42, 0x3e, 0xaa, 0x47, 0x76, 0x3f, 0x46, 0x79, 0x86, 0xbd, 0x5d, 0x51, 0x36, 0x3f, 0x7d, 0xec, 0x32, 0x3f, 0x0b, 0xb3, 0xb0, 0xbd, 0xe4, 0x83, 0x2a, 0x3f, 0x2e, 0xaa, 0x3d, 0x3f, 0x4e, 0x28, 0x44, 0xbd, 0x35, 0x61, 0x47, 0x3f, 0xac, 0x1a, 0x20, 0x3f, +0x4d, 0x9f, 0x5d, 0xbd, 0xe6, 0x94, 0x3c, 0x3f, 0x68, 0x92, 0x2c, 0x3f, 0x6b, 0x9a, 0xa7, 0x3e, 0x9f, 0x1e, 0x6b, 0x3f, 0x27, 0x68, 0x63, 0x3e, 0xca, 0xa6, 0x1c, 0x3d, 0xd6, 0x6f, 0x72, 0x3f, 0xd0, 0x45, 0xa3, 0x3e, 0xe3, 0x1b, 0x8a, 0xbd, 0xa2, 0x7c, 0x69, 0x3f, 0xdf, 0x17, 0xcf, 0x3e, 0xe3, 0x1b, 0x8a, 0xbd, 0xa2, 0x7c, 0x69, 0x3f, 0xdf, 0x17, 0xcf, 0x3e, 0xca, 0xa6, 0x1c, 0x3d, 0xd6, 0x6f, 0x72, 0x3f, 0xd0, 0x45, 0xa3, 0x3e, 0x87, 0x34, 0xaa, 0x3c, 0x1a, 0x33, 0x5d, 0x3f, +0xdb, 0xc1, 0x00, 0x3f, 0x43, 0x1e, 0x99, 0x3e, 0x9f, 0x3a, 0x5e, 0x3f, 0x87, 0xde, 0xca, 0x3e, 0x6b, 0x9a, 0xa7, 0x3e, 0x9f, 0x1e, 0x6b, 0x3f, 0x27, 0x68, 0x63, 0x3e, 0xa9, 0xdb, 0x19, 0x3f, 0xdc, 0xf4, 0x3f, 0x3f, 0x09, 0xa7, 0x8d, 0x3e, 0xf5, 0x10, 0xcd, 0x3d, 0x8a, 0xac, 0x49, 0x3f, 0xa3, 0x95, 0x1b, 0x3f, 0x77, 0x31, 0x0d, 0x3e, 0xfc, 0xfb, 0x4c, 0x3f, 0x79, 0x3c, 0x15, 0x3f, 0x32, 0xc9, 0x80, 0x3e, 0x7f, 0x31, 0x4b, 0x3f, 0x11, 0xc8, 0x0d, 0x3f, 0xad, 0x18, 0x96, 0x3e, +0x03, 0x60, 0x48, 0x3f, 0x2e, 0x8c, 0x0c, 0x3f, 0x87, 0x6a, 0x0a, 0x3d, 0x52, 0xb8, 0x42, 0x3f, 0xb6, 0xf7, 0x25, 0x3f, 0xba, 0x30, 0x52, 0x3c, 0xc2, 0xf7, 0x4a, 0x3f, 0x7f, 0xfa, 0x1b, 0x3f, 0x94, 0xa0, 0xbf, 0xba, 0x2f, 0x50, 0x4e, 0x3f, 0x9b, 0x8f, 0x17, 0x3f, 0x66, 0xbd, 0xf0, 0x3e, 0x4e, 0x43, 0x48, 0x3f, 0xf0, 0x34, 0xd1, 0x3e, 0xd4, 0x2c, 0xd0, 0x3e, 0x66, 0xf9, 0x52, 0x3f, 0x60, 0xe8, 0xc9, 0x3e, 0xf3, 0x90, 0x69, 0xbe, 0x2a, 0x6f, 0x6b, 0x3f, 0x2e, 0xac, 0xa3, 0x3e, +0x50, 0xc6, 0x18, 0xbe, 0x0c, 0x90, 0x60, 0x3f, 0x04, 0xa8, 0xe9, 0x3e, 0xfd, 0x4e, 0x63, 0x3e, 0x9b, 0x90, 0x46, 0x3f, 0xd0, 0x41, 0x17, 0x3f, 0x66, 0x4d, 0xf4, 0x3e, 0x91, 0x09, 0x38, 0x3f, 0x55, 0x67, 0x01, 0x3f, 0xba, 0x68, 0x24, 0x3f, 0xb0, 0xe3, 0x33, 0x3f, 0x43, 0xc9, 0x9c, 0x3e, 0x65, 0x19, 0x62, 0xbf, 0xa8, 0xfe, 0x91, 0xbe, 0x94, 0xa5, 0xbe, 0x3e, 0xe6, 0x23, 0x71, 0xbf, 0xd7, 0xa4, 0x1b, 0xbe, 0x5f, 0x46, 0x99, 0x3e, 0x01, 0xbd, 0x70, 0xbf, 0xe0, 0xd9, 0x86, 0xbe, +0x14, 0x5c, 0x5c, 0x3e, 0x7f, 0x2e, 0x7a, 0xbf, 0xb7, 0xf1, 0xc7, 0xbd, 0xa3, 0xaf, 0x40, 0x3e, 0x19, 0x3c, 0x78, 0xbf, 0xa9, 0x2e, 0xe0, 0x3c, 0x34, 0xb9, 0x78, 0x3e, 0x61, 0xf9, 0x7b, 0xbf, 0x55, 0x4c, 0x85, 0x3d, 0x49, 0x29, 0x28, 0x3e, 0x3f, 0xc7, 0xa7, 0xbd, 0xb2, 0x2b, 0x29, 0x3f, 0x97, 0xfd, 0x3e, 0x3f, 0xd2, 0x50, 0x13, 0xbe, 0x80, 0xb9, 0x22, 0x3f, 0x6f, 0x2a, 0x42, 0x3f, 0xd2, 0x50, 0x13, 0xbe, 0x80, 0xb9, 0x22, 0x3f, 0x6f, 0x2a, 0x42, 0x3f, 0x3f, 0xc7, 0xa7, 0xbd, +0xb2, 0x2b, 0x29, 0x3f, 0x97, 0xfd, 0x3e, 0x3f, 0xe0, 0x64, 0x73, 0xbf, 0x8b, 0x51, 0x37, 0x3e, 0x7a, 0x89, 0x81, 0x3e, 0x49, 0x2d, 0x78, 0xbf, 0x7d, 0xea, 0x38, 0x3e, 0xd9, 0x0a, 0x2a, 0x3e, 0x4d, 0x13, 0xde, 0x3e, 0x2f, 0x8a, 0x4a, 0x3f, 0xe3, 0xc3, 0xdc, 0x3e, 0xad, 0xbe, 0x92, 0x3e, 0x2b, 0x12, 0x3b, 0x3f, 0x02, 0x9c, 0x1e, 0x3f, 0x2d, 0xcc, 0x22, 0x3f, 0xcd, 0xaa, 0xff, 0x3e, 0x27, 0xa3, 0x16, 0x3f, 0xf3, 0x04, 0xd2, 0x3e, 0x39, 0xee, 0xd4, 0x3e, 0x9f, 0xc8, 0x4f, 0x3f, +0xa7, 0x92, 0x81, 0xbd, 0x99, 0xf3, 0x3c, 0x3f, 0x4d, 0xf6, 0x2b, 0x3f, 0x8a, 0x1c, 0x72, 0xbe, 0xea, 0x07, 0x49, 0x3f, 0x24, 0x7d, 0x12, 0x3f, 0x7e, 0x6d, 0xfd, 0xbc, 0xb8, 0x03, 0x55, 0x3f, 0x97, 0xc4, 0x0d, 0x3f, 0x7c, 0xb6, 0xb6, 0xbe, 0x64, 0xe6, 0xba, 0x3e, 0x3a, 0x21, 0x5c, 0x3f, 0x40, 0xa2, 0xc9, 0xbd, 0x24, 0x42, 0xbb, 0x3e, 0x3d, 0xed, 0x6c, 0x3f, 0x7c, 0x80, 0xee, 0x3d, 0xe4, 0x4b, 0x34, 0x3f, 0x0f, 0x47, 0x33, 0x3f, 0xd7, 0x33, 0x24, 0x3e, 0x8e, 0x20, 0xbd, 0x3e, +0x65, 0x53, 0x6a, 0x3f, 0x22, 0xc3, 0xc2, 0xbe, 0xf7, 0x70, 0x51, 0x3f, 0xd5, 0xca, 0xdc, 0x3e, 0xa7, 0x75, 0xfb, 0xbe, 0xd8, 0xd3, 0x52, 0x3f, 0xf4, 0x52, 0x91, 0x3e, 0x6c, 0x7a, 0x4c, 0xbf, 0xea, 0x7a, 0x9a, 0x3e, 0xe5, 0x42, 0x05, 0x3f, 0x8c, 0x62, 0x19, 0xbf, 0x0d, 0xa5, 0xae, 0x3e, 0xd2, 0x6d, 0x39, 0x3f, 0xe8, 0xdb, 0x42, 0x3d, 0x44, 0x19, 0x7e, 0xbf, 0x6e, 0x4e, 0xe5, 0x3d, 0x78, 0x09, 0x8e, 0x3d, 0x37, 0xa7, 0x7e, 0xbf, 0x44, 0x6a, 0x9a, 0x3d, 0x96, 0x75, 0x7f, 0x3c, +0x30, 0x9e, 0x7d, 0xbf, 0x65, 0x72, 0x0a, 0x3e, 0x20, 0x7f, 0xe9, 0x3c, 0x9d, 0xbb, 0x7d, 0xbf, 0x3e, 0xce, 0x04, 0x3e, 0x84, 0xef, 0x3d, 0x3d, 0x14, 0xe8, 0x67, 0xbf, 0x4c, 0x8a, 0xd7, 0x3e, 0x7b, 0xf2, 0xb0, 0x3d, 0xa0, 0x4e, 0x69, 0xbf, 0xcc, 0x0d, 0xce, 0x3e, 0xbb, 0x5e, 0x9a, 0xbc, 0xd5, 0xec, 0x7d, 0xbf, 0x71, 0xab, 0x00, 0x3e, 0xfd, 0xbc, 0x69, 0xbd, 0xa3, 0xe9, 0x68, 0xbf, 0x29, 0x78, 0xd2, 0x3e, 0x9a, 0xb2, 0xb3, 0x3d, 0x20, 0xea, 0x7e, 0xbf, 0x3e, 0x41, 0xe2, 0x3c, +0xe5, 0x2b, 0x01, 0x3e, 0x3f, 0x8d, 0x47, 0xbf, 0xfd, 0x12, 0x1d, 0x3f, 0x77, 0x86, 0x89, 0x3d, 0xff, 0xb3, 0x42, 0xbf, 0x4c, 0x52, 0x25, 0x3f, 0x2b, 0x68, 0x9a, 0x3d, 0x33, 0xa7, 0x13, 0xbf, 0x4b, 0x3c, 0x50, 0x3f, 0xf1, 0x66, 0x1d, 0x3e, 0xc6, 0xa4, 0x1b, 0xbf, 0xd3, 0x67, 0x47, 0x3f, 0x43, 0x91, 0xae, 0xbd, 0x8e, 0x93, 0x42, 0xbf, 0x85, 0xec, 0x24, 0x3f, 0x6a, 0x14, 0xd2, 0xbd, 0x90, 0xf5, 0x10, 0xbf, 0x1c, 0x5d, 0x51, 0x3f, 0x7c, 0xb4, 0x38, 0x3d, 0x12, 0x2d, 0x69, 0xbe, +0xd2, 0x01, 0x79, 0x3f, 0x6f, 0x0c, 0x41, 0x3d, 0xd9, 0x22, 0x09, 0xbe, 0x1e, 0x68, 0x7d, 0x3f, 0xc4, 0xed, 0xd0, 0x3b, 0x29, 0x91, 0x74, 0xbe, 0x03, 0x96, 0x78, 0x3f, 0x5b, 0x5e, 0xb9, 0x3b, 0x9d, 0xba, 0x22, 0xbe, 0x1f, 0xbe, 0x7c, 0x3f, 0x0f, 0x27, 0x70, 0x3d, 0xb1, 0x6f, 0x27, 0xbd, 0x5c, 0x58, 0x7f, 0x3f, 0x38, 0xf8, 0x42, 0x3b, 0x74, 0x42, 0x68, 0xbd, 0x4a, 0x96, 0x7f, 0x3f, 0x6f, 0x0c, 0x41, 0x3d, 0xd9, 0x22, 0x09, 0xbe, 0x1e, 0x68, 0x7d, 0x3f, 0xc0, 0xb2, 0x02, 0x3e, +0xed, 0x28, 0xee, 0xbd, 0xa6, 0x27, 0x7c, 0x3f, 0x0f, 0x27, 0x70, 0x3d, 0xb1, 0x6f, 0x27, 0xbd, 0x5c, 0x58, 0x7f, 0x3f, 0x07, 0xef, 0x1b, 0x3e, 0xf5, 0xbe, 0x71, 0xbc, 0x72, 0xfc, 0x7c, 0x3f, 0x56, 0x11, 0xce, 0x3d, 0x76, 0x15, 0x52, 0xbe, 0x1d, 0x3a, 0x79, 0x3f, 0x7c, 0xb4, 0x38, 0x3d, 0x12, 0x2d, 0x69, 0xbe, 0xd2, 0x01, 0x79, 0x3f, 0xf9, 0xd7, 0x72, 0x3d, 0x30, 0x9c, 0x8b, 0x3d, 0x06, 0xf4, 0x7e, 0x3f, 0x29, 0x05, 0xdd, 0xbb, 0x42, 0x5a, 0x63, 0x3d, 0x80, 0x99, 0x7f, 0x3f, +0x0f, 0x9c, 0xb3, 0xbc, 0xe9, 0xf2, 0x26, 0x3e, 0x23, 0x83, 0x7c, 0x3f, 0x58, 0x1c, 0x4e, 0x3d, 0x06, 0xf6, 0x38, 0x3e, 0xa7, 0x75, 0x7b, 0x3f, 0x58, 0x1c, 0x4e, 0x3d, 0x06, 0xf6, 0x38, 0x3e, 0xa7, 0x75, 0x7b, 0x3f, 0xf9, 0xd7, 0x72, 0x3d, 0x30, 0x9c, 0x8b, 0x3d, 0x06, 0xf4, 0x7e, 0x3f, 0x57, 0xec, 0x1f, 0x3e, 0x99, 0xf2, 0x61, 0x3e, 0xf7, 0x77, 0x76, 0x3f, 0x69, 0xaa, 0x27, 0x3e, 0xb0, 0xe4, 0xca, 0x3d, 0xb3, 0x44, 0x7b, 0x3f, 0x7e, 0x71, 0xa9, 0x3c, 0x30, 0xbc, 0xa2, 0x3e, +0xc1, 0xaa, 0x72, 0x3f, 0x15, 0x01, 0x4e, 0xbd, 0x91, 0x2a, 0xa2, 0x3e, 0x74, 0x7a, 0x72, 0x3f, 0x65, 0xfe, 0xb1, 0xbd, 0x38, 0xd6, 0x05, 0x3f, 0x72, 0x17, 0x59, 0x3f, 0xbb, 0x2a, 0xd0, 0xbc, 0xb4, 0xaf, 0x08, 0x3f, 0x7d, 0x5b, 0x58, 0x3f, 0xbb, 0x2a, 0xd0, 0xbc, 0xb4, 0xaf, 0x08, 0x3f, 0x7d, 0x5b, 0x58, 0x3f, 0x7e, 0x71, 0xa9, 0x3c, 0x30, 0xbc, 0xa2, 0x3e, 0xc1, 0xaa, 0x72, 0x3f, 0xa9, 0x4f, 0x92, 0x3d, 0xce, 0x1a, 0x04, 0x3f, 0x7b, 0x84, 0x5a, 0x3f, 0xfc, 0xc7, 0x02, 0x3e, +0x9e, 0xb6, 0xb6, 0x3e, 0x08, 0xe6, 0x6c, 0x3f, 0xfc, 0x55, 0xa0, 0x3d, 0x3b, 0xc6, 0x3d, 0x3f, 0x61, 0xa5, 0x2a, 0x3f, 0xc2, 0x13, 0x7a, 0xbd, 0x63, 0x42, 0x44, 0x3f, 0xa5, 0xa0, 0x23, 0x3f, 0x1f, 0x83, 0x55, 0x3e, 0xeb, 0xe1, 0x2b, 0x3f, 0x88, 0x0d, 0x36, 0x3f, 0x6a, 0x67, 0xa0, 0x3e, 0x77, 0xd9, 0xff, 0x3e, 0xdc, 0xbb, 0x4e, 0x3f, 0x86, 0xe3, 0xc1, 0x3e, 0x42, 0x05, 0x9f, 0x3e, 0xe4, 0x31, 0x5f, 0x3f, 0xa0, 0xf9, 0xcc, 0x3e, 0x85, 0xee, 0xf2, 0x3d, 0xae, 0x9d, 0x68, 0x3f, +0x9b, 0x59, 0xc3, 0x3e, 0x7d, 0x25, 0x90, 0xbd, 0x6f, 0xf2, 0x6b, 0x3f, 0xb6, 0x83, 0xa9, 0x3e, 0xcf, 0x2c, 0x69, 0xbe, 0x3c, 0x6c, 0x6a, 0x3f, 0xd4, 0x46, 0x85, 0x3e, 0x7b, 0xdd, 0xba, 0xbe, 0xe9, 0xd5, 0x64, 0x3f, 0xbb, 0x62, 0x36, 0x3e, 0xd5, 0x3d, 0xf2, 0xbe, 0x97, 0xe0, 0x5c, 0x3f, 0x79, 0x20, 0x92, 0x3d, 0x74, 0x5d, 0xf8, 0xbe, 0xe6, 0x1d, 0x5f, 0x3f, 0xad, 0xfc, 0x02, 0xbe, 0xee, 0x98, 0xd2, 0xbe, 0x35, 0x08, 0x67, 0x3f, 0x60, 0x58, 0x5e, 0xbe, 0xa1, 0x67, 0x8b, 0xbe, +0x72, 0xf9, 0x6f, 0x3f, 0x52, 0x7e, 0x92, 0xbe, 0x0e, 0xa1, 0xea, 0xbd, 0xb5, 0x89, 0x73, 0x3f, 0x91, 0x7d, 0x98, 0xbe, 0x19, 0x8e, 0x67, 0x3c, 0xf7, 0x5a, 0x74, 0x3f, 0x6f, 0xb7, 0x84, 0xbe, 0xb6, 0xba, 0x1c, 0x3e, 0x2e, 0x20, 0x74, 0x3f, 0xaa, 0x9b, 0x5b, 0xbe, 0x90, 0xbc, 0xa3, 0x3e, 0xd9, 0x42, 0x6c, 0x3f, 0x99, 0xf3, 0xc4, 0xbe, 0xb6, 0xf6, 0x5e, 0x3e, 0x1f, 0xa2, 0x65, 0x3f, 0x5a, 0x0d, 0x89, 0xbe, 0x30, 0x12, 0xd2, 0x3e, 0x2c, 0x2d, 0x5f, 0x3f, 0xf0, 0x8b, 0x1b, 0xbe, +0x04, 0x55, 0x07, 0x3f, 0xff, 0xcb, 0x55, 0x3f, 0xd2, 0x50, 0x13, 0xbe, 0x80, 0xb9, 0x22, 0x3f, 0x6f, 0x2a, 0x42, 0x3f, 0x87, 0x34, 0xaa, 0x3c, 0x1a, 0x33, 0x5d, 0x3f, 0xdb, 0xc1, 0x00, 0x3f, 0x6a, 0x50, 0xd4, 0xbd, 0xf7, 0x3c, 0x97, 0x3e, 0xe6, 0x21, 0x73, 0x3f, 0x2f, 0xc1, 0x29, 0xbe, 0xee, 0x5c, 0xa0, 0x3e, 0xfa, 0x62, 0x6f, 0x3f, 0xcc, 0x5d, 0xab, 0xbd, 0xbc, 0x5c, 0xfc, 0x3e, 0xd9, 0xb5, 0x5d, 0x3f, 0x87, 0x6b, 0xf5, 0xbd, 0xb3, 0xb3, 0xf0, 0x3e, 0x94, 0xda, 0x5f, 0x3f, +0x56, 0x61, 0xb3, 0xbd, 0x34, 0x4b, 0x46, 0x3f, 0x2d, 0x5a, 0x20, 0x3f, 0x48, 0x8b, 0x83, 0xbe, 0x35, 0xd0, 0xfc, 0xbd, 0x4e, 0x61, 0x75, 0x3f, 0xfa, 0xd1, 0x90, 0xbe, 0xe6, 0x05, 0x58, 0x3c, 0xcf, 0x85, 0x75, 0x3f, 0x1d, 0xe8, 0xc1, 0xbe, 0x70, 0xb2, 0x8d, 0xbe, 0xf8, 0x16, 0x62, 0x3f, 0xfb, 0x78, 0xe0, 0xbe, 0x67, 0x9a, 0x90, 0xbd, 0xab, 0x5f, 0x65, 0x3f, 0xf2, 0x06, 0xc8, 0xbe, 0xc6, 0x68, 0x8d, 0xbe, 0x47, 0xcc, 0x60, 0x3f, 0xcb, 0x13, 0xe0, 0xbe, 0x74, 0x25, 0x82, 0xbd, +0x0b, 0x9b, 0x65, 0x3f, 0xf8, 0xc6, 0x80, 0xbe, 0x78, 0xd0, 0xdc, 0xbe, 0xbc, 0xcf, 0x5d, 0x3f, 0x80, 0x80, 0x8d, 0xbe, 0x71, 0x93, 0xe9, 0xbe, 0x00, 0x8b, 0x58, 0x3f, 0xc3, 0xd3, 0x4b, 0xbe, 0x64, 0x3f, 0x9b, 0xbe, 0xff, 0x90, 0x6e, 0x3f, 0xd0, 0x99, 0x8c, 0xbe, 0x31, 0x7e, 0x0a, 0x3e, 0x02, 0xb6, 0x73, 0x3f, 0x61, 0xe2, 0x7f, 0xbe, 0x95, 0x82, 0x96, 0x3e, 0xbe, 0x2d, 0x6c, 0x3f, 0xcd, 0x5a, 0xe2, 0xbe, 0xbc, 0xe8, 0xcb, 0x3d, 0x4c, 0x34, 0x64, 0x3f, 0xa9, 0x6b, 0xd5, 0xbe, +0x33, 0x6d, 0x97, 0x3e, 0x91, 0x09, 0x5c, 0x3f, 0x8b, 0x6f, 0xe0, 0xbe, 0xd8, 0x7d, 0xe7, 0x3d, 0x5b, 0x44, 0x64, 0x3f, 0x5f, 0x5f, 0xd3, 0xbe, 0xd0, 0xed, 0xa5, 0x3e, 0x1d, 0xe8, 0x59, 0x3f, 0x95, 0x27, 0x20, 0x3e, 0x6d, 0xaa, 0xfe, 0xbe, 0x86, 0x72, 0x5a, 0x3f, 0xf4, 0x86, 0x7b, 0x3d, 0xb8, 0x22, 0x09, 0xbf, 0x2d, 0x99, 0x57, 0x3f, 0xd5, 0xcd, 0x05, 0x3d, 0xbf, 0xef, 0xef, 0xbe, 0xb9, 0xfe, 0x61, 0x3f, 0x22, 0xff, 0x4c, 0x3d, 0x99, 0x2b, 0x0f, 0xbf, 0xcb, 0xd5, 0x53, 0x3f, +0x4c, 0xa4, 0xf4, 0x3d, 0xe7, 0x6e, 0xe7, 0xbe, 0x1f, 0x4c, 0x62, 0x3f, 0xd7, 0x50, 0x1a, 0x3e, 0x61, 0x50, 0x06, 0xbf, 0x52, 0x7e, 0x56, 0x3f, 0x4c, 0xa4, 0xf4, 0x3d, 0xe7, 0x6e, 0xe7, 0xbe, 0x1f, 0x4c, 0x62, 0x3f, 0xd7, 0x50, 0x1a, 0x3e, 0x61, 0x50, 0x06, 0xbf, 0x52, 0x7e, 0x56, 0x3f, 0xad, 0xbf, 0x55, 0x3e, 0x2b, 0x14, 0xb9, 0xbe, 0x6a, 0xa1, 0x68, 0x3f, 0x0b, 0x79, 0x74, 0x3e, 0x7b, 0xbd, 0xd3, 0xbe, 0x4e, 0xed, 0x60, 0x3f, 0x3f, 0xff, 0x6d, 0x3e, 0x7b, 0x86, 0xc8, 0xbe, +0x21, 0xe9, 0x63, 0x3f, 0x4a, 0xd3, 0x00, 0xbe, 0xa5, 0x15, 0xe7, 0xbe, 0x30, 0x29, 0x62, 0x3f, 0x3c, 0xc0, 0x03, 0xbe, 0x84, 0x63, 0xee, 0xbe, 0xbb, 0x26, 0x60, 0x3f, 0x2c, 0x9e, 0x1a, 0xbe, 0x74, 0xed, 0x07, 0xbf, 0x04, 0x76, 0x55, 0x3f, 0x83, 0x6c, 0x91, 0x3e, 0x6a, 0xdb, 0x70, 0xbe, 0xd3, 0xf4, 0x6d, 0x3f, 0xee, 0xee, 0x89, 0x3e, 0x57, 0x92, 0x4c, 0xbe, 0x17, 0x2c, 0x71, 0x3f, 0xdc, 0x47, 0x96, 0x3e, 0xde, 0x39, 0x74, 0xbe, 0x3f, 0xfc, 0x6c, 0x3f, 0xf9, 0x86, 0x92, 0x3e, +0x4c, 0x53, 0x04, 0xbd, 0x2d, 0x27, 0x75, 0x3f, 0xf1, 0x2e, 0x9f, 0x3e, 0x14, 0x75, 0x66, 0xbd, 0xda, 0xe2, 0x72, 0x3f, 0xda, 0x1f, 0xa0, 0x3e, 0xf4, 0xfb, 0x7e, 0xbd, 0xb1, 0xa2, 0x72, 0x3f, 0xca, 0x35, 0xa5, 0x3e, 0x8b, 0x18, 0xf6, 0x3d, 0x8a, 0x58, 0x70, 0x3f, 0x60, 0xc8, 0x92, 0x3e, 0x5d, 0x6e, 0x00, 0x3e, 0xc8, 0x24, 0x73, 0x3f, 0x9f, 0x38, 0xa0, 0x3e, 0xbf, 0x7d, 0xfd, 0x3d, 0xae, 0x11, 0x71, 0x3f, 0xef, 0x36, 0x8f, 0x3e, 0xed, 0x9c, 0x96, 0x3e, 0xcf, 0xf5, 0x69, 0x3f, +0x70, 0x99, 0x9b, 0x3e, 0x85, 0x97, 0xa0, 0x3e, 0x87, 0x4b, 0x66, 0x3f, 0xe1, 0x42, 0x9e, 0x3e, 0x55, 0x6d, 0x9f, 0x3e, 0x2c, 0x0b, 0x66, 0x3f, 0x4b, 0xe9, 0x19, 0x3d, 0x49, 0xf4, 0x4e, 0x3f, 0xa2, 0x60, 0x16, 0x3f, 0x82, 0xe4, 0x2d, 0x3e, 0xf1, 0xd9, 0x32, 0x3f, 0x7c, 0xed, 0x31, 0x3f, 0xff, 0x05, 0x82, 0xba, 0x0a, 0xbc, 0x47, 0x3f, 0xaf, 0x21, 0x20, 0x3f, 0xc4, 0x93, 0x0d, 0x3e, 0x49, 0x69, 0x2e, 0x3f, 0x81, 0x05, 0x38, 0x3f, 0x52, 0xd4, 0x99, 0x3c, 0xf2, 0x96, 0x53, 0x3f, +0x07, 0x06, 0x10, 0x3f, 0xdc, 0x67, 0x25, 0x3e, 0x89, 0x27, 0x37, 0x3f, 0x4f, 0x03, 0x2e, 0x3f, 0xd4, 0xb7, 0xcc, 0xbd, 0xc4, 0x27, 0x4d, 0x3f, 0xbe, 0xf8, 0x16, 0x3f, 0xff, 0x05, 0x82, 0xba, 0x0a, 0xbc, 0x47, 0x3f, 0xaf, 0x21, 0x20, 0x3f, 0xf6, 0x07, 0xca, 0xbd, 0xee, 0x5a, 0x5a, 0x3f, 0xe7, 0x38, 0x03, 0x3f, 0x52, 0xd4, 0x99, 0x3c, 0xf2, 0x96, 0x53, 0x3f, 0x07, 0x06, 0x10, 0x3f, 0xfd, 0x4c, 0x9d, 0xbd, 0xcc, 0x96, 0x50, 0x3f, 0x04, 0x1b, 0x13, 0x3f, 0xb6, 0x9d, 0x86, 0x3e, +0xc8, 0xea, 0x02, 0x3f, 0x6d, 0x71, 0x51, 0x3f, 0xa1, 0x66, 0x78, 0x3e, 0x0b, 0xea, 0xfb, 0x3e, 0xfa, 0x0a, 0x56, 0x3f, 0x2c, 0x9a, 0x86, 0x3e, 0xe0, 0x81, 0x05, 0x3f, 0xbc, 0xcd, 0x4f, 0x3f, 0xfc, 0x34, 0x3e, 0xbe, 0x0e, 0xd8, 0xfd, 0x3e, 0x34, 0x2d, 0x59, 0x3f, 0x7b, 0x16, 0x24, 0xbe, 0xac, 0xe3, 0x38, 0x3f, 0x4f, 0x3f, 0x2c, 0x3f, 0x20, 0xd4, 0x15, 0xbe, 0xe8, 0xd8, 0x45, 0x3f, 0x8c, 0x14, 0x1e, 0x3f, 0x3b, 0x1c, 0xa5, 0xbe, 0x67, 0x61, 0x07, 0x3f, 0xbe, 0xfa, 0x48, 0x3f, +0x0c, 0xcb, 0x9f, 0xbe, 0xb9, 0xc6, 0x13, 0x3f, 0x91, 0x2b, 0x41, 0x3f, 0xf7, 0xca, 0x9c, 0xbd, 0xdc, 0x45, 0x4c, 0x3f, 0xe5, 0x0c, 0x19, 0x3f, 0xe0, 0x9f, 0x92, 0xbd, 0x72, 0x15, 0x57, 0x3f, 0x95, 0x9e, 0x09, 0x3f, 0xf3, 0xe7, 0xdb, 0xbd, 0x9d, 0x65, 0x4e, 0x3f, 0x9e, 0xee, 0x14, 0x3f, 0xba, 0x65, 0xe7, 0xbd, 0xc7, 0x49, 0x59, 0x3f, 0x4f, 0x3b, 0x04, 0x3f, 0x1d, 0x3c, 0x93, 0xbe, 0x39, 0xee, 0x94, 0xbc, 0x7d, 0x24, 0x75, 0x3f, 0xfc, 0xc5, 0x7c, 0xbe, 0x31, 0xce, 0x1f, 0xbe, +0xf5, 0xd6, 0x74, 0x3f, 0xaa, 0xb8, 0x31, 0xbe, 0x15, 0xe3, 0x94, 0xbe, 0xad, 0xdf, 0x70, 0x3f, 0x71, 0x04, 0x91, 0xbe, 0xe1, 0x40, 0x68, 0x3e, 0x54, 0x8d, 0x6e, 0x3f, 0xb9, 0x55, 0x98, 0xbe, 0x8c, 0xbf, 0xcd, 0x3d, 0xaa, 0x0c, 0x73, 0x3f, 0x4d, 0xd7, 0x93, 0x3d, 0xb5, 0x88, 0xa8, 0xbe, 0xab, 0x06, 0x71, 0x3f, 0x99, 0x2c, 0x6e, 0x3c, 0x29, 0x24, 0xa9, 0xbe, 0x46, 0x99, 0x71, 0x3f, 0x4d, 0xd7, 0x93, 0x3d, 0xb5, 0x88, 0xa8, 0xbe, 0xab, 0x06, 0x71, 0x3f, 0x00, 0xc8, 0x19, 0x3e, +0x61, 0xaa, 0x89, 0xbe, 0x8f, 0x8e, 0x73, 0x3f, 0xf7, 0x5b, 0xbb, 0xbd, 0x65, 0xc7, 0xae, 0xbe, 0xd5, 0x7a, 0x6f, 0x3f, 0xa7, 0x03, 0x59, 0x3e, 0x65, 0xe0, 0x10, 0xbe, 0xa8, 0x8c, 0x77, 0x3f, 0x7b, 0x32, 0x6f, 0x3e, 0x10, 0x91, 0x1a, 0xbc, 0xef, 0xe7, 0x78, 0x3f, 0x23, 0x9c, 0x76, 0x3e, 0x73, 0x82, 0xf6, 0x3d, 0x15, 0x8c, 0x76, 0x3f, 0xdc, 0x65, 0x6f, 0x3e, 0x4b, 0x56, 0x85, 0x3e, 0xa2, 0xcf, 0x6f, 0x3f, 0xf2, 0xb6, 0xd2, 0x3d, 0xb1, 0xf9, 0x1c, 0x3f, 0x73, 0x80, 0x48, 0x3f, +0x53, 0x07, 0xf9, 0xbc, 0x3b, 0xab, 0x31, 0x3f, 0xf6, 0x24, 0x38, 0x3f, 0x6b, 0x27, 0xca, 0xbd, 0xc9, 0xe8, 0x2c, 0x3f, 0x1e, 0x15, 0x3b, 0x3f, 0x53, 0x07, 0xf9, 0xbc, 0x3b, 0xab, 0x31, 0x3f, 0xf6, 0x24, 0x38, 0x3f, 0x06, 0xd6, 0x51, 0x3e, 0x64, 0x90, 0xdb, 0x3e, 0xcd, 0x3c, 0x61, 0x3f, 0x9c, 0x88, 0x6e, 0xbe, 0xe7, 0xa9, 0xc6, 0x3e, 0x6a, 0x48, 0x64, 0x3f, 0x87, 0xa7, 0x07, 0xbe, 0x4a, 0xb2, 0x0e, 0x3f, 0x70, 0xd1, 0x51, 0x3f, 0xfa, 0x63, 0x9a, 0xbd, 0x89, 0x7d, 0x22, 0x3f, +0x65, 0xe0, 0x44, 0x3f, 0x4b, 0x59, 0xc6, 0xbd, 0xba, 0x10, 0x27, 0x3f, 0x95, 0x61, 0x40, 0x3f, 0xa3, 0x3a, 0xbd, 0xbd, 0xdb, 0x6e, 0x02, 0x3f, 0x97, 0x01, 0x5b, 0x3f, 0x08, 0x74, 0xa6, 0xbd, 0xf9, 0x12, 0xa2, 0x3e, 0x39, 0xf1, 0x71, 0x3f, 0x85, 0xce, 0x8b, 0xbd, 0xea, 0x23, 0x30, 0x3e, 0xff, 0x93, 0x7b, 0x3f, 0xf7, 0x72, 0x5f, 0xbd, 0x1d, 0xc9, 0x85, 0x3d, 0x3c, 0x12, 0x7f, 0x3f, 0x55, 0x86, 0x31, 0xbd, 0x7e, 0x1e, 0x63, 0xbd, 0x78, 0x5d, 0x7f, 0x3f, 0x9d, 0xbc, 0x08, 0xbd, +0x35, 0xf0, 0x23, 0xbe, 0xb0, 0x8d, 0x7c, 0x3f, 0x2b, 0x89, 0xec, 0xbc, 0xa6, 0x3f, 0x7b, 0xbe, 0x84, 0x10, 0x78, 0x3f, 0xc6, 0x69, 0x08, 0xbd, 0x45, 0x0f, 0xac, 0xbe, 0x06, 0xf6, 0x70, 0x3f, 0x89, 0x7e, 0x2d, 0xbd, 0x9a, 0x78, 0xef, 0xbe, 0x4f, 0x03, 0x62, 0x3f, 0x0a, 0xbd, 0x3e, 0xbd, 0xc0, 0x5d, 0x0e, 0xbf, 0xa4, 0x6d, 0x54, 0x3f, 0x0d, 0x50, 0x1a, 0xbd, 0x1a, 0xfd, 0x04, 0xbf, 0x9c, 0x88, 0x5a, 0x3f, 0x55, 0xdc, 0xb8, 0xbc, 0x59, 0x33, 0xea, 0xbe, 0x14, 0x93, 0x63, 0x3f, +0x60, 0x5a, 0x54, 0xbc, 0x15, 0x90, 0x0e, 0xbf, 0xdd, 0x9a, 0x54, 0x3f, 0xb8, 0x5c, 0xfd, 0xbb, 0xd2, 0xfd, 0x40, 0xbf, 0x73, 0x2f, 0x28, 0x3f, 0x34, 0x83, 0x78, 0xbb, 0x28, 0x44, 0x68, 0xbf, 0x56, 0x4a, 0xd7, 0x3e, 0x0b, 0x9a, 0x96, 0xba, 0xcf, 0xbf, 0x7d, 0xbf, 0xb3, 0x7a, 0x07, 0x3e, 0x63, 0x28, 0x03, 0x3f, 0xa6, 0x7d, 0x5b, 0xbf, 0x0d, 0xc6, 0x48, 0x3d, 0xec, 0x9e, 0x34, 0x3f, 0x32, 0x55, 0x34, 0xbf, 0xc6, 0x6b, 0x9e, 0x3d, 0x71, 0x1c, 0x98, 0x3e, 0x70, 0x5e, 0x74, 0xbf, +0x90, 0x87, 0xbe, 0x3c, 0xac, 0xc5, 0x57, 0x3f, 0x45, 0x65, 0x07, 0xbf, 0x0a, 0x63, 0xcb, 0x3d, 0x63, 0x25, 0x6e, 0x3f, 0x03, 0x98, 0xb2, 0xbe, 0x89, 0x06, 0xe9, 0x3d, 0x99, 0xd5, 0x77, 0x3f, 0x62, 0x9c, 0x5f, 0xbe, 0xbb, 0x97, 0xfb, 0x3d, 0x3a, 0x91, 0x7c, 0x3f, 0x77, 0xbb, 0xbe, 0xbd, 0x6c, 0x3f, 0x09, 0x3e, 0x43, 0x55, 0x7c, 0x3f, 0x07, 0x0b, 0xa7, 0x3d, 0xe9, 0x28, 0x17, 0x3e, 0x5b, 0xeb, 0x73, 0x3f, 0xdf, 0xfe, 0x84, 0x3e, 0x83, 0xdd, 0x20, 0x3e, 0xd7, 0x13, 0x65, 0x3f, +0x4c, 0xdd, 0xd5, 0x3e, 0x81, 0x3e, 0x21, 0x3e, 0xca, 0x17, 0x58, 0x3f, 0x39, 0xd0, 0x03, 0x3f, 0xb9, 0x1a, 0x19, 0x3e, 0x0f, 0x29, 0x46, 0x3f, 0x1c, 0x60, 0x1e, 0x3f, 0x77, 0xbc, 0x09, 0x3e, 0x9a, 0x7b, 0x2c, 0x3f, 0x42, 0xb0, 0x3a, 0x3f, 0x91, 0x5e, 0xf4, 0x3d, 0x63, 0x23, 0x18, 0x3f, 0xa5, 0xbb, 0x4b, 0x3f, 0x64, 0xb1, 0xed, 0x3d, 0x7d, 0x3f, 0x05, 0x3f, 0xa0, 0x89, 0x58, 0x3f, 0xca, 0xfd, 0xee, 0x3d, 0x40, 0x6b, 0x06, 0x3f, 0xb6, 0x85, 0x57, 0x3f, 0xac, 0x36, 0xff, 0x3d, +0xd3, 0xfa, 0x43, 0x3f, 0xb3, 0x25, 0x1f, 0x3f, 0x20, 0xb5, 0x29, 0x3e, 0xcb, 0xda, 0xc6, 0x3d, 0x8e, 0xc9, 0x7e, 0xbf, 0xa0, 0x6e, 0xa0, 0x3b, 0x83, 0xbe, 0x10, 0xbf, 0x08, 0x39, 0x4f, 0x3f, 0xcb, 0x2c, 0x22, 0x3e, 0x02, 0x7f, 0x1c, 0xbf, 0xfd, 0x11, 0x4a, 0x3f, 0xbe, 0x4b, 0x69, 0x3d, 0xc6, 0xbf, 0x6b, 0xbf, 0xeb, 0xfe, 0x71, 0x3e, 0x1b, 0xb9, 0x9e, 0x3e, 0x89, 0xb7, 0x7a, 0xbf, 0xff, 0x77, 0x14, 0x3e, 0x73, 0x2f, 0x10, 0x3e, 0xc1, 0xfd, 0x3c, 0xbf, 0x56, 0x99, 0xb9, 0xbe, +0xe4, 0x9f, 0x11, 0x3f, 0x9a, 0x96, 0x54, 0xbf, 0xa9, 0x66, 0xd6, 0xbe, 0xfe, 0x26, 0xbc, 0x3e, 0x90, 0x30, 0x58, 0xbf, 0x9e, 0x45, 0xff, 0xbe, 0x38, 0x48, 0x48, 0x3e, 0x60, 0x06, 0x2b, 0xbf, 0x9e, 0xb7, 0x35, 0xbf, 0xbc, 0x92, 0x64, 0x3e, 0xe5, 0x29, 0x23, 0xbf, 0xbd, 0x35, 0x2c, 0xbf, 0x19, 0x6e, 0xc0, 0x3e, 0x85, 0xcc, 0x0d, 0xbf, 0x65, 0xc7, 0x22, 0xbf, 0x07, 0x98, 0x09, 0x3f, 0x8e, 0x3f, 0xb1, 0xbe, 0xac, 0x02, 0x95, 0xbe, 0x50, 0x52, 0x64, 0x3f, 0xfc, 0x70, 0x10, 0xbf, +0xc3, 0x46, 0xa9, 0xbe, 0x36, 0xac, 0x41, 0x3f, 0x11, 0x52, 0xdf, 0xbe, 0x35, 0x0d, 0x1e, 0xbf, 0xff, 0x97, 0x27, 0x3f, 0xc4, 0x5e, 0x88, 0xbe, 0xb7, 0xec, 0x20, 0xbf, 0x5e, 0x0e, 0x3b, 0x3f, 0xb1, 0xa8, 0xc8, 0xbd, 0x92, 0xce, 0x80, 0xbe, 0x52, 0x7e, 0x76, 0x3f, 0x01, 0xf6, 0xb1, 0xbd, 0x9d, 0xd7, 0x24, 0xbf, 0xee, 0x98, 0x42, 0x3f, 0xf1, 0x2e, 0xf7, 0x3d, 0xeb, 0x01, 0x33, 0xbf, 0xc8, 0x61, 0x34, 0x3f, 0x41, 0x0f, 0x35, 0x3e, 0x60, 0x3f, 0x64, 0xbe, 0x87, 0x6b, 0x75, 0x3f, +0x0d, 0xfe, 0xbe, 0x3e, 0xa5, 0x86, 0x2e, 0xbf, 0xc1, 0x1c, 0x21, 0x3f, 0xa5, 0x2d, 0xee, 0x3e, 0xfc, 0xfd, 0x42, 0xbe, 0xf4, 0x4e, 0x5d, 0x3f, 0xac, 0xc9, 0x3f, 0x3f, 0x0c, 0xce, 0x10, 0xbe, 0xac, 0xa8, 0x25, 0x3f, 0xd5, 0x73, 0x12, 0x3f, 0x20, 0x99, 0x2e, 0xbf, 0x03, 0x44, 0xe9, 0x3e, 0xcc, 0xf0, 0x7b, 0x3f, 0xed, 0x9e, 0xbc, 0x3c, 0x93, 0x18, 0x34, 0x3e, 0x8e, 0x05, 0x3d, 0x3f, 0x0e, 0x14, 0x28, 0xbf, 0xc0, 0xce, 0x1d, 0x3e, 0x48, 0xdc, 0xc3, 0xbd, 0xc8, 0x07, 0x45, 0x3f, +0x74, 0x9a, 0x21, 0x3f, 0x1d, 0xe8, 0xe1, 0xbd, 0x50, 0x6f, 0x7e, 0xbf, 0x2d, 0x27, 0xa1, 0x3b, 0x27, 0x4f, 0xa1, 0xbe, 0x4f, 0xeb, 0x72, 0xbf, 0x36, 0x3e, 0x93, 0x3c, 0xeb, 0x57, 0xea, 0xbe, 0x92, 0x76, 0x63, 0xbf, 0x54, 0x3b, 0x03, 0x3d, 0xfa, 0xcf, 0x16, 0xbf, 0x90, 0xa2, 0x4e, 0xbf, 0xc9, 0xcb, 0x1a, 0x3d, 0x29, 0x93, 0x02, 0x3f, 0xc8, 0xce, 0x5b, 0xbf, 0x77, 0x12, 0x51, 0xbd, 0x7d, 0xcb, 0x34, 0x3f, 0x00, 0x00, 0x34, 0xbf, 0xb5, 0x8b, 0xa9, 0xbd, 0xb5, 0xc0, 0x96, 0x3e, +0x81, 0x94, 0x74, 0xbf, 0x68, 0x40, 0xbd, 0xbc, 0x57, 0x07, 0x58, 0x3f, 0x60, 0x73, 0x06, 0xbf, 0xa6, 0xf0, 0xe0, 0xbd, 0xb7, 0xd0, 0x6d, 0x3f, 0xcc, 0x5f, 0xb1, 0xbe, 0x5d, 0x88, 0x05, 0xbe, 0x77, 0xf5, 0x76, 0x3f, 0x10, 0xae, 0x60, 0xbe, 0xc0, 0x3f, 0x15, 0xbe, 0x8e, 0x5c, 0x7b, 0x3f, 0x2b, 0xbd, 0xd6, 0xbd, 0xa5, 0xa2, 0x21, 0xbe, 0x9d, 0x29, 0x7c, 0x3f, 0x68, 0x03, 0x70, 0x3d, 0x81, 0x22, 0x26, 0xbe, 0xf0, 0x4b, 0x75, 0x3f, 0xde, 0x1e, 0x74, 0x3e, 0x18, 0x08, 0x22, 0xbe, +0xba, 0xd7, 0x65, 0x3f, 0x72, 0xfd, 0xd3, 0x3e, 0x65, 0x8a, 0x19, 0xbe, 0x05, 0x50, 0x54, 0x3f, 0x80, 0xba, 0x09, 0x3f, 0x87, 0x6a, 0x1a, 0xbe, 0x40, 0xbe, 0x28, 0x3f, 0x10, 0x04, 0x3c, 0x3f, 0x67, 0x7e, 0x25, 0xbe, 0xa1, 0x67, 0x3f, 0x3f, 0xc5, 0x00, 0x25, 0x3f, 0x43, 0xab, 0x23, 0xbe, 0x1e, 0xe2, 0x1f, 0x3d, 0x1a, 0xc4, 0x7f, 0x3f, 0x0a, 0xd8, 0x8e, 0x3c, 0x2a, 0x8d, 0x98, 0x3c, 0xf7, 0x72, 0x7f, 0x3f, 0x9c, 0xc4, 0x80, 0xbd, 0xd9, 0xb3, 0x87, 0x3e, 0xf4, 0xa6, 0x76, 0x3f, +0xc1, 0xe3, 0x1b, 0x3d, 0x4a, 0xb6, 0x7a, 0x3e, 0x49, 0x69, 0x76, 0x3f, 0x27, 0x84, 0xee, 0xbd, 0x36, 0xcb, 0x05, 0xbe, 0x2e, 0xc9, 0x7d, 0x3f, 0x76, 0x53, 0x4a, 0x3c, 0x0a, 0x69, 0x0d, 0xbe, 0x63, 0x7b, 0x7d, 0x3f, 0xf7, 0xe6, 0xb7, 0xbc, 0x0f, 0xed, 0x8b, 0xbe, 0x6c, 0x3e, 0x76, 0x3f, 0x26, 0x8a, 0x10, 0x3c, 0x27, 0x6b, 0x8c, 0xbe, 0x27, 0x2f, 0x76, 0x3f, 0xaa, 0xb9, 0xdc, 0x39, 0x01, 0x13, 0x04, 0xbf, 0xa6, 0xee, 0x5a, 0x3f, 0x8b, 0x17, 0x4b, 0x3d, 0xa7, 0x75, 0x5b, 0xbd, +0x62, 0x85, 0x7f, 0x3f, 0x6b, 0x47, 0xf1, 0x3c, 0x3c, 0xde, 0x64, 0xbd, 0x11, 0xe0, 0x74, 0x3f, 0x72, 0x86, 0x92, 0xbe, 0xa7, 0x75, 0x5b, 0xbd, 0x62, 0x85, 0x7f, 0x3f, 0x6b, 0x47, 0xf1, 0x3c, 0xf9, 0x2f, 0xb0, 0x3e, 0xb9, 0x19, 0x66, 0x3f, 0x69, 0xfc, 0x8a, 0xbe, 0x60, 0x06, 0xbb, 0x3e, 0xd4, 0x45, 0x6e, 0x3f, 0x85, 0xb1, 0x85, 0x3c, 0xde, 0xe8, 0x73, 0xbf, 0x4a, 0x62, 0x99, 0x3e, 0x42, 0xe9, 0x4b, 0x3d, 0x65, 0x00, 0x54, 0xbf, 0xbf, 0xd1, 0x0e, 0x3f, 0xf9, 0xdb, 0x5e, 0x3d, +0xbe, 0x33, 0x36, 0xbf, 0xd1, 0x92, 0x33, 0xbf, 0xd0, 0x47, 0x19, 0x3d, 0xc9, 0xe5, 0x4f, 0xbf, 0x31, 0x27, 0x14, 0xbf, 0x3f, 0xe5, 0x98, 0xbd, 0xae, 0x81, 0x51, 0xbf, 0x5f, 0xd0, 0x12, 0xbf, 0x87, 0xa4, 0x16, 0x3d, 0x8f, 0xdf, 0x67, 0xbf, 0x8d, 0x08, 0xd6, 0xbe, 0x4a, 0xb2, 0x8e, 0xbd, 0x53, 0x07, 0x69, 0xbf, 0xc2, 0xfb, 0xd2, 0xbe, 0xaa, 0x0f, 0x24, 0x3d, 0x8b, 0xff, 0x03, 0x3f, 0x00, 0xac, 0x5a, 0x3f, 0x59, 0x6e, 0x89, 0x3d, 0xf9, 0xb8, 0x06, 0x3f, 0xd3, 0xdd, 0x55, 0x3f, +0x1e, 0x54, 0x22, 0xbe, 0x33, 0xa5, 0x35, 0x3f, 0x75, 0x90, 0x33, 0x3f, 0x57, 0x05, 0x8a, 0x3d, 0xed, 0x28, 0x36, 0x3f, 0x7f, 0x65, 0x2d, 0x3f, 0x44, 0x4e, 0x3f, 0xbe, 0x8b, 0xff, 0x03, 0x3f, 0x00, 0xac, 0x5a, 0x3f, 0x59, 0x6e, 0x89, 0x3d, 0xf9, 0xb8, 0x06, 0x3f, 0xd3, 0xdd, 0x55, 0x3f, 0x1e, 0x54, 0x22, 0xbe, 0x1e, 0x54, 0x16, 0x3f, 0x7d, 0x3d, 0x4b, 0x3f, 0x62, 0x87, 0x21, 0xbe, 0x5d, 0x37, 0x01, 0x3f, 0xb8, 0x92, 0x59, 0x3f, 0xec, 0xf9, 0x1a, 0xbe, 0xf9, 0xda, 0x27, 0x3f, +0x8c, 0x11, 0x41, 0x3f, 0x00, 0x90, 0x13, 0x3d, 0xe0, 0xbc, 0x20, 0x3f, 0x29, 0x04, 0x3e, 0x3f, 0x11, 0xc6, 0x6f, 0xbe, 0x4a, 0x5c, 0x77, 0xbf, 0xea, 0x92, 0x81, 0xbe, 0xc2, 0xde, 0x44, 0x3d, 0xcd, 0xe9, 0x7e, 0xbf, 0xe8, 0xbb, 0x9b, 0xbd, 0x01, 0x68, 0x54, 0x3d, 0xf4, 0xc5, 0x7e, 0xbf, 0x59, 0x4f, 0xad, 0x3d, 0xef, 0xad, 0x48, 0x3d, 0xd7, 0x81, 0x7b, 0xbf, 0x75, 0xe4, 0x38, 0x3e, 0x68, 0xb2, 0x3f, 0x3d, 0x9d, 0x2d, 0x00, 0x3f, 0x43, 0x73, 0x59, 0x3f, 0x38, 0xba, 0x2a, 0xbe, +0x49, 0x0f, 0x33, 0x3f, 0x67, 0x9e, 0x2c, 0x3f, 0x05, 0x88, 0x72, 0xbe, 0x61, 0x17, 0x25, 0xbf, 0x23, 0xa3, 0x43, 0x3f, 0x0d, 0xfc, 0x28, 0x3c, 0x42, 0x78, 0x28, 0xbf, 0xb4, 0xab, 0x40, 0x3f, 0x77, 0xbd, 0xb4, 0x3c, 0x32, 0x3b, 0x7f, 0xbf, 0xfd, 0x32, 0x58, 0x3d, 0xe6, 0x20, 0x68, 0x3d, 0xba, 0xbe, 0x7f, 0xbf, 0xb4, 0x21, 0xff, 0x3c, 0x1a, 0xe0, 0x02, 0x3d, 0xfc, 0xfd, 0xc2, 0x3d, 0xe0, 0xd5, 0x7e, 0xbf, 0x28, 0xef, 0x63, 0xbb, 0x01, 0x17, 0x54, 0xbf, 0x76, 0x1a, 0x0d, 0xbf, +0xc2, 0xfb, 0xca, 0x3d, 0xe0, 0x62, 0x55, 0xbf, 0xe1, 0x5e, 0x0d, 0xbf, 0x14, 0x5e, 0x82, 0x3c, 0x98, 0x4b, 0x2e, 0xbf, 0x44, 0x16, 0x39, 0xbf, 0x2a, 0xfe, 0xef, 0x3d, 0x3f, 0x52, 0x34, 0xbf, 0xf6, 0xb6, 0x35, 0xbf, 0xec, 0x84, 0x97, 0x39, 0x44, 0xc3, 0x42, 0x3f, 0x6a, 0x6d, 0x1a, 0xbf, 0xde, 0x21, 0x75, 0xbe, 0xe9, 0x45, 0x71, 0x3f, 0x28, 0x28, 0x05, 0x3e, 0x26, 0xac, 0x9d, 0xbe, 0x44, 0x32, 0x44, 0xbe, 0xb9, 0x16, 0x6d, 0xbf, 0xb3, 0x5c, 0xa6, 0xbe, 0xcd, 0x8d, 0xe9, 0xbd, +0xc7, 0x0f, 0x69, 0xbf, 0x40, 0xa0, 0xcb, 0xbe, 0x2b, 0xa2, 0x66, 0xbd, 0x68, 0x5e, 0x7e, 0xbf, 0xf5, 0xf6, 0xc7, 0xbd, 0xfd, 0x67, 0x0d, 0xbd, 0xbf, 0x0c, 0x7e, 0xbf, 0x59, 0x33, 0xf2, 0xbd, 0x64, 0x20, 0x87, 0xbe, 0xb3, 0x24, 0x70, 0xbf, 0x90, 0xdd, 0x65, 0xbe, 0xa9, 0x87, 0xa8, 0xbd, 0x96, 0x95, 0x7e, 0xbf, 0x76, 0xa5, 0x85, 0xbd, 0x0c, 0x58, 0x9a, 0xbe, 0x69, 0xfd, 0x71, 0xbf, 0x97, 0xab, 0xff, 0xbd, 0xe4, 0x49, 0xd2, 0xbd, 0x51, 0x82, 0x7e, 0xbf, 0xcc, 0x0d, 0x06, 0xbd, +0x36, 0xc8, 0x9c, 0xbe, 0x68, 0x3a, 0x73, 0xbf, 0x47, 0x1f, 0x73, 0xbd, 0xd8, 0xf4, 0xe0, 0xbd, 0xba, 0x6a, 0x7e, 0xbf, 0x78, 0x44, 0x85, 0xbc, 0xe7, 0xc6, 0x08, 0x3f, 0x6a, 0xbe, 0x2a, 0xbf, 0x17, 0xf2, 0x04, 0xbf, 0x9e, 0x3f, 0xc5, 0x3e, 0x77, 0x7f, 0x54, 0xbf, 0x93, 0x6f, 0xce, 0xbe, 0x4e, 0x63, 0xa3, 0x3e, 0x82, 0xc9, 0x25, 0xbf, 0x85, 0x22, 0x31, 0xbf, 0x9b, 0x57, 0x75, 0x3e, 0x4b, 0x1f, 0x4e, 0xbf, 0x37, 0xe1, 0x0a, 0xbf, 0x8c, 0x14, 0x6a, 0x3e, 0x58, 0x6f, 0x70, 0xbf, +0xcb, 0x2f, 0x83, 0xbe, 0xa1, 0x13, 0x22, 0x3e, 0xd4, 0x29, 0x6b, 0xbf, 0xbb, 0x63, 0xb9, 0xbe, 0x82, 0xc4, 0x36, 0xbe, 0x67, 0xb8, 0x41, 0xbf, 0xb9, 0xff, 0x20, 0xbf, 0x64, 0x76, 0x9e, 0xbe, 0x74, 0x27, 0x4c, 0xbf, 0x67, 0x96, 0x04, 0xbf, 0x79, 0x78, 0xd7, 0xbe, 0xf2, 0xee, 0x54, 0xbf, 0x3e, 0x59, 0xb9, 0xbe, 0x6d, 0xe5, 0x09, 0xbf, 0xc6, 0x6e, 0x33, 0xbf, 0xa6, 0x5e, 0xef, 0xbe, 0x30, 0xd4, 0xc9, 0xbe, 0xf2, 0x5e, 0x25, 0xbf, 0x9f, 0x58, 0x27, 0xbf, 0x44, 0x17, 0x64, 0xbe, +0xd5, 0x94, 0x14, 0xbf, 0xe8, 0x84, 0x48, 0xbf, 0x3f, 0x8b, 0xed, 0xbe, 0x77, 0xbe, 0x5b, 0xbf, 0xb1, 0x34, 0x60, 0xbe, 0x6c, 0x40, 0xec, 0xbe, 0x41, 0x60, 0x61, 0xbf, 0xa8, 0x8f, 0xe0, 0xbd, 0x8f, 0x8c, 0x19, 0xbf, 0xb2, 0x4b, 0x48, 0xbf, 0xc8, 0x98, 0x2b, 0xbe, 0xbf, 0xd4, 0x17, 0xbf, 0x22, 0x8d, 0x3e, 0xbf, 0xc0, 0x24, 0x9d, 0xbe, 0xa0, 0x6b, 0x8f, 0x3e, 0xaf, 0xcc, 0x73, 0xbf, 0x1b, 0x48, 0xf7, 0xbd, 0x71, 0x73, 0xfa, 0x3e, 0xe2, 0x91, 0x58, 0xbf, 0xeb, 0x54, 0x59, 0xbe, +0x95, 0xba, 0x2c, 0x3f, 0x9c, 0x85, 0x2d, 0xbf, 0x61, 0x8b, 0x95, 0xbe, 0xe2, 0x59, 0x36, 0x3f, 0x28, 0xd3, 0xb0, 0xbe, 0xad, 0x6b, 0x1c, 0xbf, 0x42, 0x3e, 0x24, 0x3f, 0x95, 0xf0, 0xfc, 0xbe, 0xef, 0x37, 0x16, 0xbf, 0xb0, 0x54, 0xef, 0x3e, 0x9d, 0xd5, 0xba, 0xbe, 0x32, 0x21, 0x4e, 0xbf, 0xad, 0x4c, 0xc8, 0x3e, 0x6a, 0xa3, 0xfa, 0xbe, 0x88, 0x80, 0x47, 0xbf, 0xc4, 0x09, 0x84, 0xbe, 0x81, 0xb3, 0xdc, 0xbe, 0x21, 0x5c, 0x5d, 0xbf, 0xe2, 0x93, 0xe6, 0xbe, 0x3b, 0x37, 0x05, 0xbf, +0x88, 0xbc, 0x39, 0xbf, 0x20, 0x5d, 0x1c, 0xbf, 0x4d, 0xa2, 0x16, 0xbf, 0x90, 0xa1, 0x07, 0xbf, 0x1c, 0x41, 0x2a, 0xbf, 0x59, 0x18, 0xfa, 0xbe, 0xa1, 0x9c, 0x10, 0xbf, 0x54, 0x54, 0x01, 0xbf, 0x88, 0x67, 0xd1, 0xbe, 0x4c, 0x8b, 0x42, 0xbf, 0x09, 0x34, 0xa0, 0xbe, 0x52, 0x45, 0xa1, 0xbe, 0xae, 0x62, 0x65, 0xbf, 0x66, 0xd9, 0x4b, 0x3f, 0x7d, 0xe9, 0xfd, 0xbe, 0xd1, 0x5a, 0xb1, 0xbe, 0x12, 0xa1, 0x5d, 0x3f, 0xab, 0x41, 0xa8, 0xbe, 0xc3, 0x46, 0xc1, 0xbe, 0xac, 0xab, 0x42, 0x3f, +0xa7, 0x92, 0x51, 0xbe, 0x8a, 0xc7, 0x1d, 0xbf, 0x7d, 0x92, 0x0b, 0x3f, 0xf3, 0x1b, 0x66, 0xbe, 0x61, 0xc0, 0x4e, 0xbf, 0xa7, 0xae, 0x48, 0x3f, 0x06, 0x67, 0xb0, 0xbd, 0xcb, 0x67, 0x1d, 0xbf, 0x0e, 0xf9, 0x17, 0x3f, 0xa7, 0xce, 0xa3, 0xbd, 0x7e, 0xfd, 0x4c, 0xbf, 0x6c, 0x79, 0x65, 0x3f, 0x2b, 0x89, 0x4c, 0xbe, 0x99, 0x9c, 0xca, 0xbe, 0x60, 0x01, 0x68, 0x3f, 0xf4, 0xa6, 0xc2, 0xbd, 0x26, 0xe1, 0xd2, 0xbe, 0xaa, 0x2d, 0x0d, 0x3f, 0x42, 0x06, 0x82, 0x3e, 0x83, 0x6a, 0x4b, 0xbf, +0x24, 0xf0, 0x3f, 0x3f, 0x01, 0x13, 0x68, 0x3e, 0x13, 0x27, 0x1f, 0xbf, 0x70, 0xce, 0x18, 0x3f, 0x0f, 0xf1, 0xaf, 0x3d, 0x44, 0x36, 0x4c, 0xbf, 0x4a, 0x7a, 0x48, 0x3f, 0x10, 0xce, 0x67, 0x3d, 0x1e, 0x8a, 0x1e, 0xbf, 0x1e, 0xbf, 0x67, 0x3f, 0x26, 0x88, 0x3a, 0x3d, 0x1f, 0x46, 0xd8, 0xbe, 0xcd, 0x76, 0x61, 0x3f, 0xba, 0xa3, 0x5f, 0x3e, 0x34, 0x2f, 0xd7, 0xbe, 0x26, 0x35, 0xac, 0x3e, 0xfa, 0x7f, 0x19, 0x3f, 0x21, 0xe7, 0x39, 0xbf, 0xe3, 0x70, 0x12, 0x3f, 0x27, 0x11, 0x15, 0x3f, +0xa4, 0xe2, 0x13, 0xbf, 0xe8, 0x88, 0xec, 0x3e, 0xf2, 0xce, 0xd9, 0x3e, 0x61, 0x38, 0x47, 0xbf, 0x7f, 0x13, 0x2e, 0x3f, 0x44, 0x4c, 0xd1, 0x3e, 0xc3, 0xd3, 0x1b, 0xbf, 0x55, 0xa0, 0x52, 0x3f, 0xc0, 0x06, 0xcc, 0x3e, 0x88, 0x84, 0xcf, 0xbe, 0x2a, 0x18, 0x3d, 0x3f, 0x13, 0xd4, 0x0c, 0x3f, 0x29, 0x77, 0xc7, 0xbe, 0xe4, 0x13, 0x22, 0x3e, 0xb9, 0xc3, 0x36, 0x3f, 0x1b, 0x9e, 0x2e, 0xbf, 0xbe, 0xbc, 0xc0, 0x3e, 0xe3, 0x37, 0x39, 0x3f, 0xf3, 0x21, 0x14, 0xbf, 0xfd, 0xd7, 0x69, 0x3e, +0xbe, 0x87, 0x2f, 0x3f, 0x63, 0xf0, 0x30, 0xbf, 0x45, 0x2b, 0xef, 0x3e, 0x62, 0x13, 0x2d, 0x3f, 0xb5, 0xe0, 0x11, 0xbf, 0xfd, 0xfa, 0x25, 0x3f, 0xc1, 0x53, 0x28, 0x3f, 0x6b, 0x7e, 0xc4, 0xbe, 0x0d, 0x8c, 0x10, 0x3f, 0x17, 0x9a, 0x3b, 0x3f, 0xf1, 0x65, 0xc2, 0xbe, 0x85, 0x23, 0x08, 0xbe, 0x96, 0x3d, 0x65, 0x3f, 0x84, 0x7f, 0xd9, 0xbe, 0xa0, 0xdb, 0x2b, 0xbe, 0xce, 0x38, 0x69, 0x3f, 0x0e, 0xd9, 0xc0, 0xbe, 0x6e, 0xa6, 0xc2, 0xbd, 0x33, 0x8c, 0x4f, 0x3f, 0xce, 0xe0, 0x13, 0xbf, +0x77, 0x9c, 0x02, 0xbe, 0x98, 0x88, 0x57, 0x3f, 0x65, 0x38, 0x06, 0xbf, 0xd8, 0xd2, 0x43, 0xbe, 0x65, 0x17, 0x70, 0x3f, 0x0b, 0x43, 0x94, 0xbe, 0x9d, 0xf6, 0x24, 0xbe, 0xc2, 0x4c, 0x63, 0x3f, 0xba, 0xa2, 0xdc, 0xbe, 0x0c, 0x05, 0xcc, 0xbd, 0x7f, 0xbf, 0x54, 0x3f, 0xc2, 0x15, 0x0c, 0xbf, 0x9e, 0x09, 0x8d, 0xbd, 0x0c, 0x56, 0x48, 0x3f, 0x77, 0x66, 0x1e, 0xbf, 0x3f, 0x53, 0x2f, 0xbd, 0x0e, 0xb9, 0x41, 0x3f, 0xb5, 0xfe, 0x26, 0xbf, 0x8d, 0x43, 0x7d, 0x3d, 0x53, 0xaf, 0x77, 0x3f, +0xbc, 0x00, 0x7b, 0xbe, 0x71, 0x58, 0xba, 0xbd, 0x28, 0xf3, 0x7b, 0x3f, 0x3a, 0xad, 0x1b, 0xbe, 0xde, 0x56, 0xda, 0xbd, 0x4d, 0x10, 0x75, 0x3f, 0x1b, 0x9f, 0x89, 0xbe, 0x7e, 0x8e, 0x2f, 0xbe, 0xe5, 0x7c, 0x75, 0x3f, 0x4a, 0x5c, 0x67, 0xbe, 0xc1, 0x3a, 0x2e, 0xbe, 0x6b, 0x64, 0x7b, 0x3f, 0x17, 0xef, 0xa7, 0xbd, 0x8b, 0x54, 0x48, 0xbe, 0x5b, 0x96, 0x77, 0x3f, 0x90, 0x49, 0x26, 0xbe, 0xbd, 0xa9, 0x90, 0xbe, 0x9a, 0xcd, 0x73, 0x3f, 0x17, 0x2e, 0xeb, 0xbd, 0xd7, 0xbe, 0x90, 0xbe, +0x4a, 0x5e, 0x75, 0x3f, 0x4b, 0xe9, 0x19, 0xbd, 0x03, 0x79, 0x86, 0xbe, 0x0e, 0xda, 0x6f, 0x3f, 0x77, 0x2e, 0x6c, 0xbe, 0xeb, 0x57, 0xea, 0xbe, 0x1d, 0xe3, 0x1a, 0x3f, 0x93, 0xc8, 0x26, 0xbf, 0x23, 0x48, 0xfd, 0xbe, 0xb4, 0x1d, 0x37, 0x3f, 0xb2, 0xb7, 0xfc, 0xbe, 0xca, 0x17, 0xb4, 0xbd, 0x84, 0xb7, 0x33, 0x3f, 0xe2, 0xea, 0x34, 0xbf, 0xce, 0x1a, 0x9c, 0xbd, 0x91, 0x7f, 0x52, 0x3f, 0x63, 0x61, 0x10, 0xbf, 0xce, 0x1a, 0x9c, 0xbd, 0x91, 0x7f, 0x52, 0x3f, 0x63, 0x61, 0x10, 0xbf, +0x00, 0xab, 0xa3, 0x3e, 0x72, 0x18, 0x44, 0x3f, 0x54, 0xc7, 0x0e, 0xbf, 0xca, 0x17, 0xb4, 0xbd, 0x84, 0xb7, 0x33, 0x3f, 0xe2, 0xea, 0x34, 0xbf, 0x5a, 0xf4, 0x96, 0x3e, 0x4c, 0xe1, 0x31, 0x3f, 0x14, 0xec, 0x27, 0xbf, 0x58, 0x8d, 0x65, 0x3e, 0x3e, 0xcc, 0x2e, 0x3f, 0x2e, 0x03, 0x32, 0xbf, 0x0f, 0x7e, 0x82, 0xbd, 0xbf, 0x46, 0x26, 0x3f, 0xdc, 0xf6, 0x41, 0xbf, 0xe0, 0x2f, 0xc6, 0xbe, 0x7b, 0xd9, 0x0e, 0x3f, 0x31, 0xe9, 0x3b, 0xbf, 0x0f, 0x7e, 0x82, 0xbd, 0xbf, 0x46, 0x26, 0x3f, +0xdc, 0xf6, 0x41, 0xbf, 0x13, 0x63, 0x65, 0xbf, 0x13, 0xee, 0x85, 0x3e, 0x69, 0xaa, 0xb7, 0xbe, 0x1d, 0xaa, 0x71, 0xbf, 0x3d, 0x7d, 0x8c, 0x3e, 0xfa, 0x9c, 0x3b, 0xbe, 0x94, 0x31, 0x3e, 0xbf, 0xe5, 0xef, 0xde, 0x3e, 0x9a, 0x24, 0x02, 0xbf, 0xe0, 0x68, 0x4f, 0xbf, 0xd0, 0xf1, 0xf9, 0x3e, 0x3a, 0x1f, 0xa6, 0xbe, 0x30, 0x49, 0x25, 0xbf, 0x2e, 0x1d, 0xd3, 0x3e, 0xf0, 0x8a, 0x24, 0xbf, 0x55, 0xa3, 0x4f, 0xbf, 0x21, 0x39, 0x79, 0x3e, 0xbf, 0x29, 0x08, 0xbf, 0xf4, 0xfb, 0x32, 0xbf, +0x37, 0x6c, 0x0b, 0x3e, 0xbc, 0xae, 0x33, 0xbf, 0x8a, 0xe8, 0x07, 0xbf, 0xdb, 0xdf, 0xa9, 0x3e, 0x51, 0xa0, 0x47, 0xbf, 0xf7, 0xc7, 0x9b, 0xbe, 0x78, 0xed, 0x02, 0x3f, 0x45, 0xbc, 0x4d, 0xbf, 0xb0, 0x74, 0x7e, 0xbe, 0xd2, 0x37, 0xd1, 0x3e, 0x28, 0xd3, 0x60, 0xbf, 0x59, 0x52, 0xc6, 0xbe, 0x88, 0xbe, 0x4b, 0x3e, 0x08, 0x74, 0x66, 0xbf, 0xe6, 0x02, 0x03, 0xbf, 0xf6, 0x07, 0x0a, 0xbd, 0x5d, 0xc4, 0x5b, 0xbf, 0x1b, 0x2c, 0x30, 0xbf, 0x29, 0x97, 0x36, 0xbe, 0x13, 0x0b, 0x34, 0xbf, +0xd2, 0x70, 0x4a, 0xbf, 0x3a, 0x5a, 0x85, 0xbe, 0x81, 0xcd, 0x0d, 0xbf, 0x68, 0x5d, 0x4b, 0xbf, 0x36, 0x94, 0x5a, 0xbc, 0x21, 0x75, 0x1b, 0xbf, 0x8a, 0x3e, 0x5f, 0xbf, 0xc6, 0x8b, 0xe5, 0xbd, 0x68, 0xec, 0xf3, 0xbe, 0x43, 0x8c, 0x6b, 0xbf, 0x54, 0x39, 0x2d, 0x3d, 0xc4, 0x5b, 0xc7, 0xbe, 0xb0, 0x70, 0x62, 0xbf, 0x3a, 0xb2, 0x02, 0x3e, 0x62, 0xb9, 0xe5, 0xbe, 0x83, 0x4d, 0x2d, 0xbf, 0x11, 0x01, 0x23, 0xbf, 0x60, 0x04, 0xbd, 0xbe, 0x3d, 0xd3, 0x33, 0xbf, 0x5f, 0xb6, 0x2d, 0xbf, +0x68, 0xec, 0x5b, 0xbe, 0x6e, 0xc0, 0x47, 0xbf, 0x6c, 0xe7, 0x13, 0xbf, 0x28, 0x43, 0x75, 0xbe, 0xdf, 0xdc, 0x3b, 0xbf, 0x2b, 0x6c, 0x0a, 0xbf, 0xbd, 0x8c, 0xd2, 0xbe, 0x91, 0xb7, 0xbc, 0xbd, 0x7f, 0xdd, 0x39, 0xbe, 0xcf, 0xa3, 0x7a, 0xbf, 0x78, 0xd5, 0x13, 0xbe, 0x53, 0x76, 0x2a, 0xbe, 0x31, 0xb5, 0x79, 0xbf, 0x4b, 0xab, 0xc1, 0xbd, 0x3e, 0x25, 0x87, 0xbd, 0xcf, 0x4a, 0x7e, 0xbf, 0xee, 0x42, 0x23, 0xbe, 0xdd, 0x79, 0xa2, 0xbd, 0x68, 0xe8, 0x7b, 0xbf, 0x87, 0x8b, 0x2c, 0xbe, +0xf6, 0xcf, 0xd3, 0xb8, 0xe7, 0x56, 0x7c, 0xbf, 0x6d, 0x00, 0xd6, 0xbd, 0x53, 0xe8, 0x3c, 0x3c, 0xdd, 0x94, 0x7e, 0xbf, 0xdf, 0xa3, 0x16, 0xbf, 0x31, 0x9a, 0x95, 0xbe, 0x86, 0xff, 0x40, 0xbf, 0xc0, 0xed, 0x39, 0xbf, 0xed, 0x48, 0xbd, 0xbe, 0x08, 0x5b, 0x14, 0xbf, 0xd2, 0x70, 0x4a, 0xbf, 0x3a, 0x5a, 0x85, 0xbe, 0x81, 0xcd, 0x0d, 0xbf, 0x1b, 0x2c, 0x30, 0xbf, 0x29, 0x97, 0x36, 0xbe, 0x13, 0x0b, 0x34, 0xbf, 0xe6, 0x02, 0x03, 0xbf, 0xf6, 0x07, 0x0a, 0xbd, 0x5d, 0xc4, 0x5b, 0xbf, +0x72, 0x88, 0xd0, 0xbe, 0xec, 0x86, 0x4d, 0xbe, 0xad, 0x16, 0x64, 0xbf, 0xb2, 0xbb, 0x4c, 0xbf, 0x11, 0x53, 0xd2, 0xbe, 0x52, 0x27, 0xe0, 0xbe, 0xa2, 0x96, 0x5e, 0xbf, 0xe0, 0x7f, 0xdb, 0xbe, 0x70, 0x40, 0x7b, 0xbe, 0x3f, 0x52, 0x70, 0xbf, 0xc6, 0x32, 0x85, 0xbe, 0xd8, 0x62, 0x67, 0xbe, 0xb2, 0x9e, 0x5e, 0xbf, 0xcd, 0xb1, 0x8c, 0xbe, 0x85, 0x06, 0xd2, 0xbe, 0xc5, 0x04, 0x25, 0xbe, 0x1c, 0xd1, 0x2d, 0x3e, 0x9b, 0xe3, 0x78, 0xbf, 0x5b, 0x28, 0xb9, 0xbd, 0x81, 0xcd, 0x39, 0x3e, +0x36, 0xaf, 0x7a, 0xbf, 0x77, 0xa0, 0x2e, 0xbe, 0xac, 0xe1, 0xa2, 0x3d, 0x55, 0x6d, 0x7b, 0xbf, 0xfb, 0xe8, 0xd4, 0xbd, 0x93, 0x8c, 0xbc, 0x3d, 0x06, 0x85, 0x7d, 0xbf, 0x59, 0x15, 0x61, 0xbd, 0xf5, 0x68, 0x3e, 0x3f, 0xf0, 0x88, 0x2a, 0xbf, 0x92, 0x25, 0xd3, 0xbd, 0xfd, 0x2b, 0x2b, 0x3f, 0xf9, 0x84, 0x3c, 0xbf, 0x29, 0xcc, 0x7b, 0xbd, 0xa4, 0x8d, 0x47, 0x3f, 0x5f, 0x95, 0x1f, 0xbf, 0xa8, 0xc7, 0xb6, 0xbd, 0xe5, 0xd4, 0x36, 0x3f, 0xd8, 0xb9, 0x31, 0xbf, 0x35, 0x96, 0xa0, 0x3e, +0x8a, 0x1d, 0x61, 0x3f, 0x09, 0x6f, 0xb7, 0xbe, 0x01, 0xa2, 0xe0, 0x3c, 0xb7, 0x26, 0x71, 0x3f, 0x74, 0x43, 0xab, 0xbe, 0x26, 0x1d, 0xa5, 0xbd, 0xbd, 0x50, 0x64, 0x3f, 0x9c, 0xe0, 0xe3, 0xbe, 0x26, 0x1d, 0xa5, 0xbd, 0xbd, 0x50, 0x64, 0x3f, 0x9c, 0xe0, 0xe3, 0xbe, 0x2e, 0xfe, 0xb6, 0x3c, 0xa9, 0xbd, 0x54, 0x3f, 0x95, 0x48, 0x0e, 0xbf, 0x01, 0xa2, 0xe0, 0x3c, 0xb7, 0x26, 0x71, 0x3f, 0x74, 0x43, 0xab, 0xbe, 0xd4, 0x0d, 0x94, 0x3e, 0x48, 0xc3, 0x59, 0x3f, 0x67, 0xd0, 0xe0, 0xbe, +0x58, 0x56, 0x0e, 0x3f, 0x9b, 0x04, 0x33, 0x3f, 0x29, 0x08, 0xe6, 0xbe, 0x35, 0x96, 0xa0, 0x3e, 0x8a, 0x1d, 0x61, 0x3f, 0x09, 0x6f, 0xb7, 0xbe, 0x1c, 0x5b, 0x4f, 0x3d, 0xfd, 0x11, 0x46, 0x3f, 0xb4, 0xaa, 0x21, 0xbf, 0xf0, 0x30, 0x6d, 0x3e, 0x87, 0xde, 0x4e, 0x3f, 0x59, 0xa7, 0x0a, 0xbf, 0x1d, 0x72, 0xd3, 0x3d, 0xac, 0xab, 0x3e, 0x3f, 0x37, 0xc4, 0x28, 0xbf, 0xda, 0xe5, 0x93, 0x3e, 0x1d, 0x8f, 0x45, 0x3f, 0x74, 0x0b, 0x11, 0xbf, 0x78, 0xd2, 0x02, 0x3d, 0xd9, 0x7b, 0x39, 0x3f, +0x9e, 0x40, 0x30, 0xbf, 0xf1, 0x2b, 0x56, 0x3b, 0xca, 0xfc, 0x3f, 0x3f, 0x15, 0x57, 0x29, 0xbf, 0x91, 0x64, 0xd6, 0xbc, 0x95, 0xee, 0x4a, 0x3f, 0x70, 0xea, 0x1b, 0xbf, 0xa9, 0xda, 0xf6, 0x3e, 0xe0, 0x83, 0x4b, 0x3f, 0xc7, 0x80, 0xbc, 0xbe, 0xca, 0xe1, 0xcb, 0x3e, 0xdf, 0xf9, 0x59, 0x3f, 0x63, 0xb4, 0xae, 0xbe, 0x02, 0x62, 0x62, 0xbe, 0x0a, 0xd8, 0x66, 0x3f, 0x27, 0x33, 0xbe, 0xbe, 0xa5, 0x11, 0x13, 0xbe, 0x96, 0xd0, 0x59, 0x3f, 0x02, 0x63, 0x01, 0xbf, 0xbd, 0xff, 0x6f, 0x3e, +0xc8, 0x5b, 0x3e, 0x3f, 0xb1, 0x4f, 0x20, 0xbf, 0xe4, 0x2c, 0xec, 0x3e, 0x99, 0x2e, 0x34, 0x3f, 0xba, 0x4b, 0x0a, 0xbf, 0x59, 0xe0, 0x0f, 0x3f, 0x25, 0x5a, 0x26, 0x3f, 0x75, 0x01, 0x03, 0xbf, 0xb2, 0x9e, 0x5e, 0xbf, 0xcd, 0xb1, 0x8c, 0xbe, 0x85, 0x06, 0xd2, 0xbe, 0x3f, 0x52, 0x70, 0xbf, 0xc6, 0x32, 0x85, 0xbe, 0xd8, 0x62, 0x67, 0xbe, 0xce, 0xc1, 0x6f, 0xbf, 0xd3, 0x4d, 0x02, 0xbe, 0x9b, 0x3a, 0xa7, 0xbe, 0xbc, 0x3b, 0x7a, 0xbf, 0xcb, 0xd6, 0xba, 0xbd, 0x3f, 0xe3, 0x42, 0xbe, +0x9f, 0xe7, 0x7b, 0xbf, 0xb9, 0xc1, 0x90, 0x3d, 0x32, 0x75, 0x27, 0xbe, 0x2e, 0x1a, 0x76, 0xbf, 0x0e, 0x82, 0x4e, 0x3d, 0x8d, 0x9b, 0x8a, 0xbe, 0xe1, 0x23, 0x62, 0xbd, 0x48, 0xc3, 0x25, 0x3f, 0xd5, 0x92, 0x42, 0xbf, 0x13, 0x96, 0xf8, 0xbd, 0xa2, 0xeb, 0x1e, 0x3f, 0x88, 0x47, 0x46, 0xbf, 0x13, 0x96, 0xf8, 0xbd, 0xa2, 0xeb, 0x1e, 0x3f, 0x88, 0x47, 0x46, 0xbf, 0xe1, 0x23, 0x62, 0xbd, 0x48, 0xc3, 0x25, 0x3f, 0xd5, 0x92, 0x42, 0xbf, 0x32, 0xc8, 0x71, 0xbf, 0xe9, 0xd7, 0x26, 0x3e, +0x60, 0x1e, 0x92, 0xbe, 0x06, 0x0d, 0x79, 0xbf, 0xf5, 0x9d, 0x2f, 0x3e, 0x50, 0x19, 0x1f, 0xbe, 0x40, 0x8a, 0xca, 0x3e, 0x3e, 0x04, 0x59, 0x3f, 0xe1, 0xee, 0xb4, 0xbe, 0x3d, 0x44, 0x73, 0x3e, 0x81, 0xed, 0x4c, 0x3f, 0x87, 0xdc, 0x0c, 0xbf, 0xc8, 0x93, 0xb4, 0x3e, 0xd5, 0x07, 0x12, 0x3f, 0x60, 0xe4, 0x3d, 0xbf, 0xa9, 0x6b, 0x11, 0x3f, 0x85, 0xea, 0x26, 0x3f, 0x97, 0x8f, 0x00, 0xbf, 0xbb, 0xb7, 0x62, 0xbe, 0x9b, 0x3b, 0x46, 0x3f, 0x40, 0xbf, 0x17, 0xbf, 0xcf, 0x2e, 0x5f, 0xbd, +0x3b, 0x8f, 0x4e, 0x3f, 0xab, 0x94, 0x16, 0xbf, 0x8a, 0x39, 0xa8, 0xbd, 0x3e, 0x7b, 0x3a, 0x3f, 0x3a, 0x1f, 0x2e, 0xbf, 0x8a, 0x59, 0xaf, 0xbe, 0xf2, 0x23, 0xe6, 0x3e, 0xb5, 0x34, 0x53, 0xbf, 0xb3, 0x7b, 0xf2, 0xbd, 0xf8, 0xaa, 0xdd, 0x3e, 0xb1, 0xc3, 0x64, 0xbf, 0x12, 0xa1, 0xd1, 0x3d, 0x24, 0xb9, 0xf4, 0x3e, 0xe3, 0x54, 0x5f, 0xbf, 0x88, 0x9c, 0x7e, 0x3d, 0x37, 0x35, 0x3c, 0x3f, 0x53, 0xcd, 0x2c, 0xbf, 0xab, 0x07, 0xb4, 0xbe, 0x3a, 0xae, 0x52, 0x3f, 0x7e, 0x72, 0xe4, 0xbe, +0xd1, 0x06, 0xe8, 0xbe, 0xc5, 0xfe, 0x56, 0x3f, 0xc0, 0x05, 0x99, 0xbe, 0x3e, 0xe9, 0x40, 0xbf, 0xad, 0xf6, 0xd0, 0x3e, 0x63, 0xed, 0x03, 0xbf, 0x8a, 0xc8, 0x10, 0xbf, 0x1e, 0x54, 0xea, 0x3e, 0x90, 0xa1, 0x2f, 0xbf, 0x3d, 0xb7, 0x90, 0x3d, 0x02, 0x7d, 0x7e, 0xbf, 0x37, 0xa9, 0xa8, 0xbd, 0xc3, 0x46, 0x59, 0x3d, 0x17, 0xd6, 0x7d, 0xbf, 0xb3, 0x7b, 0xf2, 0xbd, 0x90, 0x6a, 0x58, 0x3c, 0xc0, 0x75, 0x7d, 0xbf, 0xa3, 0x40, 0x0f, 0xbe, 0x7c, 0x0e, 0x2c, 0x3d, 0x58, 0x3b, 0x66, 0xbf, +0x49, 0xd5, 0xde, 0xbe, 0x92, 0x21, 0x07, 0x3d, 0x79, 0x8d, 0x7d, 0xbf, 0x0b, 0x27, 0x09, 0xbe, 0x96, 0x95, 0xc6, 0x3d, 0x62, 0x9c, 0x67, 0xbf, 0xed, 0x60, 0xd4, 0xbe, 0xfd, 0xdb, 0x65, 0xbd, 0x94, 0xdc, 0x65, 0xbf, 0xdf, 0x8b, 0xdf, 0xbe, 0x21, 0x1e, 0x89, 0xbc, 0xe0, 0xa0, 0x7d, 0xbf, 0x93, 0xff, 0x09, 0xbe, 0x0a, 0x14, 0xb1, 0x3d, 0x86, 0xe2, 0x7e, 0xbf, 0x2f, 0xdb, 0x0e, 0xbd, 0x39, 0x08, 0x7a, 0x3d, 0xf3, 0x02, 0x40, 0xbf, 0xa6, 0x97, 0x28, 0xbf, 0xa2, 0x7d, 0x0c, 0x3e, +0xf6, 0x45, 0x46, 0xbf, 0x22, 0x15, 0x1e, 0xbf, 0xef, 0xc7, 0x8d, 0x3d, 0xba, 0xf8, 0x13, 0xbf, 0x57, 0x26, 0x50, 0xbf, 0x07, 0xb3, 0x29, 0x3e, 0xfd, 0x84, 0x1b, 0xbf, 0x0d, 0xdf, 0x46, 0xbf, 0xf2, 0xcd, 0xb6, 0xbd, 0xeb, 0x36, 0x3c, 0xbf, 0xde, 0x03, 0x2c, 0xbf, 0x23, 0xf6, 0xe9, 0xbd, 0x8a, 0x74, 0x0b, 0xbf, 0x32, 0xae, 0x54, 0xbf, 0x65, 0x1c, 0xa3, 0x3c, 0x5e, 0x2c, 0x6c, 0xbe, 0xc8, 0x0b, 0x79, 0xbf, 0x2c, 0x9e, 0xfa, 0xbc, 0xe7, 0x1c, 0x5c, 0xbe, 0xa3, 0xe4, 0x79, 0xbf, +0x9e, 0x42, 0x2e, 0x3b, 0x39, 0x9a, 0xc3, 0xbd, 0x2c, 0xd4, 0x7e, 0xbf, 0x4f, 0x3b, 0x3c, 0xbd, 0x4c, 0x34, 0xc8, 0xbd, 0x8c, 0x80, 0x7e, 0xbf, 0xcd, 0x91, 0x55, 0xbd, 0x0d, 0x17, 0x39, 0x3c, 0xad, 0xa2, 0x7f, 0xbf, 0x23, 0x65, 0x0b, 0x3b, 0x39, 0xee, 0x94, 0x3c, 0xfd, 0xf4, 0x7f, 0xbf, 0xfd, 0x2f, 0xf7, 0x3d, 0x19, 0x56, 0x71, 0x3c, 0xb9, 0x19, 0x7e, 0xbf, 0x94, 0x2f, 0xe8, 0x3d, 0xbb, 0xb7, 0xe2, 0xbd, 0x05, 0xc4, 0x7c, 0xbf, 0x23, 0x65, 0x0b, 0x3b, 0x39, 0xee, 0x94, 0x3c, +0xfd, 0xf4, 0x7f, 0xbf, 0x9e, 0x42, 0x2e, 0x3b, 0x39, 0x9a, 0xc3, 0xbd, 0x2c, 0xd4, 0x7e, 0xbf, 0x86, 0x1d, 0xc6, 0x3d, 0x6d, 0x91, 0x64, 0xbe, 0x2b, 0x4f, 0x78, 0xbf, 0x65, 0x1c, 0xa3, 0x3c, 0x5e, 0x2c, 0x6c, 0xbe, 0xc8, 0x0b, 0x79, 0xbf, 0xf8, 0x1b, 0x6d, 0xbb, 0x93, 0x53, 0x0b, 0x3e, 0x1f, 0x9e, 0x7d, 0xbf, 0x27, 0x17, 0x63, 0xbd, 0x5d, 0x88, 0xf5, 0x3d, 0xc6, 0xc1, 0x7d, 0xbf, 0xee, 0xe9, 0x6a, 0xbd, 0x3c, 0xa2, 0x72, 0x3e, 0xa6, 0x46, 0x78, 0xbf, 0xef, 0xac, 0x5d, 0xbc, +0xad, 0xf8, 0x86, 0x3e, 0xa2, 0xeb, 0x76, 0xbf, 0xef, 0xac, 0x5d, 0xbc, 0xad, 0xf8, 0x86, 0x3e, 0xa2, 0xeb, 0x76, 0xbf, 0x10, 0xcf, 0xb2, 0x3d, 0x45, 0xb7, 0x96, 0x3e, 0x59, 0xa2, 0x73, 0xbf, 0xf8, 0x1b, 0x6d, 0xbb, 0x93, 0x53, 0x0b, 0x3e, 0x1f, 0x9e, 0x7d, 0xbf, 0xed, 0x0b, 0xe8, 0x3d, 0xf4, 0xbf, 0x1c, 0x3e, 0x7f, 0x50, 0x7b, 0xbf, 0x82, 0x8d, 0xeb, 0xbc, 0x47, 0x56, 0xbe, 0x3e, 0x01, 0x8a, 0x6d, 0xbf, 0x43, 0x37, 0x7b, 0xbd, 0x0f, 0x42, 0xb8, 0x3e, 0xc5, 0x54, 0x6e, 0xbf, +0xa4, 0xc1, 0x8d, 0xbd, 0x5b, 0xb3, 0xf5, 0x3e, 0x97, 0xe5, 0x5f, 0xbf, 0x24, 0x7f, 0x30, 0xbd, 0xbe, 0x6b, 0xf8, 0x3e, 0x57, 0x93, 0x5f, 0xbf, 0x24, 0x7f, 0x30, 0xbd, 0xbe, 0x6b, 0xf8, 0x3e, 0x57, 0x93, 0x5f, 0xbf, 0x18, 0xd0, 0x8b, 0x3c, 0xc4, 0x78, 0xf5, 0x3e, 0xf1, 0x9d, 0x60, 0xbf, 0x82, 0x8d, 0xeb, 0xbc, 0x47, 0x56, 0xbe, 0x3e, 0x01, 0x8a, 0x6d, 0xbf, 0x17, 0x9e, 0x57, 0x3d, 0xd4, 0xd7, 0xcb, 0x3e, 0xfc, 0x72, 0x6a, 0xbf, 0x5a, 0xf1, 0x0d, 0xbd, 0xc5, 0xc8, 0x42, 0x3f, +0x7e, 0xe1, 0x25, 0xbf, 0x0c, 0x8e, 0x92, 0x3d, 0xc6, 0x6a, 0x3b, 0x3f, 0x0d, 0x6c, 0x2d, 0xbf, 0x59, 0x8a, 0x44, 0x3e, 0xad, 0x69, 0x22, 0x3f, 0xd9, 0xaf, 0x3f, 0xbf, 0x83, 0x85, 0x9b, 0x3e, 0xda, 0xc7, 0xea, 0x3e, 0xcd, 0xcb, 0x55, 0xbf, 0x57, 0xd0, 0xc4, 0x3e, 0xd8, 0x65, 0x90, 0x3e, 0x2d, 0x08, 0x61, 0xbf, 0xec, 0xf5, 0xd6, 0x3e, 0xb3, 0x5d, 0xe1, 0x3d, 0x62, 0xa1, 0x66, 0xbf, 0x33, 0x17, 0xd0, 0x3e, 0xa5, 0xba, 0x80, 0xbd, 0x3e, 0x59, 0x69, 0xbf, 0x97, 0x39, 0xb5, 0x3e, +0x17, 0xb7, 0x61, 0xbe, 0xb8, 0xae, 0x68, 0xbf, 0x4b, 0x21, 0x90, 0x3e, 0x1b, 0x65, 0xb5, 0xbe, 0x62, 0x4a, 0x64, 0xbf, 0x35, 0x43, 0x8a, 0x3d, 0xea, 0x08, 0x00, 0xbf, 0xf3, 0x01, 0x5d, 0xbf, 0xe7, 0x50, 0x46, 0x3e, 0x0a, 0xa0, 0xf0, 0xbe, 0xe6, 0x75, 0x5c, 0xbf, 0x80, 0x2b, 0x19, 0xbe, 0xa2, 0x62, 0xd4, 0xbe, 0x54, 0xc4, 0x65, 0xbf, 0xfd, 0xd7, 0x69, 0xbe, 0xa4, 0x00, 0x99, 0xbe, 0x48, 0x34, 0x6d, 0xbf, 0xaa, 0x9b, 0x93, 0xbe, 0xfa, 0x9a, 0x25, 0xbe, 0xe5, 0x9b, 0x71, 0xbf, +0x78, 0xef, 0x98, 0xbe, 0x59, 0x86, 0xb8, 0xbc, 0xa7, 0x3e, 0x74, 0xbf, 0xb0, 0x74, 0x7e, 0xbe, 0xd2, 0x37, 0xd1, 0x3e, 0x28, 0xd3, 0x60, 0xbf, 0xe4, 0x67, 0x43, 0xbe, 0x67, 0x62, 0x9a, 0x3e, 0x70, 0x25, 0x6f, 0xbf, 0x59, 0x52, 0xc6, 0xbe, 0x88, 0xbe, 0x4b, 0x3e, 0x08, 0x74, 0x66, 0xbf, 0xa4, 0x52, 0x7c, 0xbe, 0x9d, 0x4b, 0x01, 0x3e, 0xef, 0xfd, 0x75, 0xbf, 0x13, 0x96, 0xf8, 0xbd, 0xa2, 0xeb, 0x1e, 0x3f, 0x88, 0x47, 0x46, 0xbf, 0x2a, 0xc6, 0x19, 0xbe, 0x51, 0x2e, 0x05, 0x3f, +0x19, 0x39, 0x57, 0xbf, 0x2e, 0xfe, 0xb6, 0x3c, 0xa9, 0xbd, 0x54, 0x3f, 0x95, 0x48, 0x0e, 0xbf, 0x9a, 0xd0, 0x04, 0xbe, 0xaf, 0x3e, 0x9e, 0x3e, 0xf0, 0x30, 0x71, 0xbf, 0xa3, 0x05, 0x88, 0xbd, 0x8f, 0x38, 0x9c, 0x3e, 0xdf, 0x32, 0x73, 0xbf, 0xcf, 0xa0, 0x61, 0xbd, 0x6e, 0xa4, 0xec, 0x3e, 0xc0, 0x93, 0x62, 0xbf, 0xf1, 0x67, 0xb8, 0xbd, 0xda, 0xe3, 0xe5, 0x3e, 0x42, 0x94, 0x63, 0xbf, 0xc0, 0xe8, 0x92, 0xbd, 0x5c, 0x57, 0x44, 0x3f, 0xab, 0x3e, 0x23, 0xbf, 0x4b, 0xe6, 0x90, 0xbe, +0xb5, 0x8b, 0xe9, 0xbc, 0xf8, 0x6c, 0x75, 0xbf, 0x59, 0x50, 0x90, 0xbe, 0xe4, 0x85, 0x44, 0xbe, 0x1a, 0xa8, 0x70, 0xbf, 0xa4, 0xa9, 0x9e, 0xbe, 0xb1, 0xa5, 0x77, 0xbe, 0x6b, 0x64, 0x6b, 0xbf, 0xa3, 0xe5, 0xa8, 0xbe, 0xa2, 0x7a, 0x83, 0xbe, 0x9b, 0x8e, 0x68, 0xbf, 0x2b, 0xdf, 0xb3, 0xbe, 0x0d, 0xaa, 0xad, 0xbd, 0x7d, 0xb2, 0x6e, 0xbf, 0x23, 0x66, 0xbe, 0xbe, 0x48, 0x32, 0xab, 0xbd, 0xd1, 0xac, 0x6c, 0xbf, 0x5c, 0x1b, 0x7a, 0xbe, 0xd9, 0xb5, 0xbd, 0xbe, 0xf9, 0x68, 0x65, 0xbf, +0x66, 0x15, 0x86, 0xbe, 0xe2, 0xb0, 0xcc, 0xbe, 0xe3, 0xde, 0x60, 0xbf, 0x90, 0xbf, 0x74, 0xbe, 0xd1, 0xb1, 0xb3, 0xbe, 0x65, 0xc6, 0x67, 0xbf, 0x93, 0xff, 0x69, 0xbe, 0xf1, 0x0c, 0x8a, 0x3e, 0x1c, 0x7a, 0x6f, 0xbf, 0xd2, 0xab, 0x81, 0xbe, 0xd8, 0xf2, 0xea, 0x3d, 0xfb, 0xe7, 0x75, 0xbf, 0x8b, 0xa6, 0xc3, 0xbe, 0xbc, 0x21, 0x8d, 0x3d, 0xc8, 0xe9, 0x6b, 0xbf, 0x9f, 0xaa, 0xca, 0xbe, 0x1e, 0xa5, 0xb2, 0x3d, 0x1c, 0x07, 0x6a, 0xbf, 0xb1, 0x87, 0xc6, 0xbe, 0x4b, 0xe5, 0x85, 0x3e, +0x6b, 0x46, 0x62, 0xbf, 0xac, 0x02, 0xcd, 0xbe, 0x1b, 0x2d, 0x97, 0x3e, 0xed, 0x11, 0x5e, 0xbf, 0xef, 0xe5, 0x2e, 0x3e, 0x48, 0x32, 0xfb, 0xbe, 0x9c, 0xbe, 0x5a, 0xbf, 0xd0, 0x99, 0x74, 0x3d, 0xff, 0x91, 0x09, 0xbf, 0x42, 0x5a, 0x57, 0xbf, 0xe1, 0xed, 0xc1, 0x3c, 0x54, 0xe5, 0xfb, 0xbe, 0xcd, 0xca, 0x5e, 0xbf, 0x79, 0x57, 0x0d, 0x3e, 0xff, 0x1f, 0xf7, 0xbe, 0x66, 0x67, 0x5d, 0xbf, 0x20, 0xd1, 0x44, 0x3d, 0xbe, 0xda, 0x15, 0xbf, 0x0a, 0x31, 0x4f, 0xbf, 0x29, 0xb0, 0x30, 0x3e, +0xf4, 0xfa, 0x0b, 0xbf, 0x1f, 0xbd, 0x51, 0xbf, 0x79, 0x57, 0x0d, 0x3e, 0xff, 0x1f, 0xf7, 0xbe, 0x66, 0x67, 0x5d, 0xbf, 0x07, 0x3d, 0x7b, 0x3e, 0xcc, 0x41, 0xc8, 0xbe, 0x66, 0x14, 0x63, 0xbf, 0x29, 0xb0, 0x30, 0x3e, 0xf4, 0xfa, 0x0b, 0xbf, 0x1f, 0xbd, 0x51, 0xbf, 0x85, 0x09, 0x8b, 0x3e, 0xa3, 0xe8, 0xd9, 0xbe, 0xdf, 0xfa, 0x5c, 0xbf, 0xaa, 0xb8, 0x81, 0x3e, 0xda, 0x36, 0xc4, 0xbe, 0xa6, 0x62, 0x63, 0xbf, 0xa5, 0xda, 0x27, 0xbe, 0x0f, 0xd0, 0xed, 0xbe, 0xcd, 0xca, 0x5e, 0xbf, +0xdd, 0xd1, 0x1f, 0xbe, 0xa5, 0x66, 0xdf, 0xbe, 0x88, 0xda, 0x62, 0xbf, 0x0f, 0x48, 0x32, 0xbe, 0x71, 0xe8, 0xfd, 0xbe, 0x18, 0xca, 0x59, 0xbf, 0xb2, 0x67, 0x9f, 0x3e, 0x72, 0xc3, 0x6f, 0xbe, 0xc9, 0xc6, 0x6b, 0xbf, 0xda, 0xff, 0xa0, 0x3e, 0x15, 0x1d, 0x69, 0xbe, 0x35, 0xec, 0x6b, 0xbf, 0x75, 0xe7, 0xa9, 0x3e, 0x6d, 0x90, 0x81, 0xbe, 0x6e, 0xa4, 0x68, 0xbf, 0x4e, 0x7e, 0xab, 0x3e, 0x97, 0x53, 0x42, 0xbd, 0x10, 0xe8, 0x70, 0xbf, 0x74, 0xb3, 0xb7, 0x3e, 0x12, 0x2c, 0x8e, 0xbd, +0x12, 0x4b, 0x6e, 0xbf, 0xcd, 0x3d, 0xb4, 0x3e, 0xb7, 0x43, 0x83, 0xbd, 0xdc, 0x0c, 0x6f, 0xbf, 0xb0, 0x71, 0xbd, 0x3e, 0xc7, 0xb7, 0xf7, 0x3d, 0x96, 0xce, 0x6b, 0xbf, 0x41, 0xd7, 0xa6, 0x3e, 0x8d, 0x28, 0x0d, 0x3e, 0xbd, 0x70, 0x6f, 0xbf, 0xf2, 0x22, 0xbb, 0x3e, 0xf5, 0xd9, 0x01, 0x3e, 0xe8, 0x10, 0x6c, 0xbf, 0x75, 0x72, 0x96, 0x3e, 0xc0, 0xaf, 0xa9, 0x3e, 0xe4, 0x84, 0x65, 0xbf, 0x6c, 0x09, 0xb1, 0x3e, 0xc8, 0xb1, 0xad, 0x3e, 0xb6, 0xf5, 0x5f, 0xbf, 0x6c, 0x07, 0xb3, 0x3e, +0xe0, 0x13, 0xa3, 0x3e, 0xcd, 0x8d, 0x61, 0xbf, 0x22, 0x8a, 0x39, 0x3e, 0x63, 0xd5, 0x38, 0x3f, 0x13, 0xf1, 0x2a, 0xbf, 0x8b, 0x8c, 0x4e, 0x3d, 0x96, 0x75, 0x53, 0x3f, 0x52, 0xb7, 0x0f, 0xbf, 0x49, 0x10, 0xae, 0xb8, 0xa6, 0x7b, 0x45, 0x3f, 0x75, 0xe6, 0x22, 0xbf, 0x74, 0x9b, 0xf0, 0x3c, 0x6f, 0xd6, 0x5c, 0x3f, 0x9a, 0x44, 0x01, 0xbf, 0x57, 0xd1, 0xff, 0x3d, 0x92, 0xad, 0x2e, 0x3f, 0xcb, 0x64, 0x38, 0xbf, 0x60, 0x94, 0x30, 0x3e, 0xd1, 0xcf, 0x40, 0x3f, 0xa1, 0x83, 0x22, 0xbf, +0xc0, 0x24, 0xb5, 0xbd, 0x14, 0x07, 0x4c, 0x3f, 0x2c, 0xf5, 0x18, 0xbf, 0x20, 0x96, 0xad, 0xbd, 0xeb, 0xe4, 0x60, 0x3f, 0x0a, 0xbb, 0xf0, 0xbe, 0x49, 0x10, 0xae, 0xb8, 0xa6, 0x7b, 0x45, 0x3f, 0x75, 0xe6, 0x22, 0xbf, 0x74, 0x9b, 0xf0, 0x3c, 0x6f, 0xd6, 0x5c, 0x3f, 0x9a, 0x44, 0x01, 0xbf, 0xfc, 0xde, 0x66, 0xbd, 0x8a, 0x21, 0x51, 0x3f, 0x24, 0xf1, 0x12, 0xbf, 0x30, 0x0d, 0x93, 0x3e, 0x05, 0xfc, 0x06, 0x3f, 0xa2, 0xb7, 0x4c, 0xbf, 0x4a, 0xd1, 0x6a, 0x3e, 0xb6, 0xbd, 0x05, 0x3f, +0xd1, 0x3e, 0x52, 0xbf, 0xcf, 0xa0, 0x91, 0x3e, 0xf8, 0xc0, 0x0e, 0x3f, 0x77, 0xa3, 0x47, 0xbf, 0xc1, 0x37, 0x3d, 0xbe, 0xfc, 0x6f, 0xf5, 0x3e, 0xe4, 0xa1, 0x5b, 0xbf, 0xc5, 0xe3, 0x22, 0xbe, 0x09, 0xa8, 0x34, 0x3f, 0x48, 0xc0, 0x30, 0xbf, 0xdf, 0x19, 0x9d, 0xbe, 0xef, 0x8f, 0x03, 0x3f, 0x1a, 0x14, 0x4d, 0xbf, 0x0d, 0x8b, 0x21, 0xbe, 0x93, 0xe2, 0x43, 0x3f, 0x3e, 0xcb, 0x1f, 0xbf, 0xdd, 0x96, 0xa0, 0xbe, 0xd6, 0x17, 0x11, 0x3f, 0xc0, 0x07, 0x43, 0xbf, 0xc7, 0x81, 0x97, 0xbd, +0x62, 0x2c, 0x47, 0x3f, 0xbf, 0xb5, 0x1f, 0xbf, 0xb3, 0x09, 0x90, 0xbd, 0xa2, 0xec, 0x55, 0x3f, 0xef, 0x74, 0x0b, 0xbf, 0xf6, 0xcf, 0xb3, 0xbd, 0x29, 0xb1, 0x4b, 0x3f, 0xc2, 0x6d, 0x19, 0xbf, 0xc6, 0x87, 0xb9, 0xbd, 0x56, 0xf4, 0x5b, 0x3f, 0x60, 0xe9, 0x00, 0xbf, 0xf3, 0x93, 0x7a, 0xbe, 0x43, 0x6f, 0xf1, 0xbc, 0x36, 0x1a, 0x78, 0xbf, 0xee, 0x79, 0x6e, 0xbe, 0x66, 0xf4, 0x13, 0xbe, 0xb1, 0x32, 0x76, 0xbf, 0x09, 0x32, 0x42, 0xbe, 0x70, 0x0b, 0x86, 0xbe, 0x0b, 0x41, 0x72, 0xbf, +0xa6, 0x09, 0x7b, 0xbe, 0xba, 0x32, 0x48, 0x3e, 0xd3, 0x16, 0x73, 0xbf, 0xb9, 0xc1, 0x80, 0xbe, 0x3a, 0x3e, 0x9a, 0x3d, 0x85, 0x05, 0x77, 0xbf, 0xcc, 0xd2, 0x8e, 0x3d, 0x9c, 0xdf, 0xb0, 0xbe, 0x35, 0x93, 0x6f, 0xbf, 0x9e, 0x08, 0xe2, 0xbb, 0x0d, 0x6c, 0xa5, 0xbe, 0x89, 0x43, 0x72, 0xbf, 0xcc, 0xd2, 0x8e, 0x3d, 0x9c, 0xdf, 0xb0, 0xbe, 0x35, 0x93, 0x6f, 0xbf, 0xac, 0xc7, 0x2d, 0x3e, 0xe4, 0x13, 0x9a, 0xbe, 0x8e, 0x3c, 0x70, 0xbf, 0x76, 0xfe, 0xed, 0xbd, 0x72, 0x8b, 0xa1, 0xbe, +0x5d, 0x18, 0x71, 0xbf, 0x66, 0xdc, 0x74, 0x3e, 0xa6, 0xee, 0x2a, 0xbe, 0x59, 0xdf, 0x74, 0xbf, 0xde, 0x00, 0x83, 0x3e, 0xbd, 0x72, 0x3d, 0xbc, 0xea, 0x75, 0x77, 0xbf, 0xec, 0xa2, 0x78, 0x3e, 0x3c, 0x4f, 0x1c, 0x3e, 0xc4, 0x3e, 0x75, 0xbf, 0x15, 0x1f, 0x4f, 0x3e, 0x1e, 0x51, 0xa1, 0x3e, 0x2c, 0x61, 0x6d, 0xbf, 0xcf, 0xa2, 0x77, 0x3d, 0x21, 0x74, 0x10, 0x3f, 0x82, 0xc8, 0x52, 0xbf, 0x92, 0xb2, 0x05, 0xbd, 0x09, 0x6b, 0x1b, 0x3f, 0x81, 0x40, 0x4b, 0xbf, 0x92, 0xb2, 0x05, 0xbd, +0x09, 0x6b, 0x1b, 0x3f, 0x81, 0x40, 0x4b, 0xbf, 0xa4, 0x37, 0x9c, 0xbd, 0x7b, 0x4b, 0x19, 0x3f, 0xb5, 0x18, 0x4c, 0xbf, 0x94, 0x4e, 0x14, 0x3e, 0x72, 0x6d, 0xe8, 0x3e, 0x7b, 0x11, 0x61, 0xbf, 0x95, 0xd6, 0x4f, 0xbe, 0x47, 0x75, 0xba, 0x3e, 0x9f, 0xb0, 0x68, 0xbf, 0x64, 0xb1, 0xed, 0xbd, 0x37, 0x1c, 0x06, 0x3f, 0xf2, 0x06, 0x58, 0xbf, 0x20, 0x09, 0x7b, 0xbd, 0x59, 0xf9, 0x15, 0x3f, 0x3b, 0xe0, 0x4e, 0xbf, 0x5f, 0xd1, 0x8d, 0xbd, 0x0c, 0x40, 0x17, 0x3f, 0x7a, 0xc7, 0x4d, 0xbf, +0xf7, 0xc7, 0x7b, 0xbd, 0x2e, 0x3a, 0xf1, 0x3e, 0xc8, 0x41, 0x61, 0xbf, 0xf0, 0x4e, 0x7e, 0xbd, 0x28, 0xd2, 0xad, 0x3e, 0x45, 0x45, 0x70, 0xbf, 0xa9, 0xda, 0x8e, 0xbd, 0x15, 0x3b, 0x5a, 0x3e, 0x0f, 0x7b, 0x79, 0xbf, 0x5e, 0x0e, 0x9b, 0xbd, 0x86, 0x1c, 0xdb, 0x3d, 0x9f, 0xca, 0x7d, 0xbf, 0x3f, 0x1b, 0x99, 0xbd, 0x90, 0x82, 0x27, 0x3c, 0x28, 0x45, 0x7f, 0xbf, 0x72, 0xfe, 0x86, 0xbd, 0x21, 0xcc, 0xad, 0xbd, 0x8b, 0x84, 0x7e, 0xbf, 0xb2, 0xd8, 0x66, 0xbd, 0xdc, 0x2a, 0x48, 0xbe, +0x83, 0xa5, 0x7a, 0xbf, 0x3b, 0xa6, 0x6e, 0xbd, 0x52, 0x0c, 0xa0, 0xbe, 0x8d, 0xb6, 0x72, 0xbf, 0xaf, 0xce, 0x91, 0xbd, 0xbf, 0xd5, 0x0e, 0xbf, 0x26, 0xaa, 0x53, 0xbf, 0x3d, 0x48, 0x8f, 0xbd, 0xca, 0x6e, 0xee, 0xbe, 0x7c, 0xd6, 0x61, 0xbf, 0x8c, 0x68, 0x3b, 0xbd, 0x27, 0xf2, 0xf4, 0xbe, 0x67, 0x7f, 0x60, 0xbf, 0xf1, 0x67, 0x78, 0xbd, 0x04, 0xca, 0x06, 0xbf, 0x55, 0x16, 0x59, 0xbf, 0x7e, 0xab, 0xf5, 0xbc, 0xaa, 0x9d, 0x0d, 0xbf, 0xd5, 0x1f, 0x55, 0xbf, 0x6e, 0xa2, 0x96, 0xbc, +0x85, 0xd1, 0x3c, 0xbf, 0xfb, 0xcd, 0x2c, 0xbf, 0xa4, 0xe1, 0x14, 0xbc, 0xb1, 0xbe, 0x65, 0xbf, 0x20, 0xd0, 0xe1, 0xbe, 0x00, 0x18, 0xcf, 0xba, 0x2e, 0x70, 0x7d, 0xbf, 0xe1, 0x7e, 0x10, 0xbe, 0x62, 0xdc, 0x9d, 0xbe, 0xff, 0x78, 0x73, 0xbf, 0x53, 0x7a, 0xa6, 0xbc, 0x7f, 0xbd, 0xe2, 0xbd, 0x55, 0x6a, 0x7e, 0xbf, 0x83, 0xfa, 0x16, 0xbc, 0xba, 0x12, 0xe9, 0xbe, 0xac, 0xc9, 0x63, 0xbf, 0xb6, 0xda, 0x03, 0xbd, 0x53, 0xb2, 0x18, 0xbf, 0xa7, 0x07, 0x4d, 0xbf, 0xeb, 0x1b, 0x58, 0xbd, +0x92, 0xeb, 0x02, 0xbf, 0x5e, 0xbd, 0x52, 0x3f, 0xf1, 0x7e, 0x7c, 0xbe, 0x3c, 0xde, 0x64, 0xbd, 0x11, 0xe0, 0x74, 0x3f, 0x72, 0x86, 0x92, 0xbe, 0x32, 0xc6, 0x73, 0xbf, 0x8d, 0x28, 0x95, 0x3e, 0x23, 0x4a, 0xbb, 0xbd, 0x2c, 0x11, 0x54, 0xbf, 0x56, 0xd7, 0x09, 0x3f, 0xe1, 0x27, 0x1e, 0xbe, 0xcb, 0x81, 0x36, 0xbf, 0x0b, 0x9a, 0x32, 0xbf, 0x5c, 0x05, 0x91, 0xbd, 0x49, 0xd5, 0x76, 0xbf, 0x27, 0x17, 0x83, 0xbe, 0x2d, 0x97, 0x8d, 0xbd, 0x49, 0xd5, 0x76, 0xbf, 0x27, 0x17, 0x83, 0xbe, +0x2d, 0x97, 0x8d, 0xbd, 0xd2, 0x87, 0x7e, 0xbf, 0x78, 0xf1, 0x9e, 0xbd, 0x9e, 0xd1, 0x96, 0xbd, 0x64, 0x57, 0x7e, 0xbf, 0x9e, 0x42, 0xae, 0x3d, 0xe8, 0x4c, 0x9a, 0xbd, 0xb1, 0xfb, 0x7a, 0xbf, 0x29, 0x09, 0x39, 0x3e, 0xe1, 0xb4, 0xa0, 0xbd, 0xf8, 0x54, 0x1e, 0xbf, 0x03, 0x06, 0x49, 0x3f, 0x74, 0x9b, 0xf0, 0xbc, 0x38, 0x2d, 0x7c, 0xbf, 0x92, 0x25, 0x13, 0x3e, 0x3e, 0x41, 0xc2, 0xbd, 0xd7, 0x50, 0x0a, 0xbf, 0x17, 0x7f, 0x53, 0x3f, 0xa4, 0xa8, 0x23, 0xbe, 0xbb, 0x62, 0x66, 0xbf, +0x37, 0xc2, 0x9a, 0x3e, 0xf8, 0xe1, 0xa0, 0xbe, 0x83, 0xde, 0x5b, 0xbf, 0x67, 0x7d, 0xfa, 0xbe, 0x23, 0x4a, 0x1b, 0xbe, 0xa2, 0x2a, 0x36, 0xbf, 0xac, 0x52, 0x2e, 0xbf, 0x6d, 0x37, 0x31, 0xbe, 0xde, 0x92, 0x44, 0xbf, 0xc5, 0x92, 0x8a, 0xbe, 0x1a, 0xa4, 0x14, 0xbf, 0x65, 0x50, 0x59, 0xbf, 0x23, 0x4d, 0xc4, 0xbe, 0x2b, 0x4d, 0xba, 0xbe, 0x32, 0x04, 0x2c, 0xbf, 0x5d, 0x15, 0x28, 0xbf, 0x2a, 0x6f, 0xaf, 0xbe, 0x64, 0x21, 0x1a, 0xbf, 0xc1, 0x3b, 0x1d, 0xbf, 0xb3, 0x9a, 0x02, 0xbf, +0x86, 0xab, 0xc3, 0xbe, 0xdc, 0x29, 0x0d, 0xbe, 0xa7, 0xeb, 0x69, 0xbf, 0x8c, 0x83, 0x1b, 0xbf, 0xe4, 0x9f, 0x39, 0xbe, 0x09, 0xfc, 0x45, 0xbf, 0x5a, 0xf3, 0xfb, 0xbe, 0x36, 0x39, 0x10, 0xbf, 0x47, 0xe6, 0x29, 0xbf, 0x43, 0xe5, 0xa7, 0xbe, 0x7d, 0x79, 0x09, 0xbf, 0x9c, 0xf8, 0x46, 0xbf, 0xaf, 0x20, 0x0d, 0xbe, 0xdc, 0xd9, 0x07, 0xbe, 0xae, 0x45, 0x7b, 0xbf, 0x0c, 0x8f, 0x0d, 0xbe, 0x9f, 0x57, 0x0c, 0xbf, 0x63, 0x28, 0x53, 0xbf, 0xd9, 0x3f, 0x8f, 0x3d, 0x07, 0xec, 0x12, 0xbf, +0x54, 0xe0, 0x50, 0xbf, 0x99, 0x7c, 0xf3, 0x3d, 0xb9, 0x55, 0xf0, 0xbd, 0x17, 0x67, 0x7c, 0xbf, 0xd0, 0x0c, 0x8a, 0x3e, 0xef, 0xad, 0x20, 0xbf, 0x88, 0xf5, 0x3a, 0xbf, 0x3e, 0x7b, 0xd6, 0x3e, 0xb2, 0x64, 0xae, 0xbd, 0x50, 0x6e, 0x67, 0xbf, 0x94, 0x4a, 0x40, 0x3f, 0xa7, 0x22, 0x95, 0x3c, 0xd0, 0xee, 0x28, 0xbf, 0x08, 0xe5, 0xfd, 0x3e, 0x74, 0xb4, 0x32, 0xbf, 0x0c, 0x3b, 0x04, 0xbf, 0x48, 0xc5, 0x73, 0xbf, 0x47, 0xac, 0x05, 0x3d, 0x2d, 0x76, 0x9b, 0x3e, 0xda, 0x72, 0x6e, 0xbf, +0x98, 0x18, 0x2b, 0x3e, 0x62, 0x83, 0xa5, 0x3e, 0x57, 0x95, 0x75, 0xbf, 0x9b, 0x3a, 0x0f, 0x3d, 0x04, 0x74, 0x8f, 0x3e, 0xb4, 0x58, 0x72, 0xbf, 0x54, 0xfc, 0x2f, 0x3e, 0x97, 0x8c, 0x8b, 0x3e, 0x6d, 0xe1, 0x71, 0xbf, 0x65, 0x1a, 0xcd, 0x3c, 0x7b, 0x32, 0xa7, 0x3e, 0xdd, 0x5e, 0x6a, 0xbf, 0xbc, 0x94, 0x1a, 0x3e, 0x9e, 0xec, 0xbe, 0x3e, 0x1d, 0x05, 0x70, 0xbf, 0xc5, 0x8e, 0x46, 0x3c, 0xe9, 0xf3, 0xb1, 0x3e, 0x7b, 0x65, 0x66, 0xbf, 0xfb, 0xe3, 0xfd, 0x3d, 0x7b, 0xf9, 0xd5, 0x3e, +0x81, 0x41, 0x6e, 0xbf, 0xe9, 0x7f, 0xb9, 0xbb, 0x78, 0x46, 0xbb, 0x3e, 0x20, 0xb8, 0x62, 0xbf, 0x15, 0x18, 0xb2, 0x3d, 0x21, 0x92, 0xe9, 0x3e, 0x27, 0xbc, 0x6c, 0xbf, 0x04, 0x6e, 0xdd, 0xbc, 0xf2, 0x5d, 0xc2, 0x3e, 0x18, 0x96, 0x5f, 0xbf, 0x5e, 0x65, 0x2d, 0x3d, 0xb1, 0x6a, 0xf8, 0x3e, 0x50, 0x72, 0x6b, 0xbf, 0xd1, 0xcf, 0x54, 0xbd, 0x3a, 0x3d, 0xc7, 0x3e, 0xda, 0x1a, 0x5d, 0xbf, 0x94, 0xbd, 0x25, 0xbc, 0xd6, 0x00, 0x01, 0x3f, 0xd5, 0x77, 0x6a, 0xbf, 0x32, 0x04, 0xa0, 0xbd, +0x99, 0x99, 0xc9, 0x3e, 0x44, 0x69, 0x5b, 0xbf, 0x2b, 0x30, 0x84, 0xbd, 0x8c, 0xd9, 0x02, 0x3f, 0xec, 0xf6, 0x69, 0xbf, 0x35, 0x44, 0xd5, 0xbd, 0xad, 0xdb, 0xc8, 0x3e, 0x64, 0xac, 0x5a, 0xbf, 0x8d, 0x9a, 0xef, 0xbd, 0x0b, 0xb2, 0x01, 0x3f, 0x53, 0xe7, 0x69, 0xbf, 0x33, 0x54, 0x05, 0xbe, 0xda, 0x1e, 0xc5, 0x3e, 0xd5, 0xb1, 0x5a, 0xbf, 0xb3, 0xd0, 0x2e, 0xbe, 0x84, 0x62, 0xfb, 0x3e, 0xec, 0x4b, 0x6a, 0xbf, 0x7c, 0x80, 0x1e, 0xbe, 0x81, 0x7b, 0xbe, 0x3e, 0x6f, 0x63, 0x5b, 0xbf, +0xea, 0x25, 0x66, 0xbe, 0xfc, 0x6f, 0xed, 0x3e, 0xaa, 0x27, 0x6b, 0xbf, 0x12, 0xc2, 0x33, 0xbe, 0x22, 0x50, 0xb5, 0x3e, 0x5a, 0xd7, 0x5c, 0xbf, 0x49, 0xf4, 0x8a, 0xbe, 0xec, 0x85, 0xda, 0x3e, 0xa9, 0xa2, 0x6c, 0xbf, 0xfb, 0x94, 0x43, 0xbe, 0x54, 0x1a, 0xa9, 0x3e, 0x46, 0xec, 0x5f, 0xbf, 0xde, 0x00, 0x9b, 0xbe, 0xa8, 0xc8, 0xc1, 0x3e, 0xf3, 0x54, 0x6f, 0xbf, 0x2a, 0xe0, 0x4e, 0xbe, 0xdf, 0x6a, 0x95, 0x3e, 0x04, 0x71, 0x66, 0xbf, 0xcd, 0xaf, 0xa6, 0xbe, 0xa2, 0x24, 0x94, 0x3e, +0x5e, 0x49, 0x6e, 0xbf, 0xc5, 0xab, 0x4c, 0xbe, 0xea, 0xae, 0x9c, 0x3e, 0x19, 0xfe, 0x63, 0xbf, 0xfc, 0xa7, 0xa3, 0xbe, 0x12, 0xa5, 0xa5, 0x3e, 0x42, 0x60, 0x65, 0xbf, 0xd7, 0x33, 0x94, 0x3e, 0x1a, 0x6a, 0xac, 0x3e, 0x4d, 0x31, 0x6b, 0xbf, 0xcb, 0x9f, 0x97, 0x3e, 0xd2, 0xc2, 0x85, 0x3e, 0x67, 0x42, 0x5f, 0xbf, 0xfa, 0x27, 0x88, 0x3e, 0x2b, 0x4d, 0xd2, 0x3e, 0xfa, 0x45, 0x59, 0xbf, 0x5d, 0xdf, 0x67, 0x3e, 0xf7, 0xaf, 0xf4, 0x3e, 0x40, 0xbf, 0x53, 0xbf, 0xa1, 0xda, 0x30, 0x3e, +0xfb, 0xe8, 0x08, 0x3f, 0x10, 0x01, 0x4f, 0xbf, 0x3b, 0x19, 0xdc, 0x3d, 0x09, 0x15, 0x14, 0x3f, 0xb3, 0x5b, 0x4b, 0xbf, 0xf7, 0x92, 0x06, 0x3d, 0xaa, 0x46, 0x1b, 0x3f, 0xc8, 0x0b, 0x49, 0xbf, 0xee, 0xe8, 0x3f, 0xbd, 0xfb, 0x06, 0x1e, 0x3f, 0x5e, 0x11, 0x48, 0xbf, 0x28, 0xb3, 0x01, 0xbe, 0x8d, 0x63, 0x1c, 0x3f, 0x73, 0x2b, 0x48, 0xbf, 0x11, 0xc8, 0x55, 0xbe, 0x31, 0x5f, 0x16, 0x3f, 0xdc, 0x2d, 0x49, 0xbf, 0xaa, 0x43, 0x96, 0xbe, 0x58, 0x59, 0x0b, 0x3f, 0x75, 0x3f, 0x4b, 0xbf, +0x1c, 0xed, 0xb8, 0xbe, 0x23, 0x6a, 0xfa, 0x3e, 0x12, 0x9f, 0x4f, 0xbf, 0x13, 0x98, 0xce, 0xbe, 0x0d, 0xe1, 0xd8, 0x3e, 0x6b, 0xd2, 0x55, 0xbf, 0x10, 0x74, 0xdc, 0xbe, 0x82, 0x1d, 0xaf, 0x3e, 0x9a, 0xeb, 0x58, 0xbf, 0x38, 0xbe, 0xce, 0x3e, 0xbb, 0x96, 0xb0, 0x3e, 0xf1, 0x82, 0x60, 0xbf, 0x2a, 0x35, 0xd3, 0x3e, 0x16, 0x4c, 0x7c, 0x3e, 0xd9, 0xec, 0x50, 0xbf, 0xdf, 0xfc, 0xbe, 0x3e, 0xe7, 0xfb, 0xe1, 0x3e, 0xc2, 0x14, 0x49, 0xbf, 0x4f, 0x94, 0xa4, 0x3e, 0x28, 0x64, 0x07, 0x3f, +0x70, 0xd1, 0x41, 0xbf, 0x08, 0xe6, 0x80, 0x3e, 0xb9, 0x53, 0x1a, 0x3f, 0x98, 0x84, 0x3b, 0xbf, 0xc2, 0x4c, 0x2b, 0x3e, 0x67, 0xef, 0x28, 0x3f, 0x56, 0x7d, 0x36, 0xbf, 0x11, 0x71, 0x93, 0x3d, 0xb3, 0x96, 0x32, 0x3f, 0x06, 0x0f, 0x33, 0xbf, 0x96, 0xb3, 0xf7, 0xbc, 0x96, 0xcb, 0x36, 0x3f, 0x6f, 0x80, 0x31, 0xbf, 0xf7, 0x3d, 0x0a, 0xbe, 0x16, 0x34, 0x35, 0x3f, 0x30, 0xd8, 0x31, 0xbf, 0xe5, 0x0b, 0x7a, 0xbe, 0x48, 0x34, 0x2d, 0x3f, 0xc0, 0x3d, 0x33, 0xbf, 0x29, 0x57, 0xb8, 0xbe, +0xcf, 0xd6, 0x1d, 0x3f, 0x5c, 0xc7, 0x34, 0xbf, 0xcd, 0x39, 0xe8, 0xbe, 0xba, 0x2f, 0x0b, 0x3f, 0xbc, 0x3c, 0x39, 0xbf, 0xd2, 0xaa, 0x02, 0xbf, 0xbc, 0xe6, 0xed, 0x3e, 0x10, 0xeb, 0x41, 0xbf, 0x9a, 0xd1, 0x0b, 0xbf, 0x75, 0x1c, 0xb7, 0x3e, 0x23, 0x81, 0x52, 0xbf, 0x20, 0x7f, 0x05, 0x3f, 0x9b, 0x53, 0x69, 0x3e, 0xf5, 0x46, 0x49, 0xbf, 0xa0, 0xc5, 0x02, 0x3f, 0x82, 0x03, 0xb2, 0x3e, 0x40, 0x89, 0x3f, 0xbf, 0xda, 0x53, 0xf2, 0x3e, 0x99, 0x11, 0xee, 0x3e, 0x0a, 0xf8, 0x35, 0xbf, +0x31, 0x25, 0xd2, 0x3e, 0xb0, 0x3a, 0x12, 0x3f, 0xb4, 0x1f, 0x2d, 0xbf, 0x1c, 0xb1, 0xa6, 0x3e, 0xd8, 0x2a, 0x29, 0x3f, 0xc5, 0x74, 0x25, 0xbf, 0x3d, 0x2c, 0x64, 0x3e, 0x28, 0xd5, 0x3a, 0x3f, 0x69, 0x55, 0x1f, 0xbf, 0xfe, 0x46, 0xdb, 0x3d, 0xf2, 0x7c, 0x46, 0x3f, 0x7f, 0x12, 0x1b, 0xbf, 0xbb, 0x5f, 0x85, 0xbc, 0x1a, 0xa5, 0x4b, 0x3f, 0x72, 0xf8, 0x18, 0xbf, 0xb6, 0x83, 0x11, 0xbe, 0x79, 0x05, 0x4a, 0x3f, 0xc8, 0x5c, 0x19, 0xbf, 0xa5, 0xf9, 0x8b, 0xbe, 0xd2, 0xa8, 0x40, 0x3f, +0x3d, 0x0a, 0x1b, 0xbf, 0x90, 0x11, 0xd8, 0xbe, 0x8d, 0xb4, 0x2c, 0x3f, 0x85, 0x79, 0x1b, 0xbf, 0xd9, 0xcf, 0x0a, 0xbf, 0xc2, 0xa4, 0x14, 0x3f, 0xcf, 0xd5, 0x1e, 0xbf, 0xf3, 0x02, 0x1c, 0xbf, 0x52, 0xba, 0xfc, 0x3e, 0x55, 0xc0, 0x29, 0xbf, 0x21, 0x1d, 0x26, 0xbf, 0x30, 0x11, 0xbf, 0x3e, 0x7c, 0x7d, 0x41, 0xbf, 0x9f, 0x1a, 0x1f, 0x3f, 0xbc, 0x08, 0x53, 0x3e, 0x32, 0xc7, 0x36, 0xbf, 0x0f, 0xf1, 0x1b, 0x3f, 0xad, 0xc0, 0xb0, 0x3e, 0x2d, 0x76, 0x2b, 0xbf, 0x40, 0xbe, 0x10, 0x3f, +0x2d, 0x77, 0xf6, 0x3e, 0xab, 0x5c, 0x20, 0xbf, 0x6d, 0x02, 0xfc, 0x3e, 0x1f, 0xbc, 0x1a, 0x3f, 0x08, 0x1b, 0x16, 0xbf, 0x68, 0x7a, 0xc9, 0x3e, 0x18, 0x43, 0x35, 0x3f, 0xdb, 0x35, 0x0d, 0xbf, 0xfe, 0x64, 0x8c, 0x3e, 0xb9, 0xa9, 0x49, 0x3f, 0xe6, 0x1e, 0x06, 0xbf, 0xf2, 0x5c, 0x0f, 0x3e, 0xb1, 0x16, 0x57, 0x3f, 0x23, 0x31, 0x01, 0xbf, 0x9d, 0x7f, 0x3b, 0xbb, 0x47, 0x02, 0x5d, 0x3f, 0x98, 0x4c, 0xfd, 0xbe, 0x6e, 0xa5, 0x17, 0xbe, 0x08, 0x39, 0x5b, 0x3f, 0xb6, 0x67, 0xfe, 0xbe, +0x61, 0xe2, 0x97, 0xbe, 0x3a, 0xc7, 0x50, 0x3f, 0x1e, 0xdf, 0x02, 0xbf, 0xe6, 0xca, 0xf0, 0xbe, 0xe9, 0x27, 0x38, 0x3f, 0xb0, 0x00, 0x06, 0xbf, 0x45, 0x62, 0x1a, 0xbf, 0x05, 0x18, 0x1a, 0x3f, 0x4b, 0x8e, 0x0b, 0xbf, 0xb1, 0x50, 0x2b, 0xbf, 0xa6, 0x45, 0x01, 0x3f, 0xcb, 0xf5, 0x16, 0xbf, 0x42, 0x5f, 0x36, 0xbf, 0xab, 0xce, 0xc2, 0x3e, 0x62, 0xd8, 0x2d, 0xbf, 0x7b, 0x14, 0x36, 0x3f, 0xcc, 0xee, 0x39, 0x3e, 0xc8, 0xd0, 0x21, 0xbf, 0x98, 0x89, 0x32, 0x3f, 0xd4, 0xed, 0xac, 0x3e, +0x47, 0x1d, 0x15, 0xbf, 0x35, 0xee, 0x25, 0x3f, 0x42, 0x24, 0xfb, 0x3e, 0x32, 0xae, 0x08, 0xbf, 0x2c, 0xd6, 0x10, 0x3f, 0xdb, 0xdc, 0x20, 0x3f, 0x77, 0x66, 0xfa, 0xbe, 0xa9, 0xd8, 0xe8, 0x3e, 0xf8, 0x8a, 0x3e, 0x3f, 0xb6, 0x82, 0xe6, 0xbe, 0x4e, 0x43, 0xa4, 0x3e, 0xb1, 0x52, 0x55, 0x3f, 0xee, 0xaf, 0xd6, 0xbe, 0x25, 0x79, 0x2e, 0x3e, 0x2c, 0x47, 0x64, 0x3f, 0x1d, 0xb0, 0xcb, 0xbe, 0x20, 0xeb, 0x29, 0x3c, 0xdb, 0xda, 0x6a, 0x3f, 0x86, 0x02, 0xc6, 0xbe, 0x6f, 0xd7, 0x1b, 0xbe, +0xf1, 0xd7, 0x68, 0x3f, 0xb0, 0x1e, 0xc7, 0xbe, 0x80, 0x10, 0xa1, 0xbe, 0xf3, 0xab, 0x5d, 0x3f, 0x44, 0x6b, 0xd5, 0xbe, 0x47, 0xca, 0xfe, 0xbe, 0xbf, 0xba, 0x42, 0x3f, 0xc0, 0x06, 0xec, 0xbe, 0xd9, 0x3e, 0x20, 0xbf, 0x53, 0x07, 0x21, 0x3f, 0x02, 0xf0, 0x17, 0xbf, 0xfd, 0x30, 0x4a, 0x3f, 0x68, 0x79, 0x1e, 0x3e, 0x86, 0xc7, 0x0a, 0xbf, 0x7e, 0x51, 0x46, 0x3f, 0xcd, 0xaf, 0xa6, 0x3e, 0x35, 0xcf, 0xf9, 0xbe, 0xf6, 0x7d, 0x38, 0x3f, 0xb6, 0x2b, 0xfc, 0x3e, 0xf7, 0xad, 0xde, 0xbe, +0x07, 0x5e, 0x21, 0x3f, 0xec, 0x9e, 0x24, 0x3f, 0xe6, 0xae, 0xc5, 0xbe, 0xd5, 0x3d, 0x02, 0x3f, 0x61, 0xfc, 0x44, 0x3f, 0x5d, 0x15, 0xb0, 0xbe, 0x4b, 0x75, 0xb9, 0x3e, 0x7a, 0xc7, 0x5d, 0x3f, 0x42, 0xea, 0x9e, 0xbe, 0x2c, 0x9e, 0x4a, 0x3e, 0xc8, 0x06, 0x6e, 0x3f, 0x7b, 0xf8, 0x92, 0xbe, 0x1b, 0x68, 0xbe, 0x3c, 0x70, 0x27, 0x75, 0x3f, 0xb4, 0xca, 0x8c, 0xbe, 0xdb, 0xc0, 0x1d, 0xbe, 0x5e, 0xf3, 0x72, 0x3f, 0xc8, 0x5d, 0x8c, 0xbe, 0xd3, 0x2f, 0xa9, 0xbe, 0xa9, 0x33, 0x67, 0x3f, +0x24, 0x7d, 0x9a, 0xbe, 0xe4, 0xbc, 0x03, 0xbf, 0x25, 0x76, 0x4d, 0x3f, 0xa8, 0xc5, 0xb8, 0xbe, 0x61, 0x6e, 0x23, 0xbf, 0x1c, 0x0b, 0x2e, 0x3f, 0x7e, 0x1d, 0x00, 0xbf, 0x56, 0x46, 0x5b, 0x3f, 0x1b, 0x10, 0x01, 0x3e, 0x51, 0x10, 0xe4, 0xbe, 0xcd, 0x1f, 0x57, 0x3f, 0x28, 0x2b, 0x9e, 0x3e, 0x09, 0x6c, 0xc6, 0xbe, 0x0f, 0x46, 0x48, 0x3f, 0x2a, 0xab, 0xf9, 0x3e, 0x78, 0x7e, 0xa9, 0xbe, 0x5c, 0x73, 0x2f, 0x3f, 0x91, 0x0b, 0x26, 0x3f, 0x29, 0xe8, 0x8e, 0xbe, 0xa1, 0x13, 0x0e, 0x3f, +0x5e, 0x9c, 0x48, 0x3f, 0x5e, 0xf2, 0x6f, 0xbe, 0xd1, 0xcc, 0xcb, 0x3e, 0x1b, 0x0e, 0x63, 0x3f, 0x50, 0x89, 0x4b, 0xbe, 0x5c, 0x92, 0x63, 0x3e, 0x3a, 0x5b, 0x74, 0x3f, 0x72, 0x35, 0x32, 0xbe, 0x99, 0xd7, 0x11, 0x3d, 0xb7, 0xed, 0x7b, 0x3f, 0x75, 0x03, 0x25, 0xbe, 0x52, 0x7f, 0x1d, 0xbe, 0x36, 0x91, 0x79, 0x3f, 0x80, 0x80, 0x25, 0xbe, 0x7c, 0x0f, 0xaf, 0xbe, 0x83, 0xfc, 0x6c, 0x3f, 0xc3, 0xb8, 0x3b, 0xbe, 0x1f, 0xf2, 0x06, 0xbf, 0x12, 0x6c, 0x54, 0x3f, 0x65, 0x34, 0x62, 0xbe, +0x61, 0x37, 0x28, 0xbf, 0xb6, 0x80, 0x38, 0x3f, 0x2b, 0x84, 0xcd, 0xbe, 0x0a, 0x2f, 0x69, 0x3f, 0x62, 0x4a, 0xc4, 0x3d, 0x3f, 0xe2, 0xaf, 0xbe, 0x3d, 0xd2, 0x64, 0x3f, 0xe7, 0x8d, 0x93, 0x3e, 0x9f, 0xc7, 0x90, 0xbe, 0xc7, 0x2a, 0x55, 0x3f, 0x2a, 0xc4, 0xf3, 0x3e, 0xa2, 0x0c, 0x65, 0xbe, 0x7a, 0x00, 0x3b, 0x3f, 0x59, 0x30, 0x25, 0x3f, 0x81, 0x93, 0x2d, 0xbe, 0x2b, 0xdb, 0x17, 0x3f, 0xe1, 0x79, 0x49, 0x3f, 0xd4, 0x99, 0xfb, 0xbd, 0xf5, 0x2d, 0xdb, 0x3e, 0x98, 0x35, 0x65, 0x3f, +0x16, 0xdc, 0xaf, 0xbd, 0x1f, 0x2e, 0x79, 0x3e, 0x7e, 0x54, 0x77, 0x3f, 0xc7, 0xb7, 0x77, 0xbd, 0x93, 0xa9, 0x42, 0x3d, 0xd1, 0x3d, 0x7f, 0x3f, 0x20, 0xd4, 0x45, 0xbd, 0xc1, 0xaa, 0x1a, 0xbe, 0xc6, 0xc2, 0x7c, 0x3f, 0x96, 0x96, 0x51, 0xbd, 0xe7, 0x8f, 0xb1, 0xbe, 0x37, 0xc1, 0x6f, 0x3f, 0x8f, 0x17, 0x92, 0xbd, 0xe7, 0x70, 0x09, 0xbf, 0x0d, 0x34, 0x57, 0x3f, 0xb8, 0xca, 0xb3, 0xbd, 0xd7, 0x2f, 0x30, 0xbf, 0x89, 0x5c, 0x38, 0x3f, 0xb6, 0x62, 0x8f, 0xbe, 0x73, 0x49, 0x75, 0x3f, +0xb4, 0xe7, 0x72, 0x3d, 0xfa, 0x22, 0x61, 0xbe, 0x16, 0xc0, 0x70, 0x3f, 0x82, 0xc6, 0x84, 0x3e, 0x1d, 0xaf, 0x20, 0xbe, 0x97, 0x70, 0x60, 0x3f, 0xff, 0xcc, 0xe8, 0x3e, 0xda, 0x74, 0xc4, 0xbd, 0xf9, 0x2e, 0x45, 0x3f, 0xba, 0x67, 0x21, 0x3f, 0x02, 0x83, 0x24, 0xbd, 0xc8, 0x97, 0x20, 0x3f, 0x2f, 0x19, 0x47, 0x3f, 0x7e, 0x6d, 0xfd, 0x3b, 0xcc, 0x44, 0xe9, 0x3e, 0xce, 0xe0, 0x63, 0x3f, 0xc7, 0x10, 0x40, 0x3d, 0xc5, 0x8e, 0x86, 0x3e, 0x91, 0xb5, 0x76, 0x3f, 0x9b, 0xad, 0x9c, 0x3d, +0x40, 0x31, 0x72, 0x3d, 0xf7, 0xcc, 0x7e, 0x3f, 0x3d, 0x2c, 0xb4, 0x3d, 0xd8, 0x0f, 0x11, 0xbe, 0x5d, 0x6a, 0x7c, 0x3f, 0xf7, 0x3a, 0xa9, 0x3d, 0xba, 0x6b, 0xb1, 0xbe, 0x72, 0x34, 0x6f, 0x3f, 0x5c, 0xac, 0x88, 0x3d, 0x63, 0x09, 0x0b, 0xbf, 0xe5, 0x45, 0x56, 0x3f, 0xb9, 0xe1, 0x37, 0x3d, 0x16, 0xf6, 0x34, 0xbf, 0x52, 0xb6, 0x34, 0x3f, 0xbf, 0x26, 0x0b, 0xbe, 0x1c, 0x97, 0x7d, 0x3f, 0x3f, 0xc4, 0x86, 0x3c, 0xb8, 0x78, 0x98, 0xbd, 0xc7, 0xf4, 0x78, 0x3f, 0x8d, 0x0c, 0x62, 0x3e, +0x31, 0x08, 0x2c, 0xbc, 0x73, 0x46, 0x68, 0x3f, 0x4d, 0x31, 0xd7, 0x3e, 0x67, 0xb7, 0x56, 0x3d, 0x72, 0x4e, 0x4c, 0x3f, 0xd2, 0xab, 0x19, 0x3f, 0x57, 0xee, 0xe5, 0x3d, 0x47, 0xc6, 0x26, 0x3f, 0x6e, 0x15, 0x40, 0x3f, 0xf8, 0xfc, 0x30, 0x3e, 0xff, 0x59, 0xf3, 0x3e, 0xba, 0xd8, 0x5c, 0x3f, 0x4f, 0x03, 0x66, 0x3e, 0xdc, 0xb7, 0x92, 0x3e, 0x8b, 0x6d, 0x6e, 0x3f, 0x12, 0xf5, 0x72, 0x3e, 0xdd, 0x3f, 0xb6, 0x3d, 0xf8, 0xa4, 0x77, 0x3f, 0x0e, 0x85, 0x5f, 0x3e, 0x8c, 0x6c, 0xe7, 0xbd, +0x7d, 0x25, 0x78, 0x3f, 0xad, 0x89, 0x55, 0x3e, 0xc2, 0x50, 0xaf, 0xbe, 0x94, 0x86, 0x6a, 0x3f, 0xde, 0x57, 0x55, 0x3e, 0x1b, 0x66, 0x0c, 0xbf, 0xa0, 0x50, 0x4f, 0x3f, 0xdd, 0xd3, 0x35, 0x3e, 0x69, 0xe2, 0x39, 0xbf, 0x8d, 0x0c, 0x2a, 0x3f, 0x19, 0x3d, 0x37, 0x3c, 0x8a, 0xe4, 0x7f, 0x3f, 0xab, 0xb3, 0xda, 0xbc, 0x56, 0x64, 0x94, 0x3d, 0xf1, 0x45, 0x7b, 0x3f, 0xbb, 0x44, 0x35, 0x3e, 0xaf, 0x94, 0x05, 0x3e, 0x02, 0xf1, 0x6a, 0x3f, 0x88, 0x13, 0xc0, 0x3e, 0x01, 0xf6, 0x31, 0x3e, +0xbe, 0x87, 0x4f, 0x3f, 0xc0, 0x22, 0x0f, 0x3f, 0xfc, 0x1c, 0x4f, 0x3e, 0x71, 0x70, 0x2d, 0x3f, 0x18, 0x09, 0x35, 0x3f, 0x1b, 0x4b, 0x90, 0x3e, 0x77, 0xbb, 0xee, 0x3e, 0x26, 0xab, 0x56, 0x3f, 0xb5, 0x6a, 0xc7, 0x3e, 0x65, 0x56, 0x8f, 0x3e, 0xd3, 0xa0, 0x60, 0x3f, 0xc7, 0x9d, 0xc2, 0x3e, 0x8c, 0x69, 0x16, 0x3e, 0xbd, 0xc7, 0x69, 0x3f, 0x2b, 0xfb, 0xb6, 0x3e, 0x50, 0xa8, 0x27, 0xbd, 0x05, 0xdd, 0x6e, 0x3f, 0x2e, 0x1f, 0xb1, 0x3e, 0x0f, 0x7c, 0xa4, 0xbe, 0xcd, 0xac, 0x61, 0x3f, +0xce, 0x31, 0xb0, 0x3e, 0xdb, 0x33, 0x0f, 0xbf, 0x91, 0x0c, 0x41, 0x3f, 0x66, 0xdb, 0xa9, 0x3e, 0x88, 0x9d, 0x3d, 0xbf, 0x3a, 0x90, 0x15, 0x3f, 0xb2, 0x67, 0x0f, 0x3e, 0x49, 0xf2, 0x7c, 0x3f, 0x06, 0x2a, 0x83, 0xbd, 0x3c, 0xda, 0x48, 0x3e, 0x4c, 0xa8, 0x78, 0x3f, 0xec, 0xa5, 0x09, 0x3e, 0x20, 0x98, 0x63, 0x3e, 0x4a, 0x61, 0x6a, 0x3f, 0x16, 0xa2, 0xab, 0x3e, 0x89, 0x60, 0x5c, 0x3e, 0xf2, 0x96, 0x53, 0x3f, 0xd4, 0x27, 0x05, 0x3f, 0xd1, 0x57, 0xf8, 0x3e, 0x60, 0x94, 0x50, 0x3e, +0x2c, 0xb6, 0x59, 0x3f, 0x74, 0x97, 0x0c, 0x3f, 0x19, 0xe4, 0xae, 0x3d, 0xc8, 0xd1, 0x54, 0x3f, 0x02, 0xd4, 0x04, 0x3f, 0x96, 0x59, 0x8c, 0xbe, 0x9d, 0x49, 0x4f, 0x3f, 0x93, 0x1b, 0xfd, 0x3e, 0x47, 0x3e, 0x0f, 0xbf, 0x62, 0x4c, 0x2a, 0x3f, 0x4e, 0xf1, 0xf8, 0x3e, 0x26, 0x8b, 0x37, 0xbf, 0x48, 0xc5, 0xff, 0x3e, 0xfe, 0x27, 0x7f, 0x3e, 0xb7, 0xb8, 0x76, 0x3f, 0x22, 0x37, 0xc3, 0xbd, 0xd4, 0xf2, 0x93, 0x3e, 0x54, 0xfc, 0x73, 0x3f, 0x21, 0x03, 0xb9, 0x3d, 0x45, 0x10, 0x8f, 0x3e, +0xeb, 0x1a, 0x69, 0x3f, 0xe4, 0xf6, 0x9b, 0x3e, 0x0c, 0x1e, 0xb6, 0x3e, 0x1e, 0x17, 0x6d, 0x3f, 0x0d, 0x88, 0x00, 0xbe, 0xdc, 0xbb, 0xc6, 0x3e, 0xea, 0xca, 0x6b, 0x3f, 0xbb, 0x0f, 0x00, 0x3d, 0xdf, 0xe1, 0xce, 0x3e, 0x42, 0x5e, 0x67, 0x3f, 0xbb, 0x7b, 0x10, 0x3e, 0x46, 0x7c, 0x2f, 0x3f, 0x58, 0x37, 0x5e, 0xbe, 0xdd, 0xea, 0x31, 0x3f, 0x90, 0xdb, 0x33, 0x3f, 0xf9, 0xbf, 0xc3, 0x3d, 0xd3, 0x85, 0x34, 0x3f, 0x6b, 0x28, 0x21, 0x3f, 0x04, 0x70, 0x07, 0xbf, 0x69, 0xac, 0x11, 0x3f, +0xe7, 0xfd, 0x17, 0x3f, 0xa0, 0x6d, 0x31, 0xbf, 0xe7, 0x51, 0xd1, 0x3e, 0x8c, 0xa3, 0xea, 0x3e, 0xb6, 0x14, 0x60, 0x3f, 0x87, 0xfa, 0x1d, 0xbe, 0x3c, 0x4d, 0xfe, 0x3e, 0xad, 0x14, 0x5e, 0x3f, 0x0b, 0x5f, 0xdf, 0xbc, 0x17, 0x2e, 0x07, 0x3f, 0x1d, 0x3a, 0x59, 0x3f, 0xe5, 0x5c, 0x0a, 0x3d, 0x0a, 0xf7, 0x4e, 0x3f, 0x35, 0xcf, 0xb1, 0x3d, 0x8e, 0x05, 0x15, 0x3f, 0x59, 0x88, 0x4e, 0x3f, 0xeb, 0xab, 0x1b, 0xbe, 0x8c, 0x2b, 0x12, 0x3f, 0xed, 0x7f, 0x40, 0x3f, 0x5b, 0x7d, 0xed, 0xbe, +0x5a, 0xd4, 0xef, 0x3e, 0x2f, 0xdc, 0x2d, 0x3f, 0xaa, 0xef, 0x28, 0xbf, 0xf8, 0x8c, 0xa4, 0x3e, 0x7a, 0x33, 0x0e, 0x3f, 0x22, 0xc2, 0x4f, 0x3f, 0x83, 0x87, 0x39, 0xbe, 0x1e, 0xe1, 0x18, 0x3f, 0xd5, 0x94, 0x4c, 0x3f, 0xc8, 0xec, 0x8c, 0xbd, 0x3a, 0x40, 0x24, 0x3f, 0xf8, 0x4e, 0x44, 0x3f, 0x57, 0x25, 0x91, 0xbc, 0xd7, 0x14, 0x64, 0x3f, 0xf1, 0xd6, 0xd9, 0xbd, 0x0f, 0x0a, 0xe2, 0x3e, 0xf1, 0xd2, 0x5d, 0x3f, 0x98, 0x4e, 0x8b, 0x3d, 0xfd, 0x31, 0xfd, 0x3e, 0x52, 0xf1, 0x5f, 0x3f, +0x30, 0x2c, 0xbf, 0xbe, 0xb9, 0x19, 0x9e, 0x3e, 0xa4, 0x18, 0x50, 0x3f, 0x5d, 0xfa, 0x0b, 0xbf, 0xc9, 0x73, 0x4d, 0x3e, 0x6e, 0xda, 0x2c, 0x3f, 0xcf, 0xbc, 0x34, 0x3f, 0x2a, 0xc9, 0x5a, 0xbe, 0x5d, 0x87, 0x36, 0x3f, 0x12, 0x31, 0x31, 0x3f, 0x2b, 0x69, 0xe5, 0xbd, 0x6d, 0x8f, 0x42, 0x3f, 0x0d, 0xe0, 0x25, 0x3f, 0xbb, 0x27, 0x4f, 0xbd, 0xab, 0xb4, 0x61, 0x3f, 0x7f, 0x69, 0xb1, 0x3d, 0xed, 0x7e, 0xed, 0x3e, 0x2d, 0x41, 0x6a, 0x3f, 0xa9, 0x85, 0x12, 0xbe, 0xcf, 0x11, 0xc1, 0x3e, +0xc3, 0x5f, 0x6b, 0x3f, 0xd1, 0xea, 0xac, 0xbe, 0x51, 0x4c, 0x4e, 0x3e, 0x68, 0xad, 0x64, 0x3f, 0x0e, 0xf3, 0xdd, 0xbe, 0x02, 0x9b, 0xf3, 0x3d, 0xd6, 0x8f, 0x3d, 0x3f, 0x84, 0x47, 0x2b, 0xbf, 0x0a, 0x68, 0x82, 0x3d, 0x43, 0x00, 0x5c, 0x3f, 0xed, 0xd6, 0x02, 0xbf, 0x7e, 0x51, 0x82, 0x3c, 0x94, 0xa2, 0x25, 0x3f, 0xb1, 0xc1, 0x3e, 0xbf, 0x58, 0x8d, 0x25, 0xbe, 0xdd, 0x0a, 0x05, 0x3f, 0x6b, 0x49, 0x57, 0xbf, 0xaf, 0x42, 0x1a, 0xbe, 0x64, 0x3f, 0x1f, 0x3f, 0xe3, 0x37, 0x45, 0xbf, +0x73, 0x2c, 0x0f, 0x3e, 0x3c, 0x4f, 0x48, 0x3f, 0x7b, 0xf4, 0x12, 0x3f, 0x04, 0x1b, 0x77, 0xbe, 0xfa, 0x0a, 0x52, 0x3f, 0x7a, 0x1c, 0x0e, 0x3f, 0xbe, 0xd8, 0x0b, 0xbe, 0x24, 0x80, 0x5b, 0x3f, 0xdd, 0xed, 0x02, 0x3f, 0x45, 0x82, 0x69, 0xbd, 0xa5, 0x82, 0x4e, 0x3f, 0x12, 0x67, 0x09, 0x3f, 0xfd, 0x4c, 0x7d, 0xbe, 0xb4, 0xca, 0x5c, 0x3f, 0x02, 0x0d, 0xfe, 0x3e, 0x2f, 0x33, 0xcc, 0xbd, 0x14, 0x76, 0x51, 0x3f, 0x06, 0x2d, 0x04, 0x3f, 0xb7, 0x7b, 0x81, 0xbe, 0x4f, 0x04, 0x61, 0x3f, +0xf6, 0x60, 0xf2, 0x3e, 0xe8, 0x6a, 0x6b, 0xbd, 0x80, 0x7d, 0x74, 0xbf, 0xee, 0x3f, 0xb2, 0xbd, 0xa4, 0x1b, 0x91, 0x3e, 0xe5, 0x7f, 0xea, 0x3e, 0xe8, 0x4a, 0xac, 0x3e, 0xb1, 0xa2, 0x52, 0x3f, 0x21, 0x74, 0x0c, 0x3f, 0x0d, 0xa8, 0xdf, 0x3e, 0xdd, 0x7d, 0x36, 0x3f, 0xe5, 0x61, 0xd1, 0x3e, 0xbc, 0xb1, 0xe0, 0x3e, 0x8d, 0xd3, 0x4c, 0x3f, 0xcc, 0x61, 0xff, 0x3e, 0x50, 0x1a, 0x02, 0x3f, 0xd8, 0xbb, 0x33, 0x3f, 0x43, 0xe6, 0xea, 0x3e, 0x1b, 0xb9, 0xd6, 0x3e, 0x6e, 0x89, 0x48, 0x3f, +0x07, 0x27, 0xfa, 0x3e, 0xb2, 0x82, 0x97, 0x3e, 0x58, 0x20, 0x52, 0x3f, 0x59, 0x4f, 0xad, 0x3e, 0xb2, 0x2c, 0x0c, 0x3f, 0x29, 0xe7, 0x43, 0x3f, 0x92, 0x74, 0xcd, 0x3e, 0x04, 0x71, 0x0a, 0x3f, 0xff, 0x40, 0x3d, 0x3f, 0x8b, 0x53, 0xe5, 0x3e, 0x39, 0xf0, 0x12, 0x3f, 0xfa, 0x7d, 0x2f, 0x3f, 0x68, 0x94, 0x12, 0x3f, 0x6c, 0x3f, 0xb9, 0x3d, 0xbf, 0x99, 0x50, 0x3f, 0xdc, 0xf3, 0x28, 0x3f, 0x34, 0x68, 0x78, 0x3e, 0x4f, 0x07, 0x36, 0x3f, 0x0d, 0xff, 0x01, 0x3f, 0xbb, 0x26, 0x64, 0x3e, +0xc4, 0x08, 0x55, 0x3f, 0x92, 0xcd, 0x19, 0x3f, 0x13, 0x98, 0xb6, 0x3e, 0x78, 0x27, 0x37, 0x3f, 0x13, 0x81, 0x06, 0x3f, 0x63, 0x98, 0x33, 0x3e, 0xe6, 0x23, 0x55, 0x3f, 0x63, 0xb7, 0x17, 0x3f, 0xcb, 0x12, 0x9d, 0x3d, 0x28, 0x43, 0x4d, 0x3f, 0x7f, 0x4d, 0x32, 0x3f, 0x7c, 0x9d, 0x24, 0xbe, 0xd5, 0x06, 0x33, 0x3f, 0x0c, 0x40, 0x3f, 0x3f, 0xdc, 0x0f, 0x78, 0xbd, 0x85, 0x77, 0x29, 0x3f, 0x82, 0xc6, 0x24, 0x3f, 0xfe, 0x62, 0x36, 0xbd, 0xd0, 0x96, 0x43, 0x3f, 0xe5, 0x63, 0x37, 0x3f, +0x4b, 0xad, 0xb7, 0x3d, 0xa7, 0x22, 0x31, 0x3f, 0x4a, 0x0c, 0x2e, 0x3f, 0x23, 0x12, 0x85, 0xbb, 0xaa, 0xba, 0x3b, 0x3f, 0xa6, 0x7c, 0x40, 0x3f, 0x3b, 0x51, 0x92, 0xbd, 0xc5, 0xc7, 0x27, 0x3f, 0x75, 0x00, 0x54, 0x3f, 0x1d, 0x01, 0x6c, 0xbe, 0x35, 0xce, 0x02, 0x3f, 0x52, 0x47, 0x43, 0x3f, 0xee, 0x22, 0x4c, 0xbe, 0x29, 0x79, 0x1d, 0x3f, 0xfa, 0x25, 0x56, 0x3f, 0x88, 0x0d, 0x96, 0xbe, 0x52, 0x0b, 0xed, 0x3e, 0xa6, 0xf0, 0x40, 0x3f, 0x77, 0xbd, 0x84, 0xbe, 0xed, 0x9c, 0x1a, 0x3f, +0x99, 0xb8, 0x4d, 0x3f, 0x94, 0x6c, 0x05, 0xbe, 0x0d, 0xab, 0x14, 0x3f, 0xde, 0x74, 0x5b, 0x3f, 0x0c, 0x76, 0x33, 0xbe, 0xe7, 0xe2, 0xf7, 0x3e, 0x24, 0xf2, 0x69, 0x3f, 0x99, 0x0c, 0x27, 0xbe, 0xae, 0x61, 0xbe, 0x3e, 0x4a, 0x79, 0x75, 0x3f, 0xee, 0x7b, 0x54, 0xbd, 0xf9, 0xdb, 0x8e, 0x3e, 0xc4, 0xb1, 0x6a, 0x3f, 0x91, 0x81, 0x4c, 0xbe, 0x5d, 0x18, 0xb1, 0x3e, 0x0e, 0x65, 0x74, 0x3f, 0xe0, 0x2e, 0x7b, 0xbc, 0x59, 0x35, 0x98, 0x3e, 0x67, 0x42, 0x63, 0x3f, 0x06, 0xbb, 0x11, 0xbe, +0xc3, 0x28, 0xe0, 0x3e, 0x3e, 0xe9, 0x60, 0x3f, 0x40, 0x4c, 0xc2, 0x3c, 0x3e, 0x3f, 0xf4, 0x3e, 0x51, 0x49, 0x49, 0x3f, 0xc9, 0x03, 0xb9, 0x3e, 0x0e, 0x4e, 0x00, 0x3f, 0xfd, 0x83, 0x58, 0x3f, 0xab, 0xe8, 0x4f, 0x3e, 0x27, 0xa1, 0xfc, 0x3e, 0xfb, 0xb1, 0x61, 0x3f, 0xca, 0x8c, 0xbf, 0x3e, 0x98, 0x4e, 0x93, 0x3e, 0x75, 0x3a, 0x70, 0x3f, 0xcf, 0x2d, 0x44, 0x3e, 0x18, 0x41, 0x93, 0x3e, 0x83, 0xf6, 0x76, 0x3f, 0x94, 0xbe, 0x10, 0x3e, 0x7e, 0x8a, 0x63, 0x3e, 0xdd, 0x7c, 0x6b, 0x3f, +0x03, 0x77, 0xb0, 0x3e, 0xd5, 0xb0, 0x3f, 0x3e, 0x3c, 0x49, 0x2a, 0x3f, 0x4b, 0xab, 0x09, 0x3f, 0x91, 0x9c, 0x04, 0x3f, 0xdd, 0x5f, 0x39, 0x3f, 0x71, 0xe8, 0xed, 0x3e, 0x18, 0x78, 0x02, 0x3f, 0x8d, 0x5f, 0x3c, 0x3f, 0x43, 0xe7, 0x19, 0x3f, 0x96, 0x90, 0x9f, 0x3e, 0x70, 0xb0, 0x4f, 0x3f, 0x8f, 0xde, 0x00, 0x3f, 0x08, 0x3c, 0x98, 0x3e, 0x24, 0xef, 0x58, 0x3f, 0x11, 0xc5, 0x00, 0x3f, 0x6e, 0x13, 0x2e, 0x3e, 0x22, 0xdf, 0x41, 0x3f, 0x56, 0x63, 0x21, 0x3f, 0x83, 0x86, 0x2e, 0x3e, +0x44, 0xdc, 0x0c, 0x3f, 0xff, 0x91, 0x29, 0x3f, 0x9e, 0x27, 0x02, 0x3f, 0xda, 0xa8, 0x1a, 0x3f, 0xcc, 0x79, 0x1a, 0x3f, 0x1d, 0x3e, 0x05, 0x3f, 0x0f, 0x0b, 0x0d, 0x3f, 0x08, 0x57, 0x44, 0x3f, 0xc5, 0x71, 0xa8, 0x3e, 0x5c, 0x74, 0x26, 0x3f, 0x72, 0xf9, 0x2f, 0x3f, 0x47, 0xac, 0xa5, 0x3e, 0xff, 0xb0, 0x25, 0x3f, 0x02, 0x67, 0x3d, 0x3f, 0x54, 0x00, 0x3c, 0x3e, 0xf9, 0x49, 0x05, 0x3f, 0x7b, 0xbe, 0x52, 0x3f, 0x87, 0xc2, 0x67, 0x3e, 0x98, 0x89, 0xaa, 0x3e, 0x83, 0xc1, 0x45, 0x3f, +0x7b, 0x69, 0x0a, 0x3f, 0xe7, 0x8c, 0xe8, 0x3e, 0x1e, 0x16, 0x42, 0x3f, 0xd6, 0x8d, 0xef, 0x3e, 0xb4, 0x1e, 0x6e, 0x3e, 0xb5, 0x4f, 0x57, 0x3f, 0xe0, 0x10, 0xfa, 0x3e, 0xff, 0x22, 0xc8, 0x3e, 0x2d, 0xce, 0x58, 0x3f, 0x6c, 0x95, 0xb8, 0x3e, 0x0b, 0xb5, 0xbe, 0x3e, 0x9e, 0x7c, 0x5e, 0x3f, 0x48, 0xa7, 0xa6, 0x3e, 0x77, 0xf2, 0x91, 0x3e, 0xb6, 0xd6, 0x53, 0x3f, 0xda, 0xab, 0xf7, 0x3e, 0x99, 0x49, 0x74, 0x3e, 0x79, 0x73, 0x34, 0x3f, 0x0d, 0x02, 0x2b, 0x3f, 0xc6, 0xf7, 0xad, 0x3e, +0x7c, 0x63, 0x2c, 0x3f, 0x4d, 0x15, 0x28, 0x3f, 0x81, 0x3f, 0xa4, 0x3e, 0xaa, 0x0a, 0x31, 0x3f, 0x8a, 0xac, 0x25, 0x3f, 0x19, 0x76, 0x54, 0x3f, 0xef, 0xfd, 0xa5, 0x3e, 0x2a, 0x72, 0xe8, 0x3e, 0xda, 0xc4, 0x49, 0x3f, 0x57, 0x7c, 0xd3, 0x3e, 0xe0, 0x9c, 0xe9, 0x3e, 0xf6, 0x5c, 0x5e, 0x3f, 0x03, 0x22, 0xbc, 0x3e, 0x7a, 0x33, 0xaa, 0x3e, 0x6e, 0xa7, 0x51, 0x3f, 0x5c, 0x1d, 0xe0, 0x3e, 0x32, 0xfe, 0xbd, 0x3e, 0x96, 0x42, 0x18, 0x3f, 0xf0, 0xfc, 0x42, 0x3f, 0xd7, 0xa4, 0x83, 0xbe, +0x0a, 0x9d, 0x3b, 0x3f, 0x42, 0x06, 0x16, 0x3f, 0xe8, 0xf8, 0xb0, 0xbe, 0xa8, 0xff, 0x40, 0x3f, 0x9b, 0xa9, 0x08, 0x3f, 0x05, 0x12, 0xc4, 0x3e, 0xfa, 0xec, 0x5c, 0x3f, 0xde, 0xac, 0x51, 0x3e, 0x92, 0x79, 0xec, 0x3e, 0xbd, 0x01, 0x5e, 0x3f, 0xca, 0x53, 0x46, 0x3e, 0x01, 0xde, 0xea, 0x3e, 0x57, 0x92, 0x68, 0x3f, 0xd2, 0xe0, 0xb6, 0xbc, 0xc1, 0xab, 0xd5, 0x3e, 0x12, 0xdc, 0x70, 0x3f, 0xd1, 0xcd, 0xfe, 0xb9, 0x31, 0x77, 0xad, 0x3e, 0x94, 0x66, 0x77, 0x3f, 0xb5, 0x1b, 0x2d, 0xbe, +0xe2, 0x3a, 0x46, 0xbe, 0x7c, 0x63, 0x6c, 0x3f, 0xeb, 0x55, 0xc4, 0xbe, 0xee, 0x25, 0x8d, 0x3c, 0x80, 0x7e, 0x73, 0x3f, 0x74, 0x40, 0xd2, 0x3d, 0x30, 0x13, 0x95, 0x3e, 0x6c, 0x08, 0x5e, 0x3f, 0x7e, 0xc5, 0x4a, 0x3e, 0x4e, 0xd1, 0xe9, 0x3e, 0xf7, 0x5b, 0x5b, 0x3f, 0x79, 0xcb, 0x85, 0x3e, 0x38, 0x87, 0xe3, 0x3e, 0xb4, 0x8d, 0x6b, 0x3f, 0x92, 0x41, 0x86, 0x3e, 0xdd, 0xeb, 0x94, 0x3e, 0xc0, 0x91, 0x58, 0x3f, 0xbf, 0x48, 0xc0, 0x3e, 0xd1, 0xce, 0xc1, 0xbe, 0xae, 0x2a, 0x6f, 0x3f, +0x61, 0x6d, 0xec, 0x3d, 0x7e, 0xc3, 0xac, 0xbe, 0x4d, 0x85, 0x34, 0x3f, 0x59, 0xf7, 0x17, 0x3f, 0x2f, 0x8a, 0xc6, 0x3e, 0x96, 0x23, 0x38, 0x3f, 0xde, 0x92, 0x18, 0x3f, 0x05, 0xc2, 0xb6, 0x3e, 0x87, 0x6b, 0x39, 0x3f, 0x67, 0x47, 0x0a, 0x3f, 0xf9, 0x66, 0xdb, 0x3e, 0xee, 0xb2, 0xcf, 0x3e, 0xc6, 0xf7, 0x69, 0x3f, 0x8b, 0x89, 0x4d, 0xbc, 0x1e, 0x1b, 0xf9, 0x3e, 0xa3, 0xaf, 0x5c, 0x3f, 0x69, 0x57, 0x11, 0xbe, 0x54, 0xc6, 0x37, 0x3f, 0x88, 0x10, 0x1b, 0x3f, 0x96, 0xb3, 0xaf, 0x3e, +0xd6, 0xe3, 0x3a, 0x3f, 0xb2, 0x9b, 0x15, 0x3f, 0xaa, 0x63, 0xb5, 0x3e, 0x8f, 0xc6, 0x39, 0x3f, 0x54, 0xe1, 0x0f, 0x3f, 0x7f, 0x31, 0xcb, 0x3e, 0x5a, 0xa0, 0x31, 0x3f, 0x0f, 0x7d, 0x17, 0x3f, 0x19, 0x1b, 0xd2, 0x3e, 0xb5, 0xf9, 0x9f, 0x3e, 0xbc, 0xce, 0x6e, 0x3f, 0xc0, 0xb1, 0x37, 0x3e, 0x04, 0x8c, 0x5e, 0x3e, 0xe7, 0x50, 0x5e, 0x3f, 0x6b, 0x2d, 0xe4, 0x3e, 0x42, 0x3d, 0x21, 0x3f, 0x59, 0xa6, 0x0b, 0x3f, 0x4c, 0x8c, 0x0d, 0x3f, 0xd8, 0x2a, 0x31, 0x3e, 0xee, 0xc9, 0x33, 0x3f, +0xf8, 0xc6, 0x30, 0x3f, 0xca, 0xbe, 0x13, 0x3f, 0xed, 0x4a, 0xeb, 0x3e, 0xd9, 0xd1, 0x2c, 0x3f, 0xb6, 0x81, 0x5b, 0x3e, 0xf5, 0x12, 0x07, 0x3f, 0x59, 0x6d, 0x52, 0x3f, 0xde, 0x3b, 0x1a, 0x3f, 0xee, 0x3e, 0xc7, 0x3e, 0xfa, 0x63, 0x32, 0x3f, 0x1c, 0x7d, 0x30, 0x3f, 0x1d, 0xb0, 0xc3, 0x3e, 0x98, 0x86, 0x1d, 0x3f, 0xb6, 0x2b, 0x30, 0x3f, 0xc8, 0xec, 0xfc, 0x3e, 0x8d, 0x0a, 0x08, 0x3f, 0x73, 0x2f, 0x4c, 0x3f, 0xab, 0x21, 0xb9, 0x3e, 0x2b, 0x31, 0xf7, 0x3e, 0x7c, 0xd4, 0x2b, 0x3f, +0x6e, 0xdc, 0xba, 0x3e, 0x91, 0x2b, 0x25, 0x3f, 0xe3, 0x6e, 0x40, 0x3f, 0x2a, 0x35, 0xab, 0x3e, 0x55, 0x86, 0x11, 0x3f, 0x59, 0x6b, 0xa0, 0x3e, 0x16, 0xf9, 0xcd, 0x3e, 0xe7, 0x37, 0x5c, 0x3f, 0x5e, 0x7f, 0xd2, 0x3e, 0xc0, 0x77, 0xa3, 0x3e, 0x21, 0x95, 0x5a, 0x3f, 0xe1, 0xd0, 0x37, 0x3f, 0xc0, 0x97, 0xc2, 0x3e, 0xbb, 0x44, 0x15, 0x3f, 0x13, 0x63, 0x49, 0x3f, 0xf6, 0x23, 0xd5, 0x3e, 0x4c, 0x6d, 0xe9, 0x3e, 0xb0, 0xe1, 0x39, 0x3f, 0x43, 0xe6, 0xca, 0x3e, 0xe0, 0xd8, 0x0f, 0x3f, +0xe1, 0x79, 0x4d, 0x3f, 0x85, 0x40, 0xce, 0x3e, 0x6d, 0x37, 0xe1, 0x3e, 0xe2, 0x76, 0xf0, 0x3e, 0x53, 0xb0, 0x76, 0x3e, 0xac, 0x6e, 0x59, 0x3f, 0xdc, 0xd8, 0xfc, 0x3e, 0xbb, 0xef, 0xf8, 0x3d, 0x6a, 0x6b, 0x5c, 0x3f, 0x8c, 0xda, 0x35, 0x3f, 0xba, 0xf2, 0xb9, 0x3e, 0x43, 0x57, 0x1a, 0x3f, 0x6b, 0x10, 0x46, 0x3f, 0xa6, 0xed, 0x9f, 0x3e, 0x6d, 0x1c, 0x0d, 0x3f, 0x13, 0x0b, 0x38, 0x3f, 0x4e, 0xb4, 0x83, 0x3e, 0x7b, 0x4f, 0x25, 0x3f, 0x97, 0x70, 0x44, 0x3f, 0x61, 0xfe, 0xc2, 0x3e, +0x3c, 0x11, 0x04, 0x3f, 0x64, 0xe5, 0x07, 0x3f, 0x32, 0x3c, 0x36, 0xbd, 0x2f, 0xa7, 0x58, 0x3f, 0x22, 0xa5, 0x1d, 0x3f, 0xb1, 0xc3, 0x80, 0xbe, 0xe1, 0x26, 0x3f, 0x3f, 0x7b, 0x84, 0x46, 0x3f, 0x43, 0x71, 0xe7, 0x3d, 0x29, 0x07, 0x1f, 0x3f, 0xa2, 0xb3, 0x58, 0x3f, 0x7d, 0x08, 0x5a, 0x3e, 0x77, 0xd7, 0xf9, 0x3e, 0xb8, 0x77, 0x59, 0x3f, 0x26, 0x3a, 0x4b, 0x3c, 0x46, 0x08, 0x07, 0x3f, 0x1e, 0x33, 0x50, 0x3f, 0x2c, 0x28, 0x7c, 0x3e, 0x83, 0xf6, 0x06, 0x3f, 0xfa, 0x5d, 0x3c, 0x3f, +0x57, 0x43, 0xda, 0xbe, 0x46, 0xb3, 0x06, 0x3f, 0xa8, 0xa7, 0x57, 0x3f, 0xae, 0xb6, 0xf2, 0xbe, 0xbb, 0x2b, 0x83, 0x3e, 0x5d, 0x1a, 0x43, 0x3f, 0xe6, 0x3b, 0x78, 0x3d, 0xfb, 0x03, 0x25, 0x3f, 0x5d, 0x1a, 0x43, 0x3f, 0xe6, 0x3b, 0x78, 0x3d, 0xfb, 0x03, 0x25, 0x3f, 0x8c, 0x9e, 0x2b, 0x3f, 0x86, 0x3b, 0xd7, 0x3d, 0x39, 0x0a, 0x3c, 0x3f, 0x8c, 0x9e, 0x2b, 0x3f, 0x86, 0x3b, 0xd7, 0x3d, 0x39, 0x0a, 0x3c, 0x3f, 0xb5, 0x32, 0x09, 0x3f, 0x6e, 0xd8, 0xb6, 0x3e, 0xe4, 0xd7, 0x43, 0x3f, +0xb5, 0x32, 0x09, 0x3f, 0x6e, 0xd8, 0xb6, 0x3e, 0xe4, 0xd7, 0x43, 0x3f, 0x0c, 0x04, 0x05, 0x3f, 0x2b, 0x14, 0xf1, 0x3e, 0xbe, 0x84, 0x36, 0x3f, 0x0c, 0x04, 0x05, 0x3f, 0x2b, 0x14, 0xf1, 0x3e, 0xbe, 0x84, 0x36, 0x3f, 0x90, 0xbc, 0x17, 0x3f, 0x79, 0xce, 0x16, 0x3e, 0x4e, 0xb5, 0x4a, 0x3f, 0x90, 0xbc, 0x17, 0x3f, 0x79, 0xce, 0x16, 0x3e, 0x4e, 0xb5, 0x4a, 0x3f, 0x40, 0x16, 0x0a, 0x3f, 0x53, 0x58, 0x69, 0x3e, 0x51, 0x85, 0x4f, 0x3f, 0x40, 0x16, 0x0a, 0x3f, 0x53, 0x58, 0x69, 0x3e, +0x51, 0x85, 0x4f, 0x3f, 0x2f, 0x8a, 0x56, 0x3f, 0x4c, 0xdf, 0x2b, 0xbd, 0x89, 0x42, 0x0b, 0x3f, 0x2f, 0x8a, 0x56, 0x3f, 0x4c, 0xdf, 0x2b, 0xbd, 0x89, 0x42, 0x0b, 0x3f, 0x43, 0x1d, 0x4e, 0x3f, 0x24, 0x7e, 0xc5, 0x3c, 0xd5, 0xb4, 0x17, 0x3f, 0x43, 0x1d, 0x4e, 0x3f, 0x24, 0x7e, 0xc5, 0x3c, 0xd5, 0xb4, 0x17, 0x3f, 0x58, 0x00, 0xeb, 0x3e, 0x11, 0xdf, 0x11, 0x3f, 0xae, 0x80, 0x2e, 0x3f, 0x58, 0x00, 0xeb, 0x3e, 0x11, 0xdf, 0x11, 0x3f, 0xae, 0x80, 0x2e, 0x3f, 0xa0, 0xfd, 0xb8, 0x3e, +0x81, 0xaf, 0x3c, 0x3f, 0xa0, 0x36, 0x12, 0x3f, 0xa0, 0xfd, 0xb8, 0x3e, 0x81, 0xaf, 0x3c, 0x3f, 0xa0, 0x36, 0x12, 0x3f, 0xf3, 0x1b, 0x6e, 0x3f, 0x8c, 0x2f, 0xda, 0xbd, 0x51, 0xf5, 0xb3, 0x3e, 0xf3, 0x1b, 0x6e, 0x3f, 0x8c, 0x2f, 0xda, 0xbd, 0x51, 0xf5, 0xb3, 0x3e, 0x00, 0x73, 0x61, 0x3f, 0xb9, 0x4e, 0xe3, 0xbd, 0xa7, 0xce, 0xeb, 0x3e, 0x00, 0x73, 0x61, 0x3f, 0xb9, 0x4e, 0xe3, 0xbd, 0xa7, 0xce, 0xeb, 0x3e, 0xfc, 0x36, 0xa4, 0x3e, 0x02, 0x80, 0x5b, 0x3f, 0xbf, 0x0c, 0xce, 0x3e, +0xfc, 0x36, 0xa4, 0x3e, 0x02, 0x80, 0x5b, 0x3f, 0xbf, 0x0c, 0xce, 0x3e, 0x43, 0xff, 0xe4, 0x3e, 0x8f, 0xfe, 0x5b, 0x3f, 0xe3, 0xe1, 0x7d, 0x3e, 0x43, 0xff, 0xe4, 0x3e, 0x8f, 0xfe, 0x5b, 0x3f, 0xe3, 0xe1, 0x7d, 0x3e, 0x79, 0xaa, 0x73, 0x3f, 0x6d, 0x56, 0x6d, 0x3e, 0x34, 0x9d, 0x4d, 0x3e, 0x79, 0xaa, 0x73, 0x3f, 0x6d, 0x56, 0x6d, 0x3e, 0x34, 0x9d, 0x4d, 0x3e, 0xa6, 0xd3, 0x76, 0x3f, 0x33, 0xe0, 0xac, 0x3c, 0xc7, 0x66, 0x87, 0x3e, 0xa6, 0xd3, 0x76, 0x3f, 0x33, 0xe0, 0xac, 0x3c, +0xc7, 0x66, 0x87, 0x3e, 0x70, 0x3f, 0x14, 0x3f, 0x1f, 0xf4, 0x4c, 0x3f, 0xf1, 0x9c, 0x1d, 0x3e, 0x70, 0x3f, 0x14, 0x3f, 0x1f, 0xf4, 0x4c, 0x3f, 0xf1, 0x9c, 0x1d, 0x3e, 0x3b, 0x8b, 0x32, 0x3f, 0x0a, 0xa0, 0x34, 0x3f, 0xef, 0x8a, 0x00, 0x3e, 0x3b, 0x8b, 0x32, 0x3f, 0x0a, 0xa0, 0x34, 0x3f, 0xef, 0x8a, 0x00, 0x3e, 0xaa, 0x64, 0x50, 0x3f, 0x9a, 0xeb, 0x10, 0x3f, 0x95, 0x0b, 0x05, 0x3e, 0xaa, 0x64, 0x50, 0x3f, 0x9a, 0xeb, 0x10, 0x3f, 0x95, 0x0b, 0x05, 0x3e, 0xe4, 0xdb, 0x63, 0x3f, +0xca, 0xa6, 0xdc, 0x3e, 0xf2, 0x06, 0x18, 0x3e, 0xe4, 0xdb, 0x63, 0x3f, 0xca, 0xa6, 0xdc, 0x3e, 0xf2, 0x06, 0x18, 0x3e, 0x9e, 0x45, 0xef, 0x3c, 0x48, 0xa8, 0x61, 0x3f, 0xe7, 0x51, 0xf1, 0xbe, 0x9e, 0x45, 0xef, 0x3c, 0x48, 0xa8, 0x61, 0x3f, 0xe7, 0x51, 0xf1, 0xbe, 0x0e, 0x87, 0xc5, 0x3d, 0x21, 0x76, 0x3a, 0x3f, 0x86, 0xa9, 0x2d, 0xbf, 0x0e, 0x87, 0xc5, 0x3d, 0x21, 0x76, 0x3a, 0x3f, 0x86, 0xa9, 0x2d, 0xbf, 0x3b, 0xdf, 0xef, 0x3e, 0x1b, 0x99, 0x47, 0x3d, 0x7c, 0xd2, 0x61, 0xbf, +0x3b, 0xdf, 0xef, 0x3e, 0x1b, 0x99, 0x47, 0x3d, 0x7c, 0xd2, 0x61, 0xbf, 0xab, 0x59, 0x23, 0x3f, 0x8b, 0xc3, 0x81, 0xbe, 0x58, 0x20, 0x3a, 0xbf, 0xab, 0x59, 0x23, 0x3f, 0x8b, 0xc3, 0x81, 0xbe, 0x58, 0x20, 0x3a, 0xbf, 0x0b, 0x9a, 0x36, 0x3e, 0x91, 0xf3, 0x02, 0x3f, 0xe0, 0x2e, 0x57, 0xbf, 0x0b, 0x9a, 0x36, 0x3e, 0x91, 0xf3, 0x02, 0x3f, 0xe0, 0x2e, 0x57, 0xbf, 0x1c, 0x26, 0xa2, 0x3e, 0x98, 0x4c, 0x9d, 0x3e, 0x9d, 0xbb, 0x65, 0xbf, 0x1c, 0x26, 0xa2, 0x3e, 0x98, 0x4c, 0x9d, 0x3e, +0x9d, 0xbb, 0x65, 0xbf, 0x7a, 0x1b, 0x6b, 0xbe, 0x2f, 0x17, 0x79, 0x3f, 0xc3, 0xf4, 0xbd, 0x3c, 0x7a, 0x1b, 0x6b, 0xbe, 0x2f, 0x17, 0x79, 0x3f, 0xc3, 0xf4, 0xbd, 0x3c, 0xb5, 0xfa, 0xca, 0xbd, 0x94, 0x16, 0x76, 0x3f, 0xe3, 0xa5, 0x83, 0xbe, 0xb5, 0xfa, 0xca, 0xbd, 0x94, 0x16, 0x76, 0x3f, 0xe3, 0xa5, 0x83, 0xbe, 0xa8, 0xe4, 0x30, 0x3f, 0xe0, 0x66, 0x0d, 0xbf, 0xca, 0xbf, 0xee, 0xbe, 0xa8, 0xe4, 0x30, 0x3f, 0xe0, 0x66, 0x0d, 0xbf, 0xca, 0xbf, 0xee, 0xbe, 0xd0, 0x5e, 0x1d, 0x3f, +0xc3, 0x64, 0x46, 0xbf, 0x9f, 0x3a, 0x16, 0xbe, 0xd0, 0x5e, 0x1d, 0x3f, 0xc3, 0x64, 0x46, 0xbf, 0x9f, 0x3a, 0x16, 0xbe, 0x62, 0x67, 0x5a, 0xbe, 0x5f, 0xb3, 0x2c, 0x3f, 0x92, 0xe9, 0x34, 0x3f, 0x62, 0x67, 0x5a, 0xbe, 0x5f, 0xb3, 0x2c, 0x3f, 0x92, 0xe9, 0x34, 0x3f, 0x54, 0xe3, 0x8d, 0xbe, 0x0b, 0x61, 0x61, 0x3f, 0x06, 0x0d, 0xc5, 0x3e, 0x54, 0xe3, 0x8d, 0xbe, 0x0b, 0x61, 0x61, 0x3f, 0x06, 0x0d, 0xc5, 0x3e, 0x48, 0xa8, 0x05, 0x3f, 0xa9, 0xdc, 0x54, 0xbf, 0xf6, 0x60, 0x42, 0x3e, +0x48, 0xa8, 0x05, 0x3f, 0xa9, 0xdc, 0x54, 0xbf, 0xf6, 0x60, 0x42, 0x3e, 0xab, 0x78, 0xd3, 0x3e, 0xa9, 0x88, 0x33, 0xbf, 0x77, 0xbd, 0x14, 0x3f, 0xab, 0x78, 0xd3, 0x3e, 0xa9, 0x88, 0x33, 0xbf, 0x77, 0xbd, 0x14, 0x3f, 0x3f, 0xc4, 0x86, 0x3c, 0xc5, 0xe6, 0x9b, 0x3e, 0xa7, 0xce, 0x73, 0x3f, 0x3f, 0xc4, 0x86, 0x3c, 0xc5, 0xe6, 0x9b, 0x3e, 0xa7, 0xce, 0x73, 0x3f, 0x26, 0xc3, 0xd1, 0xbd, 0x23, 0xda, 0xf6, 0x3e, 0x38, 0xbe, 0x5e, 0x3f, 0x26, 0xc3, 0xd1, 0xbd, 0x23, 0xda, 0xf6, 0x3e, +0x38, 0xbe, 0x5e, 0x3f, 0xf0, 0x86, 0xa4, 0x3e, 0xa6, 0x25, 0xe6, 0xbe, 0xc0, 0x5e, 0x55, 0x3f, 0xf0, 0x86, 0xa4, 0x3e, 0xa6, 0x25, 0xe6, 0xbe, 0xc0, 0x5e, 0x55, 0x3f, 0x28, 0x46, 0x76, 0x3e, 0x35, 0xd4, 0x80, 0xbe, 0xe7, 0xfd, 0x6f, 0x3f, 0x28, 0x46, 0x76, 0x3e, 0x35, 0xd4, 0x80, 0xbe, 0xe7, 0xfd, 0x6f, 0x3f, 0x22, 0xdf, 0x35, 0x3e, 0x49, 0x81, 0x45, 0xbd, 0x94, 0xa0, 0x7b, 0x3f, 0x22, 0xdf, 0x35, 0x3e, 0x49, 0x81, 0x45, 0xbd, 0x94, 0xa0, 0x7b, 0x3f, 0xf5, 0xf6, 0xe7, 0x3d, +0x18, 0x41, 0x13, 0x3e, 0xa3, 0xac, 0x7b, 0x3f, 0xf5, 0xf6, 0xe7, 0x3d, 0x18, 0x41, 0x13, 0x3e, 0xa3, 0xac, 0x7b, 0x3f, 0x19, 0x54, 0x5b, 0x3f, 0xcd, 0x1f, 0x73, 0x3e, 0x4d, 0x68, 0xea, 0x3e, 0xf6, 0x62, 0x6c, 0x3f, 0x5f, 0xb4, 0x57, 0x3e, 0x3c, 0x4f, 0xa4, 0x3e, 0xab, 0xce, 0x4e, 0x3f, 0xba, 0x65, 0xaf, 0x3e, 0x04, 0x91, 0xf5, 0x3e, 0x9a, 0x25, 0x6d, 0x3f, 0x59, 0xdb, 0x9c, 0x3e, 0xa2, 0x5e, 0x60, 0x3e, 0x39, 0x9d, 0x64, 0x3f, 0xa1, 0x80, 0xcd, 0x3e, 0xf2, 0x5f, 0x50, 0x3e, +0xad, 0xa5, 0x30, 0x3f, 0x2d, 0xeb, 0xce, 0x3e, 0xc3, 0xb6, 0x19, 0x3f, 0x00, 0x1e, 0x35, 0x3f, 0x3e, 0x7a, 0xb3, 0x3e, 0xe3, 0x18, 0x1d, 0x3f, 0xd1, 0x92, 0x33, 0x3f, 0x87, 0xf8, 0x97, 0x3e, 0xd6, 0xe0, 0x25, 0x3f, 0x79, 0xaf, 0x4a, 0x3f, 0xdf, 0xc4, 0x04, 0x3f, 0x68, 0x40, 0xa5, 0x3e, 0x88, 0xb8, 0x41, 0x3f, 0x21, 0x3d, 0x11, 0x3f, 0xf9, 0x4c, 0xa6, 0x3e, 0x3a, 0x57, 0x54, 0x3f, 0x52, 0x0a, 0xf2, 0x3e, 0xfc, 0x55, 0x98, 0x3e, 0x00, 0xaa, 0x1c, 0x3f, 0xee, 0x5b, 0xdd, 0x3e, +0x26, 0x89, 0x29, 0x3f, 0x32, 0x39, 0x19, 0x3f, 0xa2, 0xd5, 0x09, 0x3f, 0x2b, 0xdb, 0x17, 0x3f, 0xb2, 0xd8, 0x22, 0x3f, 0xf2, 0xee, 0x18, 0x3f, 0xea, 0x06, 0xfa, 0x3e, 0xd8, 0x64, 0x29, 0x3f, 0x03, 0x78, 0xab, 0x3e, 0xed, 0xba, 0x2b, 0x3f, 0xbd, 0x52, 0x4a, 0x3f, 0xcd, 0x01, 0xb2, 0x3e, 0x52, 0x26, 0x01, 0x3f, 0x3d, 0x27, 0x39, 0x3f, 0x36, 0xc9, 0xbf, 0x3e, 0xb1, 0x85, 0x14, 0x3f, 0x8b, 0xdc, 0x4f, 0x3f, 0x74, 0x5f, 0xbe, 0x3e, 0x56, 0x62, 0xe6, 0x3e, 0x8e, 0x20, 0x5d, 0x3f, +0x97, 0x91, 0xe2, 0x3e, 0xd7, 0xc0, 0x76, 0x3e, 0x95, 0x7d, 0x33, 0x3f, 0x89, 0xb4, 0x19, 0x3f, 0x29, 0xea, 0xc4, 0x3e, 0xc1, 0xc9, 0x6e, 0x3f, 0x8a, 0x73, 0x24, 0x3e, 0x21, 0x3d, 0xa5, 0x3e, 0x4c, 0x89, 0x78, 0x3f, 0x16, 0x88, 0x2e, 0x3e, 0xe5, 0x98, 0x2c, 0x3e, 0xf8, 0x35, 0x62, 0x3f, 0xe5, 0xee, 0x33, 0x3e, 0x4d, 0x2e, 0xde, 0x3e, 0x77, 0x48, 0x75, 0x3f, 0xf4, 0x4e, 0x8d, 0x3e, 0x65, 0xfc, 0x9b, 0x3d, 0x4f, 0x21, 0x6b, 0x3f, 0xc4, 0x43, 0xc8, 0x3e, 0xf7, 0x21, 0x6f, 0x3d, +0x35, 0x96, 0x18, 0x3f, 0x68, 0xb0, 0x89, 0x3e, 0x4b, 0xaf, 0x41, 0x3f, 0x91, 0xb6, 0x21, 0x3f, 0xdd, 0x3c, 0x75, 0x3e, 0xa1, 0xbf, 0x3c, 0x3f, 0x35, 0xb7, 0x06, 0x3f, 0xe1, 0xef, 0x97, 0x3e, 0x54, 0x00, 0x4c, 0x3f, 0xe9, 0x9d, 0x36, 0x3f, 0x8d, 0x46, 0x32, 0x3f, 0x90, 0xf9, 0xa0, 0x3d, 0x91, 0x9d, 0x1b, 0x3f, 0x3b, 0xfd, 0x48, 0x3f, 0xa5, 0x11, 0xf3, 0x3d, 0x30, 0xba, 0x50, 0x3f, 0xe4, 0x2d, 0x13, 0x3f, 0xe7, 0x37, 0x8c, 0x3d, 0xc2, 0x87, 0xa2, 0x3e, 0xe1, 0x60, 0x3f, 0x3f, +0x4b, 0x5a, 0x15, 0x3f, 0x60, 0x56, 0xa8, 0x3e, 0x78, 0x80, 0x1b, 0x3f, 0xb4, 0x1f, 0x39, 0x3f, 0xf1, 0xd4, 0xc3, 0x3e, 0xbe, 0x17, 0x53, 0x3f, 0x8b, 0x6e, 0xd5, 0x3e, 0xea, 0xaf, 0xd7, 0x3e, 0xde, 0x3d, 0xd8, 0x3e, 0xee, 0x76, 0x4d, 0x3f, 0x69, 0xc7, 0x31, 0x3f, 0xf4, 0x6b, 0x3b, 0x3e, 0xdd, 0x24, 0x32, 0x3f, 0x30, 0x7e, 0x4a, 0x3f, 0xf5, 0x0f, 0x12, 0x3e, 0x27, 0x50, 0x18, 0x3f, 0xc6, 0xfb, 0x59, 0x3f, 0x0c, 0x5c, 0x1e, 0x3e, 0xc4, 0x43, 0x00, 0x3f, 0xaf, 0xce, 0x61, 0x3f, +0xd8, 0x2c, 0xef, 0x3e, 0x3b, 0xe0, 0x7a, 0x3d, 0x76, 0xfb, 0xfc, 0x3e, 0x52, 0x9e, 0x55, 0x3f, 0xac, 0xe6, 0x79, 0x3e, 0xc9, 0xad, 0x6d, 0x3f, 0xa6, 0xd1, 0x94, 0x3e, 0xe6, 0xe9, 0x6c, 0x3e, 0xc1, 0xfc, 0x65, 0x3f, 0x5a, 0x2c, 0x75, 0x3e, 0x1a, 0x85, 0xbc, 0x3e, 0x50, 0x8b, 0x6d, 0x3f, 0x50, 0x70, 0xb9, 0x3e, 0xe7, 0xfc, 0xb4, 0x3d, 0x22, 0xf8, 0x67, 0x3f, 0x38, 0x86, 0xd8, 0x3e, 0xb3, 0x95, 0x17, 0xbc, 0x8d, 0x99, 0x00, 0x3f, 0x63, 0x08, 0x08, 0xbf, 0x6a, 0x9f, 0x2e, 0xbf, +0x63, 0x7e, 0xf6, 0x3e, 0x24, 0x46, 0x0f, 0x3d, 0x72, 0x33, 0x60, 0xbf, 0xc1, 0x55, 0x52, 0x3f, 0x5e, 0x9c, 0xf8, 0x3b, 0x79, 0xea, 0x11, 0xbf, 0x33, 0xa7, 0x93, 0x3e, 0xdc, 0x0c, 0x6f, 0x3f, 0x64, 0xe8, 0x58, 0xbe, 0x79, 0xe6, 0x19, 0x3f, 0x94, 0xfa, 0x72, 0x3d, 0x8e, 0x02, 0x4c, 0xbf, 0x85, 0x0b, 0x7d, 0x3f, 0xb0, 0x02, 0x3c, 0x3d, 0xd4, 0xd7, 0x13, 0xbe, 0x38, 0x4d, 0x1b, 0x3f, 0x4e, 0x61, 0x49, 0x3f, 0x72, 0x15, 0xeb, 0xbd, 0x44, 0xfb, 0x78, 0x3f, 0x7c, 0xed, 0x99, 0x3c, +0xe2, 0x5a, 0x6d, 0xbe, 0xda, 0x92, 0x21, 0x3f, 0x75, 0x1a, 0x41, 0x3f, 0x01, 0x16, 0x39, 0xbe, 0x34, 0x63, 0x01, 0x3f, 0xa6, 0xb3, 0x5b, 0x3f, 0xd1, 0x77, 0xb7, 0xbd, 0xdc, 0xbb, 0x7a, 0x3f, 0xe3, 0x6e, 0x00, 0x3e, 0x27, 0xde, 0x21, 0xbe, 0x9d, 0x65, 0x2e, 0x3f, 0x21, 0x59, 0x34, 0xbf, 0x18, 0xd0, 0x4b, 0xbe, 0x68, 0x5a, 0x26, 0x3f, 0x7c, 0x9a, 0x2b, 0xbf, 0x29, 0x77, 0xb7, 0xbe, 0xb9, 0xff, 0xf8, 0x3e, 0x05, 0xa8, 0x5d, 0xbf, 0xaf, 0x95, 0xf0, 0xbd, 0x1a, 0x85, 0xe4, 0x3e, +0xf1, 0xd6, 0x5d, 0xbf, 0x8b, 0xa9, 0x64, 0xbe, 0xce, 0xfb, 0x3f, 0x3f, 0x75, 0xaf, 0x23, 0xbf, 0xd1, 0xaf, 0x2d, 0xbe, 0xa9, 0x68, 0x6c, 0x3e, 0xbf, 0xec, 0x3e, 0x3f, 0x87, 0xf8, 0x1f, 0x3f, 0x65, 0x56, 0x03, 0x3f, 0x91, 0x28, 0x28, 0x3f, 0x1d, 0x74, 0x0d, 0x3f, 0x88, 0x64, 0x28, 0x3e, 0xd0, 0x7a, 0x50, 0x3f, 0x53, 0x7a, 0x0e, 0x3f, 0x7a, 0x37, 0xde, 0x3e, 0x57, 0xb3, 0x3a, 0x3f, 0x0a, 0x67, 0x07, 0x3f, 0x17, 0xd3, 0x40, 0x3f, 0x05, 0xd8, 0xf7, 0x3e, 0x86, 0x04, 0xe4, 0x3e, +0x17, 0xd3, 0x40, 0x3f, 0x05, 0xd8, 0xf7, 0x3e, 0x86, 0x04, 0xe4, 0x3e, 0xba, 0xf8, 0x0b, 0x3e, 0x4a, 0xb6, 0x7a, 0xbf, 0x75, 0x93, 0x18, 0x3e, 0xba, 0xf8, 0x0b, 0x3e, 0x4a, 0xb6, 0x7a, 0xbf, 0x75, 0x93, 0x18, 0x3e, 0x42, 0x40, 0xfe, 0x3d, 0x2d, 0x27, 0x79, 0xbf, 0x63, 0xef, 0x45, 0x3e, 0x6f, 0x46, 0x3d, 0x3e, 0xe7, 0x51, 0x79, 0xbf, 0x38, 0xd9, 0x06, 0x3e, 0x1b, 0x2a, 0x26, 0x3e, 0x37, 0x8a, 0x7c, 0xbf, 0x0e, 0x86, 0xba, 0xbc, 0xa5, 0x49, 0x59, 0x3e, 0x3e, 0xcf, 0x77, 0xbf, +0xaf, 0x24, 0x09, 0x3e, 0xa5, 0x49, 0x59, 0x3e, 0x3e, 0xcf, 0x77, 0xbf, 0xaf, 0x24, 0x09, 0x3e, 0xd1, 0x03, 0xcf, 0x3e, 0x83, 0xde, 0x3f, 0x3f, 0x09, 0x32, 0x06, 0x3f, 0xd0, 0x5f, 0x14, 0x3f, 0x63, 0x98, 0x27, 0x3f, 0x2e, 0x75, 0xf8, 0x3e, 0xd0, 0x5f, 0x14, 0x3f, 0x63, 0x98, 0x27, 0x3f, 0x2e, 0x75, 0xf8, 0x3e, 0xf8, 0xe2, 0x7b, 0x3e, 0xa9, 0xbe, 0x63, 0x3f, 0xe2, 0x01, 0xc5, 0x3e, 0xa8, 0xe0, 0x88, 0x3e, 0xca, 0xdf, 0x55, 0x3f, 0x73, 0xd8, 0xf5, 0x3e, 0xa8, 0xe0, 0x88, 0x3e, +0xca, 0xdf, 0x55, 0x3f, 0x73, 0xd8, 0xf5, 0x3e, 0x3b, 0xfb, 0xb2, 0x3e, 0x64, 0xea, 0x5e, 0x3f, 0xfe, 0x0a, 0xb1, 0x3e, 0x85, 0x06, 0xa2, 0x3e, 0xc3, 0x0b, 0x42, 0x3f, 0xb8, 0x02, 0x12, 0x3f, 0xcc, 0x61, 0x57, 0x3e, 0xe2, 0x77, 0x43, 0x3f, 0x16, 0x4c, 0x1c, 0x3f, 0xfd, 0x15, 0x32, 0x3e, 0xc7, 0xf1, 0x43, 0x3f, 0x2c, 0x9e, 0x1e, 0x3f, 0x34, 0x2d, 0x99, 0x3e, 0x6e, 0x85, 0x3c, 0x3f, 0x97, 0x56, 0x1b, 0x3f, 0xa2, 0xf0, 0x49, 0x3e, 0x7e, 0x8c, 0x49, 0x3f, 0xf4, 0x8c, 0x15, 0x3f, +0x14, 0x21, 0x55, 0x3e, 0x5d, 0x51, 0x1a, 0x3e, 0x5e, 0x67, 0x77, 0x3f, 0xba, 0x83, 0xe8, 0x3e, 0xbe, 0x4f, 0x15, 0x3e, 0x08, 0x01, 0x61, 0x3f, 0xb6, 0x9d, 0x46, 0x3e, 0x9d, 0x0e, 0x28, 0x3f, 0xe4, 0x9e, 0x3a, 0x3f, 0x5c, 0xc9, 0xae, 0x3e, 0x5e, 0x48, 0x1b, 0x3f, 0x1c, 0xcf, 0x37, 0x3f, 0x2a, 0xc4, 0x33, 0x3f, 0xb9, 0xfd, 0x72, 0x3c, 0x60, 0x39, 0x36, 0x3f, 0x26, 0x34, 0x21, 0x3f, 0x0e, 0x4d, 0xd1, 0x3e, 0xb5, 0x1b, 0x29, 0x3f, 0x6e, 0xc2, 0xed, 0x3e, 0xeb, 0x8a, 0x99, 0xbe, +0x86, 0x54, 0x55, 0x3f, 0x97, 0x8b, 0x48, 0x3e, 0x44, 0x16, 0xf1, 0xbe, 0x48, 0x35, 0x5c, 0x3f, 0x20, 0x45, 0x7d, 0x3e, 0x22, 0xff, 0x74, 0xbf, 0x2a, 0x1a, 0x1b, 0x3e, 0xd7, 0xdd, 0xcc, 0x3e, 0xff, 0x96, 0x58, 0xbf, 0xd1, 0x5b, 0xb4, 0x3e, 0xb0, 0xe3, 0x1f, 0x3e, 0xcd, 0xcd, 0x57, 0xbf, 0x9f, 0xc8, 0x03, 0x3f, 0x22, 0x8a, 0xf9, 0x3e, 0xe6, 0x05, 0x4c, 0xbf, 0x5c, 0xae, 0xb6, 0x3e, 0xfa, 0x27, 0x78, 0x3e, 0x2a, 0x8d, 0x74, 0xbf, 0x16, 0x85, 0x2d, 0x3e, 0xdd, 0x5b, 0x61, 0x3e, +0xb3, 0xd3, 0x77, 0xbf, 0xd7, 0xbd, 0xf5, 0x3d, 0xb4, 0x3b, 0x14, 0x3e, 0x4a, 0x7c, 0x7a, 0xbf, 0xaa, 0xb7, 0x16, 0x3e, 0xd4, 0x99, 0x3b, 0x3e, 0xdf, 0x8b, 0x7b, 0xbf, 0x47, 0x72, 0xf9, 0xbc, 0x67, 0x7d, 0x8a, 0x3d, 0x87, 0x69, 0x7f, 0xbf, 0x0d, 0x52, 0x70, 0x3b, 0xcc, 0xce, 0xaa, 0x3e, 0xe4, 0x9e, 0x62, 0x3f, 0x80, 0xf4, 0xa5, 0x3e, 0x93, 0x6f, 0x86, 0x3e, 0xa0, 0x6d, 0x49, 0x3f, 0xe3, 0xfb, 0x0e, 0x3f, 0x77, 0x2f, 0x9f, 0x3e, 0x2b, 0xdb, 0x67, 0x3f, 0x64, 0x90, 0x93, 0x3e, +0xef, 0x00, 0x7f, 0x3e, 0xe4, 0x69, 0x51, 0x3f, 0x5e, 0xbb, 0x04, 0x3f, 0xbe, 0x16, 0x74, 0x3f, 0x90, 0x65, 0xe1, 0xbd, 0xc4, 0xb4, 0x8f, 0x3e, 0x51, 0x4b, 0x7b, 0x3f, 0x22, 0x70, 0x84, 0xbd, 0xf0, 0xe0, 0x37, 0x3e, 0x6d, 0x3c, 0x54, 0x3f, 0x97, 0x56, 0xcb, 0xbe, 0xd6, 0x8b, 0xc9, 0x3e, 0x6d, 0x1a, 0x47, 0x3f, 0x13, 0xf4, 0xd7, 0xbe, 0xe4, 0x9e, 0xee, 0x3e, 0x68, 0xe7, 0x44, 0x3f, 0x25, 0x3d, 0x14, 0xbf, 0xd7, 0x6b, 0x8a, 0x3e, 0x13, 0xb8, 0x6d, 0x3f, 0x8d, 0xeb, 0x1f, 0x3e, +0xff, 0x5c, 0xac, 0x3e, 0x77, 0xf5, 0x7e, 0x3f, 0x88, 0xd7, 0x35, 0x3d, 0xa8, 0x8f, 0xa0, 0x3d, 0xa0, 0xe0, 0x82, 0x3e, 0x21, 0x5c, 0x69, 0xbf, 0x15, 0xe3, 0xa4, 0x3e, 0xc8, 0xed, 0xe7, 0x3e, 0xd0, 0xb7, 0x45, 0xbf, 0x8b, 0xff, 0xe3, 0x3e, 0x11, 0x51, 0x7c, 0x3f, 0x22, 0x6d, 0x63, 0xbc, 0xae, 0x7e, 0x2c, 0xbe, 0x9e, 0x5e, 0x39, 0x3f, 0x7f, 0x6a, 0x30, 0xbf, 0x5d, 0xa3, 0xe5, 0x3c, 0xdc, 0xb8, 0x75, 0x3f, 0x00, 0xe3, 0x19, 0xbd, 0x43, 0x53, 0x8e, 0xbe, 0xbf, 0x49, 0x2b, 0x3f, +0x53, 0xb2, 0x38, 0xbf, 0x5f, 0x96, 0x36, 0xbe, 0x04, 0x58, 0xa4, 0x3d, 0xa5, 0x2c, 0x7f, 0xbf, 0xac, 0xc5, 0xa7, 0x39, 0x23, 0x6a, 0x12, 0x3e, 0xe3, 0x89, 0x78, 0xbf, 0xec, 0xf7, 0x44, 0x3e, 0xb5, 0xa7, 0xcc, 0x3e, 0x76, 0x54, 0x61, 0x3f, 0xcd, 0x04, 0x83, 0x3e, 0xdc, 0xb9, 0xc0, 0x3e, 0x9c, 0x6d, 0x3e, 0x3f, 0x63, 0x60, 0x0d, 0x3f, 0xbe, 0x6b, 0x6c, 0x3f, 0x51, 0xd9, 0xc0, 0x3e, 0x8c, 0x48, 0x94, 0x3d, 0x39, 0xd5, 0x6e, 0x3f, 0x92, 0x04, 0x81, 0x3e, 0xa4, 0xa8, 0x83, 0x3e, +0xdc, 0xa0, 0xae, 0x3e, 0xb3, 0x5e, 0x10, 0x3f, 0xd7, 0x88, 0x40, 0x3f, 0x4f, 0xb1, 0x66, 0x3f, 0x66, 0x49, 0x80, 0x3d, 0x38, 0xa2, 0xdb, 0x3e, 0x58, 0xe2, 0x09, 0x3f, 0x1b, 0x11, 0x0c, 0x3d, 0x34, 0x84, 0x57, 0xbf, 0x5c, 0xca, 0x91, 0x3e, 0xe4, 0x68, 0x26, 0xbf, 0x79, 0x5c, 0x34, 0xbf, 0x4c, 0x55, 0xf2, 0x3e, 0x3e, 0x79, 0x34, 0xbf, 0xeb, 0x37, 0x07, 0xbf, 0x11, 0xc2, 0x93, 0x3e, 0x7a, 0xc5, 0x37, 0xbf, 0xec, 0x30, 0x22, 0xbf, 0xb6, 0x2d, 0x2a, 0x3f, 0xb1, 0xf9, 0x30, 0xbf, +0x44, 0xfb, 0x90, 0xbe, 0x3a, 0xe7, 0x2f, 0x3f, 0x9a, 0x05, 0x1a, 0x3f, 0x0d, 0x88, 0xd0, 0xbe, 0x7e, 0x35, 0x47, 0x3e, 0x80, 0x80, 0x71, 0x3f, 0x74, 0x96, 0x89, 0xbe, 0xd2, 0x17, 0x12, 0x3e, 0xd6, 0xac, 0x77, 0x3f, 0x04, 0xe2, 0x55, 0xbe, 0x2e, 0xe4, 0x21, 0x3e, 0x0d, 0x35, 0x7a, 0x3f, 0x25, 0xe8, 0x0f, 0xbe, 0xfa, 0xd1, 0x88, 0x3e, 0x44, 0xfb, 0x74, 0x3f, 0x69, 0xe0, 0xe7, 0xbd, 0x3e, 0xb0, 0xe3, 0x3d, 0x5e, 0xd5, 0x79, 0x3f, 0x19, 0x38, 0x40, 0xbe, 0xab, 0x93, 0x53, 0x3e, +0xd6, 0xfe, 0x76, 0x3f, 0xe2, 0x70, 0x26, 0xbe, 0xbe, 0x82, 0x94, 0x3e, 0x8f, 0x8e, 0x73, 0x3f, 0x87, 0xfc, 0xd3, 0xbd, 0x35, 0x79, 0x4a, 0x3e, 0xbf, 0x46, 0x7a, 0x3f, 0x86, 0x8d, 0x92, 0xbd, 0x66, 0x87, 0x08, 0x3e, 0x49, 0x13, 0x3b, 0x3f, 0x4e, 0x63, 0x2b, 0x3f, 0x30, 0x9f, 0xac, 0xbc, 0xe3, 0xc5, 0x46, 0x3f, 0xc1, 0x3b, 0x21, 0x3f, 0x2a, 0xe6, 0x88, 0xbe, 0xdd, 0x9a, 0x3c, 0x3f, 0x3f, 0xfe, 0x1e, 0x3f, 0x79, 0x22, 0x48, 0xbd, 0xe5, 0x42, 0x31, 0x3f, 0xd8, 0x46, 0x38, 0x3f, +0x3f, 0x90, 0x00, 0x3f, 0x74, 0x7d, 0x57, 0xbf, 0x02, 0xd6, 0x4a, 0xbe, 0x14, 0xea, 0xb1, 0x3e, 0x1e, 0xc0, 0x52, 0xbf, 0x88, 0xd7, 0xe5, 0xbe, 0x03, 0x27, 0xbb, 0x3e, 0x41, 0xf4, 0x68, 0xbf, 0xfb, 0x78, 0x48, 0xbe, 0x84, 0x83, 0xa5, 0x3e, 0x5f, 0x08, 0x55, 0xbf, 0x75, 0xb0, 0xe6, 0xbe, 0xa5, 0xd7, 0x8e, 0x3e, 0x00, 0xac, 0x3e, 0xbf, 0xc7, 0x2c, 0x1b, 0xbf, 0x7e, 0xff, 0x9e, 0x3e, 0x55, 0x6b, 0x39, 0xbf, 0xd5, 0x97, 0x1d, 0xbf, 0x73, 0xd6, 0x23, 0x3f, 0x9f, 0x72, 0x40, 0xbf, +0x91, 0xd4, 0x22, 0x3e, 0xf2, 0xee, 0xf0, 0x3e, 0x0f, 0x80, 0x58, 0xbf, 0xfd, 0xdc, 0x80, 0x3e, 0xf4, 0x87, 0x6e, 0x3f, 0x38, 0xa1, 0xb8, 0x3e, 0x8f, 0xfd, 0x2c, 0xbd, 0x98, 0xf7, 0x58, 0x3f, 0xfd, 0xda, 0x06, 0xbf, 0x34, 0xbd, 0x84, 0xbd, 0x67, 0x2b, 0x3b, 0x3f, 0xc8, 0x5e, 0xbf, 0xbe, 0x04, 0x1c, 0x12, 0x3f, 0x62, 0xbb, 0x0b, 0x3f, 0x6a, 0x4f, 0xe1, 0xbe, 0x87, 0x89, 0x36, 0x3f, 0xf2, 0x25, 0xac, 0x3e, 0xd0, 0x63, 0x4c, 0xbf, 0x09, 0xc0, 0xff, 0xbe, 0x5f, 0xb5, 0x92, 0x3e, +0xc0, 0xcd, 0x4e, 0xbf, 0x7b, 0xdc, 0x03, 0xbf, 0x2b, 0xdb, 0xc7, 0x3e, 0x01, 0x69, 0x47, 0xbf, 0xf5, 0x48, 0xfb, 0xbe, 0xc3, 0x2e, 0xca, 0x3e, 0x6f, 0x7f, 0x66, 0xbf, 0x23, 0x14, 0x3b, 0xbe, 0x65, 0x51, 0xe8, 0x3e, 0x1d, 0x90, 0x60, 0xbf, 0xdc, 0xb9, 0x20, 0xbe, 0xc0, 0xae, 0xb6, 0x3e, 0xcb, 0x2d, 0x69, 0xbf, 0x83, 0x6d, 0x54, 0xbe, 0x8a, 0x06, 0x19, 0xbe, 0x28, 0xf3, 0x23, 0x3f, 0xc2, 0xda, 0x40, 0x3f, 0xba, 0x9e, 0x18, 0xbe, 0x57, 0x5e, 0x2a, 0x3f, 0xac, 0x3a, 0x3b, 0x3f, +0xdf, 0x35, 0xb0, 0xbe, 0x56, 0xf2, 0x31, 0x3f, 0xc0, 0x94, 0x21, 0x3f, 0x65, 0x1c, 0xb3, 0xbe, 0x6f, 0x9f, 0x31, 0x3f, 0xc4, 0x23, 0x21, 0x3f, 0x9a, 0x95, 0xa5, 0xbe, 0x63, 0x97, 0x34, 0x3f, 0xe6, 0x74, 0x21, 0x3f, 0x5f, 0x7a, 0x0b, 0xbe, 0x42, 0xce, 0x33, 0x3f, 0x94, 0xdb, 0x32, 0x3f, 0x5e, 0xd8, 0x2e, 0x3f, 0x39, 0xb6, 0x2e, 0xbf, 0x02, 0x48, 0x85, 0xbe, 0xc9, 0x54, 0x19, 0x3f, 0xc1, 0x38, 0x34, 0xbf, 0x5e, 0x67, 0xc3, 0xbe, 0x4a, 0x5e, 0x45, 0x3f, 0xa7, 0x3c, 0x12, 0xbf, +0x4d, 0x2c, 0x90, 0xbe, 0x0b, 0x42, 0x21, 0x3f, 0xe8, 0xf9, 0x27, 0xbf, 0x7b, 0xc0, 0xd4, 0xbe, 0xf1, 0x9b, 0xda, 0x3e, 0xd9, 0x96, 0x31, 0xbf, 0x7c, 0x7e, 0x14, 0xbf, 0x72, 0x17, 0xf1, 0x3e, 0x40, 0x85, 0x2f, 0xbf, 0xfc, 0x1d, 0x0e, 0xbf, 0x19, 0xc9, 0xce, 0x3e, 0x22, 0x39, 0x31, 0xbf, 0x2b, 0x18, 0x19, 0xbf, 0x2f, 0x14, 0x0c, 0x3f, 0x34, 0x2a, 0x3c, 0xbf, 0x1d, 0x04, 0xcd, 0xbe, 0xdb, 0xa3, 0x23, 0x3f, 0xe4, 0xdc, 0x3a, 0xbf, 0x69, 0xe0, 0x77, 0xbe, 0xfe, 0x9d, 0x41, 0x3f, +0x1a, 0x6d, 0x25, 0xbf, 0xb0, 0x01, 0xd1, 0x3d, 0x0f, 0x7f, 0x51, 0x3f, 0x49, 0xd5, 0x12, 0xbf, 0x96, 0x77, 0x15, 0x3d, 0xb4, 0xe5, 0x40, 0x3f, 0xa3, 0x03, 0x9a, 0xbe, 0xa0, 0xa7, 0x15, 0x3f, 0x41, 0x9b, 0x50, 0x3f, 0x88, 0x4a, 0x23, 0xbe, 0xd6, 0xa9, 0x0e, 0x3f, 0x14, 0x94, 0x6a, 0x3f, 0x67, 0x62, 0xca, 0xbe, 0xff, 0x3e, 0x83, 0xbd, 0xe1, 0x5e, 0x0d, 0xbf, 0x57, 0xb2, 0x37, 0x3f, 0x48, 0x4f, 0xd9, 0x3e, 0x1e, 0xc6, 0x0c, 0xbf, 0x50, 0x36, 0x39, 0x3f, 0x08, 0xaf, 0xd5, 0x3e, +0x0a, 0x2f, 0x31, 0xbf, 0x23, 0xa1, 0x31, 0x3f, 0xd2, 0x8e, 0x4b, 0x3e, 0xc6, 0x69, 0x30, 0xbf, 0x38, 0x14, 0x32, 0x3f, 0xf6, 0xee, 0x4f, 0x3e, 0x24, 0x5e, 0xe6, 0xbe, 0x4f, 0xae, 0x45, 0x3f, 0x24, 0xb4, 0xe5, 0x3e, 0xb6, 0x13, 0x15, 0xbf, 0x98, 0xda, 0x46, 0x3f, 0x5f, 0x93, 0x75, 0x3e, 0xd3, 0x6b, 0xdb, 0x3e, 0x44, 0x4c, 0x41, 0xbf, 0x02, 0x0d, 0xfe, 0xbe, 0x27, 0x0f, 0xeb, 0x3e, 0xb8, 0x74, 0x3c, 0xbf, 0x52, 0x9d, 0xfe, 0xbe, 0x08, 0xb0, 0xf0, 0x3e, 0xbf, 0x9c, 0x41, 0xbf, +0xe4, 0xf5, 0xe8, 0xbe, 0xe8, 0xbc, 0x1a, 0x3f, 0x08, 0x00, 0x46, 0xbf, 0xb7, 0x79, 0x43, 0xbe, 0x45, 0xb7, 0x12, 0x3f, 0x82, 0xe5, 0x48, 0xbf, 0x1c, 0xb2, 0x71, 0xbe, 0x95, 0xd7, 0x1e, 0x3f, 0x57, 0x7b, 0x44, 0xbf, 0x39, 0xee, 0x24, 0xbe, 0xee, 0x5e, 0x1e, 0xbe, 0x4e, 0x98, 0x54, 0x3f, 0x9b, 0x02, 0x09, 0x3f, 0x46, 0x0a, 0x55, 0xbe, 0x88, 0xf5, 0x6e, 0x3f, 0x5d, 0xa3, 0x95, 0x3e, 0x15, 0x56, 0x26, 0x3f, 0xfb, 0x3b, 0x2b, 0xbf, 0xd1, 0xe6, 0xb8, 0xbe, 0x31, 0xb3, 0x2f, 0x3f, +0x23, 0x69, 0x2f, 0xbf, 0x74, 0xb1, 0x79, 0xbe, 0xd5, 0x06, 0x57, 0x3f, 0x8b, 0xde, 0xf9, 0xbe, 0x2e, 0x02, 0x73, 0xbe, 0x20, 0xd3, 0x5e, 0x3f, 0x7c, 0x9c, 0xe9, 0xbe, 0xb3, 0x61, 0x3d, 0xbe, 0x15, 0x53, 0xe9, 0x3d, 0xe5, 0x9c, 0x78, 0xbf, 0x76, 0x8d, 0x56, 0x3e, 0x64, 0x20, 0xd7, 0x3e, 0x63, 0x47, 0x47, 0xbf, 0xeb, 0xc7, 0xee, 0x3e, 0x65, 0xfc, 0xbb, 0x3e, 0x35, 0x61, 0x43, 0xbf, 0x36, 0x1e, 0x08, 0x3f, 0x35, 0x41, 0xd4, 0xbc, 0x4e, 0x09, 0x78, 0xbf, 0x31, 0x08, 0x7c, 0x3e, +0x98, 0xbf, 0x42, 0x3f, 0xee, 0x76, 0x6d, 0xbe, 0x3c, 0x31, 0x1b, 0x3f, 0x74, 0xb1, 0x35, 0x3f, 0xb3, 0xb3, 0x28, 0xbe, 0x92, 0x57, 0x2f, 0x3f, 0x26, 0x39, 0x3c, 0x3f, 0xf6, 0xb3, 0x00, 0x3f, 0xf0, 0xc0, 0xe8, 0x3e, 0xa4, 0x55, 0x2d, 0x3f, 0xff, 0xb1, 0x04, 0x3f, 0x4d, 0xba, 0x05, 0x3f, 0xc2, 0xc2, 0x19, 0x3e, 0xae, 0x63, 0x7c, 0x3f, 0xef, 0x59, 0x97, 0xbd, 0x17, 0xd5, 0xe2, 0x3d, 0x86, 0xac, 0x7a, 0x3f, 0xd2, 0x1b, 0x2e, 0xbe, 0xf5, 0xf1, 0xd0, 0x3d, 0x0f, 0x0d, 0x7b, 0x3f, +0xc2, 0xfb, 0x2a, 0xbe, 0xe1, 0x42, 0xbe, 0x3d, 0x48, 0xfd, 0x79, 0x3f, 0xd5, 0x06, 0x47, 0xbe, 0x5f, 0xd2, 0x18, 0x3e, 0x2b, 0x32, 0x7a, 0x3f, 0x32, 0xcc, 0x19, 0xbe, 0x6c, 0x77, 0x0f, 0x3d, 0x4c, 0x50, 0x7b, 0xbf, 0x13, 0xb6, 0x3f, 0x3e, 0x8a, 0xe3, 0xc0, 0xbd, 0xe0, 0xf6, 0x78, 0xbf, 0xd9, 0x0a, 0x5a, 0x3e, 0xbc, 0x92, 0x24, 0xbd, 0x59, 0xa2, 0x7f, 0xbf, 0x28, 0x5f, 0x10, 0x3d, 0xb5, 0xa6, 0x09, 0xbe, 0xd8, 0x2a, 0x7d, 0xbf, 0xe1, 0x7e, 0x80, 0x3d, 0xbc, 0xe9, 0xd6, 0x3d, +0xce, 0x32, 0x7b, 0x3f, 0x85, 0x96, 0x25, 0xbe, 0x90, 0xf7, 0x1a, 0x3e, 0x5d, 0x6e, 0x7c, 0x3f, 0x93, 0xaa, 0x8d, 0xbd, 0xef, 0x36, 0x8f, 0x3d, 0x68, 0x77, 0x7c, 0x3f, 0x25, 0xb0, 0x19, 0xbe, 0x35, 0xb7, 0xc2, 0x3d, 0xc5, 0x1e, 0x7e, 0x3f, 0xc8, 0x26, 0x99, 0xbd, 0x21, 0xcb, 0x02, 0xbd, 0x78, 0xb8, 0x75, 0xbf, 0x29, 0xb2, 0x8e, 0x3e, 0x67, 0xb3, 0xca, 0x3e, 0x64, 0x73, 0x45, 0xbf, 0x39, 0x2a, 0xff, 0x3e, 0x32, 0x03, 0x41, 0x3f, 0xbf, 0x10, 0x8a, 0xbe, 0xf7, 0x59, 0x19, 0x3f, +0x2c, 0xbc, 0x4f, 0x3f, 0xd6, 0xfc, 0xb0, 0x3e, 0x63, 0x41, 0xf1, 0x3e, 0x71, 0x37, 0x68, 0x3e, 0x42, 0x95, 0x76, 0x3f, 0xc2, 0xa5, 0x13, 0xbe, 0x0b, 0x99, 0x7b, 0x3e, 0xce, 0xa7, 0x76, 0x3f, 0x27, 0xbb, 0xd9, 0xbd, 0x57, 0xb3, 0x4e, 0xbe, 0x1f, 0xd8, 0x79, 0xbf, 0x81, 0x79, 0xa8, 0x3d, 0xed, 0x2a, 0x14, 0xbe, 0xae, 0xba, 0x76, 0xbf, 0xe0, 0x62, 0x65, 0x3e, 0xde, 0x1e, 0x74, 0x3e, 0x38, 0x31, 0x74, 0x3f, 0xdd, 0xd2, 0x3a, 0xbe, 0x00, 0xc7, 0x86, 0x3e, 0xc7, 0x0f, 0x75, 0x3f, +0xb8, 0x39, 0xf5, 0xbd, 0xb2, 0x9c, 0x84, 0x3b, 0xd1, 0x3c, 0x5c, 0x3f, 0x06, 0x80, 0x02, 0x3f, 0x54, 0x19, 0xa6, 0xbe, 0x83, 0xc0, 0x52, 0x3f, 0xe4, 0x83, 0xee, 0x3e, 0x46, 0x7b, 0x0c, 0x3e, 0xde, 0x39, 0x74, 0x3f, 0xfb, 0x78, 0x88, 0x3e, 0xb0, 0x70, 0x62, 0xbe, 0x79, 0x56, 0x72, 0x3f, 0xfb, 0x1f, 0x70, 0x3e, 0xf6, 0x7c, 0x0d, 0x3f, 0x3f, 0xe4, 0x51, 0xbf, 0xb1, 0xf9, 0x18, 0xbe, 0xad, 0x13, 0xdf, 0x3e, 0xda, 0xae, 0x40, 0xbf, 0x80, 0xbb, 0xfc, 0xbe, 0xeb, 0x01, 0xbb, 0x3e, +0x64, 0xaf, 0x33, 0xbf, 0x87, 0x8b, 0x1c, 0xbf, 0x4c, 0x6f, 0xb7, 0x3e, 0xf9, 0xf4, 0x98, 0x3e, 0x8e, 0x70, 0x62, 0x3f, 0xf5, 0xf5, 0xbc, 0x3e, 0xc4, 0x07, 0x86, 0x3e, 0x6f, 0x4b, 0x64, 0x3f, 0x9f, 0x3a, 0x2e, 0x3f, 0x72, 0xc2, 0xbc, 0xbe, 0xb5, 0x16, 0x22, 0x3f, 0x47, 0x55, 0xb3, 0x3e, 0x72, 0x33, 0x8c, 0x3e, 0xb1, 0x4e, 0x65, 0x3f, 0xe1, 0x96, 0xcf, 0xbd, 0x5b, 0x22, 0x27, 0x3f, 0x30, 0x2b, 0x40, 0x3f, 0x8a, 0xc8, 0xa0, 0xbe, 0xf6, 0x7b, 0x36, 0x3f, 0xe3, 0x89, 0x20, 0x3f, +0x10, 0x3f, 0x07, 0x3f, 0x5f, 0xb2, 0x51, 0xbf, 0x9f, 0xcb, 0x64, 0xbe, 0xce, 0xe2, 0xe5, 0x3e, 0x9a, 0xd1, 0x47, 0xbf, 0xf7, 0xad, 0xde, 0xbe, 0xfe, 0x0c, 0xaf, 0x3e, 0x5f, 0xed, 0xd8, 0x3e, 0x0e, 0xbc, 0x56, 0x3f, 0x6c, 0x43, 0x01, 0x3f, 0xc7, 0x2d, 0xae, 0x3e, 0x0d, 0x15, 0x4b, 0x3f, 0xe7, 0xe0, 0x39, 0x3e, 0x5f, 0xeb, 0xd2, 0x3e, 0xd9, 0x97, 0x64, 0x3f, 0xe7, 0xe0, 0x39, 0x3e, 0x5f, 0xeb, 0xd2, 0x3e, 0xd9, 0x97, 0x64, 0x3f, 0xf3, 0x74, 0xee, 0x3e, 0xd3, 0x4c, 0x1b, 0xbf, +0x7c, 0xee, 0x24, 0x3f, 0x4f, 0xaf, 0x14, 0xbd, 0x4b, 0x91, 0x70, 0x3f, 0x3b, 0x17, 0xae, 0x3e, 0x4f, 0xaf, 0x14, 0xbd, 0x4b, 0x91, 0x70, 0x3f, 0x3b, 0x17, 0xae, 0x3e, 0xca, 0x32, 0x84, 0x3d, 0x0c, 0x02, 0x7f, 0x3f, 0xfb, 0xb2, 0x74, 0xbd, 0xc6, 0xa5, 0x92, 0x3e, 0x9f, 0x77, 0x73, 0x3f, 0x37, 0xc3, 0xed, 0xbd, 0x7a, 0xc5, 0x93, 0x3e, 0x12, 0x4a, 0x73, 0x3f, 0x01, 0x4b, 0xee, 0xbd, 0x05, 0x30, 0x8d, 0x3e, 0x2b, 0x34, 0x74, 0x3f, 0x13, 0x43, 0xf2, 0xbd, 0x63, 0x9a, 0x19, 0x3e, +0xe9, 0x46, 0x7c, 0x3f, 0x7c, 0x7f, 0xa3, 0xbd, 0xea, 0x1f, 0x24, 0xbe, 0x83, 0xa3, 0x7c, 0x3f, 0x59, 0x87, 0xa3, 0x3c, 0x4f, 0xcc, 0x0e, 0xbf, 0xb1, 0xe1, 0x4d, 0x3f, 0x4a, 0x0c, 0x52, 0x3e, 0x28, 0x60, 0x07, 0xbf, 0xec, 0x85, 0x56, 0x3f, 0x34, 0xf2, 0x09, 0x3e, 0xfd, 0xa2, 0x30, 0xbf, 0x0b, 0x25, 0x33, 0x3f, 0xb5, 0x6c, 0x3d, 0x3e, 0xc0, 0x3c, 0x34, 0xbf, 0xb1, 0x35, 0x2f, 0x3f, 0xdf, 0xfd, 0x41, 0x3e, 0x7d, 0x96, 0x23, 0xbf, 0xef, 0x1a, 0x40, 0x3f, 0xb4, 0x00, 0x2d, 0x3e, +0xef, 0x37, 0x9a, 0xbe, 0x33, 0x88, 0x73, 0x3f, 0x37, 0x6d, 0x86, 0x3d, 0x99, 0xd8, 0xa4, 0x3e, 0xbd, 0x8a, 0x70, 0x3f, 0xcc, 0x99, 0xed, 0xbd, 0x32, 0x76, 0x7a, 0x3f, 0x5a, 0xb9, 0x37, 0xbe, 0xb6, 0xf2, 0xd2, 0xbd, 0xb0, 0x54, 0x73, 0x3f, 0x22, 0xfa, 0x15, 0xbe, 0x62, 0x4a, 0x8c, 0xbe, 0x63, 0x60, 0x5d, 0x3f, 0x2e, 0x38, 0xdb, 0x3e, 0xfa, 0x5f, 0x86, 0xbe, 0x8f, 0x4e, 0x5d, 0x3f, 0x92, 0x93, 0xe1, 0xbe, 0x1c, 0xcf, 0x77, 0xbe, 0x39, 0x7e, 0x38, 0x3f, 0x71, 0x54, 0x2a, 0xbf, +0x43, 0x71, 0x47, 0xbe, 0xf0, 0xbf, 0x21, 0x3f, 0x43, 0xc8, 0x41, 0xbf, 0xc4, 0xb5, 0x2a, 0xbe, 0x5c, 0xe7, 0x23, 0x3f, 0xc4, 0xcf, 0x3f, 0xbf, 0x05, 0x6e, 0x2d, 0xbe, 0x1b, 0xa0, 0x20, 0x3f, 0x68, 0xca, 0x42, 0xbf, 0x2e, 0x55, 0x29, 0xbe, 0x40, 0xc0, 0x0a, 0x3f, 0xa9, 0x2e, 0x54, 0xbf, 0xc8, 0x25, 0x0e, 0xbe, 0x13, 0x98, 0xde, 0x3e, 0x41, 0xf0, 0x64, 0xbf, 0xc3, 0x10, 0xd9, 0xbd, 0xc5, 0xfe, 0xca, 0x3e, 0xc5, 0xc5, 0x69, 0xbf, 0x7a, 0x6e, 0xc1, 0xbd, 0x6e, 0xa3, 0xc1, 0x3e, +0xa2, 0xd3, 0x6b, 0xbf, 0x9a, 0x3e, 0xbb, 0xbd, 0x05, 0xe0, 0x3b, 0x3f, 0xca, 0xa4, 0x22, 0x3f, 0x9f, 0x1f, 0x76, 0xbe, 0x66, 0x68, 0x38, 0x3f, 0x1b, 0x11, 0x30, 0x3f, 0x8f, 0x34, 0xb8, 0xbd, 0x6b, 0x9b, 0x3e, 0x3f, 0xe3, 0xdf, 0x1f, 0x3f, 0x84, 0x7f, 0x71, 0xbe, 0x4f, 0x04, 0xb1, 0x3e, 0xba, 0xb8, 0x6d, 0x3f, 0x64, 0x06, 0x0a, 0x3e, 0xf7, 0x3d, 0x7e, 0x3f, 0x16, 0xf7, 0xbf, 0x3d, 0x74, 0x62, 0x8f, 0x3d, 0x79, 0x5a, 0xb6, 0x3e, 0x29, 0xcf, 0x6c, 0x3f, 0xa9, 0x4e, 0x07, 0x3e, +0x68, 0xcd, 0x3f, 0x3e, 0xe4, 0x68, 0x7a, 0x3f, 0x9e, 0x76, 0xb8, 0xbd, 0x78, 0x9a, 0x00, 0x3f, 0x50, 0xe2, 0x5b, 0x3f, 0x96, 0xaf, 0xcb, 0x3d, 0xb8, 0xae, 0x80, 0x3e, 0xe9, 0x5f, 0x76, 0x3f, 0xf7, 0x02, 0xd3, 0xbd, 0xf2, 0x41, 0x27, 0x3f, 0x2c, 0x66, 0x3c, 0xbf, 0x88, 0xd7, 0x35, 0x3e, 0xcd, 0xaf, 0x26, 0x3f, 0x61, 0x70, 0x41, 0x3f, 0x27, 0xf9, 0x91, 0x3d, 0x59, 0x2f, 0x76, 0x3f, 0x1e, 0xf9, 0x83, 0xbe, 0x18, 0xcc, 0xbf, 0xbd, 0x33, 0xc3, 0x56, 0x3e, 0x29, 0x95, 0x58, 0x3f, +0xdc, 0xf5, 0xfa, 0x3e, 0xac, 0x6e, 0xbd, 0x3e, 0x1f, 0x67, 0x4e, 0xbf, 0x15, 0x54, 0xec, 0xbe, 0x7a, 0x38, 0xf9, 0xbe, 0xdb, 0x6e, 0x42, 0x3f, 0xc3, 0xf1, 0xdc, 0x3e, 0xc6, 0x19, 0x67, 0x3f, 0xe4, 0x13, 0xaa, 0x3e, 0xcb, 0xf4, 0x8b, 0xbe, 0x30, 0xf0, 0x70, 0x3f, 0x69, 0x72, 0xa1, 0x3e, 0xa5, 0xf8, 0xf8, 0xbd, 0x5e, 0xa1, 0x73, 0x3f, 0x7e, 0x70, 0x3e, 0x3e, 0x21, 0x3c, 0x7a, 0xbe, 0x5e, 0xa1, 0x73, 0x3f, 0x7e, 0x70, 0x3e, 0x3e, 0x21, 0x3c, 0x7a, 0xbe, 0xa7, 0xe8, 0x74, 0x3f, +0xd0, 0xb4, 0x94, 0x3e, 0x6a, 0x13, 0xa7, 0x3c, 0x5c, 0xe4, 0x76, 0x3f, 0x78, 0x46, 0x6b, 0x3e, 0x0c, 0xe8, 0x05, 0x3e, 0x4d, 0xd7, 0x73, 0x3f, 0x61, 0x89, 0x07, 0x3e, 0x8b, 0x6b, 0x8c, 0x3e, 0x95, 0xd6, 0x7f, 0x3f, 0xf5, 0x7f, 0x0e, 0xbd, 0xcc, 0x99, 0xed, 0xbb, 0x95, 0xd6, 0x7f, 0x3f, 0xf5, 0x7f, 0x0e, 0xbd, 0xcc, 0x99, 0xed, 0xbb, 0xa7, 0xc9, 0x70, 0x3f, 0x47, 0xc7, 0x55, 0xbb, 0x98, 0xdb, 0xad, 0x3e, 0x4b, 0x20, 0x79, 0x3f, 0xfa, 0x44, 0x0e, 0xbe, 0xe1, 0xeb, 0x3b, 0x3e, +0xc7, 0x80, 0x7c, 0x3f, 0x1c, 0xea, 0x27, 0xbe, 0x43, 0x1b, 0x80, 0x3c, 0x4a, 0x40, 0x7c, 0x3f, 0xc3, 0xd5, 0x41, 0xbd, 0x55, 0xbe, 0x27, 0xbe, 0x4a, 0x40, 0x7c, 0x3f, 0xc3, 0xd5, 0x41, 0xbd, 0x55, 0xbe, 0x27, 0xbe, 0x4e, 0xd3, 0x5f, 0x3f, 0x17, 0x2c, 0xdd, 0xbe, 0xb3, 0x96, 0x62, 0xbe, 0x82, 0xff, 0x71, 0x3f, 0xa5, 0xf2, 0xa6, 0xbe, 0xce, 0xa7, 0x0e, 0xbc, 0xd9, 0xd1, 0x4c, 0x3f, 0x4b, 0xe5, 0x11, 0xbf, 0xee, 0xcd, 0x3f, 0xbe, 0x52, 0x60, 0x01, 0x3d, 0xb0, 0x53, 0x3c, 0xbe, +0xdc, 0x80, 0x7b, 0x3f, 0x52, 0x60, 0x01, 0x3d, 0xb0, 0x53, 0x3c, 0xbe, 0xdc, 0x80, 0x7b, 0x3f, 0x85, 0xe9, 0xfb, 0xbc, 0x96, 0x5a, 0x73, 0xbf, 0xd4, 0x26, 0x9e, 0x3e, 0x85, 0xe9, 0xfb, 0xbc, 0x96, 0x5a, 0x73, 0xbf, 0xd4, 0x26, 0x9e, 0x3e, 0xf0, 0x31, 0x7c, 0x3f, 0xf2, 0x23, 0x2e, 0xbe, 0x11, 0xfe, 0xc5, 0x3c, 0x60, 0x22, 0x0e, 0xbe, 0x11, 0x1b, 0x2c, 0xbf, 0x39, 0x27, 0x3a, 0x3f, 0x60, 0x22, 0x0e, 0xbe, 0x11, 0x1b, 0x2c, 0xbf, 0x39, 0x27, 0x3a, 0x3f, 0x11, 0xc5, 0x68, 0x3f, +0xf4, 0xde, 0xd0, 0xbe, 0xf7, 0x3a, 0xa9, 0xbd, 0x11, 0xc5, 0x68, 0x3f, 0xf4, 0xde, 0xd0, 0xbe, 0xf7, 0x3a, 0xa9, 0xbd, 0x7f, 0xd9, 0x79, 0x3f, 0xd6, 0x1f, 0x31, 0x3e, 0x69, 0xaa, 0x07, 0xbe, 0x7f, 0xd9, 0x79, 0x3f, 0xd6, 0x1f, 0x31, 0x3e, 0x69, 0xaa, 0x07, 0xbe, 0x64, 0xea, 0x7a, 0x3f, 0xc5, 0xa7, 0x40, 0x3e, 0x55, 0x68, 0x80, 0xbd, 0x64, 0xea, 0x7a, 0x3f, 0xc5, 0xa7, 0x40, 0x3e, 0x55, 0x68, 0x80, 0xbd, 0xad, 0x4e, 0x7a, 0x3f, 0x8c, 0x2f, 0x9a, 0xbd, 0x3b, 0x6e, 0x48, 0x3e, +0xad, 0x4e, 0x7a, 0x3f, 0x8c, 0x2f, 0x9a, 0xbd, 0x3b, 0x6e, 0x48, 0x3e, 0xd5, 0x42, 0x7d, 0x3f, 0xdd, 0xce, 0xde, 0xbd, 0x2c, 0x0e, 0xc7, 0x3d, 0xd5, 0x42, 0x7d, 0x3f, 0xdd, 0xce, 0xde, 0xbd, 0x2c, 0x0e, 0xc7, 0x3d, 0xd6, 0x39, 0x7a, 0x3f, 0x0b, 0x26, 0xfe, 0x3d, 0x7a, 0xfc, 0x2e, 0xbe, 0xd6, 0x39, 0x7a, 0x3f, 0x0b, 0x26, 0xfe, 0x3d, 0x7a, 0xfc, 0x2e, 0xbe, 0xf4, 0x86, 0x7f, 0x3f, 0x2e, 0x74, 0x65, 0x3d, 0xa8, 0x8f, 0xc0, 0x3c, 0xf4, 0x86, 0x7f, 0x3f, 0x2e, 0x74, 0x65, 0x3d, +0xa8, 0x8f, 0xc0, 0x3c, 0x9c, 0xdc, 0x4b, 0x3f, 0x30, 0x12, 0x06, 0xbf, 0xd4, 0xef, 0x9a, 0x3e, 0x5e, 0xbd, 0xf2, 0x3e, 0x37, 0x16, 0x3c, 0xbf, 0xa9, 0x6c, 0xf8, 0x3e, 0x21, 0x06, 0x76, 0xbf, 0xa7, 0x03, 0x29, 0x3e, 0x44, 0x14, 0x63, 0x3e, 0xc2, 0x4c, 0x77, 0xbf, 0xa6, 0x29, 0x02, 0x3d, 0x82, 0x57, 0x83, 0x3e, 0x41, 0x64, 0x79, 0xbf, 0x86, 0x1d, 0x16, 0x3e, 0x86, 0xca, 0x2f, 0x3e, 0xea, 0xec, 0x78, 0xbf, 0xb3, 0xd1, 0xb9, 0x3c, 0x4e, 0xf0, 0x6d, 0x3e, 0x76, 0x1b, 0x7c, 0xbf, +0x23, 0xbb, 0xf2, 0x3d, 0x38, 0x10, 0x02, 0x3e, 0x41, 0x0e, 0x7a, 0xbf, 0x51, 0x16, 0x3e, 0x3c, 0xba, 0x10, 0x5b, 0x3e, 0xc4, 0x26, 0x7e, 0xbf, 0xb4, 0xaa, 0xa5, 0x3d, 0x62, 0x68, 0xb5, 0x3d, 0xd2, 0xfb, 0x7a, 0xbf, 0x20, 0x43, 0xc7, 0xbb, 0x27, 0xa0, 0x49, 0x3e, 0xbe, 0x68, 0x7f, 0xbf, 0x47, 0x71, 0x0e, 0x3d, 0x00, 0xe2, 0x6e, 0x3d, 0x65, 0xab, 0x7b, 0xbf, 0x1b, 0x65, 0xfd, 0xbc, 0x8c, 0xdb, 0x38, 0x3e, 0xf8, 0xc3, 0x7f, 0xbf, 0xf3, 0x54, 0x87, 0xbc, 0x26, 0xa8, 0x21, 0x3d, +0xac, 0xc9, 0x7b, 0xbf, 0x72, 0x8c, 0x64, 0xbd, 0xa1, 0xf2, 0x2f, 0x3e, 0x71, 0x38, 0x7f, 0xbf, 0x46, 0x7a, 0x91, 0xbd, 0xb0, 0xc4, 0x03, 0x3d, 0x85, 0x79, 0x7b, 0xbf, 0xfa, 0xd3, 0xa6, 0xbd, 0x46, 0x96, 0x2c, 0x3e, 0x71, 0xc9, 0x7d, 0xbf, 0xb0, 0xe6, 0x00, 0xbe, 0x3c, 0xa1, 0x17, 0x3d, 0x99, 0xbb, 0x7a, 0xbf, 0xaa, 0xef, 0xdc, 0xbd, 0x3b, 0xa6, 0x2e, 0x3e, 0x9c, 0xa4, 0x79, 0xbf, 0x4b, 0xad, 0x07, 0xbe, 0xd0, 0xb7, 0x35, 0x3e, 0x9c, 0x87, 0x7b, 0xbf, 0x41, 0x99, 0x36, 0xbe, +0x74, 0x96, 0x59, 0x3d, 0x5d, 0x4b, 0x78, 0xbf, 0xab, 0x40, 0x1d, 0xbe, 0xe0, 0x81, 0x41, 0x3e, 0x40, 0x9f, 0x78, 0xbf, 0x4d, 0x64, 0x66, 0xbe, 0x2a, 0x1c, 0xa1, 0x3d, 0xd7, 0x32, 0x75, 0xbf, 0x16, 0x17, 0x87, 0xbe, 0x4c, 0x6d, 0xe9, 0x3d, 0x59, 0xc2, 0x76, 0xbf, 0xc3, 0x45, 0x2e, 0xbe, 0x64, 0xad, 0x51, 0x3e, 0x9c, 0x8a, 0x70, 0xbf, 0x7f, 0xbc, 0x97, 0xbe, 0xbb, 0x42, 0x2f, 0x3e, 0xce, 0xa5, 0x74, 0xbf, 0xaa, 0xd1, 0x3b, 0xbe, 0xee, 0xec, 0x6b, 0x3e, 0x8f, 0x8b, 0x6a, 0xbf, +0x09, 0xff, 0xa2, 0xbe, 0xa3, 0x3e, 0x79, 0x3e, 0x8e, 0x94, 0x71, 0xbf, 0x52, 0x7d, 0x47, 0xbe, 0x35, 0xef, 0x88, 0x3e, 0xb1, 0xa8, 0x70, 0xbf, 0xb3, 0x60, 0x92, 0x3e, 0xfa, 0x44, 0x3e, 0x3e, 0x30, 0x9e, 0x75, 0xbf, 0x8f, 0x89, 0x84, 0x3e, 0x42, 0x93, 0xe4, 0x3d, 0xc5, 0xae, 0x79, 0xbf, 0xba, 0x82, 0x5d, 0x3e, 0x1d, 0xe1, 0x34, 0x3d, 0x97, 0xaa, 0x7c, 0xbf, 0x3d, 0x2c, 0x24, 0x3e, 0xac, 0x38, 0x55, 0xbc, 0xb0, 0x74, 0x7e, 0xbf, 0xd2, 0x6f, 0xbf, 0x3d, 0x77, 0xf5, 0x6a, 0xbd, +0xb9, 0xfd, 0x7e, 0xbf, 0xfd, 0xa1, 0x99, 0x3c, 0x6e, 0x88, 0xb1, 0xbd, 0x20, 0x44, 0x7e, 0xbf, 0x46, 0x03, 0x78, 0xbd, 0xf9, 0x15, 0xcb, 0xbd, 0x1e, 0x52, 0x7c, 0xbf, 0xba, 0xf4, 0x0f, 0xbe, 0x0e, 0xd6, 0xbf, 0xbd, 0xe9, 0x0f, 0x79, 0xbf, 0x1f, 0xa2, 0x61, 0xbe, 0xfa, 0x98, 0x8f, 0xbd, 0x8f, 0xa8, 0x74, 0xbf, 0x4a, 0xd2, 0x95, 0xbe, 0x6e, 0xa6, 0x02, 0xbd, 0x16, 0x13, 0x6f, 0xbf, 0x75, 0xb0, 0xb6, 0xbe, 0xd3, 0xa2, 0xbe, 0x3c, 0xda, 0x90, 0x67, 0xbf, 0x54, 0x56, 0xd3, 0xbe, +0x4a, 0xb6, 0xda, 0x3d, 0xb8, 0xca, 0x5f, 0xbf, 0x97, 0xfd, 0xe2, 0xbe, 0x09, 0xdc, 0x4a, 0x3e, 0x6a, 0xa6, 0x67, 0xbf, 0xf6, 0x5e, 0xcc, 0x3e, 0x5e, 0x63, 0x17, 0x3e, 0xce, 0x18, 0x6e, 0xbf, 0x30, 0x48, 0xba, 0x3e, 0x1b, 0xf5, 0x50, 0x3d, 0x92, 0x5b, 0x73, 0xbf, 0x54, 0xc8, 0x9d, 0x3e, 0xba, 0x14, 0x17, 0xbd, 0x0a, 0x31, 0x77, 0xbf, 0x3a, 0xac, 0x70, 0x3e, 0x2b, 0xfa, 0xe3, 0xbd, 0xee, 0x76, 0x79, 0xbf, 0x8e, 0x5c, 0x17, 0x3e, 0xee, 0x0a, 0x2d, 0xbe, 0x4c, 0x1b, 0x7a, 0xbf, +0xb0, 0xfe, 0x4f, 0x3d, 0xc3, 0x2c, 0x54, 0xbe, 0x14, 0x21, 0x79, 0xbf, 0x7e, 0x6f, 0x53, 0xbd, 0xf0, 0xa4, 0x65, 0xbe, 0xce, 0x88, 0x76, 0xbf, 0x68, 0x97, 0x1f, 0xbe, 0xb7, 0x07, 0x61, 0xbe, 0x01, 0xf6, 0x71, 0xbf, 0xa4, 0xfa, 0x86, 0xbe, 0xd7, 0x6c, 0x45, 0xbe, 0x65, 0x18, 0x6b, 0xbf, 0x71, 0x20, 0xbc, 0xbe, 0x7b, 0xa3, 0x16, 0xbe, 0x8f, 0x6c, 0x62, 0xbf, 0x5f, 0xb0, 0xeb, 0xbe, 0xda, 0x1b, 0x9c, 0xbd, 0x96, 0xae, 0x58, 0xbf, 0xda, 0x1f, 0x08, 0xbf, 0x5e, 0x65, 0xed, 0x3c, +0xc5, 0x1b, 0x51, 0xbf, 0x06, 0xbd, 0x0f, 0xbf, 0xf6, 0x95, 0x07, 0x3e, 0xcb, 0x2f, 0x5b, 0xbf, 0xac, 0x57, 0x01, 0x3f, 0xfd, 0x16, 0xdd, 0x3d, 0x00, 0x01, 0x63, 0xbf, 0x98, 0xa2, 0xec, 0x3e, 0xaa, 0x2b, 0x1f, 0xbc, 0x42, 0x5c, 0x69, 0xbf, 0x93, 0xe4, 0xc9, 0x3e, 0xf5, 0x7f, 0xee, 0xbd, 0xfd, 0xf6, 0x6d, 0xbf, 0xe5, 0x47, 0x9c, 0x3e, 0xa4, 0xc3, 0x53, 0xbe, 0x97, 0xaa, 0x70, 0xbf, 0xdf, 0xfb, 0x4b, 0x3e, 0x94, 0xa2, 0x8d, 0xbe, 0x38, 0x66, 0x71, 0xbf, 0x3f, 0x8e, 0xa6, 0x3d, +0x2c, 0x46, 0xa5, 0xbe, 0xdc, 0x2e, 0x70, 0xbf, 0x3e, 0xea, 0x2f, 0xbd, 0x1c, 0xcf, 0xaf, 0xbe, 0x7c, 0xee, 0x6c, 0xbf, 0xac, 0xe5, 0x2e, 0xbe, 0xc7, 0x0f, 0xad, 0xbe, 0xa1, 0x2d, 0x67, 0xbf, 0x40, 0x34, 0x9b, 0xbe, 0xe5, 0xd3, 0x9b, 0xbe, 0x0b, 0x7f, 0x5e, 0xbf, 0xd4, 0xb7, 0xdc, 0xbe, 0xc4, 0x43, 0x78, 0xbe, 0x60, 0x5b, 0x53, 0xbf, 0xf6, 0xeb, 0x0a, 0xbf, 0xe6, 0x3d, 0x1e, 0xbe, 0x11, 0x6b, 0x49, 0xbf, 0xa0, 0x88, 0x1d, 0xbf, 0xe7, 0xde, 0x43, 0xbd, 0x48, 0x87, 0x43, 0xbf, +0x77, 0x49, 0x24, 0xbf, 0xcf, 0xda, 0x8d, 0x3d, 0xc0, 0x92, 0x4b, 0xbf, 0x28, 0x46, 0x1a, 0x3f, 0x1c, 0x08, 0x89, 0x3d, 0x01, 0xa2, 0x54, 0xbf, 0xe7, 0x70, 0x0d, 0x3f, 0x9a, 0x98, 0x8e, 0xbd, 0xc6, 0xf9, 0x5b, 0xbf, 0x47, 0x75, 0xf2, 0x3e, 0xa4, 0xff, 0x45, 0xbe, 0x17, 0x47, 0x61, 0xbf, 0x38, 0x6a, 0xbd, 0x3e, 0x2f, 0x88, 0x98, 0xbe, 0xb7, 0x5d, 0x64, 0xbf, 0x9b, 0xc8, 0x7c, 0x3e, 0xea, 0xd0, 0xc1, 0xbe, 0x12, 0x2d, 0x65, 0xbf, 0x7d, 0xaf, 0xe1, 0x3d, 0x0e, 0x13, 0xdd, 0xbe, +0xf1, 0xbd, 0x63, 0xbf, 0x69, 0x52, 0x0a, 0xbd, 0xa9, 0x31, 0xe9, 0xbe, 0xcd, 0x1e, 0x60, 0xbf, 0x2e, 0x3d, 0x3a, 0xbe, 0x92, 0x3e, 0xe5, 0xbe, 0xa6, 0x48, 0x5a, 0xbf, 0xf0, 0x85, 0xa9, 0xbe, 0xc8, 0xea, 0xce, 0xbe, 0x16, 0xde, 0x51, 0xbf, 0xc5, 0x39, 0xf2, 0xbe, 0xdf, 0x34, 0xa5, 0xbe, 0xe1, 0xed, 0x45, 0xbf, 0x18, 0xee, 0x18, 0xbf, 0xce, 0x14, 0x5a, 0xbe, 0x85, 0x79, 0x3b, 0xbf, 0xaa, 0x0f, 0x2c, 0xbf, 0xd1, 0x06, 0xe0, 0xbd, 0x5e, 0x2c, 0x34, 0xbf, 0x42, 0xcc, 0x35, 0xbf, +0xc7, 0xf3, 0x99, 0x3c, 0x35, 0x29, 0x39, 0xbf, 0x58, 0xa9, 0x30, 0x3f, 0x74, 0xce, 0xcf, 0x3c, 0xad, 0x51, 0x43, 0xbf, 0x86, 0x38, 0x22, 0x3f, 0x2e, 0xe7, 0x02, 0xbe, 0x5d, 0x8a, 0x4b, 0xbf, 0xb3, 0x7a, 0x0b, 0x3f, 0x44, 0x6c, 0x88, 0xbe, 0x64, 0x77, 0x51, 0xbf, 0xe3, 0x54, 0xdb, 0x3e, 0x59, 0x4c, 0xc4, 0xbe, 0x36, 0xe7, 0x54, 0xbf, 0x9e, 0x95, 0x94, 0x3e, 0x6a, 0x65, 0xf2, 0xbe, 0x4b, 0xca, 0x55, 0xbf, 0x41, 0x4a, 0x0c, 0x3e, 0x74, 0x61, 0x08, 0xbf, 0x80, 0x2c, 0x54, 0xbf, +0xde, 0x90, 0xc6, 0xbc, 0x7a, 0x1b, 0x0f, 0xbf, 0x4c, 0x53, 0x50, 0xbf, 0xcb, 0xbd, 0x40, 0xbe, 0xc2, 0xc3, 0x0c, 0xbf, 0x90, 0x83, 0x4a, 0xbf, 0x4c, 0x6b, 0xb3, 0xbe, 0x25, 0x5c, 0x00, 0xbf, 0xc6, 0xf7, 0x41, 0xbf, 0xdd, 0xd3, 0x01, 0xbf, 0x7b, 0x4e, 0xd2, 0xbe, 0x2f, 0x50, 0x36, 0xbf, 0x2a, 0x02, 0x24, 0xbf, 0x55, 0xf5, 0x92, 0xbe, 0x2f, 0x33, 0x2c, 0xbf, 0x13, 0xd7, 0x39, 0xbf, 0x8e, 0xc9, 0x12, 0x3e, 0x59, 0x50, 0x24, 0xbf, 0xe5, 0x43, 0x44, 0x3f, 0xb8, 0xaf, 0x83, 0xbc, +0xdb, 0x6d, 0x2f, 0xbf, 0x83, 0x6d, 0x34, 0x3f, 0x8a, 0xe4, 0x3b, 0xbe, 0xce, 0x6b, 0x38, 0xbf, 0x7c, 0x7f, 0x1b, 0x3f, 0x8c, 0x68, 0xab, 0xbe, 0x7e, 0xe4, 0x3e, 0xbf, 0x46, 0xb4, 0xf5, 0x3e, 0x08, 0xac, 0xec, 0xbe, 0xca, 0xa4, 0x42, 0xbf, 0x3f, 0x56, 0xa8, 0x3e, 0x16, 0x68, 0x0f, 0xbf, 0xb2, 0x9d, 0x43, 0xbf, 0xef, 0x53, 0x25, 0x3e, 0xa8, 0xe1, 0x1f, 0xbf, 0x44, 0xdb, 0x41, 0xbf, 0x37, 0x8d, 0x6d, 0xbc, 0x84, 0x28, 0x27, 0xbf, 0x24, 0x99, 0x3d, 0xbf, 0x33, 0x6c, 0x44, 0xbe, +0xd3, 0xda, 0x24, 0xbf, 0x7a, 0xa7, 0x36, 0xbf, 0xf1, 0x7e, 0xbc, 0xbe, 0xf5, 0x9c, 0x18, 0xbf, 0x2e, 0x56, 0x2c, 0xbf, 0x4f, 0x1e, 0x0a, 0xbf, 0x4b, 0x75, 0x01, 0xbf, 0x37, 0x33, 0x22, 0xbf, 0x0e, 0xa1, 0x2a, 0xbf, 0x3a, 0x20, 0xc9, 0xbe, 0x18, 0x5e, 0x0d, 0xbf, 0x07, 0xee, 0x54, 0x3f, 0x26, 0xfe, 0x68, 0xbd, 0x95, 0x49, 0x19, 0xbf, 0x3d, 0xee, 0x43, 0x3f, 0x3f, 0xaa, 0x71, 0xbe, 0x13, 0xf1, 0x22, 0xbf, 0xae, 0x2c, 0x29, 0x3f, 0x62, 0xa0, 0xcb, 0xbe, 0x9b, 0xe6, 0x29, 0xbf, +0x9d, 0x2b, 0x06, 0x3f, 0x9d, 0xa1, 0x08, 0xbf, 0x8d, 0xf1, 0x2d, 0xbf, 0x84, 0x7f, 0xb9, 0x3e, 0xf3, 0x54, 0x23, 0xbf, 0x75, 0x01, 0x2f, 0xbf, 0x7b, 0xbd, 0x3b, 0x3e, 0x30, 0xd9, 0x34, 0xbf, 0x85, 0x22, 0x2d, 0xbf, 0xf4, 0x4d, 0x9a, 0xbb, 0x14, 0x92, 0x3c, 0xbf, 0xfb, 0x78, 0x28, 0xbf, 0xa7, 0x5b, 0x46, 0xbe, 0x56, 0x43, 0x3a, 0xbf, 0x6d, 0xfe, 0x1f, 0xbf, 0x82, 0x55, 0xc5, 0xbe, 0x29, 0xca, 0x2d, 0xbf, 0x71, 0xc4, 0x12, 0xbf, 0x73, 0x49, 0x11, 0xbf, 0xe4, 0x48, 0x17, 0xbf, +0x91, 0x2a, 0x0a, 0xbf, 0x0b, 0x7e, 0x2b, 0xbf, 0x1f, 0x86, 0x02, 0xbf, 0x6b, 0x62, 0xe9, 0xbe, 0x5e, 0x83, 0x62, 0x3f, 0x92, 0xb2, 0xc5, 0xbd, 0x85, 0x41, 0x01, 0xbf, 0xaf, 0x99, 0x50, 0x3f, 0x29, 0xce, 0x91, 0xbe, 0x1d, 0x76, 0x0b, 0xbf, 0x49, 0x67, 0x34, 0x3f, 0xb2, 0xbb, 0xe8, 0xbe, 0x67, 0xd6, 0x12, 0xbf, 0xdf, 0x8b, 0x0f, 0x3f, 0xb1, 0xde, 0x18, 0xbf, 0x1c, 0x25, 0x17, 0xbf, 0xba, 0xf4, 0xc7, 0x3e, 0xb7, 0xd1, 0x34, 0xbf, 0x0e, 0x4e, 0x18, 0xbf, 0xde, 0x55, 0x4f, 0x3e, +0x1d, 0x21, 0x47, 0xbf, 0x89, 0x5e, 0x16, 0xbf, 0xfc, 0x00, 0xa4, 0x3b, 0x06, 0x2e, 0x4f, 0xbf, 0x17, 0x7d, 0x11, 0xbf, 0x9f, 0x04, 0x46, 0xbe, 0x66, 0xbd, 0x4c, 0xbf, 0x10, 0x1f, 0x08, 0xbf, 0x05, 0x6b, 0xcc, 0xbe, 0x1a, 0x35, 0x3f, 0xbf, 0x3e, 0xb2, 0xf1, 0xbe, 0x92, 0xb1, 0x16, 0xbf, 0x58, 0xff, 0x27, 0xbf, 0x91, 0x62, 0xe0, 0xbe, 0xda, 0xe7, 0x29, 0xbf, 0x27, 0x2e, 0x1b, 0xbf, 0x42, 0x5d, 0xac, 0xbe, 0x9f, 0x59, 0x6e, 0x3f, 0xbd, 0x1a, 0x10, 0xbe, 0x10, 0x95, 0xc6, 0xbe, +0x8e, 0xb1, 0x5b, 0x3f, 0xa5, 0x2f, 0xac, 0xbe, 0x12, 0xf8, 0xdb, 0xbe, 0xdf, 0x52, 0x3e, 0x3f, 0x05, 0x36, 0x03, 0xbf, 0xb6, 0x81, 0xeb, 0xbe, 0xf9, 0xf5, 0x17, 0x3f, 0xe5, 0x0c, 0x29, 0xbf, 0x3f, 0xab, 0xf4, 0xbe, 0x83, 0x4d, 0xd5, 0x3e, 0xa9, 0xfa, 0x45, 0xbf, 0x6c, 0x41, 0xf7, 0xbe, 0xdd, 0x79, 0x62, 0x3e, 0xe2, 0xe6, 0x58, 0xbf, 0xde, 0x59, 0xf3, 0xbe, 0x7b, 0x16, 0x84, 0x3c, 0x94, 0x32, 0x61, 0xbf, 0xef, 0x3c, 0xe9, 0xbe, 0x63, 0x5f, 0x42, 0xbe, 0x59, 0xa7, 0x5e, 0xbf, +0x38, 0xf9, 0xd5, 0xbe, 0x3a, 0xe7, 0xcf, 0xbe, 0x41, 0x0c, 0x50, 0xbf, 0xc5, 0x04, 0xb5, 0xbe, 0x29, 0xae, 0x1a, 0xbf, 0x57, 0xce, 0x36, 0xbf, 0xfb, 0xad, 0x9d, 0xbe, 0x2b, 0xa6, 0x2a, 0xbf, 0x7a, 0xc7, 0x2d, 0xbf, 0xf6, 0x5c, 0x46, 0xbe, 0x77, 0x81, 0x76, 0x3f, 0x93, 0x52, 0x40, 0xbe, 0x6b, 0x2d, 0x7c, 0xbe, 0x2e, 0x6e, 0x63, 0x3f, 0x70, 0x5c, 0xc6, 0xbe, 0x15, 0xc5, 0x93, 0xbe, 0xf0, 0x4b, 0x45, 0x3f, 0x11, 0x6f, 0x11, 0xbf, 0xdf, 0x4e, 0xa2, 0xbe, 0x95, 0xf3, 0x1d, 0x3f, +0x0e, 0x65, 0x38, 0xbf, 0x59, 0x14, 0xa6, 0xbe, 0x36, 0x04, 0xdf, 0x3e, 0xe0, 0xf4, 0x56, 0xbf, 0xe2, 0x06, 0xa4, 0xbe, 0x2a, 0xe0, 0x7e, 0x3e, 0x8f, 0xfc, 0x69, 0xbf, 0xb8, 0x01, 0xa7, 0xbe, 0x1e, 0xa7, 0x28, 0x3d, 0xca, 0xc4, 0x71, 0xbf, 0xdf, 0xc2, 0xa2, 0xbe, 0x26, 0x1c, 0x3a, 0xbe, 0x22, 0x38, 0x6e, 0xbf, 0x97, 0x1c, 0x8f, 0xbe, 0xaf, 0x0b, 0xcf, 0xbe, 0xa6, 0xee, 0x5e, 0xbf, 0x2b, 0x68, 0x5a, 0xbe, 0xc1, 0x52, 0x1d, 0xbf, 0xca, 0x6e, 0x42, 0xbf, 0x78, 0x7b, 0x20, 0xbe, +0x4e, 0xb9, 0x2e, 0xbf, 0x40, 0xc0, 0x36, 0xbf, 0xfd, 0x4f, 0x3e, 0xbd, 0x78, 0xd4, 0x78, 0x3f, 0x6d, 0xe7, 0x6b, 0xbe, 0x0f, 0x9c, 0xd3, 0xbd, 0x07, 0x23, 0x66, 0x3f, 0x24, 0xee, 0xd9, 0xbe, 0x83, 0x4e, 0x28, 0xbe, 0x81, 0x94, 0x48, 0x3f, 0xcb, 0x67, 0x19, 0xbf, 0x33, 0x88, 0x5f, 0xbe, 0x68, 0xcc, 0x24, 0x3f, 0x1e, 0xc3, 0x3b, 0xbf, 0x12, 0x50, 0x61, 0xbe, 0x1c, 0x9a, 0xda, 0x3e, 0x3b, 0x89, 0x60, 0xbf, 0x90, 0x4c, 0x27, 0xbe, 0x09, 0xfa, 0x83, 0x3e, 0x8a, 0xc9, 0x73, 0xbf, +0x7b, 0xa4, 0x41, 0xbe, 0x52, 0xd7, 0xba, 0x3d, 0x33, 0x4b, 0x7a, 0xbf, 0x03, 0xd0, 0x48, 0xbe, 0x4d, 0x4e, 0x0d, 0xbe, 0xec, 0x87, 0x78, 0xbf, 0x94, 0x48, 0x22, 0xbe, 0x1e, 0xc0, 0xca, 0xbe, 0x8b, 0x8b, 0x67, 0xbf, 0x62, 0xd9, 0x8c, 0xbd, 0xdf, 0x6f, 0x20, 0xbf, 0xf6, 0xb5, 0x46, 0xbf, 0x1b, 0x62, 0x3c, 0x3c, 0xd1, 0xeb, 0x33, 0xbf, 0x51, 0x16, 0x36, 0xbf, 0x7e, 0x90, 0xa5, 0x3d, 0x80, 0x49, 0x76, 0x3f, 0xca, 0x6b, 0x85, 0xbe, 0x71, 0x21, 0x8f, 0xbb, 0x35, 0xb8, 0x65, 0x3f, +0xc7, 0xf3, 0xe1, 0xbe, 0x13, 0x7d, 0xde, 0xbd, 0x88, 0xef, 0x4c, 0x3f, 0x8f, 0xe0, 0x16, 0xbf, 0x06, 0x46, 0x9e, 0xbd, 0x6a, 0xa1, 0x24, 0x3e, 0xde, 0xe4, 0x7b, 0xbf, 0xda, 0x02, 0x42, 0xbd, 0xe4, 0x4b, 0xa8, 0xbb, 0x8d, 0xb5, 0x7f, 0xbf, 0x46, 0x98, 0x62, 0xbd, 0x84, 0xf0, 0xc0, 0xbe, 0x5b, 0xb4, 0x6c, 0xbf, 0x90, 0x49, 0xc6, 0x3c, 0x76, 0xf8, 0x23, 0xbf, 0x56, 0x7f, 0x44, 0xbf, 0x98, 0x33, 0xfb, 0x3d, 0x99, 0x0c, 0x3f, 0xbf, 0x6c, 0x7b, 0x27, 0xbf, 0x78, 0x61, 0x3b, 0x3e, +0x03, 0xcf, 0x71, 0x3f, 0x5c, 0x92, 0x8b, 0xbe, 0xf0, 0xf8, 0x76, 0x3d, 0x8d, 0x99, 0x64, 0x3f, 0x80, 0x62, 0xe4, 0xbe, 0xc6, 0xf8, 0x98, 0x3e, 0x9d, 0xf5, 0x69, 0x3f, 0x31, 0xb2, 0x8c, 0xbe, 0x3e, 0xb2, 0x81, 0x3e, 0x99, 0x45, 0x64, 0x3f, 0xf5, 0x11, 0xc0, 0xbe, 0x93, 0x38, 0xeb, 0x3d, 0xce, 0x38, 0xad, 0xbe, 0x3b, 0x1a, 0x6f, 0xbf, 0x03, 0x5f, 0xd1, 0x3d, 0x8b, 0xc6, 0x5a, 0x3c, 0xc2, 0xa2, 0x7e, 0xbf, 0x49, 0x68, 0x1b, 0x3e, 0x85, 0x5c, 0x1d, 0xbf, 0xb3, 0x26, 0x46, 0xbf, +0x84, 0x83, 0x7d, 0x3e, 0x9f, 0x1f, 0x4a, 0xbf, 0x05, 0xc1, 0x0f, 0xbf, 0x0d, 0x52, 0xd8, 0x3e, 0xc5, 0x8c, 0x5c, 0x3f, 0xb7, 0x27, 0x90, 0xbe, 0x99, 0x29, 0xd5, 0x3e, 0x14, 0xed, 0x56, 0x3f, 0xc0, 0xb2, 0xb2, 0xbe, 0x79, 0x75, 0xbe, 0x3e, 0xf1, 0xbc, 0x8c, 0xbe, 0x6a, 0xf8, 0x62, 0xbf, 0xfc, 0xfb, 0xb4, 0x3e, 0x4e, 0x62, 0x90, 0x3c, 0x1e, 0x6e, 0x6f, 0xbf, 0x4a, 0xb3, 0xc1, 0x3e, 0xef, 0xe2, 0x01, 0xbf, 0xb9, 0x34, 0x46, 0xbf, 0xcf, 0xda, 0xc5, 0x3e, 0x8e, 0xe8, 0x3a, 0xbf, +0xcc, 0x45, 0x10, 0xbf, 0x1d, 0xc7, 0x07, 0x3f, 0xb1, 0x35, 0x4b, 0x3f, 0xd8, 0x65, 0x98, 0xbe, 0x14, 0x5e, 0x0a, 0x3f, 0xd9, 0x5b, 0x42, 0x3f, 0x83, 0xa2, 0xb9, 0xbe, 0x4c, 0xc1, 0x16, 0x3f, 0xd5, 0x23, 0x4d, 0xbe, 0x4b, 0x72, 0x48, 0xbf, 0x6d, 0x90, 0x11, 0x3f, 0x26, 0xc3, 0x71, 0x3c, 0xb9, 0x8d, 0x52, 0xbf, 0x61, 0x1b, 0x15, 0x3f, 0x70, 0x24, 0xb0, 0xbe, 0xb1, 0x89, 0x3c, 0xbf, 0xc7, 0x62, 0x13, 0x3f, 0xaa, 0xb8, 0x11, 0xbf, 0x13, 0x43, 0x16, 0xbf, 0x57, 0x04, 0x27, 0x3f, +0x28, 0x0e, 0x30, 0x3f, 0x39, 0x0b, 0xa3, 0xbe, 0x71, 0xaf, 0x28, 0x3f, 0xe9, 0x80, 0x24, 0x3f, 0xba, 0x32, 0xc8, 0xbe, 0x5a, 0x80, 0x12, 0x3f, 0x32, 0xaf, 0x63, 0xbe, 0x94, 0x12, 0x4a, 0xbf, 0x39, 0x2a, 0x07, 0x3f, 0x6d, 0x1b, 0x06, 0x3d, 0x3a, 0x3f, 0x59, 0xbf, 0x16, 0xbf, 0x25, 0x3f, 0xc4, 0x5c, 0x8a, 0xbe, 0x3c, 0x6c, 0x36, 0xbf, 0xc6, 0x33, 0x38, 0x3f, 0xbc, 0x41, 0xb4, 0xbe, 0x53, 0x3d, 0x19, 0xbf, 0xee, 0xb3, 0x16, 0x3f, 0x53, 0x58, 0x39, 0xbf, 0xe4, 0x15, 0xb8, 0xbe, +0x85, 0xee, 0x42, 0x3f, 0xf9, 0x66, 0x03, 0xbf, 0x4f, 0xb1, 0xca, 0xbe, 0x85, 0xd0, 0xd9, 0x3e, 0x72, 0x6a, 0x53, 0xbf, 0x99, 0x82, 0xbd, 0xbe, 0x4b, 0x1f, 0x42, 0x3f, 0x67, 0x60, 0x0c, 0x3f, 0x5d, 0x85, 0xb4, 0xbe, 0x4d, 0xa0, 0x40, 0x3f, 0xbc, 0xb0, 0xfd, 0x3e, 0x38, 0x2f, 0xde, 0xbe, 0x67, 0x47, 0x46, 0x3f, 0xf6, 0x41, 0xf6, 0x3e, 0x21, 0x57, 0xd2, 0xbe, 0xf9, 0x4b, 0x43, 0x3f, 0x3c, 0x33, 0xe9, 0x3e, 0x67, 0xf1, 0xea, 0xbe, 0x72, 0xa4, 0x73, 0xbd, 0x61, 0x6c, 0x99, 0x3e, +0xca, 0xc2, 0x73, 0xbf, 0x65, 0x8a, 0xb9, 0xbd, 0xb2, 0x66, 0xcc, 0x3e, 0xf3, 0x90, 0x69, 0xbf, 0x91, 0xd0, 0x96, 0x3d, 0x55, 0x6c, 0xcc, 0x3e, 0xa5, 0xf3, 0x69, 0xbf, 0x36, 0xb0, 0x15, 0x3d, 0x2a, 0x37, 0xf1, 0x3e, 0x77, 0x9d, 0x61, 0xbf, 0xe3, 0x1a, 0x1f, 0xbd, 0x05, 0x32, 0xc3, 0x3e, 0xeb, 0x74, 0x6c, 0xbf, 0xa3, 0xb1, 0xf6, 0xbc, 0x93, 0x52, 0x88, 0x3e, 0x7b, 0xa3, 0x76, 0xbf, 0x35, 0x07, 0x08, 0xbe, 0x74, 0x7e, 0x02, 0x3f, 0x41, 0x9a, 0x59, 0xbf, 0x83, 0x18, 0x88, 0xbd, +0x23, 0xd8, 0x00, 0x3f, 0xce, 0x8e, 0x5c, 0xbf, 0x3c, 0xbc, 0xe7, 0x3a, 0x40, 0xc1, 0x09, 0x3f, 0xb9, 0xc6, 0x57, 0xbf, 0x6d, 0xe3, 0x4f, 0x3d, 0x21, 0xac, 0x86, 0x3d, 0x82, 0x1d, 0x7f, 0xbf, 0x79, 0x21, 0x9d, 0xbc, 0xbd, 0x37, 0x46, 0x3e, 0x32, 0x1c, 0x7b, 0xbf, 0x3e, 0x3e, 0x31, 0x3e, 0x0b, 0xb5, 0x56, 0x3e, 0x31, 0x5b, 0x76, 0xbf, 0xda, 0x1a, 0xf1, 0x3d, 0xb2, 0x0d, 0xa4, 0x3e, 0x73, 0x9f, 0x70, 0xbf, 0x9d, 0x7f, 0x3b, 0xbb, 0xf9, 0xbd, 0x1d, 0x3e, 0x80, 0xf1, 0x7c, 0xbf, +0xf9, 0x85, 0x97, 0x3d, 0x60, 0x39, 0x42, 0x3d, 0x71, 0x02, 0x7f, 0xbf, 0x39, 0x06, 0x64, 0x3e, 0x25, 0x24, 0x42, 0xbe, 0xb3, 0xce, 0x74, 0xbf, 0xc5, 0x74, 0x11, 0x3e, 0x10, 0xc9, 0x90, 0xbd, 0xca, 0xc1, 0x7c, 0xbf, 0xf0, 0x6a, 0x91, 0x3e, 0x5c, 0x93, 0xae, 0xbd, 0x52, 0x7c, 0x74, 0xbf, 0x91, 0x9b, 0x71, 0x3e, 0x19, 0x1b, 0x7a, 0x3d, 0xd4, 0x47, 0x78, 0xbf, 0x88, 0x63, 0x3d, 0x3e, 0x7a, 0x35, 0x40, 0xbd, 0xe8, 0x4b, 0x7b, 0xbf, 0xf5, 0x80, 0x91, 0x3e, 0xf3, 0xc7, 0xf4, 0xbd, +0xbd, 0x87, 0x73, 0xbf, 0x08, 0x59, 0xa6, 0x3e, 0xb8, 0xac, 0x92, 0xbe, 0xc7, 0xbc, 0x66, 0xbf, 0x8f, 0xa5, 0xa7, 0x3e, 0x40, 0x31, 0x62, 0xbe, 0x55, 0x2f, 0x6b, 0xbf, 0x80, 0x9c, 0xf0, 0x3e, 0x7c, 0x28, 0xa1, 0xbe, 0x71, 0x1d, 0x53, 0xbf, 0xfa, 0x47, 0xdf, 0x3e, 0x3c, 0xbf, 0x80, 0xbe, 0xa5, 0x32, 0x5d, 0xbf, 0xb6, 0x4c, 0xbe, 0x3e, 0x69, 0xab, 0x32, 0xbe, 0xd7, 0x6c, 0x69, 0xbf, 0xd8, 0x7e, 0xf2, 0x3e, 0x63, 0x25, 0x56, 0xbe, 0x8a, 0x04, 0x5b, 0xbf, 0xf0, 0x4b, 0x25, 0x3f, +0xa0, 0x6b, 0x1f, 0xbd, 0x36, 0x3a, 0x43, 0xbf, 0xa7, 0xcd, 0x28, 0x3f, 0xc3, 0x46, 0x99, 0xbd, 0x62, 0x81, 0x3f, 0xbf, 0x08, 0x02, 0x18, 0x3f, 0xaa, 0x9d, 0x61, 0xbe, 0x8a, 0x1c, 0x46, 0xbf, 0x6c, 0xcc, 0x13, 0x3f, 0x5c, 0x05, 0x41, 0xbe, 0x02, 0x61, 0x4b, 0xbf, 0x31, 0x22, 0x05, 0x3f, 0x0d, 0xc6, 0x28, 0xbe, 0x7a, 0x8c, 0x56, 0xbf, 0x3a, 0x20, 0xf9, 0x3e, 0xa5, 0x15, 0x5f, 0xbb, 0x6a, 0xa6, 0x5f, 0xbf, 0xae, 0x4a, 0x22, 0x3f, 0x0a, 0x12, 0x2b, 0x3e, 0x05, 0x4f, 0x41, 0xbf, +0x14, 0x41, 0xe4, 0x3e, 0x99, 0xb9, 0x30, 0x3e, 0x6e, 0xda, 0x60, 0xbf, 0xf8, 0x6c, 0x15, 0x3f, 0xa3, 0x57, 0xb3, 0x3e, 0x6a, 0x87, 0x3b, 0xbf, 0x84, 0x0d, 0xc7, 0x3e, 0x11, 0xe4, 0xa8, 0x3e, 0xde, 0x39, 0x5c, 0xbf, 0x1b, 0xbc, 0x2b, 0x3f, 0x15, 0x37, 0xa6, 0x3e, 0x92, 0xb1, 0x2a, 0xbf, 0x02, 0x2d, 0x31, 0x3f, 0xb0, 0xac, 0xf4, 0x3d, 0xef, 0x3b, 0x36, 0xbf, 0x12, 0x87, 0x04, 0x3f, 0x0f, 0xb5, 0xf5, 0x3e, 0xac, 0x53, 0x35, 0xbf, 0x03, 0x44, 0xa9, 0x3e, 0xfa, 0xb5, 0xdd, 0x3e, +0x32, 0xac, 0x56, 0xbf, 0x23, 0xf4, 0xe3, 0x3e, 0x96, 0xed, 0x13, 0x3f, 0x7a, 0x1b, 0x2f, 0xbf, 0x95, 0x0b, 0x8d, 0x3e, 0x9b, 0xac, 0x01, 0x3f, 0x7c, 0x28, 0x51, 0xbf, 0xe6, 0xe8, 0x09, 0x3f, 0x50, 0xe1, 0x1c, 0x3f, 0x50, 0x01, 0x14, 0xbf, 0xca, 0xdf, 0x1d, 0x3f, 0xab, 0x03, 0xf8, 0x3e, 0x23, 0xda, 0x1e, 0xbf, 0xa8, 0x1c, 0xbb, 0x3e, 0x04, 0x20, 0x2a, 0x3f, 0xfd, 0xda, 0x26, 0xbf, 0x24, 0x27, 0x63, 0x3e, 0xfc, 0xa4, 0x12, 0x3f, 0x9b, 0x01, 0x4a, 0xbf, 0x69, 0x56, 0x8e, 0x3e, +0xf6, 0xb5, 0x3e, 0x3f, 0x36, 0x3e, 0x1b, 0xbf, 0x18, 0x97, 0x3a, 0x3e, 0x4b, 0x04, 0x22, 0x3f, 0x1a, 0xa4, 0x40, 0xbf, 0x93, 0x1b, 0x9d, 0x3e, 0x87, 0x4b, 0x4e, 0x3f, 0xdf, 0xa4, 0x01, 0xbf, 0x53, 0x04, 0xe0, 0x3e, 0x5d, 0x14, 0x39, 0x3f, 0xdb, 0xe0, 0x08, 0xbf, 0x17, 0x2d, 0x00, 0x3e, 0xf3, 0x54, 0x53, 0x3f, 0x09, 0xe2, 0x0c, 0xbf, 0x65, 0x8a, 0xf9, 0x3d, 0x74, 0x43, 0x3b, 0x3f, 0x01, 0xbe, 0x2b, 0xbf, 0xe5, 0xec, 0x9d, 0xbd, 0x41, 0xf0, 0x50, 0x3f, 0x20, 0x99, 0x12, 0xbf, +0x78, 0x96, 0xa0, 0xbc, 0x6d, 0x74, 0x3e, 0x3f, 0x97, 0xfd, 0x2a, 0xbf, 0x9d, 0x9e, 0xf7, 0xbc, 0x03, 0x5f, 0x4d, 0x3f, 0xb5, 0xa3, 0x18, 0xbf, 0x8f, 0x1a, 0x03, 0x3e, 0xdf, 0x6a, 0x59, 0x3f, 0xa3, 0x1d, 0x03, 0xbf, 0xdf, 0xc2, 0x2a, 0xbe, 0x22, 0x1b, 0x2c, 0x3f, 0xa0, 0xa4, 0x38, 0xbf, 0x22, 0x6f, 0x99, 0xbd, 0xea, 0xce, 0x23, 0x3f, 0x0c, 0xcb, 0x43, 0xbf, 0x16, 0xdf, 0xb0, 0xbd, 0xea, 0xb2, 0x28, 0x3f, 0x84, 0x47, 0x3f, 0xbf, 0x55, 0xd9, 0xe7, 0x3e, 0x4d, 0xf3, 0x9e, 0x3e, +0x1f, 0xf7, 0x55, 0xbf, 0x00, 0xe4, 0x0c, 0x3f, 0x0a, 0x84, 0xb5, 0x3e, 0x5e, 0x84, 0x41, 0xbf, 0x4c, 0xaa, 0xd6, 0x3e, 0x69, 0x39, 0xd0, 0x3e, 0x10, 0xca, 0x4f, 0xbf, 0x8d, 0x5d, 0xfa, 0x3e, 0xee, 0x3f, 0xda, 0x3e, 0x63, 0xd3, 0x42, 0xbf, 0xa9, 0x31, 0x21, 0x3f, 0x79, 0xcd, 0x43, 0x3f, 0x3a, 0x5c, 0x0b, 0xbe, 0x88, 0x2f, 0xdb, 0x3e, 0xa2, 0x43, 0x04, 0x3f, 0xe5, 0xd1, 0x3d, 0xbf, 0xd3, 0x6a, 0x4c, 0x3f, 0x39, 0xec, 0x16, 0x3f, 0x38, 0x66, 0xf9, 0xbd, 0x31, 0x08, 0xf4, 0x3e, +0x80, 0xd5, 0x31, 0x3e, 0xbf, 0x9d, 0x5c, 0xbf, 0x29, 0xb2, 0x0a, 0x3f, 0x09, 0x53, 0x54, 0xbd, 0x76, 0xc3, 0x56, 0xbf, 0xa8, 0xc7, 0xf6, 0x3e, 0xfc, 0x8d, 0x26, 0x3e, 0xf5, 0x66, 0x5c, 0xbf, 0x01, 0x68, 0x1c, 0x3f, 0xb4, 0xe5, 0xdc, 0xbc, 0x15, 0x8c, 0x4a, 0xbf, 0xe7, 0xc3, 0x6b, 0x3f, 0x1d, 0xaf, 0x30, 0xbe, 0xac, 0xe1, 0xb2, 0xbe, 0x2c, 0xd6, 0x24, 0x3f, 0x43, 0xe5, 0x9f, 0x3d, 0xe4, 0xd8, 0x42, 0xbf, 0x24, 0x28, 0x46, 0x3f, 0x9b, 0x71, 0xca, 0xbe, 0x17, 0x2c, 0xfd, 0xbe, +0x35, 0x5d, 0xf7, 0x3e, 0x1b, 0x29, 0x2b, 0x3e, 0x86, 0x04, 0x5c, 0xbf, 0x07, 0x23, 0xf6, 0x3e, 0x76, 0x6d, 0x6f, 0x3e, 0x96, 0x59, 0x58, 0xbf, 0x7f, 0xdd, 0x1d, 0x3f, 0xb5, 0xe0, 0x75, 0x3e, 0x52, 0xed, 0x3f, 0xbf, 0x58, 0xc7, 0x69, 0x3f, 0xe8, 0x82, 0xc2, 0x3e, 0x65, 0xfd, 0x16, 0xbe, 0x8c, 0xbd, 0x77, 0x3f, 0xc0, 0x79, 0xf1, 0x3d, 0xa7, 0x04, 0x64, 0xbe, 0xd7, 0xf9, 0xc7, 0x3e, 0x37, 0x51, 0x17, 0x3f, 0x71, 0xab, 0x34, 0xbf, 0x79, 0x03, 0xc4, 0x3e, 0x04, 0xfe, 0x08, 0x3f, +0x7e, 0xc7, 0x40, 0xbf, 0x07, 0x0a, 0xd4, 0x3e, 0xd3, 0xdb, 0x13, 0x3f, 0xeb, 0x17, 0x34, 0xbf, 0xdc, 0x47, 0xae, 0x3e, 0xc3, 0x66, 0x68, 0x3f, 0x2c, 0xd4, 0x7a, 0xbe, 0x45, 0xd5, 0xd7, 0x3e, 0xbb, 0x99, 0x15, 0x3f, 0x77, 0x82, 0x31, 0xbf, 0xd6, 0xe2, 0xf3, 0x3e, 0x31, 0x5d, 0x5c, 0x3f, 0x43, 0x8c, 0x37, 0xbe, 0xed, 0xef, 0xdc, 0x3e, 0x32, 0x75, 0x13, 0x3f, 0x8c, 0xbb, 0x31, 0xbf, 0x6c, 0x92, 0xcf, 0x3e, 0x41, 0x7e, 0x0a, 0x3f, 0x2f, 0xa3, 0x3c, 0xbf, 0xc3, 0xd8, 0xba, 0x3e, +0x20, 0xcd, 0x10, 0x3f, 0xfc, 0x50, 0x3d, 0xbf, 0x5f, 0x24, 0x24, 0x3e, 0xe2, 0xc8, 0x6b, 0x3f, 0x5e, 0xbe, 0xb5, 0xbe, 0x7f, 0xbd, 0x82, 0xbd, 0x03, 0xb0, 0x59, 0x3f, 0x45, 0xb8, 0x05, 0xbf, 0xdf, 0x6a, 0x6d, 0x3e, 0x21, 0x3e, 0x04, 0x3f, 0x60, 0x02, 0x53, 0xbf, 0x24, 0x9a, 0x70, 0xbe, 0xc9, 0xae, 0x2c, 0x3f, 0x2c, 0x29, 0x33, 0xbf, 0x17, 0x0f, 0x87, 0xbe, 0x39, 0x2b, 0xfa, 0x3e, 0x64, 0xe8, 0x54, 0xbf, 0x97, 0xc4, 0xf9, 0x3d, 0x9a, 0x41, 0xdc, 0x3e, 0x87, 0xfb, 0x64, 0xbf, +0x15, 0x36, 0x13, 0x3e, 0xc9, 0xb0, 0xb2, 0x3e, 0x2c, 0x10, 0x6d, 0xbf, 0x87, 0x19, 0x7a, 0x3e, 0x6f, 0x81, 0xbc, 0x3e, 0x9c, 0xa8, 0x65, 0xbf, 0x90, 0xdc, 0x92, 0x3e, 0xc6, 0x6b, 0xee, 0x3e, 0xc2, 0x51, 0x56, 0xbf, 0x2b, 0x18, 0xdd, 0x3e, 0x91, 0x26, 0x9e, 0x3e, 0x52, 0xf0, 0x58, 0xbf, 0x06, 0xbe, 0xb2, 0x3e, 0x15, 0xc8, 0x9c, 0x3e, 0x4d, 0xb9, 0x62, 0xbf, 0xe7, 0xa7, 0x78, 0x3e, 0x6a, 0x88, 0xa2, 0x3e, 0x19, 0xaa, 0x6a, 0xbf, 0xc4, 0xd1, 0x45, 0xbe, 0xda, 0x75, 0xb7, 0x3e, +0x20, 0xd4, 0x69, 0xbf, 0x87, 0xfd, 0xde, 0xbd, 0x27, 0x87, 0x8f, 0x3e, 0x46, 0x26, 0x74, 0xbf, 0x90, 0x13, 0x9e, 0x3e, 0x25, 0x3e, 0xaf, 0x3e, 0x7b, 0x2e, 0x63, 0xbf, 0x9a, 0xeb, 0xcc, 0x3e, 0xa3, 0x92, 0xc2, 0x3e, 0x9a, 0x7a, 0x55, 0xbf, 0xc5, 0xc7, 0xdf, 0x3e, 0x98, 0x88, 0xb7, 0x3e, 0x1b, 0x2d, 0x53, 0xbf, 0xda, 0x1e, 0x9d, 0x3e, 0x1a, 0xc2, 0xb9, 0x3e, 0x25, 0x40, 0x61, 0xbf, 0x12, 0x17, 0x80, 0xbd, 0x51, 0x4c, 0x4e, 0x3e, 0x3e, 0x3d, 0x7a, 0xbf, 0x9e, 0xb0, 0x44, 0xbd, +0xe4, 0xf2, 0x9f, 0x3d, 0xf6, 0xeb, 0x7e, 0xbf, 0x9d, 0xa1, 0x88, 0x3e, 0xde, 0x55, 0xa7, 0x3e, 0xa4, 0x18, 0x68, 0xbf, 0x4a, 0x45, 0xb3, 0x3e, 0x2d, 0x5c, 0x8e, 0x3e, 0x93, 0xfc, 0x64, 0xbf, 0x79, 0xb0, 0xb5, 0x3e, 0x30, 0xd4, 0xb1, 0x3e, 0xd6, 0x35, 0x5e, 0xbf, 0x97, 0xc7, 0x82, 0x3e, 0xc9, 0x39, 0x61, 0x3e, 0xa3, 0x04, 0x71, 0xbf, 0xfc, 0x6c, 0xe4, 0xbb, 0xc7, 0xd6, 0xb3, 0xbd, 0x43, 0x01, 0x7f, 0xbf, 0xeb, 0x18, 0xf7, 0x3d, 0x5d, 0x37, 0x95, 0xbe, 0x63, 0xee, 0x72, 0xbf, +0x33, 0xfd, 0xa2, 0x3e, 0xd8, 0x7c, 0x9c, 0x3d, 0x82, 0xe4, 0x71, 0xbf, 0x14, 0xb0, 0xe5, 0x3e, 0x6a, 0x4f, 0x39, 0x3e, 0x17, 0x0e, 0x60, 0xbf, 0x2f, 0x4e, 0xcc, 0x3e, 0x55, 0x15, 0x5a, 0x3e, 0xef, 0x50, 0x64, 0xbf, 0x24, 0x63, 0xdd, 0x3e, 0xef, 0xc4, 0xac, 0xbc, 0x93, 0xc4, 0x66, 0xbf, 0x8a, 0x74, 0xaf, 0x3e, 0xa4, 0x6f, 0xea, 0xbe, 0xe7, 0xff, 0x51, 0xbf, 0x40, 0x14, 0x14, 0x3f, 0x8b, 0x89, 0xfd, 0xbe, 0x56, 0xf2, 0x25, 0xbf, 0x3b, 0xc4, 0x97, 0x3e, 0x6c, 0x06, 0x38, 0xba, +0xae, 0x7e, 0x74, 0xbf, 0x3b, 0xc4, 0x97, 0x3e, 0x6c, 0x06, 0x38, 0xba, 0xae, 0x7e, 0x74, 0xbf, 0xdf, 0xa9, 0x30, 0x3e, 0x7a, 0xa9, 0x58, 0x3d, 0x29, 0xcc, 0x7b, 0xbf, 0xdf, 0xa9, 0x30, 0x3e, 0x7a, 0xa9, 0x58, 0x3d, 0x29, 0xcc, 0x7b, 0xbf, 0x24, 0x64, 0x20, 0x3d, 0xd0, 0x28, 0xa5, 0x3e, 0x8f, 0x1b, 0x72, 0xbf, 0x24, 0x64, 0x20, 0x3d, 0xd0, 0x28, 0xa5, 0x3e, 0x8f, 0x1b, 0x72, 0xbf, 0x23, 0xa0, 0x42, 0x3d, 0xec, 0xbc, 0xdd, 0x3e, 0x05, 0x6d, 0x66, 0xbf, 0x23, 0xa0, 0x42, 0x3d, +0xec, 0xbc, 0xdd, 0x3e, 0x05, 0x6d, 0x66, 0xbf, 0xa0, 0xdc, 0x96, 0x3d, 0x48, 0xa8, 0xf9, 0x3d, 0xdc, 0x63, 0x7d, 0xbf, 0xa0, 0xdc, 0x96, 0x3d, 0x48, 0xa8, 0xf9, 0x3d, 0xdc, 0x63, 0x7d, 0xbf, 0xed, 0x0e, 0xa9, 0x3c, 0x47, 0x3c, 0x59, 0x3e, 0x0c, 0x1e, 0x7a, 0xbf, 0xed, 0x0e, 0xa9, 0x3c, 0x47, 0x3c, 0x59, 0x3e, 0x0c, 0x1e, 0x7a, 0xbf, 0x9b, 0x1d, 0xd9, 0x3e, 0xb6, 0x81, 0xbb, 0xbd, 0xbd, 0xa7, 0x66, 0xbf, 0x9b, 0x1d, 0xd9, 0x3e, 0xb6, 0x81, 0xbb, 0xbd, 0xbd, 0xa7, 0x66, 0xbf, +0x5b, 0xec, 0xb6, 0x3e, 0x93, 0x18, 0x04, 0xbd, 0x30, 0xf6, 0x6e, 0xbf, 0x5b, 0xec, 0xb6, 0x3e, 0x93, 0x18, 0x04, 0xbd, 0x30, 0xf6, 0x6e, 0xbf, 0xa8, 0x35, 0x4d, 0x3c, 0xec, 0xc1, 0x08, 0x3f, 0xf5, 0x62, 0x58, 0xbf, 0xa8, 0x35, 0x4d, 0x3c, 0xec, 0xc1, 0x08, 0x3f, 0xf5, 0x62, 0x58, 0xbf, 0x54, 0x51, 0x3c, 0xbc, 0x81, 0x04, 0x35, 0x3f, 0x54, 0xff, 0x34, 0xbf, 0x54, 0x51, 0x3c, 0xbc, 0x81, 0x04, 0x35, 0x3f, 0x54, 0xff, 0x34, 0xbf, 0x77, 0xf7, 0x18, 0x3f, 0xae, 0x2b, 0x06, 0xbe, +0xb2, 0x83, 0x4a, 0xbf, 0x77, 0xf7, 0x18, 0x3f, 0xae, 0x2b, 0x06, 0xbe, 0xb2, 0x83, 0x4a, 0xbf, 0xd0, 0x7d, 0x01, 0x3f, 0xdd, 0x24, 0x16, 0xbe, 0x0a, 0x9f, 0x59, 0xbf, 0xd0, 0x7d, 0x01, 0x3f, 0xdd, 0x24, 0x16, 0xbe, 0x0a, 0x9f, 0x59, 0xbf, 0xc0, 0x76, 0x30, 0x3d, 0xc1, 0xc6, 0x55, 0x3f, 0x12, 0x68, 0x0c, 0xbf, 0xc0, 0x76, 0x30, 0x3d, 0xc1, 0xc6, 0x55, 0x3f, 0x12, 0x68, 0x0c, 0xbf, 0x3e, 0x7b, 0x6e, 0x3e, 0x56, 0x80, 0x57, 0x3f, 0x15, 0x53, 0xf9, 0xbe, 0x3e, 0x7b, 0x6e, 0x3e, +0x56, 0x80, 0x57, 0x3f, 0x15, 0x53, 0xf9, 0xbe, 0xd0, 0x43, 0x31, 0x3f, 0x58, 0x1a, 0x58, 0x3e, 0x88, 0x9e, 0x30, 0xbf, 0xd0, 0x43, 0x31, 0x3f, 0x58, 0x1a, 0x58, 0x3e, 0x88, 0x9e, 0x30, 0xbf, 0x59, 0x87, 0x2b, 0x3f, 0x46, 0x5b, 0x15, 0xbb, 0x24, 0x09, 0x3e, 0xbf, 0x59, 0x87, 0x2b, 0x3f, 0x46, 0x5b, 0x15, 0xbb, 0x24, 0x09, 0x3e, 0xbf, 0xd3, 0x83, 0xca, 0x3e, 0x38, 0x2c, 0x49, 0x3f, 0xba, 0x69, 0xf3, 0xbe, 0xd3, 0x83, 0xca, 0x3e, 0x38, 0x2c, 0x49, 0x3f, 0xba, 0x69, 0xf3, 0xbe, +0x18, 0xec, 0x02, 0x3f, 0xc8, 0xcd, 0x30, 0x3f, 0x4f, 0xe7, 0x02, 0xbf, 0x18, 0xec, 0x02, 0x3f, 0xc8, 0xcd, 0x30, 0x3f, 0x4f, 0xe7, 0x02, 0xbf, 0x83, 0xde, 0x1b, 0x3f, 0x19, 0xac, 0x0c, 0x3f, 0x2d, 0x77, 0x12, 0xbf, 0x83, 0xde, 0x1b, 0x3f, 0x19, 0xac, 0x0c, 0x3f, 0x2d, 0x77, 0x12, 0xbf, 0x81, 0x77, 0x2a, 0x3f, 0x88, 0x2f, 0xd3, 0x3e, 0x3e, 0x25, 0x1f, 0xbf, 0x81, 0x77, 0x2a, 0x3f, 0x88, 0x2f, 0xd3, 0x3e, 0x3e, 0x25, 0x1f, 0xbf, 0x55, 0x12, 0x89, 0x3e, 0x37, 0x88, 0x66, 0x3f, +0xb9, 0x6d, 0xaf, 0x3e, 0x55, 0x12, 0x89, 0x3e, 0x37, 0x88, 0x66, 0x3f, 0xb9, 0x6d, 0xaf, 0x3e, 0x9b, 0x75, 0xde, 0x3e, 0xd2, 0x6f, 0x43, 0x3f, 0xe2, 0xb0, 0xf4, 0x3e, 0x9b, 0x75, 0xde, 0x3e, 0xd2, 0x6f, 0x43, 0x3f, 0xe2, 0xb0, 0xf4, 0x3e, 0x8d, 0xb2, 0x5e, 0x3f, 0x3d, 0xee, 0x9b, 0x3d, 0x99, 0x7e, 0xf9, 0x3e, 0x8d, 0xb2, 0x5e, 0x3f, 0x3d, 0xee, 0x9b, 0x3d, 0x99, 0x7e, 0xf9, 0x3e, 0xb6, 0xa1, 0x6e, 0x3f, 0x05, 0x32, 0x6b, 0xbe, 0x90, 0x4c, 0x8f, 0x3e, 0xb6, 0xa1, 0x6e, 0x3f, +0x05, 0x32, 0x6b, 0xbe, 0x90, 0x4c, 0x8f, 0x3e, 0xd2, 0x55, 0x1a, 0x3f, 0x01, 0xdf, 0x09, 0x3f, 0x3e, 0xb1, 0x16, 0x3f, 0xd2, 0x55, 0x1a, 0x3f, 0x01, 0xdf, 0x09, 0x3f, 0x3e, 0xb1, 0x16, 0x3f, 0x5b, 0x95, 0x40, 0x3f, 0x8c, 0x66, 0xa5, 0x3e, 0x5c, 0xff, 0x12, 0x3f, 0x5b, 0x95, 0x40, 0x3f, 0x8c, 0x66, 0xa5, 0x3e, 0x5c, 0xff, 0x12, 0x3f, 0xd5, 0xcc, 0x5a, 0xbe, 0xa6, 0x64, 0x79, 0x3f, 0x64, 0x07, 0x95, 0x3d, 0xd5, 0xcc, 0x5a, 0xbe, 0xa6, 0x64, 0x79, 0x3f, 0x64, 0x07, 0x95, 0x3d, +0x7c, 0xd4, 0x1f, 0x3d, 0x33, 0x1a, 0x79, 0x3f, 0x64, 0xb2, 0x68, 0x3e, 0x7c, 0xd4, 0x1f, 0x3d, 0x33, 0x1a, 0x79, 0x3f, 0x64, 0xb2, 0x68, 0x3e, 0x2e, 0x1d, 0x57, 0x3f, 0xb1, 0x4d, 0x0a, 0xbf, 0x3d, 0x46, 0x39, 0x3d, 0x2e, 0x1d, 0x57, 0x3f, 0xb1, 0x4d, 0x0a, 0xbf, 0x3d, 0x46, 0x39, 0x3d, 0x6d, 0x58, 0x1b, 0x3f, 0x3e, 0x92, 0x46, 0xbf, 0x3a, 0xaf, 0x31, 0xbe, 0x6d, 0x58, 0x1b, 0x3f, 0x3e, 0x92, 0x46, 0xbf, 0x3a, 0xaf, 0x31, 0xbe, 0x8c, 0xd9, 0x12, 0xbf, 0xb7, 0x0a, 0x26, 0x3f, +0x2c, 0x11, 0x00, 0xbf, 0x8c, 0xd9, 0x12, 0xbf, 0xb7, 0x0a, 0x26, 0x3f, 0x2c, 0x11, 0x00, 0xbf, 0xdd, 0x08, 0xeb, 0xbe, 0x8f, 0xab, 0x5d, 0x3f, 0x85, 0x7d, 0x4b, 0xbe, 0xdd, 0x08, 0xeb, 0xbe, 0x8f, 0xab, 0x5d, 0x3f, 0x85, 0x7d, 0x4b, 0xbe, 0x3e, 0x92, 0xb2, 0x3e, 0x2c, 0x66, 0x58, 0xbf, 0x8f, 0x39, 0xcf, 0xbe, 0x3e, 0x92, 0xb2, 0x3e, 0x2c, 0x66, 0x58, 0xbf, 0x8f, 0x39, 0xcf, 0xbe, 0x8b, 0xa9, 0x34, 0x3d, 0x2c, 0x2d, 0x3b, 0xbf, 0xaa, 0x47, 0x2e, 0xbf, 0x8b, 0xa9, 0x34, 0x3d, +0x2c, 0x2d, 0x3b, 0xbf, 0xaa, 0x47, 0x2e, 0xbf, 0x4a, 0xd1, 0x06, 0xbf, 0x8d, 0x97, 0x86, 0x3e, 0x34, 0xf5, 0x4e, 0xbf, 0x4a, 0xd1, 0x06, 0xbf, 0x8d, 0x97, 0x86, 0x3e, 0x34, 0xf5, 0x4e, 0xbf, 0xcd, 0x94, 0x12, 0xbf, 0x6a, 0xc1, 0xe3, 0x3e, 0xe0, 0x4c, 0x30, 0xbf, 0xcd, 0x94, 0x12, 0xbf, 0x6a, 0xc1, 0xe3, 0x3e, 0xe0, 0x4c, 0x30, 0xbf, 0xbf, 0xef, 0x2f, 0xbe, 0x61, 0xc0, 0xfa, 0xbe, 0x03, 0xd2, 0x5a, 0xbf, 0xbf, 0xef, 0x2f, 0xbe, 0x61, 0xc0, 0xfa, 0xbe, 0x03, 0xd2, 0x5a, 0xbf, +0xc4, 0xaf, 0x98, 0xbe, 0xbd, 0xfc, 0x96, 0xbe, 0xa5, 0x65, 0x68, 0xbf, 0xc4, 0xaf, 0x98, 0xbe, 0xbd, 0xfc, 0x96, 0xbe, 0xa5, 0x65, 0x68, 0xbf, 0x0c, 0x93, 0xc1, 0xbe, 0x37, 0xde, 0xbd, 0xbd, 0x96, 0xce, 0x6b, 0xbf, 0x0c, 0x93, 0xc1, 0xbe, 0x37, 0xde, 0xbd, 0xbd, 0x96, 0xce, 0x6b, 0xbf, 0x16, 0xf6, 0xe4, 0xbe, 0xf9, 0x2e, 0xc5, 0x3d, 0x5d, 0xa5, 0x63, 0xbf, 0x16, 0xf6, 0xe4, 0xbe, 0xf9, 0x2e, 0xc5, 0x3d, 0x5d, 0xa5, 0x63, 0xbf, 0x26, 0xc8, 0x1c, 0x3f, 0xfb, 0xca, 0x53, 0x3e, +0x3f, 0x53, 0x43, 0xbf, 0x8a, 0x05, 0xee, 0x3e, 0xe1, 0x5d, 0x7e, 0x3e, 0x15, 0x8d, 0x59, 0xbf, 0xa6, 0x97, 0xd0, 0x3e, 0xd7, 0x33, 0xb4, 0x3e, 0x41, 0xbb, 0x57, 0xbf, 0x3d, 0xf0, 0x25, 0x3f, 0xe0, 0x2a, 0xb7, 0x3e, 0x6e, 0x15, 0x2c, 0xbf, 0x01, 0xf8, 0x2b, 0x3f, 0xf0, 0x15, 0x85, 0x3e, 0x9f, 0x94, 0x31, 0xbf, 0xd3, 0x84, 0x85, 0x3e, 0x3e, 0x7a, 0xe3, 0x3e, 0x1e, 0x6a, 0x5b, 0xbf, 0x3f, 0x56, 0x88, 0x3e, 0x57, 0xd1, 0xb7, 0x3e, 0x71, 0x00, 0x65, 0xbf, 0x55, 0x4c, 0x75, 0x3e, +0x81, 0x94, 0x90, 0x3e, 0x1c, 0xcd, 0x6d, 0xbf, 0xcb, 0x82, 0xe9, 0x3e, 0xd8, 0x0d, 0x0b, 0x3f, 0x68, 0x77, 0x34, 0xbf, 0xa5, 0x4e, 0xf8, 0x3e, 0x18, 0x5a, 0xfd, 0x3e, 0x2d, 0x98, 0x38, 0xbf, 0x93, 0xff, 0x05, 0x3f, 0x8b, 0xc5, 0xe7, 0x3e, 0xbc, 0xcc, 0x38, 0xbf, 0x6c, 0x23, 0x1e, 0x3e, 0x37, 0x8c, 0xca, 0x3e, 0xb1, 0xc4, 0x67, 0xbf, 0x36, 0x1f, 0x37, 0x3e, 0x11, 0x35, 0x01, 0x3f, 0x15, 0x35, 0x58, 0xbf, 0xbb, 0x45, 0x88, 0x3e, 0xd2, 0x56, 0x11, 0x3f, 0x9c, 0x6c, 0x47, 0xbf, +0x45, 0xf2, 0x45, 0x3e, 0xed, 0x9d, 0x99, 0x3e, 0xab, 0x23, 0x6f, 0xbf, 0xbc, 0xe5, 0xda, 0x3e, 0x12, 0xf7, 0xe0, 0x3e, 0xbc, 0x3f, 0x4a, 0xbf, 0x66, 0x86, 0x9d, 0x3e, 0x7b, 0xa0, 0xed, 0x3e, 0xe8, 0xa3, 0x54, 0xbf, 0x83, 0x6b, 0xee, 0x3e, 0x64, 0x91, 0xd6, 0x3e, 0x83, 0x89, 0x47, 0xbf, 0xd1, 0x04, 0x16, 0x3f, 0x19, 0x3a, 0xd6, 0x3e, 0xad, 0xa4, 0x31, 0xbf, 0xfd, 0xdc, 0xc0, 0x3e, 0xaf, 0x0b, 0x13, 0x3f, 0xbf, 0x0c, 0x3a, 0xbf, 0xb8, 0x58, 0x39, 0x3f, 0x51, 0xf5, 0x2b, 0x3e, +0xf1, 0x45, 0x2b, 0xbf, 0x78, 0x7e, 0x1d, 0x3f, 0x16, 0xbd, 0x13, 0x3e, 0x8c, 0x69, 0x46, 0xbf, 0x56, 0xd7, 0x09, 0x3f, 0x2a, 0x1e, 0x47, 0x3e, 0x47, 0xe6, 0x51, 0xbf, 0x1f, 0xda, 0x43, 0x3f, 0x28, 0xee, 0x80, 0x3e, 0x0e, 0xbb, 0x17, 0xbf, 0xf4, 0x88, 0x41, 0x3f, 0xce, 0x8e, 0xb4, 0x3e, 0x5a, 0x2c, 0x0d, 0xbf, 0xd0, 0x9c, 0xd5, 0x3d, 0xf1, 0xf6, 0x80, 0x3e, 0x7f, 0x4d, 0x76, 0xbf, 0x18, 0x3f, 0xad, 0x3d, 0xa1, 0xd7, 0x87, 0x3e, 0x98, 0xdf, 0x75, 0xbf, 0x4e, 0x44, 0xbf, 0x3b, +0x86, 0x59, 0x90, 0x3e, 0x49, 0x9c, 0x75, 0xbf, 0x6d, 0x91, 0x0c, 0x3f, 0x70, 0x40, 0x2f, 0x3f, 0x75, 0x77, 0xf5, 0xbe, 0x1f, 0x9f, 0xe0, 0x3e, 0xfd, 0x82, 0x45, 0x3f, 0x8a, 0xe4, 0xeb, 0xbe, 0xc7, 0x9c, 0x23, 0x3f, 0x99, 0x2d, 0x11, 0x3f, 0x3a, 0x01, 0x05, 0xbf, 0xd2, 0x50, 0x63, 0xbd, 0xd4, 0xb8, 0x37, 0x3f, 0x74, 0xb5, 0x31, 0xbf, 0x40, 0x6d, 0xf4, 0xbd, 0x1f, 0x4c, 0x12, 0x3f, 0x5a, 0xd8, 0x4f, 0xbf, 0x3f, 0x01, 0xb4, 0x3d, 0x0f, 0x0b, 0x4d, 0x3f, 0x4d, 0x9d, 0x17, 0xbf, +0x4f, 0x75, 0xa8, 0xbd, 0x84, 0x9b, 0xc4, 0x3e, 0xf8, 0x6e, 0x6b, 0xbf, 0x4b, 0x74, 0xbe, 0x3e, 0xc3, 0x81, 0x80, 0x3e, 0x19, 0xc7, 0x64, 0xbf, 0x8b, 0x35, 0x2c, 0x3e, 0x56, 0x28, 0x82, 0x3e, 0x67, 0xd1, 0x73, 0xbf, 0x91, 0x0d, 0x04, 0x3f, 0x22, 0xc3, 0x7a, 0x3e, 0x52, 0x29, 0x52, 0xbf, 0xfc, 0x34, 0x36, 0x3f, 0xd4, 0xba, 0xe5, 0x3e, 0x64, 0x5b, 0x0a, 0xbf, 0xa4, 0xab, 0x8c, 0x3e, 0xe7, 0x1b, 0x51, 0x3f, 0xf0, 0xda, 0x01, 0xbf, 0xec, 0x4c, 0x25, 0x3f, 0x4b, 0x57, 0x90, 0x3e, +0xf7, 0xaa, 0x35, 0xbf, 0x52, 0x0e, 0x0a, 0x3f, 0x35, 0xb4, 0x61, 0x3e, 0xa1, 0x11, 0x50, 0xbf, 0xa0, 0xde, 0x44, 0x3f, 0x82, 0xc5, 0xc9, 0x3e, 0xbf, 0xd7, 0x00, 0xbf, 0x39, 0x0c, 0x3a, 0x3f, 0x17, 0x62, 0xad, 0x3e, 0x26, 0xfe, 0x18, 0xbf, 0xc8, 0x22, 0x69, 0x3f, 0x55, 0xd9, 0x07, 0x3e, 0x34, 0x4d, 0xc8, 0x3e, 0xb8, 0xe5, 0x7f, 0x3f, 0xcd, 0xc8, 0xa0, 0x3c, 0x86, 0x56, 0xa7, 0x3c, 0x35, 0x41, 0x74, 0x3f, 0xb2, 0x0e, 0xc7, 0x3c, 0xde, 0xcc, 0x98, 0x3e, 0xd7, 0x33, 0xe4, 0x3e, +0x52, 0x0b, 0x65, 0x3f, 0x9f, 0xae, 0xee, 0xbc, 0x56, 0x46, 0x77, 0x3f, 0x8c, 0x67, 0xd0, 0x3b, 0x07, 0x7e, 0x84, 0xbe, 0x7d, 0x5c, 0x23, 0x3f, 0xa6, 0xf1, 0x3f, 0x3f, 0x01, 0x2f, 0x33, 0xbe, 0x13, 0xb5, 0x74, 0x3f, 0xbf, 0x63, 0x98, 0x3d, 0x1c, 0x7c, 0x91, 0xbe, 0xa1, 0x81, 0x10, 0x3f, 0xc4, 0x0a, 0x4f, 0x3f, 0x9b, 0x1d, 0x29, 0xbe, 0xca, 0x6d, 0x3f, 0x3f, 0x61, 0x8d, 0x23, 0xbf, 0xd2, 0x1c, 0x39, 0xbe, 0x42, 0x41, 0x55, 0x3f, 0x02, 0x0e, 0x0d, 0xbf, 0x2e, 0x91, 0x4b, 0xbd, +0xf8, 0x16, 0xfe, 0x3e, 0x51, 0xbe, 0x5c, 0xbf, 0xec, 0xbf, 0xce, 0xbd, 0x74, 0x7e, 0x8a, 0x3d, 0x75, 0x94, 0x43, 0x3f, 0x35, 0x45, 0x24, 0xbf, 0xb0, 0x55, 0x02, 0x3e, 0xdb, 0x4d, 0x20, 0x3f, 0x25, 0xeb, 0x44, 0xbf, 0x63, 0xec, 0x54, 0xbe, 0x11, 0x1e, 0x59, 0x3f, 0xc7, 0x7f, 0xf9, 0xbe, 0xea, 0x08, 0x60, 0xbe, 0x0c, 0x77, 0x3a, 0x3f, 0xda, 0x38, 0x26, 0xbf, 0xee, 0x3d, 0xf4, 0x3e, 0xbc, 0xcc, 0xd0, 0x3e, 0x87, 0x4e, 0x47, 0xbf, 0xee, 0x3d, 0xf4, 0x3e, 0xbc, 0xcc, 0xd0, 0x3e, +0x87, 0x4e, 0x47, 0xbf, 0x3b, 0x3a, 0xce, 0x3d, 0x6a, 0x17, 0x7b, 0xbf, 0x90, 0xdc, 0x2a, 0xbe, 0x6e, 0x2f, 0x89, 0x3d, 0x02, 0x2a, 0x7c, 0xbf, 0x73, 0xbc, 0x22, 0xbe, 0xef, 0xfd, 0x8d, 0x3c, 0x6a, 0x2e, 0x7b, 0xbf, 0xe5, 0xf1, 0x44, 0xbe, 0x6e, 0x2f, 0x89, 0x3d, 0x02, 0x2a, 0x7c, 0xbf, 0x73, 0xbc, 0x22, 0xbe, 0xd2, 0xc8, 0xe7, 0x3d, 0xbb, 0x43, 0x7a, 0xbf, 0x88, 0xbc, 0x35, 0xbe, 0xd2, 0xc8, 0xe7, 0x3d, 0xbb, 0x43, 0x7a, 0xbf, 0x88, 0xbc, 0x35, 0xbe, 0x7a, 0x72, 0x85, 0x3e, +0x8f, 0xab, 0x15, 0x3f, 0xef, 0xad, 0x44, 0xbf, 0x41, 0x9c, 0x87, 0x3c, 0x33, 0xa2, 0x2c, 0x3f, 0x61, 0xfc, 0x3c, 0xbf, 0x7a, 0x72, 0x85, 0x3e, 0x8f, 0xab, 0x15, 0x3f, 0xef, 0xad, 0x44, 0xbf, 0x52, 0xd4, 0xd9, 0xbd, 0x7a, 0x1a, 0x40, 0x3f, 0x75, 0x01, 0x27, 0xbf, 0x17, 0x9b, 0x56, 0xbd, 0xa7, 0x06, 0x56, 0x3f, 0x57, 0xd1, 0x0b, 0xbf, 0x52, 0xd4, 0xd9, 0xbd, 0x7a, 0x1a, 0x40, 0x3f, 0x75, 0x01, 0x27, 0xbf, 0xba, 0xdb, 0x95, 0x3d, 0xd7, 0x15, 0x53, 0x3f, 0xed, 0x9f, 0x0f, 0xbf, +0xda, 0x38, 0xe2, 0xbd, 0xe7, 0xc3, 0x2f, 0x3f, 0xe4, 0xf6, 0x37, 0xbf, 0x53, 0xb0, 0x56, 0xbe, 0xc9, 0x72, 0x4e, 0x3f, 0xeb, 0x8a, 0x0d, 0xbf, 0x6d, 0xe5, 0x8d, 0xbe, 0x36, 0x93, 0x3f, 0x3f, 0xe1, 0x46, 0x1a, 0xbf, 0xb5, 0xc0, 0x1e, 0xbe, 0x86, 0x3c, 0x3e, 0x3f, 0x72, 0xa5, 0x26, 0xbf, 0x7e, 0x36, 0x82, 0xbe, 0x9e, 0x79, 0x41, 0x3f, 0x4e, 0x7b, 0x1a, 0xbf, 0x10, 0x5a, 0xb7, 0xbe, 0x86, 0x8e, 0xbd, 0x3d, 0x41, 0xd8, 0x6d, 0xbf, 0xfb, 0x78, 0x80, 0xbe, 0x89, 0x60, 0x2c, 0x3f, +0x7d, 0x08, 0x32, 0xbf, 0xfb, 0x74, 0xbc, 0xbd, 0x73, 0xbb, 0xb7, 0x3d, 0x93, 0xe0, 0x7d, 0xbf, 0xdc, 0xbb, 0xe6, 0xbd, 0xf0, 0x69, 0x1a, 0x3f, 0xd1, 0x23, 0x4a, 0xbf, 0x04, 0x56, 0x1e, 0x3e, 0xa4, 0xc3, 0xc3, 0x3e, 0x82, 0x36, 0x69, 0xbf, 0xb0, 0x55, 0x52, 0x3e, 0x6b, 0xd3, 0xd8, 0xbc, 0x1d, 0x73, 0x7a, 0xbf, 0xfb, 0xb2, 0x94, 0xbd, 0xe8, 0xbe, 0xb4, 0xbe, 0xa7, 0xcb, 0x6e, 0xbf, 0x60, 0x59, 0xa1, 0xbe, 0xdd, 0x26, 0x04, 0xbf, 0x09, 0xdf, 0x4b, 0xbf, 0xb5, 0x1b, 0x0d, 0x3e, +0xe0, 0x45, 0x77, 0xbf, 0x2b, 0x6a, 0x60, 0xbe, 0xf8, 0x36, 0x1d, 0x3e, 0x45, 0xd7, 0x5d, 0xbf, 0xb8, 0x20, 0xf3, 0xbe, 0xde, 0x90, 0x16, 0xbe, 0xd5, 0xaf, 0x5c, 0xbf, 0x7e, 0x53, 0xf8, 0xbe, 0xdb, 0x32, 0x00, 0x3e, 0x88, 0xf5, 0x76, 0xbf, 0xf8, 0x51, 0x6d, 0xbe, 0xaa, 0x98, 0x6a, 0x3e, 0x82, 0x55, 0x51, 0xbf, 0xec, 0x2f, 0x07, 0xbf, 0xa9, 0x6c, 0x08, 0x3e, 0x6b, 0x9c, 0x79, 0xbf, 0xc6, 0xdc, 0x35, 0xbe, 0xe6, 0xcd, 0x61, 0x3d, 0xf4, 0x53, 0x7c, 0xbf, 0x54, 0x56, 0x23, 0xbe, +0x6a, 0x13, 0xa7, 0x3d, 0x35, 0x7f, 0x58, 0x3f, 0xaf, 0x03, 0x07, 0xbf, 0xfe, 0x63, 0xa1, 0x3d, 0x30, 0x10, 0x60, 0x3f, 0x43, 0x55, 0xf4, 0xbe, 0xf1, 0x80, 0x12, 0xbe, 0x45, 0x2b, 0x3b, 0x3f, 0x09, 0xc5, 0x2a, 0xbf, 0xbb, 0x2b, 0x0b, 0xbe, 0xee, 0x77, 0x48, 0x3f, 0x14, 0x5d, 0x1b, 0xbf, 0xa4, 0xfa, 0x26, 0x3f, 0x56, 0x7e, 0x09, 0xbe, 0x40, 0xfa, 0x3e, 0xbf, 0xd5, 0x7b, 0x3a, 0x3f, 0xf3, 0x3b, 0xad, 0xbd, 0xfa, 0x0a, 0x2e, 0xbf, 0x95, 0xd7, 0xfa, 0x3e, 0xaf, 0x95, 0xd8, 0xbe, +0x03, 0x23, 0x43, 0xbf, 0xf4, 0x36, 0x4a, 0x3f, 0x64, 0x79, 0x17, 0x3d, 0xd5, 0xb3, 0x1c, 0xbf, 0x0e, 0xdb, 0x02, 0x3f, 0x16, 0xdb, 0x18, 0xbf, 0xee, 0x43, 0x1e, 0xbf, 0xb5, 0xa9, 0x1a, 0x3f, 0x04, 0x74, 0x0f, 0x3e, 0x3d, 0xd2, 0x48, 0xbf, 0xcb, 0xb9, 0xd4, 0x3e, 0x83, 0x8a, 0xe2, 0xbe, 0xc1, 0x73, 0x4b, 0xbf, 0xfc, 0xaa, 0x5c, 0x3d, 0x5a, 0x81, 0x6d, 0xbf, 0x66, 0x12, 0xbd, 0xbe, 0x47, 0xe4, 0x1b, 0x3e, 0xeb, 0xe5, 0x4b, 0xbf, 0x03, 0xcf, 0x15, 0xbf, 0xe4, 0xdc, 0x6a, 0x3f, +0x76, 0xdb, 0x85, 0xbc, 0x33, 0x8c, 0xcb, 0xbe, 0x97, 0x6e, 0x1a, 0x3f, 0x4d, 0xf7, 0x32, 0xbf, 0xd6, 0x8c, 0xc4, 0xbe, 0xd9, 0x7b, 0xf1, 0x3c, 0x71, 0xe3, 0x7a, 0xbf, 0xbc, 0x5b, 0x49, 0xbe, 0xf3, 0xcb, 0x40, 0x3e, 0x65, 0xfb, 0x5c, 0x3f, 0xe1, 0xd4, 0xef, 0xbe, 0xf7, 0x20, 0x3c, 0x3f, 0xf0, 0x19, 0xb9, 0x3e, 0xf3, 0xe4, 0x12, 0xbf, 0x38, 0xbb, 0x35, 0x3c, 0xab, 0xe9, 0x36, 0x3f, 0x51, 0x15, 0x33, 0xbf, 0x92, 0x23, 0x25, 0x3f, 0x26, 0x52, 0x6a, 0x3e, 0x27, 0xa3, 0x3a, 0xbf, +0xb0, 0x3d, 0x07, 0x3f, 0xfc, 0xa5, 0x05, 0x3d, 0x5d, 0x33, 0x59, 0xbf, 0xe8, 0xc1, 0xfd, 0xbd, 0x57, 0xce, 0x06, 0x3f, 0xa9, 0x4e, 0x57, 0xbf, 0xc7, 0x80, 0x0c, 0x3f, 0x2e, 0x1e, 0x2e, 0xbf, 0xfa, 0xd1, 0xf8, 0x3e, 0x8a, 0x56, 0x32, 0x3f, 0x63, 0x41, 0x09, 0xbf, 0xc3, 0x11, 0xf4, 0x3e, 0x62, 0x83, 0x35, 0x3f, 0x44, 0xdb, 0x2d, 0xbf, 0x2a, 0x70, 0x42, 0x3e, 0xdf, 0xe0, 0x6f, 0x3f, 0xa5, 0x87, 0x11, 0x3e, 0x58, 0x59, 0xa3, 0x3e, 0x10, 0x3c, 0x62, 0x3f, 0xb6, 0x2f, 0xc8, 0xbe, +0x96, 0xaf, 0x83, 0x3e, 0x5b, 0x98, 0x45, 0x3f, 0x63, 0x0d, 0x1f, 0x3f, 0x03, 0x3f, 0x0a, 0xbe, 0xb5, 0x6c, 0x4d, 0x3f, 0xf1, 0x11, 0x15, 0xbf, 0xa8, 0x8e, 0x05, 0xbe, 0x8f, 0x8d, 0xb8, 0x3e, 0x64, 0x91, 0x6e, 0x3f, 0x08, 0x05, 0x25, 0x3d, 0x29, 0xb4, 0x7c, 0x3e, 0x28, 0x0e, 0x78, 0x3f, 0xf8, 0xa6, 0x69, 0x3c, 0xc0, 0x73, 0x4f, 0x3e, 0x25, 0x75, 0x7a, 0x3f, 0xbf, 0x2c, 0x2d, 0x3d, 0x6b, 0x44, 0x98, 0x3e, 0x90, 0x6a, 0x74, 0x3f, 0x46, 0x5b, 0x15, 0x3b, 0xdf, 0x31, 0x4c, 0x3e, +0x51, 0xdb, 0x7a, 0x3f, 0x47, 0xaa, 0x6f, 0x3b, 0x65, 0x00, 0x98, 0x3e, 0x7c, 0x0e, 0x74, 0x3f, 0xa9, 0x2e, 0x60, 0xbd, 0x15, 0x38, 0x99, 0xbe, 0xa8, 0x19, 0x36, 0x3f, 0xdd, 0xce, 0x22, 0xbf, 0xe8, 0x83, 0xe5, 0xbe, 0xba, 0x13, 0x40, 0x3f, 0x04, 0xc8, 0xf8, 0xbe, 0x7d, 0x5d, 0xe6, 0xbe, 0xaf, 0x79, 0x29, 0x3f, 0x64, 0x73, 0x19, 0xbf, 0x30, 0xb8, 0x1a, 0xbf, 0x65, 0xe1, 0x33, 0x3f, 0x53, 0x42, 0xc0, 0xbe, 0x6a, 0x2e, 0x0b, 0x3f, 0x7d, 0x78, 0x56, 0xbf, 0x25, 0xaf, 0x4e, 0xbd, +0xdd, 0x24, 0xd6, 0x3e, 0xf0, 0x86, 0x68, 0xbf, 0x91, 0x5e, 0xd4, 0x3b, 0x66, 0x69, 0x03, 0x3f, 0xa1, 0x64, 0x56, 0xbf, 0x89, 0xf0, 0x3f, 0x3e, 0x79, 0x90, 0x06, 0x3f, 0xdb, 0xf8, 0x53, 0xbf, 0xdc, 0xd9, 0x47, 0x3e, 0xea, 0xe7, 0x21, 0x3f, 0x60, 0xaf, 0x30, 0xbf, 0xd4, 0x0d, 0xb4, 0x3e, 0xa4, 0x1c, 0x10, 0x3f, 0x7e, 0x37, 0x39, 0xbf, 0x9b, 0x92, 0xcc, 0x3e, 0xd5, 0xb1, 0x8a, 0x3e, 0x58, 0x58, 0x5c, 0xbf, 0x64, 0xae, 0xdc, 0xbe, 0xfd, 0xa0, 0xee, 0x3e, 0x7e, 0xc5, 0x42, 0xbf, +0xd7, 0x34, 0xe7, 0xbe, 0xa2, 0x96, 0x4e, 0x3f, 0x5a, 0x84, 0xc2, 0x3e, 0xd0, 0x7f, 0xe7, 0xbe, 0x4e, 0x2b, 0x49, 0x3f, 0xc1, 0xc7, 0xf0, 0xbe, 0xe7, 0xa6, 0xcd, 0xbe, 0x07, 0x9a, 0x9f, 0x3e, 0x70, 0xee, 0xcf, 0xbe, 0x25, 0xe8, 0x5b, 0xbf, 0xb6, 0x10, 0xa4, 0x3d, 0x9d, 0xf3, 0xf3, 0xbe, 0xff, 0x22, 0x60, 0xbf, 0x0c, 0x05, 0xfc, 0x3e, 0xb6, 0x84, 0x48, 0xbf, 0xb5, 0x6b, 0xc2, 0x3e, 0x26, 0x6f, 0x10, 0x3f, 0xba, 0x66, 0x42, 0xbf, 0x4a, 0xed, 0xa5, 0x3e, 0x7e, 0x8c, 0x1d, 0x3f, +0x69, 0x55, 0x3f, 0xbf, 0xee, 0x26, 0x80, 0x3e, 0x74, 0x3f, 0xef, 0x3e, 0x5f, 0x7c, 0x61, 0xbf, 0x73, 0x69, 0x9c, 0xbd, 0x45, 0xd8, 0xd8, 0x3e, 0x30, 0xb7, 0x67, 0xbf, 0x96, 0x7a, 0x16, 0xbd, 0xbd, 0xc6, 0xc6, 0x3e, 0x77, 0xd9, 0x6b, 0xbf, 0xfe, 0xd1, 0xb7, 0xbc, 0x8d, 0x5f, 0x24, 0xbf, 0xb2, 0x9d, 0x2b, 0x3f, 0xb1, 0x6c, 0xbe, 0xbe, 0x69, 0xfc, 0x06, 0xbf, 0x4a, 0x97, 0x22, 0x3f, 0xe1, 0x7e, 0x10, 0xbf, 0x1a, 0x6b, 0x23, 0xbf, 0xac, 0xe4, 0x2b, 0x3f, 0xea, 0xb2, 0xc0, 0xbe, +0xc4, 0x03, 0x0a, 0xbf, 0xa6, 0xf1, 0x1b, 0x3f, 0xeb, 0xe4, 0x14, 0xbf, 0x54, 0xab, 0xff, 0xbe, 0xb0, 0x57, 0x2c, 0x3f, 0x6f, 0x9d, 0x0b, 0xbf, 0xe7, 0xe3, 0x1e, 0xbf, 0x18, 0x7c, 0x2e, 0x3f, 0x8a, 0x71, 0xc6, 0xbe, 0x7a, 0x72, 0x39, 0x3f, 0xf5, 0xd9, 0x2d, 0xbf, 0xea, 0xcb, 0xf2, 0xbd, 0xf8, 0xfe, 0x4e, 0x3f, 0xa3, 0x74, 0x11, 0xbf, 0xdb, 0x87, 0x1c, 0xbe, 0x66, 0x13, 0x38, 0x3f, 0x8c, 0xbf, 0x31, 0xbf, 0xf9, 0xd7, 0xf2, 0x3c, 0x46, 0x42, 0x43, 0x3f, 0x89, 0x40, 0x25, 0xbf, +0x8e, 0x5a, 0x21, 0x3d, 0xfb, 0x3e, 0x34, 0x3f, 0x5e, 0xbd, 0x2a, 0xbf, 0x72, 0xa6, 0x79, 0x3e, 0xc4, 0x3d, 0x2e, 0x3f, 0xaf, 0x5f, 0x2c, 0xbf, 0xc3, 0xd3, 0x93, 0x3e, 0x20, 0xec, 0x2c, 0x3f, 0x6c, 0x26, 0x2b, 0xbf, 0x70, 0x44, 0x9f, 0x3e, 0xef, 0x54, 0x30, 0x3f, 0x00, 0xc5, 0x38, 0xbf, 0xd6, 0x53, 0x8b, 0x3d, 0x90, 0xbe, 0x2d, 0x3f, 0x7a, 0xde, 0x39, 0xbf, 0x1b, 0x7f, 0xe2, 0xbd, 0x0c, 0x40, 0x17, 0x3f, 0xa7, 0xcd, 0x28, 0xbf, 0x29, 0x08, 0xee, 0xbe, 0xce, 0x33, 0xa6, 0x3e, +0x1b, 0x9d, 0xab, 0xbe, 0x4c, 0x6c, 0x62, 0xbf, 0x19, 0x71, 0x2d, 0x3f, 0xab, 0xb4, 0x15, 0xbf, 0x9d, 0x67, 0xe4, 0xbe, 0x3e, 0x5b, 0xc7, 0x3e, 0x46, 0x43, 0x46, 0xbe, 0x5d, 0x87, 0x66, 0xbf, 0x66, 0xd9, 0x4f, 0x3f, 0x08, 0xaa, 0xce, 0xbe, 0xe1, 0xef, 0xd7, 0xbe, 0xe5, 0xee, 0x33, 0xbf, 0xa6, 0x97, 0x34, 0x3f, 0x5c, 0x03, 0xbb, 0xbd, 0x30, 0xf6, 0x32, 0xbf, 0x20, 0x7f, 0x31, 0x3f, 0x67, 0x0c, 0x33, 0x3e, 0x71, 0x73, 0x32, 0xbf, 0xb1, 0x32, 0x36, 0x3f, 0x1d, 0x03, 0xb2, 0xbd, +0x10, 0xea, 0x32, 0xbf, 0x3b, 0xe1, 0x31, 0x3f, 0x05, 0xa4, 0x2d, 0x3e, 0x7a, 0x34, 0x21, 0xbf, 0x44, 0xdf, 0x45, 0x3f, 0x69, 0x1b, 0x9f, 0x3d, 0x86, 0x58, 0x21, 0xbf, 0x83, 0xfb, 0x41, 0x3f, 0x7c, 0x2c, 0x2d, 0xbe, 0xe1, 0x5d, 0x2a, 0x3f, 0x69, 0xe4, 0x37, 0xbf, 0x4c, 0xa5, 0x4f, 0x3e, 0xbd, 0x36, 0x23, 0x3f, 0x3a, 0x01, 0x3d, 0xbf, 0x7d, 0x5e, 0x61, 0x3e, 0x7c, 0x80, 0x26, 0x3f, 0x20, 0xeb, 0x3d, 0xbf, 0x56, 0x0c, 0x27, 0x3e, 0x29, 0xb2, 0x1e, 0x3f, 0x0a, 0xf2, 0x47, 0xbf, +0x4f, 0x96, 0x9a, 0xbd, 0x2f, 0x34, 0x1f, 0x3f, 0x8f, 0xa7, 0x45, 0xbf, 0x57, 0x09, 0x06, 0xbe, 0x43, 0x91, 0x1e, 0x3f, 0xf6, 0x7d, 0x44, 0xbf, 0x03, 0xeb, 0x28, 0xbe, 0xa1, 0x67, 0xdb, 0xbe, 0xcf, 0xf8, 0x4e, 0x3f, 0x59, 0x88, 0xce, 0xbe, 0xbb, 0x45, 0xb0, 0xbe, 0x91, 0x28, 0x6c, 0x3f, 0xf4, 0xc1, 0x32, 0xbe, 0x3f, 0xc8, 0x56, 0x3f, 0xc5, 0xe3, 0xea, 0xbe, 0x5f, 0xd1, 0x95, 0xbe, 0x3f, 0xe6, 0x37, 0x3f, 0x72, 0xc0, 0x2e, 0xbf, 0xb4, 0x55, 0x09, 0xbe, 0xbe, 0x83, 0x57, 0x3f, +0x3f, 0xc5, 0xf9, 0xbe, 0x66, 0x68, 0x6c, 0xbe, 0x61, 0x18, 0x40, 0x3f, 0xd8, 0x2a, 0x29, 0xbf, 0xff, 0xe9, 0x86, 0xbc, 0x0c, 0xb0, 0x8f, 0xbb, 0xd4, 0x0a, 0x7b, 0xbf, 0x52, 0x80, 0x48, 0xbe, 0x1a, 0xfa, 0xe7, 0x3d, 0xc8, 0x96, 0x4d, 0xbf, 0xc2, 0xc2, 0x15, 0xbf, 0x0d, 0x70, 0x11, 0xbe, 0x83, 0x6b, 0x7a, 0xbf, 0x19, 0x1e, 0x1b, 0xbe, 0xe1, 0xd4, 0x07, 0x3d, 0x64, 0x40, 0x4a, 0xbf, 0xee, 0xb5, 0x1c, 0xbf, 0x16, 0xda, 0x91, 0x3e, 0xeb, 0xa9, 0x05, 0x3f, 0xab, 0xcb, 0x4d, 0xbf, +0x87, 0x89, 0x76, 0x3e, 0x8d, 0x9b, 0x3a, 0xbe, 0x0b, 0x0d, 0x74, 0xbf, 0xce, 0x35, 0xcc, 0x3e, 0x22, 0x17, 0x00, 0x3f, 0x5e, 0xbb, 0x44, 0xbf, 0xae, 0xf0, 0xa6, 0x3e, 0x0a, 0x86, 0x83, 0xbe, 0x57, 0xe7, 0x68, 0xbf, 0x0e, 0xbe, 0xd0, 0x3d, 0xd6, 0xe0, 0x7d, 0x3f, 0x7a, 0x35, 0xa0, 0xbd, 0x97, 0x58, 0xd9, 0x3d, 0xac, 0x1c, 0x7e, 0x3f, 0x5c, 0x02, 0x70, 0x3d, 0x5c, 0x1c, 0x25, 0x3e, 0x5f, 0xb0, 0x7b, 0x3f, 0x70, 0x24, 0xb0, 0x3d, 0xd8, 0x7f, 0x3d, 0x3e, 0xc1, 0x54, 0x7b, 0x3f, +0x63, 0x5f, 0x32, 0x3d, 0x99, 0x83, 0x50, 0x3e, 0x37, 0xe2, 0x79, 0x3f, 0x0a, 0x48, 0x9b, 0x3d, 0xb6, 0x47, 0x6f, 0xbd, 0xc4, 0x3e, 0x7d, 0xbf, 0xbc, 0x5b, 0x09, 0xbe, 0xcb, 0x9d, 0x39, 0xbe, 0x82, 0xc8, 0x7a, 0xbf, 0xf6, 0x27, 0xb1, 0xbd, 0x55, 0x65, 0x3f, 0x3e, 0x8a, 0x55, 0x7b, 0x3f, 0xe4, 0xf9, 0x0c, 0x3d, 0xba, 0xbd, 0x24, 0x3e, 0x8a, 0x8e, 0x7c, 0x3f, 0x58, 0xe3, 0xec, 0x3c, 0x7c, 0xb4, 0x28, 0xbe, 0xd2, 0x72, 0x78, 0xbf, 0x60, 0x3f, 0x34, 0xbe, 0xaf, 0x93, 0x9a, 0x3d, +0xaf, 0x0a, 0x4c, 0xbf, 0xc7, 0x64, 0x19, 0xbf, 0x9d, 0x2c, 0xa5, 0x3e, 0x40, 0xde, 0x93, 0xbe, 0xf4, 0xc1, 0x66, 0xbf, 0x80, 0xd4, 0xd6, 0x3e, 0x99, 0x28, 0xaa, 0x3e, 0x47, 0x3d, 0x58, 0xbf, 0x3f, 0x1f, 0xad, 0x3e, 0xc8, 0x0c, 0x70, 0x3f, 0x81, 0xcb, 0xa3, 0xbd, 0xa6, 0x64, 0x99, 0x3e, 0x1d, 0x05, 0x74, 0x3f, 0xae, 0x2b, 0x26, 0xbd, 0x29, 0xcc, 0x6b, 0xbe, 0x45, 0x7f, 0x78, 0xbf, 0x33, 0xe0, 0x8c, 0xbd, 0xbf, 0x29, 0x8c, 0x3e, 0xc0, 0xed, 0x75, 0x3f, 0xcb, 0xba, 0x3f, 0xbd, +0x01, 0x33, 0xb7, 0xbe, 0x90, 0x69, 0x6d, 0x3f, 0x3b, 0x8e, 0xdf, 0xbd, 0xe3, 0x89, 0x14, 0xbf, 0x7f, 0xde, 0x48, 0x3f, 0x1d, 0x91, 0x5f, 0xbe, 0x3d, 0x99, 0xbf, 0xbd, 0xaa, 0x61, 0x6f, 0x3f, 0x9e, 0x07, 0xaf, 0xbe, 0x0c, 0x8f, 0xbd, 0xbe, 0xa2, 0xeb, 0x52, 0x3f, 0x75, 0xaf, 0xdb, 0xbe, 0x72, 0x31, 0x0e, 0x3f, 0x75, 0x02, 0x52, 0xbf, 0x37, 0x51, 0x0b, 0xbe, 0x1b, 0xf4, 0x25, 0x3f, 0x88, 0x10, 0x3b, 0xbf, 0x84, 0x2c, 0x5b, 0x3e, 0x39, 0x42, 0x2a, 0x3f, 0x2a, 0x8e, 0x2b, 0xbf, +0xae, 0xb8, 0xa8, 0x3e, 0xed, 0x99, 0x35, 0xbe, 0x7c, 0xf0, 0x82, 0x3e, 0x6b, 0x49, 0x73, 0xbf, 0x60, 0xc7, 0x2f, 0xbe, 0xba, 0xa3, 0x5f, 0x3e, 0xb3, 0xec, 0x75, 0xbf, 0xdb, 0xa7, 0x73, 0x3e, 0xf3, 0xe8, 0xce, 0xbe, 0x61, 0x1a, 0x62, 0xbf, 0x52, 0xd2, 0x43, 0xbe, 0xf6, 0x40, 0x6b, 0x3e, 0xb1, 0x4b, 0x74, 0xbf, 0x11, 0xa8, 0xfe, 0xbe, 0x2e, 0xfe, 0x1e, 0x3f, 0x45, 0x10, 0x1b, 0xbf, 0x0d, 0x6d, 0x1c, 0xbf, 0x18, 0x5f, 0x30, 0x3f, 0xa2, 0x99, 0xc7, 0xbe, 0x4b, 0x1d, 0x14, 0x3f, +0xe2, 0xe7, 0x4f, 0xbf, 0x8a, 0x90, 0x9a, 0xbd, 0x4b, 0x03, 0x23, 0x3f, 0x96, 0xcb, 0x42, 0xbf, 0x6e, 0x31, 0xff, 0x3d, 0x5c, 0x21, 0x2c, 0xbe, 0x7c, 0xf3, 0xc3, 0x3e, 0xda, 0x8f, 0x68, 0xbf, 0x07, 0x5a, 0x81, 0xbc, 0xca, 0xe0, 0x98, 0x3e, 0xcb, 0x49, 0x74, 0xbf, 0xa1, 0x80, 0xb5, 0xbe, 0x46, 0x79, 0xbe, 0x3e, 0x1b, 0x9d, 0x5b, 0xbf, 0xa1, 0x80, 0xb5, 0xbe, 0x46, 0x79, 0xbe, 0x3e, 0x1b, 0x9d, 0x5b, 0xbf, 0xb7, 0xed, 0xfb, 0x3c, 0x85, 0x5d, 0x24, 0xbf, 0x76, 0x1b, 0x44, 0xbf, +0xef, 0xc9, 0x93, 0xbe, 0xf4, 0x4d, 0x66, 0x3f, 0x16, 0xc1, 0xa7, 0xbe, 0xef, 0xc9, 0x93, 0xbe, 0xf4, 0x4d, 0x66, 0x3f, 0x16, 0xc1, 0xa7, 0xbe, 0x43, 0x3b, 0x17, 0xbf, 0x23, 0x31, 0x4d, 0x3f, 0x61, 0x8b, 0xbd, 0x3d, 0x4f, 0xe8, 0x61, 0x3f, 0x54, 0xab, 0x3f, 0xbe, 0x90, 0xf5, 0xdc, 0xbe, 0x6f, 0x7e, 0x37, 0x3f, 0x53, 0xb0, 0x26, 0x3f, 0x27, 0x87, 0x7f, 0xbe, 0x2d, 0x97, 0x21, 0x3f, 0xdd, 0xb1, 0x30, 0x3f, 0x46, 0x25, 0xb5, 0xbe, 0xbb, 0x61, 0x4f, 0x3f, 0xa4, 0x8a, 0xa2, 0x3d, +0xe9, 0xb6, 0x14, 0xbf, 0x6d, 0xad, 0x5f, 0x3e, 0xf7, 0x02, 0x6b, 0x3f, 0xfb, 0x73, 0xa9, 0xbe, 0x12, 0x4d, 0x10, 0x3e, 0xdd, 0xb6, 0x7b, 0x3f, 0x21, 0x93, 0xec, 0xbd, 0x0b, 0xb5, 0x36, 0x3e, 0x20, 0xb3, 0x67, 0x3f, 0x94, 0xa2, 0xc5, 0xbe, 0x28, 0x80, 0xba, 0x3e, 0xc3, 0x2b, 0x51, 0x3f, 0xfb, 0xcd, 0xe4, 0xbe, 0x6b, 0x7d, 0x99, 0x3e, 0x5f, 0x98, 0x70, 0x3f, 0xbb, 0xd1, 0x27, 0xbe, 0x1d, 0xe4, 0xed, 0x3e, 0x47, 0x1e, 0x40, 0xbf, 0x61, 0xa7, 0xf0, 0xbe, 0x56, 0x44, 0x09, 0x3f, +0x46, 0x7b, 0x38, 0x3f, 0x6c, 0x09, 0xe1, 0xbe, 0xd5, 0x42, 0x5d, 0x3f, 0xc9, 0x00, 0x88, 0xbe, 0x6d, 0xae, 0xda, 0xbe, 0x78, 0xed, 0x02, 0xbe, 0x64, 0x24, 0x67, 0x3f, 0x6d, 0x1f, 0xd2, 0xbe, 0x61, 0x16, 0x26, 0x3f, 0xc7, 0x2c, 0x3f, 0xbf, 0xe9, 0xd4, 0x15, 0x3e, 0x67, 0xed, 0x26, 0xbf, 0x96, 0x05, 0x3f, 0x3f, 0xd8, 0x83, 0x09, 0xbe, 0x65, 0xa8, 0x6e, 0x3f, 0xdc, 0x45, 0x38, 0x3e, 0x4e, 0xb3, 0xa0, 0xbe, 0xec, 0xbb, 0x5a, 0x3f, 0x77, 0x66, 0x9a, 0x3e, 0xe8, 0x9f, 0xd8, 0xbe, +0x65, 0xa8, 0x6e, 0x3f, 0xdc, 0x45, 0x38, 0x3e, 0x4e, 0xb3, 0xa0, 0xbe, 0x85, 0x3e, 0x4c, 0x3f, 0xe9, 0x2b, 0x88, 0x3e, 0x30, 0x82, 0x0a, 0xbf, 0x88, 0x84, 0x5f, 0x3f, 0x2e, 0x59, 0x35, 0xbe, 0xd2, 0x8d, 0xe8, 0xbe, 0x88, 0x84, 0x5f, 0x3f, 0x2e, 0x59, 0x35, 0xbe, 0xd2, 0x8d, 0xe8, 0xbe, 0x93, 0xe1, 0x40, 0x3f, 0xc3, 0x62, 0x44, 0x3e, 0x19, 0x01, 0x21, 0xbf, 0xce, 0x37, 0x26, 0x3f, 0x37, 0xe3, 0x94, 0x3d, 0x9e, 0xce, 0x41, 0xbf, 0x67, 0xb3, 0x1a, 0x3f, 0xe0, 0x2d, 0x90, 0xbd, +0x0e, 0x2c, 0x4b, 0xbf, 0x30, 0xda, 0x6b, 0x3f, 0xb1, 0xa6, 0xb2, 0xba, 0x22, 0x18, 0xc7, 0xbe, 0xe3, 0x32, 0x4e, 0x3f, 0x7e, 0x35, 0xc7, 0xbd, 0xdf, 0xa8, 0x15, 0xbf, 0x30, 0xda, 0x6b, 0x3f, 0xb1, 0xa6, 0xb2, 0xba, 0x22, 0x18, 0xc7, 0xbe, 0xb9, 0xfa, 0x35, 0x3f, 0xdb, 0x30, 0x3a, 0xbe, 0xee, 0xee, 0x2d, 0xbf, 0xaa, 0x0b, 0x5c, 0x3f, 0x0f, 0x80, 0x80, 0xbe, 0x96, 0xed, 0xe3, 0xbe, 0xbc, 0x3c, 0x01, 0xbf, 0x3a, 0x3b, 0x81, 0xbe, 0x61, 0x53, 0x53, 0xbf, 0xbc, 0x3c, 0x01, 0xbf, +0x3a, 0x3b, 0x81, 0xbe, 0x61, 0x53, 0x53, 0xbf, 0x58, 0x3c, 0x35, 0xbe, 0x45, 0x99, 0x75, 0xbf, 0x00, 0x03, 0x61, 0xbe, 0x58, 0x3c, 0x35, 0xbe, 0x45, 0x99, 0x75, 0xbf, 0x00, 0x03, 0x61, 0xbe, 0x3f, 0xad, 0x56, 0x3f, 0x83, 0x4f, 0x33, 0xbd, 0xf7, 0x02, 0x0b, 0xbf, 0x56, 0x43, 0x02, 0xbf, 0xaa, 0x0d, 0x32, 0xbf, 0x09, 0xdd, 0x01, 0xbf, 0x56, 0x43, 0x02, 0xbf, 0xaa, 0x0d, 0x32, 0xbf, 0x09, 0xdd, 0x01, 0xbf, 0x8c, 0xf7, 0x57, 0x3f, 0xb8, 0x72, 0xbe, 0xbe, 0x39, 0x42, 0xc6, 0xbe, +0x8c, 0xf7, 0x57, 0x3f, 0xb8, 0x72, 0xbe, 0xbe, 0x39, 0x42, 0xc6, 0xbe, 0x30, 0xd4, 0x65, 0x3f, 0xa3, 0x3d, 0x1e, 0x3e, 0x44, 0x2f, 0xd3, 0xbe, 0x30, 0xd4, 0x65, 0x3f, 0xa3, 0x3d, 0x1e, 0x3e, 0x44, 0x2f, 0xd3, 0xbe, 0xbf, 0x10, 0x62, 0x3f, 0x75, 0x3d, 0x21, 0x3e, 0xac, 0x52, 0xe2, 0xbe, 0xbf, 0x10, 0x62, 0x3f, 0x75, 0x3d, 0x21, 0x3e, 0xac, 0x52, 0xe2, 0xbe, 0x77, 0x4a, 0x37, 0x3f, 0x4a, 0x24, 0x51, 0xbe, 0x43, 0xe6, 0x2a, 0xbf, 0x77, 0x4a, 0x37, 0x3f, 0x4a, 0x24, 0x51, 0xbe, +0x43, 0xe6, 0x2a, 0xbf, 0x51, 0x2c, 0x57, 0x3f, 0x27, 0x9f, 0x0e, 0xbe, 0xd1, 0x08, 0x06, 0xbf, 0x51, 0x2c, 0x57, 0x3f, 0x27, 0x9f, 0x0e, 0xbe, 0xd1, 0x08, 0x06, 0xbf, 0x40, 0xa0, 0x63, 0x3f, 0x6b, 0xba, 0x4e, 0x3e, 0x53, 0x40, 0xd2, 0xbe, 0x40, 0xa0, 0x63, 0x3f, 0x6b, 0xba, 0x4e, 0x3e, 0x53, 0x40, 0xd2, 0xbe, 0x20, 0x42, 0x58, 0x3f, 0x77, 0x30, 0xc2, 0x3d, 0x6f, 0xd4, 0x06, 0xbf, 0x20, 0x42, 0x58, 0x3f, 0x77, 0x30, 0xc2, 0x3d, 0x6f, 0xd4, 0x06, 0xbf, 0xf9, 0x4a, 0x04, 0x3f, +0xcd, 0xe8, 0x0b, 0xbf, 0x70, 0xb3, 0x28, 0xbf, 0xd2, 0xfd, 0x0c, 0x3e, 0x3a, 0xe8, 0x42, 0xbf, 0x01, 0x30, 0x22, 0xbf, 0x2e, 0x92, 0x96, 0xbd, 0x57, 0x0a, 0x45, 0x3f, 0x08, 0x59, 0x22, 0xbf, 0xe5, 0xb8, 0x6f, 0xbf, 0x61, 0x8b, 0x4d, 0xbe, 0xf7, 0x5b, 0x93, 0x3e, 0x20, 0x24, 0x67, 0xbf, 0xe2, 0xc9, 0xa6, 0xbe, 0x5f, 0x99, 0x8f, 0x3e, 0x6a, 0xdc, 0x5b, 0xbf, 0x23, 0x6b, 0xe5, 0xbe, 0xc6, 0x35, 0x7e, 0x3e, 0x30, 0xf0, 0x4c, 0xbf, 0x6e, 0x6a, 0x10, 0xbf, 0x7a, 0x17, 0x4f, 0x3e, +0xbd, 0xa8, 0x3d, 0xbf, 0xae, 0x4a, 0x26, 0xbf, 0xc0, 0xec, 0x2e, 0x3e, 0x4a, 0x5c, 0x77, 0xbf, 0xea, 0x92, 0x81, 0xbe, 0xc2, 0xde, 0x44, 0x3d, 0xbe, 0xf7, 0x23, 0xbf, 0x8b, 0x52, 0x3a, 0xbf, 0x4f, 0xe7, 0x7a, 0x3e, 0xd8, 0x2d, 0x5a, 0xbf, 0xd4, 0x0a, 0xe3, 0xbe, 0x23, 0x15, 0x8e, 0x3e, 0x54, 0xff, 0x48, 0xbf, 0x58, 0xae, 0x0f, 0xbf, 0xe9, 0x0a, 0x86, 0x3e, 0x81, 0x97, 0x35, 0xbf, 0x85, 0x3e, 0x28, 0xbf, 0x0c, 0x73, 0x82, 0x3e, 0x92, 0x24, 0x14, 0x3f, 0x45, 0x81, 0x42, 0xbf, +0xbd, 0xc1, 0x97, 0x3e, 0x28, 0x2c, 0xf1, 0xb8, 0x58, 0xff, 0x7f, 0xbf, 0x52, 0x5f, 0x96, 0xbb, 0x85, 0xb1, 0x05, 0xba, 0x7e, 0xfe, 0x7f, 0xbf, 0xcf, 0x2e, 0xdf, 0xbb, 0x39, 0x9b, 0x0e, 0xb8, 0xac, 0xff, 0x7f, 0xbf, 0x7c, 0xd5, 0x4a, 0xbb, 0x51, 0x49, 0x1d, 0xba, 0xde, 0xff, 0x7f, 0xbf, 0x40, 0x51, 0xd9, 0xba, 0xc0, 0x92, 0xab, 0x3a, 0xde, 0xff, 0x7f, 0xbf, 0x1c, 0xd2, 0xa8, 0x3a, 0x36, 0x76, 0x89, 0xbb, 0xa0, 0xfe, 0x7f, 0xbf, 0xa8, 0x37, 0xa3, 0xbb, 0x0e, 0x15, 0x63, 0xbb, +0x6d, 0xfe, 0x7f, 0xbf, 0x5a, 0x9b, 0xc6, 0xbb, 0x09, 0x54, 0xff, 0xba, 0x4c, 0xfe, 0x7f, 0xbf, 0x0d, 0x15, 0xe3, 0xbb, 0xe9, 0xef, 0x25, 0xba, 0x08, 0xfe, 0x7f, 0xbf, 0xef, 0xe2, 0xfd, 0xbb, 0x9c, 0x53, 0xc9, 0xb6, 0x19, 0xfe, 0x7f, 0xbf, 0xca, 0x6d, 0xfb, 0xbb, 0xd9, 0x03, 0x2d, 0xbb, 0xb0, 0xfe, 0x7f, 0xbf, 0x9f, 0xe8, 0xba, 0xbb, 0x7b, 0x69, 0x8a, 0xb8, 0xd6, 0xfd, 0x7f, 0xbf, 0xc6, 0x8b, 0x05, 0xbc, 0x4b, 0x1f, 0xba, 0xba, 0xbd, 0xff, 0x7f, 0xbf, 0x46, 0x98, 0x22, 0xbb, +0xf4, 0xe0, 0x6e, 0x3b, 0x8b, 0xff, 0x7f, 0xbf, 0x20, 0xf0, 0x40, 0x38, 0x9a, 0x07, 0x30, 0xbb, 0x69, 0xff, 0x7f, 0xbf, 0x6a, 0x17, 0x53, 0x3b, 0x0e, 0x12, 0xa2, 0x3b, 0x8b, 0xfb, 0x7f, 0xbf, 0x21, 0xc9, 0x2c, 0x3c, 0x23, 0x85, 0x32, 0x3b, 0x54, 0xfc, 0x7f, 0xbf, 0xfb, 0x75, 0x27, 0x3c, 0xef, 0xac, 0xdd, 0x3b, 0xc1, 0xfa, 0x7f, 0xbf, 0xb9, 0x1c, 0x2f, 0x3c, 0xa7, 0x91, 0x96, 0x3b, 0xc6, 0xfd, 0x7f, 0xbf, 0x24, 0x61, 0xdf, 0x3b, 0x61, 0x35, 0x96, 0x3a, 0xce, 0xff, 0x7f, 0xbf, +0x0b, 0x9a, 0x16, 0x3b, 0xde, 0x01, 0x9e, 0xbb, 0xd2, 0xfe, 0x7f, 0xbf, 0x3e, 0x25, 0x67, 0x3b, 0xa7, 0x24, 0x6b, 0xbb, 0xa4, 0xfd, 0x7f, 0xbf, 0x2b, 0xa4, 0xfc, 0x3b, 0x1a, 0x4c, 0x43, 0xbb, 0xa9, 0xf8, 0x7f, 0xbf, 0x14, 0x3d, 0x70, 0x3c, 0x29, 0xec, 0xa2, 0xba, 0x05, 0xf7, 0x7f, 0xbf, 0x05, 0x6c, 0x87, 0x3c, 0x97, 0x38, 0xf2, 0x3a, 0x9c, 0xfb, 0x7f, 0xbf, 0xfa, 0x9c, 0x3b, 0x3c, 0xb4, 0xab, 0x90, 0xbb, 0xf4, 0xfe, 0x7f, 0xbf, 0x7e, 0xc7, 0x70, 0x3b, 0xdb, 0x89, 0x92, 0x3a, +0xe8, 0xf9, 0x7f, 0xbf, 0x90, 0xbd, 0x5e, 0x3c, 0x9d, 0xd9, 0xae, 0x3a, 0xef, 0xff, 0x7f, 0xbf, 0x19, 0x3d, 0x37, 0xba, 0xd9, 0x03, 0xad, 0xb9, 0x00, 0x00, 0x80, 0xbf, 0x94, 0x17, 0x99, 0xb9, 0x60, 0x06, 0xbb, 0x3e, 0xd4, 0x45, 0x6e, 0x3f, 0x85, 0xb1, 0x85, 0x3c, 0xa7, 0x75, 0x5b, 0xbd, 0x62, 0x85, 0x7f, 0x3f, 0x6b, 0x47, 0xf1, 0x3c, 0x4a, 0x5c, 0x77, 0xbf, 0xea, 0x92, 0x81, 0xbe, 0xc2, 0xde, 0x44, 0x3d, 0xcd, 0xe9, 0x7e, 0xbf, 0xe8, 0xbb, 0x9b, 0xbd, 0x01, 0x68, 0x54, 0x3d, +0xf4, 0xc5, 0x7e, 0xbf, 0x59, 0x4f, 0xad, 0x3d, 0xef, 0xad, 0x48, 0x3d, 0xd7, 0x81, 0x7b, 0xbf, 0x75, 0xe4, 0x38, 0x3e, 0x68, 0xb2, 0x3f, 0x3d, 0xde, 0xe8, 0x73, 0xbf, 0x4a, 0x62, 0x99, 0x3e, 0x42, 0xe9, 0x4b, 0x3d, 0x65, 0x00, 0x54, 0xbf, 0xbf, 0xd1, 0x0e, 0x3f, 0xf9, 0xdb, 0x5e, 0x3d, 0x01, 0x13, 0x04, 0xbf, 0xa6, 0xee, 0x5a, 0x3f, 0x8b, 0x17, 0x4b, 0x3d, 0xa7, 0x75, 0x5b, 0xbd, 0x62, 0x85, 0x7f, 0x3f, 0x6b, 0x47, 0xf1, 0x3c, 0xf9, 0xda, 0x27, 0x3f, 0x8c, 0x11, 0x41, 0x3f, +0x00, 0x90, 0x13, 0x3d, 0x33, 0xa5, 0x35, 0x3f, 0x75, 0x90, 0x33, 0x3f, 0x57, 0x05, 0x8a, 0x3d, 0x8b, 0xff, 0x03, 0x3f, 0x00, 0xac, 0x5a, 0x3f, 0x59, 0x6e, 0x89, 0x3d, 0x0b, 0xb3, 0xb0, 0xbd, 0xe4, 0x83, 0x2a, 0x3f, 0x2e, 0xaa, 0x3d, 0x3f, 0xfc, 0x34, 0x3e, 0xbe, 0x0e, 0xd8, 0xfd, 0x3e, 0x34, 0x2d, 0x59, 0x3f, 0x48, 0xdc, 0xc3, 0xbd, 0xc8, 0x07, 0x45, 0x3f, 0x74, 0x9a, 0x21, 0x3f, 0x4d, 0x9f, 0x5d, 0xbd, 0xe6, 0x94, 0x3c, 0x3f, 0x68, 0x92, 0x2c, 0x3f, 0xc3, 0xd3, 0x4b, 0xbe, +0x64, 0x3f, 0x9b, 0xbe, 0xff, 0x90, 0x6e, 0x3f, 0x48, 0x8b, 0x83, 0xbe, 0x35, 0xd0, 0xfc, 0xbd, 0x4e, 0x61, 0x75, 0x3f, 0xfa, 0xd1, 0x90, 0xbe, 0xe6, 0x05, 0x58, 0x3c, 0xcf, 0x85, 0x75, 0x3f, 0xd0, 0x99, 0x8c, 0xbe, 0x31, 0x7e, 0x0a, 0x3e, 0x02, 0xb6, 0x73, 0x3f, 0x4a, 0xd3, 0x00, 0xbe, 0xa5, 0x15, 0xe7, 0xbe, 0x30, 0x29, 0x62, 0x3f, 0x61, 0xe2, 0x7f, 0xbe, 0x95, 0x82, 0x96, 0x3e, 0xbe, 0x2d, 0x6c, 0x3f, 0x0d, 0x50, 0x1a, 0xbd, 0x1a, 0xfd, 0x04, 0xbf, 0x9c, 0x88, 0x5a, 0x3f, +0xf4, 0x86, 0x7b, 0x3d, 0xb8, 0x22, 0x09, 0xbf, 0x2d, 0x99, 0x57, 0x3f, 0x95, 0x27, 0x20, 0x3e, 0x6d, 0xaa, 0xfe, 0xbe, 0x86, 0x72, 0x5a, 0x3f, 0xfd, 0x4c, 0x9d, 0xbd, 0xcc, 0x96, 0x50, 0x3f, 0x04, 0x1b, 0x13, 0x3f, 0x4b, 0xe9, 0x19, 0x3d, 0x49, 0xf4, 0x4e, 0x3f, 0xa2, 0x60, 0x16, 0x3f, 0x2e, 0x92, 0x96, 0xbd, 0x57, 0x0a, 0x45, 0x3f, 0x08, 0x59, 0x22, 0xbf, 0x59, 0x15, 0x61, 0xbd, 0xf5, 0x68, 0x3e, 0x3f, 0xf0, 0x88, 0x2a, 0xbf, 0x92, 0x25, 0xd3, 0xbd, 0xfd, 0x2b, 0x2b, 0x3f, +0xf9, 0x84, 0x3c, 0xbf, 0xc1, 0x37, 0x3d, 0xbe, 0xfc, 0x6f, 0xf5, 0x3e, 0xe4, 0xa1, 0x5b, 0xbf, 0x4b, 0xe6, 0x90, 0xbe, 0xb5, 0x8b, 0xe9, 0xbc, 0xf8, 0x6c, 0x75, 0xbf, 0xd2, 0xab, 0x81, 0xbe, 0xd8, 0xf2, 0xea, 0x3d, 0xfb, 0xe7, 0x75, 0xbf, 0x90, 0xbf, 0x74, 0xbe, 0xd1, 0xb1, 0xb3, 0xbe, 0x65, 0xc6, 0x67, 0xbf, 0x59, 0x50, 0x90, 0xbe, 0xe4, 0x85, 0x44, 0xbe, 0x1a, 0xa8, 0x70, 0xbf, 0xa5, 0xda, 0x27, 0xbe, 0x0f, 0xd0, 0xed, 0xbe, 0xcd, 0xca, 0x5e, 0xbf, 0x93, 0xff, 0x69, 0xbe, +0xf1, 0x0c, 0x8a, 0x3e, 0x1c, 0x7a, 0x6f, 0xbf, 0xf1, 0x67, 0x78, 0xbd, 0x04, 0xca, 0x06, 0xbf, 0x55, 0x16, 0x59, 0xbf, 0xd0, 0x99, 0x74, 0x3d, 0xff, 0x91, 0x09, 0xbf, 0x42, 0x5a, 0x57, 0xbf, 0xef, 0xe5, 0x2e, 0x3e, 0x48, 0x32, 0xfb, 0xbe, 0x9c, 0xbe, 0x5a, 0xbf, 0xfc, 0xde, 0x66, 0xbd, 0x8a, 0x21, 0x51, 0x3f, 0x24, 0xf1, 0x12, 0xbf, 0x8b, 0x8c, 0x4e, 0x3d, 0x96, 0x75, 0x53, 0x3f, 0x52, 0xb7, 0x0f, 0xbf + }; + + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowInterop/ShadowInterop.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowInterop/ShadowInterop.cs new file mode 100644 index 000000000..72ac74807 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowInterop/ShadowInterop.cs @@ -0,0 +1,30 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +namespace CompositionSampleGallery +{ + public sealed partial class ShadowInterop : SamplePage + { + public ShadowInterop() + { + this.InitializeComponent(); + } + + public static string StaticSampleName => "Shadow Interop"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to apply drop shadows to Xaml elements."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761171"; + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowInterop/ShadowInterop.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowInterop/ShadowInterop.xaml new file mode 100644 index 000000000..1bf8021ea --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowInterop/ShadowInterop.xaml @@ -0,0 +1,131 @@ + + + + + + + + + + TextBlock + + + + + Here’s a custom control that allows you to apply DropShadows through Markup on XAML Text, Images, or Shapes + + + + + Here’s a custom control that allows you to apply DropShadows through Markup on XAML Text, Images, or Shapes + + + + Shapes + + + + + + + + + + + + + + + + + Images + + + + + + + Before + + + + + + + After + + + + + Before + + + + + + + After + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowPlayground/ShadowPlayground.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowPlayground/ShadowPlayground.xaml new file mode 100644 index 000000000..cc6090818 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowPlayground/ShadowPlayground.xaml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + Blur Radius + + Opacity + + Offset - X + + Offset - Y + + Shadow Color + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowPlayground/ShadowPlayground.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowPlayground/ShadowPlayground.xaml.cs new file mode 100644 index 000000000..f7ab78aa6 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowPlayground/ShadowPlayground.xaml.cs @@ -0,0 +1,95 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using SamplesCommon; + +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Hosting; +using System.Reflection; + +namespace CompositionSampleGallery +{ + public sealed partial class ShadowPlayground : SamplePage + { + private Visual _shadowContainer; + private Compositor _compositor; + private SpriteVisual _imageVisual; + private CompositionImage _image; + private ManagedSurface _imageMaskSurface; + private CompositionMaskBrush _maskBrush; + private bool _isMaskEnabled; + + public ShadowPlayground() + { + this.InitializeComponent(); + } + + public static string StaticSampleName => "Shadow Playground"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Experiment with the available properties on the DropShadow object to create interesting shadows."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761177"; + + private void SamplePage_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + // Get backing visual from shadow container and interop compositor + _shadowContainer = ElementCompositionPreview.GetElementVisual(ShadowContainer); + _compositor = _shadowContainer.Compositor; + + // Get CompositionImage, its sprite visual + _image = VisualTreeHelperExtensions.GetFirstDescendantOfType(ShadowContainer); + _imageVisual = _image.SpriteVisual; + + // Load mask asset onto surface using helpers in SamplesCommon + _imageMaskSurface = ImageLoader.Instance.LoadCircle(200, Colors.White); + + // Get surface brush from composition image + CompositionSurfaceBrush source = _image.SurfaceBrush as CompositionSurfaceBrush; + + // Create mask brush for toggle mask functionality + _maskBrush = _compositor.CreateMaskBrush(); + _maskBrush.Mask = _imageMaskSurface.Brush; + _maskBrush.Source = source; + + // Initialize toggle mask + _isMaskEnabled = false; + } + + private void SamplePage_Unloaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + if (_imageMaskSurface != null) + { + _imageMaskSurface.Dispose(); + } + } + + private void MaskButton_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + if (_isMaskEnabled) //then remove mask + { + _image.Brush = _maskBrush.Source; //set set composition image's brush to (the initial) surfacebrush (source) + RenderShadow.Mask = null; //remove mask from shadow + } + else //add mask + { + _image.Brush = _maskBrush; //set composition image's brush to maskbrush + RenderShadow.Mask = _maskBrush.Mask; //add mask to shadow + } + + // Update bool + _isMaskEnabled = !_isMaskEnabled; + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowsAdvanced/ShadowsAdvanced.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowsAdvanced/ShadowsAdvanced.cs new file mode 100644 index 000000000..c45d7cc82 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowsAdvanced/ShadowsAdvanced.cs @@ -0,0 +1,260 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System.Numerics; +using System; +using SamplesCommon; + +using Microsoft.UI; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Shapes; +using Microsoft.UI.Xaml.Hosting; + +namespace CompositionSampleGallery +{ + public sealed partial class ShadowsAdvanced : SamplePage + { + const int _rows = 2; + const int _columns = 6; + const int _itemLength = 160; + const int _gridMargin = 100; + const int _itemMargin = 10; + const float _initialShadowBlurRadius = 15.0f; + const float _initialShadowOpacity = 0.5f; + int _shadowHighestZ = 2; + int _contentHighestZ = 3; + + private UIElement[,] _content = new UIElement[_rows, _columns]; + private CompositionShadow[,] _shadows = new CompositionShadow[_rows, _columns]; + + // Sample metadata + public static string StaticSampleName => "Advanced Shadows"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates advanced shadow scenarios."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868954"; + + public ShadowsAdvanced() + { + this.InitializeComponent(); + } + + private void ShadowsAdvanced_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + // Determine width and heigth of the canvas + float width = (_gridMargin * 2) + (_columns * _itemLength) + (_columns * _itemMargin); + float height = (_gridMargin * 2) + (_rows * _itemLength) + (_rows * _itemMargin); + MainCanvas.Width = width; + MainCanvas.Height = height; + + BuildGrid(); + } + + /// + /// Builds the grid of boxes/items to have drop shadow on. + /// + private void BuildGrid() + { + MainCanvas.Background = new SolidColorBrush(Colors.DimGray); + int imageIdx = 1; + + + // + // Create as many squares as necessary for the given number of rows and columns + // Square size is fixed and defined with _itemLength (length of a side of the square) + // + + for (int row = 0; row < _rows; ++row) + { + for (int column = 0; column < _columns; ++column, ++imageIdx) + { + // Create a new square with a solid color + var content = new Rectangle(); + content.Fill = new SolidColorBrush(Colors.OldLace); + content.Width = _itemLength; + content.Height = _itemLength; + + // Place the rectangle in a 2D array of UIElement + _content[row, column] = content; + + // Create a new shadow the same size of the square + var shadow = new CompositionShadow(); + shadow.Width = _itemLength; + shadow.Height = _itemLength; + shadow.ShadowOpacity = _initialShadowOpacity; + shadow.BlurRadius = _initialShadowBlurRadius; + + + // + // Determine the position of an abstract "light" source (no actual light object created here) + // in relation to the position of the square in the scene. + // + + var lightXPosition = (.5f * ((_columns + 1) * (_itemLength + _itemMargin))) - (.5f * (_itemLength + _itemMargin)); + Vector3 lightPositionVector = new Vector3(lightXPosition, 0, -1); + Vector3 itemPositionVector = new Vector3(CalculateOffset(column), CalculateOffset(row), 0); + Vector3 lightDirection = Vector3.Normalize(itemPositionVector - lightPositionVector); + + // Determine the offset of the shadow + shadow.OffsetY = 10.0f * (row + 1); + shadow.OffsetX = 10.0f * lightDirection.X; + shadow.OffsetZ = 0.0f; + + shadow.Visual.CenterPoint = new Vector3(_itemLength * .5f, _itemLength * .5f, 0); + + // Store the shadow in a 2D array of CompositionShadow + _shadows[row, column] = shadow; + + // Add the shadow to the Canvas first + MainCanvas.Children.Add(shadow); + SetOffsets(shadow, row, column, 0); + + // Add the square to the canvas next + MainCanvas.Children.Add(content); + SetOffsets(content, row, column, 1); + + // Attach event handlers to the square for hovering over and off the square + content.PointerEntered += Content_PointerEntered; + content.PointerExited += Content_PointerExited; + + SetupAnimations(content); + } + } + } + private void SetupAnimations(Object item) + { + var shadow = GetShadowFromContent(item); + var content = ElementCompositionPreview.GetElementVisual(item as UIElement); + + ElementCompositionPreview.SetIsTranslationEnabled((UIElement)item, true); + var ContentProperties = ElementCompositionPreview.GetElementVisual(item as UIElement).Properties; + ContentProperties.InsertVector3("Translation", Vector3.Zero); + + var compositor = content.Compositor; + + var implicitAnimationShadow = compositor.CreateImplicitAnimationCollection(); + var implicitAnimationVisual = compositor.CreateImplicitAnimationCollection(); + + //Translation Animation + var translationAnimation = compositor.CreateVector3KeyFrameAnimation(); + translationAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); + translationAnimation.Duration = TimeSpan.FromSeconds(1); + translationAnimation.Target = "Translation"; + + //Scale Animation Shadow + var shadowScaleAnimation = compositor.CreateVector3KeyFrameAnimation(); + shadowScaleAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); + shadowScaleAnimation.Duration = TimeSpan.FromSeconds(1); + shadowScaleAnimation.Target = "Scale"; + + + // Animate shadow (change opacity) + + var shadowOpacityAnimation = compositor.CreateScalarKeyFrameAnimation(); + shadowOpacityAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); + shadowOpacityAnimation.Duration = TimeSpan.FromSeconds(1); + shadowOpacityAnimation.Target = "Opacity"; + + //BlurRadius Animation + + var shadowBlurAnimation = compositor.CreateScalarKeyFrameAnimation(); + shadowBlurAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); + shadowBlurAnimation.Duration = TimeSpan.FromSeconds(1); + shadowBlurAnimation.Target = "BlurRadius"; + + //Associating animations with triggers + implicitAnimationShadow["BlurRadius"] = shadowBlurAnimation; + implicitAnimationShadow["Opacity"] = shadowOpacityAnimation; + implicitAnimationShadow["Scale"] = shadowScaleAnimation; + + implicitAnimationVisual["Translation"] = translationAnimation; + + + //Applying Implicit Animations to objects + content.Properties.ImplicitAnimations = implicitAnimationVisual; + shadow.Visual.ImplicitAnimations = implicitAnimationShadow; + shadow.DropShadow.ImplicitAnimations = implicitAnimationShadow; + + } + + private void Content_PointerExited(object sender, PointerRoutedEventArgs e) + { + + ElementCompositionPreview.SetIsTranslationEnabled((UIElement)sender, true); + var ContentProperties = ElementCompositionPreview.GetElementVisual((UIElement)sender).Properties; + ContentProperties.InsertVector3("Translation", Vector3.Zero); + + // Animate Shadow (make it smaller) + var shadow = GetShadowFromContent(sender); + shadow.Visual.Scale = new Vector3(1.0f); + shadow.DropShadow.Opacity = _initialShadowOpacity; + shadow.DropShadow.BlurRadius = _initialShadowBlurRadius; + + // Set the ZIndex to lowest + Canvas.SetZIndex((UIElement)sender, 1); + Canvas.SetZIndex(shadow, 0); + } + + private void Content_PointerEntered(object sender, PointerRoutedEventArgs e) + { + var content = ElementCompositionPreview.GetElementVisual((UIElement)sender); + + var compositor = content.Compositor; + + var ContentProperties = ElementCompositionPreview.GetElementVisual((UIElement)sender).Properties; + + // Get shadow and set the proper Z values for visual and shadow + var shadow = GetShadowFromContent(sender); + Canvas.SetZIndex((UIElement)sender, _contentHighestZ += 2); + Canvas.SetZIndex(shadow, _shadowHighestZ += 2); + + shadow.DropShadow.Opacity = _initialShadowOpacity; + shadow.DropShadow.BlurRadius = _initialShadowBlurRadius; + ContentProperties.InsertVector3("Translation", new Vector3(0, 0, 25.0f)); + shadow.Visual.Scale = new Vector3(1.25f, 1.25f, 0.0f); + } + + private CompositionShadow GetShadowFromContent(object content) + { + for (int row = 0; row < _rows; ++row) + { + for (int column = 0; column < _columns; ++column) + { + if (content == (object) _content[row, column]) + { + return _shadows[row, column]; + } + } + } + + return null; + } + + private static float CalculateOffset(int index) + { + return _gridMargin + (_itemLength * index) + (_itemMargin * index); + } + + private static void SetOffsets(UIElement element, int row, int column, int zIndex) + { + Canvas.SetTop(element, CalculateOffset(row)); + Canvas.SetLeft(element, CalculateOffset(column)); + Canvas.SetZIndex(element, zIndex); + } + + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowsAdvanced/ShadowsAdvanced.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowsAdvanced/ShadowsAdvanced.xaml new file mode 100644 index 000000000..0a00a7a7a --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ShadowsAdvanced/ShadowsAdvanced.xaml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ShowHideImplicitWebview/ShowHideImplicitWebview.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/ShowHideImplicitWebview/ShowHideImplicitWebview.xaml new file mode 100644 index 000000000..6f759b642 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ShowHideImplicitWebview/ShowHideImplicitWebview.xaml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ShowHideImplicitWebview/ShowHideImplicitWebview.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/ShowHideImplicitWebview/ShowHideImplicitWebview.xaml.cs new file mode 100644 index 000000000..d0f6474af --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ShowHideImplicitWebview/ShowHideImplicitWebview.xaml.cs @@ -0,0 +1,314 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Shapes; +using System; +using System.Collections.Generic; +using System.Numerics; + +namespace CompositionSampleGallery +{ + public sealed partial class ShowHideImplicitWebview : SamplePage + { + private Compositor _compositor; + private Visual _image1, _image2, _image3; + private Vector3 _primaryImageOffset, _secondaryImageOffset, _tertiaryImageOffset; + private Vector3 _primaryImageScale, _secondaryImageScale, _tertiaryImageScale; + private Ellipse _currentPrimary, _currentSecondary, _currentTertiary; + private Dictionary imageDictionary; + private static string _rightArrowGlyph = "\u2190"; + private static string _leftArrowGlyph = "\u2192"; + private bool _circlesVisible = true; + private ImplicitAnimationCollection _implicitAnimationCollection; + + public static string StaticSampleName => "Implicit Show/Hide Webview"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to apply an implicit show/hide animation on a " + + "webview UI element in a realistic app scenario."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868955"; + + + public ShowHideImplicitWebview() + { + this.InitializeComponent(); + + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + imageDictionary = new Dictionary(); + + _primaryImageScale = new Vector3(1, 1, 1); + _secondaryImageScale = new Vector3(0.8f, 0.8f, 0.8f); + _tertiaryImageScale = new Vector3(0.6f, 0.6f, 0.6f); + + this.CreateImageObjects(); + + // Implicit show animation for webview + var showWebviewAnimation = _compositor.CreateScalarKeyFrameAnimation(); + showWebviewAnimation.InsertKeyFrame(0.0f, 0.0f); + showWebviewAnimation.InsertKeyFrame(1.0f, 1.0f); + showWebviewAnimation.Target = nameof(Visual.Opacity); + showWebviewAnimation.Duration = TimeSpan.FromSeconds(0.5f); + ElementCompositionPreview.SetImplicitShowAnimation(PageWebview, showWebviewAnimation); + + // Implicit hide animation for webview + var hideWebviewAnimation = _compositor.CreateScalarKeyFrameAnimation(); + hideWebviewAnimation.InsertKeyFrame(0.0f, 1.0f); + hideWebviewAnimation.InsertKeyFrame(1.0f, 0.0f); + hideWebviewAnimation.Target = nameof(Visual.Opacity); + hideWebviewAnimation.Duration = TimeSpan.FromSeconds(0.5f); + ElementCompositionPreview.SetImplicitHideAnimation(PageWebview, hideWebviewAnimation); + + // Implicit show animation for the images + var showImagesAnimation = _compositor.CreateScalarKeyFrameAnimation(); + showImagesAnimation.InsertKeyFrame(0.0f, 0.0f); + showImagesAnimation.InsertKeyFrame(1.0f, 1.0f); + showImagesAnimation.Target = nameof(Visual.Opacity); + showImagesAnimation.Duration = TimeSpan.FromSeconds(1.0f); + ElementCompositionPreview.SetImplicitShowAnimation(CircleCanvas, showImagesAnimation); + + // Offset and scale implicit animation set up for images + _implicitAnimationCollection = _compositor.CreateImplicitAnimationCollection(); + // Offset implicit animation + var offsetAnimation = _compositor.CreateVector3KeyFrameAnimation(); + offsetAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); + offsetAnimation.Duration = TimeSpan.FromSeconds(1.0f); + offsetAnimation.Target = nameof(Visual.Offset); + // Scale implicit animation + var scaleAnimation = _compositor.CreateVector3KeyFrameAnimation(); + scaleAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); + scaleAnimation.Duration = TimeSpan.FromSeconds(1.0f); + scaleAnimation.Target = nameof(Visual.Scale); + // Add to collection + _implicitAnimationCollection["Offset"] = offsetAnimation; + _implicitAnimationCollection["Scale"] = scaleAnimation; + } + + /// + /// Helper to create image objects + /// + private void CreateImageObjects() + { + ImageItem imageItem1 = new ImageItem("https://en.wikipedia.org/wiki/Slug"); + ImageItem imageItem2 = new ImageItem("https://en.wikipedia.org/wiki/Nymphalidae"); + ImageItem imageItem3 = new ImageItem("https://en.wikipedia.org/wiki/Dahlia#Flower_type"); + + imageDictionary.Add(Image1, imageItem1); + imageDictionary.Add(Image2, imageItem2); + imageDictionary.Add(Image3, imageItem3); + } + + /// + /// Update layout and webivew on page load + /// + private void Page_Loaded(object sender, RoutedEventArgs e) + { + _primaryImageOffset = new Vector3((float)(6 * (CircleCanvas.ActualWidth / 18)), (float)CircleCanvas.ActualHeight / 5, 0); + _secondaryImageOffset = new Vector3((float)(1 * (CircleCanvas.ActualWidth / 14)), (float)CircleCanvas.ActualHeight / 7, 20); + _tertiaryImageOffset = new Vector3((float)(20 * (CircleCanvas.ActualWidth / 30)), (float)CircleCanvas.ActualHeight / 10, 40); + + // Get backing visuals + _image1 = ElementCompositionPreview.GetElementVisual(Image1); + _image2 = ElementCompositionPreview.GetElementVisual(Image2); + _image3 = ElementCompositionPreview.GetElementVisual(Image3); + + // Update XAML element visibility to trigger show animation + Image1.Visibility = Visibility.Visible; + Image2.Visibility = Visibility.Visible; + Image3.Visibility = Visibility.Visible; + + _currentPrimary = Image1; + _currentSecondary = Image2; + _currentTertiary = Image3; + + UpdateVisualLayout(); + UpdateWebview(_currentPrimary); + } + + /// + /// Show webview on navigation complete, which will trigger show implicit animation + /// + private void PageWebview_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args) + { + PageWebview.Visibility = Visibility.Visible; + } + + /// + /// Updates circle image positions on grid resize + /// Also update portrait layout values if applicable + /// + private void MainGrid_SizeChanged(object sender, SizeChangedEventArgs e) + { + UpdateVisualLayout(); + + if (LeftStackPanel.Visibility == Visibility.Collapsed && PageWebview.Visibility == Visibility.Visible) + { + MainGrid.ColumnDefinitions[0].Width = new GridLength(1, GridUnitType.Star); + MainGrid.ColumnDefinitions[1].Width = new GridLength(3, GridUnitType.Star); + MainGrid.ColumnDefinitions[2].Width = new GridLength(20, GridUnitType.Star); + + // Update glyph + ViewMoreButtonIcon.Glyph = _rightArrowGlyph; + } + } + + /// + /// Click listener for navigation on portrait layout + /// + private void ViewMoreButton_Click(object sender, RoutedEventArgs e) + { + if (_circlesVisible) + { + LeftStackPanel.Visibility = Visibility.Collapsed; + PageWebview.Visibility = Visibility.Visible; + MainGrid.ColumnDefinitions[0].Width = new GridLength(1, GridUnitType.Star); + MainGrid.ColumnDefinitions[1].Width = new GridLength(3, GridUnitType.Star); + MainGrid.ColumnDefinitions[2].Width = new GridLength(20, GridUnitType.Star); + + // Update glyph + ViewMoreButtonIcon.Glyph = _rightArrowGlyph; + } + else + { + LeftStackPanel.Visibility = Visibility.Visible; + PageWebview.Visibility = Visibility.Collapsed; + MainGrid.ColumnDefinitions[0].Width = new GridLength(20, GridUnitType.Star); + MainGrid.ColumnDefinitions[1].Width = new GridLength(3, GridUnitType.Star); + MainGrid.ColumnDefinitions[2].Width = new GridLength(1, GridUnitType.Star); + + // Update glyph + ViewMoreButtonIcon.Glyph = _leftArrowGlyph; + } + _circlesVisible = !_circlesVisible; + } + + /// + /// Navigates the webview to the info URL of a passed image + /// + private void UpdateWebview(Ellipse imageLookup) + { + PageWebview.Navigate(new Uri(imageDictionary[imageLookup].GetWebviewString())); + } + + /// + /// Helper to update circle image size/positioning without animation + /// + private void UpdateVisualLayout() + { + if (_currentPrimary != null) + { + var primary = ElementCompositionPreview.GetElementVisual(_currentPrimary); + var secondary = ElementCompositionPreview.GetElementVisual(_currentSecondary); + var tertiary = ElementCompositionPreview.GetElementVisual(_currentTertiary); + + primary.Offset = _primaryImageOffset; + primary.Scale = _primaryImageScale; + + secondary.Offset = _secondaryImageOffset; + secondary.Scale = _secondaryImageScale; + + tertiary.Offset = _tertiaryImageOffset; + tertiary.Scale = _tertiaryImageScale; + } + } + + /// + /// Helper to animate circle images to new positions given new desired position information + /// Triggers implicit offset/scale animations + /// + private void AnimateImages(Visual newPrimary, Ellipse newPrimaryImage, Visual newSecondary, Ellipse newSecondaryImage, Visual newTertiary, Ellipse newTertiaryImage) + { + // Connect implicit animations + newPrimary.ImplicitAnimations = _implicitAnimationCollection; + newSecondary.ImplicitAnimations = _implicitAnimationCollection; + newTertiary.ImplicitAnimations = _implicitAnimationCollection; + + // Update values to trigger implicit animations + + newPrimary.Offset = _primaryImageOffset; + newPrimary.Scale = _primaryImageScale; + + newSecondary.Offset = _secondaryImageOffset; + newSecondary.Scale = _secondaryImageScale; + + newTertiary.Offset = _tertiaryImageOffset; + newTertiary.Scale = _tertiaryImageScale; + + // Update current order + _currentPrimary = newPrimaryImage; + _currentSecondary = newSecondaryImage; + _currentTertiary = newTertiaryImage; + + // Reorder visual tree + var xamlImage1Storage = Image1; + var xamlImage2Storage = Image2; + var xamlImage3Storage = Image3; + CircleCanvas.Children.Clear(); + CircleCanvas.Children.Add(_currentTertiary); + CircleCanvas.Children.Add(_currentSecondary); + CircleCanvas.Children.Add(_currentPrimary); + } + + /// + /// On image click, animate circle images to appropriate view and update webview + /// + private void Image3_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) + { + this.AnimateImages(_image3, Image3, _image1, Image1, _image2, Image2); + PageWebview.Visibility = Visibility.Collapsed; + this.UpdateWebview(Image3); + } + + /// + /// On image click, animate circle images to appropriate view and update webview + /// + private void Image2_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) + { + this.AnimateImages(_image2, Image2, _image3, Image3, _image1, Image1); + PageWebview.Visibility = Visibility.Collapsed; + this.UpdateWebview(Image2); + } + + /// + /// On image click, animate circle images to appropriate view and update webview + /// + private void Image1_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) + { + this.AnimateImages(_image1, Image1, _image2, Image2, _image3, Image3); + PageWebview.Visibility = Visibility.Collapsed; + this.UpdateWebview(Image1); + } + } + + /// + /// Stores information about an image + /// + public class ImageItem + { + private string webviewString; + + public ImageItem(string webviewString) + { + this.webviewString = webviewString; + } + + public string GetWebviewString() + { + return webviewString; + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ShyHeader/ShyHeader.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/ShyHeader/ShyHeader.xaml new file mode 100644 index 000000000..1e5c35552 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ShyHeader/ShyHeader.xaml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud + exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ShyHeader/ShyHeader.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/ShyHeader/ShyHeader.xaml.cs new file mode 100644 index 000000000..e2de8bc50 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ShyHeader/ShyHeader.xaml.cs @@ -0,0 +1,192 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; +using System.Numerics; + +using EF = ExpressionBuilder.ExpressionFunctions; +using System.Collections.ObjectModel; +using SamplesCommon; + +using Microsoft.Graphics.Canvas.Effects; +using Microsoft.UI.Xaml; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Media; +using CompositionSampleGallery.Shared; + +// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 +namespace CompositionSampleGallery +{ + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class ShyHeader : SamplePage + { + CompositionPropertySet _props; + CompositionPropertySet _scrollerPropertySet; + Compositor _compositor; + private SpriteVisual _blurredBackgroundImageVisual; + public LocalDataSource Model { set; get; } + + public ShyHeader() + { + this.InitializeComponent(); + Loaded += SamplePage_Loaded; + SizeChanged += Page_SizeChanged; + } + + public static string StaticSampleName => "Shy Header"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use ExpressionAnimations with a ScrollViewer to create a shrinking header tied to scroll position."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869003"; + + private void SamplePage_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + // Retrieve the ScrollViewer that the GridView is using internally + var scrollViewer = gridView.GetFirstDescendantOfType(); + + // Update the ZIndex of the header container so that the header is above the items when scrolling + var headerPresenter = (UIElement)VisualTreeHelper.GetParent((UIElement)gridView.Header); + var headerContainer = (UIElement)VisualTreeHelper.GetParent(headerPresenter); + Canvas.SetZIndex((UIElement)headerContainer, 1); + + // Get the PropertySet that contains the scroll values from the ScrollViewer + _scrollerPropertySet = ElementCompositionPreview.GetScrollViewerManipulationPropertySet(scrollViewer); + _compositor = _scrollerPropertySet.Compositor; + Model = new LocalDataSource(); + + gridView.ItemsSource = Model.AggregateDataSources(new ObservableCollection[] { Model.Landscapes, Model.Nature, Model.Abstract }); + + // Create a PropertySet that has values to be referenced in the ExpressionAnimations below + _props = _compositor.CreatePropertySet(); + _props.InsertScalar("progress", 0); + _props.InsertScalar("clampSize", 150); + _props.InsertScalar("scaleFactor", 0.7f); + + // Get references to our property sets for use with ExpressionNodes + var scrollingProperties = _scrollerPropertySet.GetSpecializedReference(); + var props = _props.GetReference(); + var progressNode = props.GetScalarProperty("progress"); + var clampSizeNode = props.GetScalarProperty("clampSize"); + var scaleFactorNode = props.GetScalarProperty("scaleFactor"); + + // Create a blur effect to be animated based on scroll position + var blurEffect = new GaussianBlurEffect() + { + Name = "blur", + BlurAmount = 0.0f, + BorderMode = EffectBorderMode.Hard, + Optimization = EffectOptimization.Balanced, + Source = new CompositionEffectSourceParameter("source") + }; + + var blurBrush = _compositor.CreateEffectFactory( + blurEffect, + new[] { "blur.BlurAmount" }) + .CreateBrush(); + + blurBrush.SetSourceParameter("source", _compositor.CreateBackdropBrush()); + + // Create a Visual for applying the blur effect + _blurredBackgroundImageVisual = _compositor.CreateSpriteVisual(); + _blurredBackgroundImageVisual.Brush = blurBrush; + _blurredBackgroundImageVisual.Size = new Vector2((float)OverlayRectangle.ActualWidth, (float)OverlayRectangle.ActualHeight); + + // Insert the blur visual at the right point in the Visual Tree + ElementCompositionPreview.SetElementChildVisual(OverlayRectangle, _blurredBackgroundImageVisual); + + // Create and start an ExpressionAnimation to track scroll progress over the desired distance + ExpressionNode progressAnimation = EF.Clamp(-scrollingProperties.Translation.Y / clampSizeNode, 0, 1); + _props.StartAnimation("progress", progressAnimation); + + // Create and start an ExpressionAnimation to animate blur radius between 0 and 15 based on progress + ExpressionNode blurAnimation = EF.Lerp(0, 15, progressNode); + _blurredBackgroundImageVisual.Brush.Properties.StartAnimation("blur.BlurAmount", blurAnimation); + + // Get the backing visual for the header so that its properties can be animated + Visual headerVisual = ElementCompositionPreview.GetElementVisual(Header); + + // Create and start an ExpressionAnimation to clamp the header's offset to keep it onscreen + ExpressionNode headerTranslationAnimation = EF.Conditional(progressNode < 1, 0, -scrollingProperties.Translation.Y - clampSizeNode); + headerVisual.StartAnimation("Offset.Y", headerTranslationAnimation); + + // Create and start an ExpressionAnimation to scale the header during overpan + ExpressionNode headerScaleAnimation = EF.Lerp(1, 1.25f, EF.Clamp(scrollingProperties.Translation.Y / 50, 0, 1)); + headerVisual.StartAnimation("Scale.X", headerScaleAnimation); + headerVisual.StartAnimation("Scale.Y", headerScaleAnimation); + + //Set the header's CenterPoint to ensure the overpan scale looks as desired + headerVisual.CenterPoint = new Vector3((float)(Header.ActualWidth / 2), (float)Header.ActualHeight, 0); + + // Get the backing visual for the photo in the header so that its properties can be animated + Visual photoVisual = ElementCompositionPreview.GetElementVisual(BackgroundRectangle); + + // Create and start an ExpressionAnimation to opacity fade out the image behind the header + ExpressionNode imageOpacityAnimation = 1 - progressNode; + photoVisual.StartAnimation("opacity", imageOpacityAnimation); + + // Get the backing visual for the profile picture visual so that its properties can be animated + Visual profileVisual = ElementCompositionPreview.GetElementVisual(ProfileImage); + + // Create and start an ExpressionAnimation to scale the profile image with scroll position + ExpressionNode scaleAnimation = EF.Lerp(1, scaleFactorNode, progressNode); + profileVisual.StartAnimation("Scale.X", scaleAnimation); + profileVisual.StartAnimation("Scale.Y", scaleAnimation); + + // Get backing visuals for the text blocks so that their properties can be animated + Visual blurbVisual = ElementCompositionPreview.GetElementVisual(Blurb); + Visual subtitleVisual = ElementCompositionPreview.GetElementVisual(SubtitleBlock); + Visual moreVisual = ElementCompositionPreview.GetElementVisual(MoreText); + + // Create an ExpressionAnimation that moves between 1 and 0 with scroll progress, to be used for text block opacity + ExpressionNode textOpacityAnimation = EF.Clamp(1 - (progressNode * 2), 0, 1); + + // Start opacity and scale animations on the text block visuals + blurbVisual.StartAnimation("Opacity", textOpacityAnimation); + blurbVisual.StartAnimation("Scale.X", scaleAnimation); + blurbVisual.StartAnimation("Scale.Y", scaleAnimation); + + subtitleVisual.StartAnimation("Opacity", textOpacityAnimation); + subtitleVisual.StartAnimation("Scale.X", scaleAnimation); + subtitleVisual.StartAnimation("Scale.Y", scaleAnimation); + + moreVisual.StartAnimation("Opacity", textOpacityAnimation); + moreVisual.StartAnimation("Scale.X", scaleAnimation); + moreVisual.StartAnimation("Scale.Y", scaleAnimation); + + // Get the backing visuals for the text and button containers so that their properites can be animated + Visual textVisual = ElementCompositionPreview.GetElementVisual(TextContainer); + Visual buttonVisual = ElementCompositionPreview.GetElementVisual(ButtonPanel); + + // When the header stops scrolling it is 150 pixels offscreen. We want the text header to end up with 50 pixels of its content + // offscreen which means it needs to go from offset 0 to 100 as we traverse through the scrollable region + ExpressionNode contentOffsetAnimation = progressNode * 100; + textVisual.StartAnimation("Offset.Y", contentOffsetAnimation); + + ExpressionNode buttonOffsetAnimation = progressNode * -100; + buttonVisual.StartAnimation("Offset.Y", buttonOffsetAnimation); + } + + private void Page_SizeChanged(object sender, SizeChangedEventArgs e) + { + if (_blurredBackgroundImageVisual != null) + { + _blurredBackgroundImageVisual.Size = new Vector2((float)OverlayRectangle.ActualWidth, (float)OverlayRectangle.ActualHeight); + } + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/SpringyImage/SpringyImage.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/SpringyImage/SpringyImage.xaml new file mode 100644 index 000000000..98aaf2628 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/SpringyImage/SpringyImage.xaml @@ -0,0 +1,24 @@ + + + + + + + + + Spring Properties + Damping Ratio + + Period (in sec) + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/SpringyImage/SpringyImage.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/SpringyImage/SpringyImage.xaml.cs new file mode 100644 index 000000000..33a2ff22c --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/SpringyImage/SpringyImage.xaml.cs @@ -0,0 +1,180 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; + +using System; +using System.Numerics; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Input; + +using EF = ExpressionBuilder.ExpressionFunctions; +using EV = ExpressionBuilder.ExpressionValues; + +namespace CompositionSampleGallery +{ + + public sealed partial class SpringyImage : SamplePage + { + public SpringyImage() + { + this.InitializeComponent(); + Setup(); + } + + public static string StaticSampleName => "Springy Image"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Animate the Scale property of a Visual with a Spring-based Animation."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868957"; + + private void Setup() + { + // Grab the existing Compositor for this page + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + + // Define the Spring Animation that will be used to animate images + // Create a SpringVector3Animation since we will be animating Scale + _springAnimation = _compositor.CreateSpringVector3Animation(); + _springAnimation.DampingRatio = 0.65f; + _springAnimation.Period = TimeSpan.FromSeconds(.05); + + // Track if an image has been clicked, initially set to false + _imageClickScaleMode = false; + + // Setup the Expressions to manage list layout + SetupImageList(); + } + + private void SetupImageList() + { + // Note: Translation is an additive value to the Offset property when defining the final position of a backed visual of a UIElement + + // This Expression defines an equation that changes the Y Translation of an image based on the scale of its vertical neighbor image. + // As the scale of an image grows, the images below it will dynamically move down. + // The equation is built by summing up two different deltas caused by a scale animation: + // 1) The delta caused by the image directly above the target scaling to a value > 1 (should have no effect if scale == 1) + // 2) Any additional delta caused by if the image above has translated down because the image above it (or higher up) has scaled up + // [Will either be a large scale from Click, or medium scale if on hover] + // Note: 120 represents the height of the images + the gap between them + + var visualPlaceHolder = EV.Reference.CreateVisualReference("visual"); + var factor = EV.Constant.CreateConstantScalar("factor"); + _translationDeltaExp = ((visualPlaceHolder.Scale.Y - 1) * (float)image.Height) + + EF.Conditional( + ((visualPlaceHolder.Translation.Y / (120 * factor)) > 1), + (EV.Constant.CreateConstantScalar("largeScaleDiff")), + visualPlaceHolder.Translation.Y % (120 * factor) + ); + + // Activate Translation property for Visuals backing a UIElement + TranslationSetup(image); + TranslationSetup(image2); + TranslationSetup(image3); + TranslationSetup(image4); + + // Setup the Expression on the Y Translation property for images 2 - 4. + // Pass in the target image that the Expression gets applied to, the image above it for reference and images indexed position + // Note: Since the first image does not have an image above it, do not need to apply the Expression to it + StartAnimationHelper(image2, image, 1); + StartAnimationHelper(image3, image2, 2); + StartAnimationHelper(image4, image3, 3); + } + + private void TranslationSetup(UIElement element) + { + // Activate Translation property on the UIElement images + ElementCompositionPreview.SetIsTranslationEnabled(element, true); + var visual = ElementCompositionPreview.GetElementVisual(element); + visual.Properties.InsertVector3("Translation", new Vector3(0)); + } + + private void StartAnimationHelper(UIElement targetImage, UIElement imageAbove, int indexFactor) + { + // Retrieve references to the target Visual of the Expression along with the vertical neighbor we need to reference + var referenceVisual = ElementCompositionPreview.GetElementVisual(imageAbove); + var targetVisual = ElementCompositionPreview.GetElementVisual(targetImage); + + // Set the references to the Expression and Start it on the target Visual + _translationDeltaExp.SetReferenceParameter("visual", referenceVisual); + _translationDeltaExp.SetScalarParameter("factor", indexFactor); + _translationDeltaExp.SetScalarParameter("largeScaleDiff", 2 * (float)image.Height); + targetVisual.StartAnimation("Translation.Y", _translationDeltaExp); + } + + private void Button_Click(object sender, RoutedEventArgs e) + { + float dampInputResult; + TimeSpan periodInputResult; + + // Check input and assign if valid + if (float.TryParse(DampingInput.Text, out dampInputResult)) + { + _springAnimation.DampingRatio = dampInputResult; + } + if (TimeSpan.TryParse(PeriodInput.Text, out periodInputResult)) + { + _springAnimation.Period = periodInputResult; + } + } + + private void image_PointerEntered(object sender, PointerRoutedEventArgs e) + { + // Animating the image only if not been previously clicked + if (!_imageClickScaleMode) + { + _springAnimation.FinalValue = new Vector3(1.5f); + var visual = ElementCompositionPreview.GetElementVisual((UIElement)sender); + visual.StartAnimation("Scale", _springAnimation); + } + } + + private void image_PointerExited(object sender, PointerRoutedEventArgs e) + { + // Animating the image only if not been previously clicked + if (!_imageClickScaleMode) + { + _springAnimation.FinalValue = new Vector3(1f); + var visual = ElementCompositionPreview.GetElementVisual((UIElement)sender); + visual.StartAnimation("Scale", _springAnimation); + } + } + + private void image_PointerReleased(object sender, PointerRoutedEventArgs e) + { + if (!_imageClickScaleMode) + { + // If not previously clicked, then scale to large size + _imageClickScaleMode = true; + _springAnimation.FinalValue = new Vector3(3.0f); + } + else + { + // Else scale to original size + _imageClickScaleMode = false; + _springAnimation.FinalValue = new Vector3(1f); + } + var visual = ElementCompositionPreview.GetElementVisual((UIElement)sender); + visual.StartAnimation("Scale", _springAnimation); + } + + private Compositor _compositor; + private SpringVector3NaturalMotionAnimation _springAnimation; + private ExpressionNode _translationDeltaExp; + private bool _imageClickScaleMode; + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/Behaviors/InteractionBehavior.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/Behaviors/InteractionBehavior.cs new file mode 100644 index 000000000..303f86a45 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/Behaviors/InteractionBehavior.cs @@ -0,0 +1,283 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; + +#if Microsoft_Xaml_Behaviors_Uwp_Managed // The behavior nuget package has depenedency on windows.ui.xaml +using Microsoft.Xaml.Interactivity; +#endif + +using System; +using System.Numerics; + +using Microsoft.UI.Composition; +using Microsoft.UI.Composition.Interactions; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; + +using EF = ExpressionBuilder.ExpressionFunctions; + +namespace CompositionSampleGallery.Samples.SDK_14393.SwipeScroller.Behaviors +{ + class InteractionBehavior : DependencyObject, IInteractionTrackerOwner + { + #region setup + + public FrameworkElement InfoContent + { + get { return (FrameworkElement)GetValue(InfoContentProperty); } + set { SetValue(InfoContentProperty, value); } + } + + public static readonly DependencyProperty InfoContentProperty = + DependencyProperty.Register("InfoContent", typeof(FrameworkElement), typeof(InteractionBehavior), new PropertyMetadata(null)); + + public FrameworkElement InfoContainer + { + get { return (FrameworkElement)GetValue(InfoContainerProperty); } + set { SetValue(InfoContainerProperty, value); } + } + + public static readonly DependencyProperty InfoContainerProperty = + DependencyProperty.Register("InfoContainer", typeof(FrameworkElement), typeof(InteractionBehavior), new PropertyMetadata(null)); + + public FrameworkElement PhotoContent + { + get { return (FrameworkElement)GetValue(PhotoContentProperty); } + set { SetValue(PhotoContentProperty, value); } + } + + public static readonly DependencyProperty PhotoContentProperty = + DependencyProperty.Register("PhotoContent", typeof(FrameworkElement), typeof(InteractionBehavior), new PropertyMetadata(null)); + + public FrameworkElement HittestContent + { + get { return (FrameworkElement)GetValue(HittestContentProperty); } + set { SetValue(HittestContentProperty, value); } + } + + public static readonly DependencyProperty HittestContentProperty = + DependencyProperty.Register("HittestContent", typeof(FrameworkElement), typeof(InteractionBehavior), new PropertyMetadata(null, OnHittestContentChanged)); + + private void ImageContainerSizeChanged(object sender, SizeChangedEventArgs e) + { + ConfigureInteractionTracker(); + } + #endregion + private void ConfigureInteractionTracker() + { + if (InfoContent == null) return; + if (HittestContent == null) return; + + // Configure hittestVisual size for the interaction (size needs to be explicitly set in order for the hittesting to work correctly due to XAML-COMP interop policy) + _hittestVisual.Size = new Vector2((float)HittestContent.ActualWidth, (float)HittestContent.ActualHeight); + + _props = _compositor.CreatePropertySet(); + + Visual infoVisual = ElementCompositionPreview.GetElementVisual(InfoContent); + Visual photoVisual = ElementCompositionPreview.GetElementVisual(PhotoContent); + photoVisual.Size = new Vector2((float)PhotoContent.ActualWidth, (float)PhotoContent.ActualHeight); + + photoVisual.CenterPoint = new Vector3((float)PhotoContent.ActualWidth * .5f, (float)PhotoContent.ActualHeight * .5f, 0f); + infoVisual.CenterPoint = new Vector3((float)InfoContent.ActualWidth * .5f, (float)InfoContent.ActualHeight * .5f, 0f); + + VisualInteractionSource interactionSource = VisualInteractionSource.Create(_hittestVisual); + + //Configure for y-direction panning + interactionSource.PositionYSourceMode = InteractionSourceMode.EnabledWithInertia; + + //Create tracker and associate interaction source + _tracker.InteractionSources.Add(interactionSource); + + //Configure tracker boundaries + _tracker.MaxPosition = new Vector3((float)HittestContent.ActualHeight); + + SpriteVisual shadowVisual = _compositor.CreateSpriteVisual(); + shadowVisual.Size = photoVisual.Size; + ElementCompositionPreview.SetElementChildVisual(InfoContainer, shadowVisual); + + ConfigureAnimations(photoVisual, infoVisual, shadowVisual); + + ConfigureRestingPoints(); + + HittestContent.PointerPressed += (s, a) => + { + // Capture the touch manipulation to the InteractionTracker for automatic handling + if (a.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch) + { + try + { + interactionSource.TryRedirectForManipulation(a.GetCurrentPoint(s as UIElement)); + } + catch (Exception) + { + // Ignoring the failed redirect to prevent app crashing + } + } + // Update the InteractionTracker's position to change between min and max for other input types + else + { + float direction = 1; + if (_isExpanded) + { + direction = -1; + } + _tracker.TryUpdatePositionWithAdditionalVelocity(new Vector3(0f, direction * 1000f, 0f)); + } + }; + } + + private void ConfigureRestingPoints() + { + // Setup a possible inertia endpoint (snap point) for the InteractionTracker's minimum position + var endpoint1 = InteractionTrackerInertiaRestingValue.Create(_compositor); + + // Use this endpoint when the natural resting position of the interaction is less than the halfway point + var trackerTarget = ExpressionValues.Target.CreateInteractionTrackerTarget(); + endpoint1.SetCondition(trackerTarget.NaturalRestingPosition.Y < (trackerTarget.MaxPosition.Y - trackerTarget.MinPosition.Y) / 2); + + // Set the result for this condition to make the InteractionTracker's y position the minimum y position + endpoint1.SetRestingValue(trackerTarget.MinPosition.Y); + + // Setup a possible inertia endpoint (snap point) for the InteractionTracker's maximum position + var endpoint2 = InteractionTrackerInertiaRestingValue.Create(_compositor); + + //Use this endpoint when the natural resting position of the interaction is more than the halfway point + endpoint2.SetCondition(trackerTarget.NaturalRestingPosition.Y >= (trackerTarget.MaxPosition.Y - trackerTarget.MinPosition.Y) / 2); + + //Set the result for this condition to make the InteractionTracker's y position the maximum y position + endpoint2.SetRestingValue(trackerTarget.MaxPosition.Y); + + _tracker.ConfigurePositionYInertiaModifiers(new InteractionTrackerInertiaModifier[] { endpoint1, endpoint2 }); + } + + private void ConfigureAnimations(Visual photoVisual, Visual infoVisual, SpriteVisual shadowVisual) + { + // Create a drop shadow to be animated by the manipulation + var shadow = _compositor.CreateDropShadow(); + shadowVisual.Shadow = shadow; + _props.InsertScalar("progress", 0); + + // Create an animation that tracks the progress of the manipulation and stores it in a the PropertySet _props + var trackerNode = _tracker.GetReference(); + _props.StartAnimation("progress", trackerNode.Position.Y / trackerNode.MaxPosition.Y); + + // Create an animation that scales up the infoVisual based on the manipulation progress + var propSetProgress = _props.GetReference().GetScalarProperty("progress"); + infoVisual.StartAnimation("Scale", EF.Vector3(1, 1, 1) * EF.Lerp(1, 1.2f, propSetProgress)); + + // Create an animation that changes the offset of the photoVisual and shadowVisual based on the manipulation progress + var photoOffsetExp = -120f * _props.GetReference().GetScalarProperty("Progress"); + photoVisual.StartAnimation("offset.y", photoOffsetExp); + shadowVisual.StartAnimation("offset.y", photoOffsetExp); + + // Create an animation that fades in the info visual based on the manipulation progress + infoVisual.StartAnimation("opacity", EF.Lerp(0, 1, _props.GetReference().GetScalarProperty("Progress"))); + shadow.StartAnimation("blurradius", EF.Lerp(1, 50, _props.GetReference().GetScalarProperty("Progress"))); + } + + private static void OnHittestContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (e.OldValue != e.NewValue) + { + var thisBehavior = d as InteractionBehavior; + + if (thisBehavior != null) + { + var oldElement = e.OldValue as FrameworkElement; + var newElement = e.NewValue as FrameworkElement; + + if (oldElement != null) + { + oldElement.SizeChanged -= thisBehavior.ImageContainerSizeChanged; + } + + if (newElement != null) + { + newElement.SizeChanged += thisBehavior.ImageContainerSizeChanged; + thisBehavior.ConfigureInteractionTracker(); + } + } + } + } + + #region Callbacks + public void CustomAnimationStateEntered(InteractionTracker sender, InteractionTrackerCustomAnimationStateEnteredArgs args) + { + + } + + public void IdleStateEntered(InteractionTracker sender, InteractionTrackerIdleStateEnteredArgs args) + { + + } + + public void InertiaStateEntered(InteractionTracker sender, InteractionTrackerInertiaStateEnteredArgs args) + { + + } + + public void InteractingStateEntered(InteractionTracker sender, InteractionTrackerInteractingStateEnteredArgs args) + { + + } + + public void RequestIgnored(InteractionTracker sender, InteractionTrackerRequestIgnoredArgs args) + { + + } + + public void ValuesChanged(InteractionTracker sender, InteractionTrackerValuesChangedArgs args) + { + // Store whether the item is expanded in order to know whether a mouse click should expand or collapse + _isExpanded = (args.Position.Y > 0); + } + #endregion //Callbacks + + public void Attach(DependencyObject associatedObject) + { + AssociatedObject = associatedObject; + _hittestVisual = ElementCompositionPreview.GetElementVisual(HittestContent); + + if (_compositor == null) + { + _compositor = _hittestVisual.Compositor; + } + _tracker = InteractionTracker.CreateWithOwner(_compositor, this); + _isExpanded = false; + } + + public void Detach() + { + _tracker.Dispose(); + _tracker = null; + _hittestVisual = null; + _compositor = null; + _props = null; + } + + DependencyObject AssociatedObject { get; set; } + + //DependencyObject AssociatedObject + //{ + // get { return this.AssociatedObject; } + //} + + InteractionTracker _tracker; + CompositionPropertySet _props; + Compositor _compositor; + Visual _hittestVisual; + bool _isExpanded; + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/Models/PhotoModel.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/Models/PhotoModel.cs new file mode 100644 index 000000000..1047a47c6 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/Models/PhotoModel.cs @@ -0,0 +1,25 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; + +namespace CompositionSampleGallery.Samples.SDK_14393.SwipeScroller.Models +{ + class PhotoModel + { + public String Name { get; set; } + public String Info { get; set; } + public Uri Image { get; set; } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/SwipeScroller.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/SwipeScroller.cs new file mode 100644 index 000000000..cf5a454d7 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/SwipeScroller.cs @@ -0,0 +1,57 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using CompositionSampleGallery.Samples.SDK_14393.SwipeScroller.Models; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +using Microsoft.UI.Xaml; +using CompositionSampleGallery.Shared; + +namespace CompositionSampleGallery +{ + public sealed partial class SwipeScroller : SamplePage + { + public SwipeScroller() + { + this.InitializeComponent(); + Model = new LocalDataSource(); + } + + public static string StaticSampleName => "Swipe Scroller"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use InteractionTracker to add a swipe behavior to items inside a ScrollViewer"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869004"; + + public LocalDataSource Model { set; get; } + + private void Page_Loaded(object sender, RoutedEventArgs e) + { + List list = new List(); + foreach (Thumbnail thumbnail in Model.AggregateDataSources(new ObservableCollection[] { Model.Landscapes, Model.Nature })) + { + list.Add(new PhotoModel() + { + Name = thumbnail.Name, + Image = new Uri(thumbnail.ImageUrl), + Info = thumbnail.Description + }); + } + Items.ItemsSource = list; + } + } +} + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/SwipeScroller.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/SwipeScroller.xaml new file mode 100644 index 000000000..cf4144597 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/SwipeScroller/SwipeScroller.xaml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TextShimmer/TextShimmer.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/TextShimmer/TextShimmer.xaml new file mode 100644 index 000000000..3d35aba55 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TextShimmer/TextShimmer.xaml @@ -0,0 +1,18 @@ + + + + + + Text Shimmer + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TextShimmer/TextShimmer.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/TextShimmer/TextShimmer.xaml.cs new file mode 100644 index 000000000..59669a30d --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TextShimmer/TextShimmer.xaml.cs @@ -0,0 +1,66 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Numerics; + +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Hosting; + +namespace CompositionSampleGallery +{ + public sealed partial class TextShimmer : SamplePage + { + public TextShimmer() + { + this.InitializeComponent(); + this.Loaded += TextShimmer_Loaded; + } + + public static string StaticSampleName => "Text Shimmer"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Target a XAML UIElement with a Composition Light"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869005"; + + private void TextShimmer_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + //get interop compositor + _compositor = ElementCompositionPreview.GetElementVisual(TextBlock).Compositor; + + //get interop visual for XAML TextBlock + var text = ElementCompositionPreview.GetElementVisual(TextBlock); + + _pointLight = _compositor.CreatePointLight(); + _pointLight.Color = Colors.White; + _pointLight.CoordinateSpace = text; //set up co-ordinate space for offset + _pointLight.Targets.Add(text); //target XAML TextBlock + + //starts out to the left; vertically centered; light's z-offset is related to fontsize + _pointLight.Offset = new Vector3(-(float)TextBlock.ActualWidth, (float)TextBlock.ActualHeight / 2, (float)TextBlock.FontSize); + + //simple offset.X animation that runs forever + var animation = _compositor.CreateScalarKeyFrameAnimation(); + animation.InsertKeyFrame(1, 2 * (float)TextBlock.ActualWidth); + animation.Duration = TimeSpan.FromSeconds(3.3f); + animation.IterationBehavior = AnimationIterationBehavior.Forever; + + _pointLight.StartAnimation("Offset.X", animation); + } + + private Compositor _compositor; + private PointLight _pointLight; + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ThumbnailLighting/ThumbnailLighting.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/ThumbnailLighting/ThumbnailLighting.xaml new file mode 100644 index 000000000..2eadd9601 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ThumbnailLighting/ThumbnailLighting.xaml @@ -0,0 +1,55 @@ + + + + + + + + + + + Enable Mouse hover + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/ThumbnailLighting/ThumbnailLighting.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/ThumbnailLighting/ThumbnailLighting.xaml.cs new file mode 100644 index 000000000..a3aadaeff --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/ThumbnailLighting/ThumbnailLighting.xaml.cs @@ -0,0 +1,663 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using SamplesCommon; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Numerics; +using System.Threading.Tasks; + +using Windows.Foundation; +using Windows.Graphics.Effects; + +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Composition.Effects; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.Graphics.Canvas; +using Microsoft.Graphics.Canvas.Effects; +using CompositionSampleGallery.Shared; + +namespace CompositionSampleGallery +{ + public sealed partial class ThumbnailLighting : SamplePage + { + private Compositor _compositor; + private CompositionEffectFactory _effectFactory; + private AmbientLight _ambientLight; + private PointLight _pointLight; + private DistantLight _distantLight; + private SpotLight _spotLight; + private ManagedSurface _sphereNormalMap; + private ManagedSurface _edgeNormalMap; + + public enum LightingTypes + { + PointDiffuse, + PointSpecular, + SpotLightDiffuse, + SpotLightSpecular, + DistantDiffuse, + DistantSpecular, + } + + public ThumbnailLighting() + { + Model = new LocalDataSource(); + this.InitializeComponent(); + + // Get the current compositor + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + + + // + // Create the lights + // + + _ambientLight = _compositor.CreateAmbientLight(); + _pointLight = _compositor.CreatePointLight(); + _distantLight = _compositor.CreateDistantLight(); + _spotLight = _compositor.CreateSpotLight(); + } + + public static string StaticSampleName => "Thumbnail Lighting"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to apply Image Lighting to ListView Items. Switch between different combinations of light types(point, spot, distant) and lighting properties such as diffuse and specular. Click on a tile to flip it, or select mouse mode to track the mouse location."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761165"; + + public LocalDataSource Model { get; set; } + + private async void Page_Loaded(object sender, RoutedEventArgs e) + { + // Populate the light type combobox + IList lightList = new List(); + foreach (LightingTypes type in Enum.GetValues(typeof(LightingTypes))) + { + ComboBoxItem item = new ComboBoxItem(); + item.Tag = type; + item.Content = type.ToString(); + lightList.Add(item); + } + + LightingSelection.ItemsSource = lightList; + LightingSelection.SelectedIndex = 0; + + ThumbnailList.ItemsSource = Model.AggregateDataSources(new ObservableCollection[] { Model.Landscapes, Model.Nature} ); + + // + // Create the sperical normal map. The normals will give the appearance of a sphere, and the alpha channel is used + // for masking off the rectangular edges. + // + + _sphereNormalMap = await ImageLoader.Instance.LoadFromUriAsync(new Uri("ms-appx:///Assets/NormalMapsAndMasks/SphericalWithMask.png")); + _sphereNormalMap.Brush.Stretch = CompositionStretch.Fill; + + + // + // Create the flat normal map with beveled edges. This should give the appearance of slanting of the surface along + // the edges, flat in the middle. + // + + _edgeNormalMap = await ImageLoader.Instance.LoadFromUriAsync(new Uri("ms-appx:///Assets/NormalMapsAndMasks/BeveledEdges.jpg")); + _edgeNormalMap.Brush.Stretch = CompositionStretch.Fill; + + // Update the effect brushes now that the normal maps are available. + UpdateEffectBrush(); + } + + private void Page_Unloaded(object sender, RoutedEventArgs e) + { + if (_sphereNormalMap != null) + { + _sphereNormalMap.Dispose(); + _sphereNormalMap = null; + } + + if (_edgeNormalMap != null) + { + _edgeNormalMap.Dispose(); + _edgeNormalMap = null; + } + } + + private void UpdateEffectBrush() + { + if (ThumbnailList.ItemsPanelRoot != null) + { + foreach (ListViewItem item in ThumbnailList.ItemsPanelRoot.Children) + { + CompositionImage image = item.ContentTemplateRoot.GetFirstDescendantOfType(); + SetImageEffect(image); + } + } + } + + private void UpdateAnimations() + { + Vector2 sizeLightBounds = new Vector2((float)RootPanel.ActualWidth, (float)RootPanel.ActualHeight); + Vector3KeyFrameAnimation lightPositionAnimation; + ColorKeyFrameAnimation lightColorAnimation; + + ComboBoxItem item = LightingSelection.SelectedValue as ComboBoxItem; + switch ((LightingTypes)item.Tag) + { + case LightingTypes.PointDiffuse: + case LightingTypes.PointSpecular: + { + float zDistance = 50f; + + // Create the light position animation + lightPositionAnimation = _compositor.CreateVector3KeyFrameAnimation(); + lightPositionAnimation.InsertKeyFrame(0f, new Vector3(0f, 0f, zDistance)); + lightPositionAnimation.InsertKeyFrame(.25f, new Vector3(sizeLightBounds.X * .2f, sizeLightBounds.Y * .5f, zDistance)); + lightPositionAnimation.InsertKeyFrame(.50f, new Vector3(sizeLightBounds.X * .75f, sizeLightBounds.Y * .5f, zDistance)); + lightPositionAnimation.InsertKeyFrame(.75f, new Vector3(sizeLightBounds.X * .2f, sizeLightBounds.Y * .2f, zDistance)); + lightPositionAnimation.InsertKeyFrame(1f, new Vector3(0f, 0f, zDistance)); + lightPositionAnimation.Duration = TimeSpan.FromMilliseconds(7500); + lightPositionAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + + lightColorAnimation = _compositor.CreateColorKeyFrameAnimation(); + lightColorAnimation.InsertKeyFrame(0f, Colors.White); + lightColorAnimation.InsertKeyFrame(.33f, Colors.White); + lightColorAnimation.InsertKeyFrame(.66f, Colors.Yellow); + lightColorAnimation.InsertKeyFrame(1f, Colors.White); + lightColorAnimation.Duration = TimeSpan.FromMilliseconds(20000); + lightColorAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + + _pointLight.StartAnimation("Offset", lightPositionAnimation); + _pointLight.StartAnimation("Color", lightColorAnimation); + } + break; + + case LightingTypes.SpotLightDiffuse: + case LightingTypes.SpotLightSpecular: + { + // Create the light position animation + lightPositionAnimation = _compositor.CreateVector3KeyFrameAnimation(); + lightPositionAnimation.InsertKeyFrame(0f, new Vector3(0f, 0f, 100f)); + lightPositionAnimation.InsertKeyFrame(.33f, new Vector3(sizeLightBounds.X * .5f, sizeLightBounds.Y * .5f, 200f)); + lightPositionAnimation.InsertKeyFrame(.66f, new Vector3(sizeLightBounds.X, sizeLightBounds.Y * .5f, 400f)); + lightPositionAnimation.InsertKeyFrame(1f, new Vector3(0f, 0f, 100f)); + lightPositionAnimation.Duration = TimeSpan.FromMilliseconds(7500); + lightPositionAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + + lightColorAnimation = _compositor.CreateColorKeyFrameAnimation(); + lightColorAnimation.InsertKeyFrame(0f, Colors.White); + lightColorAnimation.InsertKeyFrame(.33f, Colors.White); + lightColorAnimation.InsertKeyFrame(.66f, Colors.Yellow); + lightColorAnimation.InsertKeyFrame(1f, Colors.White); + lightColorAnimation.Duration = TimeSpan.FromMilliseconds(20000); + lightColorAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + + _spotLight.StartAnimation("Offset", lightPositionAnimation); + _spotLight.StartAnimation("InnerConeColor", lightColorAnimation); + } + break; + + case LightingTypes.DistantDiffuse: + case LightingTypes.DistantSpecular: + { + // Animate the light direction + Vector3 position = new Vector3(0, 0, 100); + float offCenter = 700f; + + Vector3KeyFrameAnimation lightDirectionAnimation = _compositor.CreateVector3KeyFrameAnimation(); + lightDirectionAnimation.InsertKeyFrame(0f, Vector3.Normalize(new Vector3(0,0,0) - position)); + lightDirectionAnimation.InsertKeyFrame(.25f, Vector3.Normalize(new Vector3(offCenter, 0, 0) - position)); + lightDirectionAnimation.InsertKeyFrame(.5f, Vector3.Normalize(new Vector3(-offCenter, offCenter, 0) - position)); + lightDirectionAnimation.InsertKeyFrame(.75f, Vector3.Normalize(new Vector3(0, -offCenter, 0) - position)); + lightDirectionAnimation.InsertKeyFrame(1f, Vector3.Normalize(new Vector3(0, 0, 0) - position)); + lightDirectionAnimation.Duration = TimeSpan.FromMilliseconds(7500); + lightDirectionAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + + _distantLight.StartAnimation("Direction", lightDirectionAnimation); + } + break; + + default: + break; + } + } + + private void StopAnimations() + { + ComboBoxItem item = LightingSelection.SelectedValue as ComboBoxItem; + switch ((LightingTypes)item.Tag) + { + case LightingTypes.PointDiffuse: + case LightingTypes.PointSpecular: + _pointLight.StopAnimation("Offset"); + _pointLight.StopAnimation("Color"); + break; + + case LightingTypes.SpotLightDiffuse: + case LightingTypes.SpotLightSpecular: + _spotLight.StopAnimation("Offset"); + _spotLight.StopAnimation("InnerConeColor"); + break; + + case LightingTypes.DistantDiffuse: + case LightingTypes.DistantSpecular: + _distantLight.StopAnimation("Direction"); + break; + + default: + break; + } + } + + private void SetImageEffect(CompositionImage image) + { + // Create the effect brush and bind the normal map + CompositionEffectBrush brush = _effectFactory.CreateBrush(); + + ComboBoxItem item = LightingSelection.SelectedValue as ComboBoxItem; + switch ((LightingTypes)item.Tag) + { + case LightingTypes.SpotLightSpecular: + case LightingTypes.PointSpecular: + case LightingTypes.DistantDiffuse: + case LightingTypes.DistantSpecular: + brush.SetSourceParameter("NormalMap", _sphereNormalMap == null ? null : _sphereNormalMap.Brush); + break; + default: + brush.SetSourceParameter("NormalMap", _edgeNormalMap == null ? null : _edgeNormalMap.Brush); + break; + } + + // Update the CompositionImage to use the custom effect brush + image.Brush = brush; + } + + private void ListView_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args) + { + CompositionImage image = args.ItemContainer.ContentTemplateRoot.GetFirstDescendantOfType(); + Thumbnail thumbnail = args.Item as Thumbnail; + Uri uri = new Uri(thumbnail.ImageUrl); + + // Setup the brush for this image + SetImageEffect(image); + + // Update the image URI + image.Source = uri; + } + + private void ThumbnailList_SizeChanged(object sender, SizeChangedEventArgs e) + { + UpdateAnimations(); + } + + private void LightingSelection_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + UpdateLightingEffect(); + } + + private void UpdateLightingEffect() + { + _ambientLight.Targets.RemoveAll(); + _pointLight.Targets.RemoveAll(); + _distantLight.Targets.RemoveAll(); + _spotLight.Targets.RemoveAll(); + + ComboBoxItem item = LightingSelection.SelectedValue as ComboBoxItem; + switch ((LightingTypes)item.Tag) + { + case LightingTypes.PointDiffuse: + { + // + // Result = Ambient + Diffuse + // Result = (Image) + (.75 * Diffuse color) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.Add, + Sources = + { + new CompositionEffectSourceParameter("ImageSource"), + new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = .75f, + SpecularAmount = 0, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + } + }; + + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + // Set the light coordinate space and add the target + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _pointLight.CoordinateSpace = lightRoot; + _pointLight.Targets.Add(lightRoot); + } + break; + + case LightingTypes.PointSpecular: + { + // + // Result = Ambient + Diffuse + Specular + // Result = (Image * .6) + (Image * Diffuse color) + (Specular color) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.DestinationIn, + Sources = + { + new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + Source1Amount = 1, + Source2Amount = 1, + MultiplyAmount = 0, + + Source1 = new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + MultiplyAmount = 1, + Source1Amount = 0, + Source2Amount = 0, + Source1 = new CompositionEffectSourceParameter("ImageSource"), + Source2 = new SceneLightingEffect() + { + AmbientAmount = .6f, + DiffuseAmount = 1f, + SpecularAmount = 0f, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + Source2 = new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = 0f, + SpecularAmount = 1f, + SpecularShine = 100, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + new CompositionEffectSourceParameter("NormalMap"), + } + }; + + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + // Set the light coordinate space and add the target + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _ambientLight.Targets.Add(lightRoot); + _pointLight.CoordinateSpace = lightRoot; + _pointLight.Targets.Add(lightRoot); + } + break; + + case LightingTypes.SpotLightDiffuse: + { + // + // Result = Ambient + Diffuse + // Result = Image + (Diffuse color * .75) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.Add, + Sources = + { + new CompositionEffectSourceParameter("ImageSource"), + new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = .75f, + SpecularAmount = 0, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + } + }; + + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + // Set the light coordinate space and add the target + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _spotLight.CoordinateSpace = lightRoot; + _spotLight.Targets.Add(lightRoot); + _spotLight.InnerConeAngle = (float)(Math.PI / 4); + _spotLight.OuterConeAngle = (float)(Math.PI / 3.5); + _spotLight.Direction = new Vector3(0, 0, -1); + }; + break; + + case LightingTypes.SpotLightSpecular: + { + // + // Result = Ambient + Diffuse + Specular + // Result = (Image * .6) + (Image * Diffuse color) + (Specular color) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.DestinationIn, + Sources = + { + new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + Source1Amount = 1, + Source2Amount = 1, + MultiplyAmount = 0, + + Source1 = new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + MultiplyAmount = 1, + Source1Amount = 0, + Source2Amount = 0, + Source1 = new CompositionEffectSourceParameter("ImageSource"), + Source2 = new SceneLightingEffect() + { + AmbientAmount = .6f, + DiffuseAmount = 1f, + SpecularAmount = 0f, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + Source2 = new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = 0f, + SpecularAmount = 1f, + SpecularShine = 100, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + new CompositionEffectSourceParameter("NormalMap"), + } + }; + + // Create the effect factory + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + // Set the light coordinate space and add the target + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _ambientLight.Targets.Add(lightRoot); + _spotLight.CoordinateSpace = lightRoot; + _spotLight.Targets.Add(lightRoot); + _spotLight.InnerConeAngle = (float)(Math.PI / 4); + _spotLight.OuterConeAngle = (float)(Math.PI / 3.5); + _spotLight.Direction = new Vector3(0, 0, -1); + }; + break; + + case LightingTypes.DistantDiffuse: + { + // + // Result = Ambient + Diffuse + // Result = (Image) + (.5 * Diffuse color) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.DestinationIn, + Sources = + { + new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.Add, + Sources = + { + new CompositionEffectSourceParameter("ImageSource"), + new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = .5f, + SpecularAmount = 0, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + } + }, + new CompositionEffectSourceParameter("NormalMap"), + } + }; + + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _distantLight.CoordinateSpace = lightRoot; + _distantLight.Targets.Add(lightRoot); + }; + break; + + case LightingTypes.DistantSpecular: + { + // + // Result = Diffuse + Specular + // Result = (Image * Diffuse color) + (Specular color) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.DestinationIn, + Sources = + { + new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + Source1Amount = 1, + Source2Amount = 1, + MultiplyAmount = 0, + + Source1 = new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + MultiplyAmount = 1, + Source1Amount = 0, + Source2Amount = 0, + Source1 = new CompositionEffectSourceParameter("ImageSource"), + Source2 = new SceneLightingEffect() + { + AmbientAmount = .6f, + DiffuseAmount = 1f, + SpecularAmount = 0f, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + Source2 = new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = 0f, + SpecularAmount = 1f, + SpecularShine = 100, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + new CompositionEffectSourceParameter("NormalMap"), + } + }; + + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _distantLight.CoordinateSpace = lightRoot; + _distantLight.Targets.Add(lightRoot); + }; + break; + + default: + break; + } + + // Update the animations + UpdateAnimations(); + + // Update all the image to have the new effect + UpdateEffectBrush(); + } + + private void ThumbnailList_PointerMoved(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e) + { + Vector2 offset = e.GetCurrentPoint(ThumbnailList).Position.ToVector2(); + ComboBoxItem item = LightingSelection.SelectedValue as ComboBoxItem; + switch ((LightingTypes)item.Tag) + { + case LightingTypes.PointDiffuse: + case LightingTypes.PointSpecular: + _pointLight.Offset = new Vector3(offset.X, offset.Y, 75); + break; + + case LightingTypes.SpotLightDiffuse: + case LightingTypes.SpotLightSpecular: + _spotLight.Offset = new Vector3(offset.X, offset.Y, 150); + break; + + case LightingTypes.DistantDiffuse: + case LightingTypes.DistantSpecular: + Vector3 position = new Vector3((float)ThumbnailList.ActualWidth / 2, (float)ThumbnailList.ActualHeight / 2, 200); + Vector3 lookAt = new Vector3((float)ThumbnailList.ActualWidth - offset.X, (float)ThumbnailList.ActualHeight - offset.Y, 0); + _distantLight.Direction = Vector3.Normalize(lookAt - position); + break; + + default: + break; + } + } + + private void CheckBox_Checked(object sender, RoutedEventArgs e) + { + if(MouseHover.IsChecked == true) + { + ThumbnailList.PointerMoved += ThumbnailList_PointerMoved; + StopAnimations(); + } + else + { + ThumbnailList.PointerMoved -= ThumbnailList_PointerMoved; + UpdateAnimations(); + } + } + + private void ThumbnailList_ItemClick(object sender, ItemClickEventArgs e) + { + ListViewItem listItem = (ListViewItem)ThumbnailList.ContainerFromItem(e.ClickedItem); + CompositionImage image = listItem.ContentTemplateRoot.GetFirstDescendantOfType(); + + // Flip each thumbnail as it's clicked + SpriteVisual sprite = image.SpriteVisual; + sprite.RotationAxis = new Vector3(1, 0, 0); + sprite.CenterPoint = new Vector3(sprite.Size.X / 2, sprite.Size.Y / 2, 0); + + ScalarKeyFrameAnimation rotateAnimation = _compositor.CreateScalarKeyFrameAnimation(); + rotateAnimation.InsertKeyFrame(0, 0); + rotateAnimation.InsertKeyFrame(1, 360); + rotateAnimation.Duration = TimeSpan.FromSeconds(2); + sprite.StartAnimation("RotationAngleInDegrees", rotateAnimation); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorBloom/ColorBloomTransition.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorBloom/ColorBloomTransition.xaml new file mode 100644 index 000000000..2d52617a4 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorBloom/ColorBloomTransition.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorBloom/ColorBloomTransition.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorBloom/ColorBloomTransition.xaml.cs new file mode 100644 index 000000000..ab39bcc1f --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorBloom/ColorBloomTransition.xaml.cs @@ -0,0 +1,185 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; + +using Windows.Foundation.Collections; + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI; + +namespace CompositionSampleGallery +{ + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class ColorBloomTransition : SamplePage + { + + public static string StaticSampleName => "Color bloom"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use Visuals and Animations to create a color bloom effect during page or state transitions. Click on one of the items in the Pivot control to trigger the color bloom effect."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761176"; + + #region Private member variables + + PropertySet _colorsByPivotItem; + ColorBloomTransitionHelper transition; + Queue pendingTransitions = new Queue(); + #endregion + + + #region Ctor + + public ColorBloomTransition() + { + this.InitializeComponent(); + + this.InitializeColors(); + + this.InitializeTransitionHelper(); + + this.Unloaded += ColorBloomTransition_Unloaded; + } + + #endregion + + + #region Initializers + + /// + /// Prepopulate a set of colors, indexed by where on the Pivot they will play a role + /// + private void InitializeColors() + { + _colorsByPivotItem = new PropertySet(); + _colorsByPivotItem.Add("Pictures", Colors.Orange); + _colorsByPivotItem.Add("ContactInfo", Colors.Lavender); + _colorsByPivotItem.Add("Download", Colors.GreenYellow); + _colorsByPivotItem.Add("Comment", Colors.DeepSkyBlue); + } + + + /// + /// All of the Color Bloom transition functionality is encapsulated in this handy helper + /// which we will init once + /// + private void InitializeTransitionHelper() + { + // we pass in the UIElement that will host our Visuals + transition = new ColorBloomTransitionHelper(hostForVisual); + + // when the transition completes, we need to know so we can update other property values + transition.ColorBloomTransitionCompleted += ColorBloomTransitionCompleted; + } + + + #endregion + + + #region Event handlers + + /// + /// Event handler for the Click event on the header. + /// In response this function will trigger a Color Bloom transition animation. + /// This is achieved by creating a circular solid colored visual directly underneath the + /// Pivot header which was clicked, and animating its scale so that it floods a designated bounding box. + /// + private void Header_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + var header = sender as AppBarButton; + + var headerPosition = header.TransformToVisual(UICanvas).TransformPoint(new Windows.Foundation.Point(0d, 0d)); + + var initialBounds = new Windows.Foundation.Rect() // maps to a rectangle the size of the header + { + Width = header.RenderSize.Width, + Height = header.RenderSize.Height, + X = headerPosition.X, + Y = headerPosition.Y + }; + + var finalBounds = new Windows.Foundation.Rect() + { + Width = this.ActualSize.X, + Height = this.ActualSize.Y, + X = 0, + Y = 0 + }; + + transition.Start((Windows.UI.Color)_colorsByPivotItem[header.Name], // the color for the circlular bloom + initialBounds, // the initial size and position + finalBounds); // the area to fill over the animation duration + + // Add item to queue of transitions + var pivotItem = (AppBarButton)rootGridView.Items.Single(i => ((AppBarButton)i).Name.Equals(header.Name)); + pendingTransitions.Enqueue(pivotItem); + + // Make the content visible immediately, when first clicked. Subsequent clicks will be handled by Pivot Control + var content = (FrameworkElement)pivotItem; + if (content.Visibility == Visibility.Collapsed) + { + content.Visibility = Visibility.Visible; + } + } + + + /// + /// Updates the background of the layout panel to the same color whose transition animation just completed. + /// + private void ColorBloomTransitionCompleted(object sender, EventArgs e) + { + // Grab an item off the pending transitions queue + var item = pendingTransitions.Dequeue(); + + // now remember, that bloom animation was just transitional + // so we need to explicitly set the correct color as background of the layout panel + var header = (AppBarButton)item; + UICanvas.Background = new SolidColorBrush((Windows.UI.Color)_colorsByPivotItem[header.Name]); + } + + + /// + /// In response to a XAML layout event on the Grid (named UICanvas) we will apply a clip + /// to ensure all Visual animations stay within the bounds of the Grid, and doesn't bleed into + /// the top level Frame belonging to the Sample Gallery. Probably not a factor in most other cases. + /// + private void UICanvas_SizeChanged(object sender, SizeChangedEventArgs e) + { + var uiCanvasLocation = UICanvas.TransformToVisual(UICanvas).TransformPoint(new Windows.Foundation.Point(0d, 0d)); + var clip = new RectangleGeometry() + { + Rect = new Windows.Foundation.Rect(uiCanvasLocation, e.NewSize) + }; + UICanvas.Clip = clip; + } + + /// + /// Cleans up remaining surfaces when the page is unloaded. + /// + private void ColorBloomTransition_Unloaded(object sender, RoutedEventArgs e) + { + transition.Dispose(); + } + + #endregion + + + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorBloom/ColorBloomTransitionHelper.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorBloom/ColorBloomTransitionHelper.cs new file mode 100644 index 000000000..5f6c19d22 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorBloom/ColorBloomTransitionHelper.cs @@ -0,0 +1,268 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +//using Microsoft.Graphics.Canvas; +//using Microsoft.Graphics.Canvas.Effects; +using SamplesCommon; + +using System; +using System.Numerics; +using Windows.Foundation; + +using Windows.UI; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI; +using Microsoft.Graphics.Canvas.Effects; +using Microsoft.Graphics.Canvas; + +namespace CompositionSampleGallery +{ + /// + /// A helper class encapsulating the function and visuals for a Color Bloom transition animation. + /// + public class ColorBloomTransitionHelper : IDisposable + { + #region Member variables + + UIElement hostForVisual; + Compositor _compositor; + ContainerVisual _containerForVisuals; + ScalarKeyFrameAnimation _bloomAnimation; + ManagedSurface _circleMaskSurface; + + #endregion + + + #region Ctor + + /// + /// Creates an instance of the ColorBloomTransitionHelper. + /// Any visuals to be later created and animated will be hosted within the specified UIElement. + /// + public ColorBloomTransitionHelper(UIElement hostForVisual) + { + this.hostForVisual = hostForVisual; + + // we have an element in the XAML tree that will host our Visuals + var visual = ElementCompositionPreview.GetElementVisual(hostForVisual); + _compositor = visual.Compositor; + + // create a container + // adding children to this container adds them to the live visual tree + _containerForVisuals = _compositor.CreateContainerVisual(); + ElementCompositionPreview.SetElementChildVisual(hostForVisual, _containerForVisuals); + + // Create the circle mask + _circleMaskSurface = ImageLoader.Instance.LoadCircle(200, Microsoft.UI.Colors.White); + } + #endregion + + + #region Public API surface + + public delegate void ColorBloomTransitionCompletedEventHandler(object sender, EventArgs e); + + /// + /// Indicates that the color bloom transition has completed. + /// + public event ColorBloomTransitionCompletedEventHandler ColorBloomTransitionCompleted; + + + /// + /// Starts the color bloom transition using the specified color and boundary sizes. + /// + /// The bloom is achieved by creating a circular solid colored visual whose scale is progressively + /// animated to fully flood a given area. + /// + /// Using the specified color + /// The transition begins with a visual with these bounds and position + /// The transition ends when the visual has "bloomed" to an area of this bounding size + /// + public void Start(Windows.UI.Color color, Rect initialBounds, Rect finalBounds) + { + var colorVisual = CreateVisualWithColorAndPosition(color, initialBounds, finalBounds); + + // add our solid colored circle visual to the live visual tree via the container + _containerForVisuals.Children.InsertAtTop(colorVisual); + + // now that we have a visual, let's run the animation + TriggerBloomAnimation(colorVisual); + } + + /// + /// Cleans up any remaining surfaces. + /// + public void Dispose() + { + _circleMaskSurface.Dispose(); + } + + #endregion + + + #region All the heavy lifting + /// + /// Creates a Visual using the specific color and constraints + /// + private SpriteVisual CreateVisualWithColorAndPosition(Windows.UI.Color color, + Windows.Foundation.Rect initialBounds, + Windows.Foundation.Rect finalBounds) + { + + // init the position and dimensions for our visual + var width = (float)initialBounds.Width; + var height = (float)initialBounds.Height; + var positionX = initialBounds.X; + var positionY = initialBounds.Y; + + // we want our visual (a circle) to completely fit within the bounding box + var circleColorVisualDiameter = (float)Math.Min(width, height); + + // the diameter of the circular visual is an essential bit of information + // in initializing our bloom animation - a one-time thing + if (_bloomAnimation == null) + InitializeBloomAnimation(circleColorVisualDiameter / 2, finalBounds); // passing in the radius + + // we are going to some lengths to have the visual precisely placed + // such that the center of the circular visual coincides with the center of the AppBarButton. + // it is important that the bloom originate there + var diagonal = Math.Sqrt(2 * (circleColorVisualDiameter * circleColorVisualDiameter)); + var deltaForOffset = (diagonal - circleColorVisualDiameter) / 2; + + // now we have everything we need to calculate the position (offset) and size of the visual + var offset = new Vector3((float)positionX + (float)deltaForOffset + circleColorVisualDiameter / 2, + (float)positionY + circleColorVisualDiameter / 2, + 0f); + var size = new Vector2(circleColorVisualDiameter); + + // create the visual with a solid colored circle as brush + SpriteVisual coloredCircleVisual = _compositor.CreateSpriteVisual(); + coloredCircleVisual.Brush = CreateCircleBrushWithColor(color); + coloredCircleVisual.Offset = offset; + coloredCircleVisual.Size = size; + + // we want our scale animation to be anchored around the center of the visual + coloredCircleVisual.AnchorPoint = new Vector2(0.5f, 0.5f); + + + return coloredCircleVisual; + + } + + + /// + /// Creates a circular solid colored brush that we can apply to a visual + /// + private CompositionEffectBrush CreateCircleBrushWithColor(Windows.UI.Color color) + { + + var colorBrush = _compositor.CreateColorBrush(color); + + // + // Because Windows.UI.Composition does not have a Circle visual, we will + // work around by using a circular opacity mask + // Create a simple Composite Effect, using DestinationIn (S * DA), + // with a color source and a named parameter source. + // + var effect = new CompositeEffect + { + Mode = CanvasComposite.DestinationIn, + Sources = + { + new ColorSourceEffect() + { + Color = color + }, + new CompositionEffectSourceParameter("mask") + } + + }; + var factory = _compositor.CreateEffectFactory(effect); + var brush = factory.CreateBrush(); + + // + // Create the mask brush using the circle mask + // + + brush.SetSourceParameter("mask", _circleMaskSurface.Brush); + + return brush; + + } + + /// + /// Creates an animation template for a "color bloom" type effect on a circular colored visual. + /// This is a sub-second animation on the Scale property of the visual. + /// + /// the Radius of the circular visual + /// the final area to occupy + /// + private void InitializeBloomAnimation(float initialRadius, Rect finalBounds) + { + var maxWidth = finalBounds.Width; + var maxHeight = finalBounds.Height; + + // when fully scaled, the circle must cover the entire viewport + // so we use the window's diagonal width as our max radius, assuming 0,0 placement + var maxRadius = (float)Math.Sqrt((maxWidth * maxWidth) + (maxHeight * maxHeight)); // hypotenuse + + // the scale factor is the ratio of the max radius to the original radius + var scaleFactor = (float)Math.Round(maxRadius / initialRadius, MidpointRounding.AwayFromZero); + + + var bloomEase = _compositor.CreateCubicBezierEasingFunction( //these numbers seem to give a consistent circle even on small sized windows + new Vector2(0.1f, 0.4f), + new Vector2(0.99f, 0.65f) + ); + _bloomAnimation = _compositor.CreateScalarKeyFrameAnimation(); + _bloomAnimation.InsertKeyFrame(1.0f, scaleFactor, bloomEase); + _bloomAnimation.Duration = TimeSpan.FromMilliseconds(800); // keeping this under a sec to not be obtrusive + + } + + /// + /// Runs the animation + /// + private void TriggerBloomAnimation(SpriteVisual colorVisual) + { + + // animate the Scale of the visual within a scoped batch + // this gives us transactionality and allows us to do work once the transaction completes + var batchTransaction = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + + // as with all animations on Visuals, these too will run independent of the UI thread + // so if the UI thread is busy with app code or doing layout on state/page transition, + // these animations still run uninterruped and glitch free + colorVisual.StartAnimation("Scale.X", _bloomAnimation); + colorVisual.StartAnimation("Scale.Y", _bloomAnimation); + + batchTransaction.Completed += (sender, args) => + { + // remove this visual from visual tree + _containerForVisuals.Children.Remove(colorVisual); + + // notify interested parties + ColorBloomTransitionCompleted(this, EventArgs.Empty); + }; + + batchTransaction.End(); + + } + #endregion + + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorSlide/ColorSlideTransition.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorSlide/ColorSlideTransition.cs new file mode 100644 index 000000000..b94720beb --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorSlide/ColorSlideTransition.cs @@ -0,0 +1,155 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using Windows.Foundation.Collections; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media; + +namespace CompositionSampleGallery +{ + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class ColorSlideTransition : SamplePage + { + + public static string StaticSampleName => "Color slide"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use Visuals and Animations to create a color slide effect during page or state transitions. Click on one of the items in the Pivot control to trigger the color slide effect."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761173"; + #region Private member variables + + PropertySet _colorsByPivotItem; + ColorSlideTransitionHelper transition; + + #endregion + + + #region Ctor + + public ColorSlideTransition() + { + this.InitializeComponent(); + + this.InitializeColors(); + + this.InitializeTransitionHelper(); + } + + #endregion + + + #region Initializers + + /// + /// Prepopulate a set of colors, indexed by where on the Pivot they will play a role + /// + private void InitializeColors() + { + _colorsByPivotItem = new PropertySet(); + _colorsByPivotItem.Add("Pictures", Microsoft.UI.Colors.Orange); + _colorsByPivotItem.Add("ContactInfo", Microsoft.UI.Colors.Lavender); + _colorsByPivotItem.Add("Download", Microsoft.UI.Colors.GreenYellow); + _colorsByPivotItem.Add("Comment", Microsoft.UI.Colors.DeepSkyBlue); + } + + + /// + /// All of the Color slide transition functionality is encapsulated in this handy helper + /// which we will init once + /// + private void InitializeTransitionHelper() + { + // we pass in the UIElement that will host our Visuals + transition = new ColorSlideTransitionHelper(hostForVisual); + + // when the transition completes, we need to know so we can update other property values + transition.ColorSlideTransitionCompleted += ColorSlideTransitionCompleted; + } + + + #endregion + + + #region Event handlers + + /// + /// Event handler for the Click event on the header. + /// In response this function will trigger a Color slide transition animation. + /// This is achieved by creating a circular solid colored visual directly underneath the + /// Pivot header which was clicked, and animating its scale so that it floods a designated bounding box. + /// + private void Header_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + var header = sender as AppBarButton; + + var contentHeight = rootNavView.RenderSize.Height - header.RenderSize.Height; + var contentWidth = rootNavView.RenderSize.Width; + + var headerPosition = header.TransformToVisual(UICanvas).TransformPoint(new Windows.Foundation.Point(0d, 0d)); + + var finalBounds = new Windows.Foundation.Rect() // maps to a rectangle the size of the pivot content + { + Width = contentWidth, + Height = contentHeight, + X = this.ActualSize.X, + Y = headerPosition.Y + header.RenderSize.Height + }; + + + transition.Start((Windows.UI.Color)_colorsByPivotItem[header.Name], // the color for the colored slide + finalBounds); // the area to fill over the animation duration + } + + + /// + /// Makes the content of the currently selected pivot item visible, + /// and content of every other pivot item invisible + /// + private void ColorSlideTransitionCompleted(object sender, EventArgs e) + { + //var currentPivotItem = rootPivot.SelectedItem as PivotItem; + //foreach (PivotItem pivotItem in rootPivot.Items) + //{ + // if (pivotItem == currentPivotItem) + // (pivotItem.Content as FrameworkElement).Visibility = Visibility.Visible; + // else + // (pivotItem.Content as FrameworkElement).Visibility = Visibility.Collapsed; + //} + } + + + /// + /// In response to a XAML layout event on the Grid (named UICanvas) we will apply a clip + /// to ensure all Visual animations stay within the bounds of the Grid, and doesn't bleed into + /// the top level Frame belonging to the Sample Gallery. Probably not a factor in most other cases. + /// + private void UICanvas_SizeChanged(object sender, SizeChangedEventArgs e) + { + var uiCanvasLocation = UICanvas.TransformToVisual(UICanvas).TransformPoint(new Windows.Foundation.Point(0d, 0d)); + var clip = new RectangleGeometry() + { + Rect = new Windows.Foundation.Rect(uiCanvasLocation, e.NewSize) + }; + UICanvas.Clip = clip; + } + + #endregion + + + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorSlide/ColorSlideTransition.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorSlide/ColorSlideTransition.xaml new file mode 100644 index 000000000..0c4205e63 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorSlide/ColorSlideTransition.xaml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorSlide/ColorSlideTransitionHelper.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorSlide/ColorSlideTransitionHelper.cs new file mode 100644 index 000000000..2ae9e454e --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-ColorSlide/ColorSlideTransitionHelper.cs @@ -0,0 +1,183 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Numerics; +using Windows.Foundation; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; + +namespace CompositionSampleGallery +{ + /// + /// A helper class encapsulating the function and visuals for a Color Slide transition animation. + /// + public class ColorSlideTransitionHelper + { + #region Member variables + + UIElement hostForVisual; + Compositor _compositor; + ContainerVisual _containerForVisuals; + ScalarKeyFrameAnimation _slideAnimation; + bool firstRun = true; + + #endregion + + + #region Ctor + + /// + /// Creates an instance of the ColorSlideTransitionHelper. + /// Any visuals to be later created and animated will be hosted within the specified UIElement. + /// + public ColorSlideTransitionHelper(UIElement hostForVisual) + { + + + this.hostForVisual = hostForVisual; + + // we have an element in the XAML tree that will host our Visuals + var visual = ElementCompositionPreview.GetElementVisual(hostForVisual); + _compositor = visual.Compositor; + + // create a container + // adding children to this container adds them to the live visual tree + _containerForVisuals = _compositor.CreateContainerVisual(); + + InitializeSlideAnimation(); + + + ElementCompositionPreview.SetElementChildVisual(hostForVisual, _containerForVisuals); + } + + #endregion + + + #region Public API surface + + public delegate void ColorSlideTransitionCompletedEventHandler(object sender, EventArgs e); + + /// + /// Indicates that the color slide transition has completed. + /// + public event ColorSlideTransitionCompletedEventHandler ColorSlideTransitionCompleted; + + + /// + /// Starts the color slide transition using the specified color and boundary sizes. + /// + /// The slide is achieved by creating a rectangular solid colored visual whose scale is progressively + /// animated to fully flood a given area. + /// + /// Using the specified color + /// The transition begins with a visual with these bounds and position + /// The transition ends when the visual has slid to an area of this bounding size + /// + public void Start(Windows.UI.Color color, Rect finalBounds) + { + var colorVisual = CreateVisualWithColorAndPosition(color, finalBounds); + + // add our solid colored rectangular visual to the live visual tree via the container + _containerForVisuals.Children.InsertAtTop(colorVisual); + + // now that we have a visual, let's run the animation + TriggerSlideAnimation(colorVisual); + } + + #endregion + + + #region All the heavy lifting + /// + /// Creates a Visual using the specific color and constraints + /// + private SpriteVisual CreateVisualWithColorAndPosition(Windows.UI.Color color, + Windows.Foundation.Rect finalBounds) + { + + var offset = new Vector3((float)finalBounds.Right, (float)finalBounds.Top, 0f); + var size = new Vector2((float)finalBounds.Width, (float)finalBounds.Height); + + SpriteVisual coloredRectangle = _compositor.CreateSpriteVisual(); + coloredRectangle.Brush = _compositor.CreateColorBrush(color); + coloredRectangle.Offset = offset; + coloredRectangle.Size = size; + + return coloredRectangle; + + } + + + + /// + /// Creates an animation template for a "color slide" type effect on a rectangular colored visual. + /// This is a sub-second animation on the Scale property of the visual. + /// + private void InitializeSlideAnimation() + { + _slideAnimation = _compositor.CreateScalarKeyFrameAnimation(); + _slideAnimation.InsertKeyFrame(1.0f, 0f); + _slideAnimation.Duration = TimeSpan.FromMilliseconds(800); // keeping this under a sec to not be obtrusive + + } + + /// + /// Runs the animation + /// + private void TriggerSlideAnimation(SpriteVisual colorVisual) + { + + // animate the Scale of the visual within a scoped batch + // this gives us transactionality and allows us to do work once the transaction completes + var batchTransaction = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + + // as with all animations on Visuals, these too will run independent of the UI thread + // so if the UI thread is busy with app code or doing layout on state/page transition, + // this animation still run uninterruped and glitch free. + colorVisual.StartAnimation("Offset.X", _slideAnimation); + + batchTransaction.Completed += SlideAnimationCompleted; + + batchTransaction.End(); + + } + + /// + /// Cleans up after the slide animation has ended + /// + private void SlideAnimationCompleted(object sender, CompositionBatchCompletedEventArgs args) + { + if (!firstRun) + { + foreach (var childVisual in _containerForVisuals.Children) + { + _containerForVisuals.Children.Remove(childVisual); + break; // we only need to remove the first child + } + } + else + { + firstRun = false; + } + + // notify interested parties + ColorSlideTransitionCompleted(this, EventArgs.Empty); + } + + #endregion + + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-FlipToReveal/FlipToReveal.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-FlipToReveal/FlipToReveal.xaml new file mode 100644 index 000000000..1c325015e --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-FlipToReveal/FlipToReveal.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-FlipToReveal/FlipToReveal.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-FlipToReveal/FlipToReveal.xaml.cs new file mode 100644 index 000000000..6901e9eba --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TransitionAnimation-FlipToReveal/FlipToReveal.xaml.cs @@ -0,0 +1,114 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Numerics; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Hosting; + +namespace CompositionSampleGallery +{ + public sealed partial class FlipToReveal : SamplePage + { + public FlipToReveal() + { + this.InitializeComponent(); + } + + public static string StaticSampleName => "Flip to reveal"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use Animations and Transforms to create a flip effect. Tap on the tile to reveal the image underneath. Tap again to see it flip back."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761175"; + + + private Boolean IsFlipped = false; + + private void MainPanel_Tapped(object sender, Microsoft.UI.Xaml.Input.TappedRoutedEventArgs e) + { + Visual visual = ElementCompositionPreview.GetElementVisual(CaptionTile); + Compositor compositor = visual.Compositor; + + visual.Size = new Vector2((float)CaptionTile.Width / 2, (float)CaptionTile.Height / 2); + + // Rotate around the X-axis + visual.RotationAxis = new Vector3(1, 0, 0); + + // Start the rotation animation + LinearEasingFunction linear = compositor.CreateLinearEasingFunction(); + ScalarKeyFrameAnimation rotationAnimation = compositor.CreateScalarKeyFrameAnimation(); + if (!IsFlipped) // default + { + rotationAnimation.InsertKeyFrame(0, 0, linear); + rotationAnimation.InsertKeyFrame(1, 250f, linear); // flip over + } + else + { + rotationAnimation.InsertKeyFrame(0, 250f, linear); + rotationAnimation.InsertKeyFrame(1, 0f, linear); // flip back + + } + rotationAnimation.Duration = TimeSpan.FromMilliseconds(800); + + var transaction = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + transaction.Completed += Animation_Completed; + + // we want the CaptionTile visible as it flips back + if(IsFlipped) + CaptionTile.Visibility = Microsoft.UI.Xaml.Visibility.Visible; + + visual.StartAnimation("RotationAngleInDegrees", rotationAnimation); + + transaction.End(); + } + + private void Animation_Completed(object sender, CompositionBatchCompletedEventArgs args) + { + IsFlipped = !IsFlipped; + + // we want the CaptionTile invisible once flipped over + if(IsFlipped) + CaptionTile.Visibility = Microsoft.UI.Xaml.Visibility.Collapsed; + + + } + + private void UpdatePerspective() + { + Visual visual = ElementCompositionPreview.GetElementVisual(MainPanel); + + // Get the size of the area we are enabling perspective for + Vector2 sizeList = new Vector2((float)MainPanel.ActualWidth, (float)MainPanel.ActualHeight); + + // Setup the perspective transform. + Matrix4x4 perspective = new Matrix4x4( + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, -1.0f / sizeList.X, + 0.0f, 0.0f, 0.0f, 1.0f); + + // Set the parent transform to apply perspective to all children + visual.TransformMatrix = + Matrix4x4.CreateTranslation(-sizeList.X / 2, -sizeList.Y / 2, 0f) * // Translate to origin + perspective * // Apply perspective at origin + Matrix4x4.CreateTranslation(sizeList.X / 2, sizeList.Y / 2, 0f); // Translate back to original position + + } + + private void MainPanel_SizeChanged(object sender, Microsoft.UI.Xaml.SizeChangedEventArgs e) + { + UpdatePerspective(); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TreeEffects/TreeEffects.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/TreeEffects/TreeEffects.xaml new file mode 100644 index 000000000..f8f22018a --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TreeEffects/TreeEffects.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/TreeEffects/TreeEffects.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/TreeEffects/TreeEffects.xaml.cs new file mode 100644 index 000000000..70ba0ca68 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/TreeEffects/TreeEffects.xaml.cs @@ -0,0 +1,291 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Numerics; +using System.Collections.Generic; + +using Windows.UI; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.Graphics.Canvas.Effects; + +namespace CompositionSampleGallery +{ + public sealed partial class TreeEffects : SamplePage + { + + public static string StaticSampleName => "Tree Effects"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Use LayerVisual to apply an animated effect to a tree of SpriteVisuals"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869006"; + + public TreeEffects() + { + this.InitializeComponent(); + this.Loaded += MainPage_Loaded; + } + + #region Background Toggle + + public bool BackgroundSwitch + { + get + { + return _backgroundSwitch; + } + set + { + // Animate in normal or reverse based on switch toggle + var batch = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + _blurAnimation.Direction = value ? Microsoft.UI.Composition.AnimationDirection.Normal : Microsoft.UI.Composition.AnimationDirection.Reverse; + _blurBrush.Properties.StartAnimation("blurEffect.BlurAmount", _blurAnimation); + BackgroundToggle.IsEnabled = false; // disable button while animation is in progress + batch.End(); + batch.Completed += Background_BatchCompleted; + _backgroundSwitch = value; + } + } + + private void Background_BatchCompleted(object sender, CompositionBatchCompletedEventArgs args) + { + BackgroundToggle.IsEnabled = true; + } + #endregion + + #region Foreground Toggle + public bool ForegroundSwitch + { + get + { + return _foregroundSwitch; + } + set + { + // Animate in normal or reverse based on switch toggle + var batch = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + _saturationAnimation.Direction = value ? Microsoft.UI.Composition.AnimationDirection.Normal : Microsoft.UI.Composition.AnimationDirection.Reverse; + _saturationBrush.Properties.StartAnimation("saturationEffect.Saturation", _saturationAnimation); + ForegroundToggle.IsEnabled = false; // disable button while animation is in progress + batch.End(); + batch.Completed += Foreground_BatchCompleted; + _foregroundSwitch = value; + } + } + + private void Foreground_BatchCompleted(object sender, CompositionBatchCompletedEventArgs args) + { + ForegroundToggle.IsEnabled = true; + } + + #endregion + + private static int CompareZOffset(SpriteVisual one, SpriteVisual two) + { + return (one.Offset.Z).CompareTo(two.Offset.Z); + } + + private void MainPage_Loaded(object sender, RoutedEventArgs e) + { + + // Set up scene: get interop compositor, create comp root and initialize scene + _compositor = ElementCompositionPreview.GetElementVisual(CompGrid).Compositor; + _root = _compositor.CreateContainerVisual(); + ElementCompositionPreview.SetElementChildVisual(CompGrid, _root); + + // Compute root size and scene container transforms; insert clip + _sceneContainer = _compositor.CreateContainerVisual(); + ComputeSceneLayout(); + _root.Children.InsertAtTop(_sceneContainer); + + + // Initialize layervisuals; specify size + _foregroundLayerVisual = _compositor.CreateLayerVisual(); + _backgroundLayerVisual = _compositor.CreateLayerVisual(); + + // Create SpriteVisuals and add to lists + PopulateSpriteVisuals(); + + + // Insert layervisuals in visual tree + _sceneContainer.Children.InsertAtTop(_foregroundLayerVisual); + _sceneContainer.Children.InsertBelow(_backgroundLayerVisual, _foregroundLayerVisual); + + // Initialize effects and their animations + CreateEffectAnimations(); + + // CompGrid_SizeChanged event fired after MainPage_Loaded + CompGrid.SizeChanged += CompGrid_SizeChanged; + } + + private void CompGrid_SizeChanged(object sender, SizeChangedEventArgs e) + { + _foregroundLayerVisual.Children.RemoveAll(); + _backgroundLayerVisual.Children.RemoveAll(); + ComputeSceneLayout(); + PopulateSpriteVisuals(); + } + + #region Compute Layout and Populate Visuals + private void ComputeSceneLayout() + { + // Compute root size and add clip + _root.Size = CompGrid.RenderSize.ToVector2(); + _root.Clip = _compositor.CreateInsetClip(); + + // Populate screen with visuals based on container size + var smallerSize = Math.Min(_root.Size.X, _root.Size.Y); + _spriteSize = new Vector2(smallerSize / 10); + _numVisuals = (_root.Size.X * _root.Size.Y) * 100 / (smallerSize * smallerSize); + + _sceneContainer.Size = _root.Size - _spriteSize; + _sceneContainer.Offset = new Vector3(_spriteSize / 2, 0); + + // Apply perspective transform to sceneContainer + float perspectiveOriginPercent = 0.5f; + Vector3 perspectiveOrigin = new Vector3(perspectiveOriginPercent * _sceneContainer.Size, 0); + float perspectiveDepth = -1000; + _sceneContainer.TransformMatrix = Matrix4x4.CreateTranslation(-perspectiveOrigin) * + new Matrix4x4(1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 1 / perspectiveDepth, + 0, 0, 0, 1) * + Matrix4x4.CreateTranslation(perspectiveOrigin); + } + + private void PopulateSpriteVisuals() + { + // Initialize variables for visual creation loop + int count = 0; + var rand = new Random(); + float z_depth = -1000.0f; + + var listOfForegroundVisuals = new List(); + var listOfBackgroundVisuals = new List(); + + while (count < _numVisuals) + { + var r_x = (float)rand.NextDouble(); + var r_y = (float)rand.NextDouble(); + var r_z = (float)rand.NextDouble(); + + // Create a new sprite with random offset and color + var sprite = _compositor.CreateSpriteVisual(); + sprite.Size = _spriteSize; + sprite.AnchorPoint = new Vector2(0.5f, 0.5f); + sprite.Offset = new Vector3(r_x * _sceneContainer.Size.X, r_y * _sceneContainer.Size.Y, r_z * z_depth); + sprite.Brush = _compositor.CreateColorBrush(Color.FromArgb(190, (byte)rand.Next(255), (byte)rand.Next(255), (byte)rand.Next(255))); + + // Partition into two lists + if (sprite.Offset.Z > z_depth / 2) + { + listOfForegroundVisuals.Add(sprite); + } + else + { + listOfBackgroundVisuals.Add(sprite); + } + count++; + } + + _foregroundLayerVisual.Size = _root.Size; + _backgroundLayerVisual.Size = _root.Size; + + // Sort the lists by z offset so drawing order matches z order + listOfForegroundVisuals.Sort(CompareZOffset); + listOfBackgroundVisuals.Sort(CompareZOffset); + + // Insert spritevisuals into layervisuals + foreach (var visual in listOfForegroundVisuals) + { + _foregroundLayerVisual.Children.InsertAtTop(visual); + } + foreach (var visual in listOfBackgroundVisuals) + { + _backgroundLayerVisual.Children.InsertAtTop(visual); + } + } + + #endregion + + #region Initialize Effects and Animations + private void CreateEffectAnimations() + { + // Create saturation effect + var saturationEffect = new SaturationEffect + { + Name = "saturationEffect", + Saturation = 1f, + Source = new CompositionEffectSourceParameter("foregroundLayerVisual"), + }; + + var saturationFactory = _compositor.CreateEffectFactory(saturationEffect, new[] { "saturationEffect.Saturation" }); + _saturationBrush = saturationFactory.CreateBrush(); + + // Apply animatable saturation effect to foreground visuals + _foregroundLayerVisual.Effect = _saturationBrush; + + // Create blur effect + var blurEffect = new GaussianBlurEffect + { + Name = "blurEffect", + BlurAmount = 0f, + BorderMode = EffectBorderMode.Hard, + Source = new CompositionEffectSourceParameter("backgroundLayerVisual"), + }; + + var blurFactory = _compositor.CreateEffectFactory(blurEffect, new[] { "blurEffect.BlurAmount" }); + _blurBrush = blurFactory.CreateBrush(); + + // Apply animatable saturation effect to foreground visuals + _backgroundLayerVisual.Effect = _blurBrush; + + // Initialize effect animations + var lin = _compositor.CreateLinearEasingFunction(); + + _saturationAnimation = _compositor.CreateScalarKeyFrameAnimation(); + _saturationAnimation.InsertKeyFrame(0, 1f, lin); + _saturationAnimation.InsertKeyFrame(1, 0f, lin); + _saturationAnimation.Duration = _duration; + + _blurAnimation = _compositor.CreateScalarKeyFrameAnimation(); + _blurAnimation.InsertKeyFrame(0, 0f, lin); + _blurAnimation.InsertKeyFrame(1, 20f, lin); + _blurAnimation.Duration = _duration; + } + + #endregion + + private Compositor _compositor; + private ContainerVisual _root; + private ContainerVisual _sceneContainer; + private LayerVisual _foregroundLayerVisual; + private LayerVisual _backgroundLayerVisual; + private float _numVisuals; + private Vector2 _spriteSize; + + private ScalarKeyFrameAnimation _saturationAnimation; + private ScalarKeyFrameAnimation _blurAnimation; + private CompositionEffectBrush _saturationBrush; + private CompositionEffectBrush _blurBrush; + private static readonly TimeSpan _duration = TimeSpan.FromSeconds(3); + private bool _backgroundSwitch; + private bool _foregroundSwitch; + } +} + diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Commands/DelegateCommand.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Commands/DelegateCommand.cs new file mode 100644 index 000000000..20eb78c1a --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Commands/DelegateCommand.cs @@ -0,0 +1,81 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Input; + +namespace CompositionSampleGallery.Commands +{ + public interface IDelegateCommand : ICommand + { + void RaiseCanExecuteChanged(); + } + + public class DelegateCommand : IDelegateCommand + { + Action _execute; + Func _canExecute; + + + #region Constructors + public DelegateCommand(Action execute, Func canExecute) + { + this._execute = execute; + this._canExecute = canExecute; + } + + + public DelegateCommand(Action execute) + { + this._execute = execute; + this._canExecute = this.AlwaysCanExecute; + } + #endregion + + #region IDelegateCommand + public void RaiseCanExecuteChanged() + { + if (CanExecuteChanged != null) + { + CanExecuteChanged(this, EventArgs.Empty); + } + } + + + public bool CanExecute(object parameter) + { + return _canExecute(parameter); + } + + + public event EventHandler CanExecuteChanged; + + + public void Execute(object parameter) + { + _execute(parameter); + } + #endregion + + + bool AlwaysCanExecute(object param) + { + return true; + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/BoolToStringConverter.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/BoolToStringConverter.cs new file mode 100644 index 000000000..9b217fbe6 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/BoolToStringConverter.cs @@ -0,0 +1,52 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Picks between two strings depending on the input bool. + /// + public class BoolToStringConverter : IValueConverter + { + /// + /// Takes a bool and returns a string depending on the value of the bool. This converter + /// requires the parameter to be a string that is delimited by a ';'. The string is split + /// on the ';' and returns the first token if the value is true. If the value is false, the + /// second token is used. + /// + /// A bool to be evaluated/converted. + /// Unused. + /// A string that is delimited by a ';'. + /// Unused. + /// String + public object Convert(object value, Type targetType, object parameter, string language) + { + bool bvalue = (bool)value; + var parts = parameter.ToString().Split(';'); + return bvalue ? parts[0] : parts[1]; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/BoolToVisibilityConverter.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/BoolToVisibilityConverter.cs new file mode 100644 index 000000000..c10bd5bab --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/BoolToVisibilityConverter.cs @@ -0,0 +1,55 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Converts a bool to a Visibility enum. + /// + public class BoolToVisibilityConverter : IValueConverter + { + /// + /// Returns Visibility.Visible if value is true, with Visibility.Collapsed returned otherwise. + /// If a parameter of 'true' is provided, the result will be inverted. + /// + /// The bool to be converted. + /// Unused. + /// Optional. If a bool is asigned and it is set to true, then the + /// value is inversed. + /// Unused. + /// Visibility + public object Convert(object value, Type targetType, object parameter, string language) + { + bool bvalue = (bool)value; + bool invert = parameter != null ? (bool)parameter : false; + + bvalue = invert ? !bvalue : bvalue; + + return bvalue ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/InvertBoolConverter.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/InvertBoolConverter.cs new file mode 100644 index 000000000..5fab31d9e --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/InvertBoolConverter.cs @@ -0,0 +1,48 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Inverts a given bool value. + /// + public class InvertBoolConverter : IValueConverter + { + /// + /// Inverts a given bool value. + /// + /// Bool to be inverted. + /// Unused. + /// Unused. + /// Unused. + /// bool + public object Convert(object value, Type targetType, object parameter, string language) + { + bool bvalue = (bool)value; + return !bvalue; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/LightModeToBrushConverter.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/LightModeToBrushConverter.cs new file mode 100644 index 000000000..437c8c824 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/LightModeToBrushConverter.cs @@ -0,0 +1,53 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Media; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Converts a LightMode to a Brush. When the LightMode is set to None, the brush is transparent. + /// Otherwise the brush is red. + /// + public class LightModeToBrushConverter : IValueConverter + { + /// + /// Returns a transparent SolidColorBrush if the LightMode is set to None. Otherwise returns + /// a red SolidColorBrush. + /// + /// The LightMode to be converted. + /// Unused. + /// Unused. + /// Unused. + /// SolidColorBrush + public object Convert(object value, Type targetType, object parameter, string language) + { + LightMode lightMode = (LightMode)value; + Color color = lightMode == LightMode.None ? Colors.Transparent : Colors.Red; + return new SolidColorBrush(color); + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/LightModeToVisibilityConverter.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/LightModeToVisibilityConverter.cs new file mode 100644 index 000000000..e4fe41f79 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/LightModeToVisibilityConverter.cs @@ -0,0 +1,52 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Converts a LightMode to a Visibility enum. + /// + public class LightModeToVisibilityConverter : IValueConverter + { + /// + /// Returns Visibility.Visible if the value matches the parameter. Returns Visibility.Collapsed + /// otherwise. + /// + /// The LightMode to convert. + /// Unused. + /// The string value of the LightMode value checked against. + /// Unused. + /// Visibility + public object Convert(object value, Type targetType, object parameter, string language) + { + LightMode lightMode = (LightMode)value; + String refMode = parameter.ToString().Trim(); + bool match = refMode.Equals(lightMode.ToString()); + return match ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/NullToVisibilityConverter.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/NullToVisibilityConverter.cs new file mode 100644 index 000000000..56b66a5b2 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/NullToVisibilityConverter.cs @@ -0,0 +1,48 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Converts null to Visibility. + /// + public class NullToVisibilityConverter : IValueConverter + { + /// + /// Returns Visibility.Collapsed if the value is null. Returns Visibility.Visible otherwise. + /// + /// The object to be checked for null. + /// Unused. + /// Unused. + /// Unused. + /// Visibility + public object Convert(object value, Type targetType, object parameter, string language) + { + return value == null ? Visibility.Collapsed : Visibility.Visible; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/StringApenderConverter.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/StringApenderConverter.cs new file mode 100644 index 000000000..5c33c30b5 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/Converters/StringApenderConverter.cs @@ -0,0 +1,57 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Appends a string to a given value. + /// + public class StringAppenderConverter : IValueConverter + { + /// + /// Returns value.ToString() + " " + parameter.ToString(). + /// + /// The value to be appended. + /// Unused. + /// The string to append. + /// Unused. + /// String + public object Convert(object value, Type targetType, object parameter, string language) + { + string result = ""; + if (value != null) + { + result = value.ToString(); + if (parameter != null) + { + result += " " + parameter.ToString(); + } + } + + return result; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/EffectItem.cs b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/EffectItem.cs new file mode 100644 index 000000000..c0651e47e --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/EffectItem.cs @@ -0,0 +1,125 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Composition; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CompositionSampleGallery +{ + /// + /// A model for CompositionEffectBrush. Dictates slider values, as well as changes a given + /// property of the effect brush. + /// + public class EffectItem + { + // Private Members + private CompositionEffectFactory _factory; + private CompositionEffectBrush _brush; + + /// + /// The name of the effect. Must match the name given to the effect in the effect definition. + /// + public String EffectName { get; set; } + /// + /// The name of the property. Must match the name of the property. + /// + public String AnimatablePropertyName { get; set; } + /// + /// The minimum value for the animatable property. + /// + public float ValueMin { get; set; } + /// + /// The maximum value for the animatable property. + /// + public float ValueMax { get; set; } + + /// + /// Function called to create the effect brush. + /// + public Func CreateEffectFactory { get; set; } + + // Slider specific properties. + public float SmallChange { get; set; } + public float LargeChange { get; set; } + + /// + /// Returns the effect brush for this model. If a brush has not beeen created, one is created + /// given CreateEffectFactory has been assigned. + /// + /// CompositionEffectBrush + public CompositionEffectBrush GetEffectBrush() + { + if (_brush == null && CreateEffectFactory != null) + { + if (_factory == null) + { + _factory = CreateEffectFactory(); + } + + _brush = _factory.CreateBrush(); + } + + return _brush; + } + + /// + /// Changes the animatable property on the effect brush if already created. Does nothing if + /// there is no animatable property present. + /// + /// Value to assign to the effect brush's animatable property. + public void ChangeValue(float value) + { + if (_brush != null && !String.IsNullOrEmpty(AnimatablePropertyName)) + { + // Change the value on the effect brush. Unlike a visual, where only the property name + // is needed, both the effect name and the property value are needed to specify the + // effect property. + _brush.Properties.InsertScalar(EffectName + "." + AnimatablePropertyName, value); + } + } + + /// + /// Animates the effect brush property from the given starting value to the given ending + /// value for the given duration. The default easing funciton is used. + /// + /// Starting value for the effect brush property. + /// The ending or target value for the effect brush property. + /// Desired length of the animation. + public void Animate(float start, float end, double duration) + { + if (_brush != null && !String.IsNullOrEmpty(AnimatablePropertyName)) + { + // Create our animation. + var compositor = _brush.Compositor; + var animation = compositor.CreateScalarKeyFrameAnimation(); + animation.InsertKeyFrame(0.0f, start); + animation.InsertKeyFrame(1.0f, end); + animation.Duration = TimeSpan.FromSeconds(duration); + + // Like with directly changing the effect property, the full effect name and effect + // property name are needed to set an animation. + _brush.StartAnimation(EffectName + "." + AnimatablePropertyName, animation); + } + } + + /// + /// Sentinel value for no effect. + /// + public static EffectItem None = new EffectItem() { EffectName = "None" }; + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/VideoPlayground.xaml b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/VideoPlayground.xaml new file mode 100644 index 000000000..2b4cb63bc --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Samples/VideoPlayground/VideoPlayground.xaml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/FlipViewIndicator.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Shared/FlipViewIndicator.xaml.cs new file mode 100644 index 000000000..6dde3e0da --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/FlipViewIndicator.xaml.cs @@ -0,0 +1,231 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Threading.Tasks; + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI; + +namespace CompositionSampleGallery +{ + public sealed partial class FlipViewIndicator : UserControl + { + private FlipViewModel _model; + private bool _ProgressFlipView = true; + public FlipViewModel Model + { + get { return _model; } + set { if (value != null) _model = value; } + } + + public FlipViewIndicator() + { + this.InitializeComponent(); + + _model = new FlipViewModel(); + + SampleDefinition brushInterop = SampleDefinitions.Definitions.Where(x => x.Type == typeof(BrushInterop)).FirstOrDefault(); + if (brushInterop != null) + { + _model.FlipViewItems.Add(new FeaturedFlipViewSample("Apply custom brushes to XAML content", "", "/Assets/BannerImages/BrushInterop.png", 0, brushInterop)); + } + this.DataContext = _model; + SampleDefinition shyHeader = SampleDefinitions.Definitions.Where(x => x.Type == typeof(ShyHeader)).FirstOrDefault(); + if (shyHeader != null) + { + _model.FlipViewItems.Add(new FeaturedFlipViewSample("Create a shrinking header tied to scroll position", "", "/Assets/BannerImages/ShyHeader.PNG", 1, shyHeader)); + } + SampleDefinition pullToAnimate = SampleDefinitions.Definitions.Where(x => x.Type == typeof(PullToAnimate)).FirstOrDefault(); + if (pullToAnimate != null) + { + _model.FlipViewItems.Add(new FeaturedFlipViewSample("Create depth of field with manipulation-based blur", "", "/Assets/BannerImages/PullToAnimateBanner.PNG", 2, pullToAnimate)); + } + this.DataContext = _model; + SampleDefinition interactions3D = SampleDefinitions.Definitions.Where(x => x.Type == typeof(Interactions3D)).FirstOrDefault(); + if (interactions3D != null) + { + _model.FlipViewItems.Add(new FeaturedFlipViewSample("Create an interactive 3D experience", "", "/Assets/BannerImages/IneractionTrackerBanner.png", 3, interactions3D)); + } + this.DataContext = _model; + + // Automatically have the FlipView progress to the next item + if (Model.FlipViewItems.Count() > 1) + { + Task t = ProgressFlipView(); + } + } + + public async Task ProgressFlipView() + { + while (_ProgressFlipView) + { + await Task.Delay(6000); + if (_ProgressFlipView) + { + BannerFlipView.SelectedIndex = (BannerFlipView.SelectedIndex + 1) % Model.FlipViewItems.Count; + } + } + } + + private void BannerFlipView_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + Model.Selected = (FeaturedFlipViewSample)((FlipView)sender).SelectedItem; + } + + // Navigate to the sample that the user selected + private void Button_Click(object sender, RoutedEventArgs e) + { + FeaturedFlipViewSample SelectedSample = BannerFlipView.SelectedItem as FeaturedFlipViewSample; + MainNavigationViewModel.NavigateToSample(SelectedSample.SampleDefinition); + } + + private void IndicatorClick(object sender, RoutedEventArgs e) + { + // find the index of the clicked item and jump the flip view to that index + FeaturedFlipViewSample clickedFeaturedSample = (sender as Button).DataContext as FeaturedFlipViewSample; + int index = Model.FlipViewItems.IndexOf(clickedFeaturedSample); + if (index >= 0 && index <= Model.FlipViewItems.Count()) + { + _ProgressFlipView = false; + BannerFlipView.SelectedIndex = index; + } + } + } + + public class FlipViewModel + { + private FeaturedFlipViewSample _selected; + private ObservableCollection _flipViewItems = new ObservableCollection(); + + public FlipViewModel() { } + + public ObservableCollection FlipViewItems + { + get + { + return _flipViewItems; + } + } + + public FeaturedFlipViewSample Selected + { + get { return _selected; } + set + { + if (value != null) + { + foreach (var item in _flipViewItems.Where(x => x.Selected)) + { + item.Selected = false; + } + + _selected = value; + _selected.Selected = true; + } + } + } + } + + public class FeaturedFlipViewSample +#if USING_CSWINRT + : System.ComponentModel.INotifyPropertyChanged +#else + : Microsoft.UI.Xaml.Data.INotifyPropertyChanged +#endif + { + private string _title; + private string _Description; + private string _navigationUrl; + private string _backgroundImage; + private int _index; + private SampleDefinition _sampleDefinition; + private bool _selected = default(bool); + +#if USING_CSWINRT + public event PropertyChangedEventHandler PropertyChanged; +#else + public event Microsoft.UI.Xaml.Data.PropertyChangedEventHandler PropertyChanged; +#endif + + public FeaturedFlipViewSample(string title, string description, string backgroundImageUrl, int index, SampleDefinition sampleDefinition = null, string navigationUrl = null) + { + _title = title; + _Description = description; + _navigationUrl = navigationUrl; + _backgroundImage = backgroundImageUrl; + _sampleDefinition = sampleDefinition; + _index = index; + } + + public string Title { get { return _title; } } + public string Description { get { return _Description; } } + public string NavigationUrl { get { return _navigationUrl; } } + public string BackgroundImage { get { return _backgroundImage; } } + public string AccessibilityIndexInfo { get { return "Skip to "+_index+"-"+_title; } } + public SampleDefinition SampleDefinition { get { return _sampleDefinition; } } + public bool Selected + { + get { return _selected; } + set + { + _selected = value; + this.OnPropertyChanged("Selected"); + } + } + + private void OnPropertyChanged(string propertyName) + { + System.ComponentModel.PropertyChangedEventHandler handler = PropertyChanged; + if (handler != null) + { + handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); + } + } + } + + + public class SelectedToSolidColorBrushValueConverter: IValueConverter + { + public object Convert(object value, Type targetType, object parameter, String language) + { + bool selected = (bool)value; + if (selected) + { + return new SolidColorBrush(Microsoft.UI.Colors.White); + } + else + { + return null; + } + } + + public object ConvertBack(object value, Type targetType, object parameter, String language) + { + if(value != null) + { + SolidColorBrush sbc = (SolidColorBrush)value; + if (sbc.Color == Microsoft.UI.Colors.White) + return true; + } + return false; + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/Footer.xaml b/Samples/SceneGraph/SampleGalleryApp/Shared/Footer.xaml new file mode 100644 index 000000000..5fac169a0 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/Footer.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/Footer.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Shared/Footer.xaml.cs new file mode 100644 index 000000000..bc6a0bf43 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/Footer.xaml.cs @@ -0,0 +1,33 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Xaml.Controls; + +// The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236 + +namespace CompositionSampleGallery +{ + public sealed partial class Footer : UserControl + { + public Footer() + { + this.InitializeComponent(); + } + + private void SettingsButton_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + MainNavigationViewModel.ShowSettings(); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/LocalDataSource.cs b/Samples/SceneGraph/SampleGalleryApp/Shared/LocalDataSource.cs new file mode 100644 index 000000000..b23f208bb --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/LocalDataSource.cs @@ -0,0 +1,146 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CompositionSampleGallery.Shared +{ + public class Thumbnail + { + public Thumbnail() + { + + } + + public Thumbnail(string name, string url, string description) + { + Name = name; + ImageUrl = url; + Description = description; + } + + public string Name + { + get; set; + } + + public string ImageUrl + { + get; set; + } + + public string Description + { + get; set; + } + + } + + public class LocalDataSource + { + public LocalDataSource() + { + Landscapes = new ObservableCollection(); + Landscapes.Add(new Thumbnail("Rocky Mountains", PREFIX_URL_LANDSCAPE + "Landscape-1.jpg", "Landscape shot of mountains in rocky terrain")); + Landscapes.Add(new Thumbnail("Sunny Landscape", PREFIX_URL_LANDSCAPE + "Landscape-2.jpg", "Picturesque scene with the sun high in the sky")); + Landscapes.Add(new Thumbnail("Mountain Road", PREFIX_URL_LANDSCAPE + "Landscape-3.jpg", "Winding road through a mountain pass")); + Landscapes.Add(new Thumbnail("Harvest", PREFIX_URL_LANDSCAPE + "Landscape-4.jpg", "Corn stalks on a clear day")); + Landscapes.Add(new Thumbnail("Rock Formation", PREFIX_URL_LANDSCAPE + "Landscape-5.jpg", "Unique rock formation off of a mountain")); + Landscapes.Add(new Thumbnail("At Sea", PREFIX_URL_LANDSCAPE + "Landscape-6.jpg", "Sunset over the water")); + Landscapes.Add(new Thumbnail("Snowy Mountain", PREFIX_URL_LANDSCAPE + "Landscape-7.jpg", "A snowy mountain framed by pine trees")); + Landscapes.Add(new Thumbnail("Sea to Sky", PREFIX_URL_LANDSCAPE + "Landscape-8.jpg", "A lake framed by mountains and pine trees")); + Landscapes.Add(new Thumbnail("On the Beach", PREFIX_URL_LANDSCAPE + "Landscape-9.jpg", "Shot of the beach with greenery")); + Landscapes.Add(new Thumbnail("Lush Mountains", PREFIX_URL_LANDSCAPE + "Landscape-10.jpg", "Landscape shot of mountains in the forrest")); + Landscapes.Add(new Thumbnail("White Dunes", PREFIX_URL_LANDSCAPE + "Landscape-11.jpg", "White sand dunes and a clear sky")); + Landscapes.Add(new Thumbnail("Dunes with Tracks", PREFIX_URL_LANDSCAPE + "Landscape-12.jpg", "Sand dunes after driving on an ATV")); + Landscapes.Add(new Thumbnail("Shadowed Dunes", PREFIX_URL_LANDSCAPE + "Landscape-13.jpg", "Sand dunes casting a shadow")); + + Abstract = new ObservableCollection(); + Abstract.Add(new Thumbnail("Pink Bubbles", PREFIX_URL_ABSTRACT + "Abstract-1.jpg", "A macro shot of bubbles with a pink background")); + Abstract.Add(new Thumbnail("Blue Bubbles", PREFIX_URL_ABSTRACT + "Abstract-2.jpg", "A macro shot of bubbles with a blue background")); + Abstract.Add(new Thumbnail("Orange Bubbles", PREFIX_URL_ABSTRACT + "Abstract-3.jpg", "A portrait macro shot orange bubbles")); + Abstract.Add(new Thumbnail("Green Bubbles", PREFIX_URL_ABSTRACT + "Abstract-4.jpg", "A macro shot of green oil bubbles")); + Abstract.Add(new Thumbnail("Drop", PREFIX_URL_ABSTRACT + "Abstract-5.jpg", "A macro shot of a droplet of water against nature")); + Abstract.Add(new Thumbnail("Petals", PREFIX_URL_ABSTRACT + "Abstract-6.jpg", "A close up shot of flower petals")); + Abstract.Add(new Thumbnail("Up Close", PREFIX_URL_ABSTRACT + "Abstract-7.jpg", "A zoomed in shot of the center of a flower")); + + Nature = new ObservableCollection(); + Nature.Add(new Thumbnail("Cardoon", PREFIX_URL_NATURE + "Nature-1.jpg", "Close up shot of a purple cardoon")); + Nature.Add(new Thumbnail("Meadow", PREFIX_URL_NATURE + "Nature-2.jpg", "Purple flowers in a meadow")); + Nature.Add(new Thumbnail("Pink Flower", PREFIX_URL_NATURE + "Nature-3.jpg", "A close up shot of a unique pink and yellow flower")); + Nature.Add(new Thumbnail("Red Flowers", PREFIX_URL_NATURE + "Nature-4.jpg", "A close up shot of a red flower amid a flower patch")); + Nature.Add(new Thumbnail("Dahlia", PREFIX_URL_NATURE + "Nature-5.jpg", "A pink dahlia on a window sill")); + Nature.Add(new Thumbnail("Petals", PREFIX_URL_NATURE + "Nature-6.jpg", "A shot focused on the petals of a pink flower")); + Nature.Add(new Thumbnail("Cynthia", PREFIX_URL_NATURE + "Nature-7.jpg", "Cynthia butterfly landing on a flower")); + Nature.Add(new Thumbnail("Painted Lady", PREFIX_URL_NATURE + "Nature-8.jpg", "Cynthia butterfly showing its painted lady wings")); + Nature.Add(new Thumbnail("Macro Snail", PREFIX_URL_NATURE + "Nature-9.jpg", "A macro shot of a snail in the grass")); + Nature.Add(new Thumbnail("Snail", PREFIX_URL_NATURE + "Nature-10.jpg", "A curious snail raising his head to take a look around")); + Nature.Add(new Thumbnail("Mushroom", PREFIX_URL_NATURE + "Nature-11.jpg", "A small mushroom coming out for spring")); + Nature.Add(new Thumbnail("Japanese Macaques", PREFIX_URL_NATURE + "Nature-12.jpg", "Two japanese macaque monkeys take care of each other")); + Nature.Add(new Thumbnail("Bird Calls", PREFIX_URL_NATURE + "Nature-13.jpg", "A bird calls out looking for its family")); + } + + public ObservableCollection Landscapes + { + get; set; + } + + public ObservableCollection Abstract + { + get; set; + } + public ObservableCollection Nature + { + get; set; + } + + public ObservableCollection AggregateDataSources(ObservableCollection[] sources) + { + ObservableCollection items = new ObservableCollection(); + foreach(ObservableCollection list in sources) + { + foreach(Thumbnail thumbnail in list) + { + items.Add(thumbnail); + } + } + + return RandomizeDataSource(items); + } + + public static ObservableCollection RandomizeDataSource(ObservableCollection list) + { + Random rng = new Random(); + for (int i = list.Count-1; i > 0; i--) + { + int swapIndex = rng.Next(i + 1); + Thumbnail tmp = list[i]; + list[i] = list[swapIndex]; + list[swapIndex] = tmp; + } + + return list; + } + + private static readonly string PREFIX_URL_LANDSCAPE = "ms-appx:///Assets/Landscapes/"; + private static readonly string PREFIX_URL_NATURE = "ms-appx:///Assets/Nature/"; + private static readonly string PREFIX_URL_ABSTRACT = "ms-appx:///Assets/Abstract/"; + } + +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/MainNavigationViewModel.cs b/Samples/SceneGraph/SampleGalleryApp/Shared/MainNavigationViewModel.cs new file mode 100644 index 000000000..f84a2f5e9 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/MainNavigationViewModel.cs @@ -0,0 +1,146 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Windows.UI.Core; + +namespace CompositionSampleGallery +{ + public class MainNavigationViewModel + { + private static MainNavigationViewModel s_instance; + public SampleGalleryNavViewHost _hostingUI; + private List _mainMenuList; + + // Category description text + public const string CategoryDescription_Light = + @"Light has a way of drawing our attention. It’s warm and inviting; it’s fluid and purposeful. Light creates atmosphere and a sense of place, and it’s a practical tool to illuminate information. These samples show some examples of bringing Light into your UI."; + public const string CategoryDescription_Depth = + @"Think about the frame that contains your information. Now break it apart, and reinvent how things relate to each other within a more layered, physical environment. This is how we’ll keep people in their flow – by giving them more space. These samples show a variety of techniques for bringing the concept of Depth into your UI."; + public const string CategoryDescription_Motion = + @"Think of motion design like a movie. Seamless transitions keep you focused on the story, and bring experiences to life. We can invite that feeling into our designs, leading people from one task to the next with cinematic ease. These samples show different ways in which motion can enhance your UI."; + public const string CategoryDescription_Material = + @"The things that surround us in the real world are sensory and invigorating. They bend, stretch, bounce, shatter, and glide. Those material qualities translate to digital environments, making people want to reach out and touch our designs. These samples show how to bring new Materials in your UI."; + public const string CategoryDescription_Scale = + @"The industry lives and breathes 2D design. Now’s the time to expand our toolkit for more dimensions. We’re scaling our design system to work across devices, inviting innovation across new forms. And we’re looking to you to help us imagine this new world. These samples show some building blocks for making custom UI that is tailored for different devices."; + public const string CategoryDescription_APIReference = + @"In addition to the samples that display the Fluent building blocks in UI, some simple API reference samples are provided to ramp up and learn about basic API capabilities."; + public const string CategoryDescription_Input = + @"The visual layer wouldn't be nearly as useful without allowing users to interact with it. Here are some samples to show off some of the ways in which users can interact with the visual elements on the screen"; // TODO: Update description + + + void AddNavigationItem( + List menu, + String displayName, + SampleCategory cat, + Type pageType, + string categoryDescription="", + bool addEvenIfNoMatchingSamples = false, + string thumbnail="") + { + var samples = from sample in SampleDefinitions.Definitions + where (sample.SampleCategory == cat) + select sample; + + if ((samples.Count() > 0) || addEvenIfNoMatchingSamples) + { + menu.Add(new NavigationItem(displayName, cat, pageType, categoryDescription: categoryDescription, thumbnail:thumbnail)); + } + } + + public MainNavigationViewModel(SampleGalleryNavViewHost hostingUI) + { + _hostingUI = hostingUI; + + // Build a collection used to populate the navigation menu. This is where you can define the display names of + // each menu item and which page they map to. + _mainMenuList = new List(); + AddNavigationItem(_mainMenuList, "Home", SampleCategory.None, typeof(HomePage), addEvenIfNoMatchingSamples: true, thumbnail: "ms-appx:///Assets/CategoryIcons/table_home_icon.png"); + AddNavigationItem(_mainMenuList, "Light", SampleCategory.Light, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Light, addEvenIfNoMatchingSamples: true, thumbnail: "ms-appx:///Assets/CategoryIcons/table_light_icon_bw.png"); + AddNavigationItem(_mainMenuList, "Depth", SampleCategory.Depth, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Depth, thumbnail: "ms-appx:///Assets/CategoryIcons/table_depth_icon_bw.png"); + AddNavigationItem(_mainMenuList, "Motion", SampleCategory.Motion, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Motion, thumbnail: "ms-appx:///Assets/CategoryIcons/table_motion_icon_bw.png"); + AddNavigationItem(_mainMenuList, "Material", SampleCategory.Material, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Material, thumbnail: "ms-appx:///Assets/CategoryIcons/table_material_icon_bw.png"); + AddNavigationItem(_mainMenuList, "Scale", SampleCategory.Scale, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Scale, thumbnail: "ms-appx:///Assets/CategoryIcons/table_scale_icon_bw.png"); + AddNavigationItem(_mainMenuList, "API Reference", SampleCategory.APIReference, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_APIReference, thumbnail: "ms-appx:///Assets/CategoryIcons/table_reference_icon.png"); + AddNavigationItem(_mainMenuList, "Input", SampleCategory.Input, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Input, thumbnail: "ms-appx:///Assets/CategoryIcons/Mouse.png"); + + s_instance = this; + + // Navigate to the home screen first + NavigationItem navItem = _mainMenuList.First(); + Dictionary properties = new Dictionary(StringComparer.OrdinalIgnoreCase); + properties.Add("TargetView", navItem.Category.ToString()); + CompositionSampleGallery.AppTelemetryClient.TrackEvent("Navigate", properties, null); + _hostingUI.Navigate(navItem.PageType, navItem); + } + + public List MainMenuList => _mainMenuList; + + public static void NavigateToSample(object sender, ItemClickEventArgs e) + { + NavigateToSample((SampleDefinition)e.ClickedItem); + } + + public static void NavigateToSample(SampleDefinition sample) + { + s_instance._hostingUI.Navigate(typeof(SampleHost), sample); + } + + public static void ShowSearchResults(string queryText) + { + s_instance._hostingUI.Navigate(typeof(SearchResultsPage), queryText); + } + + public static void ShowSettings() + { + s_instance._hostingUI.Navigate((typeof(Settings)), null); + } + } + + public class NavigationItem + { + private string _thumbnail; + private string _displayName; + private string _featuredSamplesTitle; + private Type _pageType; + private SampleCategory _cat; + private string _categoryDescription; + + public string DisplayName {get {return _displayName;} set { _displayName = value; }} + public Type PageType { get { return _pageType; } set { _pageType = value; } } + public SampleCategory Category { get { return _cat; } set { _cat = value; } } + public string FeaturedSamplesTitle { get { return _featuredSamplesTitle; } set { _featuredSamplesTitle = value; } } + public string CategoryDescription { get { return _categoryDescription; } } + public string ThumbnailUri { get { return _thumbnail; } } + public NavigationItem( + string displayName, + SampleCategory cat, + Type pageType, + string categoryDescription, + string thumbnail) + { + _displayName = displayName; + _pageType = pageType; + _cat = cat; + _featuredSamplesTitle = ""; + _categoryDescription = categoryDescription; + _thumbnail = thumbnail; + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/SampleDefinition.cs b/Samples/SceneGraph/SampleGalleryApp/Shared/SampleDefinition.cs new file mode 100644 index 000000000..4daaf4cd5 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/SampleDefinition.cs @@ -0,0 +1,187 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace CompositionSampleGallery +{ + + public enum SampleType + { + Reference, + EndToEnd + }; + + public enum SampleCategory + { + None, + Light, + Depth, + Motion, + Material, + Scale, + APIReference, + Input, + } + + public class SampleDefinition + { + private const string MissingThumbnailAsset = "ms-appx:///Assets/Other/MissingThumbnail.png"; + private string _name; + private Type _pageType; + private SampleType _sampleType; + private SampleCategory _sampleCategory; + private string _imageUrl; + private string _description; + private string[] _tags; + private bool _featured; + private bool _requiresFastEffects; + private bool _requiresEffects; + private DateTime _dateAdded; + + public SampleDefinition + ( + string name, + Type pageType, + SampleType sampleType, + SampleCategory sampleArea, + bool requiresEffects, + bool requiresFastEffects, + string imageUrl = MissingThumbnailAsset, + string description = null, + string[] tags = null, + bool featured = false, + DateTime dateAdded = new DateTime() + ) + { + _name = name; + _pageType = pageType; + _sampleType = sampleType; + _sampleCategory = sampleArea; + _imageUrl = imageUrl; + _description = description; // used when showing more information about a sample, such as for featured samples + _tags = tags; + _featured = featured; + _requiresEffects = requiresEffects; + _requiresFastEffects = requiresFastEffects; + _dateAdded = dateAdded; + } + + public string Name { get { return _name; } } + public Type Type { get { return _pageType; } } + public SampleType SampleType { get { return _sampleType; } } + public SampleCategory SampleCategory { get { return _sampleCategory; } } + public string DisplayName { get { return _name; } } + public string ImageUrl { get { return _imageUrl; } } + public string Description { get { return _description; } } + public string[] Tags { get { return _tags; } } + public bool Featured { get { return _featured; } } + public bool RequiresEffects { get { return _requiresEffects; } } + public bool RequiresFastEffects { get { return _requiresFastEffects; } } + public DateTime DateAdded { get { return _dateAdded; } } + } + + public class SampleDefinitions + { + static SampleDefinitions() + { + RefreshSampleList(); + } + + static public void RefreshSampleList() + { + // Populate the _definitions array only with samples that are supported by the current runtime and hardware + // + // For now always display samples even if effects are slow. In the future, we should put a banner saying that + // this sample is slow on your device, etc. + + var result = from sampleDef in _allDefinitions + where + //(!sampleDef.RequiresFastEffects || MainPage.AreEffectsFast) && + (!sampleDef.RequiresEffects || MainPage.AreEffectsSupported) + select sampleDef; + _definitions = result.ToList(); + } + + // A filtered list of runtime-supported samples + static List _definitions = new List(); + + // Full list of all definitions + static SampleDefinition[] _allDefinitions = + { + // StaticSampleName Class SampleType SampleCategory Effects FastEffects ThumbnailURL StaticSampleDescription Date Added Featured Tags + new SampleDefinition(PropertySets.StaticSampleName, typeof(PropertySets), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/ExpressionsAndPropertySets.PNG", description: PropertySets.StaticSampleDescription, tags: new string[1]{"ExpressionBuilder"}), + new SampleDefinition(PointerEnterEffects.StaticSampleName, typeof(PointerEnterEffects), SampleType.EndToEnd, SampleCategory.Material, true, false, "ms-appx:///Assets/SampleThumbnails/PointerEnterExitEffects.PNG", description: PointerEnterEffects.StaticSampleDescription, tags: new string[1]{"ExpressionBuilder"}), + new SampleDefinition(ParallaxingListItems.StaticSampleName, typeof(ParallaxingListItems), SampleType.EndToEnd, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/ParallaxingListviewItem.PNG", description: ParallaxingListItems.StaticSampleDescription), + new SampleDefinition(Z_OrderScrolling.StaticSampleName, typeof(Z_OrderScrolling), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/Z-OrderScrolling.PNG", description: Z_OrderScrolling.StaticSampleDescription, tags: new string[2]{"ExpressionBuilder", "ZOrder"}), + new SampleDefinition(BasicXamlInterop.StaticSampleName, typeof(BasicXamlInterop), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/BasicXAMLInterop.PNG", description: BasicXamlInterop.StaticSampleDescription), + new SampleDefinition(ZoomWithPerspective.StaticSampleName, typeof(ZoomWithPerspective), SampleType.EndToEnd, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/ZoomWithPerspective.PNG", description: ZoomWithPerspective.StaticSampleDescription), + new SampleDefinition(BasicLayoutAndTransforms.StaticSampleName, typeof(BasicLayoutAndTransforms), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/BasicLayoutAndTransitions.PNG", description: BasicLayoutAndTransforms.StaticSampleDescription), + new SampleDefinition(Perspective.StaticSampleName, typeof(Perspective), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/Perspective.png", description: Perspective.StaticSampleDescription), + new SampleDefinition(ColorBloomTransition.StaticSampleName, typeof(ColorBloomTransition), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/ColorBloom.jpg", description: ColorBloomTransition.StaticSampleDescription), + new SampleDefinition(ColorSlideTransition.StaticSampleName, typeof(ColorSlideTransition), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/ColorSlide.png", description: ColorSlideTransition.StaticSampleDescription), + new SampleDefinition(FlipToReveal.StaticSampleName, typeof(FlipToReveal), SampleType.EndToEnd, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/FlipToReveal.png", description: FlipToReveal.StaticSampleDescription), + new SampleDefinition(ConnectedAnimationShell.StaticSampleName, typeof(ConnectedAnimationShell), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/ContinuityAnimations.jpg", description: ConnectedAnimationShell.StaticSampleDescription, featured: true, tags: new string[1]{"ExpressionBuilder"}), + new SampleDefinition(BackDropSample.StaticSampleName, typeof(BackDropSample), SampleType.Reference, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/BackDropControlSample.PNG", description: BackDropSample.StaticSampleDescription), + new SampleDefinition(Gears.StaticSampleName, typeof(Gears), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/Gears.PNG", description: Gears.StaticSampleDescription), + new SampleDefinition(ImplicitAnimationTransformer.StaticSampleName, typeof(ImplicitAnimationTransformer), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/ImplicitAnimations.PNG", description: ImplicitAnimationTransformer.StaticSampleDescription), + //new SampleDefinition(VideoPlayground.StaticSampleName, typeof(VideoPlayground), SampleType.Reference, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/VideoPlayground.PNG", description: VideoPlayground.StaticSampleDescription), + new SampleDefinition(Photos.StaticSampleName, typeof(Photos), SampleType.EndToEnd, SampleCategory.Scale, false, false, "ms-appx:///Assets/SampleThumbnails/LayoutAnimations.PNG", description: Photos.StaticSampleDescription), + new SampleDefinition(TreeEffects.StaticSampleName, typeof(TreeEffects), SampleType.Reference, SampleCategory.Depth, true, true, "ms-appx:///Assets/SampleThumbnails/TreeEffect.PNG", description: TreeEffects.StaticSampleDescription), + new SampleDefinition(LayerVisualAnd3DTransform.StaticSampleName, typeof(LayerVisualAnd3DTransform), SampleType.EndToEnd, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/LayerVisualSample.PNG", description: LayerVisualAnd3DTransform.StaticSampleDescription), + new SampleDefinition(ForegroundFocusEffects.StaticSampleName, typeof(ForegroundFocusEffects), SampleType.EndToEnd, SampleCategory.Depth, true, true, "ms-appx:///Assets/SampleThumbnails/ForegroundFocusEffects.PNG", description: ForegroundFocusEffects.StaticSampleDescription), + new SampleDefinition(PhotoViewer.StaticSampleName, typeof(PhotoViewer), SampleType.EndToEnd, SampleCategory.Motion, true, false, "ms-appx:///Assets/SampleThumbnails/PhotoPopupViewer.PNG", description: PhotoViewer.StaticSampleDescription), + new SampleDefinition(ThumbnailLighting.StaticSampleName, typeof(ThumbnailLighting), SampleType.EndToEnd, SampleCategory.Light, true, true, "ms-appx:///Assets/SampleThumbnails/ThumbnailLighting.jpg", description: ThumbnailLighting.StaticSampleDescription), + new SampleDefinition(Curtain.StaticSampleName, typeof(Curtain), SampleType.Reference, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/Curtain.PNG", description: Curtain.StaticSampleDescription, tags: new string[1]{"ExpressionBuilder"}), + new SampleDefinition(PullToAnimate.StaticSampleName, typeof(PullToAnimate), SampleType.EndToEnd, SampleCategory.Depth, true, true, "ms-appx:///Assets/SampleThumbnails/PullToAnimate.jpg", description: PullToAnimate.StaticSampleDescription, featured: true), + new SampleDefinition(NowPlaying.StaticSampleName, typeof(NowPlaying), SampleType.EndToEnd, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/NowPlaying.PNG", description: NowPlaying.StaticSampleDescription), + new SampleDefinition(ShadowPlayground.StaticSampleName, typeof(ShadowPlayground), SampleType.Reference, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/ShadowPlayground.jpg", description: ShadowPlayground.StaticSampleDescription), + new SampleDefinition(ShadowInterop.StaticSampleName, typeof(ShadowInterop), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/ShadowInterop.PNG", description: ShadowInterop.StaticSampleDescription), + new SampleDefinition(TextShimmer.StaticSampleName, typeof(TextShimmer), SampleType.EndToEnd, SampleCategory.Light, true, true, "ms-appx:///Assets/SampleThumbnails/TextShimmer.png", description: TextShimmer.StaticSampleDescription, featured: true), + new SampleDefinition(NineGridResizing.StaticSampleName, typeof(NineGridResizing), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/NineGridResizing.PNG", description: NineGridResizing.StaticSampleDescription), + new SampleDefinition(LayerDepth.StaticSampleName, typeof(LayerDepth), SampleType.EndToEnd, SampleCategory.Depth, true, true, "ms-appx:///Assets/SampleThumbnails/LayerDepth.PNG", description: LayerDepth.StaticSampleDescription), + new SampleDefinition(LightSphere.StaticSampleName, typeof(LightSphere), SampleType.Reference, SampleCategory.Light, true, true, "ms-appx:///Assets/SampleThumbnails/LightSpheres.PNG", description: LightSphere.StaticSampleDescription), + //new SampleDefinition(SwipeScroller.StaticSampleName, typeof(SwipeScroller), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/SwipeScroller.PNG", description: SwipeScroller.StaticSampleDescription dateAdded: new DateTime(2017,03,05), featured: true), + new SampleDefinition(ShyHeader.StaticSampleName, typeof(ShyHeader), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/ShyHeader.PNG", description: ShyHeader.StaticSampleDescription, dateAdded: new DateTime(2017,04,25), featured: true), + new SampleDefinition(BlurPlayground.StaticSampleName, typeof(BlurPlayground), SampleType.Reference, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/BlurPlayground.PNG", description: BackDropSample.StaticSampleDescription), + new SampleDefinition(Interactions3D.StaticSampleName, typeof(Interactions3D), SampleType.EndToEnd, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/Interaction3D.PNG", description: Interactions3D.StaticSampleDescription, featured: true, tags: new string[2]{"3d", "InteractionTracker"}), + new SampleDefinition(BorderPlayground.StaticSampleName, typeof(BorderPlayground), SampleType.Reference, SampleCategory.APIReference, false, true, "ms-appx:///Assets/SampleThumbnails/BorderEffects.PNG", description: BorderPlayground.StaticSampleDescription, dateAdded: new DateTime(2017,02,08)), + new SampleDefinition(CompCapabilities.StaticSampleName, typeof(CompCapabilities), SampleType.Reference, SampleCategory.Scale, false, false, "ms-appx:///Assets/SampleThumbnails/CompositionCapabilities.PNG", description: CompCapabilities.StaticSampleDescription, dateAdded: new DateTime(2017,02,08), featured: true), + //new SampleDefinition(TransparentWindow.StaticSampleName, typeof(TransparentWindow), SampleType.EndToEnd, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/TransparentWindow.PNG", description: TransparentWindow.StaticSampleDescription dateAdded: new DateTime(2017,02,08), featured: true), + new SampleDefinition(NavigationFlow.StaticSampleName, typeof(NavigationFlow), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/NavigationFlow.PNG", description: NavigationFlow.StaticSampleDescription, dateAdded: new DateTime(2017,02,08), featured: true), + //new SampleDefinition(ShowHideImplicitWebview.StaticSampleName, typeof(ShowHideImplicitWebview), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/ShowHideImplicitWebview.PNG", description: ShowHideImplicitWebview.StaticSampleDescription dateAdded: new DateTime(2017,02,28)), + new SampleDefinition(ShadowsAdvanced.StaticSampleName, typeof(ShadowsAdvanced), SampleType.Reference, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/AdvancedShadows.PNG", description: ShadowsAdvanced.StaticSampleDescription, featured: true), + new SampleDefinition(OffsetStompingFix.StaticSampleName, typeof(OffsetStompingFix), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/OffsetStompingFix.PNG", description: OffsetStompingFix.StaticSampleDescription, dateAdded: new DateTime(2017,04,18), featured: true), + new SampleDefinition(PointerRotate.StaticSampleName, typeof(PointerRotate), SampleType.Reference, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/PointerRotate.PNG", description: PointerRotate.StaticSampleDescription, dateAdded: new DateTime(2017,04,25), featured: true), + new SampleDefinition(BrushInterop.StaticSampleName, typeof(BrushInterop), SampleType.Reference, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/BrushInterop.PNG", description: BrushInterop.StaticSampleDescription, dateAdded: new DateTime(2017,06,21), featured: true), + new SampleDefinition(LightInterop.StaticSampleName, typeof(LightInterop), SampleType.Reference, SampleCategory.Material, true, true, "ms-appx:///Assets/SampleThumbnails/LightInterop.PNG", description: LightInterop.StaticSampleDescription, dateAdded: new DateTime(2017,06,21), featured: true), + new SampleDefinition(PullToRefresh.StaticSampleName, typeof(PullToRefresh), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/PullToRefresh.PNG", description: PullToRefresh.StaticSampleDescription, dateAdded: new DateTime(2017,09,12)), + new SampleDefinition(SpringyImage.StaticSampleName, typeof(SpringyImage), SampleType.Reference, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/SpringyImage.PNG", description: SpringyImage.StaticSampleDescription, dateAdded: new DateTime(2017,08,7), tags: new string[1]{"ExpressionBuilder"}), + new SampleDefinition(LinearGradients.StaticSampleName, typeof(LinearGradients), SampleType.Reference, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/LinearGradients.PNG", description: LinearGradients.StaticSampleDescription, dateAdded: new DateTime(2019,02,27)), + new SampleDefinition(AnimationControl.StaticSampleName, typeof(AnimationControl), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/AnimationController.PNG", description: AnimationControl.StaticSampleDescription, dateAdded: new DateTime(2018,12,3)), + new SampleDefinition(Lottie.StaticSampleName, typeof(Lottie), SampleType.Reference, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/Lottie.png", description: AnimationControl.StaticSampleDescription, dateAdded: new DateTime(2020,07,29)), + new SampleDefinition(SceneNodePlayground.StaticSampleName, typeof(SceneNodePlayground), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/SceneNodePlayground.PNG", description: SceneNodePlayground.StaticSampleDescription, dateAdded: new DateTime(2020,07,29)), + new SampleDefinition(GestureRecognizer.StaticSampleName, typeof(GestureRecognizer), SampleType.Reference, SampleCategory.Input, false, false, "ms-appx:///Assets/SampleThumbnails/GestureRecognizer.png", description: GestureRecognizer.StaticSampleDescription, dateAdded: new DateTime(2021,04,6), featured: true), + new SampleDefinition(GestureRecognizerManipulation.StaticSampleName,typeof(GestureRecognizerManipulation),SampleType.Reference, SampleCategory.Input, false, false, "ms-appx:///Assets/SampleThumbnails/Manipulation.png", description: GestureRecognizerManipulation.StaticSampleDescription, dateAdded: new DateTime(2021,04,15)), + new SampleDefinition(InputCursor.StaticSampleName, typeof(InputCursor), SampleType.Reference, SampleCategory.Input, false, false, "ms-appx:///Assets/SampleThumbnails/CoreCursor.png", description: InputCursor.StaticSampleDescription, dateAdded: new DateTime(2021,10,26), featured: true), + }; + + public static List Definitions + { + get { return _definitions; } + } + } +} \ No newline at end of file diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/SampleHost.xaml b/Samples/SceneGraph/SampleGalleryApp/Shared/SampleHost.xaml new file mode 100644 index 000000000..5deb34cf5 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/SampleHost.xaml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/SampleHost.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Shared/SampleHost.xaml.cs new file mode 100644 index 000000000..68321498a --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/SampleHost.xaml.cs @@ -0,0 +1,59 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; + +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Documents; +using Microsoft.UI.Xaml.Navigation; + +namespace CompositionSampleGallery +{ + public sealed partial class SampleHost : Page + { + private SampleDefinition _sampleDefinition; + + public SampleDefinition SampleDefinition + { + get { return _sampleDefinition; } + set { _sampleDefinition = value; } + } + + public SampleHost() + { + this.InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + SampleDefinition definition = (SampleDefinition)e.Parameter; + SampleDefinition = definition; + ContentFrame.Navigate(definition.Type, this); + } + + public void TagHyperlink_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + var inline = ((Hyperlink)sender).Inlines[0]; + var run = (Run)inline; + var searchString = run.Text; + + if (!String.IsNullOrEmpty(searchString)) + { + MainNavigationViewModel.ShowSearchResults(searchString); + } + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/SamplePage.cs b/Samples/SceneGraph/SampleGalleryApp/Shared/SamplePage.cs new file mode 100644 index 000000000..fd5b84e5a --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/SamplePage.cs @@ -0,0 +1,56 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; + +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Documents; +using Microsoft.UI.Xaml.Navigation; + +namespace CompositionSampleGallery +{ + public abstract class SamplePage : Page + { + public abstract string SampleDescription { get; } + public abstract string SampleName { get; } + public virtual string SampleCodeUri { get { return "https://github.com/Microsoft/windowscompositionsamples/";} } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + if (e.Parameter is SampleHost host) + { + host.SampleDescription.Text = SampleDescription; + host.SampleName.Text = SampleName; + host.SampleCode.NavigateUri = new Uri(SampleCodeUri); + + // Show sample tags if any exist + if(host.SampleDefinition.Tags != null) + { + host.SampleTagsTextBlock.Visibility = Microsoft.UI.Xaml.Visibility.Visible; + host.SampleTagsTextBlock.Inlines.Add(new Run() { Text = "Tags: " }); + foreach (string t in host.SampleDefinition.Tags) + { + var hyperlink = new Hyperlink(); + hyperlink.Click += host.TagHyperlink_Click; + hyperlink.Inlines.Add(new Run() { Text = t }); + host.SampleTagsTextBlock.Inlines.Add(hyperlink); + host.SampleTagsTextBlock.Inlines.Add(new Run() { Text = " " }); + } + } + } + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/SharedResourceDictionaries.xaml b/Samples/SceneGraph/SampleGalleryApp/Shared/SharedResourceDictionaries.xaml new file mode 100644 index 000000000..324aba360 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/SharedResourceDictionaries.xaml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/SharedResourceDictionaries.xaml.cs b/Samples/SceneGraph/SampleGalleryApp/Shared/SharedResourceDictionaries.xaml.cs new file mode 100644 index 000000000..c59fec422 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/SharedResourceDictionaries.xaml.cs @@ -0,0 +1,24 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +namespace CompositionSampleGallery +{ + public partial class SharedResourceDictionaries + { + public SharedResourceDictionaries() + { + this.InitializeComponent(); + } + } +} diff --git a/Samples/SceneGraph/SampleGalleryApp/Shared/Social.xaml b/Samples/SceneGraph/SampleGalleryApp/Shared/Social.xaml new file mode 100644 index 000000000..4499cdbb5 --- /dev/null +++ b/Samples/SceneGraph/SampleGalleryApp/Shared/Social.xaml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +