diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..74cf31a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +* text=auto +*.pas eol=crlf +*.dfm eol=crlf +*.dpr eol=crlf +*.groupproj eol=crlf + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f86fced --- /dev/null +++ b/.gitignore @@ -0,0 +1,61 @@ +*.o +*.lo +*.la +*.al +.libs +*.so +*.so.[0-9]* +*.a +*.pyc +*.pyo +__pycache__ +*.rej +*~ +.*.swp +.DS_Store +[Tt]humbs.db +__history +__recovery +*.res +*.local +*.identcache +*.stat +*.toc +*.log +*.synctex.gz +*.aux +*_minted* +*.dcu +*.bpl +TMSWeb +Debug +Win32 +Win64 +TMSWebIntermediate +.vscode +*.map +*.apk +*.dll +*.exe +*.bpi +*.dcp +*.dcu +*.dres +*.rsm +*.tds +*.lib +*.cfg +*.hpp +*Resource.rc +*.tvsconfig +*.dsk +*.stat +*.zip +*.7z +*.arj +*.tar +*.tar.gz +.git +.svn +*.user +bin/ diff --git a/src/UFrmMain.dfm b/src/UFrmMain.dfm new file mode 100644 index 0000000..14b88b0 --- /dev/null +++ b/src/UFrmMain.dfm @@ -0,0 +1,53 @@ +object MainForm: TMainForm + Left = 0 + Top = 0 + BorderStyle = bsSizeToolWin + Caption = 'XData Web Services' + ClientHeight = 405 + ClientWidth = 697 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Tahoma' + Font.Style = [] + OnCreate = FormCreate + DesignSize = ( + 697 + 405) + TextHeight = 19 + object txtLog: TMemo + Left = 8 + Top = 64 + Width = 681 + Height = 333 + Anchors = [akLeft, akTop, akRight, akBottom] + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Consolas' + Font.Style = [] + ParentFont = False + ReadOnly = True + TabOrder = 0 + end + object btStart: TButton + Left = 8 + Top = 8 + Width = 105 + Height = 50 + Caption = 'Start' + TabOrder = 1 + OnClick = btStartClick + end + object btStop: TButton + Left = 583 + Top = 8 + Width = 106 + Height = 50 + Anchors = [akTop, akRight] + Caption = 'Stop' + TabOrder = 2 + OnClick = btStopClick + end +end diff --git a/src/UFrmMain.pas b/src/UFrmMain.pas new file mode 100644 index 0000000..4cfba95 --- /dev/null +++ b/src/UFrmMain.pas @@ -0,0 +1,89 @@ +unit UFrmMain; + +interface + +uses + Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, + System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, + Vcl.StdCtrls, UServerContainer; + +type + TMainForm = class(TForm) + txtLog: TMemo; + btStart: TButton; + btStop: TButton; + procedure btStartClick(ASender: TObject); + procedure btStopClick(ASender: TObject); + procedure FormCreate(ASender: TObject); + strict private + procedure UpdateGUI; + + public + procedure Log( AText: String; ATimeStamp: Boolean = true ); + + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.dfm} + +uses + System.DateUtils + ; + +resourcestring + SServerStopped = 'Server stopped'; + SServerStartedAt = 'Server started at '; + +{ TMainForm } + +procedure TMainForm.btStartClick(ASender: TObject); +begin + TServerContainer.Instance.Start; + UpdateGUI; +end; + +procedure TMainForm.btStopClick(ASender: TObject); +begin + TServerContainer.Instance.Stop; + UpdateGUI; +end; + +procedure TMainForm.FormCreate(ASender: TObject); +begin + UpdateGUI; +end; + +procedure TMainForm.Log(AText: String; ATimeStamp: Boolean); +var + LLine: String; + +begin + if ATimeStamp then begin + LLine := DateTimeToStr( TDateTime.Now ) + ': '; + end; + + LLine := LLine + AText; + + txtLog.Lines.Append(LLine); +end; + +procedure TMainForm.UpdateGUI; +const + cHttp = 'http://+'; + cHttpLocalhost = 'http://localhost'; +begin + btStart.Enabled := not TServerContainer.Instance.Active; + btStop.Enabled := not btStart.Enabled; + if TServerContainer.Instance.Active then + Log(SServerStartedAt + StringReplace( + TServerContainer.Instance.BaseUrl, + cHttp, cHttpLocalhost, [rfIgnoreCase])) + else + Log(SServerStopped); +end; + +end. diff --git a/src/UServerContainer.dfm b/src/UServerContainer.dfm new file mode 100644 index 0000000..a1e8b6d --- /dev/null +++ b/src/UServerContainer.dfm @@ -0,0 +1,30 @@ +object ServerContainer: TServerContainer + Height = 210 + Width = 431 + object Dispatcher: TSparkleHttpSysDispatcher + Left = 72 + Top = 16 + end + object Server: TXDataServer + BaseUrl = 'http://+:80/' + Dispatcher = Dispatcher + EntitySetPermissions = <> + SwaggerOptions.Enabled = True + SwaggerUIOptions.Enabled = True + SwaggerUIOptions.ShowFilter = True + SwaggerUIOptions.DisplayOperationId = True + SwaggerUIOptions.TryItOutEnabled = True + Left = 216 + Top = 16 + object MiddlewareCors: TSparkleCorsMiddleware + end + end + object Manager: TFDManager + FormatOptions.AssignedValues = [fvMapRules] + FormatOptions.OwnMapRules = True + FormatOptions.MapRules = <> + Active = True + Left = 216 + Top = 96 + end +end diff --git a/src/UServerContainer.pas b/src/UServerContainer.pas new file mode 100644 index 0000000..aced80b --- /dev/null +++ b/src/UServerContainer.pas @@ -0,0 +1,114 @@ +unit UServerContainer; + +interface + +uses + System.SysUtils, System.Classes, Sparkle.HttpServer.Module, + Sparkle.HttpServer.Context, Sparkle.Comp.Server, + Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces, + Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module, + XData.Comp.Server, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, + FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, + FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.MySQL, FireDAC.Phys.MySQLDef, + FireDAC.VCLUI.Wait, Data.DB, FireDAC.Comp.Client, FireDAC.DApt, + Sparkle.Comp.CorsMiddleware; + +type + TServerContainer = class(TDataModule) + Dispatcher: TSparkleHttpSysDispatcher; + Server: TXDataServer; + Manager: TFDManager; + MiddlewareCors: TSparkleCorsMiddleware; + + strict private + class var FInstance: TServerContainer; + + private + function GetActive: Boolean; + function GetBaseUrl: String; + + + public + function GetConnection: TFDConnection; + + class function Instance: TServerContainer; + class destructor Destroy; + + procedure Start; + procedure Stop; + + property Active: Boolean read GetActive; + property BaseUrl: String read GetBaseUrl; + + public + end; + + + +implementation + +{%CLASSGROUP 'Vcl.Controls.TControl'} + +{$R *.dfm} + +const + CONDEF = 'sqlite_pool'; + +class destructor TServerContainer.Destroy; +begin + FInstance.Free; + + inherited; +end; + +function TServerContainer.GetActive: Boolean; +begin + Result := Dispatcher.Active; +end; + +function TServerContainer.GetBaseUrl: String; +begin + Result := Server.BaseUrl; +end; + +function TServerContainer.GetConnection: TFDConnection; +begin + if not Manager.IsConnectionDef(CONDEF) then + begin + var LParams := TStringList.Create; + try + LParams.Add('Database=stock.db'); + LParams.Add('Pooling=True'); + + Manager.AddConnectionDef(CONDEF, 'SQLite', LParams, False ); + finally + LParams.Free; + end; + end; + + Result := TFDConnection.Create(nil); + Result.ConnectionDefName := CONDEF; +end; + +class function TServerContainer.Instance: TServerContainer; +begin + if not Assigned( FInstance ) then + begin + FInstance := TServerContainer.Create(nil); + end; + + Result := FInstance; +end; + + +procedure TServerContainer.Start; +begin + Dispatcher.Active := True; +end; + +procedure TServerContainer.Stop; +begin + Dispatcher.Active := False; +end; + +end. diff --git a/stockservice.http.dpr b/stockservice.http.dpr new file mode 100644 index 0000000..5c22927 --- /dev/null +++ b/stockservice.http.dpr @@ -0,0 +1,12 @@ +program stockservice.http; + +uses + Vcl.Forms; + +{$R *.res} + +begin + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.Run; +end. diff --git a/stockservice.http.dproj b/stockservice.http.dproj new file mode 100644 index 0000000..71d87cf --- /dev/null +++ b/stockservice.http.dproj @@ -0,0 +1,1115 @@ + + + {72D4AB02-2065-4C81-9AAA-FFB61E3C149C} + 20.1 + VCL + True + Debug + Win32 + stockservice.http + 3 + Application + stockservice.http.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + stockservice_http + + + vclwinx;DataSnapServer;fmx;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;aurelius;FMX_FlexCel_Components;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;dbxcds;vcledge;FlexCel_Pdf;DBXFirebirdDriver;FireDACSqliteDriver;DbxClientDriver;soapmidas;dbexpress;inet;vcltouch;FMX_FlexCel_Core;FireDACDBXDriver;fmxdae;tmsbcl;VCL_FlexCel_Core;CustomIPTransport;FireDACMSSQLDriver;IndySystem;vclFireDAC;FlexCel_Render;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;TMSMQTTPkgDXE15;bindcompdbx;rtl;FireDACMySQLDriver;VCL_FlexCel_Components;DBXSqliteDriver;TMSVCLUIPackPkgDXE15;DBXSybaseASEDriver;TMSWEBCorePkgDXE15;TMSMQTTPkgDEDXE15;vclimg;DataSnapFireDAC;inetdbxpress;FireDAC;xmlrtl;dsnap;xdata;FireDACDb2Driver;DBXOracleDriver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;DatasnapConnectorsFreePascal;TMSLogging;FMXTMSFNCCorePkgDXE15;emshosting;sparkle;FireDACCommonDriver;IndyIPClient;bindcompvclwinx;emsedge;bindcompfmx;TMSVCLUIPackPkgExDXE15;inetdb;FireDACASADriver;vclactnband;TMSVCLUIPackPkgXlsDXE15;fmxFireDAC;FireDACInfxDriver;DBXMySQLDriver;VclSmp;DataSnapCommon;fmxase;TMSVCLUIPackPkgWizDXE15;DBXOdbcDriver;dbrtl;FireDACOracleDriver;Skia.Package.FMX;FlexCel_XlsAdapter;FireDACMSAccDriver;DataSnapIndy10ServerTransport;FMXTMSFNCCloudPackPkgDXE15;PKIECtrl29;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FireDACTDataDriver;Skia.Package.VCL;vcldb;FlexCel_Core;bindcomp;IndyCore;RESTBackendComponents;FireDACADSDriver;RESTComponents;IndyIPServer;vcl;dsnapxml;adortl;dsnapcon;DataSnapClient;DataSnapProviderClient;DBXDb2Driver;emsclientfiredac;FireDACPgDriver;FireDACDSDriver;tethering;bindcompvcl;CloudService;DBXSybaseASADriver;VCLTMSFNCCloudPackPkgDXE15;TMSWEBCorePkgLibDXE15;VCLTMSFNCCorePkgDXE15;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + + + vclwinx;DataSnapServer;fmx;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;aurelius;FMX_FlexCel_Components;appanalytics;IndyProtocols;vclx;dbxcds;vcledge;FlexCel_Pdf;DBXFirebirdDriver;FireDACSqliteDriver;DbxClientDriver;soapmidas;dbexpress;inet;vcltouch;FMX_FlexCel_Core;FireDACDBXDriver;fmxdae;tmsbcl;VCL_FlexCel_Core;CustomIPTransport;FireDACMSSQLDriver;IndySystem;vclFireDAC;FlexCel_Render;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;bindcompdbx;rtl;FireDACMySQLDriver;VCL_FlexCel_Components;DBXSqliteDriver;TMSVCLUIPackPkgDXE15;DBXSybaseASEDriver;vclimg;DataSnapFireDAC;inetdbxpress;FireDAC;xmlrtl;dsnap;xdata;FireDACDb2Driver;DBXOracleDriver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;DatasnapConnectorsFreePascal;TMSLogging;FMXTMSFNCCorePkgDXE15;emshosting;sparkle;FireDACCommonDriver;IndyIPClient;bindcompvclwinx;emsedge;bindcompfmx;TMSVCLUIPackPkgExDXE15;inetdb;FireDACASADriver;vclactnband;TMSVCLUIPackPkgXlsDXE15;fmxFireDAC;FireDACInfxDriver;DBXMySQLDriver;VclSmp;DataSnapCommon;fmxase;DBXOdbcDriver;dbrtl;FireDACOracleDriver;FlexCel_XlsAdapter;FireDACMSAccDriver;DataSnapIndy10ServerTransport;FMXTMSFNCCloudPackPkgDXE15;PKIECtrl29;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FireDACTDataDriver;Skia.Package.VCL;vcldb;FlexCel_Core;bindcomp;IndyCore;RESTBackendComponents;FireDACADSDriver;RESTComponents;IndyIPServer;vcl;dsnapxml;adortl;dsnapcon;DataSnapClient;DataSnapProviderClient;DBXDb2Driver;emsclientfiredac;FireDACPgDriver;FireDACDSDriver;tethering;bindcompvcl;CloudService;DBXSybaseASADriver;VCLTMSFNCCloudPackPkgDXE15;VCLTMSFNCCorePkgDXE15;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + + + DEBUG;$(DCC_Define) + true + false + true + true + true + true + true + + + false + PerMonitorV2 + + + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + PerMonitorV2 + + + PerMonitorV2 + + + + MainSource + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + Application + + + + stockservice.http.dpr + + + + + + stockservice.http.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + True + True + + + 12 + + + + +