sequenceserver-beta 0.8.7.beta1

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 (56) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE.Apache.txt +176 -0
  4. data/LICENSE.txt +69 -0
  5. data/README.txt +5 -0
  6. data/bin/sequenceserver +82 -0
  7. data/config.ru +6 -0
  8. data/example.config.yml +39 -0
  9. data/lib/profile_code.rb +217 -0
  10. data/lib/sequenceserver.rb +527 -0
  11. data/lib/sequenceserver/blast.rb +92 -0
  12. data/lib/sequenceserver/customisation.rb +60 -0
  13. data/lib/sequenceserver/database.rb +29 -0
  14. data/lib/sequenceserver/database_formatter.rb +190 -0
  15. data/lib/sequenceserver/helpers.rb +136 -0
  16. data/lib/sequenceserver/sequencehelpers.rb +93 -0
  17. data/lib/sequenceserver/sinatralikeloggerformatter.rb +12 -0
  18. data/lib/sequenceserver/version.rb +9 -0
  19. data/public/css/beige.css.css +254 -0
  20. data/public/css/bootstrap.dropdown.css +29 -0
  21. data/public/css/bootstrap.icons.css +155 -0
  22. data/public/css/bootstrap.min.css +415 -0
  23. data/public/css/bootstrap.modal.css +28 -0
  24. data/public/css/custom.css +232 -0
  25. data/public/img/glyphicons-halflings-white.png +0 -0
  26. data/public/img/glyphicons-halflings.png +0 -0
  27. data/public/js/bootstrap.dropdown.js +92 -0
  28. data/public/js/bootstrap.modal.js +7 -0
  29. data/public/js/bootstrap.transition.js +7 -0
  30. data/public/js/jquery-scrollspy.js +98 -0
  31. data/public/js/jquery-ui.js +14987 -0
  32. data/public/js/jquery.activity.js +10 -0
  33. data/public/js/jquery.enablePlaceholder.min.js +10 -0
  34. data/public/js/jquery.js +5 -0
  35. data/public/js/sequenceserver.blast.js +208 -0
  36. data/public/js/sequenceserver.js +304 -0
  37. data/public/js/store.min.js +2 -0
  38. data/sequenceserver.gemspec +49 -0
  39. data/tests/database/nucleotide/Sinvicta2-2-3.cdna.subset.fasta +5486 -0
  40. data/tests/database/nucleotide/Sinvicta2-2-3.cdna.subset.fasta.nhr +0 -0
  41. data/tests/database/nucleotide/Sinvicta2-2-3.cdna.subset.fasta.nin +0 -0
  42. data/tests/database/nucleotide/Sinvicta2-2-3.cdna.subset.fasta.nsq +0 -0
  43. data/tests/database/protein/Sinvicta2-2-3.prot.subset.fasta +6449 -0
  44. data/tests/database/protein/Sinvicta2-2-3.prot.subset.fasta.phr +0 -0
  45. data/tests/database/protein/Sinvicta2-2-3.prot.subset.fasta.pin +0 -0
  46. data/tests/database/protein/Sinvicta2-2-3.prot.subset.fasta.psq +0 -0
  47. data/tests/run +26 -0
  48. data/tests/test_sequencehelpers.rb +77 -0
  49. data/tests/test_sequenceserver_blast.rb +60 -0
  50. data/tests/test_ui.rb +104 -0
  51. data/tests/test_ui.rb~ +104 -0
  52. data/tests/ui.specs.todo +10 -0
  53. data/views/500.erb +22 -0
  54. data/views/_options.erb +144 -0
  55. data/views/search.erb +220 -0
  56. metadata +226 -0
