From: Martin Mares Date: Sat, 23 Mar 2013 10:41:26 +0000 (+0100) Subject: MO: Project templater X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=28d1cfeba6612733f7626aa9fa6163a2a6970bf6;p=eval.git MO: Project templater --- diff --git a/mop/project/templater.pl b/mop/project/templater.pl new file mode 100755 index 0000000..e9a500c --- /dev/null +++ b/mop/project/templater.pl @@ -0,0 +1,227 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Glib qw(TRUE FALSE); +use Gtk2 -init; + +my ($where,$taskdir,$home)=('/mo/public/templater/','/mo/templates/',$ENV{'HOME'}); +my @tasks = map { s#.*/##; $_ } (glob "$taskdir/*"); +my $contestName = "MO-P"; + +sub create_template($$$$) { + my ($path,$task,$name,$ext)=@_; + return "Project cannot be created!" unless -d $path; + return "Specified project already exist!" if -d "$path/$name"; + mkdir "$path/$name" or return "Can not create project directory!"; + my %files = ( + c => { + "$where/template-c.cbp" => "$task.cbp", + "$where/template.layout" => "$task.layout", + "$taskdir/$task/$task.c" => "$task.c", + "$taskdir/$task/$task-main.c" => "$task-main.c", + "$taskdir/$task/$task.h" => "$task.h", + }, + cpp => { + "$where/template-cpp.cbp" => "$task.cbp", + "$where/template.layout" => "$task.layout", + "$taskdir/$task/$task.cpp" => "$task.cpp", + "$taskdir/$task/$task-main.cpp" => "$task-main.cpp", + "$taskdir/$task/$task.h" => "$task.h", + }, + pas => { + "$where/template-pas.lpi" => "${task}_main.lpi", + "$taskdir/$task/$task.pas" => "$task.pas", + "$taskdir/$task/${task}_main.pas" => "${task}_main.lpr", + } + ); + my $files = $files{$ext} // die "Unknown ext $ext\n"; + while (my ($file, $target) = each %$files) { + $target="$path/$name/$target"; + # FUJ! S tímhle by se něco mělo dělat. + system("sed 's#fILENAMe#$name#; + s#fILENAMEEXt#$name.$ext#; + s#tASk#$task#; + s#tASKEXt#$task.$ext#; + s#pATHFILENAMe#$path/$name/$name#; + s#pATHFILENAMEEXt#$path/$name/$name.$ext#; + ' < '$file' > '$target'"); + } + return ""; +} + +sub open_project($) { + my ($p)=@_; + my $cmd; + my @files = glob "$home/$p/*.cbp"; + if (@files) { + $cmd = 'codeblocks'; + } else { + $cmd = 'lazarus-ide'; + @files = ((glob "$home/$p/*.lpi"), (glob "$home/$p/*.pas")); + } + print("@files\n"); + system("$cmd @files &"); +} + +sub existing_projects($) { + my ($lopen_data,$lang)=@_; + foreach ((glob "$home/*/*.cbp"), (glob "$home/*/*.lpr")) { + my ($name, $task) = m#.*/(.*?)/(.*)(_main\.lpr|\.cbp)#; + print "$name $task\n"; + $lang=-f "$home/$name/$task.c" ? 'C' : -f "$home/$name/$task.cpp" ? 'C++' : -f "$home/$name/$task.pas" ? 'Pascal' : ''; + $lopen_data->set($lopen_data->append, 0, "$1", 1, $lang); + } +} + +sub main_window() { + my $retcode=''; + + my $w=Gtk2::Window->new('toplevel'); + $w->signal_connect('destroy' => sub { $retcode='quit' unless length $retcode; Gtk2->main_quit; }); + $w->set_default_icon_from_file("$where/templater.xpm"); + $w->set_position('center'); + $w->set_default_size(600,-1); + $w->set_title("$contestName project management"); + my $b=Gtk2::VBox->new(FALSE,0); + $b->set_border_width(10); + $w->add($b); + + my $fnew=Gtk2::Frame->new("Create new $contestName contest project"); + my $xnew=Gtk2::HBox->new(FALSE,0); + $xnew->set_border_width(10); + my $inew=Gtk2::Image->new_from_file("$where/templater.xpm"); + my $bnew=Gtk2::Button->new_with_label("Create new $contestName contest project"); + $bnew->signal_connect('clicked' => sub { $retcode='new'; $w->destroy; }); + $xnew->pack_start($inew,FALSE,TRUE,10); + $xnew->pack_start($bnew,TRUE,TRUE,10); + $fnew->add($xnew); + $b->pack_start($fnew,FALSE,TRUE,10); + + my $fopen=Gtk2::Frame->new("Open existing $contestName contest project"); + my $yopen=Gtk2::VBox->new(FALSE,0); $yopen->set_border_width(5); + my $xopen=Gtk2::HBox->new(FALSE,0); $xopen->set_border_width(5); + my $lopen_data=Gtk2::ListStore->new(('Glib::String','Glib::String')); + existing_projects($lopen_data); + my $lopen=Gtk2::TreeView->new_with_model($lopen_data); + my $lopen_c1=Gtk2::TreeViewColumn->new_with_attributes('Project name',Gtk2::CellRendererText->new, text=>0); + my $lopen_c2=Gtk2::TreeViewColumn->new_with_attributes('Language',Gtk2::CellRendererText->new, text=>1); + $lopen_c1->set_expand(TRUE); $lopen->append_column($lopen_c1); $lopen->append_column($lopen_c2); + my $iopen=Gtk2::Image->new_from_file("$where/templater.xpm"); + my $bopen=Gtk2::Button->new_with_label("Open existing $contestName contest project"); + $bopen->signal_connect('clicked' => sub { open_project $lopen_data->get(scalar($lopen->get_selection->get_selected),0), + $w->destroy; }); + $bopen->set_sensitive(FALSE); + $lopen->signal_connect('row-activated' => sub { $bopen->clicked }); + $lopen->get_selection->set_mode('single'); + $lopen->get_selection->signal_connect('changed' => sub { $bopen->set_sensitive(TRUE) } ); + $xopen->pack_start($iopen,FALSE,TRUE,10); + $xopen->pack_start($bopen,TRUE,TRUE,10); + $yopen->pack_start($lopen,TRUE,TRUE,5); + $yopen->pack_start($xopen,FALSE,TRUE,5); + $fopen->add($yopen); + $b->pack_start($fopen,TRUE,TRUE,10); + + my $bquit=Gtk2::Button->new_from_stock('gtk-quit'); + $bquit->signal_connect('clicked' => sub { $w->destroy; }); + $b->pack_start($bquit,FALSE,TRUE,5); + + $w->show_all; + Gtk2->main; + $retcode; +} + +sub message($$$) { + my $m=Gtk2::MessageDialog->new($_[0], 'modal', $_[2], 'ok', $_[1]); + $m->run; + $m->destroy; + 1 +} + +sub new_window() { + my $retcode=''; + + my $w=Gtk2::Window->new('toplevel'); + $w->signal_connect('destroy' => sub { $retcode='quit' unless length $retcode; Gtk2->main_quit; }); + $w->set_default_icon_from_file("$where/templater.xpm"); + $w->set_position('center'); + $w->set_default_size(500,-1); + $w->set_title("Create new $contestName project"); + + my $b=Gtk2::VBox->new(FALSE,0); + $b->set_border_width(10); + $w->add($b); + + my $flang=Gtk2::Frame->new('Choose project language'); + my $xlang=Gtk2::HBox->new(FALSE,0); + $xlang->set_border_width(10); + my $r_c=Gtk2::RadioButton->new_with_label(undef, 'C'); + my $r_cpp=Gtk2::RadioButton->new_with_label($r_c->get_group(), 'C++'); + my $r_pas=Gtk2::RadioButton->new_with_label($r_c->get_group(), 'Pascal'); + $r_c->set_active(TRUE); + $xlang->pack_start($r_c,TRUE,TRUE,5); + $xlang->pack_start($r_cpp,TRUE,TRUE,5); + $xlang->pack_start($r_pas,TRUE,TRUE,5); + $flang->add($xlang); + $b->pack_start($flang,FALSE,TRUE,10); + + my $ftask=Gtk2::Frame->new('Choose task'); + my $xtask=Gtk2::HBox->new(FALSE,0); + $xtask->set_border_width(10); + my $group; + my $task = $tasks[0]; + for my $t (@tasks) { + my $rb=Gtk2::RadioButton->new_with_label($group, $t); + $rb->signal_connect(clicked => sub { + $task = $t; + }); + unless ($group) { + $rb->set_active(TRUE); + $group=$rb->get_group(); + } + $xtask->pack_start($rb,TRUE,TRUE,5); + } + $ftask->add($xtask); + $b->pack_start($ftask,FALSE,TRUE,10); + + my $fprj=Gtk2::Frame->new('Enter project name'); + my $eprj=Gtk2::Entry->new; + $fprj->add($eprj); + $b->pack_start(Gtk2::HBox->new(),TRUE,TRUE,0); + $b->pack_start($fprj,FALSE,TRUE,10); + + my $xcreate=Gtk2::HBox->new(FALSE,0); + $xcreate->set_border_width(10); + my $icreate=Gtk2::Image->new_from_file("$where/templater.xpm"); + my $bcreate=Gtk2::Button->new_from_stock('gtk-new'); + my $qcreate=Gtk2::Button->new_from_stock('gtk-cancel'); + $bcreate->signal_connect('clicked' => sub { + my $p=$eprj->get_text; $p =~ s/^\s*//; $p =~ s/\s*$//; + if ($p =~ /\W/) { + message($w, 'Sorry, but be nice with the project name!', 'error'); + return; + } + if (not length $p) { + message($w, 'No project name specified!', 'error'); + return; + } + my $ret=create_template $home, $task, $p, ($r_c->get_active ? 'c' : $r_cpp->get_active ? 'cpp' : 'pas'); + length $ret and message($w,$ret,'error') and return; + open_project $p; + $retcode='new'; + $w->destroy; + }); + $qcreate->signal_connect('clicked' => sub { $w->destroy; }); + $xcreate->pack_start($icreate,FALSE,TRUE,10); + $xcreate->pack_start($bcreate,TRUE,TRUE,10); + $xcreate->pack_start($qcreate,TRUE,TRUE,10); + $b->pack_start(Gtk2::HBox->new(),TRUE,TRUE,0); + $b->pack_start($xcreate,FALSE,TRUE,10); + + $w->show_all; + Gtk2->main; + $retcode; +} + +while (main_window eq 'new') { + new_window eq 'quit' or exit 0; +} diff --git a/mop/project/templater/template-c.cbp b/mop/project/templater/template-c.cbp new file mode 100644 index 0000000..08f7b7f --- /dev/null +++ b/mop/project/templater/template-c.cbp @@ -0,0 +1,53 @@ + + + + + + diff --git a/mop/project/templater/template-cpp.cbp b/mop/project/templater/template-cpp.cbp new file mode 100644 index 0000000..3dab2e1 --- /dev/null +++ b/mop/project/templater/template-cpp.cbp @@ -0,0 +1,53 @@ + + + + + + diff --git a/mop/project/templater/template-pas.lpi b/mop/project/templater/template-pas.lpi new file mode 100644 index 0000000..d4ba0af --- /dev/null +++ b/mop/project/templater/template-pas.lpi @@ -0,0 +1,100 @@ + + + + + + + + + + + + + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + </General> + <i18n> + <EnableI18N LFM="False"/> + </i18n> + <VersionInfo> + <StringTable ProductVersion=""/> + </VersionInfo> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> + <ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + <LaunchingApplication PathPlusParams="/usr/bin/rxvt-unicode -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> + </local> + </RunParams> + <RequiredPackages Count="1"> + <Item1> + <PackageName Value="LCL"/> + </Item1> + </RequiredPackages> + <Units Count="2"> + <Unit0> + <Filename Value="tASk_main.lpr"/> + <IsPartOfProject Value="True"/> + <UnitName Value="tASk_main"/> + </Unit0> + <Unit1> + <Filename Value="tASk.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Form1"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="tASk"/> + </Unit1> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <Target> + <Filename Value="tASk"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <SyntaxMode Value="fpc"/> + <CStyleOperator Value="False"/> + <CPPInline Value="False"/> + <UseAnsiStrings Value="False"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <Checks> + <IOChecks Value="True"/> + <RangeChecks Value="True"/> + </Checks> + </CodeGeneration> + <Other> + <WriteFPCLogo Value="False"/> + <CompilerMessages> + <MsgFileName Value=""/> + </CompilerMessages> + <CompilerPath Value="$(CompPath)"/> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/mop/project/templater/template.layout b/mop/project/templater/template.layout new file mode 100644 index 0000000..96dcbd6 --- /dev/null +++ b/mop/project/templater/template.layout @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> +<CodeBlocks_layout_file> + <ActiveTarget name="Debug" /> + <File name="tASKEXt" open="1" top="0" tabpos="1"> + <Cursor position="0" topLine="0" /> + </File> +</CodeBlocks_layout_file> diff --git a/mop/project/templater/templater.xpm b/mop/project/templater/templater.xpm new file mode 100644 index 0000000..348a956 --- /dev/null +++ b/mop/project/templater/templater.xpm @@ -0,0 +1,295 @@ +/* XPM */ +static char *kdevelop[] = { +/* columns rows colors chars-per-pixel */ +"32 32 257 2", +" c #000000", +". c #04040C", +"X c #000D00", +"o c #0B0B0E", +"O c #0D0D10", +"+ c #071700", +"@ c #001A00", +"# c #131316", +"$ c #14141A", +"% c #19191D", +"& c #1B1B24", +"* c #1F1F2C", +"= c #15152A", +"- c #002B00", +"; c #003E00", +": c #0A3000", +"> c #153D03", +", c #212126", +"< c #22222C", +"1 c #2C2C35", +"2 c #2D2D3B", +"3 c #34343F", +"4 c #373748", +"5 c #383844", +"6 c #004F00", +"7 c #005600", +"8 c #015900", +"9 c #095C00", +"0 c #164A02", +"q c #195502", +"w c #006500", +"e c #006C00", +"r c #404047", +"t c #40404A", +"y c gray29", +"u c #424252", +"i c #484852", +"p c #4A4A5C", +"a c #535355", +"s c #54545C", +"d c #5C5C5D", +"f c #5C5C6B", +"g c #5B5B71", +"h c #636363", +"j c #63636C", +"k c #6B6B6B", +"l c #686776", +"z c #70707C", +"x c #7C7C7C", +"c c #747474", +"v c #727283", +"b c #7D7C8C", +"n c #79778C", +"m c #7B7B93", +"M c #7F7FBF", +"N c #0A8A04", +"B c #029B00", +"V c #079906", +"C c #108F0A", +"Z c #118D00", +"A c #189207", +"S c #1F9C1C", +"D c #0DA400", +"F c #07A300", +"G c #14A301", +"H c #1DAD01", +"J c #1DA91B", +"K c #29911F", +"L c #298E28", +"P c #309A29", +"I c #20AD00", +"U c #23A716", +"Y c #2AB300", +"T c #2EB802", +"R c #27B601", +"E c #39AC01", +"W c #33B902", +"Q c #3CB200", +"! c #37B716", +"~ c #2AA920", +"^ c #30AA2C", +"/ c #30A828", +"( c #34B027", +") c #3BC102", +"_ c #439A3E", +"` c #40A71D", +"' c #42BC05", +"] c #5ABB0E", +"[ c #47A726", +"{ c #4EBD35", +"} c #46B63C", +"| c #58A82C", +" . c #78B93D", +".. c #69B42A", +"X. c #49B449", +"o. c #50BB4C", +"O. c #5BBF54", +"+. c #5FBE58", +"@. c #55BB51", +"#. c #61AF4E", +"$. c #64B440", +"%. c #62BD5C", +"&. c #72B544", +"*. c #77B46F", +"=. c #4DCA01", +"-. c #48C408", +";. c #4BC31C", +":. c #54CE07", +">. c #54CB1C", +",. c #5ED700", +"<. c #68D800", +"1. c #75C91A", +"2. c #7DD610", +"3. c #6AC714", +"4. c #6CD233", +"5. c #71D634", +"6. c #7AE200", +"7. c #61C252", +"8. c #72C35C", +"9. c #7BD541", +"0. c #6DC46B", +"q. c #65C463", +"w. c #75C96C", +"e. c #73C76F", +"r. c #73C672", +"t. c #7CC878", +"y. c #84CD27", +"u. c #89CB36", +"i. c #81EA15", +"p. c #87F000", +"a. c #90EC18", +"s. c #98F90D", +"d. c #80E136", +"f. c GreenYellow", +"g. c #ABFF24", +"h. c #A6F832", +"j. c #8DC949", +"k. c #8ADF4D", +"l. c #95C85B", +"z. c #83C47F", +"x. c #91C577", +"c. c #8CE245", +"v. c #9BEF43", +"b. c #9FE960", +"n. c #A3CB7B", +"m. c #A3E276", +"M. c #B0F263", +"N. c #BCF678", +"B. c #838383", +"V. c #83838B", +"C. c #8A8A8A", +"Z. c #8A8A9D", +"A. c #848497", +"S. c #90909E", +"D. c #9A9A9B", +"F. c #929293", +"G. c #8E8DA4", +"H. c #9494A3", +"J. c #9A9AAC", +"K. c #9594A7", +"L. c #9E9EB2", +"P. c #A9A8AD", +"I. c #A5A3B9", +"U. c #AEABB3", +"Y. c #ABABBB", +"T. c #A6A5BA", +"R. c #B2AEBE", +"E. c #B1B1B1", +"W. c #ACAAC0", +"Q. c #AAA5C1", +"!. c #B2B2C4", +"~. c #B6B4CA", +"^. c #BCBBCB", +"/. c #BEBCD1", +"(. c #85CE85", +"). c #89CF89", +"_. c #8CCD85", +"`. c #89D086", +"'. c #8AD089", +"]. c #87D082", +"[. c #96C588", +"{. c #97C295", +"}. c #92D293", +"|. c #A8C596", +" X c #A7DE93", +".X c #AACFA1", +"XX c #A6D0A0", +"oX c #A7D1A8", +"OX c #A4DAA4", +"+X c #A7DDA8", +"@X c #AAD3A5", +"#X c #A8DBA8", +"$X c #B3D0A1", +"%X c #B3DEB2", +"&X c #B0D5B0", +"*X c #BDF288", +"=X c #AFE2AE", +"-X c #B4E5B4", +";X c #C3BFD6", +":X c #C7F2A5", +">X c #D6FBB1", +",X c #C3C2C5", +"<X c #C0C0CD", +"1X c #C4C9CA", +"2X c #C8C8C9", +"3X c #C4C4D2", +"4X c #CBCAD6", +"5X c #CBCBD9", +"6X c #C8C4D6", +"7X c #C2D9C5", +"8X c #CCDCC6", +"9X c #CBDCCE", +"0X c #CED4D6", +"qX c #CFDBD0", +"wX c #D0CDDE", +"eX c #D1DDCD", +"rX c #D2D1D5", +"tX c #D3D3DD", +"yX c #D8D8DB", +"uX c #D5D3E4", +"iX c #D9D4E6", +"pX c #DBDBE4", +"aX c #DDDBEB", +"sX c #C0E6C0", +"dX c #CCE9C8", +"fX c #DAE2DC", +"gX c #D5E1D5", +"hX c #D6F1D6", +"jX c #DEF2DE", +"kX c #DEE0E3", +"lX c #E4DEEE", +"zX c #E1DFE4", +"xX c #E6FFC8", +"cX c #E3FDC0", +"vX c #E9F6DD", +"bX c #E2E2E5", +"nX c #E4E2EA", +"mX c #E8E5ED", +"MX c #EAEAEE", +"NX c #E0EAE0", +"BX c #EAE3F2", +"VX c #ECEBF1", +"CX c #EEECF8", +"ZX c #E4F4E4", +"AX c #EBF5EB", +"SX c #EAF8EA", +"DX c #F2EDF8", +"FX c #F9FFEF", +"GX c #F5FDEA", +"HX c #F2F2F5", +"JX c #F6F6F9", +"KX c #F4FAF3", +"LX c #F7FDF8", +"PX c #F9F5FC", +"IX c #FAFCF7", +"UX c #FDFCFD", +"YX c None", +/* pixels */ +"YXYXYX# B. YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX", +"YXYX A.UXV.v z YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX", +"YXYXYX1 Y.pXpXpXb & YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX", +"YXYXYXYXk nXUXUXMXJ.4 = S.b YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX", +"YXYXYXYXf MXUXUXUXUX!.J.BXK.- e e w 8 9 - YXYXYXYXYXYXYXYXYXYXYX", +"YXYXYXYX. H.JXUXUXMXnXJX{.L C ^ X.X.( K N 8 @ YXYXYXYXYXYXYXYXYX", +"YXYXYXYXYX1 <XUXMXBXfX_ P `.hXSXLXLXKXSX-Xq.C ; YXYXYXYXYXYXYX", +"YXYXYXYXYX f 5XnXgXK %.hXSXZXjXjXjXjXjXAXSX=X^ 6 YXYXYXYXYXYX", +"YXYXYXYXYXYX$ ~.AXP %.dXsXsXsXsXsXsXsXsXsXsXdX=XU ; YXYXYXYXYXYX", +"YXYXYXYXYXYXa PX*.U #X#XOXOXOXOXOXOXOXOXOXOXOX%Xt.C @ YXYXYXYXYX", +"YXYXYXYXYXYXP.kXA @.}.).].].`.).`.].`.`.'.'.).).].J 9 YXYXYXYX", +"YXM I.J.J.G.lX[.B X.r.0.z.oX7X9X7X&X`.w.w.r.e.r.0.J Z + YXYXYXYX", +"f <X<X4XyXtXVX#.B ^ @.[.pXJXUXUXUXUXMXoX7.7.7.+.@.V G : YXYXYXYX", +"s JXUXUXUXnXbX[ B V (.mXPXJXJXUXUXHXmXlXXX{ { } ( B H 0 YXYXYXYX", +"s UXUXUXUXnXkX` D ~ rXDXJXHXMXyX,XE.P.zXBX8.! ! H D I q YXYXYX", +"a aXHXUXUXnXbX[ D z.VXMXrXU.F.B.B.x D.mXBX.XW Y I G R 0 YXYXYX", +"$ i l A.Y.~.aX .I $XU.k h h h k k h E.MXlXeX' W Y I T > YXYXYXYX", +"YX . $ u aXx.Y %X6Xa y d d h d h rXMXMXfX-.W W W E + YXYXYXYX", +"YXYXYXYXYX R.dXQ XUXrXc d k c k F.HXMXDX8X=.-.;.) | n * YXYXYX", +"YXYXYXYXYXYXs DX&.9.UXUXbXC.c x x 2XIXHXPXm.:.5.>.' |.~.$ YXYXYX", +"YXYXYXYXYXYX1 6XeX] :XUXUXMXD.C.D.HXUXUXvXc.k.5.=.&.wXv YXYXYX", +"YXYXYXYXYX J.<XpX$X3.>XUXUXUX,XrXIXUXGX*Xb.5.<...1XT.L.t YXYXYX", +"YXYXYXYXYXk tXJX5XiX$X1.M.xXIXLXKXFXcXN.v.i.<. .1XQ.<XtXA.. YXYX", +"YXYXYXYX3 ~.HXUXJX5XuXeXj.2.a.h.f.g.s.p.6.1.[.rXQ.^.VXnX~.p YX", +"YXYXYX H.MXUXJXUXnXK.I.aX9Xn.j.y.y.u.l.|.0X/.G.!.bXmXkXpXG.& YX", +"YXYXYX z nXUXJX5Xb 2 o 5 G.;X5X6X3X6X3XQ.l & % v W.tXnXpXJ.* YX", +"YXYXYXYX f tXY.p o YX b ^.3X^.^.G.< YX 3 A./.L.3XH.o ", +"YXYXYXYXYX 4 < YXYXYXYXj iXHXHXnXA.. YXYXYXYXYXo u 2 H.aX1 ", +"YXYXYXYXYXYX YXYXYXYXYXYX5 3XMXMXwXg YXYXYXYXYXYX # 3 ", +"YXYXYXYXYXYXYXYXYXYXYXYXYXYX< Y.HXHX3X4 YXYXYXYXYXYXYXYXYX YX", +"YXYXYXYXYXYXYXYXYXYXYXYXYXYX. Z.3X<XK.& YXYXYXYXYXYXYXYXYXYXYXYX", +"YXYXYXYXYXYXYXYXYXYXYXYXYXYX & , & & . YXYXYXYXYXYXYXYXYXYXYXYX" +};