Skip to content

Commit e1fd8cc

Browse files
committed
Forward port from v5
- donor page - scripted option to log msvcrt install - scripted option to disabloe install of msvcrt
1 parent 6f20f88 commit e1fd8cc

File tree

8 files changed

+191
-21
lines changed

8 files changed

+191
-21
lines changed

builds/install/arch-specific/win32/FirebirdInstall.iss

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,19 @@ Var
673673
674674
init_secdb: integer; // Is set to UNDEFINED by default in InitializeSetup
675675
676+
msilogdir: String; // Path to store logs from msiexec
677+
678+
novcrt: Boolean; // Do not install the VC runtime libs
679+
680+
AdminUserPage: TInputQueryWizardPage;
681+
682+
DonorPage: TWizardPage;
683+
RichEditViewer: TRichEditViewer;
684+
DonateButton: TNewButton;
685+
686+
initWizardHeight: Integer; // In prev. version - the wizard form was resized to new size every time when go back button pressed
687+
688+
676689
#ifdef setuplogging
677690
// Not yet implemented - leave log in %TEMP%
678691
// OkToCopyLog : Boolean; // Set when installation is complete.
@@ -684,25 +697,15 @@ Var
684697
685698
#include "FirebirdInstallGUIFunctions.inc"
686699
687-
688-
var
689-
AdminUserPage: TInputQueryWizardPage;
690-
initWizardHeight: Integer; //In prev. version - the wizard form was resized to new size every time when go back button pressed
691-
692700
procedure InitializeWizard;
693701
begin
694702
initWizardHeight := wizardform.height;
695703
696-
{ Create a page to grab the new SYSDBA password }
697-
AdminUserPage := CreateInputQueryPage(wpSelectTasks,
698-
ExpandConstant( '{cm:CreateSYSDBAPassword}' )
699-
, ExpandConstant( '{cm:ClickThroughPWCreation}' ) + #13#10 +
700-
ExpandConstant( '{cm:PasswordNote}' ) , '' );
701-
AdminUserPage.Add( ExpandConstant( '{cm:SYSDBAPassword}' ), True);
702-
AdminUserPage.Add( ExpandConstant( '{cm:RetypeSYSDBAPassword}' ), True);
704+
// Create a page to grab the new SYSDBA password
705+
CreateAdminUserPage;
703706
704-
AdminUserPage.Values[0] := SYSDBAPassword;
705-
AdminUserPage.Values[1] := SYSDBAPassword;
707+
// Create a page to ask for donations
708+
CreateDonorPage;
706709
707710
end;
708711
@@ -733,13 +736,17 @@ begin
733736
if pos('FORCE',Uppercase(CommandLine)) > 0 then
734737
ForceInstall:=True;
735738
739+
if pos('NOMSVCRT', Uppercase(CommandLine) ) > 0 then
740+
novcrt := true;
736741
737-
cmdParams := TStringList.create;
738-
for i:=0 to ParamCount do begin
739-
cmdParams.add(ParamStr(i));
740-
if pos('SYSDBAPASSWORD', Uppercase(ParamStr(i)) ) > 0 then
741-
SYSDBAPassword := Copy(ParamStr(i),Length('/SYSDBAPASSWORD=')+1,Length(ParamStr(i))-Length('/SYSDBAPASSWORD=') );
742-
end;
742+
cmdParams := TStringList.create;
743+
for i:=0 to ParamCount do begin
744+
cmdParams.add(ParamStr(i));
745+
if pos('SYSDBAPASSWORD', Uppercase(ParamStr(i)) ) > 0 then
746+
SYSDBAPassword := SplitKeyValue( ParamStr(i), false );
747+
if pos('MSILOGDIR', Uppercase( ParamStr(i) ) ) > 0 then
748+
msilogdir := SplitKeyValue( ParamStr(i), false );
749+
end;
743750
#ifdef iss_debug
744751
ShowDebugDlg(cmdParams.text,'');
745752
#endif
@@ -1068,6 +1075,12 @@ begin
10681075
case CurPage of
10691076
wpInfoBefore: WizardForm.INFOBEFOREMEMO.font.name:='Courier New';
10701077
wpInfoAfter: WizardForm.INFOAFTERMEMO.font.name:='Courier New';
1078+
DonorPage.ID: begin
1079+
DonateButton.Visible := True;
1080+
WizardForm.BackButton.Visible := False;
1081+
end;
1082+
else
1083+
DonateButton.Visible := False;
10711084
end;
10721085
end;
10731086
@@ -1279,6 +1292,26 @@ begin
12791292
end;
12801293
end;
12811294
1295+
function MsiexecLogDir( nullstr: String ): String;
1296+
begin
1297+
if msilogdir = '' then
1298+
msilogdir := ExpandConstant('{tmp}');
1299+
Result := msilogdir;
1300+
end;
1301+
1302+
function InstallVCRT: boolean;
1303+
begin
1304+
if novcrt then begin
1305+
Result := false;
1306+
exit;
1307+
end;
1308+
if HasNotWI30 then
1309+
Result := false
1310+
else
1311+
Result := true;
1312+
1313+
end;
1314+
12821315
begin
12831316
end.
12841317

