Jump to content
Korean Random

Создание инсталляторов для модпаков на базе Inno Setup


Recommended Posts

Интересно, а на анси версии кто-то пробовал тестировать уже этот код?


попробовал на юникод версии: скачало, но не распаковало.

Link to comment
Short link
Share on other sites

Парни как сделать чек  бокс на последней странице с запуском WoT?

Используй секцию Run, вот пример:

[Run]
Filename: "{app}\WoTLauncher.exe"; Description: "Запустить игру после окончания установки?"; Flags: postinstall nowait unchecked

postinstall - это как раз тот флаг, который создаёт чекбокс на последней странице, в ЛистБоксе RunList.

Edited by Kotyarko_O
Link to comment
Short link
Share on other sites

А как сделать что бы при установке определенного мода была скопирована папка из \res\audio в папку res_mods\0.9.2

[Files]
Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.9.2\audio"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: ;

Вписываешь тот компонент, для которого тебе и нужно сделать копирование.

Link to comment
Short link
Share on other sites

[Files]
Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.9.2\audio"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: ;

Вписываешь тот компонент, для которого тебе и нужно сделать копирование.

 

Спасибо большое :gawi:

Link to comment
Short link
Share on other sites

 

 

postinstall - это как раз тот флаг, который создаёт чекбокс на последней странице, в ЛистБоксе RunList.

А как к новому чек боксу привязать функцию запуска?Просто у меня ,как ты наверное помнишь,стандартные страницы закрыты картинками. 

Link to comment
Short link
Share on other sites

А как к новому чек боксу привязать функцию запуска?Просто у меня ,как ты наверное помнишь,стандартные страницы закрыты картинками. 

Да, помню.

Тогда так:

[Run]
Filename: "{app}\WOTLauncher.exe"; WorkingDir: "{app}"; Flags: nowait postinstall runmaximized; Check: CB;

[Code]
Function CB(): Boolean;
begin
 Result := X.Checked;
end;

Procedure InitializeWizard();
begin
 WizardForm.RunList.Visible := False;
end;

где X - название созданного чекбокса.

Link to comment
Short link
Share on other sites

 

 

попробовал на юникод версии: скачало, но не распаковало

Да я тоже прикрутил вроде докачку, но такая же хрень, качает но не распаковывает.

Подскажите плиз кто как это исправить, и ещё вопрос.

Можно ли это применить для скачивания файлов и их распаковки в игру с яндекс диска?

Link to comment
Short link
Share on other sites

Можно ли это применить для скачивания файлов и их распаковки в игру с яндекс диска?

Попробуйте (просто сдерите с кнопки "скачать" ссылку и используйте в скрипте её).

 

Да я тоже прикрутил вроде докачку, но такая же хрень, качает но не распаковывает.

А вы попробуйте распаковку на ssPostInstall.

Edited by Kotyarko_O
Link to comment
Short link
Share on other sites

Покажи код, которым ты создаёшь чекбокс.

NewCheckBox3 := TNewCheckBox.Create(WizardForm);

NewCheckBox3.Name := 'NewCheckBox3';

NewCheckBox3.Parent := WizardForm.FinishedPage;

NewCheckBox3.Left := ScaleX(306);

NewCheckBox3.Top := ScaleY(203);

NewCheckBox3.Width := ScaleX(13);

NewCheckBox3.Height := ScaleY(13);

NewCheckBox3.Caption := '';

 

 

var

  

  NewCheckBox3: TNewCheckBox;

Edited by MEDNIKs
Link to comment
Short link
Share on other sites

@MEDNIKs, блин, сам себя запутал (немного не так тебя понял).
Вот так:

[Code]
var
NewCheckBox3: TNewCheckBox;
ResCode: Integer;

Procedure InitializeWizard();
begin
 NewCheckBox3 := TNewCheckBox.Create(WizardForm);
 NewCheckBox3.Parent := WizardForm.FinishedPage;
 NewCheckBox3.Left := ScaleX(306);
 NewCheckBox3.Top := ScaleY(203);
 NewCheckBox3.Width := ScaleX(150);
 NewCheckBox3.Height := ScaleY(13);
 NewCheckBox3.Caption := 'Запустить игру?';
end;

Procedure CurStepChanged(CurStep: TSetupStep);
begin
 If CurStep = ssDone then
 begin
  If NewCheckBox3.Checked then
  begin
   Exec(ExpandConstant('{app}\WOTLauncher.exe'), '', '', SW_SHOW, ewNoWait, ResCode);
  end;
 end;
