Initial Commit
This commit is contained in:
149
database/perl/vendor/lib/Alien/Build/Plugin/Decode/DirListing.pm
vendored
Normal file
149
database/perl/vendor/lib/Alien/Build/Plugin/Decode/DirListing.pm
vendored
Normal file
@@ -0,0 +1,149 @@
|
||||
package Alien::Build::Plugin::Decode::DirListing;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use 5.008004;
|
||||
use Alien::Build::Plugin;
|
||||
use File::Basename ();
|
||||
|
||||
# ABSTRACT: Plugin to extract links from a directory listing
|
||||
our $VERSION = '2.38'; # VERSION
|
||||
|
||||
|
||||
sub init
|
||||
{
|
||||
my($self, $meta) = @_;
|
||||
|
||||
$meta->add_requires('share' => 'File::Listing' => 0);
|
||||
$meta->add_requires('share' => 'URI' => 0);
|
||||
|
||||
$meta->register_hook( decode => sub {
|
||||
my(undef, $res) = @_;
|
||||
|
||||
die "do not know how to decode @{[ $res->{type} ]}"
|
||||
unless $res->{type} eq 'dir_listing';
|
||||
|
||||
my $base = URI->new($res->{base});
|
||||
|
||||
return {
|
||||
type => 'list',
|
||||
list => [
|
||||
map {
|
||||
my($name) = @$_;
|
||||
my $basename = $name;
|
||||
$basename =~ s{/$}{};
|
||||
my %h = (
|
||||
filename => File::Basename::basename($basename),
|
||||
url => URI->new_abs($name, $base)->as_string,
|
||||
);
|
||||
\%h;
|
||||
} File::Listing::parse_dir($res->{content})
|
||||
],
|
||||
};
|
||||
});
|
||||
|
||||
$self;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=encoding UTF-8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Alien::Build::Plugin::Decode::DirListing - Plugin to extract links from a directory listing
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
version 2.38
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use alienfile;
|
||||
plugin 'Decode::DirListing';
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Note: in most case you will want to use L<Alien::Build::Plugin::Download::Negotiate>
|
||||
instead. It picks the appropriate decode plugin based on your platform and environment.
|
||||
In some cases you may need to use this plugin directly instead.
|
||||
|
||||
This plugin decodes a ftp file listing into a list of candidates for your Prefer plugin.
|
||||
It is useful when fetching from an FTP server via L<Alien::Build::Plugin::Fetch::LWP>.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Alien::Build::Plugin::Download::Negotiate>, L<Alien::Build::Plugin::Decode::DirListingFtpcopy>, L<Alien::Build>, L<alienfile>, L<Alien::Build::MM>, L<Alien>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Author: Graham Ollis E<lt>plicease@cpan.orgE<gt>
|
||||
|
||||
Contributors:
|
||||
|
||||
Diab Jerius (DJERIUS)
|
||||
|
||||
Roy Storey (KIWIROY)
|
||||
|
||||
Ilya Pavlov
|
||||
|
||||
David Mertens (run4flat)
|
||||
|
||||
Mark Nunberg (mordy, mnunberg)
|
||||
|
||||
Christian Walde (Mithaldu)
|
||||
|
||||
Brian Wightman (MidLifeXis)
|
||||
|
||||
Zaki Mughal (zmughal)
|
||||
|
||||
mohawk (mohawk2, ETJ)
|
||||
|
||||
Vikas N Kumar (vikasnkumar)
|
||||
|
||||
Flavio Poletti (polettix)
|
||||
|
||||
Salvador Fandiño (salva)
|
||||
|
||||
Gianni Ceccarelli (dakkar)
|
||||
|
||||
Pavel Shaydo (zwon, trinitum)
|
||||
|
||||
Kang-min Liu (劉康民, gugod)
|
||||
|
||||
Nicholas Shipp (nshp)
|
||||
|
||||
Juan Julián Merelo Guervós (JJ)
|
||||
|
||||
Joel Berger (JBERGER)
|
||||
|
||||
Petr Pisar (ppisar)
|
||||
|
||||
Lance Wicks (LANCEW)
|
||||
|
||||
Ahmad Fatoum (a3f, ATHREEF)
|
||||
|
||||
José Joaquín Atria (JJATRIA)
|
||||
|
||||
Duke Leto (LETO)
|
||||
|
||||
Shoichi Kaji (SKAJI)
|
||||
|
||||
Shawn Laffan (SLAFFAN)
|
||||
|
||||
Paul Evans (leonerd, PEVANS)
|
||||
|
||||
Håkon Hægland (hakonhagland, HAKONH)
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
This software is copyright (c) 2011-2020 by Graham Ollis.
|
||||
|
||||
This is free software; you can redistribute it and/or modify it under
|
||||
the same terms as the Perl 5 programming language system itself.
|
||||
|
||||
=cut
|
||||
154
database/perl/vendor/lib/Alien/Build/Plugin/Decode/DirListingFtpcopy.pm
vendored
Normal file
154
database/perl/vendor/lib/Alien/Build/Plugin/Decode/DirListingFtpcopy.pm
vendored
Normal file
@@ -0,0 +1,154 @@
|
||||
package Alien::Build::Plugin::Decode::DirListingFtpcopy;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use 5.008004;
|
||||
use Alien::Build::Plugin;
|
||||
use File::Basename ();
|
||||
|
||||
# ABSTRACT: Plugin to extract links from a directory listing using ftpcopy
|
||||
our $VERSION = '2.38'; # VERSION
|
||||
|
||||
|
||||
sub init
|
||||
{
|
||||
my($self, $meta) = @_;
|
||||
|
||||
$meta->add_requires('share' => 'File::Listing::Ftpcopy' => 0);
|
||||
$meta->add_requires('share' => 'URI' => 0);
|
||||
|
||||
$meta->register_hook( decode => sub {
|
||||
my(undef, $res) = @_;
|
||||
|
||||
die "do not know how to decode @{[ $res->{type} ]}"
|
||||
unless $res->{type} eq 'dir_listing';
|
||||
|
||||
my $base = URI->new($res->{base});
|
||||
|
||||
return {
|
||||
type => 'list',
|
||||
list => [
|
||||
map {
|
||||
my($name) = @$_;
|
||||
my $basename = $name;
|
||||
$basename =~ s{/$}{};
|
||||
my %h = (
|
||||
filename => File::Basename::basename($basename),
|
||||
url => URI->new_abs($name, $base)->as_string,
|
||||
);
|
||||
\%h;
|
||||
} File::Listing::Ftpcopy::parse_dir($res->{content})
|
||||
],
|
||||
};
|
||||
});
|
||||
|
||||
$self;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=encoding UTF-8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Alien::Build::Plugin::Decode::DirListingFtpcopy - Plugin to extract links from a directory listing using ftpcopy
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
version 2.38
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use alienfile;
|
||||
plugin 'Decode::DirListingFtpcopy';
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Note: in most case you will want to use L<Alien::Build::Plugin::Download::Negotiate>
|
||||
instead. It picks the appropriate decode plugin based on your platform and environment.
|
||||
In some cases you may need to use this plugin directly instead.
|
||||
|
||||
This plugin decodes a ftp file listing into a list of candidates for your Prefer plugin.
|
||||
It is useful when fetching from an FTP server via L<Alien::Build::Plugin::Fetch::LWP>.
|
||||
It is different from the similarly named L<Alien::Build::Plugin::Decode::DirListingFtpcopy>
|
||||
in that it uses L<File::Listing::Ftpcopy> instead of L<File::Listing>. The rationale for
|
||||
the C<Ftpcopy> version is that it supports a different set of FTP servers, including
|
||||
OpenVMS. In most cases, however, you probably want to use the non C<Ftpcopy> version
|
||||
since it is pure perl.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Alien::Build::Plugin::Download::Negotiate>, L<Alien::Build::Plugin::Decode::DirListing>, L<Alien::Build>, L<alienfile>, L<Alien::Build::MM>, L<Alien>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Author: Graham Ollis E<lt>plicease@cpan.orgE<gt>
|
||||
|
||||
Contributors:
|
||||
|
||||
Diab Jerius (DJERIUS)
|
||||
|
||||
Roy Storey (KIWIROY)
|
||||
|
||||
Ilya Pavlov
|
||||
|
||||
David Mertens (run4flat)
|
||||
|
||||
Mark Nunberg (mordy, mnunberg)
|
||||
|
||||
Christian Walde (Mithaldu)
|
||||
|
||||
Brian Wightman (MidLifeXis)
|
||||
|
||||
Zaki Mughal (zmughal)
|
||||
|
||||
mohawk (mohawk2, ETJ)
|
||||
|
||||
Vikas N Kumar (vikasnkumar)
|
||||
|
||||
Flavio Poletti (polettix)
|
||||
|
||||
Salvador Fandiño (salva)
|
||||
|
||||
Gianni Ceccarelli (dakkar)
|
||||
|
||||
Pavel Shaydo (zwon, trinitum)
|
||||
|
||||
Kang-min Liu (劉康民, gugod)
|
||||
|
||||
Nicholas Shipp (nshp)
|
||||
|
||||
Juan Julián Merelo Guervós (JJ)
|
||||
|
||||
Joel Berger (JBERGER)
|
||||
|
||||
Petr Pisar (ppisar)
|
||||
|
||||
Lance Wicks (LANCEW)
|
||||
|
||||
Ahmad Fatoum (a3f, ATHREEF)
|
||||
|
||||
José Joaquín Atria (JJATRIA)
|
||||
|
||||
Duke Leto (LETO)
|
||||
|
||||
Shoichi Kaji (SKAJI)
|
||||
|
||||
Shawn Laffan (SLAFFAN)
|
||||
|
||||
Paul Evans (leonerd, PEVANS)
|
||||
|
||||
Håkon Hægland (hakonhagland, HAKONH)
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
This software is copyright (c) 2011-2020 by Graham Ollis.
|
||||
|
||||
This is free software; you can redistribute it and/or modify it under
|
||||
the same terms as the Perl 5 programming language system itself.
|
||||
|
||||
=cut
|
||||
162
database/perl/vendor/lib/Alien/Build/Plugin/Decode/HTML.pm
vendored
Normal file
162
database/perl/vendor/lib/Alien/Build/Plugin/Decode/HTML.pm
vendored
Normal file
@@ -0,0 +1,162 @@
|
||||
package Alien::Build::Plugin::Decode::HTML;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use 5.008004;
|
||||
use Alien::Build::Plugin;
|
||||
use File::Basename ();
|
||||
|
||||
# ABSTRACT: Plugin to extract links from HTML
|
||||
our $VERSION = '2.38'; # VERSION
|
||||
|
||||
|
||||
sub init
|
||||
{
|
||||
my($self, $meta) = @_;
|
||||
|
||||
$meta->add_requires('share' => 'HTML::LinkExtor' => 0);
|
||||
$meta->add_requires('share' => 'URI' => 0);
|
||||
$meta->add_requires('share' => 'URI::Escape' => 0);
|
||||
|
||||
$meta->register_hook( decode => sub {
|
||||
my(undef, $res) = @_;
|
||||
|
||||
die "do not know how to decode @{[ $res->{type} ]}"
|
||||
unless $res->{type} eq 'html';
|
||||
|
||||
my $base = URI->new($res->{base});
|
||||
|
||||
my @list;
|
||||
|
||||
my $p = HTML::LinkExtor->new(sub {
|
||||
my($tag, %links) = @_;
|
||||
if($tag eq 'base' && $links{href})
|
||||
{
|
||||
$base = URI->new($links{href});
|
||||
}
|
||||
elsif($tag eq 'a' && $links{href})
|
||||
{
|
||||
my $href = $links{href};
|
||||
return if $href =~ m!^\.\.?/?$!;
|
||||
my $url = URI->new_abs($href, $base);
|
||||
my $path = $url->path;
|
||||
$path =~ s{/$}{}; # work around for Perl 5.8.7- gh#8
|
||||
push @list, {
|
||||
filename => URI::Escape::uri_unescape(File::Basename::basename($path)),
|
||||
url => URI::Escape::uri_unescape($url->as_string),
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
$p->parse($res->{content});
|
||||
|
||||
return {
|
||||
type => 'list',
|
||||
list => \@list,
|
||||
};
|
||||
});
|
||||
|
||||
$self;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=encoding UTF-8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Alien::Build::Plugin::Decode::HTML - Plugin to extract links from HTML
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
version 2.38
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use alienfile;
|
||||
plugin 'Decode::HTML';
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Note: in most case you will want to use L<Alien::Build::Plugin::Download::Negotiate>
|
||||
instead. It picks the appropriate decode plugin based on your platform and environment.
|
||||
In some cases you may need to use this plugin directly instead.
|
||||
|
||||
This plugin decodes an HTML file listing into a list of candidates for your Prefer plugin.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Alien::Build::Plugin::Download::Negotiate>, L<Alien::Build>, L<alienfile>, L<Alien::Build::MM>, L<Alien>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Author: Graham Ollis E<lt>plicease@cpan.orgE<gt>
|
||||
|
||||
Contributors:
|
||||
|
||||
Diab Jerius (DJERIUS)
|
||||
|
||||
Roy Storey (KIWIROY)
|
||||
|
||||
Ilya Pavlov
|
||||
|
||||
David Mertens (run4flat)
|
||||
|
||||
Mark Nunberg (mordy, mnunberg)
|
||||
|
||||
Christian Walde (Mithaldu)
|
||||
|
||||
Brian Wightman (MidLifeXis)
|
||||
|
||||
Zaki Mughal (zmughal)
|
||||
|
||||
mohawk (mohawk2, ETJ)
|
||||
|
||||
Vikas N Kumar (vikasnkumar)
|
||||
|
||||
Flavio Poletti (polettix)
|
||||
|
||||
Salvador Fandiño (salva)
|
||||
|
||||
Gianni Ceccarelli (dakkar)
|
||||
|
||||
Pavel Shaydo (zwon, trinitum)
|
||||
|
||||
Kang-min Liu (劉康民, gugod)
|
||||
|
||||
Nicholas Shipp (nshp)
|
||||
|
||||
Juan Julián Merelo Guervós (JJ)
|
||||
|
||||
Joel Berger (JBERGER)
|
||||
|
||||
Petr Pisar (ppisar)
|
||||
|
||||
Lance Wicks (LANCEW)
|
||||
|
||||
Ahmad Fatoum (a3f, ATHREEF)
|
||||
|
||||
José Joaquín Atria (JJATRIA)
|
||||
|
||||
Duke Leto (LETO)
|
||||
|
||||
Shoichi Kaji (SKAJI)
|
||||
|
||||
Shawn Laffan (SLAFFAN)
|
||||
|
||||
Paul Evans (leonerd, PEVANS)
|
||||
|
||||
Håkon Hægland (hakonhagland, HAKONH)
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
This software is copyright (c) 2011-2020 by Graham Ollis.
|
||||
|
||||
This is free software; you can redistribute it and/or modify it under
|
||||
the same terms as the Perl 5 programming language system itself.
|
||||
|
||||
=cut
|
||||
209
database/perl/vendor/lib/Alien/Build/Plugin/Decode/Mojo.pm
vendored
Normal file
209
database/perl/vendor/lib/Alien/Build/Plugin/Decode/Mojo.pm
vendored
Normal file
@@ -0,0 +1,209 @@
|
||||
package Alien::Build::Plugin::Decode::Mojo;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use 5.008004;
|
||||
use Alien::Build::Plugin;
|
||||
|
||||
# ABSTRACT: Plugin to extract links from HTML using Mojo::DOM or Mojo::DOM58
|
||||
our $VERSION = '2.38'; # VERSION
|
||||
|
||||
|
||||
sub _load ($;$)
|
||||
{
|
||||
my($class, $version) = @_;
|
||||
my $pm = "$class.pm";
|
||||
$pm =~ s/::/\//g;
|
||||
eval { require $pm };
|
||||
return 0 if $@;
|
||||
if(defined $version)
|
||||
{
|
||||
eval { $class->VERSION($version) };
|
||||
return 0 if $@;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
has _class => sub {
|
||||
return 'Mojo::DOM58' if _load 'Mojo::DOM58';
|
||||
return 'Mojo::DOM' if _load 'Mojo::DOM' and _load 'Mojolicious', 7.00;
|
||||
return 'Mojo::DOM58';
|
||||
};
|
||||
|
||||
sub init
|
||||
{
|
||||
my($self, $meta) = @_;
|
||||
|
||||
$meta->add_requires('share' => 'URI' => 0);
|
||||
$meta->add_requires('share' => 'URI::Escape' => 0);
|
||||
|
||||
my $class = $meta->prop->{plugin_decode_mojo_class} ||= $self->_class;
|
||||
|
||||
if($class eq 'Mojo::DOM58')
|
||||
{
|
||||
$meta->add_requires('share' => 'Mojo::DOM58' => '1.00');
|
||||
}
|
||||
elsif($class eq 'Mojo::DOM')
|
||||
{
|
||||
$meta->add_requires('share' => 'Mojolicious' => '7.00');
|
||||
$meta->add_requires('share' => 'Mojo::DOM' => '0');
|
||||
}
|
||||
else
|
||||
{
|
||||
die "bad class";
|
||||
}
|
||||
|
||||
$meta->register_hook( decode => sub {
|
||||
my(undef, $res) = @_;
|
||||
|
||||
die "do not know how to decode @{[ $res->{type} ]}"
|
||||
unless $res->{type} eq 'html';
|
||||
|
||||
my $dom = $class->new($res->{content});
|
||||
|
||||
my $base = URI->new($res->{base});
|
||||
|
||||
if(my $base_element = $dom->find('head base')->first)
|
||||
{
|
||||
my $href = $base_element->attr('href');
|
||||
$base = URI->new($href) if defined $href;
|
||||
}
|
||||
|
||||
my @list = map {
|
||||
my $url = URI->new_abs($_, $base);
|
||||
my $path = $url->path;
|
||||
$path =~ s{/$}{}; # work around for Perl 5.8.7- gh#8
|
||||
{
|
||||
filename => URI::Escape::uri_unescape(File::Basename::basename($path)),
|
||||
url => URI::Escape::uri_unescape($url->as_string),
|
||||
}
|
||||
}
|
||||
grep !/^\.\.?\/?$/,
|
||||
map { $_->attr('href') || () }
|
||||
@{ $dom->find('a')->to_array };
|
||||
|
||||
return {
|
||||
type => 'list',
|
||||
list => \@list,
|
||||
};
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=encoding UTF-8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Alien::Build::Plugin::Decode::Mojo - Plugin to extract links from HTML using Mojo::DOM or Mojo::DOM58
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
version 2.38
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use alienfile;
|
||||
plugin 'Decode::Mojo';
|
||||
|
||||
Force using C<Decode::Mojo> via the download negotiator:
|
||||
|
||||
use alienfile 1.68;
|
||||
|
||||
configure {
|
||||
requires 'Alien::Build::Plugin::Decode::Mojo';
|
||||
};
|
||||
|
||||
plugin 'Download' => (
|
||||
...
|
||||
decoder => 'Decode::Mojo',
|
||||
);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Note: in most cases you will want to use L<Alien::Build::Plugin::Download::Negotiate>
|
||||
instead. It picks the appropriate decode plugin based on your platform and environment.
|
||||
In some cases you may need to use this plugin directly instead.
|
||||
|
||||
This plugin decodes an HTML file listing into a list of candidates for your Prefer plugin.
|
||||
It works just like L<Alien::Build::Plugin::Decode::HTML> except it uses either L<Mojo::DOM>
|
||||
or L<Mojo::DOM58> to do its job.
|
||||
|
||||
This plugin is much lighter than The C<Decode::HTML> plugin, and doesn't require XS. It
|
||||
is the default decode plugin used by L<Alien::Build::Plugin::Download::Negotiate> if it
|
||||
detects that you need to parse an HTML index.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Author: Graham Ollis E<lt>plicease@cpan.orgE<gt>
|
||||
|
||||
Contributors:
|
||||
|
||||
Diab Jerius (DJERIUS)
|
||||
|
||||
Roy Storey (KIWIROY)
|
||||
|
||||
Ilya Pavlov
|
||||
|
||||
David Mertens (run4flat)
|
||||
|
||||
Mark Nunberg (mordy, mnunberg)
|
||||
|
||||
Christian Walde (Mithaldu)
|
||||
|
||||
Brian Wightman (MidLifeXis)
|
||||
|
||||
Zaki Mughal (zmughal)
|
||||
|
||||
mohawk (mohawk2, ETJ)
|
||||
|
||||
Vikas N Kumar (vikasnkumar)
|
||||
|
||||
Flavio Poletti (polettix)
|
||||
|
||||
Salvador Fandiño (salva)
|
||||
|
||||
Gianni Ceccarelli (dakkar)
|
||||
|
||||
Pavel Shaydo (zwon, trinitum)
|
||||
|
||||
Kang-min Liu (劉康民, gugod)
|
||||
|
||||
Nicholas Shipp (nshp)
|
||||
|
||||
Juan Julián Merelo Guervós (JJ)
|
||||
|
||||
Joel Berger (JBERGER)
|
||||
|
||||
Petr Pisar (ppisar)
|
||||
|
||||
Lance Wicks (LANCEW)
|
||||
|
||||
Ahmad Fatoum (a3f, ATHREEF)
|
||||
|
||||
José Joaquín Atria (JJATRIA)
|
||||
|
||||
Duke Leto (LETO)
|
||||
|
||||
Shoichi Kaji (SKAJI)
|
||||
|
||||
Shawn Laffan (SLAFFAN)
|
||||
|
||||
Paul Evans (leonerd, PEVANS)
|
||||
|
||||
Håkon Hægland (hakonhagland, HAKONH)
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
This software is copyright (c) 2011-2020 by Graham Ollis.
|
||||
|
||||
This is free software; you can redistribute it and/or modify it under
|
||||
the same terms as the Perl 5 programming language system itself.
|
||||
|
||||
=cut
|
||||
Reference in New Issue
Block a user