builds/install/arch-specific/win32/FirebirdInstallGUIFunctions.inc

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,3 +346,74 @@ begin
346346
CloseDebugDlg;
347347
end;
348348

349+
350+
procedure CreateAdminUserPage;
351+
352+
begin
353+
354+
AdminUserPage := CreateInputQueryPage(wpSelectTasks,
355+
ExpandConstant( '{cm:CreateSYSDBAPassword}' )
356+
, ExpandConstant( '{cm:ClickThroughPWCreation}' ) + #13#10 +
357+
ExpandConstant( '{cm:PasswordNote}' ) , '' );
358+
AdminUserPage.Add( ExpandConstant( '{cm:SYSDBAPassword}' ), True);
359+
AdminUserPage.Add( ExpandConstant( '{cm:RetypeSYSDBAPassword}' ), True);
360+
361+
AdminUserPage.Values[0] := SYSDBAPassword;
362+
AdminUserPage.Values[1] := SYSDBAPassword;
363+
364+
end;
365+
366+
367+
procedure DonateButtonOnClick(Sender: TObject);
368+
var
369+
ErrorCode: Integer;
370+
begin
371+
ShellExecAsOriginalUser('open', 'https://firebirdsql.org/en/donate/', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
372+
end;
373+
374+
375+
procedure CreateDonorPage;
376+
var
377+
DonorText: AnsiString;
378+
379+
begin
380+
381+
// NOTE - The rtf must be pasted as a single line in the custom_messages.inc for the translated language. When removomg the EOLs pay attention that \par is always followed by a space.
382+
(*
383+
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}}{\colortbl ;\red0\green0\blue255;}{\*\generator Riched20 10.0.17763}\viewkind4\uc1\pard\sa200\sl276\slmult1\qj\f0\fs24\lang9 Firebird has empowered users worldwide with its reliable and powerful database capabilities, thanks to years of dedicated development and community collaboration.\par \pard\li568\ri568\sa200\sl240\slmult1\qj\par \pard\sa200\sl276\slmult1\qj To ensure Firebird\rquote s continued growth and advancement, we invite you to {{\field{\*\fldinst{HYPERLINK "https://firebirdsql.org/en/donate"}}{\fldrslt{\ul\cf1 make a donation}}}}\f0\fs24 through the Firebird Foundation. Your generous contributions help fund ongoing development, maintain critical infrastructure, and expand the features you rely on. Additionally, our affordable subscriptions offer exclusive benefits designed to enhance your Firebird experience.\par \par Every contribution, big or small, plays a vital role in keeping Firebird innovative and robust for everyone.\par \par Visit our {{\field{\*\fldinst{HYPERLINK https://firebirdsql.org/en/firebird-foundation/ }}{\fldrslt{website\ul0\cf0}}}}\f0\fs24 to explore how you can contribute to this mission and help ensure Firebird\rquote s bright future. Thank you for being a valued part of the Firebird community!\par };
384+
*)
385+
386+
DonorPage := CreateCustomPage( wpInfoAfter, 'Support Firebird Development', '');
387+
// For testing place it after the welcome page
388+
// DonorPage := CreateCustomPage( wpWelcome, 'Support Firebird Development', '');
389+
390+
DonorText := ExpandConstant('{cm:DonorPage}');
391+
392+
RichEditViewer := TRichEditViewer.Create(DonorPage);
393+
RichEditViewer.Width := DonorPage.SurfaceWidth;
394+
RichEditViewer.Height := DonorPage.SurfaceHeight;
395+
RichEditViewer.Anchors := [akLeft, akTop, akRight, akBottom];
396+
RichEditViewer.BevelKind := bkNone;
397+
RichEditViewer.BorderStyle := bsNone;
398+
RichEditViewer.Parent := DonorPage.Surface;
399+
RichEditViewer.ScrollBars := ssNone;
400+
RichEditViewer.UseRichEdit := True;
401+
RichEditViewer.RTFText := DonorText;
402+
RichEditViewer.ReadOnly := True;
403+
404+
DonateButton := TNewButton.Create(WizardForm);
405+
DonateButton.Left := 10;
406+
DonateButton.Top := WizardForm.CancelButton.Top;
407+
// NOTE - If adding new translations be sure to check that this button is wide enough
408+
// for the translation of 'Donate Now'.
409+
DonateButton.Width := WizardForm.CancelButton.Width + 40;
410+
DonateButton.Height := WizardForm.CancelButton.Height;
411+
DonateButton.Anchors := [akLeft, akBottom];
412+
DonateButton.Caption := ExpandConstant('{cm:DonateNow}');
413+
DonateButton.OnClick := @DonateButtonOnClick;
414+
DonateButton.Parent := WizardForm;
415+
DonateButton.Visible := False;
416+
417+
end;
418+
419+

builds/install/arch-specific/win32/FirebirdInstallSupportFunctions.inc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ Function Prototypes
5353
function GetInstalledVersion(BinaryFile: String): Array of Integer;
5454
function ConvertIBVerStrToFbVerStr( VerStr: String) : String;
5555
function GetRegistryEntry(RegKey, RegEntry: string): String;
56+
function SplitKeyValue( AString: String; theKey: Boolean): String;
57+
function GuessFirebirdPath( Product_ID: Integer; RootKey: Integer; RegKey, RegEntry: string ): String;
5658
5759
*)
5860

@@ -478,3 +480,33 @@ begin
478480
end;
479481

480482

483+
// Split a key value pair in two and return the value by default
484+
function SplitKeyValue( AString: String; theKey: Boolean): String;
485+
var
486+
apos: integer;
487+
akey: String;
488+
avalue: String;
489+
begin
490+
Result := '';
491+
apos := pos( '=', AString );
492+
if apos <> 0 then begin
493+
akey := Copy( Astring, 1, apos - 1 );
494+
aValue := Copy ( AString, apos + 1, length (Astring) - apos );
495+
end;
496+
if theKey then
497+
Result := aKey
498+
else
499+
Result := aValue;
500+
end;
501+
502+
503+
function GuessFirebirdPath( Product_ID: Integer; RootKey: Integer; RegKey, RegEntry: string ): String;
504+
begin
505+
Result := GetRegistryEntry( RootKey, RegKey, RegEntry );
506+
507+
if Result = '' then
508+
Result := ExpandConstant('{pf}') + '\Firebird\Firebird_' + IntToStr( Product_ID) + '_0';
509+
end;
510+
511+
512+

builds/install/arch-specific/win32/custom_messages.inc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,5 @@ en.RetypeSYSDBAPassword=Retype SYSDBA Password:
8888
en.InstallingMSVC32runtimes=Installing MSVC 32-bit runtime libraries to system directory
8989
en.InstallingMSVC64runtimes=Installing MSVC 64-bit runtime libraries to system directory
9090

91+
en.DonateNow=&Donate Now
92+
en.DonorPage={\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}}{\colortbl ;\red0\green0\blue255;}{\*\generator Riched20 10.0.17763}\viewkind4\uc1 \pard\sl240\slmult1\qj\f0\fs24\lang9 Firebird has empowered users worldwide with its reliable and powerful database capabilities, thanks to years of dedicated development and community collaboration.\par \pard\li568\ri568\sl240\slmult1\qj\par\pard\sl240\slmult1\qj To ensure Firebird\rquote s continued growth and advancement, we invite you to {{\field{\*\fldinst{HYPERLINK "https://firebirdsql.org/en/donate"}}{\fldrslt{\ul\cf1\cf1\ul make a donation}}}}\f0\fs24 through the Firebird Foundation. Your generous contributions help fund ongoing development, maintain critical infrastructure, and expand the features you rely on. Additionally, our affordable subscriptions offer exclusive benefits designed to enhance your Firebird experience.\par \par Every contribution, big or small, plays a vital role in keeping Firebird innovative and robust for everyone.\par \par Visit our {{\field{\*\fldinst{HYPERLINK "https://firebirdsql.org/en/firebird-foundation/ "}}{\fldrslt{\ul\cf1\cf1\ul website}}}}\f0\fs24 to explore how you can contribute to this mission and help ensure Firebird\rquote s bright future. Thank you for being a valued part of the Firebird community!\par }