end;
Link to comment
Short link
Share on other sites

как с версии inoo setup 5.1 перейти на 5.5

а то в скрипте пишет ошибки 

 Скачиваешь, устанавливаешь.

 

 

а то в скрипте пишет ошибки
В каком скрипте?

Может это твои ошибки.

Link to comment
Short link
Share on other sites

[spoiler] define MyAppName "ModPack by Clan Brothers Time 0.9.2" ;Название инстоллятора
#define MyInfoVer "1.1" ;Версия инсталлятора
#define MyAppVer "0.9.2" ;Версия игры
#define MyAppPublisher "Expoint" ;Имя компании или человека кто делал
#define MyAppURL "http://yandex.ru"
#define MyAppSupportURL "http://yandex.ru" ;Ссылка для лого
#define Patch "0.9.2"
#define Patch1 "0.9.2-backup"


#include "Components.iss" ;Компаненты, они же моды
#include "Модули/Messages.iss" ;Сообщение, надписи на кнопках и т.д.
#include "Модули/BackUpPage.iss" ;Резерное копирование или удаление res_mods
#include "CustomMessages.iss" ;Описание модов
#include "Модули/Skins.iss" ;скин
#include "Check For Run.iss"









[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVer}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}

//====={ Ссылки }=====\\
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}

