groove-dl 0.2.0 → 0.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5028c609beb9b031385ea3eb3a68241a291e3267
4
- data.tar.gz: 093121e998733df06134ac4de8bbcb91ea576a3f
3
+ metadata.gz: 9cd8b8b1860a1d9b9bce5c3668bb3d0532b92cdc
4
+ data.tar.gz: a756d1891dad315f56a6244d8196ead22db9a36a
5
5
  SHA512:
6
- metadata.gz: 197f460fe260071fe4e11a4a8722eddfce7ea5aa269e164d115b457f91cb96333b197d994e9034e8750b5e4a259ca32118e9b1599eba0d16097cf58231820b5c
7
- data.tar.gz: bad6b3830e84dd377831990aec0f505bae9d3cf7c937a78054a025ab9148697a1e51668902318363d6099a145cea3de86cd8172e9e19d9f976af4a97ac248fd5
6
+ metadata.gz: f86facb49a4ba91e6eeff726ebdf4c1c495b88297e3e6d8ee99ccb8bfbaf681840a18b0cb0b50db85cb4b2b15b028b1ed0f9f82ca0713af486dd92b0f7fc1ee8
7
+ data.tar.gz: e9662553d3bf46c09bc7d986798821cb8532689001e8e77d983db572e8c6d6f66def07494b8b3251729189526fc2d24a42918b8b0b354c6a78c2b40cf60476fd
data/.gitignore CHANGED
@@ -3,3 +3,4 @@ coverage
3
3
  Gemfile.lock
4
4
  .ruby-version
5
5
  groove-dl-*.gem
