mirror of
https://git.savannah.gnu.org/git/parallel.git
synced 2024-11-22 05:57:54 +00:00
Released as 20111122 ('Silvio').
This commit is contained in:
parent
8caad4be8a
commit
140337dc73
46
NEWS
46
NEWS
|
@ -1,3 +1,47 @@
|
|||
20111122
|
||||
|
||||
* GNU Parallel package for Fedora.
|
||||
https://admin.fedoraproject.org/pkgdb/acls/name/parallel
|
||||
|
||||
* Using GNU Parallel with Mozilla cross referencing.
|
||||
https://blog.mozilla.com/it/2011/11/15/mxr-improvements/
|
||||
|
||||
* Neat flash presentation of GNU Parallel.
|
||||
http://prezi.com/0nq74b2elgtx/about-gnu-parallel/
|
||||
|
||||
* How to create tar files of dirs in parallel.
|
||||
https://joneslee85.wordpress.com/2011/11/22/shell-tips-how-to-recursively-archive-many-folders/
|
||||
|
||||
* Article in Admin Network&Security by Ben Martin.
|
||||
http://www.admin-magazine.com/HPC/Articles/GNU-Parallel
|
||||
|
||||
* Blog post in Polish.
|
||||
http://blog.tiger.com.pl/2011/01/05/gnu-parallel/
|
||||
|
||||
* Blog post on using GNU Parallel of Mac OS X.
|
||||
http://www.0xcb0.com/2011/10/19/running-parallel-bash-tasks-on-os-x/
|
||||
|
||||
* Blog post in English about using zip with GNU Parallel.
|
||||
http://nuclear-imaging.info/site_content/2011/05/11/gnu-parallel/
|
||||
|
||||
* Blog post in English by researcher.
|
||||
http://zandyware.wordpress.com/2011/10/15/gnu-parallell-make-best-use-of-your-multicore-computer/
|
||||
|
||||
* Blog entry in Chinese.
|
||||
http://blog.csdn.net/tossense/article/details/6889026
|
||||
|
||||
* Blog entry in Japanese on managing many servers.
|
||||
http://hiroakis.com/blog/2011/11/13/gnu-parallel/
|
||||
|
||||
* GNU Parallel is now part of ppbs.
|
||||
http://physiology.med.cornell.edu/faculty/mason/lab/ppbs/introduction/introduction.html
|
||||
|
||||
* How to use GNU Parallel with MCX.
|
||||
http://mcx.sourceforge.net/cgi-bin/index.cgi?MMC/Doc/MMCCluster
|
||||
|
||||
* Bug fixes and man page updates.
|
||||
|
||||
|
||||
20111022
|
||||
|
||||
* --tag prepends lines with the argument(s). If used with --(n)onall
|
||||
|
@ -22,7 +66,7 @@
|
|||
* Blog post on recompression FLAC audio.
|
||||
http://blog.oxplot.com/2011/08/reflac-flac-cleanser.html
|
||||
|
||||
* The most complex use of ::: I a seen so far.
|
||||
* The most complex use of ::: I have seen so far.
|
||||
http://agentzlerich.blogspot.com/2011/09/following-up-on-previous-failures-ive.html
|
||||
|
||||
* Example of using GNU Parallel with sudo.
|
||||
|
|
20
configure
vendored
20
configure
vendored
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.68 for parallel 20111022.
|
||||
# Generated by GNU Autoconf 2.68 for parallel 20111122.
|
||||
#
|
||||
# Report bugs to <bug-parallel@gnu.org>.
|
||||
#
|
||||
|
@ -559,8 +559,8 @@ MAKEFLAGS=
|
|||
# Identity of this package.
|
||||
PACKAGE_NAME='parallel'
|
||||
PACKAGE_TARNAME='parallel'
|
||||
PACKAGE_VERSION='20111022'
|
||||
PACKAGE_STRING='parallel 20111022'
|
||||
PACKAGE_VERSION='20111122'
|
||||
PACKAGE_STRING='parallel 20111122'
|
||||
PACKAGE_BUGREPORT='bug-parallel@gnu.org'
|
||||
PACKAGE_URL=''
|
||||
|
||||
|
@ -1176,7 +1176,7 @@ if test "$ac_init_help" = "long"; then
|
|||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures parallel 20111022 to adapt to many kinds of systems.
|
||||
\`configure' configures parallel 20111122 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
|
@ -1242,7 +1242,7 @@ fi
|
|||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of parallel 20111022:";;
|
||||
short | recursive ) echo "Configuration of parallel 20111122:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
|
@ -1309,7 +1309,7 @@ fi
|
|||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
parallel configure 20111022
|
||||
parallel configure 20111122
|
||||
generated by GNU Autoconf 2.68
|
||||
|
||||
Copyright (C) 2010 Free Software Foundation, Inc.
|
||||
|
@ -1326,7 +1326,7 @@ cat >config.log <<_ACEOF
|
|||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by parallel $as_me 20111022, which was
|
||||
It was created by parallel $as_me 20111122, which was
|
||||
generated by GNU Autoconf 2.68. Invocation command line was
|
||||
|
||||
$ $0 $@
|
||||
|
@ -2141,7 +2141,7 @@ fi
|
|||
|
||||
# Define the identity of the package.
|
||||
PACKAGE='parallel'
|
||||
VERSION='20111022'
|
||||
VERSION='20111122'
|
||||
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
|
@ -2704,7 +2704,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by parallel $as_me 20111022, which was
|
||||
This file was extended by parallel $as_me 20111122, which was
|
||||
generated by GNU Autoconf 2.68. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
|
@ -2766,7 +2766,7 @@ _ACEOF
|
|||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||
ac_cs_version="\\
|
||||
parallel config.status 20111022
|
||||
parallel config.status 20111122
|
||||
configured by $0, generated by GNU Autoconf 2.68,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
AC_INIT([parallel], [20111022], [bug-parallel@gnu.org])
|
||||
AC_INIT([parallel], [20111122], [bug-parallel@gnu.org])
|
||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_FILES([
|
||||
|
|
|
@ -1,11 +1,4 @@
|
|||
Fejler:
|
||||
|
||||
parallel -qv echo {#} {1} {1.} {} {.} {/} {//} ::: a.b/c.d
|
||||
parallel -Xqv echo {#} a{1}{1.} {} ::: a.b/c.d
|
||||
parallel -Xqv echo {#}a{1}{1.} {} ::: a.b/c.d
|
||||
seq 2 | parallel -v echo {2} ::: c :::: -
|
||||
parallel echo {2} ::: a ::: b
|
||||
|
||||
--timeout auto: If a jobs takes > 3*average runtime then kill it. Only after job 3.
|
||||
|
||||
niceload seeks last column:
|
||||
|
||||
|
@ -13,6 +6,10 @@ iostat -x 1 2
|
|||
|
||||
niceload --start-condition
|
||||
|
||||
niceload should prioritize jobs and only unsuspend the highest
|
||||
priority job. If the running job with lowest pri has run for 1 sec:
|
||||
Consider unsuspending next pri job.
|
||||
|
||||
|
||||
Til QUOTING:
|
||||
|
||||
|
@ -166,8 +163,11 @@ Dont start:
|
|||
* seek
|
||||
|
||||
|
||||
= Videos =
|
||||
|
||||
# GNU Parallel 20111022 - The Steve Ritchie release
|
||||
== Ideas ==
|
||||
|
||||
# GNU Parallel 20111122 - The Silvio release
|
||||
|
||||
--tag
|
||||
-Jt (e.g. --tag --nonall)
|
||||
|
@ -178,7 +178,12 @@ Dont start:
|
|||
|
||||
./src/parallel --sshloginfile ~/.parallel/remote --slf ~/.parallel/local --nonall hostname
|
||||
|
||||
sem
|
||||
|
||||
single file installation
|
||||
|
||||
|
||||
== Video: GNU Parallel 20110522 - The Pakistan Release ==
|
||||
|
||||
# GNU Parallel 20110522 - The Pakistan Release
|
||||
|
||||
|
|
|
@ -187,13 +187,25 @@ Subject: GNU Parallel 20111122 ('Silvio') released
|
|||
GNU Parallel 20111122 ('Silvio') has been released. It is
|
||||
available for download at: http://ftp.gnu.org/gnu/parallel/
|
||||
|
||||
This is a bugfix release with no new features. Probably a good release
|
||||
for stable long-term use.
|
||||
|
||||
New in this release:
|
||||
|
||||
* GNU Parallel package for Fedora.
|
||||
https://admin.fedoraproject.org/pkgdb/acls/name/parallel
|
||||
|
||||
* GNU Parallel is now part of ppbs.
|
||||
http://physiology.med.cornell.edu/faculty/mason/lab/ppbs/introduction/introduction.html
|
||||
* Using GNU Parallel with Mozilla cross referencing.
|
||||
https://blog.mozilla.com/it/2011/11/15/mxr-improvements/
|
||||
|
||||
* Neat flash presentation of GNU Parallel.
|
||||
http://prezi.com/0nq74b2elgtx/about-gnu-parallel/
|
||||
|
||||
* How to create tar files of dirs in parallel.
|
||||
https://joneslee85.wordpress.com/2011/11/22/shell-tips-how-to-recursively-archive-many-folders/
|
||||
|
||||
* Article in Admin Network&Security by Ben Martin.
|
||||
http://www.admin-magazine.com/HPC/Articles/GNU-Parallel
|
||||
|
||||
* Blog post in Polish.
|
||||
http://blog.tiger.com.pl/2011/01/05/gnu-parallel/
|
||||
|
@ -210,6 +222,15 @@ New in this release:
|
|||
* Blog entry in Chinese.
|
||||
http://blog.csdn.net/tossense/article/details/6889026
|
||||
|
||||
* Blog entry in Japanese on managing many servers.
|
||||
http://hiroakis.com/blog/2011/11/13/gnu-parallel/
|
||||
|
||||
* GNU Parallel is now part of ppbs.
|
||||
http://physiology.med.cornell.edu/faculty/mason/lab/ppbs/introduction/introduction.html
|
||||
|
||||
* How to use GNU Parallel with MCX.
|
||||
http://mcx.sourceforge.net/cgi-bin/index.cgi?MMC/Doc/MMCCluster
|
||||
|
||||
* Bug fixes and man page updates.
|
||||
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
use strict;
|
||||
use Getopt::Long;
|
||||
$Global::progname="niceload";
|
||||
$Global::version = 20111022;
|
||||
$Global::version = 20111122;
|
||||
Getopt::Long::Configure("bundling","require_order");
|
||||
get_options_from_array(\@ARGV) || die_usage();
|
||||
if($::opt_version) {
|
||||
|
|
|
@ -30,25 +30,25 @@ run 1 second, suspend (3.00-1.00) seconds, run 1 second, suspend
|
|||
|
||||
=over 9
|
||||
|
||||
=item B<-f> I<FACTOR> (beta testing)
|
||||
=item B<-f> I<FACTOR>
|
||||
|
||||
=item B<--factor> I<FACTOR> (beta testing)
|
||||
=item B<--factor> I<FACTOR>
|
||||
|
||||
Suspend time factor. Dynamically set B<-s> as amount over limit *
|
||||
factor. Default is 1.
|
||||
|
||||
|
||||
=item B<-H> (beta testing)
|
||||
=item B<-H>
|
||||
|
||||
=item B<--hard> (beta testing)
|
||||
=item B<--hard>
|
||||
|
||||
Hard limit. B<--hard> will suspend the process until the system is
|
||||
under the limits. The default is B<--soft>.
|
||||
|
||||
|
||||
=item B<--io> I<iolimit> (beta testing)
|
||||
=item B<--io> I<iolimit>
|
||||
|
||||
=item B<-I> I<iolimit> (beta testing)
|
||||
=item B<-I> I<iolimit>
|
||||
|
||||
Limit for I/O. The amount of disk I/O will be computed as a value 0 -
|
||||
10, where 0 is no I/O and 10 is at least one disk is 100% satuated.
|
||||
|
@ -56,18 +56,18 @@ Limit for I/O. The amount of disk I/O will be computed as a value 0 -
|
|||
B<--io> will set both B<--start-io> and B<run-io>.
|
||||
|
||||
|
||||
=item B<--load> I<loadlimit> (beta testing)
|
||||
=item B<--load> I<loadlimit>
|
||||
|
||||
=item B<-L> I<loadlimit> (beta testing)
|
||||
=item B<-L> I<loadlimit>
|
||||
|
||||
Limit for load average.
|
||||
|
||||
B<--load> will set both B<--start-load> and B<run-load>.
|
||||
|
||||
|
||||
=item B<--mem> I<memlimit> (beta testing)
|
||||
=item B<--mem> I<memlimit>
|
||||
|
||||
=item B<-M> I<memlimit> (beta testing)
|
||||
=item B<-M> I<memlimit>
|
||||
|
||||
Limit for free memory. This is the amount of bytes available as free
|
||||
+ cache. This limit is treated opposite other limits: If the system
|
||||
|
@ -81,9 +81,9 @@ respectively.
|
|||
B<--mem> will set both B<--start-mem> and B<run-mem>.
|
||||
|
||||
|
||||
=item B<--noswap> (beta testing)
|
||||
=item B<--noswap>
|
||||
|
||||
=item B<-N> (beta testing)
|
||||
=item B<-N>
|
||||
|
||||
No swapping. If the system is swapping both in and out it is a good
|
||||
indication that the system is memory stressed.
|
||||
|
@ -93,88 +93,88 @@ B<--noswap> is over limit if the system is swapping both in and out.
|
|||
B<--noswap> will set both B<--start-noswap> and B<run-noswap>.
|
||||
|
||||
|
||||
=item B<-n> I<niceness> (beta testing)
|
||||
=item B<-n> I<niceness>
|
||||
|
||||
=item B<--nice> I<niceness> (beta testing)
|
||||
=item B<--nice> I<niceness>
|
||||
|
||||
Sets niceness. See B<nice>(1).
|
||||
|
||||
|
||||
=item B<-p> I<PID> (beta testing)
|
||||
=item B<-p> I<PID>
|
||||
|
||||
=item B<--pid> I<PID> (beta testing)
|
||||
=item B<--pid> I<PID>
|
||||
|
||||
Process ID of process to suspend.
|
||||
|
||||
|
||||
=item B<--quote> (beta testing)
|
||||
=item B<--quote>
|
||||
|
||||
=item B<-q> (beta testing)
|
||||
=item B<-q>
|
||||
|
||||
Quote the command line. Useful if the command contains chars like *,
|
||||
$, >, and " that should not be interpreted by the shell.
|
||||
|
||||
|
||||
=item B<--run-io> I<iolimit> (beta testing)
|
||||
=item B<--run-io> I<iolimit>
|
||||
|
||||
=item B<--ri> I<iolimit> (beta testing)
|
||||
=item B<--ri> I<iolimit>
|
||||
|
||||
=item B<--run-load> I<loadlimit> (beta testing)
|
||||
=item B<--run-load> I<loadlimit>
|
||||
|
||||
=item B<--rl> I<loadlimit> (beta testing)
|
||||
=item B<--rl> I<loadlimit>
|
||||
|
||||
=item B<--run-mem> I<memlimit> (beta testing)
|
||||
=item B<--run-mem> I<memlimit>
|
||||
|
||||
=item B<--rm> I<memlimit> (beta testing)
|
||||
=item B<--rm> I<memlimit>
|
||||
|
||||
Run limit. The running program will be slowed down if the system is
|
||||
above the limit. See: B<--io>, B<--load>, B<--mem>, B<--noswap>.
|
||||
|
||||
|
||||
=item B<--start-io> I<iolimit> (beta testing)
|
||||
=item B<--start-io> I<iolimit>
|
||||
|
||||
=item B<--si> I<iolimit> (beta testing)
|
||||
=item B<--si> I<iolimit>
|
||||
|
||||
=item B<--start-load> I<loadlimit> (beta testing)
|
||||
=item B<--start-load> I<loadlimit>
|
||||
|
||||
=item B<--sl> I<loadlimit> (beta testing)
|
||||
=item B<--sl> I<loadlimit>
|
||||
|
||||
=item B<--start-mem> I<memlimit> (beta testing)
|
||||
=item B<--start-mem> I<memlimit>
|
||||
|
||||
=item B<--sm> I<memlimit> (beta testing)
|
||||
=item B<--sm> I<memlimit>
|
||||
|
||||
Start limit. The program will not start until the system is below the
|
||||
limit. See: B<--io>, B<--load>, B<--mem>, B<--noswap>.
|
||||
|
||||
|
||||
=item B<--soft> (beta testing)
|
||||
=item B<--soft>
|
||||
|
||||
=item B<-S> (beta testing)
|
||||
=item B<-S>
|
||||
|
||||
Soft limit. B<niceload> will suspend a process for a while and then
|
||||
let it run for a second thus only slowing down a process while the
|
||||
system is over one of the given limits. This is the default.
|
||||
|
||||
|
||||
=item B<--suspend> I<SEC> (beta testing)
|
||||
=item B<--suspend> I<SEC>
|
||||
|
||||
=item B<-s> I<SEC> (beta testing)
|
||||
=item B<-s> I<SEC>
|
||||
|
||||
Suspend time. Suspend the command this many seconds when the max load
|
||||
average is reached.
|
||||
|
||||
|
||||
=item B<--recheck> I<SEC> (beta testing)
|
||||
=item B<--recheck> I<SEC>
|
||||
|
||||
=item B<-t> I<SEC> (beta testing)
|
||||
=item B<-t> I<SEC>
|
||||
|
||||
Recheck load time. Sleep SEC seconds before checking load
|
||||
again. Default is 1 second.
|
||||
|
||||
|
||||
=item B<--verbose> (beta testing)
|
||||
=item B<--verbose>
|
||||
|
||||
=item B<-v> (beta testing)
|
||||
=item B<-v>
|
||||
|
||||
Verbose. Print some extra output on what is happening. Use B<-v> until
|
||||
you know what your are doing.
|
||||
|
|
|
@ -502,7 +502,7 @@ sub get_options_from_array {
|
|||
sub parse_options {
|
||||
# Returns: N/A
|
||||
# Defaults:
|
||||
$Global::version = 20111115;
|
||||
$Global::version = 20111122;
|
||||
$Global::progname = 'parallel';
|
||||
$Global::infinity = 2**31;
|
||||
$Global::debug = 0;
|
||||
|
|
|
@ -434,7 +434,7 @@ If I<eof-str> is omitted, there is no end of file string. If neither
|
|||
B<-E> nor B<-e> is used, no end of file string is used.
|
||||
|
||||
|
||||
=item B<--eta> (alpha testing)
|
||||
=item B<--eta> (beta testing)
|
||||
|
||||
Show the estimated number of seconds before finishing. This forces GNU
|
||||
B<parallel> to read all jobs before starting to find the number of
|
||||
|
@ -648,7 +648,7 @@ B<-l 0> is an alias for B<-l 1>.
|
|||
Implies B<-X> unless B<-m> is set.
|
||||
|
||||
|
||||
=item B<--load> I<max-load> (beta testing)
|
||||
=item B<--load> I<max-load>
|
||||
|
||||
Do not start new jobs on a given computer unless the load is less than
|
||||
I<max-load>. I<max-load> uses the same syntax as B<--jobs>, so I<100%>
|
||||
|
@ -709,7 +709,7 @@ This is useful for scripts that depend on features only available from
|
|||
a certain version of GNU B<parallel>.
|
||||
|
||||
|
||||
=item B<--nonall> (beta testing)
|
||||
=item B<--nonall>
|
||||
|
||||
B<--onall> with no arguments. Run the command on all computers given
|
||||
with B<--sshlogin> but take no arguments. GNU B<parallel> will log
|
||||
|
@ -720,7 +720,7 @@ This is useful for running the same command (e.g. uptime) on a list of
|
|||
servers.
|
||||
|
||||
|
||||
=item B<--onall> (beta testing)
|
||||
=item B<--onall>
|
||||
|
||||
Run all the jobs on all computers given with B<--sshlogin>. GNU
|
||||
B<parallel> will log into B<--jobs> number of computers in parallel
|
||||
|
@ -860,9 +860,9 @@ from the terminal. Only run the command line if the response starts
|
|||
with 'y' or 'Y'. Implies B<-t>.
|
||||
|
||||
|
||||
=item B<--profile> I<profilename> (alpha testing)
|
||||
=item B<--profile> I<profilename> (beta testing)
|
||||
|
||||
=item B<-J> I<profilename> (alpha testing)
|
||||
=item B<-J> I<profilename> (beta testing)
|
||||
|
||||
Use profile I<profilename> for options. This is useful if you want to
|
||||
have multiple profiles. You could have one profile for running jobs in
|
||||
|
@ -1102,9 +1102,9 @@ B<--sshlogin> is often used with B<--transfer>, B<--return>,
|
|||
B<--cleanup>, and B<--trc>.
|
||||
|
||||
|
||||
=item B<--sshloginfile> I<filename> (alpha testing)
|
||||
=item B<--sshloginfile> I<filename> (beta testing)
|
||||
|
||||
=item B<--slf> I<filename> (alpha testing)
|
||||
=item B<--slf> I<filename> (beta testing)
|
||||
|
||||
File with sshlogins. The file consists of sshlogins on separate
|
||||
lines. Empty lines and lines starting with '#' are ignored. Example:
|
||||
|
@ -1166,7 +1166,7 @@ and it will open a tty for the job. When the job is done, the next job
|
|||
will get the tty.
|
||||
|
||||
|
||||
=item B<--tag> (alpha testing)
|
||||
=item B<--tag> (beta testing)
|
||||
|
||||
Tag lines with arguments. Each output line will be prepended with the
|
||||
arguments and TAB (\t). When combined with B<--onall> or B<--nonall>
|
||||
|
@ -1183,7 +1183,7 @@ different dir for the files. Setting B<--tmpdir> is equivalent to
|
|||
setting $TMPDIR.
|
||||
|
||||
|
||||
=item B<--timeout> I<sec> (beta testing)
|
||||
=item B<--timeout> I<sec>
|
||||
|
||||
Time out for command. If the command runs for longer than I<sec>
|
||||
seconds it will get killed with SIGTERM, followed by SIGTERM 200 ms
|
||||
|
|
2
src/sql
2
src/sql
|
@ -556,7 +556,7 @@ $Global::Initfile && unlink $Global::Initfile;
|
|||
exit ($err);
|
||||
|
||||
sub parse_options {
|
||||
$Global::version = 20111022;
|
||||
$Global::version = 20111122;
|
||||
$Global::progname = 'sql';
|
||||
|
||||
# This must be done first as this may exec myself
|
||||
|
|
|
@ -10,6 +10,7 @@ sleep 0.1; echo opt--interactive 2 ?...n
|
|||
sleep 0.1; echo opt--interactive 3 ?...y
|
||||
opt--interactive 1
|
||||
opt--interactive 3
|
||||
|
||||
### Test -L -l and --max-lines
|
||||
a_b
|
||||
c
|
||||
|
|
Loading…
Reference in a new issue