@@ -0,0 +1,93 @@
1
+ module SequenceServer
2
+ # Module to collect some sequence-related helper functions
3
+ module SequenceHelpers
4
+
5
+ # copied from bioruby's Bio::Sequence
6
+ # returns a Hash. Eg: composition("asdfasdfffffasdf")
7
+ # => {"a"=>3, "d"=>3, "f"=>7, "s"=>3}
8
+ def composition(sequence_string)
9
+ count = Hash.new(0)
10
+ sequence_string.scan(/./) do |x|
11
+ count[x] += 1
12
+ end
13
+ return count
14
+ end
15
+
16
+ # Strips all non-letter characters. guestimates sequence based on that.
17
+ # If less than 10 useable characters... returns nil
18
+ # If more than 90% ACGTU returns :nucleotide. else returns :protein
19
+ def guess_sequence_type(sequence_string)
20
+ cleaned_sequence = sequence_string.gsub(/[^A-Z]/i, '') # removing non-letter characters
21
+ cleaned_sequence.gsub!(/[NX]/i, '') # removing ambiguous characters
22
+
23
+ return nil if cleaned_sequence.length < 10 # conservative
24
+
25
+ composition = composition(cleaned_sequence)
26
+ composition_NAs = composition.select { |character, count|character.match(/[ACGTU]/i) } # only putative NAs
27
+ putative_NA_counts = composition_NAs.collect { |key_value_array| key_value_array[1] } # only count, not char
28
+ putative_NA_sum = putative_NA_counts.inject { |sum, n| sum + n } # count of all putative NA
29
+ putative_NA_sum = 0 if putative_NA_sum.nil?
30
+
31
+ if putative_NA_sum > (0.9 * cleaned_sequence.length)
32
+ return :nucleotide
33
+ else
34
+ return :protein
35
+ end
36
+ end
37
+
38
+ # splits input at putative fasta definition lines (like ">adsfadsf"), guesses sequence type for each sequence.
39
+ # if not enough sequence to determine, returns nil.
40
+ # if 2 kinds of sequence mixed together, raises ArgumentError
41
+ # otherwise, returns :nucleotide or :protein
42
+ def type_of_sequences(fasta_format_string)
43
+ # the first sequence does not need to have a fasta definition line
44
+ sequences = fasta_format_string.split(/^>.*$/).delete_if { |seq| seq.empty? }
45
+
46
+ # get all sequence types
47
+ sequence_types = sequences.collect { |seq| guess_sequence_type(seq) }.uniq.compact
48
+
49
+ return nil if sequence_types.empty?
50
+
51
+ if sequence_types.length == 1
52
+ return sequence_types.first # there is only one (but yes its an array)
53
+ else
54
+ raise ArgumentError, "Insufficient info to determine sequence type. Cleaned queries are: #{ sequences.to_s }"
55
+ end
56
+ end
57
+
58
+ def sequence_from_blastdb(ids, db) # helpful when displaying parsed blast results
59
+ # we know how to handle an Array of ids
60
+ ids = ids.join(',') if ids.is_a? Array
61
+
62
+ # we don't know what to do if the arguments ain't String
63
+ raise TypeError unless ids.is_a? String and db.is_a? String
64
+
65
+ # query now!
66
+ #
67
+ # If `blastdbcmd` throws error, we assume sequence not found.
68
+ blastdbcmd = settings.binaries['blastdbcmd']
69
+ %x|#{blastdbcmd} -db #{db} -entry '#{ids}' 2> /dev/null|
70
+ end
71
+
72
+ # Given a sequence_id and databases, apply the default (standard)
73
+ # way to convert a sequence_id into a hyperlink, so that the
74
+ # blast results include hyperlinks.
75
+ def construct_standard_sequence_hyperlink(options)
76
+ if options[:sequence_id].match(/^[^ ]/) #if there is a space right after the '>', makeblastdb was run without -parse_seqids
77
+ # By default, add a link to a fasta file of the sequence (if makeblastdb was called with -parse_seqids)
78
+
79
+ sid = options[:sequence_id].gsub(/<\/?[^>]*>/, '') # strip html
80
+ cid = sid[/^(\S+)\s*.*/, 1] # get id part
81
+ id = cid.include?('|') ? cid.split('|')[1] : cid.split('|')[0]
82
+ @all_retrievable_ids ||= []
83
+ @all_retrievable_ids.push(id)
84
+
85
+ link = "/get_sequence/?id=#{id}&db=#{options[:databases].join(' ')}" # several dbs... separate by ' '
86
+ return link
87
+ else
88
+ # do nothing - link == nil means no link will be incorporated
89
+ return nil
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,12 @@
1
+ module SequenceServer
2
+ # We change Logging format so that it is consistent with Sinatra's
3
+ class SinatraLikeLogFormatter < Logger::Formatter
4
+ MyFormat = "[%s] %s %s\n"
5
+ def initialize
6
+ self.datetime_format = "%Y-%m-%d %H:%M:%S"
7
+ end
8
+ def call(severity, time, progname, msg)
9
+ MyFormat % [format_datetime(time), severity, msg2str(msg)]
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module SequenceServer
2
+
3
+ # Return version number of SequenceServer from the gemspec. Version number
4
+ # is read from gemspec, which might fail on older versions of Bundler or
5
+ # RubyGems. Return `nil` if version number couldn't be determined.
6
+ def self.version
7
+ Bundler.rubygems.loaded_specs('sequenceserver').version rescue nil
8
+ end
9
+ end
@@ -0,0 +1,254 @@
1
+ body {
2
+ background-color: #2B3E42;
3
+ /*background: #3f4555;*/
4
+ font-family: Tahoma, Arial, sans-serif;
5
+ }
6
+
7
+ .container {
8
+ width: 800px;
9
+ margin: 50px auto;
10
+ background-color: white;
11
+ border: 2px solid white;
12
+ border-radius: 10px;
13
+ -moz-border-radius: 10px;
14
+ }
15
+
16
+ h1 {
17
+ margin: 0px;
18
+ padding: 0px;
19
+ }
20
+
21
+ .banner {
22
+ font-weight: bold;
23
+ background: #ebcd7b;
24
+ font-size: 300%;
25
+ font-family: Tahoma, Arial, sans-serif;
26
+ color: black;
27
+ padding: 2%;
28
+ margin-bottom: 2%;
29
+
30
+ border-bottom-left-radius: 0px;
31
+ border-bottom-right-radius: 0px;
32
+ border-top-left-radius: 10px;
33
+ border-top-right-radius: 10px;
34
+
35
+ -moz-border-radius-bottomleft: 0px;
36
+ -moz-border-radius-bottomright: 0px;
37
+ -moz-border-radius-topleft: 10px;
38
+ -moz-border-radius-topright: 10px;
39
+
40
+ }
41
+
42
+ .underbar {
43
+ background-color: #ebcd7b;
44
+ font-family:arial;
45
+ font-size: 12px;
46
+ text-align: center;
47
+ color: #333333;
48
+ padding: 1px 1px 1px 1px;
49
+ margin: 2% 0 0 0;
50
+ border-bottom-left-radius: 10px;
51
+ border-bottom-right-radius: 10px;
52
+ }
53
+
54
+
55
+ .entryfield {
56
+ padding:0;
57
+ margin:0;
58
+ }
59
+
60
+ .entryfield textarea {
61
+ padding:0;
62
+ margin:0;
63
+ width:100%;
64
+ height: 168px;
65
+ border-color:black;
66
+ }
67
+
68
+ .blastmethods {
69
+ float : right;
70
+ background : #222222;
71
+ border : none;
72
+ height : 150px;
73
+
74
+ border-top-right-radius : 10px;
75
+ border-top-left-radius : 0px;
76
+ border-bottom-right-radius: 10px;
77
+ border-bottom-left-radius : 0px;
78
+
79
+ -moz-border-radius-topright: 10px;
80
+ -moz-border-radius-topleft: 0px;
81
+ -moz-border-radius-bottomright: 10px;
82
+ -moz-border-radius-bottomleft: 0px;
83
+
84
+
85
+ font-size : 1.5em;
86
+ font-family: Tahoma, Arial, sans-serif;
87
+ color: black;
88
+ margin:0;
89
+ padding:0;
90
+ }
91
+
92
+ fieldset {
93
+ margin:0;
94
+ padding:0;
95
+ }
96
+
97
+ .horizontal {
98
+ margin: 2%;
99
+ padding-bottom:15px;
100
+ padding-top:15px;
101
+ width: 96%;
102
+ clear:both;
103
+ }
104
+
105
+ .rounded {
106
+ border-radius :10px;
107
+ -moz-border-radius:10px;
108
+ }
109
+
110
+ .box {
111
+ background : #D5E1DD;
112
+ /* background: -webkit-gradient(linear, left top, left bottom, from(#ccc), to(#000)); */
113
+
114
+ border : none;
115
+
116
+ padding : 10px;
117
+ margin: 0;
118
+ font-family : Tahoma, Arial, sans-serif;
119
+ color : black;
120
+ }
121
+
122
+ .databases {
123
+ width :46.5%;
124
+ }
125
+ .nucleotide {
126
+ float :left;
127
+ }
128
+ .protein {
129
+ float : right;
130
+ }
131
+
132
+ .radiobutton{
133
+ margin: 9px 5px 0px 0px;
134
+ padding: 0;
135
+ vertical-align: top;
136
+ }
137
+ .dbcheckbox { /* within each "database box" */
138
+ float:left;
139
+ clear:both;
140
+ margin: 5px 10px 0 0;
141
+ padding: 0;
142
+ }
143
+ .dbdescription {
144
+ float:left;
145
+ }
146
+
147
+ .advanced {
148
+ float:left;
149
+ width: 78%;
150
+ }
151
+
152
+ .greytext {
153
+ color: #A9A9A9;
154
+ }
155
+
156
+ .pointer {
157
+ cursor:pointer;
158
+ }
159
+
160
+ .advanced pre {
161
+ display: none;
162
+ }
163
+ .advanced input {
164
+ float:right;
165
+ width: 60%;
166
+ }
167
+
168
+ .submit_button {
169
+ float:right;
170
+ width: 17.5%;
171
+ }
172
+ .submit_button input {
173
+ width: 100%;
174
+ background-color : #323292;
175
+ background: -webkit-gradient(linear, left top, right bottom, from(#0066CC), to(#192D53));
176
+ background: -moz-linear-gradient(45deg,#0066CC,#192D53);
177
+
178
+ border : 2px solid #192D53;
179
+ border-radius : 10px;
180
+ -moz-border-radius: 10px;
181
+ color : white;
182
+ padding : 2.5px 10px 2.5px 10px;
183
+ cursor : pointer;
184
+ font-size : 1.8em;
185
+ font-family : Tahoma, Arial, sans-serif;
186
+ margin: 0 0 0 0;
187
+
188
+ }
189
+ .submit_button input:active {
190
+ color: #1f2126;
191
+
192
+ }
193
+ .submit_button input:hover {
194
+ background: -webkit-gradient(linear, left top, right bottom, from(#009cff), to(#0261c2));
195
+ background: -moz-linear-gradient(45deg,#009cff,#0261c2);
196
+
197
+ }
198
+
199
+ h2, .bigtext{
200
+ font-family: Tahoma, Arial, serif;
201
+ font-weight: bold;
202
+ font-size: 20px;
203
+ color: black;
204
+ margin:0;
205
+ padding: 0px;
206
+ /* margin: 8px 0 10px 0;*/
207
+ }
208
+
209
+ h3{
210
+ font-family: Tahoma, Arial, serif;
211
+ font-weight: bold;
212
+ font-size: 16px;
213
+ color: black;
214
+ margin:0;
215
+ padding: 0px;
216
+ /* margin: 8px 0 10px 0;*/
217
+ }
218
+
219
+ .smalltext{
220
+ font-size:10px;
221
+ }
222
+
223
+
224
+ #result{
225
+ clear:both;
226
+ background-color: white;
227
+ }
228
+ .result_even_true{
229
+ background-color: #ffe0f9;
230
+ margin: 0 18px 0 18px;
231
+ border-radius :10px;
232
+ -moz-border-radius:10px;
233
+ padding-left: 3%;
234
+ padding-top: 3%;
235
+ }
236
+ .result_even_false{
237
+ background-color: #dfefe6;
238
+ margin: 0 18px 0 18px;
239
+ border-radius :10px;
240
+ -moz-border-radius:10px;
241
+ padding-left: 3%;
242
+ padding-top: 3%;
243
+ }
244
+ .blast_result{
245
+ font-family: "Lucida Console", Lucida, monospace;
246
+ background-color: #A9A9A9;
247
+ border-radius :10px;
248
+ -moz-border-radius:10px;
249
+ padding-left: 2%;
250
+ }
251
+
252
+ a {
253
+ color: #b22222;
254
+ }
@@ -0,0 +1,29 @@
1
+ /*!
2
+ * Bootstrap v2.0.2
3
+ *
4
+ * Copyright 2012 Twitter, Inc
5
+ * Licensed under the Apache License v2.0
6
+ * http://www.apache.org/licenses/LICENSE-2.0
7
+ *
8
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
9
+ */
10
+ .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
11
+ .clearfix:after{clear:both;}
12
+ .hide-text{overflow:hidden;text-indent:100%;white-space:nowrap;}
13
+ .input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;}
14
+ .dropdown{position:relative;}
15
+ .dropdown-toggle{*margin-bottom:-3px;}
16
+ .dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
17
+ .caret{display:inline-block;width:0;height:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"";}
18
+ .dropdown .caret{margin-top:8px;margin-left:2px;}
19
+ .dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);}
20
+ .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.pull-right{right:0;left:auto;}
21
+ .dropdown-menu .divider{height:1px;margin:8px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;}
22
+ .dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#333333;white-space:nowrap;}
23
+ .dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;}
24
+ .dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}
25
+ .dropdown.open .dropdown-menu{display:block;}
26
+ .pull-right .dropdown-menu{left:auto;right:0;}
27
+ .dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"\2191";}
28
+ .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;}
29
+ .typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
@@ -0,0 +1,155 @@
1
+ /*!
2
+ * Bootstrap v2.0.3
3
+ *
4
+ * Copyright 2012 Twitter, Inc
5
+ * Licensed under the Apache License v2.0
6
+ * http://www.apache.org/licenses/LICENSE-2.0
7
+ *
8
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
9
+ */
10
+ .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
11
+ .clearfix:after{clear:both;}
12
+ .hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
13
+ .input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;}
14
+ [class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;}
15
+ .icon-white{background-image:url("../img/glyphicons-halflings-white.png");}
16
+ .icon-glass{background-position:0 0;}
17
+ .icon-music{background-position:-24px 0;}
18
+ .icon-search{background-position:-48px 0;}
19
+ .icon-envelope{background-position:-72px 0;}
20
+ .icon-heart{background-position:-96px 0;}
21
+ .icon-star{background-position:-120px 0;}
22
+ .icon-star-empty{background-position:-144px 0;}
23
+ .icon-user{background-position:-168px 0;}
24
+ .icon-film{background-position:-192px 0;}
25
+ .icon-th-large{background-position:-216px 0;}
26
+ .icon-th{background-position:-240px 0;}
27
+ .icon-th-list{background-position:-264px 0;}
28
+ .icon-ok{background-position:-288px 0;}
29
+ .icon-remove{background-position:-312px 0;}
30
+ .icon-zoom-in{background-position:-336px 0;}
31
+ .icon-zoom-out{background-position:-360px 0;}
32
+ .icon-off{background-position:-384px 0;}
33
+ .icon-signal{background-position:-408px 0;}
34
+ .icon-cog{background-position:-432px 0;}
35
+ .icon-trash{background-position:-456px 0;}
36
+ .icon-home{background-position:0 -24px;}
37
+ .icon-file{background-position:-24px -24px;}
38
+ .icon-time{background-position:-48px -24px;}
39
+ .icon-road{background-position:-72px -24px;}
40
+ .icon-download-alt{background-position:-96px -24px;}
41
+ .icon-download{background-position:-120px -24px;}
42
+ .icon-upload{background-position:-144px -24px;}
43
+ .icon-inbox{background-position:-168px -24px;}
44
+ .icon-play-circle{background-position:-192px -24px;}
45
+ .icon-repeat{background-position:-216px -24px;}
46
+ .icon-refresh{background-position:-240px -24px;}
47
+ .icon-list-alt{background-position:-264px -24px;}
48
+ .icon-lock{background-position:-287px -24px;}
49
+ .icon-flag{background-position:-312px -24px;}
50
+ .icon-headphones{background-position:-336px -24px;}
51
+ .icon-volume-off{background-position:-360px -24px;}
52
+ .icon-volume-down{background-position:-384px -24px;}
53
+ .icon-volume-up{background-position:-408px -24px;}
54
+ .icon-qrcode{background-position:-432px -24px;}
55
+ .icon-barcode{background-position:-456px -24px;}
56
+ .icon-tag{background-position:0 -48px;}
57
+ .icon-tags{background-position:-25px -48px;}
58
+ .icon-book{background-position:-48px -48px;}
59
+ .icon-bookmark{background-position:-72px -48px;}
60
+ .icon-print{background-position:-96px -48px;}
61
+ .icon-camera{background-position:-120px -48px;}
62
+ .icon-font{background-position:-144px -48px;}
63
+ .icon-bold{background-position:-167px -48px;}
64
+ .icon-italic{background-position:-192px -48px;}
65
+ .icon-text-height{background-position:-216px -48px;}
66
+ .icon-text-width{background-position:-240px -48px;}
67
+ .icon-align-left{background-position:-264px -48px;}
68
+ .icon-align-center{background-position:-288px -48px;}
69
+ .icon-align-right{background-position:-312px -48px;}
70
+ .icon-align-justify{background-position:-336px -48px;}
71
+ .icon-list{background-position:-360px -48px;}
72
+ .icon-indent-left{background-position:-384px -48px;}
73
+ .icon-indent-right{background-position:-408px -48px;}
74
+ .icon-facetime-video{background-position:-432px -48px;}
75
+ .icon-picture{background-position:-456px -48px;}
76
+ .icon-pencil{background-position:0 -72px;}
77
+ .icon-map-marker{background-position:-24px -72px;}
78
+ .icon-adjust{background-position:-48px -72px;}
79
+ .icon-tint{background-position:-72px -72px;}
80
+ .icon-edit{background-position:-96px -72px;}
81
+ .icon-share{background-position:-120px -72px;}
82
+ .icon-check{background-position:-144px -72px;}
83
+ .icon-move{background-position:-168px -72px;}
84
+ .icon-step-backward{background-position:-192px -72px;}
85
+ .icon-fast-backward{background-position:-216px -72px;}
86
+ .icon-backward{background-position:-240px -72px;}
87
+ .icon-play{background-position:-264px -72px;}
88
+ .icon-pause{background-position:-288px -72px;}
89
+ .icon-stop{background-position:-312px -72px;}
90
+ .icon-forward{background-position:-336px -72px;}
91
+ .icon-fast-forward{background-position:-360px -72px;}
92
+ .icon-step-forward{background-position:-384px -72px;}
93
+ .icon-eject{background-position:-408px -72px;}
94
+ .icon-chevron-left{background-position:-432px -72px;}
95
+ .icon-chevron-right{background-position:-456px -72px;}
96
+ .icon-plus-sign{background-position:0 -96px;}
97
+ .icon-minus-sign{background-position:-24px -96px;}
98
+ .icon-remove-sign{background-position:-48px -96px;}
99
+ .icon-ok-sign{background-position:-72px -96px;}
100
+ .icon-question-sign{background-position:-96px -96px;}
101
+ .icon-info-sign{background-position:-120px -96px;}
102
+ .icon-screenshot{background-position:-144px -96px;}
103
+ .icon-remove-circle{background-position:-168px -96px;}
104
+ .icon-ok-circle{background-position:-192px -96px;}
105
+ .icon-ban-circle{background-position:-216px -96px;}
106
+ .icon-arrow-left{background-position:-240px -96px;}
107
+ .icon-arrow-right{background-position:-264px -96px;}
108
+ .icon-arrow-up{background-position:-289px -96px;}
109
+ .icon-arrow-down{background-position:-312px -96px;}
110
+ .icon-share-alt{background-position:-336px -96px;}
111
+ .icon-resize-full{background-position:-360px -96px;}
112
+ .icon-resize-small{background-position:-384px -96px;}
113
+ .icon-plus{background-position:-408px -96px;}
114
+ .icon-minus{background-position:-433px -96px;}
115
+ .icon-asterisk{background-position:-456px -96px;}
116
+ .icon-exclamation-sign{background-position:0 -120px;}
117
+ .icon-gift{background-position:-24px -120px;}
118
+ .icon-leaf{background-position:-48px -120px;}
119
+ .icon-fire{background-position:-72px -120px;}
120
+ .icon-eye-open{background-position:-96px -120px;}
121
+ .icon-eye-close{background-position:-120px -120px;}
122
+ .icon-warning-sign{background-position:-144px -120px;}
123
+ .icon-plane{background-position:-168px -120px;}
124
+ .icon-calendar{background-position:-192px -120px;}
125
+ .icon-random{background-position:-216px -120px;}
126
+ .icon-comment{background-position:-240px -120px;}
127
+ .icon-magnet{background-position:-264px -120px;}
128
+ .icon-chevron-up{background-position:-288px -120px;}
129
+ .icon-chevron-down{background-position:-313px -119px;}
130
+ .icon-retweet{background-position:-336px -120px;}
131
+ .icon-shopping-cart{background-position:-360px -120px;}
132
+ .icon-folder-close{background-position:-384px -120px;}
133
+ .icon-folder-open{background-position:-408px -120px;}
134
+ .icon-resize-vertical{background-position:-432px -119px;}
135
+ .icon-resize-horizontal{background-position:-456px -118px;}
136
+ .icon-hdd{background-position:0 -144px;}
137
+ .icon-bullhorn{background-position:-24px -144px;}
138
+ .icon-bell{background-position:-48px -144px;}
139
+ .icon-certificate{background-position:-72px -144px;}
140
+ .icon-thumbs-up{background-position:-96px -144px;}
141
+ .icon-thumbs-down{background-position:-120px -144px;}
142
+ .icon-hand-right{background-position:-144px -144px;}
143
+ .icon-hand-left{background-position:-168px -144px;}
144
+ .icon-hand-up{background-position:-192px -144px;}
145
+ .icon-hand-down{background-position:-216px -144px;}
146
+ .icon-circle-arrow-right{background-position:-240px -144px;}
147
+ .icon-circle-arrow-left{background-position:-264px -144px;}
148
+ .icon-circle-arrow-up{background-position:-288px -144px;}
149
+ .icon-circle-arrow-down{background-position:-312px -144px;}
150
+ .icon-globe{background-position:-336px -144px;}
151
+ .icon-wrench{background-position:-360px -144px;}
152
+ .icon-tasks{background-position:-384px -144px;}
153
+ .icon-filter{background-position:-408px -144px;}
154
+ .icon-briefcase{background-position:-432px -144px;}
155
+ .icon-fullscreen{background-position:-456px -144px;}