Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add setup application for x86 and x64 #52

Merged
merged 1 commit into from
Oct 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/msbuild.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,5 @@ jobs:
run: msbuild /v:m /m /p:Configuration=${{matrix.buildConfiguration}} /p:Platform=${{matrix.buildPlatform}} ${{env.SOLUTION_FILE_PATH}} /p:NETPBM_WIC_CODEC_ALL_WARNINGS=true

- name: Test
working-directory: .\build\bin\${{matrix.buildPlatform}}\${{matrix.buildConfiguration}}\
working-directory: .\build\binaries\${{matrix.buildPlatform}}\${{matrix.buildConfiguration}}\
run: vstest.console.exe /Platform:${{matrix.buildPlatform}} test.dll
23 changes: 18 additions & 5 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!-- Build to a folder outside the source folders, making it easier to clean. -->
<OutDir>$(MSBuildThisFileDirectory)build\bin\$(Platform)\$(Configuration)\</OutDir>
<OutDir Condition="'$(Platform)'=='Win32'">$(MSBuildThisFileDirectory)build\bin\x86\$(Configuration)\</OutDir>
<IntDir>$(MSBuildThisFileDirectory)build\intermediate\$(Platform)\$(Configuration)\$(MSBuildProjectName)\</IntDir>
<IntDir Condition="'$(Platform)'=='Win32'">$(MSBuildThisFileDirectory)build\intermediate\x86\$(Configuration)\$(MSBuildProjectName)\</IntDir>
<!-- C++ projects: build to a folder outside the source folders, making it easier to clean. -->
<OutDir>$(MSBuildThisFileDirectory)build\binaries\$(Platform)\$(Configuration)\</OutDir>
<OutDir Condition="'$(Platform)'=='Win32'">$(MSBuildThisFileDirectory)build\binaries\x86\$(Configuration)\</OutDir>
<IntDir>$(MSBuildThisFileDirectory)build\intermediates\$(Platform)\$(Configuration)\$(MSBuildProjectName)\</IntDir>
<IntDir Condition="'$(Platform)'=='Win32'">$(MSBuildThisFileDirectory)build\intermediates\x86\$(Configuration)\$(MSBuildProjectName)\</IntDir>

<!-- WixProj: build to a folder outside the source folders, making it easier to clean. -->
<OutputPath>$(MSBuildThisFileDirectory)build\binaries\$(Configuration)\</OutputPath>
<BaseIntermediateOutputPath>$(MSBuildThisFileDirectory)build\intermediates\$(MSBuildProjectName)\</BaseIntermediateOutputPath>

<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>

Expand All @@ -22,6 +26,15 @@
<!-- Allow executing more build operations in parallel. -->
<BuildPassReferences>true</BuildPassReferences>
<AllowParallelCompileInReferencedProjects>true</AllowParallelCompileInReferencedProjects>

<Version>0.2.0</Version>

<!-- Define properties for WIX projects -->
<DefineConstants>FourPartsVersion=$(Version).0;</DefineConstants>
<Pedantic>true</Pedantic>

<AccelerateBuildsInVisualStudio>true</AccelerateBuildsInVisualStudio><!-- Enable faster builds for SDK style projects in Visual Studio 2022 17.5 and newer. -->
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>

<ItemDefinitionGroup>
Expand Down
11 changes: 11 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!--
Copyright (c) Team CharLS.
SPDX-License-Identifier: BSD-3-Clause
-->

<Project>
<ItemGroup>
<PackageVersion Include="WixToolset.Bal.wixext" Version="5.0.2" />
<PackageVersion Include="WixToolset.Util.wixext" Version="5.0.2" />
</ItemGroup>
</Project>
35 changes: 16 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ This Windows Imaging Component (WIC) codec makes it possible to decode .pgm and
It makes it possible to view Netpbm encoded images in Windows PhotoViewer, Windows Explorer (including thumbnails)
and import these images in Microsoft Office documents.