builds/install/arch-specific/win32/cz/custom_messages_cz.inc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,5 @@ cz.RetypeSYSDBAPassword=Znovu heslo pro SYSDBA:
8989
cz.InstallingMSVC32runtimes=Instaluji 32bitové běhové knihovny MSVC do systémové složky
9090
cz.InstallingMSVC64runtimes=Instaluji 64bitové běhové knihovny MSVC do systémové složky
9191

92+
cz.DonateNow=&Přispějte nyní
93+
cz.DonorPage={\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}{\f1\fnil\fcharset238 Calibri;}}{\colortbl ;\red0\green0\blue255;}{\*\generator Riched20 10.0.17763}\viewkind4\uc1 \pard\sl240\slmult1\qj\f0\fs24\lang9 Firebird ji\f1\'9e l\f0\'e9ta umo\f1\'9e\'f2uje u\'9eivatel\'f9m po cel\f0\'e9m sv\f1\'ect\'ec vyu\'9e\f0\'edvat spolehliv\'e9 a v\'fdkonn\'e9 datab\'e1zov\'e9 funkce, a to d\'edky dlouholet\'e9mu v\'fdvoji a spolupr\'e1ci komunity.\par \par Aby mohl Firebird d\'e1le r\f1\'f9st a vyv\f0\'edjet se, zveme v\'e1s, abyste ho {{\field{\*\fldinst{HYPERLINK "https://firebirdsql.org/en/donate "}}{\fldrslt{\ul\cf1\cf1\ul podpo\f1\'f8ili\f1 }}}}\f0\fs24 prost\f1\'f8ednictv\f0\'edm Firebird Foundation. Va\f1\'9ae p\'f8\f0\'edsp\f1\'ecvky pom\f0\'e1haj\'ed financovat pokra\f1\'e8uj\f0\'edc\'ed v\'fdvoj, udr\f1\'9eovat kl\f0\'ed\f1\'e8ovou infrastrukturu a roz\'9ai\'f8ovat funkce, na kter\f0\'e9 se spol\'e9h\'e1te. Nav\'edc na\f1\'9ae cenov\'ec dostupn\f0\'e9 p\f1\'f8edplatn\f0\'e9 nab\'edz\'ed exkluzivn\'ed v\'fdhody, kter\'e9 v\'e1m zp\f1\'f8\f0\'edjemn\'ed pr\'e1ci s Firebirdem.\par \par Ka\f1\'9ed\f0\'fd p\f1\'f8\f0\'edsp\f1\'ecvek, mal\f0\'fd nebo velk\'fd, hraje z\'e1sadn\'ed roli pro udr\f1\'9een\f0\'ed Firebirdu jako inovativn\'edho a v\'fdkonn\'e9ho n\'e1stroje pro v\f1\'9aechny.\par \par Nav\'9ativte na\'9ae {{\field{\*\fldinst{HYPERLINK "https://firebirdsql.org/en/firebird-foundation/ "}}{\fldrslt{\ul\cf1\cf1\ul webov\f0\'e9 str\'e1nky}}}}\f1\fs24 a zjist\'ecte, jak m\'f9\'9eete pomoci zajistit sv\'ectlou budoucnost Firebirdu. D\'eckujeme, \'9ee jste sou\'e8\f0\'e1st\'ed komunity Firebirdu!\par \par }

