6 |
// INCLUDE CURRENT-PROBLEMS |
// INCLUDE CURRENT-PROBLEMS |
7 |
include('include/current-problems.php'); |
include('include/current-problems.php'); |
8 |
|
|
9 |
$tabs = array('cfg_graphic', 'cfg_network', 'cfg_input', 'client_auth', 'cfg_autostart', 'client_serials', 'cfg_comments', 'cfg_printers', 'cfg_sessions', 'cfg_modules', 'cfg_other_menuitems', 'cfg_screensaver', 'client_version'); |
$tabs = array('cfg_graphic', 'cfg_network', 'cfg_input', 'client_auth', 'cfg_autostart', 'client_serials', 'cfg_comments', 'cfg_printers', 'cfg_sessions', 'cfg_modules', 'cfg_other_menuitems', 'cfg_screensaver', 'client_version', 'cfg_plugins'); |
10 |
$multi= array( 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0); |
$multi= array( 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1); |
11 |
$data = array(); |
$data = array(); |
12 |
|
|
13 |
|
|
32 |
|
|
33 |
// FELD-DEFINITIONEN (ARRAY=>DROPDOWN / HIDDEN / IGNORE / 1 / BOLD / PASSWORD / SHOW / SHOWTIME / MONITORID) |
// FELD-DEFINITIONEN (ARRAY=>DROPDOWN / HIDDEN / IGNORE / 1 / BOLD / PASSWORD / SHOW / SHOWTIME / MONITORID) |
34 |
$drop = array(); |
$drop = array(); |
35 |
if($alxos >= '0.5.3') |
if($alxos >= '0.6.0') |
36 |
|
{ |
37 |
|
$drop['cfg_graphic_module'] = array('vesa', 'ati', 'cirrus', 'i710', 'intel', 'nv', 'mach64', 'mga', 'openchrome', 'radeon', 's3', 's3virge', 'savage', 'sis', 'trident', 'tseng', 'vmware'); |
38 |
|
} |
39 |
|
else if($alxos >= '0.5.3') |
40 |
{ |
{ |
41 |
$drop['cfg_graphic_module'] = array('vesa', 'ati', 'cirrus', 'i710', 'intel', 'nv', 'mach64', 'mga', 'openchrome', 'radeon', 's3', 's3virge', 'savage', 'sis', 'trident', 'tseng'); |
$drop['cfg_graphic_module'] = array('vesa', 'ati', 'cirrus', 'i710', 'intel', 'nv', 'mach64', 'mga', 'openchrome', 'radeon', 's3', 's3virge', 'savage', 'sis', 'trident', 'tseng'); |
42 |
} |
} |
48 |
$drop['depth'] = array('24', '16', '8'); |
$drop['depth'] = array('24', '16', '8'); |
49 |
$drop['mouse'] = array('Auto', 'IMPS/2', 'PS/2'); |
$drop['mouse'] = array('Auto', 'IMPS/2', 'PS/2'); |
50 |
$drop['keyboard'] = array('PC105'); |
$drop['keyboard'] = array('PC105'); |
51 |
if($alxos >= '0.6.0') { |
if($alxos >= '0.6.0') |
52 |
|
{ |
53 |
$drop['cfg_network_module'] = array('3c509', '3c59x', '8139cp', '8139too', '8390', 'amd8111e', 'atl1c', 'atl1e', 'atl1', 'atl2', 'b44', 'bnx2', 'cnic', 'e100', 'e1000', 'e1000e', 'forcedeth', 'igb', 'ipg', 'jme', 'natsemi', 'ne2k-pci', 'ns83820', 'pcnet32', 'qla3xxx', 'r8169', 'sis190', 'sis900', 'skge', 'sky2', 'tg3', 'typhoon', 'via-rhine', 'via-velocity', 'adm8211', 'airo', 'at76c50x-usb', 'ar9170usb', 'ath5k', 'ath9k', 'atmel', 'b43', 'b43legacy', 'hostap_pci', 'hostap_plx', 'ipw2100', 'ipw2200', 'iwl3945', 'usb8xxx', 'libertas_tf', 'libertas_tf_usb', 'mwl8k', 'orinoco', 'orinoco_nortel', 'orinoco_plx', 'orinoco_tmd', 'orinoco_usb', 'p54pci', 'p54usb', 'prism54', 'rndis_wlan', 'rt2400pci', 'rt2500pci', 'rt2500usb', 'rt2800pci', 'rt2800usb', 'rt61pci', 'rt73usb', 'rtl8180', 'rtl8187', 'wl1251', 'wl1271', 'zd1201', 'zd1211rw'); |
$drop['cfg_network_module'] = array('3c509', '3c59x', '8139cp', '8139too', '8390', 'amd8111e', 'atl1c', 'atl1e', 'atl1', 'atl2', 'b44', 'bnx2', 'cnic', 'e100', 'e1000', 'e1000e', 'forcedeth', 'igb', 'ipg', 'jme', 'natsemi', 'ne2k-pci', 'ns83820', 'pcnet32', 'qla3xxx', 'r8169', 'sis190', 'sis900', 'skge', 'sky2', 'tg3', 'typhoon', 'via-rhine', 'via-velocity', 'adm8211', 'airo', 'at76c50x-usb', 'ar9170usb', 'ath5k', 'ath9k', 'atmel', 'b43', 'b43legacy', 'hostap_pci', 'hostap_plx', 'ipw2100', 'ipw2200', 'iwl3945', 'usb8xxx', 'libertas_tf', 'libertas_tf_usb', 'mwl8k', 'orinoco', 'orinoco_nortel', 'orinoco_plx', 'orinoco_tmd', 'orinoco_usb', 'p54pci', 'p54usb', 'prism54', 'rndis_wlan', 'rt2400pci', 'rt2500pci', 'rt2500usb', 'rt2800pci', 'rt2800usb', 'rt61pci', 'rt73usb', 'rtl8180', 'rtl8187', 'wl1251', 'wl1271', 'zd1201', 'zd1211rw'); |
54 |
} else { |
} |
55 |
|
else |
56 |
|
{ |
57 |
$drop['cfg_network_module'] = array('3c59x', '8139too', '8139cp', 'e100', 'ne2k-pci', 'pcnet32', 'sis900', 'via-rhine', 'zd1211', 'b44', 'bnx2', 'dl2k', 'e1000', 'forcedeth', 'r8169', 'sk98lin', 'tg3', 'via-velocity'); |
$drop['cfg_network_module'] = array('3c59x', '8139too', '8139cp', 'e100', 'ne2k-pci', 'pcnet32', 'sis900', 'via-rhine', 'zd1211', 'b44', 'bnx2', 'dl2k', 'e1000', 'forcedeth', 'r8169', 'sk98lin', 'tg3', 'via-velocity'); |
58 |
} |
} |
59 |
$drop['networking'] = array('dhcp', 'static'); |
$drop['networking'] = array('dhcp', 'static'); |
60 |
$drop['port'] = array('lpt1', 'usb1', 'usb2', 'com1', 'com2', 'lpd', 'socket', 'ipp'); |
// 0.6.0 does not support lpd, ipp and socket printing atm |
61 |
|
if($alxos>='0.6.0') |
62 |
|
{ |
63 |
|
$drop['port'] = array('lpt1', 'usb1', 'usb2', 'com1', 'com2'); |
64 |
|
for ($i=0; $i<999; $i++) { $drop['cfg_printers_'.$i.'_ip'] = 'ignore'; } |
65 |
|
$drop['share'] = 'ignore'; |
66 |
|
} |
67 |
|
else |
68 |
|
{ |
69 |
|
$drop['cfg_printers_port'] = array('lpt1', 'usb1', 'usb2', 'com1', 'com2', 'lpd', 'socket', 'ipp'); |
70 |
|
} |
71 |
$drop['location'] = sqlarr('SELECT location FROM client_locations', '', 'location'); |
$drop['location'] = sqlarr('SELECT location FROM client_locations', '', 'location'); |
72 |
$drop['id'] = 'hidden'; |
$drop['id'] = 'hidden'; |
73 |
$drop['flg_modified'] = '1'; |
$drop['flg_modified'] = '1'; |
86 |
$drop['session'] = 'bold'; |
$drop['session'] = 'bold'; |
87 |
if($alxos>='0.6.0') |
if($alxos>='0.6.0') |
88 |
{ |
{ |
89 |
$drop['cfg_autostart_session'] = array(''); |
$drop['cfg_autostart_session'] = sqlarr('SELECT filename FROM cfg_sessions where serial='.$id, '', 'filename'); |
90 |
$drop['cfg_autostart_session'] += sqlarr('SELECT filename FROM cfg_sessions where serial='.$id, 'array', 'filename'); |
array_unshift($drop['cfg_autostart_session'], ""); |
91 |
} |
} |
92 |
else |
else |
93 |
{ |
{ |
126 |
$drop['wireless_key'] = 'password'; |
$drop['wireless_key'] = 'password'; |
127 |
$drop['wireless_key_ascii'] = 'password'; |
$drop['wireless_key_ascii'] = 'password'; |
128 |
|
|
129 |
|
// plugin support |
130 |
|
if($alxos>='0.6.0') |
131 |
|
{ |
132 |
|
for ($i=0; $i<999; $i++) { $drop['cfg_plugins_'.$i.'_plugin'] = 'pluginconfig'; } |
133 |
|
for ($i=0; $i<999; $i++) |
134 |
|
{ |
135 |
|
$drop['cfg_plugins_'.$i.'_plugin_array'] = sqlarr('SELECT plugin FROM avail_plugins', '', 'plugin'); |
136 |
|
array_unshift($drop['cfg_plugins_'.$i.'_plugin_array'], ""); |
137 |
|
} |
138 |
|
} |
139 |
|
else |
140 |
|
{ |
141 |
|
for ($i=0; $i<999; $i++) { $drop['cfg_plugins_'.$i.'_id'] = 'ignore'; } |
142 |
|
for ($i=0; $i<999; $i++) { $drop['cfg_plugins_'.$i.'_serial'] = 'ignore'; } |
143 |
|
for ($i=0; $i<999; $i++) { $drop['cfg_plugins_'.$i.'_plugin'] = 'ignore'; } |
144 |
|
} |
145 |
|
|
146 |
|
// get current citrix sessions |
147 |
|
if($alxos>='0.6.0') |
148 |
|
{ |
149 |
|
// split all citrix server into an array to get the first server from list |
150 |
|
$citrix_query_browser = split(";", $citrix_browseradrs); |
151 |
|
exec($wwwroot.'/pnabrowse-wrapper -A '.$citrix_query_browser[0], $returned_citrix_sessions, $retval); |
152 |
|
if ($retval == 0) |
153 |
|
{ |
154 |
|
$citrix_public_applications = str_replace("'", "", $returned_citrix_sessions); |
155 |
|
// add an empty value add the first position of the array as session-default |
156 |
|
array_unshift($citrix_public_applications, ""); |
157 |
|
for ($i=0; $i<999; $i++) { $drop['cfg_sessions_'.$i.'_session'] = $citrix_public_applications; } |
158 |
|
} |
159 |
|
else if($retval = 126) echo "pnabrowser-wrapper has no execute permission! please run chmod +x on ".$wwwroot."/pnabrowser-wrapper."; |
160 |
|
else echo "pnabrowse-wrapper does not run successfully! retval->'".$retval."'<br>"; |
161 |
|
} |
162 |
|
|
163 |
// GGF. NEUEN DATENSATZ EINFÜGEN |
// GGF. NEUEN DATENSATZ EINFÜGEN |
164 |
if(isset($_POST['do_add'])) |
if(isset($_POST['do_add'])) |
165 |
{ |
{ |
167 |
if($what=='COMMENT') sqladd('cfg_comments', array('serial'=>$id)); |
if($what=='COMMENT') sqladd('cfg_comments', array('serial'=>$id)); |
168 |
else if($what=='PRINTER') sqladd('cfg_printers', array('serial'=>$id)); |
else if($what=='PRINTER') sqladd('cfg_printers', array('serial'=>$id)); |
169 |
else if($what=='MODULE') sqladd('cfg_modules', array('serial'=>$id)); |
else if($what=='MODULE') sqladd('cfg_modules', array('serial'=>$id)); |
170 |
else if($what=='SESSION') sqladd('cfg_sessions', array('domain'=>'DOM_AKA_NT', 'browseradrs'=>'128.20.50.50;128.20.50.66;128.20.50.71;128.20.50.46;128.20.100.31;128.20.100.32', 'serial'=>$id)); |
else if($what=='SESSION') sqladd('cfg_sessions', array('domain'=>$citrix_domain_name, 'browseradrs'=>$citrix_browseradrs, 'serial'=>$id)); |
171 |
else if($what=='MENUITEM') sqladd('cfg_other_menuitems', array('serial'=>$id)); |
else if($what=='MENUITEM') sqladd('cfg_other_menuitems', array('serial'=>$id)); |
172 |
|
else if($what=='PLUGIN') sqladd('cfg_plugins', array('serial'=>$id)); |
173 |
} |
} |
174 |
|
|
175 |
|
|
311 |
else if($d=='password') echo '<tr><td class="key">'.$k2.'</td><td>= <input type=password style="width:144px" name="'.$name.'_'.$k.'" value="KEEPPASS"></td></tr>'; |
else if($d=='password') echo '<tr><td class="key">'.$k2.'</td><td>= <input type=password style="width:144px" name="'.$name.'_'.$k.'" value="KEEPPASS"></td></tr>'; |
312 |
else if($d=='txt') echo '<tr><td colspan=2><textarea style="width:240px; background-color:#d5e5ff" rows=4 name="'.$name.'_'.$k.'">'.$v.'</textarea></td></tr>'; |
else if($d=='txt') echo '<tr><td colspan=2><textarea style="width:240px; background-color:#d5e5ff" rows=4 name="'.$name.'_'.$k.'">'.$v.'</textarea></td></tr>'; |
313 |
else if($d!='ignore') echo '<tr><td class="key">'.$k2.'</td><td>= <input style="width:144px" name="'.$name.'_'.$k.'" value="'.$v.'"></td></tr>'; |
else if($d!='ignore') echo '<tr><td class="key">'.$k2.'</td><td>= <input style="width:144px" name="'.$name.'_'.$k.'" value="'.$v.'"></td></tr>'; |
314 |
|
else if($d=='pluginconfig') |
315 |
|
{ |
316 |
|
$dplugin = $drop[$name.'_'.$k.'_array']; if($dplugin==null) $dplugin = $drop[$k]; |
317 |
|
if(is_array($dplugin)) |
318 |
|
{ |
319 |
|
echo '<tr><td class="key">'.$k2.'</td><td>= <select style="width:144px" name="'.$name.'_'.$k.'">'; |
320 |
|
foreach($dplugin as $di) if($v==$di) echo '<option selected>'.$di; else echo '<option>'.$di; |
321 |
|
echo '</select></td></tr>'; |
322 |
|
} |
323 |
|
// $v contains the pluginname, get the configure flag |
324 |
|
$pflag = sqlfirst('SELECT configflag FROM avail_plugins WHERE plugin="'.$v.'"'); |
325 |
|
if ($pflag[configflag]==1) echo '<tr><td class="key">configure</td><td>= <input type=button style="width:24px" onclick="window.open(\'plugin.php?id='.$id.'&plugin='.$v.'\', \'PluginWin\', \'width=500,height=400\')" value="..."></td>'; |
326 |
|
} |
327 |
} |
} |
328 |
|
|
329 |
if($del) echo '<tr><td class="key">delete</td><td>=<input type=checkbox name="'.$name.'_delete" value="1"></td></tr>'; |
if($del) echo '<tr><td class="key">delete</td><td>=<input type=checkbox name="'.$name.'_delete" value="1"></td></tr>'; |
347 |
.keytab, input, textarea, select, option { font-size:8pt; font-family:Tahoma } |
.keytab, input, textarea, select, option { font-size:8pt; font-family:Tahoma } |
348 |
.but { font-size:10pt; font-family:Tahoma; height:23px } |
.but { font-size:10pt; font-family:Tahoma; height:23px } |
349 |
</style> |
</style> |
350 |
|
<script type="text/javascript" src="js/jquery-1.2.6.min.js"></script> |
351 |
<script language="JavaScript" src="openclose_ajax.js"></script> |
<script language="JavaScript" src="openclose_ajax.js"></script> |
352 |
<script language="JavaScript"> |
<script language="JavaScript"> |
353 |
|
|
356 |
var $url = url.split("?"); |
var $url = url.split("?"); |
357 |
$.ajax({type:""+typ+"",url:$url[0],data:$url[1],cache:false,success:function(data){ alert(data); }}); |
$.ajax({type:""+typ+"",url:$url[0],data:$url[1],cache:false,success:function(data){ alert(data); }}); |
358 |
} |
} |
359 |
|
function plugin(name,id) { window.open('plugin.php?plugin='+name+'&id='+id, '', 'width=350,height=180'); } |
360 |
|
|
361 |
|
/* ignore this atm, not always working, sometime open does not work |
362 |
function openclose(nummer, act) |
function openclose(nummer, act) |
363 |
{ |
{ |
364 |
var bild = document.images['sch_bild_'+nummer]; |
var bild = document.images['sch_bild_'+nummer]; |
365 |
var absatz = document.all['sch_absatz_'+nummer].style; |
var absatz = document.all['sch_absatz_'+nummer].style; |
366 |
var senden = false; |
var senden = false; |
367 |
|
|
368 |
|
$("#sch_absatz_"+nummer).toggle(0, function(){ |
369 |
|
if($(this).css("display")=="none"){$("#sch_bild_"+nummer).attr({title:'OPEN',src:'pics/plus.gif'});}else{$("#sch_bild_"+nummer).attr({title:'CLOSE',src:'pics/minus.gif'});} |
370 |
|
}); |
371 |
|
if(act<=1){ $("#sch_bild_"+nummer).attr({title:'CLOSE',src:'pics/minus.gif'}); }else{ $("#sch_bild_"+nummer).attr({title:'OPEN',src:'pics/plus.gif'}); }; |
372 |
|
} |
373 |
|
*/ |
374 |
|
function openclose(nummer, act) |
375 |
|
{ |
376 |
|
var bild = document.images['sch_bild_'+nummer]; |
377 |
|
var absatz = document.all['sch_absatz_'+nummer].style; |
378 |
|
var senden = false; |
379 |
|
|
380 |
if(bild.title == 'OPEN') |
if(bild.title == 'OPEN') |
381 |
{ |
{ |
382 |
if(act<=1) |
if(act<=1) |
401 |
act = 2; |
act = 2; |
402 |
} |
} |
403 |
} |
} |
404 |
|
|
405 |
if(senden) sendopenclose(nummer,act); |
if(senden) sendopenclose(nummer,act); |
406 |
} |
} |
407 |
|
|
408 |
function showhelp(name) |
function showhelp(name) |
409 |
{ window.open(name, 'HelpWin', 'width=620,height=500,scrollbars=yes'); } |
{ window.open(name, 'HelpWin', 'width=620,height=500,scrollbars=yes'); } |
413 |
|
|
414 |
<body><? |
<body><? |
415 |
|
|
416 |
//echo '<body style="background-image:URL(logo.jpg);background-repeat:no-repeat; background-position:0px 0px; margin-top:25px">'; |
echo '<form action="show.php" method="post" onreset="return confirm(\'UNDO CHANGES?\')">'; |
|
echo '<form action="show.php" method=post onreset="return confirm(\'UNDO CHANGES?\')">'; |
|
417 |
echo '<input type=hidden name="do_upl" value="1">'; |
echo '<input type=hidden name="do_upl" value="1">'; |
418 |
echo '<input type=hidden name="id" value="'.$id.'">'; |
echo '<input type=hidden name="id" value="'.$id.'">'; |
419 |
|
|
448 |
$state = 'Off'; |
$state = 'Off'; |
449 |
if(count($conn)>0) |
if(count($conn)>0) |
450 |
{ |
{ |
|
// passthru($pingcmd." ".$conn['ip']." &> /dev/null && exit 0 || exit 1",$retval); |
|
451 |
if($retval==0) $state = 'On'; |
if($retval==0) $state = 'On'; |
452 |
} |
} |
453 |
|
|
|
|
|
454 |
echo '<img src="pics/logo2.jpg"><br><br>'; |
echo '<img src="pics/logo2.jpg"><br><br>'; |
455 |
|
|
456 |
echo '<input class="but" type=submit value="SAVE" style="width:150px"><br><br>'; |
echo '<input class="but" type=submit value="SAVE" style="width:150px"><br><br>'; |
459 |
echo '<input class="but" type=submit name="do_add" value="SAVE+ADD PRINTER" style="width:150px"><br>'; |
echo '<input class="but" type=submit name="do_add" value="SAVE+ADD PRINTER" style="width:150px"><br>'; |
460 |
echo '<input class="but" type=submit name="do_add" value="SAVE+ADD SESSION" style="width:150px"><br>'; |
echo '<input class="but" type=submit name="do_add" value="SAVE+ADD SESSION" style="width:150px"><br>'; |
461 |
echo '<input class="but" type=submit name="do_add" value="SAVE+ADD MODULE" style="width:150px"><br>'; |
echo '<input class="but" type=submit name="do_add" value="SAVE+ADD MODULE" style="width:150px"><br>'; |
462 |
echo '<input class="but" type=submit name="do_add" value="SAVE+ADD MENUITEM" style="width:150px"><br><br>'; |
echo '<input class="but" type=submit name="do_add" value="SAVE+ADD MENUITEM" style="width:150px"><br>'; |
463 |
|
if($alxos >= '0.6.0') |
464 |
|
{ |
465 |
|
echo '<input class="but" type=submit name="do_add" value="INSTALL PLUGIN" style="width:150px"><br>'; |
466 |
|
} |
467 |
|
echo '<br>'; |
468 |
|
|
469 |
if($id>0) $KILLCAP='DEACTIVATE'; else $KILLCAP='ACTIVATE'; |
if($id>0) $KILLCAP='DEACTIVATE'; else $KILLCAP='ACTIVATE'; |
470 |
echo '<input class="but" type=button value="'.$KILLCAP.'" style="width:150px" onclick="if(confirm(\''.$KILLCAP.' CLIENT #'.abs($id).' ?\')) { window.open(\'show.php?id='.$id.'&kill=1\', \'DeactWin\', \'width=200,height=100\'); location.href=\'index.php\'; }"><br>'; |
echo '<input class="but" type=button value="'.$KILLCAP.'" style="width:150px" onclick="if(confirm(\''.$KILLCAP.' CLIENT #'.abs($id).' ?\')) { window.open(\'show.php?id='.$id.'&kill=1\', \'DeactWin\', \'width=200,height=100\'); location.href=\'index.php\'; }"><br>'; |
488 |
if($state=='On') |
if($state=='On') |
489 |
{ |
{ |
490 |
echo '<u>IP:</u> '.$conn['ip'].'<br><br>'; |
echo '<u>IP:</u> '.$conn['ip'].'<br><br>'; |
491 |
if($alxos >= '0.6.0') { |
if($alxos >= '0.6.0') |
492 |
|
{ |
493 |
$osver = sshdo('os_ver=$(</etc/mageversion);cfg_ver=$(/sbin/magequery -n alxconfig-ng | cut -d" " -f5);pname=${cfg_ver%-*-*};cfg_ver=${cfg_ver/${pname}-};echo "${os_ver}:${cfg_ver}"', $conn['ip']); |
$osver = sshdo('os_ver=$(</etc/mageversion);cfg_ver=$(/sbin/magequery -n alxconfig-ng | cut -d" " -f5);pname=${cfg_ver%-*-*};cfg_ver=${cfg_ver/${pname}-};echo "${os_ver}:${cfg_ver}"', $conn['ip']); |
494 |
} else { |
} |
495 |
|
else |
496 |
|
{ |
497 |
$osver = sshdo('os_ver=$(</etc/mageversion);cfg_ver=$(/sbin/magequery -n alxconfig-ng-alx | cut -d" " -f5);pname=${cfg_ver%-*-*};cfg_ver=${cfg_ver/${pname}-};echo "${os_ver}:${cfg_ver}"', $conn['ip']); |
$osver = sshdo('os_ver=$(</etc/mageversion);cfg_ver=$(/sbin/magequery -n alxconfig-ng-alx | cut -d" " -f5);pname=${cfg_ver%-*-*};cfg_ver=${cfg_ver/${pname}-};echo "${os_ver}:${cfg_ver}"', $conn['ip']); |
498 |
} |
} |
499 |
$osver = explode(':',$osver[1]); |
$osver = explode(':',$osver[1]); |
519 |
} |
} |
520 |
|
|
521 |
echo '</b></div>'; |
echo '</b></div>'; |
|
//echo '<br><br>'; |
|
522 |
|
|
523 |
if($state=='On') |
if($state=='On') |
524 |
{ |
{ |