6
+ **/*.glade~
data/MANIFEST CHANGED
@@ -8,6 +8,7 @@ README.md
8
8
  Rakefile
9
9
  bin/groove-dl
10
10
  bin/groove-dl-cli
11
+ glade/groove-dl.glade
11
12
  groove-dl.gemspec
12
13
  lib/groove-dl.rb
13
14
  lib/groove-dl/app.rb
@@ -18,14 +19,9 @@ lib/groove-dl/displayer.rb
18
19
  lib/groove-dl/downloader.rb
19
20
  lib/groove-dl/errors.rb
20
21
  lib/groove-dl/version.rb
21
- lib/groove-dl/widgets/download/bar.rb
22
- lib/groove-dl/widgets/download/book.rb
23
- lib/groove-dl/widgets/download/list/failed.rb
24
- lib/groove-dl/widgets/download/list/queue.rb
25
- lib/groove-dl/widgets/download/list/success.rb
26
- lib/groove-dl/widgets/menu/success.rb
27
- lib/groove-dl/widgets/search/bar.rb
28
- lib/groove-dl/widgets/search/list.rb
22
+ lib/groove-dl/widgets/download.rb
23
+ lib/groove-dl/widgets/events.rb
24
+ lib/groove-dl/widgets/search.rb
29
25
  spec/groove-dl/cli_spec.rb
30
26
  spec/groove-dl/displayer_spec.rb
31
27
  spec/groove-dl/downloader_spec.rb
@@ -6,15 +6,10 @@ require File.expand_path('../../lib/groove-dl', __FILE__)
6
6
  require 'gtk3'
7
7
  require 'shellwords'
8
8
  require 'groove-dl/app'
9
- require 'groove-dl/widgets/menu/success'
10
- require 'groove-dl/widgets/download/bar'
11
- require 'groove-dl/widgets/download/list/queue'
12
- require 'groove-dl/widgets/download/list/failed'
13
- require 'groove-dl/widgets/download/list/success'
14
- require 'groove-dl/widgets/download/book'
15
- require 'groove-dl/widgets/search/bar'
16
- require 'groove-dl/widgets/search/list'
9
+ require 'groove-dl/widgets/events'
10
+ require 'groove-dl/widgets/search'
11
+ require 'groove-dl/widgets/download'
17
12
 
18
13
  Gtk.init
19
- GrooveDl::App.new
14
+ GrooveDl::App.new('glade/groove-dl.glade')
20
15
  Gtk.main
@@ -0,0 +1,539 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Generated with glade 3.18.3 -->
3
+ <interface>
4
+ <requires lib="gtk+" version="3.12"/>
5
+ <object class="GtkListStore" id="download_failed_list_store">
6
+ <columns>
7
+ <!-- column-name path -->
8
+ <column type="gchararray"/>
9
+ <!-- column-name reason -->
10
+ <column type="gchararray"/>
11
+ </columns>
12
+ </object>
13
+ <object class="GtkListStore" id="download_queue_list_store">
14
+ <columns>
15
+ <!-- column-name path -->
16
+ <column type="gchararray"/>
17
+ <!-- column-name progress_value -->
18
+ <column type="gint"/>
19
+ <!-- column-name progress_text -->
20
+ <column type="gchararray"/>
21
+ </columns>
22
+ </object>
23
+ <object class="GtkListStore" id="download_success_list_store">
24
+ <columns>
25
+ <!-- column-name path -->
26
+ <column type="gchararray"/>
27
+ <!-- column-name size -->
28
+ <column type="gchararray"/>
29
+ </columns>
30
+ </object>
31
+ <object class="GtkListStore" id="search_list_store">
32
+ <columns>
33
+ <!-- column-name checkbox -->
34
+ <column type="gboolean"/>
35
+ <!-- column-name id -->
36
+ <column type="gint"/>
37
+ <!-- column-name name -->
38
+ <column type="gchararray"/>
39
+ <!-- column-name author -->
40
+ <column type="gchararray"/>
41
+ <!-- column-name data -->
42
+ <column type="gchararray"/>
43
+ </columns>
44
+ </object>
45
+ <object class="GtkWindow" id="main_window">
46
+ <property name="width_request">1024</property>
47
+ <property name="height_request">768</property>
48
+ <property name="can_focus">False</property>
49
+ <property name="title" translatable="yes">Grooveshark Downloader</property>
50
+ <child>
51
+ <object class="GtkBox" id="download_grid">
52
+ <property name="visible">True</property>
53
+ <property name="can_focus">False</property>
54
+ <property name="hexpand">True</property>
55
+ <property name="vexpand">True</property>
56
+ <property name="orientation">vertical</property>
57
+ <child>
58
+ <object class="GtkGrid" id="search_bar">
59
+ <property name="visible">True</property>
60
+ <property name="can_focus">False</property>
61
+ <property name="hexpand">True</property>
62
+ <child>
63
+ <object class="GtkEntry" id="search_entry">
64
+ <property name="visible">True</property>
65
+ <property name="can_focus">True</property>
66
+ <property name="margin_left">6</property>
67
+ <property name="margin_right">15</property>
68
+ <property name="margin_top">5</property>
69
+ <property name="margin_bottom">5</property>
70
+ <property name="hexpand">True</property>
71
+ <property name="truncate_multiline">True</property>
72
+ <property name="placeholder_text" translatable="yes">Search...</property>
73
+ <property name="populate_all">True</property>
74
+ <signal name="activate" handler="on_search_entry_activate" swapped="no"/>
75
+ </object>
76
+ <packing>
77
+ <property name="left_attach">0</property>
78
+ <property name="top_attach">0</property>
79
+ </packing>
80
+ </child>
81
+ <child>
82
+ <object class="GtkComboBoxText" id="search_type">
83
+ <property name="visible">True</property>
84
+ <property name="can_focus">False</property>
85
+ <property name="halign">end</property>
86
+ <property name="valign">center</property>
87
+ <property name="margin_left">10</property>
88
+ <property name="margin_right">15</property>
89
+ <property name="margin_top">5</property>
90
+ <property name="margin_bottom">5</property>
91
+ <property name="active_id">2</property>
92
+ <items>
93
+ <item id="0" translatable="yes">Playlists</item>
94
+ <item id="1" translatable="yes">Songs</item>
95
+ <item id="2" translatable="yes">Songs from playlist id</item>
96
+ </items>
97
+ </object>
98
+ <packing>
99
+ <property name="left_attach">1</property>
100
+ <property name="top_attach">0</property>
101
+ </packing>
102
+ </child>
103
+ <child>
104
+ <object class="GtkButton" id="search_button">
105
+ <property name="label">gtk-find</property>
106
+ <property name="visible">True</property>
107
+ <property name="can_focus">True</property>
108
+ <property name="receives_default">True</property>
109
+ <property name="halign">end</property>
110
+ <property name="valign">end</property>
111
+ <property name="margin_left">5</property>
112
+ <property name="margin_right">15</property>
113
+ <property name="margin_top">5</property>
114
+ <property name="margin_bottom">5</property>
115
+ <property name="use_stock">True</property>
116
+ <property name="always_show_image">True</property>
117
+ <signal name="clicked" handler="on_search_button_clicked" swapped="no"/>
118
+ </object>
119
+ <packing>
120
+ <property name="left_attach">2</property>
121
+ <property name="top_attach">0</property>
122
+ </packing>
123
+ </child>
124
+ </object>
125
+ <packing>
126
+ <property name="expand">False</property>
127
+ <property name="fill">True</property>
128
+ <property name="position">0</property>
129
+ </packing>
130
+ </child>
131
+ <child>
132
+ <object class="GtkScrolledWindow" id="search_scrolled_window">
133
+ <property name="visible">True</property>
134
+ <property name="can_focus">True</property>
135
+ <property name="shadow_type">in</property>
136
+ <child>
137
+ <object class="GtkTreeView" id="search_list">
138
+ <property name="visible">True</property>
139
+ <property name="can_focus">True</property>
140
+ <property name="margin_top">5</property>
141
+ <property name="margin_bottom">5</property>
142
+ <property name="hexpand">True</property>
143
+ <property name="vexpand">True</property>
144
+ <property name="model">search_list_store</property>
145
+ <property name="reorderable">True</property>
146
+ <property name="rules_hint">True</property>
147
+ <property name="search_column">1</property>
148
+ <property name="enable_grid_lines">both</property>
149
+ <child internal-child="selection">
150
+ <object class="GtkTreeSelection" id="treeview-selection"/>
151
+ </child>
152
+ <child>
153
+ <object class="GtkTreeViewColumn" id="search_list_selected">
154
+ <property name="fixed_width">30</property>
155
+ <property name="title" translatable="yes">X</property>
156
+ <property name="clickable">True</property>
157
+ <signal name="clicked" handler="on_search_list_selected_clicked" swapped="no"/>
158
+ <child>
159
+ <object class="GtkCellRendererToggle" id="search_list_cell_toggle">
160
+ <signal name="toggled" handler="on_search_list_toggle_toggled" swapped="no"/>
161
+ </object>
162
+ <attributes>
163
+ <attribute name="active">0</attribute>
164
+ </attributes>
165
+ </child>
166
+ </object>
167
+ </child>
168
+ <child>
169
+ <object class="GtkTreeViewColumn" id="search_list_id">
170
+ <property name="min_width">70</property>
171
+ <property name="title" translatable="yes">Id</property>
172
+ <child>
173
+ <object class="GtkCellRendererText" id="search_list_cell_id"/>
174
+ <attributes>
175
+ <attribute name="text">1</attribute>
176
+ </attributes>
177
+ </child>
178
+ </object>
179
+ </child>
180
+ <child>
181
+ <object class="GtkTreeViewColumn" id="search_list_name">
182
+ <property name="min_width">400</property>
183
+ <property name="title" translatable="yes">Name</property>
184
+ <child>
185
+ <object class="GtkCellRendererText" id="search_list_cell_name"/>
186
+ <attributes>
187
+ <attribute name="text">2</attribute>
188
+ </attributes>
189
+ </child>
190
+ </object>
191
+ </child>
192
+ <child>
193
+ <object class="GtkTreeViewColumn" id="search_list_author">
194
+ <property name="min_width">200</property>
195
+ <property name="title" translatable="yes">Author</property>
196
+ <child>
197
+ <object class="GtkCellRendererText" id="search_list_cell_author"/>
198
+ <attributes>
199
+ <attribute name="text">3</attribute>
200
+ </attributes>
201
+ </child>
202
+ </object>
203
+ </child>
204
+ <child>
205
+ <object class="GtkTreeViewColumn" id="search_list_other">
206
+ <property name="min_width">100</property>
207
+ <property name="title" translatable="yes">Other data</property>
208
+ <child>
209
+ <object class="GtkCellRendererText" id="search_list_cell_other"/>
210
+ <attributes>
211
+ <attribute name="text">4</attribute>
212
+ </attributes>
213
+ </child>
214
+ </object>
215
+ </child>
216
+ </object>
217
+ </child>
218
+ </object>
219
+ <packing>
220
+ <property name="expand">True</property>
221
+ <property name="fill">True</property>
222
+ <property name="position">1</property>
223
+ </packing>
224
+ </child>
225
+ <child>
226
+ <object class="GtkGrid" id="download_bar">
227
+ <property name="visible">True</property>
228
+ <property name="can_focus">False</property>
229
+ <property name="hexpand">True</property>
230
+ <child>
231
+ <object class="GtkButton" id="btn_add_to_queue">
232
+ <property name="label">gtk-add</property>
233
+ <property name="visible">True</property>
234
+ <property name="can_focus">True</property>
235
+ <property name="receives_default">True</property>
236
+ <property name="margin_left">5</property>
237
+ <property name="margin_right">5</property>
238
+ <property name="margin_top">5</property>
239
+ <property name="margin_bottom">5</property>
240
+ <property name="use_stock">True</property>
241
+ <property name="xalign">0.46000000834465027</property>
242
+ <property name="always_show_image">True</property>
243
+ <signal name="clicked" handler="on_btn_add_to_queue_clicked" swapped="no"/>
244
+ </object>
245
+ <packing>
246
+ <property name="left_attach">0</property>
247
+ <property name="top_attach">0</property>
248
+ </packing>
249
+ </child>
250
+ <child>
251
+ <object class="GtkLabel" id="label1">
252
+ <property name="visible">True</property>
253
+ <property name="can_focus">False</property>
254
+ <property name="margin_left">5</property>
255
+ <property name="margin_right">5</property>
256
+ <property name="margin_top">5</property>
257
+ <property name="margin_bottom">5</property>
258
+ <property name="label" translatable="yes">Concurrency</property>
259
+ </object>
260
+ <packing>
261
+ <property name="left_attach">3</property>
262
+ <property name="top_attach">0</property>
263
+ </packing>
264
+ </child>
265
+ <child>
266
+ <object class="GtkEntry" id="concurrency_entry">
267
+ <property name="visible">True</property>
268
+ <property name="can_focus">True</property>
269
+ <property name="margin_left">5</property>
270
+ <property name="margin_right">5</property>
271
+ <property name="margin_top">5</property>
272
+ <property name="margin_bottom">5</property>
273
+ <property name="progress_pulse_step">0.089999999999999997</property>
274
+ <property name="placeholder_text" translatable="yes">5</property>
275
+ </object>
276
+ <packing>
277
+ <property name="left_attach">4</property>
278
+ <property name="top_attach">0</property>
279
+ </packing>
280
+ </child>
281
+ <child>
282
+ <object class="GtkButton" id="btn_download">
283
+ <property name="label">gtk-save</property>
284
+ <property name="visible">True</property>
285
+ <property name="can_focus">True</property>
286
+ <property name="receives_default">True</property>
287
+ <property name="margin_left">5</property>
288
+ <property name="margin_right">5</property>
289
+ <property name="margin_top">5</property>
290
+ <property name="margin_bottom">5</property>
291
+ <property name="use_stock">True</property>
292
+ <property name="always_show_image">True</property>
293
+ <signal name="clicked" handler="on_btn_download_clicked" swapped="no"/>
294
+ </object>
295
+ <packing>
296
+ <property name="left_attach">5</property>
297
+ <property name="top_attach">0</property>
298
+ </packing>
299
+ </child>
300
+ <child>
301
+ <object class="GtkFileChooserButton" id="directory_chooser">
302
+ <property name="visible">True</property>
303
+ <property name="can_focus">False</property>
304
+ <property name="margin_left">5</property>
305
+ <property name="margin_right">5</property>
306
+ <property name="margin_top">5</property>
307
+ <property name="margin_bottom">5</property>
308
+ <property name="hexpand">True</property>
309
+ <property name="action">select-folder</property>
310
+ <property name="title" translatable="yes">Select a directory</property>
311
+ </object>
312
+ <packing>
313
+ <property name="left_attach">2</property>
314
+ <property name="top_attach">0</property>
315
+ </packing>
316
+ </child>
317
+ <child>
318
+ <object class="GtkButton" id="btn_clear_queue">
319
+ <property name="label">gtk-clear</property>
320
+ <property name="visible">True</property>
321
+ <property name="can_focus">True</property>
322
+ <property name="receives_default">True</property>
323
+ <property name="margin_left">5</property>
324
+ <property name="margin_right">5</property>
325
+ <property name="margin_top">5</property>
326
+ <property name="margin_bottom">5</property>
327
+ <property name="use_stock">True</property>
328
+ <property name="yalign">0.44999998807907104</property>
329
+ <property name="always_show_image">True</property>
330
+ <signal name="clicked" handler="on_btn_clear_queue_clicked" swapped="no"/>
331
+ </object>
332
+ <packing>
333
+ <property name="left_attach">1</property>
334
+ <property name="top_attach">0</property>
335
+ </packing>
336
+ </child>
337
+ </object>
338
+ <packing>
339
+ <property name="expand">False</property>
340
+ <property name="fill">True</property>
341
+ <property name="position">2</property>
342
+ </packing>
343
+ </child>
344
+ <child>
345
+ <object class="GtkNotebook" id="download_notebook">
346
+ <property name="visible">True</property>
347
+ <property name="can_focus">True</property>
348
+ <child>
349
+ <object class="GtkScrolledWindow" id="download_queue_scrolled_window">
350
+ <property name="visible">True</property>
351
+ <property name="can_focus">True</property>
352
+ <property name="shadow_type">in</property>
353
+ <child>
354
+ <object class="GtkTreeView" id="download_queue">
355
+ <property name="visible">True</property>
356
+ <property name="can_focus">True</property>
357
+ <property name="model">download_queue_list_store</property>
358
+ <child internal-child="selection">
359
+ <object class="GtkTreeSelection" id="treeview-selection4"/>
360
+ </child>
361
+ <child>
362
+ <object class="GtkTreeViewColumn" id="queue_path">
363
+ <property name="resizable">True</property>
364
+ <property name="min_width">650</property>
365
+ <property name="title" translatable="yes">Path</property>
366
+ <child>
367
+ <object class="GtkCellRendererText" id="download_queue_cell_path"/>
368
+ <attributes>
369
+ <attribute name="text">0</attribute>
370
+ </attributes>
371
+ </child>
372
+ </object>
373
+ </child>
374
+ <child>
375
+ <object class="GtkTreeViewColumn" id="queue_progress">
376
+ <property name="title" translatable="yes">Progress</property>
377
+ <property name="expand">True</property>
378
+ <child>
379
+ <object class="GtkCellRendererProgress" id="download_queue_cell_progress"/>
380
+ <attributes>
381
+ <attribute name="text">2</attribute>
382
+ <attribute name="value">1</attribute>
383
+ </attributes>
384
+ </child>
385
+ </object>
386
+ </child>
387
+ </object>
388
+ </child>
389
+ </object>
390
+ </child>
391
+ <child type="tab">
392
+ <object class="GtkLabel" id="download_label_queue">
393
+ <property name="visible">True</property>
394
+ <property name="can_focus">False</property>
395
+ <property name="label" translatable="yes">Queue</property>
396
+ </object>
397
+ <packing>
398
+ <property name="tab_fill">False</property>
399
+ </packing>
400
+ </child>
401
+ <child>
402
+ <object class="GtkScrolledWindow" id="download_success_scrolled_window">
403
+ <property name="visible">True</property>
404
+ <property name="can_focus">True</property>
405
+ <property name="shadow_type">in</property>
406
+ <child>
407
+ <object class="GtkTreeView" id="download_success">
408
+ <property name="visible">True</property>
409
+ <property name="can_focus">True</property>
410
+ <property name="model">download_success_list_store</property>
411
+ <signal name="button-press-event" handler="on_download_success_button_press_event" swapped="no"/>
412
+ <child internal-child="selection">
413
+ <object class="GtkTreeSelection" id="treeview-selection3"/>
414
+ </child>
415
+ <child>
416
+ <object class="GtkTreeViewColumn" id="success_path">
417
+ <property name="min_width">650</property>
418
+ <property name="title" translatable="yes">Path</property>
419
+ <property name="expand">True</property>
420
+ <child>
421
+ <object class="GtkCellRendererText" id="download_success_cell_path"/>
422
+ <attributes>
423
+ <attribute name="text">0</attribute>
424
+ </attributes>
425
+ </child>
426
+ </object>
427
+ </child>
428
+ <child>
429
+ <object class="GtkTreeViewColumn" id="success_size">
430
+ <property name="min_width">100</property>
431
+ <property name="title" translatable="yes">Size</property>
432
+ <property name="expand">True</property>
433
+ <child>
434
+ <object class="GtkCellRendererText" id="download_success_cell_size"/>
435
+ <attributes>
436
+ <attribute name="text">1</attribute>
437
+ </attributes>
438
+ </child>
439
+ </object>
440
+ </child>
441
+ </object>
442
+ </child>
443
+ </object>
444
+ <packing>
445
+ <property name="position">1</property>
446
+ </packing>
447
+ </child>
448
+ <child type="tab">
449
+ <object class="GtkLabel" id="download_label_success">
450
+ <property name="visible">True</property>
451
+ <property name="can_focus">False</property>
452
+ <property name="label" translatable="yes">Success</property>
453
+ </object>
454
+ <packing>
455
+ <property name="position">1</property>
456
+ <property name="tab_fill">False</property>
457
+ </packing>
458
+ </child>
459
+ <child>
460
+ <object class="GtkScrolledWindow" id="download_failed_scrolled_window">
461
+ <property name="visible">True</property>
462
+ <property name="can_focus">True</property>
463
+ <property name="shadow_type">in</property>
464
+ <child>
465
+ <object class="GtkTreeView" id="download_failed">
466
+ <property name="visible">True</property>
467
+ <property name="can_focus">True</property>
468
+ <property name="model">download_failed_list_store</property>
469
+ <child internal-child="selection">
470
+ <object class="GtkTreeSelection" id="treeview-selection2"/>
471
+ </child>
472
+ <child>
473
+ <object class="GtkTreeViewColumn" id="failed_path">
474
+ <property name="min_width">650</property>
475
+ <property name="title" translatable="yes">Path</property>
476
+ <child>
477
+ <object class="GtkCellRendererText" id="download_failed_cell_path"/>
478
+ <attributes>
479
+ <attribute name="text">0</attribute>
480
+ </attributes>
481
+ </child>
482
+ </object>
483
+ </child>
484
+ <child>
485
+ <object class="GtkTreeViewColumn" id="failed_reason">
486
+ <property name="title" translatable="yes">Reason</property>
487
+ <property name="expand">True</property>
488
+ <child>
489
+ <object class="GtkCellRendererText" id="download_failed_cell_reason"/>
490
+ <attributes>
491
+ <attribute name="text">1</attribute>
492
+ </attributes>
493
+ </child>
494
+ </object>
495
+ </child>
496
+ </object>
497
+ </child>
498
+ </object>
499
+ <packing>
500
+ <property name="position">2</property>
501
+ </packing>
502
+ </child>
503
+ <child type="tab">
504
+ <object class="GtkLabel" id="download_label_failed">
505
+ <property name="visible">True</property>
506
+ <property name="can_focus">False</property>
507
+ <property name="label" translatable="yes">Failed</property>
508
+ </object>
509
+ <packing>
510
+ <property name="position">2</property>
511
+ <property name="tab_fill">False</property>
512
+ </packing>
513
+ </child>
514
+ </object>
515
+ <packing>
516
+ <property name="expand">True</property>
517
+ <property name="fill">True</property>
518
+ <property name="position">3</property>
519
+ </packing>
520
+ </child>
521
+ </object>
522
+ </child>
523
+ </object>
524
+ <object class="GtkMenu" id="success_menu">
525
+ <property name="visible">True</property>
526
+ <property name="can_focus">False</property>
527
+ <child>
528
+ <object class="GtkImageMenuItem" id="menu_open">
529
+ <property name="label">gtk-open</property>
530
+ <property name="visible">True</property>
531
+ <property name="can_focus">False</property>
532
+ <property name="use_underline">True</property>
533
+ <property name="use_stock">True</property>
534
+ <property name="always_show_image">True</property>
535
+ <signal name="activate" handler="on_menu_open_activate" swapped="no"/>
536
+ </object>
537
+ </child>
538
+ </object>
539
+ </interface>