Showing preview only (4,622K chars total). Download the full file or copy to clipboard to get everything.
Repository: EdCharbeneau/BlazorSize
Branch: master
Commit: 59af9c85463a
Files: 115
Total size: 4.4 MB
Directory structure:
gitextract_m_q4b0tl/
├── .gitattributes
├── .gitignore
├── BlazorPro.BlazorSize.BlazorRepl/
│ ├── BlazorPro.BlazorSize.BlazorRepl.csproj
│ ├── BlazorReplMediaQueryService.cs
│ └── LICENSE.txt
├── BlazorPro.BlazorSize.Bunit/
│ ├── BlazorPro.BlazorSize.Bunit.csproj
│ ├── BunitExtensions.cs
│ └── FakeMediaQueryService.cs
├── BlazorSize/
│ ├── BlazorPro.BlazorSize.csproj
│ ├── Configuration/
│ │ ├── ResizeOptions.cs
│ │ └── ServiceCollectionExtensions.cs
│ ├── LICENSE.txt
│ ├── MediaQuery/
│ │ ├── Breakpoints.cs
│ │ ├── IMediaQueryService.cs
│ │ ├── MediaQuery.razor
│ │ ├── MediaQuery.razor.cs
│ │ ├── MediaQueryArgs.cs
│ │ ├── MediaQueryCache.cs
│ │ ├── MediaQueryList.razor
│ │ ├── MediaQueryList.razor.cs
│ │ └── MediaQueryService.cs
│ ├── Resize/
│ │ ├── BrowserWindowSize.cs
│ │ ├── IResizeListener.cs
│ │ └── ResizeListener.cs
│ ├── _Imports.razor
│ ├── jest.config.js
│ ├── package.json
│ ├── readme.md
│ ├── scripts/
│ │ ├── blazorSizeMedia.ts
│ │ ├── blazorSizeMediaModule.ts
│ │ ├── blazorSizeResize.ts
│ │ ├── blazorSizeResizeModule.ts
│ │ └── tests/
│ │ └── blazorSize.test.ts
│ ├── tsconfig.build.json
│ └── tsconfig.json
├── BlazorSize.UnitTesting/
│ ├── BlazorPro.BlazorSize.UnitTesting.csproj
│ ├── Bunit/
│ │ ├── BunitExtensions.cs
│ │ └── FakeMediaQueryService.cs
│ └── LICENSE.txt
├── BlazorSize.e2eTests/
│ ├── BlazorSize Adaptive Table and Template.imgstore
│ ├── BlazorSize Adaptive Table and Template.resx
│ ├── BlazorSize Adaptive Table and Template.tstest
│ ├── BlazorSize Adaptive Table and Template.tstest.cs
│ ├── BlazorSize Construct & Dispose.imgstore
│ ├── BlazorSize Construct & Dispose.resx
│ ├── BlazorSize Construct & Dispose.tstest
│ ├── BlazorSize Size Reverse.imgstore
│ ├── BlazorSize Size Reverse.resx
│ ├── BlazorSize Size Reverse.tstest
│ ├── BlazorSize Size Reverse.tstest.cs
│ ├── BlazorSize Size Tests.imgstore
│ ├── BlazorSize Size Tests.resx
│ ├── BlazorSize Size Tests.tstest
│ ├── BlazorSize Size Tests.tstest.cs
│ ├── BlazorSize Test Multicast Reverse.imgstore
│ ├── BlazorSize Test Multicast Reverse.resx
│ ├── BlazorSize Test Multicast Reverse.tstest
│ ├── BlazorSize Test Multicast Reverse.tstest.cs
│ ├── BlazorSize Test Multicast.imgstore
│ ├── BlazorSize Test Multicast.resx
│ ├── BlazorSize Test Multicast.tstest
│ ├── BlazorSize Test Multicast.tstest.cs
│ ├── BlazorSize.e2eTests.csproj
│ ├── Profiler Configurations/
│ │ ├── {1c6f74bd-1a14-4014-a8c9-02fdb3cb8302}.tsprofconfig
│ │ └── {d3bce0f5-b6f6-45aa-959a-5c1c1753902b}.tsprofconfig
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Settings.aiis
│ └── TestLists/
│ └── BlazorSize .NET Web App.aiilist
├── BlazorSize.sln
├── BlazorWebApp/
│ ├── BlazorWebApp/
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components/
│ │ │ ├── App.razor
│ │ │ ├── Pages/
│ │ │ │ └── Error.razor
│ │ │ └── _Imports.razor
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot/
│ │ └── app.css
│ └── BlazorWebApp.Client/
│ ├── BlazorWebApp.Client.csproj
│ ├── Layout/
│ │ ├── MainLayout.razor
│ │ ├── MainLayout.razor.css
│ │ ├── NavMenu.razor
│ │ └── NavMenu.razor.css
│ ├── Program.cs
│ ├── Routes.razor
│ ├── _Imports.razor
│ └── wwwroot/
│ ├── appsettings.Development.json
│ └── appsettings.json
├── PlaywrightTests/
│ ├── MediaQueryTests.cs
│ ├── PlaywrightTests.csproj
│ ├── ResizeTests.cs
│ └── TestHelpers.cs
├── TestComponents/
│ ├── Data/
│ │ └── IWeatherForecastService.cs
│ ├── Pages/
│ │ ├── Blank.razor
│ │ ├── Error.razor
│ │ ├── FetchData.razor
│ │ ├── Index.razor
│ │ ├── Multicast.razor
│ │ ├── NullableFlag.razor
│ │ ├── ScreenSize.razor
│ │ ├── ScreenSizeReporter.razor
│ │ └── Templates.razor
│ ├── TestComponents.csproj
│ ├── WeatherCards.razor
│ ├── WeatherForecast.cs
│ ├── WeatherGrid.razor
│ ├── _Imports.razor
│ └── wwwroot/
│ ├── fixture.html
│ └── fixture.js
├── bUnitCompatibilityTests/
│ ├── CompTest.cs
│ ├── Sample.razor
│ ├── _Imports.razor
│ └── bUnitCompatibilityTests.csproj
├── package.json
└── readme.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- Backup*.rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
/BlazorSize/scripts/tests/*.js
/BlazorSize/wwwroot/*.js
/BlazorSize.e2eTests/Pages.g.cs
/BlazorSize.e2eTests/Results
/BlazorSize.e2eTests/.ts/project.state
/BlazorSize.e2eTests/Profiler Configurations/{1f06cb7a-bdc7-4bbe-a956-ce0dcffbcd0f}.tsprofconfig
================================================
FILE: BlazorPro.BlazorSize.BlazorRepl/BlazorPro.BlazorSize.BlazorRepl.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Version>6.1.0</Version>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Authors>Ed Charbeneau</Authors>
<Company>EdCharbeneau.com</Company>
<Description>A replacement service only for use with Telerik REPL for Blazor and BlazorSize. This is for demos only and should not be used outside of Telerik REPL for Blazor.</Description>
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
<PackageProjectUrl>https://github.com/EdCharbeneau/BlazorSize</PackageProjectUrl>
<PackageIcon>blazor-glove-128.jpg</PackageIcon>
<PackageIconUrl />
<RepositoryUrl>https://github.com/EdCharbeneau/BlazorSize</RepositoryUrl>
<PackageTags>Blazor, JavaScript Interop</PackageTags>
<PackageReleaseNotes>
6.0.0 Added support for Telerik REPL for Blazor.
</PackageReleaseNotes>
</PropertyGroup>
<ItemGroup>
<!-- Package Logo -->
<None Include="..\_resources\blazor-glove-128.jpg">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
<!-- Package license file -->
<None Include="LICENSE.txt">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\BlazorSize\BlazorPro.BlazorSize.csproj" />
</ItemGroup>
</Project>
================================================
FILE: BlazorPro.BlazorSize.BlazorRepl/BlazorReplMediaQueryService.cs
================================================
namespace BlazorPro.BlazorSize
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.JSInterop;
using BlazorPro.BlazorSize;
public class BlazorReplMediaQueryService : IAsyncDisposable, IMediaQueryService
{
private readonly Lazy<Task<IJSObjectReference>> moduleTask;
public BlazorReplMediaQueryService(IJSRuntime jsRuntime)
{
moduleTask = new(() => jsRuntime.InvokeAsync<IJSObjectReference>(
"import", "https://edcharbeneau.com/javascript/blazorSizeMediaModule.js").AsTask());
}
// JavaScript uses this value for tracking MediaQueryList instances.
private DotNetObjectReference<MediaQueryList> DotNetInstance { get; set; } = null!;
private readonly List<MediaQueryCache> mediaQueries = new();
public List<MediaQueryCache> MediaQueries => mediaQueries;
private MediaQueryCache? GetMediaQueryFromCache(string byMedia) => mediaQueries?.Find(q => q.MediaRequested == byMedia);
public void AddQuery(MediaQuery newMediaQuery)
{
var cache = GetMediaQueryFromCache(byMedia: newMediaQuery.Media);
if (cache == null)
{
cache = new MediaQueryCache
{
MediaRequested = newMediaQuery.Media,
};
mediaQueries.Add(cache);
}
cache.MediaQueries?.Add(newMediaQuery);
}
public async Task RemoveQuery(MediaQuery mediaQuery)
{
if (mediaQuery == null) return;
MediaQueryCache? cache = GetMediaQueryFromCache(byMedia: mediaQuery.Media);
if (cache == null || cache.MediaQueries == null) return;
try
{
cache.MediaQueries.Remove(mediaQuery);
if (cache.MediaQueries.Any()) return;
mediaQueries.Remove(cache);
IJSObjectReference module = await moduleTask.Value;
await module.InvokeVoidAsync($"removeMediaQuery", DotNetInstance, mediaQuery.InternalMedia.Media);
}
catch (Exception)
{
//https://stackoverflow.com/questions/72488563/blazor-server-side-application-throwing-system-invalidoperationexception-javas
}
}
public async Task Initialize(MediaQuery mediaQuery)
{
if (mediaQuery?.Media == null) return;
var cache = GetMediaQueryFromCache(byMedia: mediaQuery.Media);
if (cache == null) return;
if (cache.Value == null)
{
// If we don't flag the cache as loading, duplicate requests will be sent async.
// Duplicate requests = poor performance, esp with web sockets.
if (!cache.Loading)
{
cache.Loading = true;
var module = await moduleTask.Value;
var task = module.InvokeAsync<MediaQueryArgs>($"addMediaQueryToList", DotNetInstance, cache.MediaRequested);
cache.Value = await task;
cache.Loading = task.IsCompleted;
// When loading is complete dispatch an update to all subscribers.
if (cache.MediaQueries is null) return;
foreach (var item in cache.MediaQueries)
{
item.MediaQueryChanged(cache.Value);
}
}
}
else
{
var module = await moduleTask.Value;
var task = module.InvokeAsync<MediaQueryArgs>($"getMediaQueryArgs", cache.MediaRequested);
cache.Value = await task;
mediaQuery.MediaQueryChanged(cache.Value);
}
}
public async Task CreateMediaQueryList(DotNetObjectReference<MediaQueryList> dotNetObjectReference)
{
DotNetInstance = dotNetObjectReference;
var module = await moduleTask.Value;
await module.InvokeVoidAsync("addMediaQueryList", dotNetObjectReference);
}
public async ValueTask DisposeAsync()
{
if (DotNetInstance is not null)
{
var module = await moduleTask.Value;
await module.InvokeVoidAsync("removeMediaQueryList", DotNetInstance);
DotNetInstance.Dispose();
GC.SuppressFinalize(this);
}
}
}
}
================================================
FILE: BlazorPro.BlazorSize.BlazorRepl/LICENSE.txt
================================================
Copyright 2022 Ed Charbeneau
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
================================================
FILE: BlazorPro.BlazorSize.Bunit/BlazorPro.BlazorSize.Bunit.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="bunit.web" Version="1.1.5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\BlazorSize\BlazorPro.BlazorSize.csproj" />
</ItemGroup>
</Project>
================================================
FILE: BlazorPro.BlazorSize.Bunit/BunitExtensions.cs
================================================
using BlazorPro.BlazorSize;
using Microsoft.Extensions.DependencyInjection;
namespace Bunit
{
public static class BunitExtensions
{
public static FakeMediaQueryService AddBlazorSize(this TestContextBase testContext)
{
testContext.RenderTree.Add<MediaQueryList>();
var mediaQueryServices = new FakeMediaQueryService(testContext);
testContext.Services.AddSingleton<IMediaQueryService>(mediaQueryServices);
return mediaQueryServices;
}
}
}
================================================
FILE: BlazorPro.BlazorSize.Bunit/FakeMediaQueryService.cs
================================================
using System.Collections.Generic;
using System.Threading.Tasks;
using BlazorPro.BlazorSize;
using Bunit;
using Microsoft.JSInterop;
namespace Bunit
{
public class FakeMediaQueryService : IMediaQueryService
{
private readonly TestContextBase contextBase;
private MediaQueryArgs? activeMediaQuery = null;
public List<MediaQueryCache> MediaQueries { get; } = new();
public FakeMediaQueryService(TestContextBase contextBase)
{
this.contextBase = contextBase;
}
public void AddQuery(MediaQuery newMediaQuery)
{
var mediaQueryCache = GetMediaQueryFromCache(newMediaQuery.Media);
if (mediaQueryCache is null)
{
mediaQueryCache = new MediaQueryCache()
{
MediaRequested = newMediaQuery.Media
};
MediaQueries.Add(mediaQueryCache);
}
mediaQueryCache.MediaQueries.Add(newMediaQuery);
SetActiveMediaQuery(activeMediaQuery);
}
public Task CreateMediaQueryList(DotNetObjectReference<MediaQueryList> dotNetObjectReference)
=> Task.CompletedTask;
public Task Initialize(MediaQuery mediaQuery)
=> Task.CompletedTask;
public Task RemoveQuery(MediaQuery mediaQuery)
{
var mediaQueryFromCache = GetMediaQueryFromCache(mediaQuery.Media);
if (mediaQueryFromCache is null)
return Task.CompletedTask;
mediaQueryFromCache.MediaQueries.Remove(mediaQuery);
if (mediaQueryFromCache.MediaQueries.Count == 0)
MediaQueries.Remove(mediaQueryFromCache);
return Task.CompletedTask;
}
public void SetActiveBreakPoint(string breakpoint)
=> SetActiveMediaQuery(new MediaQueryArgs
{
Matches = true,
Media = breakpoint
});
public void SetActiveMediaQuery(MediaQueryArgs args)
{
if (args is null)
return;
activeMediaQuery = args;
// cache must be compared by actual value, not RequestedMedia when invoked from JavaScript
// DOM Media value my be different that the initally requested media query value.
var cache = GetMediaQueryFromCache(args.Media);
if (cache is null) return;
// Dispatch events to all subscribers
contextBase.Renderer.Dispatcher.InvokeAsync(() =>
{
foreach (var item in cache.MediaQueries)
{
item.MediaQueryChanged(args);
}
});
}
private MediaQueryCache GetMediaQueryFromCache(string byMedia)
=> MediaQueries?.Find(q => q.MediaRequested == byMedia);
}
}
================================================
FILE: BlazorSize/BlazorPro.BlazorSize.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<TargetFrameworks>net9.0</TargetFrameworks>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
<Version>9.0.0</Version>
<Authors>Ed Charbeneau</Authors>
<Company>EdCharbeneau.com</Company>
<Description>A JavaScript interop for Blazor used to detect the browser's screen size and perform Media Query tests. BlazorSize uses the DOM API `matchMedia` to test screen size. BlazorSize was created to allow Blazor components to render adaptively.</Description>
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
<PackageProjectUrl>https://github.com/EdCharbeneau/BlazorSize</PackageProjectUrl>
<PackageReadmeFile>readme.md</PackageReadmeFile>
<PackageIcon>blazor-glove-128.jpg</PackageIcon>
<PackageIconUrl />
<RepositoryUrl>https://github.com/EdCharbeneau/BlazorSize</RepositoryUrl>
<PackageTags>Blazor, JavaScript Interop</PackageTags>
<PackageReleaseNotes>
9.0.0 Fixes issue with UnobservedTaskExceptions
8.0.0 Adds support for .NET 8 interactive modes
6.2.2 Fixes more codepaths that may result in Microsoft.JSInterop.JSDisconnectedException
6.2.1 Fixed Microsoft.JSInterop.JSDisconnectedException
6.2.0 Fixed bug where MediaQuery dispose was not always working correctly.
6.1.2 Fixed casing on JS modules, fixes deployment issues on Linux. (regression)
6.1.1 Replaced deprecated `addListener` method. Removed console log messages, again.
6.1.0 Removed dependency for bUnit.Core. Breaking changes may occur in test projects. Removed console log messages.
6.0.0 Fixed possible null issues. .NET 6 support. Moved APIs for bUnit to BlazorPro.BlazorSize.UnitTesting.
5.0.0 Added support for bUnit. Removed support for .NET 3.x
4.0.0 no release, aligning with .NET 5.0. Next version will no longer support .NET 3.x
3.2.0
Added service interfaces, IMediaQueryService, IResizeListener to support unit testing scenarios
Added end-to-end testing on source for QA
3.1.0
Added .NET 5 module loading for BlazorSize Resize Listener.
Fixed casing on JS modules, fixes deployment issues on Linux.
3.0.0
Added .NET 5 module loading for BlazorSize Media Queries.
2.3.0
Fixed additional regressions from 2.2.0, update recommended.
2.2.0
Fixed possible regressions, update recommended.
Updated Blazor dependencies.
2.1.1
Fixed MSBuild including *.json files breaking NuGet pkg.
2.0.0
Added MediaQueryList & MediaQuery components.
1.2.2
Fixes initalization issues with Client-Side Blazor
1.2.0
Full-release
</PackageReleaseNotes>
<AssemblyVersion>6.2.0.0</AssemblyVersion>
<FileVersion>6.2.0.0</FileVersion>
<PackageId>BlazorPro.BlazorSize</PackageId>
</PropertyGroup>
<!--<ItemGroup Condition="'$(TargetFramework)' == 'net5.0'">-->
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components" Version="9.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.0" />
</ItemGroup>
<!-- NuGet info -->
<ItemGroup>
<None Include="readme.md" Pack="true" PackagePath="\"/>
<!-- Package Logo -->
<None Include="..\_resources\blazor-glove-128.jpg">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
<!-- Package license file -->
<None Include="LICENSE.txt">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
<!-- Exclude -->
<!-- /scripts/test/*.js is removed via rimraf in the testing phase -->
<Content Include="*.ts">
<Pack>False</Pack>
</Content>
<Content Update="*.json">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
<Pack>False</Pack>
</Content>
</ItemGroup>
<!-- static resources _content/* -->
<!-- / Nuget Info -->
</Project>
================================================
FILE: BlazorSize/Configuration/ResizeOptions.cs
================================================
namespace BlazorPro.BlazorSize
{
public class ResizeOptions
{
/// <summary>
/// Rate in milliseconds that the browsers `resize()` event should report a change.
/// Setting this value too low can cause poor application performance.
/// </summary>
public int ReportRate { get; set; } = 300;
/// <summary>
/// Report resize events and media queries in the browser's console.
/// </summary>
public bool EnableLogging { get; set; } = false;
/// <summary>
/// Suppress the first OnResized that is invoked when a new event handler is added.
/// </summary>
public bool SuppressInitEvent { get; set; } = false;
}
}
================================================
FILE: BlazorSize/Configuration/ServiceCollectionExtensions.cs
================================================
using Microsoft.Extensions.DependencyInjection;
using System;
namespace BlazorPro.BlazorSize
{
public static class ServiceCollectionExtensions
{
/// <summary>
/// Adds a BlazorSize.ResizeListener as a Scoped instance.
/// </summary>
/// <param name="resizeOptions">Defines settings for this instance.</param>
/// <returns>Continues the IServiceCollection chain.</returns>
public static IServiceCollection AddResizeListener(this IServiceCollection services,
Action<ResizeOptions>? resizeOptions = null)
{
services.AddScoped<IResizeListener, ResizeListener>();
if(resizeOptions is not null)
services.Configure(resizeOptions);
return services;
}
/// <summary>
/// Adds a BlazorSize.MediaQueryService as a Scoped instance.
/// </summary>
/// <returns>Continues the IServiceCollection chain.</returns>
public static IServiceCollection AddMediaQueryService(this IServiceCollection services)
{
services.AddScoped<IMediaQueryService, MediaQueryService>();
return services;
}
}
}
================================================
FILE: BlazorSize/LICENSE.txt
================================================
Copyright 2019 Ed Charbeneau
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
================================================
FILE: BlazorSize/MediaQuery/Breakpoints.cs
================================================
namespace BlazorPro.BlazorSize
{
public static class Breakpoints
{
/// @media(min-width: 576px) { ... }
/// Small devices (landscape phones, 576px and up)
public const string SmallUp = "(min-width: 576px)";
/// @media(min-width: 768px) { ... }
/// Medium devices (tablets, 768px and up)
public const string MediumUp = "(min-width: 768px)";
// Large devices (desktops, 992px and up)
/// @media(min-width: 992px) { ... }
public const string LargeUp = "(min-width: 992px)";
/// Extra large devices (large desktops, 1200px and up)
/// @media(min-width: 1200px) { ... }
public const string XLargeUp = "(min-width: 1200px)";
/// Extra small devices (portrait phones, less than 576px)
/// @media(max-width: 575.98px) { ... }
public const string XSmallDown = "(max-width: 575.98px)";
/// Small devices (landscape phones, less than 768px)
/// @media(max-width: 767.98px) { ... }
public const string SmallDown = "(max-width: 767.98px)";
/// Medium devices (tablets, less than 992px)
/// @media(max-width: 991.98px) { ... }
public const string MediumDown = "(max-width: 991.98px)";
/// Large devices (desktops, less than 1200px)
/// @media(max-width: 1199.98px) { ... }
public const string LargeDown = "(max-width: 1199.98px)";
/// Small devices (landscape phones, 576px and up)
/// @media(min-width: 576px) and(max-width: 767.98px) { ... }
public static string OnlySmall => Between(SmallDown, SmallUp);
/// Medium devices (tablets, 768px and up)
/// @media(min-width: 768px) and(max-width: 991.98px) { ... }
public static string OnlyMedium => Between(MediumDown, MediumUp);
/// Large devices (desktops, 992px and up)
/// @media(min-width: 992px) and(max-width: 1199.98px) { ... }
public static string OnlyLarge => Between(LargeDown, LargeUp);
/// <summary>
/// Combines two media queries with the `and` keyword.
/// Values must include parenthesis.
/// Ex: (max-width: 1199.98px) and (min-width: 992px)
/// </summary>
/// <param name="max"></param>
/// <param name="min"></param>
public static string Between(string max, string min) => $"{max} and {min}";
}
}
================================================
FILE: BlazorSize/MediaQuery/IMediaQueryService.cs
================================================
using Microsoft.JSInterop;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace BlazorPro.BlazorSize
{
public interface IMediaQueryService
{
List<MediaQueryCache> MediaQueries { get; }
void AddQuery(MediaQuery newMediaQuery);
Task CreateMediaQueryList(DotNetObjectReference<MediaQueryList> dotNetObjectReference);
Task Initialize(MediaQuery mediaQuery);
Task RemoveQuery(MediaQuery mediaQuery);
}
}
================================================
FILE: BlazorSize/MediaQuery/MediaQuery.razor
================================================
@namespace BlazorPro.BlazorSize
@if (InternalMedia.Matches)
{
@Matched
}
else
{
@Unmatched
}
================================================
FILE: BlazorSize/MediaQuery/MediaQuery.razor.cs
================================================
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using System;
using System.Threading.Tasks;
namespace BlazorPro.BlazorSize
{
public partial class MediaQuery : IAsyncDisposable
{
/// <summary>
/// Media Query string, using standard media query syntax.
/// Ex: "(max-width: 767.98px)"
/// </summary>
[Parameter] public string Media { get; set; } = "";
/// <summary>
/// The result of the specified Media property.
/// Use the @bind-Media directive for automated binding.
/// </summary>
[Parameter] public bool Matches { get; set; }
/// <summary>
/// Handles the changed event when the media query's Matches property is changed.
/// Use the @bind-Media directive for automated binding.
/// </summary>
[Parameter] public EventCallback<bool> MatchesChanged { get; set; }
/// <summary>
/// Optional template, shown only when the Matches value is true.
/// Using a template will disable @bind-Matches for performance.
/// </summary>
[Parameter] public RenderFragment? Matched { get; set; }
/// <summary>
/// Optional template, shown only when the Matches value is false.
/// Using a template will disable @bind-Matches for performance.
/// </summary>
[Parameter] public RenderFragment? Unmatched { get; set; }
/// <summary>
/// Gets the parent MediaQueryList container.
/// </summary>
[CascadingParameter] public MediaQueryList? MediaQueryList { get; set; }
/// <summary>
/// Set by the DOM, the InternalMedia represents the actual Media Query value held by the DOM.
/// </summary>
public MediaQueryArgs InternalMedia { get; private set; } = new MediaQueryArgs();
protected override void OnInitialized()
{
if (MediaQueryList == null)
{
throw new NullReferenceException("MediaQueryList is null. The MediaQueryList component should be added to the root or MainLayout of your application. Or, set an interactive mode, BlazorSize requires an interactive rendermode.");
}
else
{
MediaQueryList.AddQuery(this);
}
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (MediaQueryList == null) return;
if (firstRender)
{
await MediaQueryList.Initialize(this);
}
}
/// <summary>
/// Used by the MediaQueryList. Invokes the full media query changed event.
/// </summary>
/// <param name="args">MediaQueryArgs</param>
public void MediaQueryChanged(MediaQueryArgs args)
{
MatchesChanged.InvokeAsync(args.Matches);
InternalMedia = args;
if (Matched != null || Unmatched != null)
{
StateHasChanged();
}
}
public async ValueTask DisposeAsync()
{
if (MediaQueryList == null) return;
try
{
await MediaQueryList.RemoveQuery(this);
}
catch (JSDisconnectedException)
{
// Ignore
//https://github.com/EdCharbeneau/BlazorSize/issues/93
}
}
}
}
================================================
FILE: BlazorSize/MediaQuery/MediaQueryArgs.cs
================================================
namespace BlazorPro.BlazorSize
{
public class MediaQueryArgs
{
public string? Media { get; set; }
public bool Matches { get; set; }
}
}
================================================
FILE: BlazorSize/MediaQuery/MediaQueryCache.cs
================================================
using System.Collections.Generic;
namespace BlazorPro.BlazorSize
{
public class MediaQueryCache
{
/// <summary>
/// Initally requested (unmodified) media query.
/// </summary>
public string? MediaRequested { get; set; }
/// <summary>
/// Is this item already awating a JavaScript interop call.
/// </summary>
public bool Loading { get; set; }
/// <summary>
/// The actual value represented by the DOM. This may differ from the initially requested media query.
/// </summary>
public MediaQueryArgs? Value { get; set; }
/// <summary>
/// Media Queries that share a RequestedMedia value. Used to aggregate event handlers and minimize JS calls.
/// </summary>
// Nullable because Blazor's lifecycle sometimes GC's this object before the cleanup routines are finished.
public List<MediaQuery>? MediaQueries { get; set; } = new List<MediaQuery>();
}
}
================================================
FILE: BlazorSize/MediaQuery/MediaQueryList.razor
================================================
@namespace BlazorPro.BlazorSize
<CascadingValue Value="this">
@ChildContent
</CascadingValue>
================================================
FILE: BlazorSize/MediaQuery/MediaQueryList.razor.cs
================================================
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace BlazorPro.BlazorSize
{
public partial class MediaQueryList
{
// IMediaQueryService
[Inject] public IMediaQueryService MqService { get; set; } = null!;
/// <summary>
/// Application content where Media Query components may exist.
/// </summary>
[Parameter] public RenderFragment? ChildContent { get; set; }
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await MqService.CreateMediaQueryList(DotNetObjectReference.Create(this));
await base.OnAfterRenderAsync(firstRender);
}
}
public void AddQuery(MediaQuery newMediaQuery) => MqService.AddQuery(newMediaQuery);
public async Task RemoveQuery(MediaQuery mediaQuery) => await MqService.RemoveQuery(mediaQuery);
public async Task Initialize(MediaQuery mediaQuery) => await MqService.Initialize(mediaQuery);
/// <summary>
/// Called by JavaScript when a media query changes in the dom.
/// </summary>
/// <param name="args"></param>
[JSInvokable(nameof(MediaQueryList.MediaQueryChanged))]
public void MediaQueryChanged(MediaQueryArgs args)
{
// cache must be compared by actual value, not RequestedMedia when invoked from JavaScript
// DOM Media value my be different that the initally requested media query value.
var cache = MqService.MediaQueries.Find(q => q.Value?.Media == args.Media);
if (cache is null) return;
// Dispatch events to all subscribers
if (cache.MediaQueries is null) return;
foreach (var item in cache.MediaQueries)
{
item.MediaQueryChanged(args);
}
}
}
}
================================================
FILE: BlazorSize/MediaQuery/MediaQueryService.cs
================================================
using Microsoft.JSInterop;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace BlazorPro.BlazorSize
{
public class MediaQueryService : IAsyncDisposable, IMediaQueryService
{
private readonly Lazy<Task<IJSObjectReference>> moduleTask;
public MediaQueryService(IJSRuntime jsRuntime)
{
moduleTask = new(() => jsRuntime.InvokeAsync<IJSObjectReference>(
"import", "./_content/BlazorPro.BlazorSize/blazorSizeMediaModule.js").AsTask());
}
// JavaScript uses this value for tracking MediaQueryList instances.
private DotNetObjectReference<MediaQueryList> DotNetInstance { get; set; } = null!;
private readonly List<MediaQueryCache> mediaQueries = new();
public List<MediaQueryCache> MediaQueries => mediaQueries;
private MediaQueryCache? GetMediaQueryFromCache(string byMedia) => mediaQueries?.Find(q => q.MediaRequested == byMedia);
public void AddQuery(MediaQuery newMediaQuery)
{
MediaQueryCache? cache = GetMediaQueryFromCache(byMedia: newMediaQuery.Media);
if (cache is null)
{
cache = new MediaQueryCache
{
MediaRequested = newMediaQuery.Media,
};
mediaQueries.Add(cache);
}
cache.MediaQueries?.Add(newMediaQuery);
}
public async Task RemoveQuery(MediaQuery mediaQuery)
{
if (mediaQuery is null) return;
MediaQueryCache? cache = GetMediaQueryFromCache(byMedia: mediaQuery.Media);
if (cache is null || cache.MediaQueries is null) return;
try
{
cache.MediaQueries.Remove(mediaQuery);
if (cache.MediaQueries.Any()) return;
mediaQueries.Remove(cache);
IJSObjectReference module = await moduleTask.Value;
await module.InvokeVoidAsync($"removeMediaQuery", DotNetInstance, mediaQuery.InternalMedia.Media);
}
catch (Exception)
{
//https://github.com/EdCharbeneau/BlazorSize/issues/93
//https://stackoverflow.com/questions/72488563/blazor-server-side-application-throwing-system-invalidoperationexception-javas
}
}
public async Task Initialize(MediaQuery mediaQuery)
{
if (mediaQuery?.Media is null) return;
var cache = GetMediaQueryFromCache(byMedia: mediaQuery.Media);
if (cache is null) return;
if (cache.Value is null)
{
// If we don't flag the cache as loading, duplicate requests will be sent async.
// Duplicate requests = poor performance, esp with web sockets.
if (!cache.Loading)
{
cache.Loading = true;
var module = await moduleTask.Value;
var task = module.InvokeAsync<MediaQueryArgs>($"addMediaQueryToList", DotNetInstance, cache.MediaRequested);
cache.Value = await task;
cache.Loading = task.IsCompleted;
// When loading is complete dispatch an update to all subscribers.
cache.MediaQueries ??= new List<MediaQuery>();
foreach (var item in cache.MediaQueries)
{
item.MediaQueryChanged(cache.Value);
}
}
}
else
{
var module = await moduleTask.Value;
var task = module.InvokeAsync<MediaQueryArgs>($"getMediaQueryArgs", cache.MediaRequested);
cache.Value = await task;
mediaQuery.MediaQueryChanged(cache.Value);
}
}
public async Task CreateMediaQueryList(DotNetObjectReference<MediaQueryList> dotNetObjectReference)
{
DotNetInstance = dotNetObjectReference;
var module = await moduleTask.Value;
await module.InvokeVoidAsync("addMediaQueryList", dotNetObjectReference);
}
public async ValueTask DisposeAsync()
{
try
{
if (DotNetInstance is null) return;
var module = await moduleTask.Value;
await module.InvokeVoidAsync("removeMediaQueryList", DotNetInstance);
DotNetInstance.Dispose();
await module.DisposeAsync();
GC.SuppressFinalize(this);
}
catch (Exception)
{
//https://github.com/EdCharbeneau/BlazorSize/issues/93
//https://stackoverflow.com/questions/72488563/blazor-server-side-application-throwing-system-invalidoperationexception-javas
}
}
}
}
================================================
FILE: BlazorSize/Resize/BrowserWindowSize.cs
================================================
using System;
namespace BlazorPro.BlazorSize
{
public class BrowserWindowSize : EventArgs
{
public int Height { get; set; }
public int Width { get; set; }
}
}
================================================
FILE: BlazorSize/Resize/IResizeListener.cs
================================================
using System;
using System.Threading.Tasks;
namespace BlazorPro.BlazorSize
{
public interface IResizeListener
{
event EventHandler<BrowserWindowSize> OnResized;
ValueTask<BrowserWindowSize> GetBrowserWindowSize();
ValueTask<bool> MatchMedia(string mediaQuery);
}
}
================================================
FILE: BlazorSize/Resize/ResizeListener.cs
================================================
using Microsoft.Extensions.Options;
using Microsoft.JSInterop;
using System;
using System.Threading.Tasks;
namespace BlazorPro.BlazorSize
{
public class ResizeListener : IResizeListener, IAsyncDisposable
{
private readonly Lazy<Task<IJSObjectReference>> moduleTask;
private readonly ResizeOptions options;
private bool disposed;
public ResizeListener(IJSRuntime jsRuntime, IOptions<ResizeOptions>? options = null)
{
this.options = options?.Value ?? new ResizeOptions();
moduleTask = new(() => jsRuntime.InvokeAsync<IJSObjectReference>(
"import", "./_content/BlazorPro.BlazorSize/blazorSizeResizeModule.js").AsTask());
}
private EventHandler<BrowserWindowSize>? onResized;
/// <summary>
/// Subscribe to the browsers resize() event.
/// </summary>
public event EventHandler<BrowserWindowSize>? OnResized
{
add => Subscribe(value);
remove => Unsubscribe(value);
}
private void Unsubscribe(EventHandler<BrowserWindowSize>? value)
{
onResized -= value;
if (onResized is null)
{
Cancel().ConfigureAwait(false);
}
}
private void Subscribe(EventHandler<BrowserWindowSize>? value)
{
if (onResized is null)
{
Task.Run(async () => await Start());
}
onResized += value;
}
private async ValueTask Start()
{
var module = await moduleTask.Value;
await module.InvokeVoidAsync("listenForResize", DotNetObjectReference.Create(this), options);
}
private async ValueTask Cancel()
{
var module = await moduleTask.Value;
await module.InvokeVoidAsync("cancelListener");
}
/// <summary>
/// Determine if the Document matches the provided media query.
/// </summary>
/// <param name="mediaQuery"></param>
/// <returns>Returns true if matched.</returns>
public async ValueTask<bool> MatchMedia(string mediaQuery)
{
var module = await moduleTask.Value;
return await module.InvokeAsync<bool>("matchMedia", mediaQuery);
}
/// <summary>
/// Get the current BrowserWindowSize, this includes the Height and Width of the document.
/// </summary>
/// <returns></returns>
public async ValueTask<BrowserWindowSize> GetBrowserWindowSize()
{
var module = await moduleTask.Value;
return await module.InvokeAsync<BrowserWindowSize>("getBrowserWindowSize");
}
/// <summary>
/// Invoked by jsInterop, use the OnResized event handler to subscribe.
/// </summary>
/// <param name="browserWindowSize"></param>
[JSInvokable]
public void RaiseOnResized(BrowserWindowSize browserWindowSize) =>
onResized?.Invoke(this, browserWindowSize);
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
onResized = null;
}
disposed = true;
}
}
public async ValueTask DisposeAsync()
{
try
{
if (moduleTask.IsValueCreated)
{
var module = await moduleTask.Value;
await module.DisposeAsync();
}
Dispose(true);
GC.SuppressFinalize(this);
}
catch (Exception)
{
//https://stackoverflow.com/questions/72488563/blazor-server-side-application-throwing-system-invalidoperationexception-javas
}
}
}
}
================================================
FILE: BlazorSize/_Imports.razor
================================================
@using Microsoft.AspNetCore.Components.Web
================================================
FILE: BlazorSize/jest.config.js
================================================
module.exports = {
preset: 'ts-jest',
testPathIgnorePatterns: [".d.ts", ".js"],
testEnvironment: 'jsdom',
};
================================================
FILE: BlazorSize/package.json
================================================
{
"name": "blazorsize",
"version": "1.0.0",
"description": "",
"private": true,
"scripts": {
"test": "tsc -p tsconfig.json && jest && npm run posttest",
"posttest": "rimraf scripts/tests/*.js",
"prebuild": "rimraf wwwroot",
"build": "npm run prebuild && tsc -p tsconfig.build.json",
"record": "npx playwright codegen --viewport-size=600,800"
},
"author": "",
"license": "ISC",
"devDependencies": {
"@types/jest": "^29.2.5",
"jest": "^29.3.1",
"jest-environment-jsdom": "^29.3.1",
"jest-matchmedia-mock": "^1.1.0",
"node-notifier": "^10.0.1",
"rimraf": "^3.0.2",
"ts-jest": "^29.0.3",
"typescript": "^4.9.4"
}
}
================================================
FILE: BlazorSize/readme.md
================================================
BlazorSize is a JavaScript interop library for Blazor that is used to detect the Browser's current size, change in size, and test media queries.
BlazorSize was designed to allow Razor Components to implement adaptive rendering. Handle mobile/desktop rendering changes at runtime with ease and complement your apps CSS media queries with programmatic work flows.
[For documentation please refer to the Wiki section of this GitHub repo.](https://github.com/EdCharbeneau/BlazorSize/wiki)
<hr>
A component with similar functionality of BlazorSize can also be found in [Telerik UI for Blazor](https://demos.telerik.com/blazor-ui/mediaquery/overview?utm_source=EdCharbeneau&utm_medium=cpm&utm_campaign=blazor-github-sponsored-message).
[]((https://www.telerik.com/campaigns/blazor/free-trial-1?utm_source=EdCharbeneau&utm_medium=cpm&utm_campaign=blazor-github-sponsored-message))
**If you’re already a Telerik customer there’s no need to use BlazorSize**, instead you may use the TelerikMediaQuery component. If you’re looking for a full component library of 100+ components, world class support, and rich documentation then [give Telerik UI for Blazor a try for free](https://www.telerik.com/campaigns/blazor/free-trial-1?utm_source=EdCharbeneau&utm_medium=cpm&utm_campaign=blazor-github-sponsored-message).
================================================
FILE: BlazorSize/scripts/blazorSizeMedia.ts
================================================
class MediaQueryListItem {
constructor(id: number | string) {
this.id = id;
this.dotnetCallback = (args) => { };
this.mediaQueries = [];
}
public id: number | string;
public dotnetCallback: (ev: MediaQueryListEvent) => void;
public mediaQueries: MediaQueryList[];
}
interface MediaQueryArgs {
media: string;
matches: boolean;
}
export class BlazorSizeMedia {
mediaQueryLists: MediaQueryListItem[] = new Array<MediaQueryListItem>();
//private toMediaQueryArgs = (mql: MediaQueryArgs) => ({ media: mql.media, matches: mql.matches });
private getMediaQueryListById = (id: number | string) => {
let mediaQueryList = this.mediaQueryLists.find(mql => mql.id === id)
if (mediaQueryList === undefined) {
throw new Error("dotnet reference was not found in the collection of media query lists");
}
return mediaQueryList;
};
getMediaQueryArgs(mediaQuery: string) {
let mq = window.matchMedia(mediaQuery);
return { matches: mq.matches, media: mq.media } as MediaQueryArgs;
}
addMediaQueryToList(dotnetMql: any, mediaQuery: string) {
let mq = window.matchMedia(mediaQuery);
let mediaQueryList = this.getMediaQueryListById(dotnetMql._id);
//console.log(`[BlazorSize] MediaQuery Read - media: ${mq.media} matches: ${mq.matches}`);
mq.addEventListener('change', mediaQueryList.dotnetCallback);
mediaQueryList.mediaQueries.push(mq);
return { matches: mq.matches, media: mq.media } as MediaQueryArgs;
}
callbackReference(dotnet: any) {
return (ev: MediaQueryListEvent) => {
//console.log(`[BlazorSize] MediaQuery Changed - media: ${ev.media} matches: ${ev.matches}`);
dotnet.invokeMethodAsync("MediaQueryChanged", { matches: ev.matches, media: ev.media } as MediaQueryArgs);
}
}
addMediaQueryList(dotnet: any) {
let list = new MediaQueryListItem(dotnet._id);
list.dotnetCallback = this.callbackReference(dotnet);
this.mediaQueryLists.push(list);
}
removeMediaQuery(dotnetMql: any, mediaQuery: string) {
let list = this.getMediaQueryListById(dotnetMql._id);
let queries = list.mediaQueries;
let toRemove = queries.find(q => q.media == mediaQuery);
toRemove?.removeEventListener('change',list.dotnetCallback);
list.mediaQueries = queries.filter(q => q.media !== toRemove?.media);
}
removeMediaQueryList(dotnetMql: any) {
// Get the media query from the list
let list = this.getMediaQueryListById(dotnetMql._id);
// Remove all event handlers
list.mediaQueries.forEach(q => q.removeEventListener('change', list.dotnetCallback));
// Remove the item from the list
this.mediaQueryLists = this.mediaQueryLists.filter(f => f.id !== dotnetMql._id);
}
}
================================================
FILE: BlazorSize/scripts/blazorSizeMediaModule.ts
================================================
import { BlazorSizeMedia } from './blazorSizeMedia.js';
let instance = new BlazorSizeMedia();
// Uncomment to enable console inspection of the instance
// (window as any).bs_instance = instance;
// When MQL is created, it tracks a NET Ref
export function addMediaQueryList(dotnet: any) {
instance.addMediaQueryList(dotnet);
}
// OnDispose this method cleans the MQL instance
export function removeMediaQueryList(dotnetMql: any) {
instance.removeMediaQueryList(dotnetMql);
}
// When MediaQuery instance is created track media query in JavaScript
export function addMediaQueryToList(dotnetMql: any, mediaQuery: string) {
return instance.addMediaQueryToList(dotnetMql, mediaQuery);
}
// When MediaQuery instance is disposed remove media query in JavaScript
export function removeMediaQuery(dotnetMql: any, mediaQuery: string) {
instance.removeMediaQuery(dotnetMql, mediaQuery);
}
// Get media query value for cache after app loads
export function getMediaQueryArgs(mediaQuery: string) {
return instance.getMediaQueryArgs(mediaQuery);
}
================================================
FILE: BlazorSize/scripts/blazorSizeResize.ts
================================================
export class ResizeOptions {
reportRate: number = 300;
enableLogging: boolean = false;
suppressInitEvent: boolean = false;
}
export class ResizeListener {
private logger: (message: any) => void = (message: any) => { };
private options: ResizeOptions = new ResizeOptions();
private throttleResizeHandlerId: number = -1;
private dotnet: any;
private resizeHandler = () => {
this.dotnet.invokeMethodAsync(
'RaiseOnResized', {
height: window.innerHeight,
width: window.innerWidth
});
this.logger("[BlazorSize] RaiseOnResized invoked");
}
public listenForResize(dotnetRef: any, options: ResizeOptions) {
this.options = options;
this.dotnet = dotnetRef;
this.logger = options.enableLogging ? console.log : (message: any) => { };
this.logger(`[BlazorSize] Reporting resize events at rate of: ${this.options.reportRate}ms`);
window.addEventListener("resize", this.throttleResizeHandler);
if (!this.options.suppressInitEvent) {
this.resizeHandler();
}
}
private throttleResizeHandler = () => {
clearTimeout(this.throttleResizeHandlerId);
this.throttleResizeHandlerId = window.setTimeout(this.resizeHandler, this.options.reportRate);
}
public cancelListener() {
window.removeEventListener("resize", this.throttleResizeHandler);
}
public matchMedia(query: string) {
let m = window.matchMedia(query).matches;
this.logger(`[BlazorSize] matchMedia "${query}": ${m}`);
return m;
}
public getBrowserWindowSize() {
return {
height: window.innerHeight,
width: window.innerWidth
};
}
}
================================================
FILE: BlazorSize/scripts/blazorSizeResizeModule.ts
================================================
import { ResizeListener, ResizeOptions } from './blazorSizeResize.js';
let instance = new ResizeListener();
export function listenForResize(dotnetRef: any, options: ResizeOptions) {
instance.listenForResize(dotnetRef, options);
}
export function cancelListener() {
instance.cancelListener();
}
export function matchMedia(query: string) {
return instance.matchMedia(query);
}
export function getBrowserWindowSize() {
return instance.getBrowserWindowSize();
}
================================================
FILE: BlazorSize/scripts/tests/blazorSize.test.ts
================================================
import { BlazorSizeMedia } from '../blazorSizeMedia';
import MatchMediaMock from 'jest-matchmedia-mock';
import MatchMedia from 'jest-matchmedia-mock';
let matchMedia: MatchMedia;
describe('Your testing module', () => {
beforeAll(() => {
matchMedia = new MatchMediaMock();
const mediaQuery = '(min-width: 240px) and (max-width: 767px)';
matchMedia.useMediaQuery(mediaQuery);
});
afterEach(() => {
matchMedia.clear();
});
let fakeDotNetList = {
_id: 1,
invokeMethodAsync(method: string, callback: any) { }
}
let fakeDotNetQuery = {
_id: 9,
}
test('Can crate', () => {
let x = new BlazorSizeMedia();
expect(x.mediaQueryLists).toHaveLength(0);
})
test('Can add MediaQueryList', () => {
let x = new BlazorSizeMedia();
x.addMediaQueryList(fakeDotNetList);
expect(x.mediaQueryLists).toHaveLength(1);
})
test('Can add MediaQuery', () => {
let x = new BlazorSizeMedia();
let query = '(min-width: 240px) and (max-width: 767px)';
x.addMediaQueryList(fakeDotNetList);
let result = x.addMediaQueryToList(fakeDotNetList, query);
expect(x.mediaQueryLists[0].mediaQueries.length).toBe(1);
expect(result.media).toBe(query);
expect(result.matches).toBe(true);
})
test('Can remove MediaQuery', () => {
let x = new BlazorSizeMedia();
let query = '(min-width: 240px) and (max-width: 767px)';
x.addMediaQueryList(fakeDotNetList);
let result = x.addMediaQueryToList(fakeDotNetList, query);
x.removeMediaQuery(fakeDotNetList, query);
expect(matchMedia.getListeners(query).length).toBe(0);
expect(x.mediaQueryLists[0].mediaQueries.length).toBe(0);
})
test('Can remove MediaQueryList', () => {
let x = new BlazorSizeMedia();
let query = '(min-width: 240px) and (max-width: 767px)';
x.addMediaQueryList(fakeDotNetList);
let result = x.addMediaQueryToList(fakeDotNetList, query);
x.removeMediaQueryList(fakeDotNetList);
expect(matchMedia.getListeners(query).length).toBe(0);
expect(x.mediaQueryLists.length).toBe(0);
})
})
================================================
FILE: BlazorSize/tsconfig.build.json
================================================
{
"compilerOptions": {
"outDir": "./wwwroot",
//"noImplicitAny": false,
//"noEmitOnError": true,
//"removeComments": true,
//"sourceMap": false,
"target": "ES6",
"moduleResolution": "node",
"lib": [ "ES2016", "DOM"]
},
"exclude": [
"node_modules",
"wwwroot",
"**/*.test.ts"
]
}
================================================
FILE: BlazorSize/tsconfig.json
================================================
{
"compilerOptions": {
"outDir": "./scripts/tests",
"esModuleInterop": true,
"skipLibCheck": true,
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
"lib": [ "ES2015", "DOM" ], /* Specify library files to be included in the compilation. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
//"outFile": "./blazorSize.js", /* Concatenate and emit output to single file. */
//"outDir": "./wwwroot", /* Redirect output structure to the directory. */
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
/* Advanced Options */
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
}
}
================================================
FILE: BlazorSize.UnitTesting/BlazorPro.BlazorSize.UnitTesting.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<LangVersion>latest</LangVersion>
<Version>6.0.0</Version>
<Authors>Ed Charbeneau</Authors>
<Company>EdCharbeneau.com</Company>
<Description>A testing library to provide helper extensions for BlazorSize.</Description>
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
<PackageProjectUrl>https://github.com/EdCharbeneau/BlazorSize</PackageProjectUrl>
<PackageIcon>blazor-glove-128.jpg</PackageIcon>
<PackageIconUrl />
<RepositoryUrl>https://github.com/EdCharbeneau/BlazorSize</RepositoryUrl>
<PackageTags>Blazor, JavaScript Interop</PackageTags>
<PackageReleaseNotes>
6.0.0 Added support for bUnit.
</PackageReleaseNotes>
</PropertyGroup>
<ItemGroup>
<!-- Package Logo -->
<None Include="..\_resources\blazor-glove-128.jpg">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
<!-- Package license file -->
<None Include="LICENSE.txt">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="bunit.core" Version="1.36.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\BlazorSize\BlazorPro.BlazorSize.csproj" />
</ItemGroup>
</Project>
================================================
FILE: BlazorSize.UnitTesting/Bunit/BunitExtensions.cs
================================================
using BlazorPro.BlazorSize;
using Microsoft.Extensions.DependencyInjection;
namespace Bunit
{
public static class BunitExtensions
{
public static FakeMediaQueryService AddBlazorSize(this TestContextBase testContext)
{
testContext.RenderTree.Add<MediaQueryList>();
var mediaQueryServices = new FakeMediaQueryService(testContext);
testContext.Services.AddSingleton<IMediaQueryService>(mediaQueryServices);
return mediaQueryServices;
}
}
}
================================================
FILE: BlazorSize.UnitTesting/Bunit/FakeMediaQueryService.cs
================================================
using BlazorPro.BlazorSize;
using Microsoft.JSInterop;
namespace Bunit
{
public class FakeMediaQueryService : IMediaQueryService
{
private readonly TestContextBase contextBase;
private MediaQueryArgs activeMediaQuery = null!;
public List<MediaQueryCache> MediaQueries { get; } = new();
public FakeMediaQueryService(TestContextBase contextBase)
{
this.contextBase = contextBase;
}
public void AddQuery(MediaQuery newMediaQuery)
{
var mediaQueryCache = GetMediaQueryFromCache(newMediaQuery.Media);
if (mediaQueryCache is null)
{
mediaQueryCache = new MediaQueryCache()
{
MediaRequested = newMediaQuery.Media
};
MediaQueries.Add(mediaQueryCache);
}
mediaQueryCache.MediaQueries.Add(newMediaQuery);
SetActiveMediaQuery(activeMediaQuery);
}
public Task CreateMediaQueryList(DotNetObjectReference<MediaQueryList> dotNetObjectReference)
=> Task.CompletedTask;
public Task Initialize(MediaQuery mediaQuery)
=> Task.CompletedTask;
public Task RemoveQuery(MediaQuery mediaQuery)
{
var mediaQueryFromCache = GetMediaQueryFromCache(mediaQuery.Media);
if (mediaQueryFromCache is null)
return Task.CompletedTask;
mediaQueryFromCache.MediaQueries.Remove(mediaQuery);
if (mediaQueryFromCache.MediaQueries.Count == 0)
MediaQueries.Remove(mediaQueryFromCache);
return Task.CompletedTask;
}
public void SetActiveBreakPoint(string breakpoint)
=> SetActiveMediaQuery(new MediaQueryArgs
{
Matches = true,
Media = breakpoint
});
public void SetActiveMediaQuery(MediaQueryArgs args)
{
if (args.Media == null) return;
activeMediaQuery = args;
// cache must be compared by actual value, not RequestedMedia when invoked from JavaScript
// DOM Media value my be different that the initally requested media query value.
var cache = GetMediaQueryFromCache(args.Media);
if (cache is null) return;
// Dispatch events to all subscribers
contextBase.Renderer.Dispatcher.InvokeAsync(() =>
{
foreach (var item in cache.MediaQueries)
{
item.MediaQueryChanged(args);
}
});
}
private MediaQueryCache? GetMediaQueryFromCache(string byMedia)
=> MediaQueries?.Find(q => q.MediaRequested == byMedia);
}
}
================================================
FILE: BlazorSize.UnitTesting/LICENSE.txt
================================================
Copyright 2019 Ed Charbeneau
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
================================================
FILE: BlazorSize.e2eTests/BlazorSize Adaptive Table and Template.resx
================================================
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="BlazorSize Adaptive Table and Template4f5o1vgy.4is" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="BlazorSize Adaptive Table and Template1qqp5b5b.amo" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="BlazorSize Adaptive Table and Template02odfyyd.oi1" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="BlazorSize Adaptive Table and Templatejqo1pp1o.rnh" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAEAQAAABZTeXN0ZW0uSU8uTWVtb3J5U3RyZWFtCgAAAAdfYnVmZmVyB19v
cmlnaW4JX3Bvc2l0aW9uB19sZW5ndGgJX2NhcGFjaXR5C19leHBhbmRhYmxlCV93cml0YWJsZQpfZXhw
b3NhYmxlB19pc09wZW4dTWFyc2hhbEJ5UmVmT2JqZWN0K19faWRlbnRpdHkHAAAAAAAAAAACAggICAgB
AQEBCQIAAAAAAAAAcVcBAHFXAQAAAAIAAQEBAQoPAgAAAAAAAgAC/9j/4AAQSkZJRgABAQEAYABgAAD/
2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5
PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjL/wAARCAQlB4sDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAEC
AwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS
0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqD
hIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo
6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcF
BAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2
Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaan
qKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEA
PwD5/r0CP/Vr9BXn9dZuIiHJ6UAapZR1NJvX1qBAAgA9KdQBLvX1o3r61FRQBLvX1o3r61FRQBLvX1o3
r61FRQBLvX1o3r61FRQBLvX1o3r61FRQBLvX1o3r61FRQBLvX1o3r61FRQBLvX1o3r61FRQBLvX1o3r6
1FRQBLvX1o3r61FRQBLvX1o3r61FRQBLvX1o3r61FRQBLvX1o3r61FRQBLvX1o3r61FRQBLvX1o3r61F
RQBLvX1pQwPQ1DUVwP3JbuORQBcorLDHHU0uT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6m
gDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT
6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1N
GT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn
1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06Kz
Mn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06
KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA
06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+p
oA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk
+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9T
Rk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ
9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOis
zJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANO
iszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaA
NOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPq
aANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0Z
PqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU
0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDTorMyfU0ZPqaANOiszJ9TRk+poA06KzMn1NGT6mgDkK6lv
9SPpXLV1Lf6kfSgDRX7o+ldd4H0bTdWOpyalbvMltEjIqyFOS2OorkV+6PpXc/D1tttrp/6YRf8AowVd
NKU0mRVk4wbXY9dtfB/hgWFqRoNg26FGy8YJ6Dqe9cB8TPBenWGlnWtOhhtQkixvDF91gehx2NepWwkl
0+xCHGbZCT+ArmPiNZvL4Evw0uVjZJe3UHGP1pSVmOLukfP1alloct7bQTLdW0X2iYwRJIWyzjHHCkDq
OprLrqtGvEh0iwCy2YaK8eSXz3UMiEL8wyc54P3eeKkbMO6017XT7e6dxmWSSMpj7pUgHn8ao110Fxpz
RWaR3pQRS3Lx5l2Mc42gsfu59f5Vba7Q39vfJqFuJYbJfMiivNomlDNhSzNyBwSSTwPehDOGqSCGS5nj
giXdJIwVR6k106X9zIkDR6lDDdC6aS+Y3Cjfkgg5zh1AyMDP05qK/wBSjltIrfTLpbaOS+lfG/ZtUldp
b0FMDJl0tIpxCdRsy+/Y+C+EPuSvTtxmqBGDjrXXWl3bi/sbvUZLNL5bj5pYJFIdNpyz7SVznHuaiS6l
tNESJb9JkuG3XCfa1/dxA/cVN2cnqcD0HrSQHK1fOl7NPgvJby3iWcMY0YOWO04PRSOvvW9rN3FerLax
TQtBPcKYJZbxWWIYPRAoKDHBB9qqyuZPD+nwQPYu0SyiTzJIwy5ckY3EHp6UdAOcors2urS4SzhfU445
Vki+3zIwBlIHyENyDt6E46nPNSnVIU+xTSXNuLqKO6U4nMpUFPkBYk5JPpxz26UAcPRXY22tiT+yUub4
MjW0yXQd87jhgof17YzUqXLW0ekSTXsSaetkfPgMgBfO7jZ1bPHODj2oBHK31gbFbUmQP9ogWYYGNuc8
fpUtnot1f6ZeX0Gwx2uN6ZO4g9wMc4xzXQQahZeXGqThbr+zY442ScRFWDEsu8ghTj/DPNRz64IoLm4i
aJLpbmBtglEnmYRgxJAAbOecetAHNz2MtvZWt07IY7ndsAJyNpwc023tJroTGJQfJjMr5OMKMf412Jvt
HWTTTBOoUwTtGpcKbeVyCoJwduDnDEehqtFqz/aJYRciCZrFoxKb1XMj7srukGFyBkD2xQCOfj0xprKW
4hureRoYxJJCpbeq5xnkYOMjoakl0O4itZJTLCZIo1llgBO9FboTxjuOh4zVy2ZbbSr1Lqa1KSw/I0Mi
mV3yCAcHOPXPHFWry7tRNqeorcxut7arHFGHBfcQMgr1GMHk+2KGCOWooooAKKKKACiiigB8MTTzJEmN
zsFG44GT71Yj0y8kv2sRAwuFJ3I3G3HUn0HvVeGMzTJErKpdgoLNgDPqa6ubUrO7sm0aO7IlEYQX78Cf
bk7GOMhPQn8eOgByRGDj0qG5/wCPd/pUxGDj0qG5/wCPd/pQBWXpS0i/dq9a6k1rD5YtrWQZzulhDH86
AFv7aKC20941w01vvc56new/kBVGuk1LV3S000/Y7I7rbPMAOPnbpWBcTm5maUxxoT/DGu1R+FAEVFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQByNdS3+pH0rlq7FLXcqbnyMDjF
AFlfuj6Vr6H4gu9Ba4NrHBILhAkizR7wQDkcfWsmihO2wNX0Z3kHxa8RQbQEsyirtVfKIAH5+1VdY+JW
s61pVxp9zFarDOAGKIQeufWuNop3AKKKKQBRRRQAUUUUAFFFFABRRRQAUUUUAFSzXM1wIxK5YRIETjov
pUVFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVFc/8e7/SpaRlDoVPQigCkv3aWpBbMOA/6Uv2
dv74/KgBJJ5ZVjWRyyxLsQHsMk4/Mmo6l+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/f
H5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+
zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAI
qKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj
8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ
2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH
5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+z
t/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIq
Kl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8
qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2
/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5
UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt
/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqK
l+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8q
AIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/
vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5U
fZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/
fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl
+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qA
IqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/v
j8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5Uf
Z2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/f
H5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+
zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAI
qKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj
8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ
2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH5UfZ2/vj8qAIqKl+zt/fH
5UfZ2/vj8qAOMruU/wBWv0FcNXcp/q1+goAdRRSojSOqIpZmOAoGSTQAlFdK1lF4bgIubdbrWJFwIWTc
loD3YdGf27d+a53yZf8Anm//AHyaAGUUUUAFFFFABRS7W/un8quRJHdxLCyiKdRhHxgP7H396AKVFOkj
eKRkkUqynBBHIptABRRRQAUVvW3kaJpVvfyW8VzfXe4wJMgZIkU43lTwxJyBngYNT2HiK+vrrytT1G1+
y7STHd2++M+wCrlT7jFAHNUVv+LrjS59Ttxo53WkVqkecH7wznqAT161gUAFVp3bftBwB6VZqpP/AK00
AR72/vH86N7f3j+dJWrouj/2m0s01zDa2VuU8+eYkAbjgAYBJJwe3agDL3t/eP50b2/vH869Cvf7Fv01
K0fWNDjsyp/s/wAq2ZHhIcbcsI8nK5zknmuH1LT59K1CayuNvmREAlDkEEZBB9CCD+NAFXe394/nRvb+
8fzpK2fD2jxawdTEskifZLGS5TZj5mXGAfbmiwLV2Mfe394/nRvb+8fzqaOzuJLmKDynWSVgqhlIzmt2
LwVqUviufw+GQTwlw0pDbDtBJxx7UPRXA5ze394/nRvb+8fzqT7PPu2+TJuzjG09aaYpFk8to2D/AN0j
n8qAG72/vH86N7f3j+dOeGWNtrxOpxnDKRU1pafaRM7P5ccMZdmxn6D8TgUAV97f3j+dG9v7x/Orun6e
LwM8khjjV0TgZLFjjA/DJqx4g0ldK8S6hpdr5syW07RoSMsQD1OKLB5mVvb+8fzo3t/eP50rxvG22RGV
vRhg05reZFDPDIoPQlSM0AM3t/eP50b2/vH86e8EsW3zInQHpuUjNdhq3g20sLjxJFDPcP8A2VHA0OcZ
cuyg5wP9rtQNK5xm9v7x/Oje394/nTnikibbIjI3owwaV4JolDSROinoWUgUCGb2/vH86N7f3j+dPEEz
R+YIpCn94KcfnWlrHh680VLFrgBheWyXCbQflDdFPHWi4GVvb+8fzo3t/eP51btLa0mX/SL1oXLbQohL
/ieRipV0llu7qK4mWKK1/wBbIBu74GB3JoAz97f3j+dG9v7x/OtM6MXnthbXAlguASspXbtC/eyO2Kju
dPhSzN1aXX2iNHCSZj2FSeh6nigChvb+8fzo3t/eP51oXGkyW2mrdyTRklwnlodxXIzyR0+lV7S0+0id
mfZHDGXZsZ+g/E0AV97f3j+dG9v7x/Or97YxWdnbljMbiZBIeAEAOePXNUvLfcFKMCegI60AN3t/eP50
b2/vH86nvbOWxumt5eWXuOh4qXT7L7VerBLvRSrHIGDwCaAKe9v7x/Oje394/nQVZQCVIB6ZFWtOs/tl
/BA+9Y5H2lgKAKu9v7x/Oje394/nT2ibzHVFZgpI4FSwWM1xbXE6D5YACwxycnHH50AV97f3j+dG9v7x
/OlCOwJCsQOuBTaAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b
2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/Ok
ooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/
eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v
7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKK
AF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j
+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8
fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigB
d7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/n
Rvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH8
6SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe
394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b
2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/Ok
ooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/
eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v
7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKK
AF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j
+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8
fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigB
d7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/n
Rvb+8fzpKKAF3t/eP50b2/vH86SigBd7f3j+dG9v7x/OkooAXe394/nRvb+8fzpKKAF3t/eP50b2/vH8
6SigDlK7lP8AVr9BXDV3Kf6tfoKAHVNa3U1ldw3Vu5jmhcOjjsR0NQ0UAd1Pr+r+ILeS+0zU7qG+jUvd
WSyHD+rxDuOpK9u3HTnf+Er1/wD6C93/AN/DWSjvG4dGZWHRlOCKbQA53aWRpHYs7EsxPUk02iigAooo
oAsjULwDAuZAB/tVciurmKIXF1cylT/q4w3L+/sKyqUknqSccUASXNxJd3DzynLseaioooAKKKKAN++i
bUvDOn3luN5sENtcoOqDcWV/907iM+orCRHkdUjVmdjhVUZJNT2V/dadcC4s53hlAxuU9R3B9R7VpN4r
1XafKa2t3IwZbe2SN/8AvpRmgB3iCNLC103STsNzaxs9yV7SO2dufUKFB981hUpJJJJyT1JpKACqk/8A
rTVuqk/+tNAEVb2m5/4QzXv+u9p/OSsGrunavf6RK8lhdSQNIu19vRh7g8UAFzNYPp1nFb2ckV2m77RM
0m4S5Py4XtgVo+MuPFFwD2ig/wDRKUn/AAmfiH/oJyf98L/hWPc3M95cyXNzK0s0rFndzksaAIq7D4fX
Ulld63cw7fNi0mdkLDIBBXHFcfUkU80G/wAmV496lH2MRuU9QfUe1NO34gt0egR67qd94M03U7q+mkvr
TWfKiuWb94qMgJG7riujt9R1yP40XdvPc3q20vnrbo7MEddhKhexGcYxXjnnzfZ/s/myeTu3+XuO3d0z
jpn3qZ9Tv5ZYZZL65eSAYidpWJj/AN054/CiXvaf1sh30t/W56JpVx4o/wCEE1y4gF62rjUIjK7IxnVd
hGRnkHoMjsatyX19ZXPhW/1LTbi/1sWs5uURP9IEWQI3Ix98ZJGRXGQ+KJY/Ct1aG8vP7Ulv0uFuBIc7
QjKfnznPNYY1K/F4bwXtyLo9ZxK2/wD76zmh7/12JW33/mdj4uttXhudPvY9R1C8W6tpGiS+jxcQoCQy
uDnjrg/lXLTf6HosUPSS6bzX/wBwcKPzyaqTX13czmee6nlmI2mSSQsxHpk806e8e4ulnkRMqFAQA7QB
0H0pDNL/AI9ZNLsRw3mJNKP9piMD8B/Ou/1A38M/jS50FXOsLqYV2gGZktznJXv97GcV5XPcy3F29y5x
I7bsrxg+1Pj1C9iu2u47y4S5bO6ZZWDnPXLZzTvpb+un+Q9j1KyQ3s3hBvFKBtVeefH2sYeSMKfK8zPO
N/AzWRaR+M9a8S2tjrFxf29v9uDB54cpHIu4gIGGOxAA46VwFxdXF1OZ7meWaY9ZJHLMfxNTzatqVyIx
PqF3KIiGj3zM2wjoRk8UutxHp3iWSa9+HepS3dtqymC+iEMmqSbnJyQSo2jaPbkVLrF/caZq/jy7tH2T
pb2ux8ZKksgyPfnivK7jVdRu1Zbm/uplbG4STMwOOmcntTJL68lMxku53MwAlLSE+Zjpu9ce9JaMaZ6j
pNwutr4LvtYdbm7aW7iSSfnzGUKYgxPX5jxmqdpceI7rTfEqeLRdmwjtHK/a0IVLjcNnl56HrwO1ebm4
naGOFppDFGSUQscKT1IHbpU11qeoX0ax3d9c3EaHKrLMzhfoCactdhLoekzzanqnhN/sz6rorafp6mS2
kjxaXCLj5lbs5yD0/GqfjS/1+5tvDMsM15NDJp0Em7lkafByTngt9a4KXVNQuLVbWa/upLdcYieZigx0
4JxTf7RvfsyW32y48iNtyRea21T6gZwDSkru4LRFywa+gmMqaeLgu+CzwlsN3wR0NXp4FZdYtLYtLJvS
QDO5jg/MPfGawUuriJWWOeVFb7wVyAaYjvG4eN2Rh0ZTgimB01iDDaWtjKNlxNFcbVbgjcAF/PFZyQy2
ehXouI2jM0iIiuMEkZJNZTyPJIZHdmc8lmOTTpZ5Z2DTSvIQMAuxOKANFf8AkVn/AOvsf+g02Umy0eGI
HEt03mv6hRwo/PJrO8x9nl7m2Zztzxmpbq6e7m81wq4UKFUcAAYAFAHSrO1xqmlx3MjyKbRZFVjnMm04
ODxmq19eOtidw1EyrMpSa5QLsPOQDXPNI7FSzsdowuT0FPluJ58edNJJjpvYnH50dQOnuTcS+I7jzN7s
sLNaCTlS+0fdzwaqabNqLarA195zBRJs84HrtOetYTTzOEDSuwj+5lidv09Kc11cO4d7iVmAwGLkkCgD
VjuZb7Q7z7XK0giljKlv4cnBx6cVqwnUU8SRQxCQWCkbFUfu9mOD6VyIdwjIGYK3VQeDTxdXCoqLPKFU
5VQ5wD7UAdDYrPbW6TRG7k86dwEt22hcH+I4NSvJcQz69BZtIpVlZEizwdwyQB7VzC3EyIyJNIqv95Qx
AP1pVuJ1lMqzSCQ9XDHJ/GgDpdJSe3SwA+1yrO24iI7Y1+bB3cc++a57UFVNRuVUAKJWAA7c1GtzOiFE
nkVCclQ5Az61GzFmLMSWJyST1oASiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
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
1/z5XP8A37b/AAr64ooA+CK1R90fSsqtUfdH0rqw3Uxq9BaKKK6jEKKkihlmJEUTyEdQik4pZLeeEAyw
yRg9CykUDIqKc0boqsyMoYZUkdfpTaBBRRRQAUUUqqWYKoJJ6ACgBKKkkt54QDLDJGD0LKRTWjdVVmRg
rfdJHB+lAxtFFFAgooqcWV2wBW1mIPIIjNAyCinyQywsFljeNiMgMpFMoAKKKKBBRRRQAUU5EeRwiKzM
egUZJpvQ4NABRTkjeVwkaM7HoFGTSBWLbQpLZxjHNACUUrKyMVZSrA4II5FJQMKKciPI4RFLMegUZJpZ
IpIm2yRsjejDBoAZRUht5hEJTDIIz0cqcfnUdABRRRQI+uPht/yTnQf+vVf5muprlvht/wAk50H/AK9V
/ma6mvNn8TOuOwUUUVIwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPg
itUfdH0rKrVH3R9K6cN1MavQWiiiusxPT/hAL423iwabMIb7+zf3EhcIFfPB3HgfjW9c2/io/D3xFJ4u
u4dVgESi1SKRLh4Zc/f3J90Y964r4e6to1jZeJLHWNSFgmpWH2aKUwvJhifRQa0tHvvCfgyx1e5sfET6
xe3lk9nHbR2ckSDfj5mLgdMVhUT5n6L9TSm7ff8A5Ems6Umt6X8PtPlvYLKKWwk33E7ALGobJP144Hc4
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
ev8A0Mep/wDfX/16P+FXr/0Mep/99f8A169Aoo+rUuwf23j/APn5+C/yPP8A/hV6/wDQx6n/AN9f/Xo/
4Vev/Qx6n/31/wDXr0Cij6tS7B/beP8A+fn4L/I8/wD+FXr/ANDHqf8A31/9ej/hV6/9DHqf/fX/ANev
QKKPq1LsH9t4/wD5+fgv8jz/AP4Vev8A0Mep/wDfX/16P+FXr/0Mep/99f8A169Aoo+rUuwf23j/APn5
+C/yPP8A/hV6/wDQx6n/AN9f/Xo/4Vev/Qx6n/31/wDXr0Cij6tS7B/beP8A+fn4L/I8/wD+FXr/ANDH
qf8A31/9ej/hV6/9DHqf/fX/ANevQKKPq1LsH9t4/wD5+fgv8jz/AP4Vev8A0Mep/wDfX/16P+FXr/0M
ep/99f8A169Aoo+rUuwf23j/APn5+C/yPP8A/hV6/wDQx6n/AN9f/Xo/4Vev/Qx6n/31/wDXr0Cij6tS
7B/beP8A+fn4L/I828BW8uneNde01rye5jtkVVaViSeetek15/4V/wCSneKPoP5ivQKWGVoW83+ZWdSc
sSpPdxi//JUFFFFdB5B8EVqj7o+lZVao6D6V1YbqZVegtFJRXUYi0UlFAC0UlFAC0UlFAC0UlFAC0UlF
AC0UlFAC0UlFAC0UlFAC0UlFAC1cGq3w0c6SLhvsBmE5hwMeYBgN69CapUUgFopKKYE1r/x9w/8AXRf5
1a1n/kJyfQfyqra/8fcP/XRf51a1n/kJyfQfyrkl/vUf8L/NHr0/+RTU/wCvkf8A0mRQopKK6zyBaKSi
gBaKSigBaKSigD65+G3/ACTnQf8Ar1X+Zrqa5b4bf8k50H/r1X+Zrqa82XxM6lsFFFFSMKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
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
AHz/APWr0eij2dX+f8EH1vAf9A3/AJPI84/4Wa//AELOqf8AfP8A9aj/AIWa/wD0LOqf98//AFq9Hoo9
nV/n/BB9bwH/AEDf+TyPOP8AhZr/APQs6p/3z/8AWo/4Wa//AELOqf8AfP8A9avR6KPZ1f5/wQfW8B/0
Df8Ak8jzj/hZr/8AQs6p/wB8/wD1qP8AhZr/APQs6p/3z/8AWr0eij2dX+f8EH1vAf8AQN/5PI84/wCF
mv8A9Czqn/fP/wBaj/hZr/8AQs6p/wB8/wD1q9Hoo9nV/n/BB9bwH/QN/wCTyPOP+Fmv/wBCzqn/AHz/
APWo/wCFmv8A9Czqn/fP/wBavR6KPZ1f5/wQfW8B/wBA3/k8jzj/AIWa/wD0LOqf98//AFqP+Fmv/wBC
zqn/AHz/APWr0eij2dX+f8EH1vAf9A3/AJPI84/4Wa//AELOqf8AfP8A9aj/AIWa/wD0LOqf98//AFq9
Hoo9nV/n/BB9bwH/AEDf+TyPLvAk8994013U5LG5to7lFZVkjORz06V6Pv8A9l/++DVqirpU+SNr3ObH
YtYqt7RR5VZK177KxV3/AOy//fBo3/7L/wDfBq1RWhxnwBXRr90fSucrol+6PpXoYDeXyOfEdB1FFJXo
nMLRSUtABRSUUALRRSUALRSUtABRSUUALRRSUALRSUtABRSUUALRRSUALRSUtABRSUUALRRSUALRSUtA
BRSUUALRRSUALRSUtAH1n8OP+Sd6F/16r/M11Fcv8OP+Sd6F/wBeq/zNdRXg1Pjfqd8fhQUUUVBQUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
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
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPgCujX7o+lc5XRL90fSvQwO8
vkc9foOopKK9A5xa6bwBdz23jTTlhkKCWUI+B1X0rmKu6TqUuj6tbahCiPJbvvVX6E++KUldNDR9Lanr
2laM0a6jfQ2xkBKCQ43Y61zvxMvZbfwPNNay7fMdFJHO5T2ryHxV4wvfFsls95b28JtwwXyQec465J9K
ua78QtR1/Ql0m4tLWOEFTvjDbvl6dTXnxwklyvrfU6XWV2cjRSUV6Jynd6tfaXa6D4cW+0YXzmwyrm5e
PaN7cYWt6Z1a1jvNMthHfRaFG9nED5jRgv8AMVzySB3ryuW5nnSNJZpJFiXbGruSEHoPQVKuo3ySwyre
3AkgXZE4lbMa+inPA+lYSo3W/V/qaKdvuX6HpWjTXcx0LUdWTOqbrtUaVcPJCIGI3DuN2RzWYfE2r/8A
CHWd/wDbG+2HUWh8/A3iPaDtB7DPauJk1TUJboXUl/dPcBSomaZi4BGCM5zjBI/GoftM/wBnW38+XyVf
eI952hvXHTPvR7FXu/61YOelkes3gt7H+27mzlurS7a/RZZbG3EkioYw2MZG0Fs8iuG8bvDLrUMsVvcQ
ySWyNN58IiaR+fn2gnGRj9ax4tX1KG6kuotRu47iQYeVJ2DsPc5yarz3E91M01xNJNK3LPIxZj9SaKdF
xabf9WBzuiOikorczFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAPrT4cf8k7
0L/r1X+ZrqK5f4cf8k70L/r1X+ZrqK8Kp8b9TvjsgoooqBhXjd2n/CN/tBQXA+WDVo8H0JZcH/x5Qa9k
ryj41Wr2kOh+IoB+8sbsKxHofmH6r+tNAQfFaRtc8YeGvCsRyJZRNKo9CcfyDV1HxQ0VdS+Hd9FGmXtE
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
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAfAFdEv3R9K52uiX7o+ld+B3kYV+gtFFFeic4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfWnw4/wCSd6F/16r/ADNdRXL/AA4/5J1o
X/Xqv8zXUV4VT436ndHZBRRRUDCsTxd4dTxV4autIeUQmYApIV3bGByDituigDjvh94FXwPpt1btdrdz
XEodpRHswoGAMZPv+ddjRRQB5trHwmi1Xx8viT7ekcBmjmktfJzuK4z82e+PSvSaKKAOX8YeA9H8ZQJ9
uRorqIYiuYuHX2PqPY1xZ+DurvH9kk8aXraf08jY3T/vrH6V65RRcDnvCfg3SfB1g1tp0bGSQ5lnkOXk
Pv6D2FZfjX4bad4wnivfPkstRiGFuIhncB0yPb1rtaKAPLofhPqtyot9a8Z6jeWQ/wCWCFlBHpyxq6vw
rtdP8ZaZrmiXMdjBZIqtbGIv5nUE7s9SDXolFFwMLxb4XtPF2hSaZdu8YLB0kTqjDofeuc8DfDzUfB2q
STy6+97aNCYltmjKheQQR8xHb0716BRQBxXhLwHJ4Z8SavqzagtwNQYsIxFt2ZYnrk5612NxF59tLFnG
9CufTIqSigDjPh/4Gk8EW9/E9+t39qlDgrFs24HTqc1N4x+Huj+MlSW6D297GMJdQ/eA9CO4rraKAPJD
8HdWnQWl140vZdPHHk7G6enLY/Su/wDC/hPSvCOm/Y9MiI3HMsrnLyH1J/pW5RRcDiNZ8Ayar8Q9P8Uj
UVjS0VFNuYsltpY/ezx970rt6KKACqerWJ1PSLyxEgjNxC0QcjO3IxnFXKKAOV8A+D38FaHLpz3q3ZeY
y71j2YyAMYyfSp/FvgrSPGNmsOoxFZo/9VcRnDp/iPY10dFAHkg+DuriP7IPGl6NO6eRtbp/31j9K7bw
j4H0fwbbOmnxs9xKB5txKcu/t7D2FdLRQBxHjjwDJ4w1PSrxNRW1Fi24qYt+/kH1GOldvRRQBz3izwZp
PjGxW31KIiSPPlTxnDxn29R7GuE/4U7q8cf2SHxpepp/TydjdP8AvrH6V65RQBy/g/wJpHgy3cWStLcy
jEtzL99h6ewrT8QeHdN8T6W+n6nB5kLcqQcMjeqnsa1aKAPJf+FOanahrbTfGN7bWDdYdp6enDAfpXYe
DvAOk+DYpGtd895LxLdS/eYeg9BXVUUXA8/8W/Cyy8Rat/bFjfTaZqXVpYhkMR0OMgg/Q1Rt/hNd3jIv
iTxXqOqW6HPkbmVW+uWNenUUXA4LR/htHoHjxtf0y7igsXjMZsRCeAVA4bPqAelXvGfw80nxkY552ktb
6IYS5h649CO9dfRQB5L/AMKh1uRPs1x43vXsenlBW6fi+P0rvPCnhDS/B+mmz02Nsud0sznLyH3/AMK3
qKAOB8c/DKDxdqMOp2+oSWF/EoTzFXcGA6cZBBH1roPCGhXnhzQE0691JtQkR2YTspBwTnHJNb1FABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQB8AV0S/dH0rna6Jfuj6V34HeRhW6C0oUk8An6UldLokSLYCQKNzMcnFehJ2Rgl
c5zy3/uN+VHlv/cb8q7Wio9oPlOK8t/7jflR5b/3G/Ku1oo9oHKcV5b/ANxvyo8t/wC435V2tFHtA5Ti
vLf+435UeW/9xvyrtaKPaBynFeW/9xvyo8t/7jflXa0Ue0DlOK8t/wC435UeW/8Acb8q7Wij2gcpxXlv
/cb8qPLf+435V2tFHtA5TivLf+435UeW/wDcb8q7Wij2gcpxXlv/AHG/Kjy3/uN+VdrRR7QOU4ry3/uN
+VHlv/cb8q7Wij2gcpxXlv8A3G/Kjy3/ALjflXa0Ue0DlOK8t/7jflR5b/3G/Ku1oo9oHKcV5b/3G/Kj
y3/uN+VdrRR7QOU4ry3/ALjflR5b/wBxvyrtaKPaBynFeW/9xvypCrL1Uj6iu2qG7iSW1kV1BG0mjnDl
OOooorQR9afDj/knWhf9eq/zNdRXL/Dj/knehf8AXqv8zXUV4VT436nbHZBRRRUDCigkAc0m9f7w/OgB
aKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKOlABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR3xQAUUUUAFFFFABRSZGcZ5paACiikLAdSBQAtF
JkYzniloAKKKKACiiigAoo74ooAKKOvSigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPgC
uiX7o+lc7XRL90fSu/A7yMK3QWuo0b/kGR/U/wA65eun0b/kGR/U/wA67p7GUdzQoor0T4VadY6hc6mL
2zt7kIkZUTRB9vJ6ZrCcuWLl2LSu7HndFeveKtLtbLxZoSaboVlcNIs2bXy0jSXC9+McdefSoNYupNI0
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
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooA+AK6Jfuj6VztdEv3R9K78D9oxrdBa6fRv+QZH9T/OuYrqNG/5Bkf1P867
p7GKL9dv8OfD9rr1xfrcz3UQiVCvkS7M5J6/lXEVq6J4j1Pw88z6bOsTTAB8xq2cdOo96wmm4tLctbnb
eJvD2k6D4h0hZrrUmtZVlMjCUvIMDjbgevWoLtPBRt2E13rpXHAl3bc9uornJ/G2vXOp2uoS3aG5tQwh
byVG3cMHjGDxTdW8aa7rdibO/ulkgLBioiVeR7gViqc7JNluUb6GCcbjjpnikooroMzt9W1g6dofh6MW
Gn3O6xzuuYBIR8x4B9KsaDJHqPhS5ht7OWa6a982a3sZhA2wj5SODlQe30rgKKzdNW/rvcpPb+uh6VeP
d3765aw2zQ3n9nQqYhcCR3KuMkkY+bb1+lQ6lb6zcajBqGj3awaWtiqrM7jyo1CYZWHPPUYx1rzuil7I
fMemx3k5+IOi2/2h/IFlGuwMdpBjOeK5LwfLBb+K4GldY+JEjdzwrlSFJ/HFc/RTVOyaJuej2Wn6ra6A
8Gs3DW/marblHlYOU5OWwcjHTrxxV6/inj0zxH5ljLAzQFkmnui7z4cfMFHAHuB3FeVUVLpX6/1p/kNM
9Ue0uZtXvboGeZJdOh8iCGQK1yNqhgrHJGO+MGsHxwjLomg7rYW7L56tEJjKUOVIBYknPtXE0U1Ts07g
npYKKKK1JCiiigAooooAKKKKACiiigAooooAKjn/AOPeT/dP8qkqOf8A495P9w/yoA4yiiityD60+HH/
ACTrQv8Ar1X+ZrqK5f4cf8k70L/r1X+ZrqK8Op8b9TsjsgoooqBhRRRQAUUUUAFFFFABRRRQAUhAIIIy
D1BpaKAGoiRoqRqqoowFUYAFOoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAppjQyCQopkUYDY5A+tOooAKKKKACiiigAooooAKKKKACiiigAooooAKiNrbmcTmCIzDpIUG7
8+tS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFAHwBXRL90fSudrol+6PpXfgd5GNboLXT6N/yDI/qf51zFbGl6pDbW/kzZGCSGAzXdNXRi
jforP/tqy/56N/3yaP7asv8Ano3/AHyaysyrmhRWf/bVl/z0b/vk0f21Zf8APRv++TRZhc0KKz/7asv+
ejf98mj+2rL/AJ6N/wB8mizC5oUVn/21Zf8APRv++TR/bVl/z0b/AL5NFmFzQorP/tqy/wCejf8AfJo/
tqy/56N/3yaLMLmhRWf/AG1Zf89G/wC+TR/bVl/z0b/vk0WYXNCis/8Atqy/56N/3yaP7asv+ejf98mi
zC5oUVn/ANtWX/PRv++TR/bVl/z0b/vk0WYXNCis/wDtqy/56N/3yaP7asv+ejf98mizC5oUVn/21Zf8
9G/75NH9tWX/AD0b/vk0WYXNCis/+2rL/no3/fJo/tqy/wCejf8AfJoswuaFFZ/9tWX/AD0b/vk0f21Z
f89G/wC+TRZhc0KKz/7asv8Ano3/AHyaP7asv+ejf98mizC5oUVn/wBtWX/PRv8Avk0f21Zf89G/75NF
mFzQqOf/AI95P90/yqn/AG1Zf89G/wC+TUN1rVubd1h3M7DA4wBTUWFznqKKK2IPrT4cf8k70L/r1X+Z
rqK5f4cf8k60L/r1X+ZrqK8Op8b9TsjsgoooqBiEhRk5/AZpvmL6P/3wafRQAzzF9H/74NHmL6P/AN8G
n0UAM8xfR/8Avg0eYvo//fBp9FADPMX0f/vg0eYvo/8A3wafRQAzzF9H/wC+DR5i+j/98Gn0UAM8xfR/
++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
PjZ1x2CiiioGFFFFABRXHeOfFGr6Bc6NaaNa2k9zqM5hAutwUHjHIIqjZ+MvEOl+IrDSfFuk2dsuot5d
tdWchZN/91gc9cihK4PQ7+isG/8AGvhzS9QaxvdWgiuEIV1IYhCegZgML+JFZWv/ABG0rQfFOn6LM6/6
QN0853YhUjKcAc7jjp0oWoHZ0Vgah418NaVqSaffaxbQXTY/dsTxnpuPRfxxW8rK6hlIZSMgg8EUALRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRWP4il8QQ2UbeHbaynujJh1vGKqFweRg9c4rjPC/jHxnrs8lxc
WGiwaZaXTQXsvmOrIF+8RlscChag9D0uisLSfGXh3XbyS00zVre5uEyTGpIJA7jI5H0zVY/EPwkJlhbX
LZZGlMIVgwIYHBzkcDPc8UAdNRWNY+LNA1PVpdLstVt572LO6JG5464PQ49qoy/EPwlDKIpdctkcymLa
wYEMDg544HueKAOnopqOsiK6MGVhkMDkEVl+Jdci8OeHrzVJF3+SnyJn77nhV/EkUPQFqa1FcXrXjLUN
KttHsINOjvfEOpRhhbIxSOPj5mJOTtH9Km0LWvFzayun+IPD8EUUiF1vbKQtEuP4WB7/AI/hTsK511Fc
/wCGfEMusT6rY3kccV9pt0YZFjzhkPKOM+o/ka6CkMKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKqam1+mmXDaZHDJfBD5K
TkhC3vjtQBbory238XfEO58R3WhJpOg/bLWJZpAZJNu09MHdXYReN/D39pR6TPrFmup8K8Ksdofuobpn
PbOadhXOiorn9S8b+GtHu7i11DVobe4twpkjcNkbumOOfwzR/wAJx4Y+2WloNbtDNdgNAofO7PTnoM+h
xS3GdBRWBqnjbw5ot3Pa6jqsNvPAFMkbq2Ru5GMDn8M1rafqNnqtlHeWFzHcW0gykkbZBoAs0UyWVIIZ
JpGCxxqWYnsBya8+1Dx/qcHw9fxPb2drma88u1ikDYMRfaGbB6nBNAHolFchot34+m1SBdY07RYdPbPm
vbyOXHynGAT64q/4V8Qy65Dfw3cUcN/p909tcRx528H5WGecEU7Bc6CiiikAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB8AV0S/dH0rna6Jfuj6V3
4HeRjV6C0UUV6BiFKAT0BNJXp3wdu7a1vNWNzcQwho49vmOFzy3rUVJckHLsNK7seZbWzjB/KjY390/l
XtfjHUGk8aeHZdHvdP8AtKJPtknkBiXK/wAWD6Zx71V17xR4r0jSpLmW+8PXCEhCluWZ+fbNYqu2k0t/
P/gGjppO1zx2ilJyST3pK6TMKK6650zw1pWmaTNfxapLPe2wnYwTxqq8kYAKE9vWquoeE5/7Ut4dG33l
td24uYHfCkJ3354GD1PSo9ogtpc5uiuo0nwVfXPiC206/QQxTRtJ5iTIQygH7rZIPOBxnFU4PCWsXbTe
RbRskUph3tPGqs3opLYY/TNHtIX3Hysw6K1bPw3q17NcxRWu1rZtsxmkWNUb0JYgZ9q008F3qaHqt5dp
5NzZSIoiaVBkHlicn0xjHXtmh1IrdgotnL0Vu+GNEh1q7uvtDTGG1t2naO3AMkmP4Vz3qxc6Zoc8ET6e
17DdC5SGSxu5E8x1buhwB7cihzSdhW0uc1RXRHwhqd1fTRWVvGqrM0SxTXkIkBBxg/MMn3AqCLwnrM11
dW62qB7R/LmZp0VFb+7uJwT7A0KpF9R8rMSirF7ZXOnXklpdxNFPGcMjdqr1ad9UIKKKKBBRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFAH1p8OP+SdaF/16j+ZrqK5f4cf8k60L/r1H8zXUV4dT42dcdgoooqBhRRRQ
B5p8Ur+DS9b8I6hdFhb298ZJGVSxCgDsKo6nrcHxG8UeG4NAguZLXT7wXd1dSQlEQLjC89zg/pXrNFNO
35g9TwPxXql1e2PiizZotOdbkk6bb2GZLgAj97JJjp3zxW7r9zZ6d4j8B6zeQF7EWZSWVYd+WMYCg4HJ
ya9fooi7A9b/ADPn29hisdZ8SafrlxqcEuoXbyQRW2nRzm6jY/LtdlyCB6EY+te4eH7T7B4e0+0zOfJt
0T/SAPM4H8WOM/StKii+lg63CiiikAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXjWl2F9qPwy8a2lgjtcyanO
VRergMpIH1ANey0UB1R4j4Pj0/VvEWieRd6xNeaemXjGnQwR2/y4KyMApI7d6ox6dav8JfF901rG1z/a
sgEhT5gA6Ywevc/nXvlFNu6BaM8rawtrH4heA1tLaOFTp8m7y0xn9339a5Kx1fRbPw/4p0+90mae/vby
eO1kW23+Y5yFAbsQea+gawvDHhqPwzb3sUdy0/2q6e5JZNu0t2oer+/8XcSVvw/BGb4Z1GPQdH8N+HtV
eRdUuLXCJsJ+6MkE9sD1qj8XEkPhG3dc+XHfwNL/ALu7/HFd7VHWdKt9c0e60y6BMNzGUYjqPQj3B5ob
bfN53HFW0OG8ZJcaL400PxclpNdadBC1vciBNzRKc4fHpz+lbGh/EGx8S60llpGn389rsLSXrRbI4yOx
3da6bTrV7LTba1kmM7wxLGZSuC+BjOKs0eQjgfDQZ/iv4slj/wBSsUCPjpvx/wDrrvqyNB0CLQxfOJmn
uL25a5nlZcEk9Bj0A4Fa9LokPq2FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHnmnI7fGPxIEyGbTIwp9+K810+wgOn/8
I1q0+spqn2s7rK206JmY7siQSsA2O+S36V9G0ULS39dbg+v9dLHldtpttdfFPxT9rt0nMWmRhTKgPOwA
n61yo062i+D+kXMdrGtw2rKTIE+b/WEdevQV79RTTtb5fncTV1/Xax4/qeraRovxh1q81qxe4thYwr5i
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
AL5osBYoqv8Aax/zxm/75o+1j/njN/3zRYCxRVf7WP8AnjN/3zR9rH/PGb/vmiwFiiq/2sf88Zv++aPt
Y/54zf8AfNFgLFFV/tY/54zf980fax/zxm/75osBYoqv9rH/ADxm/wC+aPtY/wCeM3/fNFgLFFV/tY/5
4zf980fax/zxm/75osBYoqv9rH/PGb/vmj7WP+eM3/fNFgLFFV/tY/54zf8AfNH2sf8APGb/AL5osBYo
qv8Aax/zxm/75o+1j/njN/3zRYCxRVf7WP8AnjN/3zR9rH/PGb/vmiwFiiq/2sf88Zv++aPtY/54zf8A
fNFgLFFV/tY/54zf980fax/zxm/75osBYoqv9rH/ADxm/wC+aPtY/wCeM3/fNFgLFFV/tY/54zf980fa
x/zxm/75osBYoqv9rH/PGb/vmj7WP+eM3/fNFgLFFV/tY/54zf8AfNH2sf8APGb/AL5osBYoqv8Aax/z
xm/75o+1j/njN/3zRYCxRVf7WP8AnjN/3zR9rH/PGb/vmiwFiiq/2sf88Zv++aPtY/54zf8AfNFgLFFV
/tY/54zf980fax/zxm/75osB8EV0K/dH0rnq6Ffuj6V34H7RlV6C0UUV3mIUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfWvw4/5J1oX/AF6r
/M11Fcv8OP8AknWhf9eq/wAzXUV4lT42dS2CiiioGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQB8AV0S/dH0rna6Ffuj6V34H7RlU6DqKSiu8yFopKKAFopKKAFopKKAFopKKAF
opKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAPrX4cf8k6
0L/r1X+ZrqK5f4cf8k60L/r1X+ZrqK8Sp8bOlbBRRRUDCiiigDH1rUdStprWz0qwW4ubkt+9mLLDCqjJ
LkAnnoBUGi6/c3M+p2Oq28MF7poRpjA5aN0YEhlJAI+6eDVXxj4wt/DMdtbCW3S+vCVha5fbFGB1dz6D
0HU1iW9zpEnhy+tdJ1mLVNU1OeOC7uY3BJeU7ScD7qhQ+B2AoWq0D1Ni+8ZNp3hWHVJbCaa7uIXmitoE
J+Ucgsf4QBjJP4Vau/Ektv4c0y9jtllvtR8pIIN2FMjjPJ7KBk/hVnxHEkHgzVIoxhEsJVUegCGucvs2
/hfwhqrIzW+nvBLcbRkrGYtpbHoNwNPTX1X6hra/qbukazqD6xNo+s21vDerCLiJ7Z2aOWPODjcAQQev
1qq/iPVbkBNL02Od57uWGCWQssSJHwzyMAerAgAdaybvXLa+1+713TJRcWenaW8XnpyjzOwKop7ngdPU
VY1bxDb+BfDmk6aZLdb+dBHGbh9kanGXdz6An6kml01/rX+vvDr/AF2LQ8Xz6fbaums2caXumrGxW1kL
JMJOE2kgEEnjBqa017V7bVbSy12ytIRfKzWz2krPhlG4owYDnHcccGuamg0zUPBmrHSNUj1rVDLDd3s0
TBmkKOrYAHQAKQBWndazp/iTxHoDaXcrcRWDyXd1IgOIV8sqA3oSW6deDT/r+v66C6E1z4q12y09tcud
It4tHV/mieVhdKm7bvKldvvtznFXfFni5fDlr+4spru6IVsKh8uNS2Nzt0A9uprlj4x0DxVqAfU9bsrT
RrebMNm0oEly6nhpPRc8he/BNdT4/wD+RI1D6R/+jFpPRXH1OlQ7kVvUZpaZF/qk/wB0U+gAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigDK1zUb2xht49OsTd3dzKIkDErHHwSWdgDhRj8ay7fxNqFrc6jYatp8bX9pai7RbBmkWdCSMKC
AQ2RjFWPF/iu28K6dFLKYzcXEnlW6SvsQt6s3ZR3rF0LXPD1hZaprU2vW2p6iIvPvpoGztQdEReygnAH
cmhdQ7GhH4g1yyvdOGtadZxWuoyiGL7NMzSQuQSA4YAHpjjvXV151oPiHSPEmuWmpanrVibrcRp+mRTB
vJJHVv70hH4CvRabEFFFFIYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVWvzeixlOnLbtd4/di4ZhHnPc
qCenpVmkJCgk9ByaAOOtdb8VDxVbaPeWujOrIZrhrSWVjDH0BO5QMk9B7Grd14vCeLLDRLaymdJpXimu
nQrGrKhbap/iPHPYUzwOpu7K+12TmbVLp5AT2iVika/QAfrTvEn/ACNfhT/r6m/9FNR2DudRRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAfAFdCv3R9K56uhX7o+ld+B3kZ1BaKKK7zIKt2Ol6hqbOthY3N0UALiGIvtz64q
pXonwp13S9DutTbU7yO2WVIwhfPzYJz0+tTUk4xbQJanGSaBrMV1DayaVepcTZMUTQMGfHJwMZOKmPhX
xCoJOh6kAOSTbP8A4V6L4t8SaZqnivQ59M8QRWohSYPeKm/ysrxwRznp+NUNd8SXtlpby2Pj0ahMSF8h
bVVJB6nOKwVWbS039S+VXPMuhwaKCSTk96K6SAorttb8PadH4F0zUrKDZerFHJdkMx3q5YA4JwMFe3rV
ifwfav4U0aG3jRNZurtI5pndsKHRnVSOQONvbNZ+1j+NgSul5nA0Vs2GgTXH2ydniMNjPHHMpJy+6QJ8
vH+FdLq3hXS4bfX54JbeFrW+SKCJ3f5Vwfl6HJbtz27UOrFO39dP8wscDRXW3ng+Z7vUpmuNN0+2tJ1h
k3SyFFJXI2kgsf50f8IuLDSNd+2xxzXEEMEtrNE5KsryAbl9QRkcij2sR8rvY5Kiukl8F30UUi/a7Jr2
KHz3sVkJmVcZPGMZA5xnNU/DWkRazq3k3EjR2sMT3E7L1CIMnHv2queNm77CszHorrtNk8Pa7qcelf2K
LEXLeXDcx3Du6MfulgTgjPXAFZGo+HrvTUtGmeL/AEqaWFQCcq0bBTnj1PbNCnd2ejCxkUV0Z8HXcU98
t3e2VrBZz/Z3uJnYI8nouFJPHtSx+C77z75J7uzto7NEleaVzsZH+6ykA5Bpe0j3Hys5uiunfwtcXUmn
wW32IK9s8z3SyPsKK7AyPuHHTsOmO9RDwdfS3Fmlnc2l3DdMypcQufLUqMsGyARgc9KPaR6sOVnO0Vqa
now06COaPUrG9jdiv+jSElSPVWAP44xWXVJp7CsFFFFMAooooAKKKKACiiigAooooA+tPhx/yTrQv+vV
f5muprlvhx/yTrQv+vVf5muprxKnxs6FsFFFFQMKKKKAGPHHJ99FbHTIzQsUafdjRfotPooAQgEYIyDR
gbduBjpilooAaI0C7QihfQDih445PvorY6ZGadRQA1I0jzsRVz1wMULGi52ooz1wOtOooAi+zwf88Y/+
+RUhAYYIBHoaWigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAa8aSffRWx0yM00QRAECJAD1wo5qSigCMQQqQViQEdCF
FSUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAgAUYUAAdhQQCQSASOntS0UAFFFFABRR
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
P8aN7f8APJ/zH+NPooAZvb/nk/5j/Gje3/PJ/wAx/jT6KAGb2/55P+Y/xo3t/wA8n/Mf40+igBm9v+eT
/mP8aN7f88n/ADH+NPooAZvb/nk/5j/Gje3/ADyf8x/jT6KAGb2/55P+Y/xo3t/zyf8AMf40+igBm9v+
eT/mP8aN7f8APJ/zH+NPooAZvb/nk/5j/Gje3/PJ/wAx/jT6KAGb2/55P+Y/xo3t/wA8n/Mf40+igBm9
v+eT/mP8aN7f88n/ADH+NPooA+AK6Ffuj6Vz1dCv3R9K7sF9ozqC0UUV6BmFFFFIAooooAKKKKYBRRRS
AKKKKACiiimAUUUUgCiiigAooopgFFFFIAooooAKKKKYBRRRSAKKKKACiiimAUUUUgPrT4cf8k60L/r1
X+Zrqa5f4cf8k60L/r1X+ZrqK8Wp8bN1sFFFFQMKKKKACisfWl1uea1tdJljtYpCxuLxkV2iAHAVSeST
35ArN0TWr2K512y1S6juxpIR/tiRhN4ZSxDAcBhjnHqKAOqorjtQ1zxBZeCor22shc6hJbPcSSyFUjgG
C3I7kAgAAc45q7LrGrJ4Rsbyysvtt/cWyOSzBI0JQEs3t7AUPRN9gWtjpKK5/Q9aml8CWutag6tL9j+0
TMAACQMngVSgj8WalFaqb+PToRapLJciBJHllbJK7TwqqMduabWtgT0udbRXCW/irVb3RbC2hkt11O81
CSxS6WPMZWPJaULnnhemcZq9balrlhqWo6LPLHqd8ll9rspCiwmTkrtfHAw2OeODS/r9Q/r9DraK4x7v
xDoeoaOdR1SG+Go3AgltBbKnlEqSShHJAxznNS69r2tWfiLSbS2shDp016kEtzIwLS5UnCL2HHJOPanb
Wwr6XOuooopDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiuG8W6/dWviS20y31qTTI1tGuJmishcu5LbVAXBPZjxQB3NFZX
h24N1okE/wDao1Tfki6ESx7uem0cAjpWrQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFU9Ukv
otLuH02BJ70J+5jdsKW9z6d6ALlFceLvXdE17SLW/wBUi1FNSdo3iFusbQkLu3KV6qOhznqKNe8TXsOv
6fYaZs+zrexQX0xAPLgkRr74GSe3HrTtqkB2FFFFIAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+AK6Ffuj6Vz1dCv3R
9K7sFvIzmLRRRXoEBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQB9a/Dj/AJJ1oX/Xqv8AM11Fcv8ADj/knWhf9eq/zNdRXiVPjZstgoooqBhR
RRQBynjTWdU0+O1s9Msb9zdEia7tLVpzboOuAONx6DP1rNtlhuvDb6LpWkavai4uI47ma+tWjeRXbMkh
Y/eO0HJ9xXe0UIGZfiGB5fC+p29vEzu1nIkcaDJJ2EAAUzTIJY/B9nA8brMtgiNGVwwbYBjHrmteih6p
ruNO1vI4mzsL1/AGg6O9rOjz+TFdKUIMcYO593pkDHPrUXi7VtQk1ddGTT9ZTShGGuLnT7N5Gmz/AMs1
YcKMdT17V3dFD1EtEcRdRebpuh6ro+jXsMWk3J/0GS3MUpiKFG2oep5z74oS7vZdY1LxUuj36xW2ni2t
bWSErNcNuLHCdQM4H5mu3oouB574Z1BrjWI7/WNJ12TV7j5BJLpzpBaKf4UJ6D1Y8mt/xVa3Fzd+H2gg
klEOqRySFFJ2KFbk+g5HNdHRTvsK24UUUUhhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGZrGl3GqRxLb6ve6cUJJa12Zf2O5T
WRcXl74f1VfP0q51K2a1SNb62txJcM4JyJNuOD1BAA611VFAHO+D9PurKwvZ7u3+zPfXkt0tsSMxKx4B
xxnufrXRUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWdruoz6Vol1e21lNezxJmO3hQs0jE4
AwOe/PtWjRQwPP8AwzdmbUTcahp2utrV4hQ3dxpzpDbDGdqZ4VR+veq2o+EPEFhZ6VbWuutcompJKxGn
KWVjuJlc7ueTzn1r0mincBqBljUO25gAC2MZPrinUUUgCiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD4AroV+6PpXPV0K
/dH0ruwX2iJi0UUV3mYVraJ4a1bxG8yaXaidoQDIPMVcZ6feI9Kya734Z+JLLw7c6i95HcuJkQL5ERfG
Cev51NRtRbjuC3MS48D+IbXVLTTZrALd3YYwp5yHdtGTznA49auN8M/FqIzNpYCqMn/SI/8A4quj8VeJ
9J1/xLo0obVba3gWUSPDEUmGRxt/r7Vma5eWK6Yx0bVPFD3e4fLcu4Tb3rBVKjS6P08y+VXOCIwSD2pK
O/NFdJAUV3mgaybnw9rc02maS0ljbRtCxsIs5LBcnjnioX8NJqktnNqF7HZX+pIrw29tY4iQHhdxUgLn
HYHrWftLOzGldHE0V1kHhC0jsrWbVNVe0luLl7URJb+YQ6tjruHFJeeELW3i1FINW8+8011W5i8gqvLb
flbPOD7Cn7WIWZylFdhd+DLKK+vNNtdZ8/U7aJpfJNvtVgBuIDbj82OcY/GrOraBZXmq26+cllEmmW8j
JBCHklZh/CgxuOeSaXtYhys4aivQ9N8H2OnazGL+aWS3uNPmnhWa02upUEHchbgjqPWsi38I2bWtnNd6
pLB9uY/ZQtoX+TOAz4Pyg/jQqsW/6/roFmcnRXXxeCPItJ59Uu54BFdNbN9mtTPtK4+ZsEbRzxXLXUSQ
XcsUUyzRo5VZVBAceuDyKqM4y2CzIaKKKoQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfWvw4/5J
1oX/AF6r/M11Fct8OP8AknWhf9eq/wAzXU14tT42bLYKKKKgYUUhzj5QCfc03Mn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBa
jMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT
+6v/AH1/9ajMn91f++v/AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AD6KZmT+6v/AH1/9ajMn91f++v/
AK1AD6KZmT+6v/fX/wBajMn91f8Avr/61AHwHXQr90fSueroV+6PpXdgvtETFooorvICvS/hBqFjYXeq
m9vLe2DpGFM0qpu5bpk15pRUzjzxce4HtHjDVornxl4fl0fWNMSaNJ/9IlmVoo8r/Fg8ZGQPeqmveJ/E
elaW9z/wkfh+9yQhhtcM5z3xXkVFYrDpJLsVz63AnJJPeiiiugk2dI1eDT9H1qzlSRpL6BI4yoGFIbPP
Nb9t41t3sbFLu81u2ltYhC0djMFjlC9DyRtOODgGuHoqJU1LcFodJc+I4Lm00uNkuDLa3klxKzsGLBmB
HOck8d8VL/wkVrLqPiGQRTAarKDDkD5f3of5ufT0zXLUUezihtto9D8Q6vo+jeKtWu7WG7bVWRoQCV8l
WZQC4PUnB6Y6mqy+NNOcTRMl/brLZW9v9pttolRo+oGT90/WuFoqVRjZJhzM7o+MtJF3pm2C/NvbWk9r
K0hVpGEn8QOeTyeKba+MbMadZ2cl7rlqtlmOM2bqomjzkbhu4bHGRmuHoo9jH+v68wuzstP8VafDNJcS
S6za3RuDIZrefzGmTjCybiASMdcVzmt6gmq61eX8cAgSeQusY/hH+NUKKpQSd0FwoooqxBRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQB9afDj/knWhf8AXqv8zXU1y3w4/wCSdaF/16r/ADNdTXi1PjZqtgoo
oqBhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfAFdAv3R9K5+uhX7o+
ld2C3kRMKKWiu8gSilooASilooASilooASilooASilooASilooASilooASilooASilooASilooASiloo
ASilooASilooASilooASilooASilooA+tPhx/wAk60L/AK9V/ma6muW+HH/JOtC/69V/ma6mvFqfGzVb
BRRRUDCiiigDH1rSrvVprWJdQltLFSzXK27mOSTj5QGHIGeTisHQNSewXxIy3s95pGn4NvPPIZG3BSZE
DnlgCBzzySKt+NIfEN4lrZ6RZmezkJN7sulgdl7IGIOAe5HaoYrLVb/RY9Ik8PwaRZrNCrJHdrKGhDbn
HAGPuge+6hbMGRaqniK28Ar9jvEhuFs5J7q6mLPIp2ltqD1ySMk8AVox2mo6x4Q0eKDUJLZpYYGuZwx8
1k2gsFbsx9frWrrlpLfeH9Qs7dQZZ7aSNATgZKkCsHVrXxHbeC9O07RYFa9EUUNwwnVDGoUBtrHIzxgH
tTvv8v1Dovn+hHoZaw8YX2m2WoXd5pkFqHuDczGbyJt3Ch255XkjPFFnp+peIdPhum1O4trK7uZbiVYp
WWQxfdiRG/hXADHGOtM0+11uHw/eaTbeGotMDwMsc329Zi8jcFm4BJ5JyT2qXxRYa6NL0/StBtDLZKAl
1sulgcxgYCKxBxnuRSAxn1i80nTfEaaZf3F3ZQSwW9pc3DmUpNIwVwGP3gu4HnvxWqbafwx4g0aKDUb6
6h1JngmS7naUbwhZXGfu9DkDjmnDSNQ1fwrdaJJocGiIiobTZciZd6sGBO0DHIGfWpY7LXtW1fT73VdP
t7SPTA7xxx3HmGeUrtB6DauM9eeaYdDJ16wv9D0uPUG1y+m8QzTqsEKTt5MzFv8AViLpt298Z4zmtH4g
za7Boks2n3UVpaRKjTSLnznJcDav90c9etZumQeLLfU5dV1HwvFfai5KpM2poqwR54WNdp28dT1NdT4t
0251fwxd2NoqtPLs2hmwOHBPP0FJ7B1NmPmJCf7op1NQFY1B6gAU6hgFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAZWuade6pD
b21tfPZwmUG5eJisjIAflVh0ycc1i+G2kt/FWqabZ311e6Vbwpue4lMpinJOUDnk/LgkZOKt+Ml8QTab
FbaBBvaWTFw6zrE6x9wrHOCemccUvhZL+0g+wzeHItJtIlyjJerMXbPOcAHPfJoQM6OiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKqanFdz6ZcRWE6QXToVilcZCE98VbqnqsN7caXcRadcrbXjL+5l
ZQwVvcenb8aGCOM0y4Sw8c2uk2GrX90RFJ/aC30zMpYY2mPf3znOzjFY/nGaW/1jVo/Ey2f22XdcW968
UMEattX92GBI4ySB3rqDp+va7rGlT6pYW2nxabKZi8dx5rTPtK4XAG1ecnPtUN7ZeLrzTLvQZo7WeK4L
p/arShSImPQxBfvAHHHFPVa9QOzRleNXRgysAVIPUU6oraBLW0ht487IkVFz6AYqWh76CV7ahRRRSGFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAfAFdCv3R9K56ugX7o+ld2C3kTIdRSUV3kC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0U
lFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAC0UlFAH1r8OP+SdaF/16r/M
11Nct8OP+SdaF/16r/M11NeLU+Nmq2CiiioAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigD4AroF+6PpXP10C/dH0ruwW8iZC0UUV3khXQ+FvB994tluY7Ga3iNuFLecWGc56YB9
K56u9+GWs3mkXOotaaNdakZEQMID9zBPX61FRtQbjuBTvvhxqmn63p+lT3liJb4OY33tsXaMnJK1df4T
6qkbOdV0khQTxM3/AMTWr4o1OfXvE+ipqPhS+2IsoFmz4af5exHpjP4VQ13QVutMaPTPAmo2NwGDec0j
OAB14rnVSdld2+7v6lWVzzwjBI9DSUpGDg0ldRI/y5P7jflTSCDggg+4rv8Aw34m1t/DXiBn1O5LWtrH
5BL/AOr+cDj8Ksr4SbVfsFxqqaxe3uoxLJJeRYMcIPC7sjLYGM8is3Us9QR5tRzjNd5ZeCrQWLPcW9/q
FxHPJFcLYSoDAFOASjAls9e1VdWTTYfh9YpFb3Im+2zKruyg5GMlhj0xxnjmj2qvoOzOPCM33VJ+gpCr
A4KkH0xXaaDqN5pfw91a5sLmS3mF7Cu+M4OCDmrVjcz+JvD0d1qUzPe2epQRR3YwJCjnlc98EZGabm7v
TRNL77f5i6HAdDg0V6CnhOyvJtSuHj1HU5k1CeKVLWaMSxqr8OwIyxPJ4x0rLXSPD9lojajfjUnJvZLa
OFCsbFQActkHBHce4pKqmOxyVFdteeE9L0eK71G9muptOBiFqkRVJJPMXcNxIIGB7VJaeD9Lu7mGeCa5
ktbq0NxbWplRJncNtZNxG3I69OaPaxFY4Wiu6t/Bdtdavcxiy1eGG1tRNLayKpmZycBUIGCD64rN8T+G
V0iwstQht7y2iuGaNre8x5iMvuAMgj2oVWLdgscvRRRWoBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH1r
8OP+SdaF/wBeq/zNdTXLfDj/AJJ1oX/Xqv8AM11NeLU+NmiCiiioAQgkcHFN2v8A3/0p9FADNr/3/wBK
Nr/3/wBKfRQAza/9/wDSja/9/wDSn0UAM2v/AH/0o2v/AH/0p9FADNr/AN/9KNr/AN/9KfRQAza/9/8A
Sja/9/8ASn0UAM2v/f8A0o2v/f8A0p9FADNr/wB/9KNr/wB/9KfRQAza/wDf/Sja/wDf/Sn0UAM2v/f/
AEo2v/f/AEp9FADNr/3/ANKNr/3/ANKfRQAza/8Af/Sja/8Af/Sn0UAM2v8A3/0o2v8A3/0p9FADNr/3
/wBKNr/3/wBKfRQAza/9/wDSja/9/wDSn0UAM2v/AH/0o2v/AH/0p9FADNr/AN/9KNr/AN/9KfRQAza/
9/8ASja/9/8ASn0UAM2v/f8A0o2v/f8A0p9FADNr/wB/9KNr/wB/9KfRQAza/wDf/Sja/wDf/Sn0UAM2
v/f/AEo2v/f/AEp9FADNr/3/ANKNr/3/ANKfRQAza/8Af/Sja/8Af/Sn0UAM2v8A3/0o2v8A3/0p9FAD
Nr/3/wBKNr/3/wBKfRQAza/9/wDSja/9/wDSn0UAM2v/AH/0o2v/AH/0p9FADNr/AN/9KNr/AN/9KfRQ
Aza/9/8ASja/9/8ASn0UAM2v/f8A0o2v/f8A0p9FADNr/wB/9KNr/wB/9KfRQAza/wDf/Sja/wDf/Sn0
UAM2v/f/AEo2v/f/AEp9FADNr/3/ANKNr/3/ANKfRQAza/8Af/Sja/8Af/Sn0UAM2v8A3/0o2v8A3/0p
9FADNr/3/wBKNr/3/wBKfRQAza/9/wDSja/9/wDSn0UAM2v/AH/0o2v/AH/0p9FADNr/AN/9KNr/AN/9
KfRQAza/9/8ASja/9/8ASn0UAM2v/f8A0o2v/f8A0p9FADNr/wB/9KNr/wB/9KfRQAza/wDf/Sja/wDf
/Sn0UAM2v/f/AEo2v/f/AEp9FADNr/3/ANKNr/3/ANKfRQAza/8Af/Sja/8Af/Sn0UAM2v8A3/0o2v8A
3/0p9FADNr/3/wBKNr/3/wBKfRQAza/9/wDSja/9/wDSn0UAM2v/AH/0o2v/AH/0p9FADNr/AN/9KNr/
AN/9KfRQAza/9/8ASja/9/8ASn0UAM2v/f8A0o2v/f8A0p9FADNr/wB/9KNr/wB/9KfRQAza/wDf/Sja
/wDf/Sn0UAM2v/f/AEo2v/f/AEp9FADNr/3/ANKNr/3/ANKfRQAza/8Af/Sja/8Af/Sn0UAM2v8A3/0o
2v8A3/0p9FADNr/3/wBKNr/3/wBKfRQAza/9/wDSja/9/wDSn0UAM2v/AH/0o2v/AH/0p9FADNr/AN/9
KNr/AN/9KfRQAza/9/8ASja/9/8ASn0UAM2v/f8A0o2v/f8A0p9FADNr/wB/9KNr/wB/9KfRQAza/wDf
/Sja/wDf/Sn0UAM2v/f/AEo2v/f/AEp9FADNr/3/ANKNr/3/ANKfRQAza/8Af/Sja/8Af/Sn0UAM2v8A
3/0o2v8A3/0p9FADNr/3/wBKNr/3/wBKfRQAza/9/wDSja/9/wDSn0UAM2v/AH/0o2v/AH/0p9FADNr/
AN/9KNr/AN/9KfRQAza/9/8ASja/9/8ASn0UAM2v/f8A0o2v/f8A0p9FADNr/wB/9KNr/wB/9KfRQAza
/wDf/Sja/wDf/Sn0UAM2v/f/AEo2v/f/AEp9FADNr/3/ANKNr/3/ANKfRQAza/8Af/Sja/8Af/Sn0UAM
2v8A3/0o2v8A3/0p9FADNr/3/wBKNr/3/wBKfRQAza/9/wDSja/9/wDSn0UAM2v/AH/0o2v/AH/0p9FA
DNr/AN/9KNr/AN/9KfRQAza/9/8ASja/9/8ASn0UAM2v/f8A0o2v/f8A0p9FADNr/wB/9KNr/wB/9KfR
QAza/wDf/Sja/wDf/Sn0UAM2v/f/AEo2v/f/AEp9FADNr/3/ANKNr/3/ANKfRQAza/8Af/Sja/8Af/Sn
0UAM2v8A3/0o2v8A3/0p9FADNr/3/wBKNr/3/wBKfRQAza/9/wDSja/9/wDSn0UAM2v/AH/0o2v/AH/0
p9FADNr/AN/9KNr/AN/9KfRQB8AV0C/dH0rn66Bfuj6V3YL7RMh1FJRXcSLXoPwt8RaT4fudSfVLsW6z
IgjJRmzgnP3QfWvPaKU4qUXF9QPWPFnijRdY8UaJPYa+1pFAkwkvI4XJiyvHBHOen41na74i+y6Y0mme
Pby/uCQvkG3KZB6nJFecUVkqEUku3oVzaik5OTRSUVsSaumaydO0zVLIQCT7fEsZffjZht2cY5rRi8UW
klraJqeji9ntIxFHKLlowyD7odQOcfUVzNFS4JgdNp/iiztFgebRInubeVpIZoJzCeTnDYBLAe56cVDq
Hib+1NJmtLuyVp2u5LpJ0k2hGc5Ybccj8a5+ij2cb3Hc6DR/EFpY6JdaVfaWb2C4mWU7bgxEFRgdAakm
8UxrHZWunaalnYW1wLloRKXaVx3ZyPTgcVzdFHIr3F0sdSniuya5kuLrREkm+1yXUUsNwYnXc27azAfM
AenStK48TaffeGnm1WzhvLi41OSZreOfynjyowRjJx26c1wlFS6UWO51L+MjePeRalp0dxYXBQrbJIY/
J2DC7W5xgcdOaR/FsE0yxT6NA+mx24t4bbzCGiAOdyyYyGJ6nHNcvRT9nEDrj44bzI4BpwOmLbG1Nq87
MzKW3Z8zrkHpxxWLqupWV7HDFZaaLNI8klp2ldyfUnHH4Vl0U1CKd0AtFJRVCFopKKAFopKKAFopKKAF
opKKAFopKKAFopKKAPrX4cf8k60L/r1X+Zrqa5b4cf8AJOtC/wCvVf5muprxqnxs0QUUUVABRRRQA2SR
IkLyOqKOrMcAURyJKgeN1dT0ZTkGsjXNFsNTkt7jVZA1labpHglI8lzjG5weuPeua0KeLTLDxLrOnwG3
0RgGsIcbVdlUhnReys23HrjPejuB3gkRk3h1KjPzA8cUb08vzN67MZ3Z4x65ritd0G6T4em0XUZrWO2s
ZHuEhADTPtLEFuoG7Ocda0bbR4tb8FaNa3Ekgt1ggkkiQ8TBVB2N7GnbcOx0ccscyb4pEkX+8rAihpok
V2aVFVDhiWGF+tcL4WlgsvFesIuntotv9mSSPT3ULvCk7pgF+UdhwfrVnT9Bs9X0a11PWHzBLNLfzQSE
eVJv+5vz1Cpj2pAdlHJHKgeN1dD0ZTkU2OeGbd5UqSbThtrA4ry+ZzbaB4ivtEjey0a8mt7e1VMoDudU
kkQfwghuMdcZrdvNKsvDniXw6dIto7MXcklrOIRtEi+WWBb1IK9TzyadgOz+0Qed5PnR+b/c3Dd+VPZl
RSzsFUdSTgCvOfEGgaXYWcGmabH9o8T3Eokiu8ZnU78tK7DkKOnp2rQ+JGnXNz4enuv7RmjtoBGTbRAK
JH3jlj1I56UulwO3opkX+qT/AHRT6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACmSzRQKGmlSNScAuwFV77VNP0xUa/vrW0V
zhTcTLGGPtk81w/iKa0vvGFvIdNPiO1/s/ctrAFkEJLZEnzEIdw4BznjigD0IEEZByD0NLXMeAGJ8KQo
0pLRyyqYiSWt/nOIjnnKjArp6bBBRRRSAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKZKrtC6xuEkKk
KxGcH1xQA4OpcoGBYDJGeRTDPCJhCZYxKRkJuG78q4vwpYy6d458SRXF9PezG3tHeaYjJJ8zoBwB7CuS
vPLfTdSuBpcs1ydQZk8SBfkjXf8Aez9/Cj5cAbeOtO2tgZ7LRTUYNGrBgwIBDDvTqQBRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQB8AV0C/dH0rn66Bfuj6V3YL7RMhaKKK7iQooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+tfhx/yTrQv+vVf5muprlvhx/yTrQv+vVf
5muprxqnxs0CiiioAKKKKAOX8X+H9V19rJLO9tI7SFzJNb3UTOkzfw7grDIHXHrTk0bXr62S21i9054E
uIZQlpbPHlUO4qdzHqQv5GumooWgPUp6tZNqWj3tirhGuIHiDEZC7gRn9azbjQLl/D+nWVrqDW15YLGY
51BKsyLghlzyp54reooA5KTwtqd+15d6nqcD381qbOIwQlI4Y2PzkAkksfXNP8VeGtR1m20+0067tILK
2IaS3uYmdJsD5Q21hkD0711VFAHNf2Hq2p6NeaZr13YPFKirCbG3aIxkHIPzMehAI+lNtdA1eXUre+1j
Ura5kso3W0WGAou5hgu+ScnHpgcmunooA4TSfDPi7SJbiaLVNFluLly89xNZytI/PAJ8wcDoABium8R6
S+uaDc6ckqxNNtw5GQMMD0/CtWijpYBFG1FX0GKWiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCvdWNnfKq3dpBcBTlRLGH
x9M1hXfh6+ttXfUvD93a2kk0KQzQTwF42CZ2kBSCCMkeldLRQBlaBo39i2UqSXBuLm4me4uJiu0PIx5w
Ow7AVq0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBkWmitb+JdU1VplZL2GGIRgcrs3Z
59936Vht4Q1ZNNm0K31eBNDlLDa1uTcIjEkoGzjuRkjNdnRQAyGFLeCOGMYjjUIo9ABgU+iigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooA+AK6Bfuj6Vz9dAv3R9K7sFvITFoooruJCiiigAooooAKKKKACiiigAooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD61+HH/JOtC/69V/ma6muW+HH/JO
tC/69V/ma6mvGqfGywoooqACikI3DHP4Gm+WP7z/APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/
AO+jR5Y/vP8A99GgB9FM8sf3n/76NHlj+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0
eWP7z/8AfRoAfRTPLH95/wDvo0eWP7z/APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/
vP8A99GgB9FM8sf3n/76NHlj+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8A
fRoAfRTPLH95/wDvo0eWP7z/APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99Gg
B9FM8sf3n/76NHlj+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8AfRoAfRTP
LH95/wDvo0eWP7z/APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99GgB9FM8sf3
n/76NHlj+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8AfRoAfRTPLH95/wDv
o0eWP7z/APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99GgB9FM8sf3n/76NHlj
+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8AfRoAfRTPLH95/wDvo0eWP7z/
APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99GgB9FM8sf3n/76NHlj+8//AH0a
AH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8AfRoAfRTPLH95/wDvo0eWP7z/APfRoAfR
TPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99GgB9FM8sf3n/76NHlj+8//AH0aAH0Uzyx/
ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8AfRoAfRTPLH95/wDvo0eWP7z/APfRoAfRTPLH95/+
+jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99GgB9FM8sf3n/76NHlj+8//AH0aAH0Uzyx/ef8A76NH
lj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8AfRoAfRTPLH95/wDvo0eWP7z/APfRoAfRTPLH95/++jR5Y/vP
/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99GgB9FM8sf3n/76NHlj+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD3
0aAH0Uzyx/ef/vo0eWP7z/8AfRoAfRTPLH95/wDvo0eWP7z/APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9
FM8sf3n/AO+jR5Y/vP8A99GgB9FM8sf3n/76NHlj+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzy
x/ef/vo0eWP7z/8AfRoAfRTPLH95/wDvo0eWP7z/APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/
AO+jR5Y/vP8A99GgB9FM8sf3n/76NHlj+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0
eWP7z/8AfRoAfRTPLH95/wDvo0eWP7z/APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/
vP8A99GgB9FM8sf3n/76NHlj+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8A
fRoAfRTPLH95/wDvo0eWP7z/APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99Gg
B9FM8sf3n/76NHlj+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8AfRoAfRTP
LH95/wDvo0eWP7z/APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99GgB9FM8sf3
n/76NHlj+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8AfRoAfRTPLH95/wDv
o0eWP7z/APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99GgB9FM8sf3n/76NHlj
+8//AH0aAH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8AfRoAfRTPLH95/wDvo0eWP7z/
APfRoAfRTPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99GgB9FM8sf3n/76NHlj+8//AH0a
AH0Uzyx/ef8A76NHlj+8/wD30aAH0Uzyx/ef/vo0eWP7z/8AfRoAfRTPLH95/wDvo0eWP7z/APfRoAfR
TPLH95/++jR5Y/vP/wB9GgB9FM8sf3n/AO+jR5Y/vP8A99GgB9FM8sf3n/76NHlj+8//AH0aAH0Uzyx/
ef8A76NHlj+8/wD30aAPgOugX7o+lc/XQL90fSu3B7sTFooorvEFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH1r8OP8AknWhf9eq/wAzXU1y
3w4/5J1oX/Xqv8zXU140/jZQUUUVABRRRQAUVS1PVtP0a2+06jdxW0RO0M56n0A6k/SjTdW0/WLX7Tp1
3FcQg7SyHofQjqD9aALtFVF1OybTm1D7TGLNQxaYnCgKSCefoangniureO4hcPFKodGHcEZBoAkoqta6
jZ3s1zFa3CSyWsnlTBTnY2M4PvzVa78QaTYQTzXV/DDHBL5MjMej4B2j1OD0FAGlRVCw1vTNUsnvLK+h
mt4873DYCY67s9PxqLS/Emja1LJFp2oQ3EkYyyoeceoz1HuKANSisb/hLNA/tP8As7+1bb7Xv2bN3G7+
7npn2zmtG9vrXTbVrq8nSCBMbnc4HJwKALFFICCAR0NLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUVT1PVLLRrB73ULhbe
2QgNI2cAk4HT3qppXijRdbE507UI5xAu6UgFQg9TkD0oA16Kx9P8VaFqt4bOx1O3nuACQit97HXbn734
ZrYoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoqtFqFpPfXFlFcI9zbqrTRqclA2cZ+uD
WfL4s0CHU/7Ok1W2W63bChbgN6E9AfbNAGzRWRrHijRdAlii1TUI7Z5lLRqwJLAdTwDV3TtSs9WsY72w
nE9vJnbIoIBwcHrQBaooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooA+AK6Bfuj6Vz9dAv3R9K7cH1ExaKKK7xBRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB9a/D
j/knWhf9eq/zNdTXLfDf/knWhf8AXqv8zXU14s/iZQUUUVIBRRRQBk61/ZFiYdb1QqhsQ3lSMT8pbg4X
ux6DjNc3btd2On+I/E01sbSTUlQWtqw+YYBSMsOzMWGR24ra8ReFY/EN3Y3L6nfWb2TFohblMbj/ABEM
p5Hai28LsgVb3W9S1BUnjnVblo8BkJIHyoOMkH/gIoXmBm+I/DNk3gR7e5Eki6fYOUjEhCM4T7zAfeII
yM+tRXniKPQvBGhwi5jtrm9toooppPuRDYCzn6DoO5xXXahZx6jp1zZSsyx3ETRMV6gMMHHvzRZWUVlp
9tZpl47eJYlL4JIUYGffinff+u4dF/XY4PwNqmhWN14jg0++ilijkE4IbLSKsS7nJ75Ocn1rW0+20vTv
D1hrut7Y54jJd+Y5PyvMSTgdzggDjPHFaknhmzki1aPzZlGqOGm2kDAChSF46EDn6mofEPhSLxBLYO2o
3tn9hYvELYpjdjAJDKeQOlK4HJa1bXk3h/Xtdntms49UmtYltmGG8kSKpZx2Zgx47Cuh8QRJD4n8KGBQ
rGaWA7Rj90YiSPpkLWhb+GQLC8stS1W/1W3uk2Mt2U+Uf7O1V/yKZYeFIrO7W6m1LUL2eKJord7mRW8h
T124A54HJyeKegGHrVrZ31j/AMIVoFuDtdWuZRkraLu3Fix6yHsOvOTU3xH0a0uvDtxqM4kkmtlQQqZD
sQ+YPm29N3OMmpLDwA+lwmGy8U63DGzmRlVofmYnJJPl5Jro9Y0qHW9Jm064eRIpdu5oyN3BB7j2pPYO
pci/1Sf7op9Io2qFHYYpaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOd8W6ddarFptraXltbOt6kxM/JYICcKv8AEc4OPaqV
u17JrN74V126XUba4svPWcIIX2FirIwXA+hGK3da0S21u3ijneWKSGQSwTwttkicdwazR4Ot/sOoRSaj
fy3d/F5Mt88i+cE/ur8uFHXoO9AGc/k+JNc0u30iIDTdGn8yS8A+UsqlRFGe/Xk9OMV2tcvpHg+XR2tV
h8R6u9tb4C2zmERkDsQIwcfjXUUxBRRRSGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFMlj82F49zLvUr
uQ4Iz6H1p9FAHEeFdKtNH8c+I7SzRlj+zWjMXcszsfMyxJ5JNM123spdOn8F6DbLJcXBLXBOWS1Vm3NI
7H+LngdfwrqYNHgt9av9USSXz72OON1JG1Qm7BHHX5jXPWfgB9PEws/FOtwCaRpZNrQ/MxOSSTHk099w
80Pu9D1S68VyXVhrUFoIbGO2BWNZpVO4sSVbgA8fXFaXhTVrrVtMn+3CP7XaXUtpK8YwsjI2NwHbPpSa
j4Wivb8X8Go31heGIQyzWrqDMo6bgQRn3xmtHStKtdG0+Oys0IiTJJY5ZmJyWY9yT3oEXaKKKQwooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigD4AroF+6PpXP10C/dH0rtwfUBaKKK7xBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB9a/Dj/knWhf8AXqv8zXU1y3w4/wCSdaF/
16r/ADNdTXiz+JjCiiipAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD
4AroF+6PpXP1vr90fSu3B9QFoooruAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKAPrb4b/wDJOtC/69V/ma6muW+G/wDyTrQv+vVf5muprxp/
EwCiiipAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD4ArfX7o+lYFdA
v3R9K7cH1AKKWiu4BKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKWigBKKW
igBKKWigBKKWigBKKWigBKKWigBKKWigD61+G/8AyTrQv+vVf5muprlvhv8A8k60L/r1X+Zrqa8afxMA
oooqQCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+AK6Bfuj6Vz9b6/d
H0rtwfUB1FJRXcMWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikooAWikoo
AWikooAWikooAWikooAWikooAWikooA+tvhv/wAk60L/AK9V/ma6muW+G/8AyTrQv+vVf5muprxp/ExB
RRRUgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB8AVvr90fSsCt9fuj
6V24PqNC0UUV3AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFAH1t8N/wDknOhf9eq/zNdTXLfDf/knWhf9eq/zNdTXjT+JiCiiipAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD4ArfX7o+lYFb6/dH0rtwfUaFoooruG
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFAH1t8N/+SdaF/wBeq/zNdTXLfDf/AJJ1oX/Xqv8AM11NeNP4mSFFFFSAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHwBW+v3R9KwK31+6PpXbg+o0LRRRXaUFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH1t8N/
+SdaF/16r/M11Nct8N/+SdaF/wBeq/zNdTXjz+JkBRRRUgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQB8AVvL90fSsGt9fuj6V24PqNC0UUV2lBRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB9bfDf8A5JzoX/Xqv8zX
U1y3w3/5JzoX/Xqv8zXU148/iZAUUUVIBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAfAFb6/dH0rArfX7o+ldmD6lRFoooruKCiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD62+G/wDyTnQv+vVf5muprlvhv/yTnQv+
vVf5muprx5/EzMKKKKkAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPg
Ct9fuj6VgVvL90fSuzB9SojqKKK7igooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooA+tvhv/wAk50L/AK9V/ma6muW+G/8AyTnQv+vVf5muprx5
/EzNhRRRUgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB8AVvr90fSsC
t9fuj6V2YTqVEWiiiu4sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKAPrb4b/8k50L/r1X+Zrqa5b4b/8AJOdC/wCvVf5muprx5/EzJhRRRUgF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB8AVvL90fSsGt5fuj6V2YTq
XEdSUUV3FBS0lFABRRRQAtJRRQAUtJRQAUUUUALSUUUAFLSUUAFFFFAC0lFFABS0lFABRRRQAtJRRQAU
tJRQAUUUUALSUUUAFLSUUAfW/wAN/wDknOhf9eq/zNdTXLfDf/knOhf9eq/zNdTXjz+JmTCiiipAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD4AreX7o+lYNby/dH0rswnUuA6
ikortLFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFopKKAFo
pKKAFopKKAFopKKAFopKKAPrf4b/APJOdC/69V/ma6muW+G//JOdC/69V/ma6mvIn8TMnuFFFFSIKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD4AreX7o+lYNby/dH0rswnUuAt
FFFdpYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAfW/w3/wCSc6F/16r/ADNdTXLfDf8A5JzoX/Xqv8zXU15E/iZk9woooqRBRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfAFby/dH0rBreX7o+ldmE6lwFooortNAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooA+t/hv/wAk50L/AK9V/ma6muW+G/8AyTnQv+vVf5mupryJ/EzF7hRRRUiCiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooA+AK3l+6PpWDW8v3R9K7MJ1NKYtFFFdpoFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH1v8A
Df8A5JzoX/Xqv8zXU1y3w3/5JzoX/Xqv8zXU15E/iZg9woooqRBRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAfAFby/dH0rBreX7o+ldmE6mlMWiiiu00CiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD63+G//JOdC/69
V/ma6muW+G//ACTnQv8Ar1X+Zrqa8ifxMwe4UUUVIgooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKAPgCt5fuj6Vg1vL90fSuzCdTSmLRRRXYahRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB9b/Df/AJJzoX/Xqv8AM11N
ct8N/wDknOhf9eq/zNdTXkz+JnO9woooqRBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
gitextract_m_q4b0tl/
├── .gitattributes
├── .gitignore
├── BlazorPro.BlazorSize.BlazorRepl/
│ ├── BlazorPro.BlazorSize.BlazorRepl.csproj
│ ├── BlazorReplMediaQueryService.cs
│ └── LICENSE.txt
├── BlazorPro.BlazorSize.Bunit/
│ ├── BlazorPro.BlazorSize.Bunit.csproj
│ ├── BunitExtensions.cs
│ └── FakeMediaQueryService.cs
├── BlazorSize/
│ ├── BlazorPro.BlazorSize.csproj
│ ├── Configuration/
│ │ ├── ResizeOptions.cs
│ │ └── ServiceCollectionExtensions.cs
│ ├── LICENSE.txt
│ ├── MediaQuery/
│ │ ├── Breakpoints.cs
│ │ ├── IMediaQueryService.cs
│ │ ├── MediaQuery.razor
│ │ ├── MediaQuery.razor.cs
│ │ ├── MediaQueryArgs.cs
│ │ ├── MediaQueryCache.cs
│ │ ├── MediaQueryList.razor
│ │ ├── MediaQueryList.razor.cs
│ │ └── MediaQueryService.cs
│ ├── Resize/
│ │ ├── BrowserWindowSize.cs
│ │ ├── IResizeListener.cs
│ │ └── ResizeListener.cs
│ ├── _Imports.razor
│ ├── jest.config.js
│ ├── package.json
│ ├── readme.md
│ ├── scripts/
│ │ ├── blazorSizeMedia.ts
│ │ ├── blazorSizeMediaModule.ts
│ │ ├── blazorSizeResize.ts
│ │ ├── blazorSizeResizeModule.ts
│ │ └── tests/
│ │ └── blazorSize.test.ts
│ ├── tsconfig.build.json
│ └── tsconfig.json
├── BlazorSize.UnitTesting/
│ ├── BlazorPro.BlazorSize.UnitTesting.csproj
│ ├── Bunit/
│ │ ├── BunitExtensions.cs
│ │ └── FakeMediaQueryService.cs
│ └── LICENSE.txt
├── BlazorSize.e2eTests/
│ ├── BlazorSize Adaptive Table and Template.imgstore
│ ├── BlazorSize Adaptive Table and Template.resx
│ ├── BlazorSize Adaptive Table and Template.tstest
│ ├── BlazorSize Adaptive Table and Template.tstest.cs
│ ├── BlazorSize Construct & Dispose.imgstore
│ ├── BlazorSize Construct & Dispose.resx
│ ├── BlazorSize Construct & Dispose.tstest
│ ├── BlazorSize Size Reverse.imgstore
│ ├── BlazorSize Size Reverse.resx
│ ├── BlazorSize Size Reverse.tstest
│ ├── BlazorSize Size Reverse.tstest.cs
│ ├── BlazorSize Size Tests.imgstore
│ ├── BlazorSize Size Tests.resx
│ ├── BlazorSize Size Tests.tstest
│ ├── BlazorSize Size Tests.tstest.cs
│ ├── BlazorSize Test Multicast Reverse.imgstore
│ ├── BlazorSize Test Multicast Reverse.resx
│ ├── BlazorSize Test Multicast Reverse.tstest
│ ├── BlazorSize Test Multicast Reverse.tstest.cs
│ ├── BlazorSize Test Multicast.imgstore
│ ├── BlazorSize Test Multicast.resx
│ ├── BlazorSize Test Multicast.tstest
│ ├── BlazorSize Test Multicast.tstest.cs
│ ├── BlazorSize.e2eTests.csproj
│ ├── Profiler Configurations/
│ │ ├── {1c6f74bd-1a14-4014-a8c9-02fdb3cb8302}.tsprofconfig
│ │ └── {d3bce0f5-b6f6-45aa-959a-5c1c1753902b}.tsprofconfig
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Settings.aiis
│ └── TestLists/
│ └── BlazorSize .NET Web App.aiilist
├── BlazorSize.sln
├── BlazorWebApp/
│ ├── BlazorWebApp/
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components/
│ │ │ ├── App.razor
│ │ │ ├── Pages/
│ │ │ │ └── Error.razor
│ │ │ └── _Imports.razor
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot/
│ │ └── app.css
│ └── BlazorWebApp.Client/
│ ├── BlazorWebApp.Client.csproj
│ ├── Layout/
│ │ ├── MainLayout.razor
│ │ ├── MainLayout.razor.css
│ │ ├── NavMenu.razor
│ │ └── NavMenu.razor.css
│ ├── Program.cs
│ ├── Routes.razor
│ ├── _Imports.razor
│ └── wwwroot/
│ ├── appsettings.Development.json
│ └── appsettings.json
├── PlaywrightTests/
│ ├── MediaQueryTests.cs
│ ├── PlaywrightTests.csproj
│ ├── ResizeTests.cs
│ └── TestHelpers.cs
├── TestComponents/
│ ├── Data/
│ │ └── IWeatherForecastService.cs
│ ├── Pages/
│ │ ├── Blank.razor
│ │ ├── Error.razor
│ │ ├── FetchData.razor
│ │ ├── Index.razor
│ │ ├── Multicast.razor
│ │ ├── NullableFlag.razor
│ │ ├── ScreenSize.razor
│ │ ├── ScreenSizeReporter.razor
│ │ └── Templates.razor
│ ├── TestComponents.csproj
│ ├── WeatherCards.razor
│ ├── WeatherForecast.cs
│ ├── WeatherGrid.razor
│ ├── _Imports.razor
│ └── wwwroot/
│ ├── fixture.html
│ └── fixture.js
├── bUnitCompatibilityTests/
│ ├── CompTest.cs
│ ├── Sample.razor
│ ├── _Imports.razor
│ └── bUnitCompatibilityTests.csproj
├── package.json
└── readme.md
SYMBOL INDEX (137 symbols across 34 files)
FILE: BlazorPro.BlazorSize.BlazorRepl/BlazorReplMediaQueryService.cs
class BlazorReplMediaQueryService (line 11) | public class BlazorReplMediaQueryService : IAsyncDisposable, IMediaQuery...
method BlazorReplMediaQueryService (line 15) | public BlazorReplMediaQueryService(IJSRuntime jsRuntime)
method GetMediaQueryFromCache (line 26) | private MediaQueryCache? GetMediaQueryFromCache(string byMedia) => med...
method AddQuery (line 28) | public void AddQuery(MediaQuery newMediaQuery)
method RemoveQuery (line 42) | public async Task RemoveQuery(MediaQuery mediaQuery)
method Initialize (line 64) | public async Task Initialize(MediaQuery mediaQuery)
method CreateMediaQueryList (line 100) | public async Task CreateMediaQueryList(DotNetObjectReference<MediaQuer...
method DisposeAsync (line 107) | public async ValueTask DisposeAsync()
FILE: BlazorPro.BlazorSize.Bunit/BunitExtensions.cs
class BunitExtensions (line 6) | public static class BunitExtensions
method AddBlazorSize (line 8) | public static FakeMediaQueryService AddBlazorSize(this TestContextBase...
FILE: BlazorPro.BlazorSize.Bunit/FakeMediaQueryService.cs
class FakeMediaQueryService (line 9) | public class FakeMediaQueryService : IMediaQueryService
method FakeMediaQueryService (line 16) | public FakeMediaQueryService(TestContextBase contextBase)
method AddQuery (line 21) | public void AddQuery(MediaQuery newMediaQuery)
method CreateMediaQueryList (line 39) | public Task CreateMediaQueryList(DotNetObjectReference<MediaQueryList>...
method Initialize (line 42) | public Task Initialize(MediaQuery mediaQuery)
method RemoveQuery (line 45) | public Task RemoveQuery(MediaQuery mediaQuery)
method SetActiveBreakPoint (line 59) | public void SetActiveBreakPoint(string breakpoint)
method SetActiveMediaQuery (line 66) | public void SetActiveMediaQuery(MediaQueryArgs args)
method GetMediaQueryFromCache (line 89) | private MediaQueryCache GetMediaQueryFromCache(string byMedia)
FILE: BlazorSize.UnitTesting/Bunit/BunitExtensions.cs
class BunitExtensions (line 6) | public static class BunitExtensions
method AddBlazorSize (line 8) | public static FakeMediaQueryService AddBlazorSize(this TestContextBase...
FILE: BlazorSize.UnitTesting/Bunit/FakeMediaQueryService.cs
class FakeMediaQueryService (line 6) | public class FakeMediaQueryService : IMediaQueryService
method FakeMediaQueryService (line 13) | public FakeMediaQueryService(TestContextBase contextBase)
method AddQuery (line 18) | public void AddQuery(MediaQuery newMediaQuery)
method CreateMediaQueryList (line 36) | public Task CreateMediaQueryList(DotNetObjectReference<MediaQueryList>...
method Initialize (line 39) | public Task Initialize(MediaQuery mediaQuery)
method RemoveQuery (line 42) | public Task RemoveQuery(MediaQuery mediaQuery)
method SetActiveBreakPoint (line 56) | public void SetActiveBreakPoint(string breakpoint)
method SetActiveMediaQuery (line 63) | public void SetActiveMediaQuery(MediaQueryArgs args)
method GetMediaQueryFromCache (line 85) | private MediaQueryCache? GetMediaQueryFromCache(string byMedia)
FILE: BlazorSize.e2eTests/BlazorSize Adaptive Table and Template.tstest.cs
class BlazorSize_Adaptive_Table_and_Template (line 25) | public class BlazorSize_Adaptive_Table_and_Template : BaseWebAiiTest
method OpenWin (line 52) | [CodedStep(@"Open Desktop")]
method Resize_Mobile (line 59) | [CodedStep(@"Resize browser to small")]
FILE: BlazorSize.e2eTests/BlazorSize Size Reverse.tstest.cs
class CanIResizeReverse (line 25) | public class CanIResizeReverse : BaseWebAiiTest
method OpenWin_Mobile (line 52) | [CodedStep(@"Open Desktop")]
method Resize_Tablet (line 58) | [CodedStep(@"Resize browser to tablet")]
method Resize_Desktop (line 64) | [CodedStep(@"Resize browser to small")]
FILE: BlazorSize.e2eTests/BlazorSize Size Tests.tstest.cs
class CanIResize (line 25) | public class CanIResize : BaseWebAiiTest
method OpenWin (line 52) | [CodedStep(@"Open Desktop")]
method Resize_Tablet (line 58) | [CodedStep(@"Resize browser to tablet")]
method Resize_Mobile (line 64) | [CodedStep(@"Resize browser to small")]
FILE: BlazorSize.e2eTests/BlazorSize Test Multicast Reverse.tstest.cs
class BlazorSize_Test_Consolidation_Reverse (line 25) | public class BlazorSize_Test_Consolidation_Reverse : BaseWebAiiTest
method OpenWin_Mobile (line 52) | [CodedStep(@"Open Desktop")]
method Resize_Tablet (line 59) | [CodedStep(@"Resize browser to tablet")]
method Resize_Desktop (line 66) | [CodedStep(@"Resize browser to small")]
FILE: BlazorSize.e2eTests/BlazorSize Test Multicast.tstest.cs
class BlazorSize_Test_Consolidation (line 25) | public class BlazorSize_Test_Consolidation : BaseWebAiiTest
method OpenWin (line 52) | [CodedStep(@"Open Desktop")]
method Resize_Tablet (line 59) | [CodedStep(@"Resize browser to tablet")]
method Resize_Mobile (line 66) | [CodedStep(@"Resize browser to small")]
FILE: BlazorSize/Configuration/ResizeOptions.cs
class ResizeOptions (line 3) | public class ResizeOptions
FILE: BlazorSize/Configuration/ServiceCollectionExtensions.cs
class ServiceCollectionExtensions (line 6) | public static class ServiceCollectionExtensions
method AddResizeListener (line 13) | public static IServiceCollection AddResizeListener(this IServiceCollec...
method AddMediaQueryService (line 28) | public static IServiceCollection AddMediaQueryService(this IServiceCol...
FILE: BlazorSize/MediaQuery/Breakpoints.cs
class Breakpoints (line 3) | public static class Breakpoints
method Between (line 57) | public static string Between(string max, string min) => $"{max} and {m...
FILE: BlazorSize/MediaQuery/IMediaQueryService.cs
type IMediaQueryService (line 7) | public interface IMediaQueryService
method AddQuery (line 11) | void AddQuery(MediaQuery newMediaQuery);
method CreateMediaQueryList (line 12) | Task CreateMediaQueryList(DotNetObjectReference<MediaQueryList> dotNet...
method Initialize (line 14) | Task Initialize(MediaQuery mediaQuery);
method RemoveQuery (line 15) | Task RemoveQuery(MediaQuery mediaQuery);
FILE: BlazorSize/MediaQuery/MediaQuery.razor.cs
class MediaQuery (line 8) | public partial class MediaQuery : IAsyncDisposable
method OnInitialized (line 50) | protected override void OnInitialized()
method OnAfterRenderAsync (line 62) | protected override async Task OnAfterRenderAsync(bool firstRender)
method MediaQueryChanged (line 75) | public void MediaQueryChanged(MediaQueryArgs args)
method DisposeAsync (line 85) | public async ValueTask DisposeAsync()
FILE: BlazorSize/MediaQuery/MediaQueryArgs.cs
class MediaQueryArgs (line 3) | public class MediaQueryArgs
FILE: BlazorSize/MediaQuery/MediaQueryCache.cs
class MediaQueryCache (line 4) | public class MediaQueryCache
FILE: BlazorSize/MediaQuery/MediaQueryList.razor.cs
class MediaQueryList (line 10) | public partial class MediaQueryList
method OnAfterRenderAsync (line 20) | protected override async Task OnAfterRenderAsync(bool firstRender)
method AddQuery (line 30) | public void AddQuery(MediaQuery newMediaQuery) => MqService.AddQuery(n...
method RemoveQuery (line 31) | public async Task RemoveQuery(MediaQuery mediaQuery) => await MqServic...
method Initialize (line 32) | public async Task Initialize(MediaQuery mediaQuery) => await MqService...
method MediaQueryChanged (line 37) | [JSInvokable(nameof(MediaQueryList.MediaQueryChanged))]
FILE: BlazorSize/MediaQuery/MediaQueryService.cs
class MediaQueryService (line 9) | public class MediaQueryService : IAsyncDisposable, IMediaQueryService
method MediaQueryService (line 13) | public MediaQueryService(IJSRuntime jsRuntime)
method GetMediaQueryFromCache (line 24) | private MediaQueryCache? GetMediaQueryFromCache(string byMedia) => med...
method AddQuery (line 26) | public void AddQuery(MediaQuery newMediaQuery)
method RemoveQuery (line 40) | public async Task RemoveQuery(MediaQuery mediaQuery)
method Initialize (line 63) | public async Task Initialize(MediaQuery mediaQuery)
method CreateMediaQueryList (line 99) | public async Task CreateMediaQueryList(DotNetObjectReference<MediaQuer...
method DisposeAsync (line 106) | public async ValueTask DisposeAsync()
FILE: BlazorSize/Resize/BrowserWindowSize.cs
class BrowserWindowSize (line 5) | public class BrowserWindowSize : EventArgs
FILE: BlazorSize/Resize/IResizeListener.cs
type IResizeListener (line 6) | public interface IResizeListener
method GetBrowserWindowSize (line 10) | ValueTask<BrowserWindowSize> GetBrowserWindowSize();
method MatchMedia (line 11) | ValueTask<bool> MatchMedia(string mediaQuery);
FILE: BlazorSize/Resize/ResizeListener.cs
class ResizeListener (line 8) | public class ResizeListener : IResizeListener, IAsyncDisposable
method ResizeListener (line 15) | public ResizeListener(IJSRuntime jsRuntime, IOptions<ResizeOptions>? o...
method Unsubscribe (line 33) | private void Unsubscribe(EventHandler<BrowserWindowSize>? value)
method Subscribe (line 42) | private void Subscribe(EventHandler<BrowserWindowSize>? value)
method Start (line 51) | private async ValueTask Start()
method Cancel (line 57) | private async ValueTask Cancel()
method MatchMedia (line 68) | public async ValueTask<bool> MatchMedia(string mediaQuery)
method GetBrowserWindowSize (line 78) | public async ValueTask<BrowserWindowSize> GetBrowserWindowSize()
method RaiseOnResized (line 88) | [JSInvokable]
method Dispose (line 92) | protected virtual void Dispose(bool disposing)
method DisposeAsync (line 104) | public async ValueTask DisposeAsync()
FILE: BlazorSize/scripts/blazorSizeMedia.ts
class MediaQueryListItem (line 1) | class MediaQueryListItem {
method constructor (line 2) | constructor(id: number | string) {
type MediaQueryArgs (line 12) | interface MediaQueryArgs {
class BlazorSizeMedia (line 17) | class BlazorSizeMedia {
method getMediaQueryArgs (line 29) | getMediaQueryArgs(mediaQuery: string) {
method addMediaQueryToList (line 34) | addMediaQueryToList(dotnetMql: any, mediaQuery: string) {
method callbackReference (line 43) | callbackReference(dotnet: any) {
method addMediaQueryList (line 50) | addMediaQueryList(dotnet: any) {
method removeMediaQuery (line 56) | removeMediaQuery(dotnetMql: any, mediaQuery: string) {
method removeMediaQueryList (line 64) | removeMediaQueryList(dotnetMql: any) {
FILE: BlazorSize/scripts/blazorSizeMediaModule.ts
function addMediaQueryList (line 9) | function addMediaQueryList(dotnet: any) {
function removeMediaQueryList (line 14) | function removeMediaQueryList(dotnetMql: any) {
function addMediaQueryToList (line 19) | function addMediaQueryToList(dotnetMql: any, mediaQuery: string) {
function removeMediaQuery (line 24) | function removeMediaQuery(dotnetMql: any, mediaQuery: string) {
function getMediaQueryArgs (line 29) | function getMediaQueryArgs(mediaQuery: string) {
FILE: BlazorSize/scripts/blazorSizeResize.ts
class ResizeOptions (line 1) | class ResizeOptions {
class ResizeListener (line 7) | class ResizeListener {
method listenForResize (line 23) | public listenForResize(dotnetRef: any, options: ResizeOptions) {
method cancelListener (line 41) | public cancelListener() {
method matchMedia (line 45) | public matchMedia(query: string) {
method getBrowserWindowSize (line 51) | public getBrowserWindowSize() {
FILE: BlazorSize/scripts/blazorSizeResizeModule.ts
function listenForResize (line 5) | function listenForResize(dotnetRef: any, options: ResizeOptions) {
function cancelListener (line 9) | function cancelListener() {
function matchMedia (line 13) | function matchMedia(query: string) {
function getBrowserWindowSize (line 17) | function getBrowserWindowSize() {
FILE: BlazorSize/scripts/tests/blazorSize.test.ts
method invokeMethodAsync (line 20) | invokeMethodAsync(method: string, callback: any) { }
FILE: PlaywrightTests/MediaQueryTests.cs
class MediaQueryTests (line 5) | [Parallelizable(ParallelScope.Self)]
method MyNewPlaywrightTest (line 9) | [Test]
FILE: PlaywrightTests/ResizeTests.cs
class Tests (line 5) | [Parallelizable(ParallelScope.Self)]
method IndexPageLoadsWithBlazorSizeAndDisplaysInitialPageSizeOf1920By1080 (line 9) | [Test]
FILE: PlaywrightTests/TestHelpers.cs
class TestHelpers (line 9) | internal static class TestHelpers
method GetUrl (line 12) | public static string GetUrl(string route) => string.Format(SUTUrlTempl...
FILE: TestComponents/Data/IWeatherForecastService.cs
type IWeatherForecastService (line 7) | public interface IWeatherForecastService
method GetForecastAsync (line 9) | Task<WeatherForecast[]> GetForecastAsync(DateTime startDate);
class WeatherForecastService (line 12) | public class WeatherForecastService : IWeatherForecastService
method GetForecastAsync (line 19) | public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
FILE: TestComponents/WeatherForecast.cs
class WeatherForecast (line 5) | public class WeatherForecast
FILE: TestComponents/wwwroot/fixture.js
function openWin (line 3) | function openWin(page, w, h) {
function resizeWin (line 7) | function resizeWin(w, h) {
FILE: bUnitCompatibilityTests/CompTest.cs
class CompTest (line 7) | public class CompTest
method Shows_Correct_Content_Based_On_MediaQuery (line 9) | [Fact]
Condensed preview — 115 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,689K chars).
[
{
"path": ".gitattributes",
"chars": 2518,
"preview": "###############################################################################\n# Set default behavior to automatically "
},
{
"path": ".gitignore",
"chars": 5999,
"preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
},
{
"path": "BlazorPro.BlazorSize.BlazorRepl/BlazorPro.BlazorSize.BlazorRepl.csproj",
"chars": 1451,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <Version>6.1.0</Version>\n <TargetFramework>net9.0</TargetFr"
},
{
"path": "BlazorPro.BlazorSize.BlazorRepl/BlazorReplMediaQueryService.cs",
"chars": 4596,
"preview": "namespace BlazorPro.BlazorSize\n{\n using System;\n using System.Collections.Generic;\n using System.Linq;\n usi"
},
{
"path": "BlazorPro.BlazorSize.BlazorRepl/LICENSE.txt",
"chars": 549,
"preview": "Copyright 2022 Ed Charbeneau\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file"
},
{
"path": "BlazorPro.BlazorSize.Bunit/BlazorPro.BlazorSize.Bunit.csproj",
"chars": 328,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>net5.0</TargetFramework>\n </PropertyGroup>\n\n "
},
{
"path": "BlazorPro.BlazorSize.Bunit/BunitExtensions.cs",
"chars": 559,
"preview": "using BlazorPro.BlazorSize;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace Bunit\n{\n public static class "
},
{
"path": "BlazorPro.BlazorSize.Bunit/FakeMediaQueryService.cs",
"chars": 2885,
"preview": "using System.Collections.Generic;\nusing System.Threading.Tasks;\nusing BlazorPro.BlazorSize;\nusing Bunit;\nusing Microsof"
},
{
"path": "BlazorSize/BlazorPro.BlazorSize.csproj",
"chars": 3965,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Razor\">\n\n <PropertyGroup>\n <TargetFrameworks>net9.0</TargetFrameworks>\n <Generat"
},
{
"path": "BlazorSize/Configuration/ResizeOptions.cs",
"chars": 725,
"preview": "namespace BlazorPro.BlazorSize\n{\n public class ResizeOptions\n {\n /// <summary>\n /// Rate in millise"
},
{
"path": "BlazorSize/Configuration/ServiceCollectionExtensions.cs",
"chars": 1217,
"preview": "using Microsoft.Extensions.DependencyInjection;\nusing System;\n\nnamespace BlazorPro.BlazorSize\n{\n public static class"
},
{
"path": "BlazorSize/LICENSE.txt",
"chars": 549,
"preview": "Copyright 2019 Ed Charbeneau\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file"
},
{
"path": "BlazorSize/MediaQuery/Breakpoints.cs",
"chars": 2403,
"preview": "namespace BlazorPro.BlazorSize\n{\n public static class Breakpoints\n {\n /// @media(min-width: 576px) { ... }"
},
{
"path": "BlazorSize/MediaQuery/IMediaQueryService.cs",
"chars": 476,
"preview": "using Microsoft.JSInterop;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace BlazorPro.BlazorS"
},
{
"path": "BlazorSize/MediaQuery/MediaQuery.razor",
"chars": 101,
"preview": "@namespace BlazorPro.BlazorSize\n@if (InternalMedia.Matches)\n{\n @Matched\n}\nelse\n{\n @Unmatched\n}"
},
{
"path": "BlazorSize/MediaQuery/MediaQuery.razor.cs",
"chars": 3447,
"preview": "using Microsoft.AspNetCore.Components;\nusing Microsoft.JSInterop;\nusing System;\nusing System.Threading.Tasks;\n\nnamespac"
},
{
"path": "BlazorSize/MediaQuery/MediaQueryArgs.cs",
"chars": 165,
"preview": "namespace BlazorPro.BlazorSize\n{\n public class MediaQueryArgs\n {\n public string? Media { get; set; }\n "
},
{
"path": "BlazorSize/MediaQuery/MediaQueryCache.cs",
"chars": 999,
"preview": "using System.Collections.Generic;\nnamespace BlazorPro.BlazorSize\n{\n public class MediaQueryCache\n {\n /// <"
},
{
"path": "BlazorSize/MediaQuery/MediaQueryList.razor",
"chars": 98,
"preview": "@namespace BlazorPro.BlazorSize\n<CascadingValue Value=\"this\">\n @ChildContent\n</CascadingValue>"
},
{
"path": "BlazorSize/MediaQuery/MediaQueryList.razor.cs",
"chars": 2006,
"preview": "using Microsoft.AspNetCore.Components;\nusing Microsoft.JSInterop;\nusing System;\nusing System.Collections.Generic;\nusing"
},
{
"path": "BlazorSize/MediaQuery/MediaQueryService.cs",
"chars": 4947,
"preview": "using Microsoft.JSInterop;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Ta"
},
{
"path": "BlazorSize/Resize/BrowserWindowSize.cs",
"chars": 189,
"preview": "using System;\n\nnamespace BlazorPro.BlazorSize\n{\n public class BrowserWindowSize : EventArgs\n {\n public int"
},
{
"path": "BlazorSize/Resize/IResizeListener.cs",
"chars": 303,
"preview": "using System;\nusing System.Threading.Tasks;\n\nnamespace BlazorPro.BlazorSize\n{\n public interface IResizeListener\n "
},
{
"path": "BlazorSize/Resize/ResizeListener.cs",
"chars": 3940,
"preview": "using Microsoft.Extensions.Options;\nusing Microsoft.JSInterop;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace B"
},
{
"path": "BlazorSize/_Imports.razor",
"chars": 44,
"preview": "@using Microsoft.AspNetCore.Components.Web\n"
},
{
"path": "BlazorSize/jest.config.js",
"chars": 118,
"preview": "module.exports = {\n preset: 'ts-jest',\n testPathIgnorePatterns: [\".d.ts\", \".js\"],\n testEnvironment: 'jsdom',\n};"
},
{
"path": "BlazorSize/package.json",
"chars": 683,
"preview": "{\n \"name\": \"blazorsize\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"private\": true,\n \"scripts\": {\n \"test\": \"tsc "
},
{
"path": "BlazorSize/readme.md",
"chars": 1490,
"preview": "BlazorSize is a JavaScript interop library for Blazor that is used to detect the Browser's current size, change in size,"
},
{
"path": "BlazorSize/scripts/blazorSizeMedia.ts",
"chars": 2910,
"preview": "class MediaQueryListItem {\n constructor(id: number | string) {\n this.id = id;\n this.dotnetCallback = ("
},
{
"path": "BlazorSize/scripts/blazorSizeMediaModule.ts",
"chars": 1063,
"preview": "import { BlazorSizeMedia } from './blazorSizeMedia.js';\n\nlet instance = new BlazorSizeMedia();\n\n// Uncomment to enable "
},
{
"path": "BlazorSize/scripts/blazorSizeResize.ts",
"chars": 1769,
"preview": "export class ResizeOptions {\n reportRate: number = 300;\n enableLogging: boolean = false;\n suppressInitEvent: b"
},
{
"path": "BlazorSize/scripts/blazorSizeResizeModule.ts",
"chars": 479,
"preview": "import { ResizeListener, ResizeOptions } from './blazorSizeResize.js';\n\nlet instance = new ResizeListener();\n\nexport fu"
},
{
"path": "BlazorSize/scripts/tests/blazorSize.test.ts",
"chars": 2244,
"preview": "import { BlazorSizeMedia } from '../blazorSizeMedia';\nimport MatchMediaMock from 'jest-matchmedia-mock';\nimport MatchMe"
},
{
"path": "BlazorSize/tsconfig.build.json",
"chars": 330,
"preview": "{\n \"compilerOptions\": {\n \"outDir\": \"./wwwroot\",\n //\"noImplicitAny\": false,\n //\"noEmitOnError\": true,\n //\"re"
},
{
"path": "BlazorSize/tsconfig.json",
"chars": 5861,
"preview": "{\n \"compilerOptions\": {\n \"outDir\": \"./scripts/tests\",\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n /* "
},
{
"path": "BlazorSize.UnitTesting/BlazorPro.BlazorSize.UnitTesting.csproj",
"chars": 1466,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>net9.0</TargetFramework>\n <ImplicitUsings>"
},
{
"path": "BlazorSize.UnitTesting/Bunit/BunitExtensions.cs",
"chars": 559,
"preview": "using BlazorPro.BlazorSize;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace Bunit\n{\n public static class "
},
{
"path": "BlazorSize.UnitTesting/Bunit/FakeMediaQueryService.cs",
"chars": 2799,
"preview": "using BlazorPro.BlazorSize;\nusing Microsoft.JSInterop;\n\nnamespace Bunit\n{\n public class FakeMediaQueryService : IMed"
},
{
"path": "BlazorSize.UnitTesting/LICENSE.txt",
"chars": 549,
"preview": "Copyright 2019 Ed Charbeneau\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file"
},
{
"path": "BlazorSize.e2eTests/BlazorSize Adaptive Table and Template.resx",
"chars": 911386,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "BlazorSize.e2eTests/BlazorSize Adaptive Table and Template.tstest",
"chars": 57870,
"preview": "{\n \"__type\": \"ArtOfTest.WebAii.Design.ProjectModel.Test\",\n \"__value\": {\n \"DomStatesCounter\": {},\n \"AppStartSkip\""
},
{
"path": "BlazorSize.e2eTests/BlazorSize Adaptive Table and Template.tstest.cs",
"chars": 1821,
"preview": "using Telerik.TestStudio.Translators.Common;\nusing Telerik.TestingFramework.Controls.TelerikUI.Blazor;\nusing Telerik.Tes"
},
{
"path": "BlazorSize.e2eTests/BlazorSize Construct & Dispose.resx",
"chars": 152353,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "BlazorSize.e2eTests/BlazorSize Construct & Dispose.tstest",
"chars": 27185,
"preview": "{\n \"__type\": \"ArtOfTest.WebAii.Design.ProjectModel.Test\",\n \"__value\": {\n \"DomStatesCounter\": {},\n \"AppStartSkip\""
},
{
"path": "BlazorSize.e2eTests/BlazorSize Size Reverse.resx",
"chars": 757468,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "BlazorSize.e2eTests/BlazorSize Size Reverse.tstest",
"chars": 70692,
"preview": "{\n \"__type\": \"ArtOfTest.WebAii.Design.ProjectModel.Test\",\n \"__value\": {\n \"DomStatesCounter\": {},\n \"AppStartSkip\""
},
{
"path": "BlazorSize.e2eTests/BlazorSize Size Reverse.tstest.cs",
"chars": 1945,
"preview": "using Telerik.TestStudio.Translators.Common;\nusing Telerik.TestingFramework.Controls.TelerikUI.Blazor;\nusing Telerik.Tes"
},
{
"path": "BlazorSize.e2eTests/BlazorSize Size Tests.resx",
"chars": 757732,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "BlazorSize.e2eTests/BlazorSize Size Tests.tstest",
"chars": 73610,
"preview": "{\n \"__type\": \"ArtOfTest.WebAii.Design.ProjectModel.Test\",\n \"__value\": {\n \"DomStatesCounter\": {},\n \"AppStartSkip\""
},
{
"path": "BlazorSize.e2eTests/BlazorSize Size Tests.tstest.cs",
"chars": 1930,
"preview": "using Telerik.TestStudio.Translators.Common;\nusing Telerik.TestingFramework.Controls.TelerikUI.Blazor;\nusing Telerik.Tes"
},
{
"path": "BlazorSize.e2eTests/BlazorSize Test Multicast Reverse.resx",
"chars": 755006,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "BlazorSize.e2eTests/BlazorSize Test Multicast Reverse.tstest",
"chars": 72275,
"preview": "{\n \"__type\": \"ArtOfTest.WebAii.Design.ProjectModel.Test\",\n \"__value\": {\n \"DomStatesCounter\": {},\n \"AppStartSkip\""
},
{
"path": "BlazorSize.e2eTests/BlazorSize Test Multicast Reverse.tstest.cs",
"chars": 2037,
"preview": "using Telerik.TestStudio.Translators.Common;\nusing Telerik.TestingFramework.Controls.TelerikUI.Blazor;\nusing Telerik.Tes"
},
{
"path": "BlazorSize.e2eTests/BlazorSize Test Multicast.resx",
"chars": 754998,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "BlazorSize.e2eTests/BlazorSize Test Multicast.tstest",
"chars": 72233,
"preview": "{\n \"__type\": \"ArtOfTest.WebAii.Design.ProjectModel.Test\",\n \"__value\": {\n \"DomStatesCounter\": {},\n \"AppStartSkip\""
},
{
"path": "BlazorSize.e2eTests/BlazorSize Test Multicast.tstest.cs",
"chars": 2021,
"preview": "using Telerik.TestStudio.Translators.Common;\nusing Telerik.TestingFramework.Controls.TelerikUI.Blazor;\nusing Telerik.Tes"
},
{
"path": "BlazorSize.e2eTests/BlazorSize.e2eTests.csproj",
"chars": 4810,
"preview": "<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n <Prop"
},
{
"path": "BlazorSize.e2eTests/Profiler Configurations/{1c6f74bd-1a14-4014-a8c9-02fdb3cb8302}.tsprofconfig",
"chars": 918,
"preview": "{\n \"__type\": \"ArtOfTest.WebAii.Design.Execution.Profiler.ProfilerMetadataConfigurationSet\",\n \"__value\": {\n \"_bFirst"
},
{
"path": "BlazorSize.e2eTests/Profiler Configurations/{d3bce0f5-b6f6-45aa-959a-5c1c1753902b}.tsprofconfig",
"chars": 918,
"preview": "{\n \"__type\": \"ArtOfTest.WebAii.Design.Execution.Profiler.ProfilerMetadataConfigurationSet\",\n \"__value\": {\n \"_bFirst"
},
{
"path": "BlazorSize.e2eTests/Properties/AssemblyInfo.cs",
"chars": 1371,
"preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
},
{
"path": "BlazorSize.e2eTests/Settings.aiis",
"chars": 10140,
"preview": "{\n \"__type\": \"ArtOfTest.WebAii.Design.UserSettings\",\n \"__value\": {\n \"UseHttpProxy\": false,\n \"RecordjQueryInDescr"
},
{
"path": "BlazorSize.e2eTests/TestLists/BlazorSize .NET Web App.aiilist",
"chars": 3788,
"preview": "{\n \"__type\": \"ArtOfTest.WebAii.Design.Execution.TestList\",\n \"__value\": {\n \"TestListId\": \"f9449235-bf5e-4504-8109-14"
},
{
"path": "BlazorSize.sln",
"chars": 5746,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.3152"
},
{
"path": "BlazorWebApp/BlazorWebApp/BlazorWebApp.csproj",
"chars": 427,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n <PropertyGroup>\n <TargetFramework>net9.0</TargetFramework>\n <Nullable>ena"
},
{
"path": "BlazorWebApp/BlazorWebApp/Components/App.razor",
"chars": 581,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-w"
},
{
"path": "BlazorWebApp/BlazorWebApp/Components/Pages/Error.razor",
"chars": 1177,
"preview": "@page \"/Error\"\n@using System.Diagnostics\n\n<PageTitle>Error</PageTitle>\n\n<h1 class=\"text-danger\">Error.</h1>\n<h2 class=\""
},
{
"path": "BlazorWebApp/BlazorWebApp/Components/_Imports.razor",
"chars": 411,
"preview": "@using System.Net.Http\n@using System.Net.Http.Json\n@using Microsoft.AspNetCore.Components.Forms\n@using Microsoft.AspNet"
},
{
"path": "BlazorWebApp/BlazorWebApp/Program.cs",
"chars": 1171,
"preview": "using BlazorWebApp.Client;\nusing BlazorWebApp.Components;\nusing BlazorPro.BlazorSize;\nusing TestComponents;\n\nvar builder"
},
{
"path": "BlazorWebApp/BlazorWebApp/Properties/launchSettings.json",
"chars": 1423,
"preview": "{\n \"$schema\": \"http://json.schemastore.org/launchsettings.json\",\n \"iisSettings\": {\n \"windowsAuthentication\": fa"
},
{
"path": "BlazorWebApp/BlazorWebApp/appsettings.Development.json",
"chars": 119,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft.AspNetCore\": \"Warning\"\n }\n }\n}\n"
},
{
"path": "BlazorWebApp/BlazorWebApp/appsettings.json",
"chars": 142,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft.AspNetCore\": \"Warning\"\n }\n },\n "
},
{
"path": "BlazorWebApp/BlazorWebApp/wwwroot/app.css",
"chars": 2540,
"preview": "html, body {\n font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n}\n\na, .btn-link {\n color: #006bb7;\n}\n\n."
},
{
"path": "BlazorWebApp/BlazorWebApp.Client/BlazorWebApp.Client.csproj",
"chars": 734,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.BlazorWebAssembly\">\n\n <PropertyGroup>\n <TargetFramework>net9.0</TargetFramework>\n "
},
{
"path": "BlazorWebApp/BlazorWebApp.Client/Layout/MainLayout.razor",
"chars": 497,
"preview": "@inherits LayoutComponentBase\n\n<div class=\"page\">\n <div class=\"sidebar\">\n <NavMenu />\n </div>\n\n <main>\n"
},
{
"path": "BlazorWebApp/BlazorWebApp.Client/Layout/MainLayout.razor.css",
"chars": 1784,
"preview": ".page {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\nmain {\n flex: 1;\n}\n\n.sidebar {\n "
},
{
"path": "BlazorWebApp/BlazorWebApp.Client/Layout/NavMenu.razor",
"chars": 1659,
"preview": "<div class=\"top-row ps-3 navbar navbar-dark\">\n <div class=\"container-fluid\">\n <a class=\"navbar-brand\" href=\"\""
},
{
"path": "BlazorWebApp/BlazorWebApp.Client/Layout/NavMenu.razor.css",
"chars": 3309,
"preview": ".navbar-toggler {\n appearance: none;\n cursor: pointer;\n width: 3.5rem;\n height: 2.5rem;\n color: white;\n "
},
{
"path": "BlazorWebApp/BlazorWebApp.Client/Program.cs",
"chars": 360,
"preview": "using Microsoft.AspNetCore.Components.WebAssembly.Hosting;\nusing BlazorPro.BlazorSize;\nusing TestComponents;\n\nvar builde"
},
{
"path": "BlazorWebApp/BlazorWebApp.Client/Routes.razor",
"chars": 389,
"preview": "<MediaQueryList>\n <Router AppAssembly=\"typeof(Program).Assembly\" AdditionalAssemblies=\"new[] { typeof(TestComponents"
},
{
"path": "BlazorWebApp/BlazorWebApp.Client/_Imports.razor",
"chars": 387,
"preview": "@using System.Net.Http\n@using System.Net.Http.Json\n@using Microsoft.AspNetCore.Components.Forms\n@using Microsoft.AspNet"
},
{
"path": "BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.Development.json",
"chars": 119,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft.AspNetCore\": \"Warning\"\n }\n }\n}\n"
},
{
"path": "BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.json",
"chars": 119,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft.AspNetCore\": \"Warning\"\n }\n }\n}\n"
},
{
"path": "PlaywrightTests/MediaQueryTests.cs",
"chars": 834,
"preview": "using Microsoft.Playwright;\n\nnamespace PlaywrightTests;\n\n[Parallelizable(ParallelScope.Self)]\n[TestFixture]\npublic clas"
},
{
"path": "PlaywrightTests/PlaywrightTests.csproj",
"chars": 1116,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>net9.0</TargetFramework>\n <LangVersion>lat"
},
{
"path": "PlaywrightTests/ResizeTests.cs",
"chars": 1294,
"preview": "using Microsoft.Playwright;\n\nnamespace PlaywrightTests;\n\n[Parallelizable(ParallelScope.Self)]\n[TestFixture]\npublic clas"
},
{
"path": "PlaywrightTests/TestHelpers.cs",
"chars": 373,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "TestComponents/Data/IWeatherForecastService.cs",
"chars": 921,
"preview": "using System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace TestComponents\n{\n public interface IWeathe"
},
{
"path": "TestComponents/Pages/Blank.razor",
"chars": 43,
"preview": "@page \"/blank\"\n<h3>Blank</h3>\n\n@code {\n\n}\n"
},
{
"path": "TestComponents/Pages/Error.razor",
"chars": 697,
"preview": "@page \"/error\"\n\n\n<h1 class=\"text-danger\">Error.</h1>\n<h2 class=\"text-danger\">An error occurred while processing your re"
},
{
"path": "TestComponents/Pages/FetchData.razor",
"chars": 733,
"preview": "@inject IWeatherForecastService Forecasts\n@using TestComponents\n@page \"/fetchdata\"\n\n<h1>Weather forecast</h1>\n\n<p>This "
},
{
"path": "TestComponents/Pages/Index.razor",
"chars": 828,
"preview": "@implements IDisposable\n@inject IResizeListener listener\n@page \"/\"\n\n<h3>Height: <span title=\"browserHeight\">@browser.He"
},
{
"path": "TestComponents/Pages/Multicast.razor",
"chars": 255,
"preview": "@page \"/multicast\"\n<h3>Multicast</h3>\n<div class=\"row\">\n <div class=\"col\">\n <ScreenSizeReporter />\n </div>"
},
{
"path": "TestComponents/Pages/NullableFlag.razor",
"chars": 351,
"preview": "@page \"/nullable\"\n@if (IsSmall.HasValue)\n{\n if (IsSmall.Value)\n {\n <h1>Small</h1>\n }\n else\n {\n "
},
{
"path": "TestComponents/Pages/ScreenSize.razor",
"chars": 48,
"preview": "@page \"/size\"\n<ScreenSizeReporter/>\n\n@code {\n\n}"
},
{
"path": "TestComponents/Pages/ScreenSizeReporter.razor",
"chars": 599,
"preview": "<h5>Device Size</h5>\n<ul class=\"list-group\">\n <li class=\"list-group-item @Active(IsLarge)\">Large</li>\n <li class="
},
{
"path": "TestComponents/Pages/Templates.razor",
"chars": 592,
"preview": "@inject IWeatherForecastService Forecasts\n\n@using TestComponents\n@page \"/templates\"\n\n<h1>Weather forecast</h1>\n\n<p>This"
},
{
"path": "TestComponents/TestComponents.csproj",
"chars": 486,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Razor\">\n\n <PropertyGroup>\n <TargetFramework>net9.0</TargetFramework>\n </PropertyGr"
},
{
"path": "TestComponents/WeatherCards.razor",
"chars": 784,
"preview": "@if (Data == null)\n{\n <p><em>Loading...</em></p>\n}\nelse\n{\n foreach (var t in Data.Select((x,i) => new { Forecast "
},
{
"path": "TestComponents/WeatherForecast.cs",
"chars": 329,
"preview": "using System;\nusing System.Collections.Generic;\nnamespace TestComponents\n{\n public class WeatherForecast\n {\n "
},
{
"path": "TestComponents/WeatherGrid.razor",
"chars": 777,
"preview": "@if (Data == null)\n{\n <p><em>Loading...</em></p>\n}\nelse\n{\n <table id=\"table_0\" class=\"table\" data-testid=\"weather"
},
{
"path": "TestComponents/_Imports.razor",
"chars": 71,
"preview": "@using Microsoft.AspNetCore.Components.Web\n@using BlazorPro.BlazorSize"
},
{
"path": "TestComponents/wwwroot/fixture.html",
"chars": 186,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <title></title>\n <script src=\"fixture.js\"></script>\n<"
},
{
"path": "TestComponents/wwwroot/fixture.js",
"chars": 178,
"preview": "var myWindow;\n\nfunction openWin(page, w, h) {\n myWindow = window.open(`/${page}`, \"\", `width=${w}, height=${h}`);\n}\n"
},
{
"path": "bUnitCompatibilityTests/CompTest.cs",
"chars": 744,
"preview": "using BlazorPro.BlazorSize;\nusing Bunit;\nusing Xunit;\n\nnamespace bUnitCompatibilityTests\n{\n public class CompTest\n "
},
{
"path": "bUnitCompatibilityTests/Sample.razor",
"chars": 187,
"preview": "@using BlazorPro.BlazorSize\n<MediaQuery Media=\"@Breakpoints.SmallDown\">\n <Matched>\n MATCHES\n </Matched>\n "
},
{
"path": "bUnitCompatibilityTests/_Imports.razor",
"chars": 237,
"preview": "@using Microsoft.AspNetCore.Components.Forms\n@using Microsoft.AspNetCore.Components.Web\n@using Microsoft.JSInterop\n@usi"
},
{
"path": "bUnitCompatibilityTests/bUnitCompatibilityTests.csproj",
"chars": 1090,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Razor\">\n\n <PropertyGroup>\n <TargetFramework>net9.0</TargetFramework>\n\n <IsPackab"
},
{
"path": "package.json",
"chars": 65,
"preview": "{\n \"devDependencies\": {\n \"@playwright/test\": \"^1.47.1\"\n }\n}\n"
},
{
"path": "readme.md",
"chars": 1490,
"preview": "BlazorSize is a JavaScript interop library for Blazor that is used to detect the Browser's current size, change in size,"
}
]
// ... and 6 more files (download for full content)
About this extraction
This page contains the full source code of the EdCharbeneau/BlazorSize GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 115 files (4.4 MB), approximately 1.2M tokens, and a symbol index with 137 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.