builds/install/arch-specific/win32/fr/custom_messages_fr.inc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,5 @@ fr.RetypeSYSDBAPassword=Confirmer le mot de passe SYSDBA:
8989
fr.InstallingMSVC32runtimes=Installer les bibliothèques MSVC 32-bit dans le répertoire système
9090
fr.InstallingMSVC64runtimes=Installer les bibliothèques MSVC 64-bit dans le répertoire système
9191

92+
fr.DonateNow=Faire un &don
93+
fr.DonorPage={\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}}{\colortbl ;\red0\green0\blue255;}{\*\generator Riched20 10.0.17763}\viewkind4\uc1 \pard\sl240\slmult1\qj\f0\fs24\lang9 Firebird a permis aux utilisateurs du monde entier d'acc\'e9der \'e0 des bases de donn\'e9es fiables et puissantes, gr\'e2ce \'e0 des ann\'e9es de d\'e9veloppement et de collaboration avec la communaut\'e9.\par \par Pour assurer la croissance et le progr\'e8s continus de Firebird, nous vous invitons {{\field{\*\fldinst{HYPERLINK "https://firebirdsql.org/en/donate"}}{\fldrslt{\ul\cf1\cf1\ul\'e0 faire un don}}}}\f0\fs24 par l'interm\'e9diaire de la Fondation Firebird. Vos contributions g\'e9n\'e9reuses aident \'e0 financer le d\'e9veloppement continu, \'e0 maintenir l'infrastructure critique, et \'e0 \'e9tendre les fonctionnalit\'e9s sur lesquelles vous comptez. De plus, nos abonnements abordables offrent des avantages exclusifs con\'e7us pour am\'e9liorer votre exp\'e9rience de Firebird.\par \par Chaque contribution, petite ou grande, joue un r\'f4le vital pour que Firebird reste innovant et robuste pour tout le monde.\par \par Visitez notre {{\field{\*\fldinst{HYPERLINK "https://firebirdsql.org/en/firebird-foundation/ "}}{\fldrslt{\ul\cf1\cf1\ul site web}}}}\f0\fs24 pour d\'e9couvrir comment vous pouvez contribuer \'e0 cette mission et aider \'e0 assurer l'avenir de Firebird. Merci de faire partie de la communaut\'e9 Firebird !\par }

