osc-vnc 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +169 -0
  6. data/Rakefile +1 -0
  7. data/config/script.yml +35 -0
  8. data/examples/desktop/xstartup +5 -0
  9. data/examples/paraview/fvwm/fvwmrc +80 -0
  10. data/examples/paraview/fvwm/winxp/images/close-activedown.xpm +237 -0
  11. data/examples/paraview/fvwm/winxp/images/close-activeup.xpm +286 -0
  12. data/examples/paraview/fvwm/winxp/images/close-inactive.xpm +88 -0
  13. data/examples/paraview/fvwm/winxp/images/maximize-activedown.xpm +190 -0
  14. data/examples/paraview/fvwm/winxp/images/maximize-activeup.xpm +257 -0
  15. data/examples/paraview/fvwm/winxp/images/maximize-inactive.xpm +66 -0
  16. data/examples/paraview/fvwm/winxp/images/title-active.xpm +58 -0
  17. data/examples/paraview/fvwm/winxp/images/title-inactive.xpm +58 -0
  18. data/examples/paraview/xstartup +17 -0
  19. data/examples/totalsim-desktop/config/menus/applications.menu +84 -0
  20. data/examples/totalsim-desktop/config/menus/settings.menu +20 -0
  21. data/examples/totalsim-desktop/images/TS_LOGO.jpg +0 -0
  22. data/examples/totalsim-desktop/xlogout +8 -0
  23. data/examples/totalsim-desktop/xstartup +20 -0
  24. data/lib/osc/vnc/connview.rb +95 -0
  25. data/lib/osc/vnc/error.rb +6 -0
  26. data/lib/osc/vnc/listenable.rb +45 -0
  27. data/lib/osc/vnc/scriptview.rb +63 -0
  28. data/lib/osc/vnc/session.rb +116 -0
  29. data/lib/osc/vnc/version.rb +6 -0
  30. data/lib/osc/vnc.rb +23 -0
  31. data/osc-vnc.gemspec +26 -0
  32. data/templates/conn/awesim.mustache +1 -0
  33. data/templates/conn/jnlp.mustache +49 -0
  34. data/templates/conn/novnc.mustache +1 -0
  35. data/templates/conn/osxvnc.mustache +1 -0
  36. data/templates/conn/terminal.mustache +1 -0
  37. data/templates/conn/txt.mustache +4 -0
  38. data/templates/conn/vnc.mustache +1 -0
  39. data/templates/conn/yaml.mustache +6 -0
  40. data/templates/script/_port_helpers.mustache +28 -0
  41. data/templates/script/_setup_env.mustache +7 -0
  42. data/templates/script/_ssh_tunnel.mustache +28 -0
  43. data/templates/script/_start_vncserver.mustache +38 -0
  44. data/templates/script/_tcp_server.mustache +6 -0
  45. data/templates/script/server.mustache +46 -0
  46. data/templates/script/vnc.mustache +86 -0
  47. metadata +153 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cbe041b5ff1e10a7d5e977d28a299a3c58ccd8d5