It is a C++ 23 implementation based on the <https://github.com/chausner/PnmWicImageCodec> project.
It leverages the C++/WinRT framework to implement the classic COM components required for a WIC codec.
It is a C++ 23 implementation originally based on the [PNM WIC Image Codec project](https://github.com/chausner/PnmWicImageCodec).
It leverages the C++/WinRT framework to implement the classic COM components required for a WIC codec and uses Wix v5 for the installer.

## Introduction

Expand Down Expand Up @@ -36,22 +36,18 @@ The Windows Imaging Component (WIC) is a built-in codec framework of Windows tha
to create independent native image codecs that can be used by a large set of applications.
WIC is implemented using COM technology. Image codecs for many popular formats are already pre-installed on Windows.

### Status
## Installing

This project is the development phase:
### Requirements

- Visual Studio 2022 17.11 or newer is needed to build the project.
- No installer with pre-built binaries is available, manually building and registering is required.
- Only .pgm P5 gray scale and P6 .ppm images can be decoded.
- All image files are considered single frame (the Netpbm standard also allows multi-frame)
- Only a decoder is available.
- Windows 11 or Windows 10 (version 22H2).
- x86, x64 or ARM64 processor

### Supported Operation Systems
### Via GitHub with EXE

The Netpbm WIC codec supports the following Windows operating systems:

- Windows 11 and 10
- Windows Server 2022
Go to the [releases](https://github.com/team-charls/netpbm-wic-codec/releases) page and click on
Assets at the bottom to show the files available in the release.
Please use the appropriate installer that matches your machine's architecture.

### Applications that can use the Netpbm WIC codec

Expand All @@ -63,7 +59,8 @@ The following application have been validated to work with the Netpbm WIC codec:
is provided to restore this functionality. The standard Windows Registry Editor can be used to add import this .reg file.
- WIC Explorer (sample application from Microsoft). An updated version of this application can be found at <https://github.com/vbaderks/WICExplorer>
- ZackViewer <https://github.com/peirick/ZackViewer>. This viewer can also be used to convert from one image encoding format to another.
- Microsoft Office applications like Word, Excel, PowerPoint. These applications can, when the NetPbm codec is installed, import .pgm images in their documents.
- Microsoft Office applications like Word, Excel, PowerPoint. These applications can, when the NetPbm codec is installed, import .pgm images in their documents. The 32 bit version of Office
requires that the x86 version of the codec is installed.

#### Windows 11\10 Microsoft Photos Application not supported

Expand Down Expand Up @@ -101,13 +98,13 @@ The following table lists the formats that can be decoded:

Note *: monochrome images with 10 or 12 bits per sample will be upscaled to 16 bits per sample.

## Build Instructions
## Manual Build Instructions

1. Clone this repro
1. Use Visual Studio and open the netpbm-wic-codec.sln. Batch build all projects.
1. Use Visual Studio 2022 17.11 or newer and open the netpbm-wic-codec.sln. Batch build all projects.
1. Or use a Developer Command Prompt and run use MSBuild in the root of the cloned repository.

## Installation
### Installation

1. Open a command prompt with elevated rights
1. Navigate to folder with the netpbm-wic-codec.dll
Expand All @@ -117,7 +114,7 @@ Note *: monochrome images with 10 or 12 bits per sample will be upscaled to 16 b
regsvr32 netpbm-wic-codec.dll
```

## Uninstall
### Uninstall

1. Open a command prompt with elevated rights
1. Navigate to folder with the netpbm-wic-codec.dll
Expand Down
5 changes: 5 additions & 0 deletions global.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"msbuild-sdks": {
"WixToolset.Sdk": "5.0.2"
}
}
28 changes: 28 additions & 0 deletions netpbm-wic-codec.sln
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "std-header-units", "std-header-units\std-header-units.vcxproj", "{DB8D6FC8-6F7B-446F-892A-0BA6C779E5F2}"
EndProject
Project("{B7DD6F7E-DEF8-4E67-B5B7-07EF123DB6F0}") = "bootstrapper", "setup\bootstrapper\bootstrapper.wixproj", "{53E56BDE-5FC1-4C10-985E-609A34483B6A}"
EndProject
Project("{B7DD6F7E-DEF8-4E67-B5B7-07EF123DB6F0}") = "installer", "setup\installer\installer.wixproj", "{8A21B212-8135-4499-9E5D-A2B47E88E983}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
Expand Down Expand Up @@ -66,6 +70,30 @@ Global
{DB8D6FC8-6F7B-446F-892A-0BA6C779E5F2}.Release|x64.Build.0 = Release|x64
{DB8D6FC8-6F7B-446F-892A-0BA6C779E5F2}.Release|x86.ActiveCfg = Release|Win32
{DB8D6FC8-6F7B-446F-892A-0BA6C779E5F2}.Release|x86.Build.0 = Release|Win32
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Debug|ARM64.ActiveCfg = Debug|ARM64
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Debug|ARM64.Build.0 = Debug|ARM64
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Debug|x64.ActiveCfg = Debug|x64
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Debug|x64.Build.0 = Debug|x64
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Debug|x86.ActiveCfg = Debug|x86
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Debug|x86.Build.0 = Debug|x86
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Release|ARM64.ActiveCfg = Release|ARM64
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Release|ARM64.Build.0 = Release|ARM64
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Release|x64.ActiveCfg = Release|x64
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Release|x64.Build.0 = Release|x64
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Release|x86.ActiveCfg = Release|x86
{53E56BDE-5FC1-4C10-985E-609A34483B6A}.Release|x86.Build.0 = Release|x86
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Debug|ARM64.ActiveCfg = Debug|ARM64
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Debug|ARM64.Build.0 = Debug|ARM64
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Debug|x64.ActiveCfg = Debug|x64
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Debug|x64.Build.0 = Debug|x64
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Debug|x86.ActiveCfg = Debug|x86
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Debug|x86.Build.0 = Debug|x86
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Release|ARM64.ActiveCfg = Release|ARM64
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Release|ARM64.Build.0 = Release|ARM64
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Release|x64.ActiveCfg = Release|x64
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Release|x64.Build.0 = Release|x64
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Release|x86.ActiveCfg = Release|x86
{8A21B212-8135-4499-9E5D-A2B47E88E983}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
8 changes: 8 additions & 0 deletions netpbm-wic-codec.sln.DotSettings
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,32 @@
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:Boolean x:Key="/Default/UserDictionary/Words/=anymap/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=bugprone/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=BUILDARCH/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=CATID/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=charls/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=CLSID/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=cppcoreguidelines/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=defacto/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Derks/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=endian/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ffff/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=fmtlib/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=graymap/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=HKCR/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=hkey/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=HKLM/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=hresult/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Inproc/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=INSTALLFOLDER/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=IWIC/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=jpegls/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Lossless/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Multiframe/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=netpbm/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=norestart/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=pgmfile/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=pixmap/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ppmfile/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=unregister/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=VCRUNTIME/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=wincodec/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
125 changes: 125 additions & 0 deletions setup/bootstrapper/Bundle.wxs
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
<!--
Copyright (c) Team CharLS.
SPDX-License-Identifier: BSD-3-Clause
-->

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"
xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">

<!-- Use a different upgrade code for x86 to allow x86 and x64 versions to be installed side by side -->
<?if $(sys.BUILDARCHSHORT) = "X86" ?>
<?define UpgradeCode = "385a0ece-2336-4e92-985b-e68bd1794254" ?>
<?else?>
<?define UpgradeCode = "385a0ece-2336-4e92-985b-e68bd1794255" ?>
<?endif?>

<Bundle Name="Netpbm WIC Codec ($(sys.BUILDARCH))"
Manufacturer="Team CharLS"
Version="$(FourPartsVersion)"
UpgradeCode="$(UpgradeCode)">

<BootstrapperApplication>
<bal:WixStandardBootstrapperApplication
LicenseUrl=""
Theme="hyperlinkLicense"
SuppressOptionsUI="yes"
SuppressRepair="yes" />
</BootstrapperApplication>

<!-- processor architecture -->
<util:RegistrySearch
Id="REG_ARCH"
Root="HKLM"
Key="SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
Value="PROCESSOR_ARCHITECTURE"
Result="value"
Variable="ARCH_NAME" />

<!-- Visual C++ 2015-2022 Redistributable (x86) runtime minimum msi package version -->
<util:ProductSearch
Id="VCRUNTIME_X86"
Result="version"
Variable="VCRUNTIME_X86_VER"
UpgradeCode="65E5BD06-6392-3027-8C26-853107D3CF1A"
Condition="VersionNT" />

<!-- Visual C++ 2015-2022 Redistributable (x64) runtime minimum msi package version -->
<util:ProductSearch
Id="VCRUNTIME_X64"
Result="version"
Variable="VCRUNTIME_X64_VER"
UpgradeCode="36F68A90-239C-34DF-B58C-64B30153CE35"
Condition="VersionNT64 AND (ARCH_NAME = &quot;AMD64&quot;)"
After="REG_ARCH" />

<!-- Visual C++ 2015-2022 Redistributable (Arm64) runtime msi package version -->
<util:ProductSearch
Id="VCRUNTIME_ARM64"
Result="version"
Variable="VCRUNTIME_ARM64_VER"
UpgradeCode="DC9BAE42-810B-423A-9E25-E4073F1C7B00"
Condition="(ARCH_NAME = &quot;ARM64&quot;)"
After="REG_ARCH" />

<!-- Visual C++ 2015-2022 Redistributable runtime msi package version -->
<Variable Name="VCRUNTIME_VER" Type="version" Value="14.40.33810.0" />

<Chain>
<!-- Visual C++ 2015-2022 Redistributable (x86) -->
<?if $(sys.BUILDARCHSHORT) = "X86" ?>
<ExePackage
Id="VC_REDIST_X86"
DisplayName="Microsoft Visual C++ 2015-2022 Redistributable (x86) - 14.40.33810"
Cache="remove"
PerMachine="yes"
Permanent="yes"
Protocol="burn"
InstallCondition="VersionNT"
DetectCondition="(VCRUNTIME_X86_VER &gt;= VCRUNTIME_VER) AND VersionNT"
InstallArguments="/install /quiet /norestart"
RepairArguments="/repair /quiet /norestart"
UninstallArguments="/uninstall /quiet /norestart">
<ExePackagePayload
Name="VC_redist.x86.exe"
ProductName="Microsoft Visual C++ 2015-2022 Redistributable (x86) - 14.40.33810"
Description="Microsoft Visual C++ 2015-2022 Redistributable (x86) - 14.40.33810"
Hash="91a6283f774f9e2338b65aa835156854e9e76aed32f821b13cfd070dd6c87e1542ce2d5845beb5e4af1ddb102314bb6e0ad6214d896bb3e387590a01eae0c182"
Size="13867304"
Version="14.40.33810.0"
DownloadUrl="https://download.visualstudio.microsoft.com/download/pr/9c69db26-cda4-472d-bdae-f2b87f4a0177/A32DD41EAAB0C5E1EAA78BE3C0BB73B48593DE8D97A7510B97DE3FD993538600/VC_redist.x86.exe" />
</ExePackage>
<?endif?>

<!-- Visual C++ 2015-2022 Redistributable (x64) -->
<?if $(sys.BUILDARCHSHORT) = "X64" ?>
<ExePackage
Id="VC_REDIST_X64"
DisplayName="Microsoft Visual C++ 2015-2022 Redistributable (x64) - 14.40.33810"
Cache="remove"
PerMachine="yes"
Permanent="yes"
Protocol="burn"
InstallCondition="VersionNT64 AND (ARCH_NAME = &quot;AMD64&quot;)"
DetectCondition="(VCRUNTIME_X64_VER &gt;= VCRUNTIME_VER) AND VersionNT64 AND (ARCH_NAME = &quot;AMD64&quot;)"
InstallArguments="/install /quiet /norestart"
RepairArguments="/repair /quiet /norestart"
UninstallArguments="/uninstall /quiet /norestart">
<ExePackagePayload
Name="VC_redist.x64.exe"
ProductName="Microsoft Visual C++ 2015-2022 Redistributable (x64) - 14.40.33810"
Description="Microsoft Visual C++ 2015-2022 Redistributable (x64) - 14.40.33810"
Hash="5935b69f5138ac3fbc33813c74da853269ba079f910936aefa95e230c6092b92f6225bffb594e5dd35ff29bf260e4b35f91adede90fdf5f062030d8666fd0104"
Size="25397512"
Version="14.40.33810.0"
DownloadUrl="https://download.visualstudio.microsoft.com/download/pr/1754ea58-11a6-44ab-a262-696e194ce543/3642E3F95D50CC193E4B5A0B0FFBF7FE2C08801517758B4C8AEB7105A091208A/VC_redist.x64.exe" />
</ExePackage>
<?endif?>

<MsiPackage
Id="CodecInstaller"
SourceFile="installer.msi"
Visible="no" />
</Chain>
</Bundle>
</Wix>
20 changes: 20 additions & 0 deletions setup/bootstrapper/bootstrapper.wixproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<!--
Copyright (c) Team CharLS.
SPDX-License-Identifier: BSD-3-Clause
-->

<Project Sdk="WixToolset.Sdk">
<PropertyGroup>
<OutputType>Bundle</OutputType>
<OutputName>NetpbmWicCodecSetup-$(Version)-$(Platform)</OutputName>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="WixToolset.Bal.wixext" />
<PackageReference Include="WixToolset.Util.wixext" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\installer\installer.wixproj" />
</ItemGroup>
</Project>
Loading
Loading