builds/install/arch-specific/win32/installation_scripted.txt

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ HELP
4141
/MERGETASKS="comma separated list of task names"
4242
/SYSDBAPASSWORD="masterkey"
4343
/FORCE
44+
/MSILOGDIR="Path to log output from installation of VC runtimes."
45+
/NOMSVCRT
4446

4547
Setup parameters specific to the Firebird Uninstaller
4648
/CLEAN
@@ -72,7 +74,7 @@ HELP
7274

7375
would be required for a client only install.
7476

75-
NOTE - If a full server install is required there is no need to
77+
NOTE - If a full server install is required there is no need to
7678
specify /COMPONENTS. All three are chosen by default.
7779

7880

@@ -137,6 +139,29 @@ HELP
137139
Its your choice.
138140

139141

142+
/MSILOGDIR="Path to log output from installation of the redistributable
143+
VC runtime libraries."
144+
145+
This is to help debug problems arising from running the vc runtime
146+
installer. There is no need to set this unless installation of the
147+
runtimes causes the installation of Firebird to trigger a reboot of
148+
Windows. The log may help debug the problem.
149+
150+
151+
/NOMSVCRT
152+
153+
Set this to disable installation of the redistributable MS VCRT
154+
runtime libraries that are included in the Firebird binary installer.
155+
Firebird comes with a stripped down set of the redistributable runtime
156+
libraries. If you wish to deploy the libraries via another means then
157+
you may use this switch to exclude installation of the MSI runtime
158+
libraries that are provided by the Firebird project.
159+
160+
In general use of this switch is not recommended unless you have
161+
problems with installation of the runtimes requiring a reboot of
162+
Windows. Excluding their installation may prevent Firebird from
163+
running if the required libraries are not available.
164+
140165