//====={ Папка устанвки }=====\\
;DefaultDirName={pf}\{#MyAppName}
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU%7d_is1,InstallLocation|{pf}\World_of_Tanks}
DefaultGroupName={#MyAppName}

//====={ Картинки }=====\\
SetupIconFile=Files\qqq.ico
WizardSmallImageFile=Files\Small.bmp
WizardImageFile=Files\img1.bmp

//====={ Отключение строниц }=====\\
DisableProgramGroupPage=yes

//====={ Лицензия и Фак }=====\\
LicenseFile=licensia.rtf
InfoBeforeFile=faq.rtf

//====={ Папка создания и название сетапа }=====\\
OutputDir=.\Output
OutputBaseFilename={#MyAppName}

//====={ Сжатие сетапа }=====\\
InternalCompressLevel=ultra64
Compression=lzma2/ultra64



//====={ Сюда прописываешь те файлы и папки которые закинул в Mods }=====\\
WizardImageBackColor=$0000CC99
DisableStartupPrompt=False
AlwaysShowDirOnReadyPage=True
FlatComponentsList=False
ShowTasksTreeLines=True
AlwaysShowGroupOnReadyPage=True


//====={ Основные файлы сетапа }=====\\
[Files]
Source: Files\logo.bmp; Flags: dontcopy noencryption noencryption
Source: Files\logo2.bmp; Flags: dontcopy noencryption noencryption
Source: "Files\img_mod\1.bmp"; DestName: "CompDescImg1.bmp"; Flags: dontcopy
Source: "Files\img_mod\2.bmp"; DestName: "CompDescImg3.bmp"; Flags: dontcopy
Source: "Files\img_mod\3.bmp"; DestName: "CompDescImg4.bmp"; Flags: dontcopy
Source: "Files\img_mod\1.bmp"; DestName: "CompDescImg2.bmp"; Flags: dontcopy



[Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
OldEvent_LicenseAcceptedRadioClick: TNotifyEvent;

procedure LicenseAcceptedRadioClick(Sender: TObject); forward;

procedure RedesignWizardForm;
begin
with WizardForm.LicenseAcceptedRadio do
begin
Left := ScaleX(392);
Top := ScaleY(216);
OldEvent_LicenseAcceptedRadioClick := OnClick;
OnClick := @LicenseAcceptedRadioClick;
end;

{ ReservationBegin }
// Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

procedure LicenseAcceptedRadioClick(Sender: TObject);
begin
OldEvent_LicenseAcceptedRadioClick(Sender);
end;

procedure LogoOnClick(Sender: TObject);
var ResCode: Integer;
begin
ShellExec('', '{#MyAppURL}', '' , '', SW_SHOW, ewNoWait, ResCode)
end;
var
BitmapImage1: TBitmapImage;
procedure RedesignWizardForm2;
var
i: integer;
BtnPanel: TPanel;
BtnImage: TBitmapImage;
begin
ExtractTemporaryFile('logo.bmp')
BtnPanel:=TPanel.Create(WizardForm)
with BtnPanel do begin
Left:=0
Top:=490
Width:=120
Height:=50
Cursor:=crHand
OnClick:=@logoOnClick
Parent:=WizardForm
end;
BtnImage:=TBitmapImage.Create(WizardForm)
with BtnImage do begin
AutoSize:=True;
Enabled:=False;
Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\logo.bmp')
Parent:=BtnPanel
end;
end;
//////////////////////////

///////////////////////

procedure LogoOnClick1(Sender: TObject);
var
ResCode: Integer;
begin
ShellExec('', '{#MyAppSupportURL}', '' , '', SW_SHOW, ewNoWait, ResCode)
end;
procedure RedesignWizardForm3;
var
BtnPanel: TPanel;
BtnImage: TBitmapImage;
begin
ExtractTemporaryFile('logo2.bmp')
BtnPanel:=TPanel.Create(WizardForm)
with BtnPanel do
begin
Left:=130
Top:=490
Width:=120
Height:=50
Cursor:=crHand
OnClick:=@logoOnClick1
Parent:=WizardForm
end;
BtnImage:=TBitmapImage.Create(WizardForm)
with BtnImage do
begin
AutoSize:=True;
Enabled:=False;
Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\logo2.bmp')
Parent:=BtnPanel
end;
end;

function WindowResize(): Boolean;
var
HeightOffset, WidthOffset: Integer;
begin
HeightOffset:=170;
WidthOffset:=200;

WizardForm.Height:=WizardForm.Height + HeightOffset;
WizardForm.Width:=WizardForm.Width + WidthOffset;

WizardForm.NextButton.Top:=WizardForm.NextButton.Top + HeightOffset;
WizardForm.BackButton.Top:=WizardForm.BackButton.Top + HeightOffset;
WizardForm.CancelButton.Top:=WizardForm.CancelButton.Top + HeightOffset;
WizardForm.NextButton.Left:=WizardForm.NextButton.Left + WidthOffset;
WizardForm.BackButton.Left:=WizardForm.BackButton.Left + WidthOffset;
WizardForm.CancelButton.Left:=WizardForm.CancelButton.Left + WidthOffset;

WizardForm.OuterNotebook.Height:=WizardForm.OuterNotebook.Height + HeightOffset;
WizardForm.InnerNotebook.Height:=WizardForm.InnerNotebook.Height + HeightOffset;
WizardForm.OuterNotebook.Width:=WizardForm.OuterNotebook.Width + WidthOffset;
WizardForm.InnerNotebook.Width:=WizardForm.InnerNotebook.Width + WidthOffset;
WizardForm.WizardSmallBitmapImage.Left:= WizardForm.WizardSmallBitmapImage.Left + WidthOffset;
WizardForm.Bevel.Top:=WizardForm.Bevel.Top + HeightOffset;
WizardForm.BeveledLabel.Top:=WizardForm.BeveledLabel.Top + HeightOffset;
WizardForm.Bevel.Width:=WizardForm.Bevel.Width + WidthOffset;
WizardForm.Bevel1.Width:=WizardForm.Bevel1.Width + WidthOffset;
WizardForm.MainPanel.Width:=WizardForm.MainPanel.Width + WidthOffset;
WizardForm.BeveledLabel.Width:=WizardForm.BeveledLabel.Width + WidthOffset;
WizardForm.Center;

{ /// --- Раскомментировать при желании ---- ///
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
WizardForm.WizardBitmapImage.Width:=600;
WizardForm.WizardBitmapImage.Height:=400;
WizardForm.WizardBitmapImage2.Width:=600;
WizardForm.WizardBitmapImage2.Height:=400;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.WizardSmallBitmapImage.Top:=0;
WizardForm.WizardSmallBitmapImage.Left:=0;
WizardForm.WizardSmallBitmapImage.Width:=WizardForm.Width;
WizardForm.WizardSmallBitmapImage.Height:=58;
/// --- Конец ---- ///
}
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.WizardBitmapImage.Width:=697;
WizardForm.WizardBitmapImage.Height:=483;

WizardForm.FinishedHeadingLabel.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.YesRadio.Hide;
WizardForm.NoRadio.Hide;
WizardForm.WizardBitmapImage2.Width:=697;
WizardForm.WizardBitmapImage2.Height:=483;

WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.WizardSmallBitmapImage.Top:=0;
WizardForm.WizardSmallBitmapImage.Left:=0;
WizardForm.WizardSmallBitmapImage.Width:=697;
WizardForm.WizardSmallBitmapImage.Height:=58;

WizardForm.WelcomeLabel1.Width:=WizardForm.WelcomeLabel1.Width + WidthOffset;
WizardForm.WelcomeLabel1.Height:=WizardForm.WelcomeLabel1.Height + HeightOffset;
WizardForm.WelcomeLabel1.Width:=WizardForm.WelcomeLabel1.Width + WidthOffset;

WizardForm.WelcomeLabel2.Width:=WizardForm.WelcomeLabel2.Width + WidthOffset;
WizardForm.WelcomeLabel2.Height:=WizardForm.WelcomeLabel2.Height + HeightOffset;
WizardForm.WelcomeLabel2.Width:=WizardForm.WelcomeLabel2.Width + WidthOffset;


WizardForm.LicenseLabel1.Width:=WizardForm.LicenseLabel1.Width + WidthOffset;
WizardForm.LicenseMemo.Height:=WizardForm.LicenseMemo.Height + HeightOffset;
WizardForm.LicenseMemo.Width:=WizardForm.LicenseMemo.Width + WidthOffset;
WizardForm.LicenseNotAcceptedRadio.Top:=WizardForm.LicenseNotAcceptedRadio.Top + HeightOffset;
WizardForm.LicenseAcceptedRadio.Top:=WizardForm.LicenseAcceptedRadio.Top + HeightOffset;

WizardForm.InfoBeforeClickLabel.Width:=WizardForm.InfoBeforeClickLabel.Width + WidthOffset;
WizardForm.InfoBeforeMemo.Height:=WizardForm.InfoBeforeMemo.Height + HeightOffset;
WizardForm.InfoBeforeMemo.Width:=WizardForm.InfoBeforeMemo.Width + WidthOffset;

WizardForm.SelectDirLabel.Width:=WizardForm.SelectDirLabel.Width + WidthOffset;
WizardForm.SelectDirBrowseLabel.Width:=WizardForm.SelectDirBrowseLabel.Width + WidthOffset;
WizardForm.DiskSpaceLabel.Top:=WizardForm.DiskSpaceLabel.Top + HeightOffset;
WizardForm.DirBrowseButton.Left:=WizardForm.DirBrowseButton.Left + HeightOffset;
WizardForm.DirEdit.Width:=WizardForm.DirEdit.Width + HeightOffset;

WizardForm.ComponentsDiskSpaceLabel.Top:=WizardForm.ComponentsDiskSpaceLabel.Top + HeightOffset;
WizardForm.SelectComponentsLabel.Width:=WizardForm.SelectComponentsLabel.Width + WidthOffset;
WizardForm.ComponentsList.Height:=WizardForm.ComponentsList.Height + HeightOffset;
WizardForm.ComponentsList.Width:=WizardForm.ComponentsList.Width + WidthOffset;

WizardForm.ReadyLabel.Width:=WizardForm.ReadyLabel.Width + WidthOffset;
WizardForm.ReadyMemo.Height:=WizardForm.ReadyMemo.Height + HeightOffset;
WizardForm.ReadyMemo.Width:=WizardForm.ReadyMemo.Width + WidthOffset;

WizardForm.ProgressGauge.Width:=WizardForm.ProgressGauge.Width + HeightOffset;
WizardForm.FilenameLabel.Width:=WizardForm.FilenameLabel.Width + HeightOffset;
WizardForm.StatusLabel.Width:=WizardForm.StatusLabel.Width + HeightOffset;
end;

/// --- /// --- /// --- /// --- /// --- /// --- /// --- /// --- /// --- /// --- /// --- ///

type
TComponentDesc = record
Description: String;
ImageName: String;
Index: Integer;
end;

var
CompDescs: array of TComponentDesc;
CompDescPanel, CompDescImgPanel: TPanel;
CompDescText: array[1..2] of TLabel;
CompIndex, LastIndex: Integer;
CompDescImg: TBitmapImage;

procedure ShowCompDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
var
i: Integer;
begin
if Index = LastIndex then Exit;
CompIndex := -1;
for i := 0 to GetArrayLength(CompDescs) -1 do
begin
if (CompDescs[i].Index = Index) then
begin
CompIndex := i;
Break;
end;
end;
if (CompIndex >= 0) and (Area = iaItem) then
begin
if not FileExists(ExpandConstant('{tmp}\') + CompDescs[CompIndex].ImageName) then
ExtractTemporaryFile(CompDescs[CompIndex].ImageName);
CompDescImg.Bitmap.LoadFromFile(ExpandConstant('{tmp}\') + CompDescs[CompIndex].ImageName);
CompDescImg.Show;

CompDescText[2].Caption := CompDescs[CompIndex].Description;
CompDescText[2].Enabled := True;
end else
begin
CompDescText[2].Caption := CustomMessage('ComponentsInfo');
CompDescText[2].Enabled := False;
CompDescImg.Hide;
end;
LastIndex := Index;
end;

procedure CompListMouseLeave(Sender: TObject);
begin
CompDescImg.Hide;
CompDescText[2].Caption := CustomMessage('ComponentsInfo');
CompDescText[2].Enabled := False;
LastIndex := -1;
end;

procedure AddCompDescription(AIndex: Integer; ADescription: String; AImageName: String);
var
i: Integer;
begin
i := GetArrayLength(CompDescs);
SetArrayLength(CompDescs, i + 1);
CompDescs[i].Description := ADescription;
CompDescs[i].ImageName := AImageName;
CompDescs[i].Index := AIndex - 1
end;
procedure InitializeWizard();
begin
RedesignWizardForm;
InitializeWizard1(); {из BackUpPage.iss}
RedesignWizardForm2;
RedesignWizardForm3;
WindowResize();

begin
WizardForm.SelectComponentsLabel.Hide;
WizardForm.TypesCombo.Hide;
WizardForm.ComponentsList.SetBounds(ScaleX(260), ScaleY(20), ScaleX(357), ScaleY(333));
WizardForm.ComponentsList.OnItemMouseMove:= @ShowCompDescription;
WizardForm.ComponentsList.OnMouseLeave := @CompListMouseLeave;

CompDescImgPanel := TPanel.Create(WizardForm);
with CompDescImgPanel do
begin
Parent := WizardForm.SelectComponentsPage;
SetBounds(ScaleX(0), ScaleY(20), ScaleX(253), ScaleY(203)); //рамка картинки
BevelInner := bvLowered;
end;

CompDescText[1] := TLabel.Create(WizardForm);
with CompDescText[1] do
begin
Parent := CompDescImgPanel;
SetBounds(ScaleX(5), ScaleY(5), CompDescImgPanel.Width - ScaleX(10), CompDescImgPanel.Height - ScaleY(10));
AutoSize := False;
WordWrap := True;
Enabled := False;
Font.Color :=clBlack;
Caption := CustomMessage('ComponentsImgInfo');
end;

CompDescImg := TBitmapImage.Create(WizardForm);
with CompDescImg do
begin
Parent := CompDescImgPanel;
SetBounds(ScaleX(5), ScaleY(5), CompDescImgPanel.Width - ScaleX(10), CompDescImgPanel.Height - ScaleY(10));
Stretch := True;
Hide;
end;

CompDescPanel := TPanel.Create(WizardForm);
with CompDescPanel do
begin
Parent := WizardForm.SelectComponentsPage;
SetBounds(ScaleX(0), ScaleY(230), ScaleX(253), ScaleY(123)); //Нижния рамка
BevelInner := bvLowered;
end;



CompDescText[2] := TLabel.Create(WizardForm);
with CompDescText[2] do
begin
Parent := CompDescPanel;
SetBounds(ScaleX(5), ScaleY(5), CompDescPanel.Width - ScaleX(10), CompDescPanel.Height - ScaleY(10));
AutoSize :=False;
WordWrap := True;
Enabled := False;
Font.Color :=clBlack;
Caption := CustomMessage('ComponentsInfo');
end;

AddCompDescription(1, CustomMessage('CompDesc1'), 'CompDescImg1.bmp');
AddCompDescription(2, CustomMessage('CompDesc2'), 'CompDescImg2.bmp');
AddCompDescription(3, CustomMessage('CompDesc3'), 'CompDescImg3.bmp');
AddCompDescription(4, CustomMessage('CompDesc4'), 'CompDescImg4.bmp');



end;
end;

[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D0030103702000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E73655061676500F10F544E6577526164696F427574746F6E144C6963656E73654163636570746564526164696F044C65667403880103546F7003D800074F6E436C69636B07194C6963656E73654163636570746564526164696F436C69636B0C4578706C696369744C6566740388010B4578706C69636974546F7003D8000000000000F110544E65774E6F7465626F6F6B506167650C46696E6973686564506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100000000[/spoiler]


 

Ребят кто может припелить Splash к моему скрипту? Пожалуйста

Вот скримт

Edited by Shpyrny
Link to comment
Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...