4
+ data.tar.gz: 9f2a6dc121713f6124e3d29f79d59dfca43d0ab0
5
+ SHA512:
6
+ metadata.gz: 8a1d89ddb96dc57d38b0b42e1c4f5bf0bb2ef18852048c07bb7124fd8ec858e4e383e28ddbdea544447ed3f7a681c044b4e941eb24d7ec0297d8249f7a0a3c61
7
+ data.tar.gz: f4516b6091852f4433817a65085d96c8f37061626add5828aa792f3ee6c2e41dff999c7934d8f6a041b381fd0520d20ea1f9752e895fbe5d584f0fa008c7fca7
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ vendor/
19
+ *.lock
20
+ *.swp
21
+ *.output
22
+ *.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in osc-vnc.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014-2016 Ohio Supercomputer Center
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,169 @@
1
+ # OSC::VNC
2
+
3
+ Ruby library that provides VNC job submission to the OSC systems.
4
+
5
+ ## Usage
6
+
7
+ Add this gem to your Gemfile:
8
+
9
+ ```ruby
10
+ gem 'osc-vnc'
11
+ ```
12
+
13
+ Run Bundler to update your gems:
14
+
15
+ ```bash
16
+ $ bundle install
17
+ ```
18
+
19
+ ## Examples
20
+
21
+ ### Run App on Oxymoron Batch System
22
+
23
+ For all cases we will need to create a new VNC session object. To create a VNC
24
+ session object you need to supply it the required information:
25
+
26
+ * a `PBS::Job` object that connects to the specified batch server
27
+ * the PBS script that will run when the job is submitted, defined by
28
+ * type of script (`:vnc` or `:server`)
29
+ * `:vnc` launches a VNC server
30
+ * `:server` doesn't launch a VNC server (expects developer specified server in `xstartup`)
31
+ * cluster type (`:glenn`, `:oakley`, `:ruby`), not to be confused with the
32
+ batch server (i.e., `quick-batch` can use `:oakley` or `:ruby`)
33
+
34
+ A bare bones setup would be:
35
+
36
+ ```ruby
37
+ job = PBS::Job.new(conn: PBS::Conn.batch('quick'))
38
+ script = OSC::VNC::ScriptView.new(
39
+ :vnc,
40
+ 'oakley',
41
+ :subtype => :shared,
42
+ :xstartup => '/path/to/script',
43
+ :outdir => ENV['PWD']
44
+ )
45
+
46
+ session = OSC::VNC::Session.new(job, script)
47
+ ```
48
+
49
+ In most cases we will want to supply more options for finer control of the
50
+ session:
51
+
52
+ ```ruby
53
+ # Headers are the PBS headers you see at the top of a PBS batch job.
54
+ # They are defined similarly here accept the header argument
55
+ # is used as a key in the PBS::ATTR hash object
56
+ # e.g., for a PBS job name (#PBS -N MyVNCJob)
57
+ headers = { PBS::ATTR[:N] => "MyVNCJob" }
58
+
59
+ # Resources are the attributes in the PBS batch job given with `-l`.
60
+ # e.g., for walltime (#PBS -l walltime=24:00:00)
61
+ resources = { walltime: "24:00:00" }
62
+
63
+ # Environment variables can also be passed to the script
64
+ envvars = { DATAFILE: "/path/to/datafile" }
65
+ ```
66
+
67
+ To submit the VNC session, use the `#submit` instance method on the object:
68
+
69
+ ```ruby
70
+ session.submit(headers: headers, resources: resources, envvars: envvars)
71
+ ```
72
+
73
+ After enough time has passed and the session is runninq in the batch system
74
+ (i.e., not queued) there are a variety of formats to output the connection
75
+ information. The most user-friendly being the `*.jnlp` format if the user has
76
+ Java installed:
77
+
78
+ ```ruby
79
+ conn_info = OSC::VNC::ConnView.new(session)
80
+ conn_info.render(:jnlp)
81
+ ```
82
+
83
+ **Note:** Once someone successfully authenticates with the VNC server the
84
+ password will change if using `vncauth` form of authentication. So it is
85
+ imperative that you run `ConnView#refresh` to update the connection
86
+ information.
87
+
88
+ ### VNC Server options
89
+
90
+ You can specify different options when running a vnc session. You can use the
91
+ `default` set of VNC options to submit the job with or choose from pre-defined
92
+ subtypes (i.e., `:shared`) found in [config/script.yml](config/script.yml).
93
+
94
+ You can alter these options when creating a session by specifying them as a
95
+ hash in the when initializing the `ScriptView` object. An example:
96
+
97
+ ```ruby
98
+ # Specify your personal VNC session options to override defaults
99
+ script = OSC::VNC::ScriptView.new(
100
+ :vnc,
101
+ 'oakley',
102
+ :subtype => :shared,
103
+ :geom => '1920x1200',
104
+ :'otp?' => false,
105
+ :'vncauth?' => true,
106
+ :'ssh_tunnel?' => true,
107
+ ...
108
+ )
109
+ ```
110
+
111
+ ### xstartup
112
+
113
+ An `xstartup` script is treated like any other bash script that launches the
114
+ application you want. If no environment variables are needed, it could
115
+ theoretically be run directly on an OSC desktop session by itself.
116
+
117
+ One such example would be launching Paraview:
118
+
119
+ ```bash
120
+ #!/bin/bash
121
+
122
+ # This loads up any Xresources the user specifies
123
+ # as well as gives the background a nice grey color
124
+ if [ -e $HOME/.Xresources ]; then
125
+ xrdb $HOME/.Xresources
126
+ fi
127
+ xsetroot -solid grey
128
+
129
+ # We need a window manager otherwise the windows will
130
+ # look horrendous, for this we use FVWM (please refer to
131
+ # FillSim for an example of the `fvwmrc` file used)
132
+ export XSTARTUP_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
133
+ XDIR=${XSTARTUP_DIR} /usr/bin/fvwm -f ${XSTARTUP_DIR}/fvwm/fvwmrc &
134
+
135
+ # Load the required modules on Oakley
136
+ . /etc/profile.d/lmod.sh
137
+ module load paraview/3.14.1
138
+
139
+ # If we are running this app on a node with an Xorg server running
140
+ # i.e., there is a GPU on this node that we can utilize for OpenGL
141
+ # graphics (which is true for the Oxymoron cluster)
142
+ module load virtualgl/2.3
143
+
144
+ # Now we start the application
145
+ vglrun paraview
146
+
147
+ # Be sure to clean up the VNC server after the user exits the above
148
+ # running process
149
+ vncserver -kill ${DISPLAY}
150
+ ```
151
+
152
+ You may or may not need VirtualGL depending on the type of application. Be sure
153
+ to only use it on a node with an Xorg server running. For any other node you
154
+ should omit it and its binary `vglrun`.
155
+
156
+ You can find a very generic example of an `fvwmrc` file in the
157
+ `containerfillsim` GitHub repo under the path:
158
+
159
+ ```bash
160
+ containerfillsim/jobs/vnc/paraview/fvwm/fvwmrc
161
+ ```
162
+
163
+ ## Contributing
164
+
165
+ 1. Fork it
166
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
167
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
168
+ 4. Push to the branch (`git push origin my-new-feature`)
169
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/config/script.yml ADDED
@@ -0,0 +1,35 @@
1
+ vnc:
2
+ default: &DEFAULT_VNC
3
+ name: 'vnc'
4
+ geom: '800x600'
5
+ dpi: 96
6
+ idletimeout: 0
7
+ extra_args: null
8
+ otp?: false
9
+ vncauth?: true
10
+ pam?: false
11
+ ssh_tunnel?: true
12
+ tcp_server?: false
13
+ novnc?: false
14
+ cluster:
15
+ oakley:
16
+ fonts: '/usr/share/X11/fonts/misc,/usr/share/X11/fonts/75dpi,/usr/share/X11/fonts/100dpi,/usr/share/X11/fonts/Type1,/usr/share/fonts/default/Type1'
17
+ load_turbovnc: |
18
+ module use /nfs/gpfs/PZS0645/local-oakley/share/modulefiles
19
+ module load turbovnc/2.0.0
20
+ novnc_launcher: '/usr/local/novnc/utils/launch.sh'
21
+ ruby:
22
+ fonts: '/usr/share/X11/fonts/misc,/usr/share/X11/fonts/100dpi,/usr/share/X11/fonts/Type1,/usr/share/fonts/default/Type1'
23
+ load_turbovnc: |
24
+ module use /nfs/gpfs/PZS0645/local-ruby/share/modulefiles
25
+ module load turbovnc/2.0.0
26
+ novnc_launcher: '/usr/local/novnc/utils/launch.sh'
27
+ shared:
28
+ <<: *DEFAULT_VNC
29
+ idletimeout: 300
30
+ tcp_server?: true
31
+
32
+ server:
33
+ default: &DEFAULT_SERVER
34
+ ssh_tunnel?: true
35
+ tcp_server?: false
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+
3
+ /etc/X11/xinit/xinitrc
4
+
5
+ vncserver -kill $DISPLAY
@@ -0,0 +1,80 @@
1
+ SetEnv XPMPath $[XDIR]/fvwm/winxp/images
2
+
3
+ # Makes the Maximize button look pressed-in when the window is maximized
4
+ Style * MWMButtons
5
+ # Allows turns off the mwm hints completely
6
+ Style * NoFuncHint
7
+ # Attempt to recognize & respect the mwm decoration hints that applications occasionally use
8
+ Style * MWMDecor
9
+ # Causes transient windows, which are normally left undecorated, to be given the usual fvwm decorations (title bar, buttons, etc.)
10
+ Style * DecorateTransient
11
+ Style * SmartPlacement
12
+
13
+ # Tells fvwm the maximum size window with which opaque window movement should be used
14
+ OpaqueMoveSize 100
15
+ # Specifies the percentage of a page to scroll when the cursor hits the edge of a page
16
+ EdgeScroll 100 100
17
+ # The special flag Clear clears any existing flags
18
+ ButtonStyle 2 - Clear
19
+ TitleStyle Active AdjustedPixmap $[XPMPath]/title-active.xpm -- Flat
20
+ TitleStyle Inactive AdjustedPixmap $[XPMPath]/title-inactive.xpm -- Flat
21
+ ButtonStyle 2 ActiveUp AdjustedPixmap $[XPMPath]/close-activeup.xpm -- UseTitleStyle Flat
22
+ ButtonStyle 2 ActiveDown AdjustedPixmap $[XPMPath]/close-activedown.xpm -- UseTitleStyle Flat
23
+ ButtonStyle 2 AllInactive AdjustedPixmap $[XPMPath]/close-inactive.xpm -- UseTitleStyle Flat
24
+ TitleStyle Centered Height 24
25
+ BorderStyle Active Colorset
26
+ BorderStyle Inactive Solid Dodgerblue2 -- HiddenHandles NoInset
27
+ BorderStyle Active Solid Steelblue3 -- HiddenHandles NoInset
28
+
29
+ ButtonStyle 4 - Clear
30
+ ButtonStyle 4 ActiveUp AdjustedPixmap $[XPMPath]/maximize-activeup.xpm -- UseTitleStyle Flat
31
+ ButtonStyle 4 ActiveDown AdjustedPixmap $[XPMPath]/maximize-activedown.xpm -- UseTitleStyle Flat
32
+ ButtonStyle 4 AllInactive AdjustedPixmap $[XPMPath]/maximize-inactive.xpm -- UseTitleStyle Flat
33
+
34
+ # BorderWidth - width of the border to place the window if it does not have resize-handles
35
+ # HandleWidth - width of the border to place the window if it does have resize-handles
36
+ Style * BorderWidth 4, HandleWidth 4
37
+ # ForeColor - foreground color (black)
38
+ # BackColor - background color (steelblue3)
39
+ Style * ForeColor black, BackColor Steelblue3
40
+ # HilightFore - window has focus foreground color (white)
41
+ # HilightBack - window has focus background color (dodgerblue2)
42
+ Style * HilightFore white, HilightBack Dodgerblue2
43
+ # Font - name of the font r-regular 14-size
44
+ Style * Font -*-helvetica-medium-r-*-*-14-*-*-*-*-*-*-*
45
+ # Start Windows in the top left corner unless the application specifies otherwise
46
+ Style * PositionPlacement
47
+ #Style * PositionPlacement Center
48
+
49
+ # R - root window
50
+ # W - application window
51
+ # D - desktop application
52
+ # T - window title-bar
53
+ # S - window side, top, or bottom bar
54
+ # F - window frame (corners)
55
+ # I - icon window
56
+ # 2 - 0-9 title-bar buttons
57
+ Mouse 0 RI A -
58
+ Mouse 0 2 A Close
59
+ Mouse 1 2 A Close
60
+ Mouse 2 2 A Close
61
+ Mouse 1 RSFTI A -
62
+ Mouse 2 RSFTI A -
63
+ Mouse 0 4 A Maximize 100 100
64
+ Mouse 1 T A Maximize-or-Move
65
+
66
+ AddToFunc Maximize-or-Move
67
+ + D Maximize
68
+ + C Raise
69
+ + C Focus
70
+ + M Move
71
+
72
+ DesktopSize 1x1
73
+
74
+ # Added below 3 to remove root menu, F1 & all help menus
75
+ DestroyMenu MenuFvwmRoot
76
+ Key F1 R A -
77
+ Silent Key Help R A -
78
+
79
+ # Wine fix
80
+ Style * Lenience
@@ -0,0 +1,237 @@
1
+ /* XPM */
2
+ static char *close-activedown[] = {
3
+ /* columns rows colors chars-per-pixel */
4
+ "23 23 208 2",
5
+ " c black",
6
+ ". c #003DAD",
7
+ "X c #053FB2",
8
+ "o c #0036CB",
9
+ "O c #0040AD",
10
+ "+ c #0041B3",
11
+ "@ c #0049B4",
12
+ "# c #0048C4",
13
+ "$ c #004ECD",
14
+ "% c #004CD2",
15
+ "& c #004EDA",
16
+ "* c #0056CA",
17
+ "= c #085ECB",
18
+ "- c #0052D3",
19
+ "; c #005BDC",
20
+ ": c #0053E1",
21
+ "> c #015AE5",
22
+ ", c #025FE8",
23
+ "< c #035CF4",
24
+ "1 c #0860CE",
25
+ "2 c #0864D8",
26
+ "3 c #1A64DF",
27
+ "4 c #0060E2",
28
+ "5 c #0164EA",
29
+ "6 c #096DEC",
30
+ "7 c #0165F3",
31
+ "8 c #0068F3",
32
+ "9 c #0269FD",
33
+ "0 c #486FAF",
34
+ "q c #4E78AE",
35
+ "w c #4D76B4",
36
+ "e c #A35642",
37
+ "r c #AD5E5E",
38
+ "t c #B2574F",
39
+ "y c #B35E46",
40
+ "u c #B5594F",
41
+ "i c #B05953",
42
+ "p c #B85C52",
43
+ "a c #B05F60",
44
+ "s c #B6614E",
45
+ "d c #B5615C",
46
+ "f c #B5695C",
47
+ "g c #BB6256",
48
+ "h c #B96359",
49
+ "j c #B96A5A",
50
+ "k c #AE6A6E",
51
+ "l c #B56362",
52
+ "z c #B96B64",
53
+ "x c #B2706C",
54
+ "c c #B87069",
55
+ "v c #B97A77",
56
+ "b c #EC6032",
57
+ "n c #EC6B3F",
58
+ "m c #F26839",
59
+ "M c #C0675A",
60
+ "N c #DC7155",
61
+ "B c #C36961",
62
+ "V c #C66C70",
63
+ "C c #C57075",
64
+ "Z c #C07079",
65
+ "A c #D07F65",
66
+ "S c #D17C76",
67
+ "D c #D57E7C",
68
+ "F c #EC6D45",
69
+ "G c #EC6F4A",
70
+ "H c #E3754E",
71
+ "J c #EA7242",
72
+ "K c #ED764D",
73
+ "L c #E77257",
74
+ "P c #E4715C",
75
+ "I c #E17957",
76
+ "U c #EB7451",
77
+ "Y c #EA7854",
78
+ "T c #ED7F5A",
79
+ "R c #F06C41",
80
+ "E c #F07348",
81
+ "W c #F27A4C",
82
+ "Q c #F8794F",
83
+ "! c #F07757",
84
+ "~ c #F37A53",
85
+ "^ c #E47F64",
86
+ "/ c #E57F6A",
87
+ "( c #EC7B63",
88
+ ") c #F57F61",
89
+ "_ c #BE7980",
90
+ "` c #C2816C",
91
+ "' c #CE856E",
92
+ "] c #D4896F",
93
+ "[ c #DD896D",
94
+ "{ c #D38678",
95
+ "} c #D28D76",
96
+ "| c #D58E7A",
97
+ " . c #D88D70",
98
+ ".. c #D6937C",
99
+ "X. c #DC917C",
100
+ "o. c #E78253",
101
+ "O. c #E3895F",
102
+ "+. c #EE805F",
103
+ "@. c #EE885E",
104
+ "#. c #F6814D",
105
+ "$. c #F48353",
106
+ "%. c #F3825B",
107
+ "&. c #E38362",
108
+ "*. c #E0846B",
109
+ "=. c #E78965",
110
+ "-. c #E68B6F",
111
+ ";. c #EC8160",
112
+ ":. c #E88B67",
113
+ ">. c #EF8B6D",
114
+ ",. c #E08B73",
115
+ "<. c #EB8D71",
116
+ "1. c #E69273",
117
+ "2. c #E3927A",
118
+ "3. c #ED9376",
119
+ "4. c #ED967B",
120
+ "5. c #EC9D7E",
121
+ "6. c #F38463",
122
+ "7. c #F18168",
123
+ "8. c #F38A6B",
124
+ "9. c #FA8E6F",
125
+ "0. c #F4926B",
126
+ "q. c #FD9063",
127
+ "w. c #F39172",
128
+ "e. c #F3947C",
129
+ "r. c #F3997B",
130
+ "t. c #FD9572",
131
+ "y. c #FC957B",
132
+ "u. c #F9997C",
133
+ "i. c #F6A27F",
134
+ "p. c #B08188",
135
+ "a. c #C59A8A",
136
+ "s. c #C09A94",
137
+ "d. c #D48A85",
138
+ "f. c #D48E88",
139
+ "g. c #D79181",
140
+ "h. c #D6938B",
141
+ "j. c #D39D8E",
142
+ "k. c #DB9483",
143
+ "l. c #D9938A",
144
+ "z. c #DB9A87",
145
+ "x. c #DD9A8C",
146
+ "c. c #D19A90",
147
+ "v. c #DC9799",
148
+ "b. c #DB9F91",
149
+ "n. c #DD9B9F",
150
+ "m. c #DB9FA0",
151
+ "M. c #D5A092",
152
+ "N. c #DDA398",
153
+ "B. c #D8AA9D",
154
+ "V. c #D7A5A4",
155
+ "C. c #DDA7A4",
156
+ "Z. c #D7B2B5",
157
+ "A. c #E5978C",
158
+ "S. c #E69B8A",
159
+ "D. c #E99780",
160
+ "F. c #EE998A",
161
+ "G. c #E59D90",
162
+ "H. c #F09787",
163
+ "J. c #F39A82",
164
+ "K. c #F99A81",
165
+ "L. c #F89F8A",
166
+ "P. c #E2A38C",
167
+ "I. c #E6A090",
168
+ "U. c #ECA59B",
169
+ "Y. c #F1A486",
170
+ "T. c #F3A48D",
171
+ "R. c #F8A181",
172
+ "E. c #FBA38E",
173
+ "W. c #F4A494",
174
+ "Q. c #F3AA9B",
175
+ "!. c #FCA391",
176
+ "~. c #F9A699",
177
+ "^. c #FCAC9A",
178
+ "/. c #FBB69E",
179
+ "(. c #FBBA9E",
180
+ "). c #E0A7A0",
181
+ "_. c #EBAFA6",
182
+ "`. c #E7B0A3",
183
+ "'. c #F4B4A4",
184
+ "]. c #F3B6AB",
185
+ "[. c #F6BAA3",
186
+ "{. c #F6BDAB",
187
+ "}. c #FBB7A2",
188
+ "|. c #FABBA4",
189
+ " X c #FAC4AC",
190
+ ".X c #F1C4B6",
191
+ "XX c #F1C8BC",
192
+ "oX c #FFCFB6",
193
+ "OX c #FFD5B9",
194
+ "+X c #CEDEFC",
195
+ "@X c #EBC9CA",
196
+ "#X c #E5CFD8",
197
+ "$X c #FFD6C0",
198
+ "%X c #FFDDCF",
199
+ "&X c #FFDED4",
200
+ "*X c #E8DFF1",
201
+ "=X c #FFEAD5",
202
+ "-X c #FFECDC",
203
+ ";X c #EBE2F3",
204
+ ":X c #FFECE2",
205
+ ">X c #F4E0F5",
206
+ ",X c #FFF5E7",
207
+ "<X c #FFF4EB",
208
+ "1X c #FFF8ED",
209
+ "2X c #FFF3F3",
210
+ "3X c #FFF9F3",
211
+ "4X c #FFFBFE",
212
+ "5X c None",
213
+ /* pixels */
214
+ "5X6 = = = = = = = = = = = = = = = = = = 2 3 5X",
215
+ "4 * +X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X+X; o ",
216
+ "@ +X*Xd d d d d r d d r d d d d d d d d ;X+X; ",
217
+ "+ 4Xd v @XC.N.j.j.j.j.h.h.k.d.| } ' ..` p.4X$ ",
218
+ ". 4Xd #X.X X|.|.Q.Q.Q.W.T.T.Y.J.J.e.<.^ x 4X$ ",
219
+ "X 4Xd Z. XoX(.}.Q.W.!.L.R.R.R.r.r.e.>.%.c 4X% ",
220
+ ". 4Xd V.[. X[.'.'.W.L.K.0.u.5.2.D.2.=.@.f 4X% ",
221
+ ". 4Xd n./.[.{.&X<XG.T.( t.<.[ z.,X$X=.H f 4X% ",
222
+ "X 4Xd n.^.Q.].:X3X1X..T./ ,.{ 1X1X=Xw.Y j 4X% ",
223
+ "+ 4Xd v.~.~.G.XX:X1X,Xz.{ b.1X1X,X<.L L z 4X% ",
224
+ "+ 4Xh l.K.!.H.G.`.1X3X4Xp.3X1X1XA N %.8.j 4X% ",
225
+ "+ 4Xr l.y.K.J.H.S.x.3X2X4X4X3X] ^ %.~ ! j 4X% ",
226
+ "+ 4Xd f.w.K.K.K.J.X.M.4X4X3Xa.*.U W F R g 4X& ",
227
+ "+ 4Xd d.8.u.u.e.H.S.1X4X4X3X1X1.@.E W Q j 4X& ",
228
+ "# 4Xd S 9.8.e.A.B.3X3X1XB.,X1X<X..o.#.R u 4X: ",
229
+ "$ 4Xd D ) t.e._.<X3X,XS...P.1X3X1XO.J ~ p 4X: ",
230
+ "$ 4Xd D 7.;.D.<X1X1X..T.=.1.] 1X1X=XY G u 4X> ",
231
+ "- 4Xd V 7.8.3.&X,Xk.5.N 0.0.O.2.-XOXK F s 4X> ",
232
+ "; 4Xr V ( ! T *.4.-.0.%.q.W $.Y @.W n m e 4X> ",
233
+ "5 4Xh Z P U %.8.^ ( 6.%.W $.#.W J E R b v 4X5 ",
234
+ "7 +X>Xv i B l r a l z r h g p p p p t k >X+X8 ",
235
+ "9 7 +X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X4X+X8 < ",
236
+ "5X9 7 , , , , , , , , , , , , , , , , , 7 < 5X"
237
+ };