141166
Parameters specific to Firebird uninstalls
142167
------------------------------------------

builds/install/arch-specific/win32/ru/custom_messages_ru.inc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,6 @@ ru.SYSDBAPassword=Пароль SYSDBA:
8787
ru.RetypeSYSDBAPassword=Повторите пароль:
8888
ru.InstallingMSVC32runtimes=Устанавливаются библиотеки MSVC 32-bit runtime
8989
ru.InstallingMSVC64runtimes=Устанавливаются библиотеки MSVC 64-bit runtime
90+
91+
ru.DonateNow=&Пожертвовать сейчас
92+
ru.DonorPage={\rtf1\ansi\ansicpg1251\deff0\nouicompat{\fonttbl{\f0\fnil\fcharset204 Calibri;}{\f1\fnil\fcharset0 Calibri;}} {\*\generator Riched20 10.0.17763}\viewkind4\uc1 \pard\qj\f0\fs24\lang1049 Firebird \'ef\'f0\'e5\'e4\'ee\'f1\'f2\'e0\'e2\'eb\'ff\'e5\'f2 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'ff\'ec \'e1\'e0\'e7 \'e4\'e0\'ed\'ed\'fb\'f5 \'ef\'ee \'e2\'f1\'e5\'ec\'f3 \'ec\'e8\'f0\'f3 \'f1\'e2\'ee\'fe \'ed\'e0\'e4\'e5\'e6\'ed\'ee\'f1\'f2\'fc \'e8 \'ec\'ee\'f9\'ed\'ee\'f1\'f2\'fc \'e1\'eb\'e0\'e3\'ee\'e4\'e0\'f0\'ff \'ec\'ed\'ee\'e3\'ee\'eb\'e5\'f2\'ed\'e5\'e9 \'f0\'e0\'e7\'f0\'e0\'e1\'ee\'f2\'ea\'e5 \'e8 \'f1\'ee\'f2\'f0\'f3\'e4\'ed\'e8\'f7\'e5\'f1\'f2\'e2\'f3 \'f1 \'f1\'ee\'ee\'e1\'f9\'e5\'f1\'f2\'e2\'ee\'ec.\par\par \'d7\'f2\'ee\'e1\'fb \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e8\'f2\'fc \'ef\'ee\'f1\'f2\'ee\'ff\'ed\'ed\'fb\'e9 \'f0\'ee\'f1\'f2 \'e8 \'f0\'e0\'e7\'e2\'e8\'f2\'e8\'e5 Firebird, \'ec\'fb \'ef\'f0\'e8\'e3\'eb\'e0\'f8\'e0\'e5\'ec \'e2\'e0\'f1 \'ef\'ee\'e4\'e4\'e5\'f0\'e6\'e0\'f2\'fc \'e5\'e3\'ee \'f1 \'ef\'ee\'ec\'ee\'f9\'fc\'fe Firebird Foundation. \'c2\'e0\'f8\'e8 \'e1\'eb\'e0\'e3\'ee\'f0\'ee\'e4\'ed\'fb\'e5 \'ef\'ee\'e6\'e5\'f0\'f2\'e2\'ee\'e2\'e0\'ed\'e8\'ff \'ef\'ee\'ec\'ee\'e3\'e0\'fe\'f2 \'f4\'e8\'ed\'e0\'ed\'f1\'e8\'f0\'ee\'e2\'e0\'f2\'fc \'ef\'f0\'ee\'e4\'ee\'eb\'e6\'e0\'fe\'f9\'f3\'fe\'f1\'ff \'f0\'e0\'e7\'f0\'e0\'e1\'ee\'f2\'ea\'f3, \'ef\'ee\'e4\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'f2\'fc \'ea\'f0\'e8\'f2\'e8\'f7\'e5\'f1\'ea\'e8 \'e2\'e0\'e6\'ed\'f3\'fe \'e8\'ed\'f4\'f0\'e0\'f1\'f2\'f0\'f3\'ea\'f2\'f3\'f0\'f3 \'e8 \'f3\'eb\'f3\'f7\'f8\'e0\'f2\'fc \'f4\'f3\'ed\'ea\'f6\'e8\'ee\'ed\'e0\'eb\'fc\'ed\'ee\'f1\'f2\'fc, \'ed\'e0 \'ea\'ee\'f2\'ee\'f0\'f3\'fe \'e2\'fb \'ef\'ee\'eb\'e0\'e3\'e0\'e5\'f2\'e5\'f1\'fc. \'ca\'f0\'ee\'ec\'e5 \'f2\'ee\'e3\'ee, \'ed\'e0\'f8\'e8 \'e4\'ee\'f1\'f2\'f3\'ef\'ed\'fb\'e5 \'ef\'ee\'e4\'ef\'e8\'f1\'ea\'e8 \'ef\'f0\'e5\'e4\'eb\'e0\'e3\'e0\'fe\'f2 \'fd\'ea\'f1\'ea\'eb\'fe\'e7\'e8\'e2\'ed\'fb\'e5 \'ef\'f0\'e5\'e8\'ec\'f3\'f9\'e5\'f1\'f2\'e2\'e0 \'e4\'eb\'ff \'e2\'e0\'f8\'e5\'e9 \'f0\'e0\'e1\'ee\'f2\'fb \'f1 Firebird.\par \par\'ca\'e0\'e6\'e4\'fb\'e9 \'e2\'ea\'eb\'e0\'e4, \'e1\'ee\'eb\'fc\'f8\'ee\'e9 \'e8\'eb\'e8 \'ec\'e0\'eb\'e5\'ed\'fc\'ea\'e8\'e9, \'e8\'e3\'f0\'e0\'e5\'f2 \'e2\'e0\'e6\'ed\'f3\'fe \'f0\'ee\'eb\'fc \'e2 \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'e8 \'e8\'ed\'ed\'ee\'e2\'e0\'f6\'e8\'ee\'ed\'ed\'ee\'f1\'f2\'e8 \'e8 \'ed\'e0\'e4\'e5\'e6\'ed\'ee\'f1\'f2\'e8 Firebird \'e4\'eb\'ff \'e2\'f1\'e5\'f5.\par \par\'cf\'ee\'f1\'e5\'f2\'e8\'f2\'e5 \'ed\'e0\'f8 \'e2\'e5\'e1-\'f1\'e0\'e9\'f2, \'f7\'f2\'ee\'e1\'fb \'f3\'e7\'ed\'e0\'f2\'fc \'ea\'e0\'ea \'e2\'fb \'ec\'ee\'e6\'e5\'f2\'e5 \'e2\'ed\'e5\'f1\'f2\'e8 \'f1\'e2\'ee\'e9 \'e2\'ea\'eb\'e0\'e4 \'e8 \'ef\'ee\'ec\'ee\'f7\'fc \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e8\'f2\'fc \'f1\'e2\'e5\'f2\'eb\'ee\'e5 \'e1\'f3\'e4\'f3\'f9\'e5\'e5 Firebird. \'d1\'ef\'e0\'f1\'e8\'e1\'ee, \'f7\'f2\'ee \'ff\'e2\'eb\'ff\'e5\'f2\'e5\'f1\'fc \'f6\'e5\'ed\'ed\'ee\'e9 \'f7\'e0\'f1\'f2\'fc\'fe \'f1\'ee\'ee\'e1\'f9\'e5\'f1\'f2\'e2\'e0 Firebird!\par \f1\lang2057\par }

0 commit comments

Comments
 (0)