Changeset 0c6e14df5441f6bc5bf3fbfa4efbd7be453014c6
- Timestamp:
- 06/12/03 23:41:40
(5 years ago)
- Author:
- Jean-Paul Saman <jpsaman@videolan.org>
- git-committer:
- Jean-Paul Saman <jpsaman@videolan.org> 1070750500 +0000
- git-parent:
[8c4be7494eaadf68b05f38db4bfbdbf788d1cddf]
- git-author:
- Jean-Paul Saman <jpsaman@videolan.org> 1070750500 +0000
- Message:
PDA Interface:
- Fixed last segmentation fault.
- Slider and time progress updating.
This makes the new PDA interface almost complete. It misses the following items still:
- preference panel
- changing postion in stream with slider widget.
The missing items above will move to the next release of VLC. Now testing and package building for iPAQ will begin. I expect to have a package at the end of the week.
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| rc3638c4 |
r0c6e14d |
|
| 3 | 3 | ***************************************************************************** |
|---|
| 4 | 4 | * Copyright (C) 2002 VideoLAN |
|---|
| 5 | | * $Id: pda.c,v 1.16 2003/12/04 10:25:47 gbazin Exp $ |
|---|
| | 5 | * $Id: pda.c,v 1.17 2003/12/06 22:41:40 jpsaman Exp $ |
|---|
| 6 | 6 | * |
|---|
| 7 | 7 | * Authors: Jean-Paul Saman <jpsaman@wxs.nl> |
|---|
| … | … | |
| 50 | 50 | void GtkAutoPlayFile ( vlc_object_t * ); |
|---|
| 51 | 51 | static int Manage ( intf_thread_t *p_intf ); |
|---|
| 52 | | void E_(GtkDisplayDate) ( GtkAdjustment *p_adj ); |
|---|
| | 52 | void E_(GtkDisplayDate) ( GtkAdjustment *p_adj, gpointer userdata ); |
|---|
| 53 | 53 | gint E_(GtkModeManage) ( intf_thread_t * p_intf ); |
|---|
| 54 | 54 | |
|---|
| … | … | |
| 191 | 191 | |
|---|
| 192 | 192 | /* Get the slider object */ |
|---|
| 193 | | p_intf->p_sys->p_slider = GTK_HSCALE( gtk_object_get_data( |
|---|
| 194 | | GTK_OBJECT( p_intf->p_sys->p_window ), "timeSlider" ) ); |
|---|
| 195 | | p_intf->p_sys->p_slider_label = GTK_LABEL( gtk_object_get_data( |
|---|
| 196 | | GTK_OBJECT( p_intf->p_sys->p_window ), "timeLabel" ) ); |
|---|
| 197 | | |
|---|
| | 193 | p_intf->p_sys->p_slider = (GtkHScale*) lookup_widget( p_intf->p_sys->p_window, "timeSlider" ); |
|---|
| | 194 | p_intf->p_sys->p_slider_label = (GtkLabel*) lookup_widget( p_intf->p_sys->p_window, "timeLabel" ); |
|---|
| 198 | 195 | if (p_intf->p_sys->p_slider == NULL) |
|---|
| 199 | 196 | msg_Err( p_intf, "Time slider widget not found." ); |
|---|
| … | … | |
| 201 | 198 | msg_Err( p_intf, "Time label widget not found." ); |
|---|
| 202 | 199 | |
|---|
| 203 | | #if 0 |
|---|
| 204 | 200 | /* Connect the date display to the slider */ |
|---|
| 205 | | msg_Dbg( p_intf, "setting slider adjustment ... " ); |
|---|
| 206 | | #define P_SLIDER GTK_RANGE( gtk_object_get_data( \ |
|---|
| 207 | | GTK_OBJECT( p_intf->p_sys->p_window ), "timeSlider" ) ) |
|---|
| 208 | | p_intf->p_sys->p_adj = gtk_range_get_adjustment( P_SLIDER ); |
|---|
| | 201 | p_intf->p_sys->p_adj = gtk_range_get_adjustment( GTK_RANGE(p_intf->p_sys->p_slider) ); |
|---|
| 209 | 202 | if (p_intf->p_sys->p_adj == NULL) |
|---|
| 210 | 203 | msg_Err( p_intf, "Adjustment range not found." ); |
|---|
| 211 | | gtk_signal_connect ( GTK_OBJECT( p_intf->p_sys->p_adj ), "value_changed", |
|---|
| 212 | | GTK_SIGNAL_FUNC( E_(GtkDisplayDate) ), NULL ); |
|---|
| | 204 | g_signal_connect( GTK_OBJECT( p_intf->p_sys->p_adj ), "value_changed", |
|---|
| | 205 | G_CALLBACK( E_(GtkDisplayDate) ), p_intf ); |
|---|
| 213 | 206 | p_intf->p_sys->f_adj_oldvalue = 0; |
|---|
| 214 | 207 | p_intf->p_sys->i_adj_oldvalue = 0; |
|---|
| 215 | | #undef P_SLIDER |
|---|
| 216 | | msg_Dbg( p_intf, "setting slider adjustment ... done" ); |
|---|
| 217 | | #endif |
|---|
| 218 | 208 | |
|---|
| 219 | 209 | /* BEGIN OF FILEVIEW GTK_TREE_VIEW */ |
|---|
| … | … | |
| 450 | 440 | |
|---|
| 451 | 441 | /* Manage the slider */ |
|---|
| | 442 | #define p_area p_input->stream.p_selected_area |
|---|
| 452 | 443 | if (p_intf->p_libvlc->i_cpu & CPU_CAPABILITY_FPU) |
|---|
| 453 | 444 | { |
|---|
| … | … | |
| 457 | 448 | float newvalue = p_intf->p_sys->p_adj->value; |
|---|
| 458 | 449 | |
|---|
| 459 | | #define p_area p_input->stream.p_selected_area |
|---|
| 460 | 450 | /* If the user hasn't touched the slider since the last time, |
|---|
| 461 | 451 | * then the input can safely change it */ |
|---|
| … | … | |
| 466 | 456 | p_intf->p_sys->f_adj_oldvalue = |
|---|
| 467 | 457 | ( 100. * p_area->i_tell ) / p_area->i_size; |
|---|
| 468 | | gtk_signal_emit_by_name( GTK_OBJECT( p_intf->p_sys->p_adj ), |
|---|
| | 458 | g_signal_emit_by_name( GTK_OBJECT( p_intf->p_sys->p_adj ), |
|---|
| 469 | 459 | "value_changed" ); |
|---|
| 470 | 460 | } |
|---|
| … | … | |
| 483 | 473 | p_intf->p_sys->f_adj_oldvalue = newvalue; |
|---|
| 484 | 474 | } |
|---|
| 485 | | #undef p_area |
|---|
| 486 | 475 | } |
|---|
| 487 | 476 | } |
|---|
| … | … | |
| 493 | 482 | off_t newvalue = p_intf->p_sys->p_adj->value; |
|---|
| 494 | 483 | |
|---|
| 495 | | #define p_area p_input->stream.p_selected_area |
|---|
| 496 | 484 | /* If the user hasn't touched the slider since the last time, |
|---|
| 497 | 485 | * then the input can safely change it */ |
|---|
| … | … | |
| 502 | 490 | p_intf->p_sys->i_adj_oldvalue = |
|---|
| 503 | 491 | ( 100 * p_area->i_tell ) / p_area->i_size; |
|---|
| 504 | | gtk_signal_emit_by_name( GTK_OBJECT( p_intf->p_sys->p_adj ), |
|---|
| | 492 | g_signal_emit_by_name( GTK_OBJECT( p_intf->p_sys->p_adj ), |
|---|
| 505 | 493 | "value_changed" ); |
|---|
| 506 | 494 | } |
|---|
| … | … | |
| 519 | 507 | p_intf->p_sys->i_adj_oldvalue = newvalue; |
|---|
| 520 | 508 | } |
|---|
| 521 | | #undef p_area |
|---|
| 522 | 509 | } |
|---|
| 523 | 510 | } |
|---|
| | 511 | #undef p_area |
|---|
| 524 | 512 | } |
|---|
| 525 | 513 | vlc_mutex_unlock( &p_input->stream.stream_lock ); |
|---|
| … | … | |
| 555 | 543 | * The lock has to be taken before you call the function. |
|---|
| 556 | 544 | *****************************************************************************/ |
|---|
| 557 | | void E_(GtkDisplayDate)( GtkAdjustment *p_adj ) |
|---|
| | 545 | void E_(GtkDisplayDate)( GtkAdjustment *p_adj, gpointer userdata ) |
|---|
| 558 | 546 | { |
|---|
| 559 | 547 | intf_thread_t *p_intf; |
|---|
| 560 | 548 | |
|---|
| 561 | | p_intf = gtk_object_get_data( GTK_OBJECT( p_adj ), "p_intf" ); |
|---|
| 562 | | |
|---|
| 563 | | #ifdef WIN32 |
|---|
| | 549 | p_intf = (intf_thread_t*) userdata; |
|---|
| | 550 | if (p_intf == NULL) |
|---|
| | 551 | return; |
|---|
| | 552 | |
|---|
| 564 | 553 | if( p_intf->p_sys->p_input ) |
|---|
| 565 | 554 | { |
|---|
| … | … | |
| 572 | 561 | #undef p_area |
|---|
| 573 | 562 | } |
|---|
| 574 | | #endif |
|---|
| 575 | 563 | } |
|---|
| 576 | 564 | |
|---|
| … | … | |
| 583 | 571 | gint E_(GtkModeManage)( intf_thread_t * p_intf ) |
|---|
| 584 | 572 | { |
|---|
| 585 | | GtkWidget * p_slider; |
|---|
| | 573 | GtkWidget * p_slider = NULL; |
|---|
| 586 | 574 | vlc_bool_t b_control; |
|---|
| 587 | 575 | |
|---|
| 588 | | #define GETWIDGET( ptr, name ) GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( \ |
|---|
| 589 | | p_intf->p_sys->ptr ) , ( name ) ) ) |
|---|
| 590 | | /* hide slider */ |
|---|
| 591 | | p_slider = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( |
|---|
| 592 | | p_intf->p_sys->p_window ), "slider" ) ); |
|---|
| 593 | | gtk_widget_hide( GTK_WIDGET( p_slider ) ); |
|---|
| | 576 | if ( p_intf->p_sys->p_window == NULL ) |
|---|
| | 577 | msg_Err( p_intf, "Main widget not found" ); |
|---|
| | 578 | |
|---|
| | 579 | p_slider = lookup_widget( p_intf->p_sys->p_window, "timeSlider"); |
|---|
| | 580 | if (p_slider == NULL) |
|---|
| | 581 | msg_Err( p_intf, "Slider widget not found" ); |
|---|
| 594 | 582 | |
|---|
| 595 | 583 | /* controls unavailable */ |
|---|
| … | … | |
| 602 | 590 | if( p_intf->p_sys->p_input->stream.b_seekable ) |
|---|
| 603 | 591 | { |
|---|
| 604 | | msg_Dbg( p_intf, "Updating slider widget" ); |
|---|
| 605 | | if (p_intf->p_libvlc->i_cpu & CPU_CAPABILITY_FPU) |
|---|
| 606 | | p_intf->p_sys->p_adj->value = p_intf->p_sys->f_adj_oldvalue = 0; |
|---|
| 607 | | else |
|---|
| 608 | | p_intf->p_sys->p_adj->value = p_intf->p_sys->i_adj_oldvalue = 0; |
|---|
| 609 | | gtk_signal_emit_by_name( GTK_OBJECT( p_intf->p_sys->p_adj ), |
|---|
| 610 | | "value_changed" ); |
|---|
| 611 | 592 | gtk_widget_show( GTK_WIDGET( p_slider ) ); |
|---|
| 612 | 593 | } |
|---|
| | 594 | else |
|---|
| | 595 | { |
|---|
| | 596 | /* hide slider */ |
|---|
| | 597 | gtk_widget_hide( GTK_WIDGET( p_slider ) ); |
|---|
| | 598 | } |
|---|
| 613 | 599 | |
|---|
| 614 | 600 | /* control buttons for free pace streams */ |
|---|
| … | … | |
| 620 | 606 | |
|---|
| 621 | 607 | /* set control items */ |
|---|
| 622 | | gtk_widget_set_sensitive( GETWIDGET(p_window, "tbRewind"), b_control ); |
|---|
| 623 | | gtk_widget_set_sensitive( GETWIDGET(p_window, "tbPause"), b_control ); |
|---|
| 624 | | gtk_widget_set_sensitive( GETWIDGET(p_window, "tbForward"), b_control ); |
|---|
| 625 | | |
|---|
| 626 | | #undef GETWIDGET |
|---|
| | 608 | gtk_widget_set_sensitive( lookup_widget( p_intf->p_sys->p_window, "tbRewind"), b_control ); |
|---|
| | 609 | gtk_widget_set_sensitive( lookup_widget( p_intf->p_sys->p_window, "tbPause"), b_control ); |
|---|
| | 610 | gtk_widget_set_sensitive( lookup_widget( p_intf->p_sys->p_window, "tbForward"), b_control ); |
|---|
| 627 | 611 | return TRUE; |
|---|
| 628 | 612 | } |
|---|
| r9ac4974 |
r0c6e14d |
|
| 152 | 152 | <property name="value_pos">GTK_POS_RIGHT</property> |
|---|
| 153 | 153 | <property name="digits">3</property> |
|---|
| 154 | | <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> |
|---|
| | 154 | <property name="update_policy">GTK_UPDATE_DISCONTINUOUS</property> |
|---|
| 155 | 155 | <property name="inverted">False</property> |
|---|
| 156 | | <property name="adjustment">3 0 100 1 6.25 0</property> |
|---|
| | 156 | <property name="adjustment">0 0 100 1 6.25 0</property> |
|---|
| 157 | 157 | <signal name="button_release_event" handler="SliderRelease" last_modification_time="Fri, 26 Sep 2003 12:28:09 GMT"/> |
|---|
| 158 | 158 | <signal name="button_press_event" handler="SliderPress" last_modification_time="Fri, 26 Sep 2003 12:28:14 GMT"/> |
|---|
| | 159 | <signal name="move_slider" handler="SliderMove" last_modification_time="Sat, 06 Dec 2003 22:37:00 GMT"/> |
|---|
| 159 | 160 | </widget> |
|---|
| 160 | 161 | <packing> |
|---|
| … | … | |
| 1810 | 1811 | <property name="visibility">True</property> |
|---|
| 1811 | 1812 | <property name="max_length">0</property> |
|---|
| 1812 | | <property name="text" translatable="yes">huffyuv</property> |
|---|
| | 1813 | <property name="text" translatable="yes"></property> |
|---|
| 1813 | 1814 | <property name="has_frame">True</property> |
|---|
| 1814 | 1815 | <property name="invisible_char" translatable="yes">*</property> |
|---|
| … | … | |
| 2151 | 2152 | <property name="visibility">True</property> |
|---|
| 2152 | 2153 | <property name="max_length">0</property> |
|---|
| 2153 | | <property name="text" translatable="yes">127.0.0.1</property> |
|---|
| | 2154 | <property name="text" translatable="yes"></property> |
|---|
| 2154 | 2155 | <property name="has_frame">True</property> |
|---|
| 2155 | 2156 | <property name="invisible_char" translatable="yes">*</property> |
|---|
| … | … | |
| 2222 | 2223 | <property name="visibility">True</property> |
|---|
| 2223 | 2224 | <property name="max_length">0</property> |
|---|
| 2224 | | <property name="text" translatable="yes">ps</property> |
|---|
| | 2225 | <property name="text" translatable="yes"></property> |
|---|
| 2225 | 2226 | <property name="has_frame">True</property> |
|---|
| 2226 | 2227 | <property name="invisible_char" translatable="yes">*</property> |
|---|
| … | … | |
| 2347 | 2348 | <property name="visibility">True</property> |
|---|
| 2348 | 2349 | <property name="max_length">0</property> |
|---|
| 2349 | | <property name="text" translatable="yes">alaw</property> |
|---|
| | 2350 | <property name="text" translatable="yes"></property> |
|---|
| 2350 | 2351 | <property name="has_frame">True</property> |
|---|
| 2351 | 2352 | <property name="invisible_char" translatable="yes">*</property> |
|---|
| … | … | |
| 2544 | 2545 | <property name="visibility">True</property> |
|---|
| 2545 | 2546 | <property name="max_length">0</property> |
|---|
| 2546 | | <property name="text" translatable="yes">udp</property> |
|---|
| | 2547 | <property name="text" translatable="yes"></property> |
|---|
| 2547 | 2548 | <property name="has_frame">True</property> |
|---|
| 2548 | 2549 | <property name="invisible_char" translatable="yes">*</property> |
|---|
| r9ac4974 |
r0c6e14d |
|
| 3 | 3 | ***************************************************************************** |
|---|
| 4 | 4 | * Copyright (C) 2000, 2001 VideoLAN |
|---|
| 5 | | * $Id: pda_callbacks.c,v 1.21 2003/11/30 23:19:13 jpsaman Exp $ |
|---|
| | 5 | * $Id: pda_callbacks.c,v 1.22 2003/12/06 22:41:40 jpsaman Exp $ |
|---|
| 6 | 6 | * |
|---|
| 7 | 7 | * Authors: Jean-Paul Saman <jpsaman@wxs.nl> |
|---|
| … | … | |
| 432 | 432 | intf_thread_t *p_intf = GtkGetIntf( widget ); |
|---|
| 433 | 433 | |
|---|
| | 434 | msg_Dbg( p_intf, "SliderButton Release" ); |
|---|
| 434 | 435 | vlc_mutex_lock( &p_intf->change_lock ); |
|---|
| 435 | 436 | p_intf->p_sys->b_slider_free = 1; |
|---|
| … | … | |
| 444 | 445 | intf_thread_t *p_intf = GtkGetIntf( widget ); |
|---|
| 445 | 446 | |
|---|
| | 447 | msg_Dbg( p_intf, "SliderButton Press" ); |
|---|
| 446 | 448 | vlc_mutex_lock( &p_intf->change_lock ); |
|---|
| 447 | 449 | p_intf->p_sys->b_slider_free = 0; |
|---|
| … | … | |
| 450 | 452 | return TRUE; |
|---|
| 451 | 453 | } |
|---|
| | 454 | |
|---|
| | 455 | void SliderMove(GtkRange *range, GtkScrollType scroll, gpointer user_data) |
|---|
| | 456 | { |
|---|
| | 457 | intf_thread_t *p_intf = GtkGetIntf( range ); |
|---|
| | 458 | msg_Dbg( p_intf, "SliderButton Move" ); |
|---|
| | 459 | } |
|---|
| | 460 | |
|---|
| 452 | 461 | |
|---|
| 453 | 462 | void addSelectedToPlaylist(GtkTreeModel *model, GtkTreePath *path, |
|---|
| … | … | |
| 1082 | 1091 | GtkCheckButton *p_checkSLP = NULL; |
|---|
| 1083 | 1092 | GtkEntry *p_entryStdAccess = NULL; |
|---|
| 1084 | | const gchar *p_std_access; |
|---|
| | 1093 | const gchar *p_std_access = NULL; |
|---|
| 1085 | 1094 | gboolean b_announce = FALSE; |
|---|
| 1086 | 1095 | |
|---|
| r9ac4974 |
r0c6e14d |
|
| 3 | 3 | ***************************************************************************** |
|---|
| 4 | 4 | * Copyright (C) 2003 VideoLAN |
|---|
| 5 | | * $Id: pda_callbacks.h,v 1.10 2003/11/30 23:19:13 jpsaman Exp $ |
|---|
| | 5 | * $Id: pda_callbacks.h,v 1.11 2003/12/06 22:41:40 jpsaman Exp $ |
|---|
| 6 | 6 | * |
|---|
| 7 | 7 | * Authors: Jean-Paul Saman <jpsaman@wxs.nl> |
|---|
| … | … | |
| 149 | 149 | onEntryStdAccessChanged (GtkEditable *editable, |
|---|
| 150 | 150 | gpointer user_data); |
|---|
| | 151 | |
|---|
| | 152 | void |
|---|
| | 153 | SliderMove (GtkRange *range, |
|---|
| | 154 | GtkScrollType scroll, |
|---|
| | 155 | gpointer user_data); |
|---|
| | 156 | |
|---|
| r9ac4974 |
r0c6e14d |
|
| 310 | 310 | gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), timeLabel, NULL, NULL); |
|---|
| 311 | 311 | |
|---|
| 312 | | timeSlider = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (3, 0, 100, 1, 6.25, 0))); |
|---|
| | 312 | timeSlider = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 100, 1, 6.25, 0))); |
|---|
| 313 | 313 | gtk_widget_set_name (timeSlider, "timeSlider"); |
|---|
| 314 | 314 | gtk_widget_show (timeSlider); |
|---|
| … | … | |
| 317 | 317 | gtk_scale_set_value_pos (GTK_SCALE (timeSlider), GTK_POS_RIGHT); |
|---|
| 318 | 318 | gtk_scale_set_digits (GTK_SCALE (timeSlider), 3); |
|---|
| | 319 | gtk_range_set_update_policy (GTK_RANGE (timeSlider), GTK_UPDATE_DISCONTINUOUS); |
|---|
| 319 | 320 | |
|---|
| 320 | 321 | notebook = gtk_notebook_new (); |
|---|
| … | … | |
| 894 | 895 | gtk_widget_set_name (entryVideoCodec, "entryVideoCodec"); |
|---|
| 895 | 896 | gtk_widget_show (entryVideoCodec); |
|---|
| 896 | | gtk_entry_set_text (GTK_ENTRY (entryVideoCodec), _("huffyuv")); |
|---|
| 897 | 897 | gtk_entry_set_activates_default (GTK_ENTRY (entryVideoCodec), TRUE); |
|---|
| 898 | 898 | |
|---|
| … | … | |
| 1004 | 1004 | gtk_widget_set_name (entryStdURL, "entryStdURL"); |
|---|
| 1005 | 1005 | gtk_widget_show (entryStdURL); |
|---|
| 1006 | | gtk_entry_set_text (GTK_ENTRY (entryStdURL), _("127.0.0.1")); |
|---|
| 1007 | 1006 | gtk_entry_set_activates_default (GTK_ENTRY (entryStdURL), TRUE); |
|---|
| 1008 | 1007 | |
|---|
| … | … | |
| 1029 | 1028 | gtk_widget_set_name (entryStdMuxer, "entryStdMuxer"); |
|---|
| 1030 | 1029 | gtk_widget_show (entryStdMuxer); |
|---|
| 1031 | | gtk_entry_set_text (GTK_ENTRY (entryStdMuxer), _("ps")); |
|---|
| 1032 | 1030 | gtk_entry_set_activates_default (GTK_ENTRY (entryStdMuxer), TRUE); |
|---|
| 1033 | 1031 | |
|---|
| … | … | |
| 1062 | 1060 | gtk_widget_set_name (entryAudioCodec, "entryAudioCodec"); |
|---|
| 1063 | 1061 | gtk_widget_show (entryAudioCodec); |
|---|
| 1064 | | gtk_entry_set_text (GTK_ENTRY (entryAudioCodec), _("alaw")); |
|---|
| 1065 | 1062 | gtk_entry_set_activates_default (GTK_ENTRY (entryAudioCodec), TRUE); |
|---|
| 1066 | 1063 | |
|---|
| … | … | |
| 1132 | 1129 | gtk_widget_set_name (entryStdAccess, "entryStdAccess"); |
|---|
| 1133 | 1130 | gtk_widget_show (entryStdAccess); |
|---|
| 1134 | | gtk_entry_set_text (GTK_ENTRY (entryStdAccess), _("udp")); |
|---|
| 1135 | 1131 | gtk_entry_set_activates_default (GTK_ENTRY (entryStdAccess), TRUE); |
|---|
| 1136 | 1132 | |
|---|
| … | … | |
| 1371 | 1367 | g_signal_connect ((gpointer) timeSlider, "button_press_event", |
|---|
| 1372 | 1368 | G_CALLBACK (SliderPress), |
|---|
| | 1369 | NULL); |
|---|
| | 1370 | g_signal_connect ((gpointer) timeSlider, "move_slider", |
|---|
| | 1371 | G_CALLBACK (SliderMove), |
|---|
| 1373 | 1372 | NULL); |
|---|
| 1374 | 1373 | g_signal_connect ((gpointer) tvFileList, "row_activated", |
|---|