osc-vnc 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ };