--- /dev/null
+#!/usr/local/bin/perl
+
+use strict;
+use FindBin qw($RealBin);
+use lib ($RealBin.'/lib');
+use Getopt::Long;
+use pdfreport;
+my $strdata = "";
+my $cfgfile = "";
+GetOptions("data|d=s"=>\$strdata,"config|c=s" => $cfgfile);
+open(CFG,$cfgfile);
+ while (my $l = <CFG>){
+ chomp($l);
+ $l =~ s/^\s+//;
+ if (($l =~ /^#/) || ($l eq "")) {next;}
+ if ($l =~ /\w+=.+/){
+ my ($k1,$k2,$v) = $l =~ m/^(\w+)_(\w+)=\"(.+)\"$/;
+ $self->{lc($k1)}->{lc($k2)} = $v;
+ }
+}
+close(CFG);
+
+my $dbpath = $ENV{HOME}.'/Workspace/dksnas/data';
+my $data = {
+ id_invoice => "469",
+ dsn => 'DBI:SQLite:dbname='.$dbpath.'/invoicejournal/dksbuchhaltung.sqlite'
+};
+my $rep = pdfreport->new({tmplpath => $RealBin.'/report', tmp => $RealBin.'/tmp'});
+my ($result,$file) = $rep->createpdf('ttinvoice',$RealBin.'/output/textinvoice.pdf',$data);
+print "$result: $file\n";
+
+
--- /dev/null
+package pdfreport;
+
+use strict;
+use Template;
+use File::Basename qw/dirname basename/;
+use Data::Dumper;
+use File::Copy::Recursive qw(dircopy);
+sub new {
+ my $class = shift;
+ my $p = shift;
+ my $self = bless {}, $class;
+ $self->{tmplpath} =$p->{tmplpath};
+ $self->{tmp} =$p->{tmp};
+ $self->{pdf} = undef;
+ $self->{template} = undef;
+ #$self->{template} = $p->{template};
+ $self->{pdf}->{app} = "/usr/local/bin/wkhtmltopdf";
+ return $self;
+}
+
+sub createpdf(){
+ my $self = shift;
+ my $template = shift;
+ my $output = shift;
+ my $inputdata = shift;
+ my $r = -1;
+ print $self->{tmplpath}.'/'.$template.'.conf'."\n";
+ if (-e $self->{tmplpath}.'/'.$template.'.conf'){
+ $self->readpdfconfig($template,$inputdata);
+ print Dumper($self->{template});
+ }
+ print Dumper($self->{pdf});
+ print Dumper($self->{template});
+ my $tmpreportpath=$self->{tmplpath};
+ if (exists($self->{pdf}->{engine}) && ($self->{pdf}->{engine} eq "Template::Toolkit")){
+ $template = $self->createTTReport($template);
+ $tmpreportpath = $self->{tmp};
+ }
+ if ((keys(%{$self}) > 0) && (-e $tmpreportpath.'/'.$template.'.html')){
+ my $cmd = '"'.$self->{pdf}->{app}.'"';
+ if ($self->{pdf}->{bottom}){ $cmd .= " -B ".$self->{pdf}->{bottom}; }
+ if ($self->{pdf}->{left}){ $cmd .= " -L ".$self->{pdf}->{left}; }
+ if ($self->{pdf}->{right}){ $cmd .= " -R ".$self->{pdf}->{right}; }
+ if ($self->{pdf}->{top}){ $cmd .= " -T ".$self->{pdf}->{top}; }
+ if ($self->{pdf}->{orientation}){ $cmd .= " -O ".$self->{pdf}->{orientation}; }
+ if ($self->{pdf}->{size}){ $cmd .= " -s ".$self->{pdf}->{size}; }
+ if ($self->{pdf}->{encoding}){ $cmd .= " --encoding '".$self->{pdf}->{encoding}."'"; }
+ if (-e $tmpreportpath.'/'.$template.'.header.html'){
+ $cmd .= ' --header-html "'.$tmpreportpath.'/'.$template.'.header.html"';
+ }
+ if (-e $tmpreportpath.'/'.$template.'.footer.html'){
+ $cmd .= ' --footer-html "'.$tmpreportpath.'/'.$template.'.footer.html"';
+ }
+ $cmd .= ' "'.$tmpreportpath.'/'.$template.'.html"';
+ $cmd .= ' "'.$output.'"';
+ print $cmd."\n";
+ $r = system($cmd);
+ }
+ if (-e $output){
+ return ($r,$output);
+ }
+ return ($r,undef);
+}
+
+sub createTTReport(){
+ my $self = shift;
+ my $template = shift;
+ my $uniquekey = $$;
+ if (-e $self->{tmplpath}.'/'.$template.".tt"){
+ $self->TTtoHTML($self->{tmplpath}.'/'.$template.".tt",$self->{tmp}.'/'.$template.$$.".html");
+ }
+ if (-e $self->{tmplpath}.'/'.$template.".header.tt"){
+ $self->TTtoHTML($self->{tmplpath}.'/'.$template.".header.tt",$self->{tmp}.'/'.$template.$$.".header.html");
+ }
+ if (-e $self->{tmplpath}.'/'.$template.".footer.tt"){
+ $self->TTtoHTML($self->{tmplpath}.'/'.$template.".footer.tt",$self->{tmp}.'/'.$template.$$.".footer.html");
+ }
+ if (-d $self->{tmplpath}.'/'.$template){
+ dircopy($self->{tmplpath}.'/'.$template,$self->{tmp}.'/'.$template);
+ }
+ return $template.$$;
+}
+
+sub TTtoHTML(){
+ my $self = shift;
+ my $ttfile = shift;
+ my $outfile = shift;
+ my $template = Template->new({INCLUDE_PATH => [dirname($ttfile)]});#,ENCODING => 'utf8'
+ $template->process(basename($ttfile),$self->{template},$outfile) || die "Template process failed: ", $template->error(), "\n";#,{binmode => ':utf8'}
+}
+
+sub readpdfconfig(){
+ my $self = shift;
+ my $template = shift;
+ my $inputdata = shift;
+ open(CFG,$self->{tmplpath}.'/'.$template.'.conf');
+ while (my $l = <CFG>){
+ chomp($l);
+ print $l."\n";
+ $l =~ s/^\s+//;
+ if (($l =~ /^#/) || ($l eq "")) {next;}
+ if ($l =~ /\w+=.+/){
+ my ($k1,$k2,$v) = $l =~ m/^(\w+)_(\w+)=\"(.+)\"$/;
+ $self->{lc($k1)}->{lc($k2)} = $v;
+ }
+ }
+ close(CFG);
+ foreach my $ik (keys(%{$inputdata})){
+ $self->{template}->{lc($ik)} = $inputdata->{$ik};
+ }
+}
+1;
\ No newline at end of file
--- /dev/null
+#!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl
+use strict;
+use FindBin qw($RealBin $Bin);
+# use lib ('CGI/api/lib/perl5');
+# use lib ('CGI/api/lib');
+use lib ($Bin.'/CGI/api/lib/perl5');
+use lib ($Bin.'/CGI/api/lib');
+use lib ($RealBin.'/lib/perl5');
+use lib ($RealBin.'/lib');
+use CGI;
+use CGI::Cookie;
+# use CGI::Carp qw/fatalsToBrowser/;
+use File::Basename;
+use JSON::PP;
+use MIME::Type::FileName;
+use dksconfig qw/$sitecfg/;
+use dksdb;
+
+# use session;
+#use sendemail;
+my $cgi = new CGI();
+my $scriptpath = $cgi->url(-absolute => 1);
+my $p = ();
+my @params = $cgi->param();
+foreach my $pe (@params){
+ $p->{$pe} = $cgi->param($pe);
+}
+my $html->{result} = ();
+# $p->{sid} = $cgi->cookie($sitecfg->{cookiename});
+# my $se = session->new();
+# my $sess = $se->getsession($p->{sid});
+print $cgi->header(-type=>"application/json", -charset => "utf-8");
+my $dbredirect = {};
+if ($sitecfg->{dbtype} eq "SQLite"){
+ if (exists($p->{db})){
+ $dbredirect->{dsn} = "DBI:SQLite:dbname=".$sitecfg->{datapath}.'/'.$p->{db}.'.sqlite';
+ }
+}
+#$html->{conn} = $dbredirect;
+# if ($sess == undef){
+# $html->{error} = "No Authorisation";
+# print JSON::PP::encode_json($html);
+# exit(0);
+# }
+# $html->{p} = $p;
+# $html->{sess} =$sess;
+#my $datapath = $ENV{"DOCUMENT_ROOT"}.dirname(dirname($scriptpath)).'/data/';
+if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
+
+ # my @params = $cgi->param();
+ # foreach my $pp (@params){
+ # $p->{$pp} = $cgi->param($pp);
+ # }
+
+ if (exists($p->{list})){
+ #$html->{param} = $p;
+ my $reppath = $sitecfg->{datapath}.'/'.$p->{app}.'/templates/'.$p->{list};
+ #$html->{path} = $reppath;
+ if (-d $reppath){
+ #print "OK!";
+ my @allreps = ();
+ opendir(REP,$reppath);
+ while (my $f = readdir(REP)){
+ if ($f =~ /\.conf$/){
+ my $rep->{name}= $f;
+ $rep->{name} =~ s/\.conf$//;
+ $rep->{label} = $rep->{name};
+
+ open(RTPL,$reppath.'/'.$f);
+ while (my $l = <RTPL>){
+ chomp($l);
+ if ($l =~ /^REPORT_NAME/){
+ my ($k1,$k2,$v) = $l =~ m/^(\w+)_(\w+)=\"(.+)\"$/;
+ $rep->{label} = $v;
+ }
+ }
+ close(RTPL);
+ push(@allreps,$rep);
+ }
+ }
+ closedir(REP);
+ $html->{result}->{reports} = \@allreps;
+ }
+ }
+ elsif (exists($p->{generate})){
+ # my $data = {
+ # id_invoice => "469",
+ # dsn => 'DBI:SQLite:dbname='.$dbpath.'/invoicejournal/dksbuchhaltung.sqlite'
+ # };
+ # my $rep = pdfreport->new({tmplpath => $RealBin.'/report', tmp => $RealBin.'/tmp'});
+ # my ($result,$file) = $rep->createpdf('ttinvoice',$RealBin.'/output/textinvoice.pdf',$data);
+ # print "$result: $file\n";
+ }
+ elsif (exists($p->{open})){
+ if (exists($p->{file}) && -e ){
+
+ my $mimetype = MIME::Type::FileName::guess ($sitecfg->{data}.'/'.$p->{file});
+ my @stat = stat($sitecfg->{data}.'/'.$p->{file});
+ print $cgi->header(
+ -type => $mimetype,
+ -target => basename($p->{file}),
+ -attachment => basename($p->{file})
+ );
+ open(DLD,$sitecfg->{data}.'/'.$p->{file});
+ binmode(DLD);
+ local $/ = \1024;
+ while (<DLD>){
+ print $_;
+ }
+ close(DLD);
+ exit(0);
+ }
+ }
+}
+print JSON::PP::encode_json($html);
+# for my $e ( keys %ENV ) {
+# print "$e: $ENV{$e}<br/>";
+# }
\ No newline at end of file
--- /dev/null
+#!/usr/bin/perl -w
+##############################################################################
+## sendEmail
+## Written by: Brandon Zehm <caspian@dotconf.net>
+##
+## License:
+## sendEmail (hereafter referred to as "program") is free software;
+## you can redistribute it and/or modify it under the terms of the GNU General
+## Public License as published by the Free Software Foundation; either version
+## 2 of the License, or (at your option) any later version.
+## When redistributing modified versions of this source code it is recommended
+## that that this disclaimer and the above coder's names are included in the
+## modified code.
+##
+## Disclaimer:
+## This program is provided with no warranty of any kind, either expressed or
+## implied. It is the responsibility of the user (you) to fully research and
+## comprehend the usage of this program. As with any tool, it can be misused,
+## either intentionally (you're a vandal) or unintentionally (you're a moron).
+## THE AUTHOR(S) IS(ARE) NOT RESPONSIBLE FOR ANYTHING YOU DO WITH THIS PROGRAM
+## or anything that happens because of your use (or misuse) of this program,
+## including but not limited to anything you, your lawyers, or anyone else
+## can dream up. And now, a relevant quote directly from the GPL:
+##
+## NO WARRANTY
+##
+## 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+## FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+## OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+## PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+## OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+## TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+## PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+## REPAIR OR CORRECTION.
+##
+##############################################################################
+use strict;
+use IO::Socket;
+
+
+########################
+## Global Variables ##
+########################
+
+my %conf = (
+ ## General
+ "programName" => $0, ## The name of this program
+ "version" => '1.56', ## The version of this program
+ "authorName" => 'Brandon Zehm', ## Author's Name
+ "authorEmail" => 'caspian@dotconf.net', ## Author's Email Address
+ "timezone" => '+0000', ## We always use +0000 for the time zone
+ "hostname" => 'changeme', ## Used in printmsg() for all output (is updated later in the script).
+ "debug" => 0, ## Default debug level
+ "error" => '', ## Error messages will often be stored here
+
+ ## Logging
+ "stdout" => 1,
+ "logging" => 0, ## If this is true the printmsg function prints to the log file
+ "logFile" => '', ## If this is specified (form the command line via -l) this file will be used for logging.
+
+ ## Network
+ "server" => 'localhost', ## Default SMTP server
+ "port" => 25, ## Default port
+ "bindaddr" => '', ## Default local bind address
+ "alarm" => '', ## Default timeout for connects and reads, this gets set from $opt{'timeout'}
+ "tls_client" => 0, ## If TLS is supported by the client (us)
+ "tls_server" => 0, ## If TLS is supported by the remote SMTP server
+
+ ## Email
+ "delimiter" => "----MIME delimiter for sendEmail-" ## MIME Delimiter
+ . rand(1000000), ## Add some randomness to the delimiter
+ "Message-ID" => rand(1000000) . "-sendEmail", ## Message-ID for email header
+
+);
+
+
+## This hash stores the options passed on the command line via the -o option.
+my %opt = (
+ ## Addressing
+ "reply-to" => '', ## Reply-To field
+
+ ## Message
+ "message-file" => '', ## File to read message body from
+ "message-header" => '', ## Additional email header line(s)
+ "message-format" => 'normal', ## If "raw" is specified the message is sent unmodified
+ "message-charset" => 'iso-8859-1', ## Message character-set
+ "message-content-type" => 'auto', ## auto, text, html or an actual string to put into the content-type header.
+
+ ## Network
+ "timeout" => 60, ## Default timeout for connects and reads, this is copied to $conf{'alarm'} later.
+ "fqdn" => 'changeme', ## FQDN of this machine, used during SMTP communication (is updated later in the script).
+
+ ## eSMTP
+ "username" => '', ## Username used in SMTP Auth
+ "password" => '', ## Password used in SMTP Auth
+ "tls" => 'auto', ## Enable or disable TLS support. Options: auto, yes, no
+
+);
+
+## More variables used later in the program
+my $SERVER;
+my $CRLF = "\015\012";
+my $subject = '';
+my $header = '';
+my $message = '';
+my $from = '';
+my @to = ();
+my @cc = ();
+my @bcc = ();
+my @attachments = ();
+my @attachments_names = ();
+
+## For printing colors to the console
+my ${colorRed} = "\033[31;1m";
+my ${colorGreen} = "\033[32;1m";
+my ${colorCyan} = "\033[36;1m";
+my ${colorWhite} = "\033[37;1m";
+my ${colorNormal} = "\033[m";
+my ${colorBold} = "\033[1m";
+my ${colorNoBold} = "\033[0m";
+
+## Don't use shell escape codes on Windows systems
+if ($^O =~ /win/i) {
+ ${colorRed} = ${colorGreen} = ${colorCyan} = ${colorWhite} = ${colorNormal} = ${colorBold} = ${colorNoBold} = "";
+}
+
+## Load IO::Socket::SSL if it's available
+eval { require IO::Socket::SSL; };
+if ($@) { $conf{'tls_client'} = 0; }
+else { $conf{'tls_client'} = 1; }
+
+
+
+
+
+
+#############################
+## ##
+## FUNCTIONS ##
+## ##
+#############################
+
+
+
+
+
+###############################################################################################
+## Function: initialize ()
+##
+## Does all the script startup jibberish.
+##
+###############################################################################################
+sub initialize {
+
+ ## Set STDOUT to flush immediatly after each print
+ $| = 1;
+
+ ## Intercept signals
+ $SIG{'QUIT'} = sub { quit("EXITING: Received SIG$_[0]", 1); };
+ $SIG{'INT'} = sub { quit("EXITING: Received SIG$_[0]", 1); };
+ $SIG{'KILL'} = sub { quit("EXITING: Received SIG$_[0]", 1); };
+ $SIG{'TERM'} = sub { quit("EXITING: Received SIG$_[0]", 1); };
+
+ ## ALARM and HUP signals are not supported in Win32
+ unless ($^O =~ /win/i) {
+ $SIG{'HUP'} = sub { quit("EXITING: Received SIG$_[0]", 1); };
+ $SIG{'ALRM'} = sub { quit("EXITING: Received SIG$_[0]", 1); };
+ }
+
+ ## Fixup $conf{'programName'}
+ $conf{'programName'} =~ s/(.)*[\/,\\]//;
+ $0 = $conf{'programName'} . " " . join(" ", @ARGV);
+
+ ## Fixup $conf{'hostname'} and $opt{'fqdn'}
+ if ($opt{'fqdn'} eq 'changeme') { $opt{'fqdn'} = get_hostname(1); }
+ if ($conf{'hostname'} eq 'changeme') { $conf{'hostname'} = $opt{'fqdn'}; $conf{'hostname'} =~ s/\..*//; }
+
+ return(1);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function: processCommandLine ()
+##
+## Processes command line storing important data in global vars (usually %conf)
+##
+###############################################################################################
+sub processCommandLine {
+
+
+ ############################
+ ## Process command line ##
+ ############################
+
+ my @ARGS = @ARGV; ## This is so later we can re-parse the command line args later if we need to
+ my $numargv = @ARGS;
+ help() unless ($numargv);
+ my $counter = 0;
+
+ for ($counter = 0; $counter < $numargv; $counter++) {
+
+ if ($ARGS[$counter] =~ /^-h$/i) { ## Help ##
+ help();
+ }
+
+ elsif ($ARGS[$counter] eq "") { ## Ignore null arguments
+ ## Do nothing
+ }
+
+ elsif ($ARGS[$counter] =~ /^--help/) { ## Topical Help ##
+ $counter++;
+ if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+ helpTopic($ARGS[$counter]);
+ }
+ else {
+ help();
+ }
+ }
+
+ elsif ($ARGS[$counter] =~ /^-o$/i) { ## Options specified with -o ##
+ $counter++;
+ ## Loop through each option passed after the -o
+ while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+
+ if ($ARGS[$counter] !~ /(\S+)=(\S.*)/) {
+ printmsg("WARNING => Name/Value pair [$ARGS[$counter]] is not properly formatted", 0);
+ printmsg("WARNING => Arguments proceeding -o should be in the form of \"name=value\"", 0);
+ }
+ else {
+ if (exists($opt{$1})) {
+ if ($1 eq 'message-header') {
+ $opt{$1} .= $2 . $CRLF;
+ }
+ else {
+ $opt{$1} = $2;
+ }
+ printmsg("DEBUG => Assigned \$opt{} key/value: $1 => $2", 3);
+ }
+ else {
+ printmsg("WARNING => Name/Value pair [$ARGS[$counter]] will be ignored: unknown key [$1]", 0);
+ printmsg("HINT => Try the --help option to find valid command line arguments", 1);
+ }
+ }
+ $counter++;
+ } $counter--;
+ }
+
+ elsif ($ARGS[$counter] =~ /^-f$/) { ## From ##
+ $counter++;
+ if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $from = $ARGS[$counter]; }
+ else { printmsg("WARNING => The argument after -f was not an email address!", 0); $counter--; }
+ }
+
+ elsif ($ARGS[$counter] =~ /^-t$/) { ## To ##
+ $counter++;
+ while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) {
+ if ($ARGS[$counter] =~ /[;,]/) {
+ push (@to, split(/[;,]/, $ARGS[$counter]));
+ }
+ else {
+ push (@to,$ARGS[$counter]);
+ }
+ $counter++;
+ } $counter--;
+ }
+
+ elsif ($ARGS[$counter] =~ /^-cc$/) { ## Cc ##
+ $counter++;
+ while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) {
+ if ($ARGS[$counter] =~ /[;,]/) {
+ push (@cc, split(/[;,]/, $ARGS[$counter]));
+ }
+ else {
+ push (@cc,$ARGS[$counter]);
+ }
+ $counter++;
+ } $counter--;
+ }
+
+ elsif ($ARGS[$counter] =~ /^-bcc$/) { ## Bcc ##
+ $counter++;
+ while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) {
+ if ($ARGS[$counter] =~ /[;,]/) {
+ push (@bcc, split(/[;,]/, $ARGS[$counter]));
+ }
+ else {
+ push (@bcc,$ARGS[$counter]);
+ }
+ $counter++;
+ } $counter--;
+ }
+
+ elsif ($ARGS[$counter] =~ /^-m$/) { ## Message ##
+ $counter++;
+ $message = "";
+ while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+ if ($message) { $message .= " "; }
+ $message .= $ARGS[$counter];
+ $counter++;
+ } $counter--;
+
+ ## Replace '\n' with $CRLF.
+ ## This allows newlines with messages sent on the command line
+ $message =~ s/\\n/$CRLF/g;
+ }
+
+ elsif ($ARGS[$counter] =~ /^-u$/) { ## Subject ##
+ $counter++;
+ $subject = "";
+ while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+ if ($subject) { $subject .= " "; }
+ $subject .= $ARGS[$counter];
+ $counter++;
+ } $counter--;
+ }
+
+ elsif ($ARGS[$counter] =~ /^-s$/) { ## Server ##
+ $counter++;
+ if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+ $conf{'server'} = $ARGS[$counter];
+ if ($conf{'server'} =~ /:/) { ## Port ##
+ ($conf{'server'},$conf{'port'}) = split(":",$conf{'server'});
+ }
+ }
+ else { printmsg("WARNING - The argument after -s was not the server!", 0); $counter--; }
+ }
+
+ elsif ($ARGS[$counter] =~ /^-b$/) { ## Bind Address ##
+ $counter++;
+ if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+ $conf{'bindaddr'} = $ARGS[$counter];
+ }
+ else { printmsg("WARNING - The argument after -b was not the bindaddr!", 0); $counter--; }
+ }
+
+ elsif ($ARGS[$counter] =~ /^-a$/) { ## Attachments ##
+ $counter++;
+ while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) {
+ push (@attachments,$ARGS[$counter]);
+ $counter++;
+ } $counter--;
+ }
+
+ elsif ($ARGS[$counter] =~ /^-xu$/) { ## AuthSMTP Username ##
+ $counter++;
+ if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+ $opt{'username'} = $ARGS[$counter];
+ }
+ else {
+ printmsg("WARNING => The argument after -xu was not valid username!", 0);
+ $counter--;
+ }
+ }
+
+ elsif ($ARGS[$counter] =~ /^-xp$/) { ## AuthSMTP Password ##
+ $counter++;
+ if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+ $opt{'password'} = $ARGS[$counter];
+ }
+ else {
+ printmsg("WARNING => The argument after -xp was not valid password!", 0);
+ $counter--;
+ }
+ }
+
+ elsif ($ARGS[$counter] =~ /^-l$/) { ## Logging ##
+ $counter++;
+ $conf{'logging'} = 1;
+ if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $conf{'logFile'} = $ARGS[$counter]; }
+ else { printmsg("WARNING - The argument after -l was not the log file!", 0); $counter--; }
+ }
+
+ elsif ($ARGS[$counter] =~ s/^-v+//i) { ## Verbosity ##
+ my $tmp = (length($&) - 1);
+ $conf{'debug'} += $tmp;
+ }
+
+ elsif ($ARGS[$counter] =~ /^-q$/) { ## Quiet ##
+ $conf{'stdout'} = 0;
+ }
+
+ else {
+ printmsg("Error: \"$ARGS[$counter]\" is not a recognized option!", 0);
+ help();
+ }
+
+ }
+
+
+
+
+
+
+
+
+ ###################################################
+ ## Verify required variables are set correctly ##
+ ###################################################
+
+ ## Make sure we have something in $conf{hostname} and $opt{fqdn}
+ if ($opt{'fqdn'} =~ /\./) {
+ $conf{'hostname'} = $opt{'fqdn'};
+ $conf{'hostname'} =~ s/\..*//;
+ }
+
+ if (!$conf{'server'}) { $conf{'server'} = 'localhost'; }
+ if (!$conf{'port'}) { $conf{'port'} = 25; }
+ if (!$from) {
+ quit("ERROR => You must specify a 'from' field! Try --help.", 1);
+ }
+ if ( ((scalar(@to)) + (scalar(@cc)) + (scalar(@bcc))) <= 0) {
+ quit("ERROR => You must specify at least one recipient via -t, -cc, or -bcc", 1);
+ }
+
+ ## Make sure email addresses look OK.
+ foreach my $addr (@to, @cc, @bcc, $from, $opt{'reply-to'}) {
+ if ($addr) {
+ if (!returnAddressParts($addr)) {
+ printmsg("ERROR => Can't use improperly formatted email address: $addr", 0);
+ printmsg("HINT => Try viewing the extended help on addressing with \"--help addressing\"", 1);
+ quit("", 1);
+ }
+ }
+ }
+
+ ## Make sure all attachments exist.
+ foreach my $file (@attachments) {
+ if ( (! -f $file) or (! -r $file) ) {
+ printmsg("ERROR => The attachment [$file] doesn't exist!", 0);
+ printmsg("HINT => Try specifying the full path to the file or reading extended help with \"--help message\"", 1);
+ quit("", 1);
+ }
+ }
+
+ if ($conf{'logging'} and (!$conf{'logFile'})) {
+ quit("ERROR => You used -l to enable logging but didn't specify a log file!", 1);
+ }
+
+ if ( $opt{'username'} ) {
+ if (!$opt{'password'}) {
+ ## Prompt for a password since one wasn't specified with the -xp option.
+ $SIG{'ALRM'} = sub { quit("ERROR => Timeout waiting for password inpupt", 1); };
+ alarm(60) if ($^O !~ /win/i); ## alarm() doesn't work in win32
+ print "Password: ";
+ $opt{'password'} = <STDIN>; chomp $opt{'password'};
+ if (!$opt{'password'}) {
+ quit("ERROR => A username for SMTP authentication was specified, but no password!", 1);
+ }
+ }
+ }
+
+ ## Validate the TLS setting
+ $opt{'tls'} = lc($opt{'tls'});
+ if ($opt{'tls'} !~ /^(auto|yes|no)$/) {
+ quit("ERROR => Invalid TLS setting ($opt{'tls'}). Must be one of auto, yes, or no.", 1);
+ }
+
+ ## If TLS is set to "yes", make sure sendEmail loaded the libraries needed.
+ if ($opt{'tls'} eq 'yes' and $conf{'tls_client'} == 0) {
+ quit("ERROR => No TLS support! SendEmail can't load required libraries. (try installing Net::SSLeay and IO::Socket::SSL)", 1);
+ }
+
+ ## Return 0 errors
+ return(0);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## getline($socketRef)
+sub getline {
+ my ($socketRef) = @_;
+ local ($/) = "\r\n";
+ return $$socketRef->getline;
+}
+
+
+
+
+## Receive a (multiline?) SMTP response from ($socketRef)
+sub getResponse {
+ my ($socketRef) = @_;
+ my ($tmp, $reply);
+ local ($/) = "\r\n";
+ return undef unless defined($tmp = getline($socketRef));
+ return("getResponse() socket is not open") unless ($$socketRef->opened);
+ ## Keep reading lines if it's a multi-line response
+ while ($tmp =~ /^\d{3}-/o) {
+ $reply .= $tmp;
+ return undef unless defined($tmp = getline($socketRef));
+ }
+ $reply .= $tmp;
+ $reply =~ s/\r?\n$//o;
+ return $reply;
+}
+
+
+
+
+###############################################################################################
+## Function: SMTPchat ( [string $command] )
+##
+## Description: Sends $command to the SMTP server (on SERVER) and awaits a successful
+## reply form the server. If the server returns an error, or does not reply
+## within $conf{'alarm'} seconds an error is generated.
+## NOTE: $command is optional, if no command is specified then nothing will
+## be sent to the server, but a valid response is still required from the server.
+##
+## Input: [$command] A (optional) valid SMTP command (ex. "HELO")
+##
+##
+## Output: Returns zero on success, or non-zero on error.
+## Error messages will be stored in $conf{'error'}
+## A copy of the last SMTP response is stored in the global variable
+## $conf{'SMTPchat_response'}
+##
+##
+## Example: SMTPchat ("HELO mail.isp.net");
+###############################################################################################
+sub SMTPchat {
+ my ($command) = @_;
+
+ printmsg("INFO => Sending: \t$command", 1) if ($command);
+
+ ## Send our command
+ print $SERVER "$command$CRLF" if ($command);
+
+ ## Read a response from the server
+ $SIG{'ALRM'} = sub { $conf{'error'} = "alarm"; $SERVER->close(); };
+ alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32;
+ my $result = $conf{'SMTPchat_response'} = getResponse(\$SERVER);
+ alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32;
+
+ ## Generate an alert if we timed out
+ if ($conf{'error'} eq "alarm") {
+ $conf{'error'} = "ERROR => Timeout while reading from $conf{'server'}:$conf{'port'} There was no response after $conf{'alarm'} seconds.";
+ return(1);
+ }
+
+ ## Make sure the server actually responded
+ if (!$result) {
+ $conf{'error'} = "ERROR => $conf{'server'}:$conf{'port'} returned a zero byte response to our query.";
+ return(2);
+ }
+
+ ## Validate the response
+ if (evalSMTPresponse($result)) {
+ ## conf{'error'} will already be set here
+ return(2);
+ }
+
+ ## Print the success messsage
+ printmsg($conf{'error'}, 1);
+
+ ## Return Success
+ return(0);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function: evalSMTPresponse (string $message )
+##
+## Description: Searches $message for either an SMTP success or error code, and returns
+## 0 on success, and the actual error code on error.
+##
+##
+## Input: $message Data received from a SMTP server (ex. "220
+##
+##
+## Output: Returns zero on success, or non-zero on error.
+## Error messages will be stored in $conf{'error'}
+##
+##
+## Example: SMTPchat ("HELO mail.isp.net");
+###############################################################################################
+sub evalSMTPresponse {
+ my ($message) = @_;
+
+ ## Validate input
+ if (!$message) {
+ $conf{'error'} = "ERROR => No message was passed to evalSMTPresponse(). What happened?";
+ return(1)
+ }
+
+ printmsg("DEBUG => evalSMTPresponse() - Checking for SMTP success or error status in the message: $message ", 3);
+
+ ## Look for a SMTP success code
+ if ($message =~ /^([23]\d\d)/) {
+ printmsg("DEBUG => evalSMTPresponse() - Found SMTP success code: $1", 2);
+ $conf{'error'} = "SUCCESS => Received: \t$message";
+ return(0);
+ }
+
+ ## Look for a SMTP error code
+ if ($message =~ /^([45]\d\d)/) {
+ printmsg("DEBUG => evalSMTPresponse() - Found SMTP error code: $1", 2);
+ $conf{'error'} = "ERROR => Received: \t$message";
+ return($1);
+ }
+
+ ## If no SMTP codes were found return an error of 1
+ $conf{'error'} = "ERROR => Received a message with no success or error code. The message received was: $message";
+ return(2);
+
+}
+
+
+
+
+
+
+
+
+
+
+#########################################################
+# SUB: &return_month(0,1,etc)
+# returns the name of the month that corrosponds
+# with the number. returns 0 on error.
+#########################################################
+sub return_month {
+ my $x = $_[0];
+ if ($x == 0) { return 'Jan'; }
+ if ($x == 1) { return 'Feb'; }
+ if ($x == 2) { return 'Mar'; }
+ if ($x == 3) { return 'Apr'; }
+ if ($x == 4) { return 'May'; }
+ if ($x == 5) { return 'Jun'; }
+ if ($x == 6) { return 'Jul'; }
+ if ($x == 7) { return 'Aug'; }
+ if ($x == 8) { return 'Sep'; }
+ if ($x == 9) { return 'Oct'; }
+ if ($x == 10) { return 'Nov'; }
+ if ($x == 11) { return 'Dec'; }
+ return (0);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#########################################################
+# SUB: &return_day(0,1,etc)
+# returns the name of the day that corrosponds
+# with the number. returns 0 on error.
+#########################################################
+sub return_day {
+ my $x = $_[0];
+ if ($x == 0) { return 'Sun'; }
+ if ($x == 1) { return 'Mon'; }
+ if ($x == 2) { return 'Tue'; }
+ if ($x == 3) { return 'Wed'; }
+ if ($x == 4) { return 'Thu'; }
+ if ($x == 5) { return 'Fri'; }
+ if ($x == 6) { return 'Sat'; }
+ return (0);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function: returnAddressParts(string $address)
+##
+## Description: Returns a two element array containing the "Name" and "Address" parts of
+## an email address.
+##
+## Example: "Brandon Zehm <caspian@dotconf.net>"
+## would return: ("Brandon Zehm", "caspian@dotconf.net");
+##
+## "caspian@dotconf.net"
+## would return: ("caspian@dotconf.net", "caspian@dotconf.net")
+###############################################################################################
+sub returnAddressParts {
+ my $input = $_[0];
+ my $name = "";
+ my $address = "";
+
+ ## Make sure to fail if it looks totally invalid
+ if ($input !~ /(\S+\@\S+)/) {
+ $conf{'error'} = "ERROR => The address [$input] doesn't look like a valid email address, ignoring it";
+ return(undef());
+ }
+
+ ## Check 1, should find addresses like: "Brandon Zehm <caspian@dotconf.net>"
+ elsif ($input =~ /^\s*(\S(.*\S)?)\s*<(\S+\@\S+)>/o) {
+ ($name, $address) = ($1, $3);
+ }
+
+ ## Otherwise if that failed, just get the address: <caspian@dotconf.net>
+ elsif ($input =~ /<(\S+\@\S+)>/o) {
+ $name = $address = $1;
+ }
+
+ ## Or maybe it was formatted this way: caspian@dotconf.net
+ elsif ($input =~ /(\S+\@\S+)/o) {
+ $name = $address = $1;
+ }
+
+ ## Something stupid happened, just return an error.
+ unless ($name and $address) {
+ printmsg("ERROR => Couldn't parse the address: $input", 0);
+ printmsg("HINT => If you think this should work, consider reporting this as a bug to $conf{'authorEmail'}", 1);
+ return(undef());
+ }
+
+ ## Make sure there aren't invalid characters in the address, and return it.
+ my $ctrl = '\000-\037';
+ my $nonASCII = '\x80-\xff';
+ if ($address =~ /[<> ,;:"'\[\]\\$ctrl$nonASCII]/) {
+ printmsg("WARNING => The address [$address] seems to contain invalid characters: continuing anyway", 0);
+ }
+ return($name, $address);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function: base64_encode(string $data, bool $chunk)
+##
+## Description: Returns $data as a base64 encoded string.
+## If $chunk is true, the encoded data is returned in 76 character long lines
+## with the final \CR\LF removed.
+##
+## Note: This is only used from the smtp auth section of code.
+## At some point it would be nice to merge the code that encodes attachments and this.
+###############################################################################################
+sub base64_encode {
+ my $data = $_[0];
+ my $chunk = $_[1];
+ my $tmp = '';
+ my $base64 = '';
+ my $CRLF = "\r\n";
+
+ ###################################
+ ## Convert binary data to base64 ##
+ ###################################
+ while ($data =~ s/(.{45})//s) { ## Get 45 bytes from the binary string
+ $tmp = substr(pack('u', $&), 1); ## Convert the binary to uuencoded text
+ chop($tmp);
+ $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64
+ $base64 .= $tmp;
+ }
+
+ ##########################
+ ## Encode the leftovers ##
+ ##########################
+ my $padding = "";
+ if ( ($data) and (length($data) > 0) ) {
+ $padding = (3 - length($data) % 3) % 3; ## Set flag if binary data isn't divisible by 3
+ $tmp = substr(pack('u', $data), 1); ## Convert the binary to uuencoded text
+ chop($tmp);
+ $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64
+ $base64 .= $tmp;
+ }
+
+ ############################
+ ## Fix padding at the end ##
+ ############################
+ $data = '';
+ $base64 =~ s/.{$padding}$/'=' x $padding/e if $padding; ## Fix the end padding if flag (from above) is set
+ if ($chunk) {
+ while ($base64 =~ s/(.{1,76})//s) { ## Put $CRLF after each 76 characters
+ $data .= "$1$CRLF";
+ }
+ }
+ else {
+ $data = $base64;
+ }
+
+ ## Remove any trailing CRLF's
+ $data =~ s/(\r|\n)*$//s;
+ return($data);
+}
+
+
+
+
+
+
+
+
+
+#########################################################
+# SUB: send_attachment("/path/filename")
+# Sends the mime headers and base64 encoded file
+# to the email server.
+#########################################################
+sub send_attachment {
+ my ($filename) = @_; ## Get filename passed
+ my (@fields, $y, $filename_name, $encoding, ## Local variables
+ @attachlines, $content_type);
+ my $bin = 1;
+
+ @fields = split(/\/|\\/, $filename); ## Get the actual filename without the path
+ $filename_name = pop(@fields);
+ push @attachments_names, $filename_name; ## FIXME: This is only used later for putting in the log file
+
+ ##########################
+ ## Autodetect Mime Type ##
+ ##########################
+
+ @fields = split(/\./, $filename_name);
+ $encoding = $fields[$#fields];
+
+ if ($encoding =~ /txt|text|log|conf|^c$|cpp|^h$|inc|m3u/i) { $content_type = 'text/plain'; }
+ elsif ($encoding =~ /html|htm|shtml|shtm|asp|php|cfm/i) { $content_type = 'text/html'; }
+ elsif ($encoding =~ /sh$/i) { $content_type = 'application/x-sh'; }
+ elsif ($encoding =~ /tcl/i) { $content_type = 'application/x-tcl'; }
+ elsif ($encoding =~ /pl$/i) { $content_type = 'application/x-perl'; }
+ elsif ($encoding =~ /js$/i) { $content_type = 'application/x-javascript'; }
+ elsif ($encoding =~ /man/i) { $content_type = 'application/x-troff-man'; }
+ elsif ($encoding =~ /gif/i) { $content_type = 'image/gif'; }
+ elsif ($encoding =~ /jpg|jpeg|jpe|jfif|pjpeg|pjp/i) { $content_type = 'image/jpeg'; }
+ elsif ($encoding =~ /tif|tiff/i) { $content_type = 'image/tiff'; }
+ elsif ($encoding =~ /xpm/i) { $content_type = 'image/x-xpixmap'; }
+ elsif ($encoding =~ /bmp/i) { $content_type = 'image/x-MS-bmp'; }
+ elsif ($encoding =~ /pcd/i) { $content_type = 'image/x-photo-cd'; }
+ elsif ($encoding =~ /png/i) { $content_type = 'image/png'; }
+ elsif ($encoding =~ /aif|aiff/i) { $content_type = 'audio/x-aiff'; }
+ elsif ($encoding =~ /wav/i) { $content_type = 'audio/x-wav'; }
+ elsif ($encoding =~ /mp2|mp3|mpa/i) { $content_type = 'audio/x-mpeg'; }
+ elsif ($encoding =~ /ra$|ram/i) { $content_type = 'audio/x-pn-realaudio'; }
+ elsif ($encoding =~ /mpeg|mpg/i) { $content_type = 'video/mpeg'; }
+ elsif ($encoding =~ /mov|qt$/i) { $content_type = 'video/quicktime'; }
+ elsif ($encoding =~ /avi/i) { $content_type = 'video/x-msvideo'; }
+ elsif ($encoding =~ /zip/i) { $content_type = 'application/x-zip-compressed'; }
+ elsif ($encoding =~ /tar/i) { $content_type = 'application/x-tar'; }
+ elsif ($encoding =~ /jar/i) { $content_type = 'application/java-archive'; }
+ elsif ($encoding =~ /exe|bin/i) { $content_type = 'application/octet-stream'; }
+ elsif ($encoding =~ /ppt|pot|ppa|pps|pwz/i) { $content_type = 'application/vnd.ms-powerpoint'; }
+ elsif ($encoding =~ /mdb|mda|mde/i) { $content_type = 'application/vnd.ms-access'; }
+ elsif ($encoding =~ /xls|xlt|xlm|xld|xla|xlc|xlw|xll/i) { $content_type = 'application/vnd.ms-excel'; }
+ elsif ($encoding =~ /doc|dot/i) { $content_type = 'application/msword'; }
+ elsif ($encoding =~ /rtf/i) { $content_type = 'application/rtf'; }
+ elsif ($encoding =~ /pdf/i) { $content_type = 'application/pdf'; }
+ elsif ($encoding =~ /tex/i) { $content_type = 'application/x-tex'; }
+ elsif ($encoding =~ /latex/i) { $content_type = 'application/x-latex'; }
+ elsif ($encoding =~ /vcf/i) { $content_type = 'application/x-vcard'; }
+ else { $content_type = 'application/octet-stream'; }
+
+
+ ############################
+ ## Process the attachment ##
+ ############################
+
+ #####################################
+ ## Generate and print MIME headers ##
+ #####################################
+
+ $y = "$CRLF--$conf{'delimiter'}$CRLF";
+ $y .= "Content-Type: $content_type;$CRLF";
+ $y .= " name=\"$filename_name\"$CRLF";
+ $y .= "Content-Transfer-Encoding: base64$CRLF";
+ $y .= "Content-Disposition: attachment; filename=\"$filename_name\"$CRLF";
+ $y .= "$CRLF";
+ print $SERVER $y;
+
+
+ ###########################################################
+ ## Convert the file to base64 and print it to the server ##
+ ###########################################################
+
+ open (FILETOATTACH, $filename) || do {
+ printmsg("ERROR => Opening the file [$filename] for attachment failed with the error: $!", 0);
+ return(1);
+ };
+ binmode(FILETOATTACH); ## Hack to make Win32 work
+
+ my $res = "";
+ my $tmp = "";
+ my $base64 = "";
+ while (<FILETOATTACH>) { ## Read a line from the (binary) file
+ $res .= $_;
+
+ ###################################
+ ## Convert binary data to base64 ##
+ ###################################
+ while ($res =~ s/(.{45})//s) { ## Get 45 bytes from the binary string
+ $tmp = substr(pack('u', $&), 1); ## Convert the binary to uuencoded text
+ chop($tmp);
+ $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64
+ $base64 .= $tmp;
+ }
+
+ ################################
+ ## Print chunks to the server ##
+ ################################
+ while ($base64 =~ s/(.{76})//s) {
+ print $SERVER "$1$CRLF";
+ }
+
+ }
+
+ ###################################
+ ## Encode and send the leftovers ##
+ ###################################
+ my $padding = "";
+ if ( ($res) and (length($res) >= 1) ) {
+ $padding = (3 - length($res) % 3) % 3; ## Set flag if binary data isn't divisible by 3
+ $res = substr(pack('u', $res), 1); ## Convert the binary to uuencoded text
+ chop($res);
+ $res =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64
+ }
+
+ ############################
+ ## Fix padding at the end ##
+ ############################
+ $res = $base64 . $res; ## Get left overs from above
+ $res =~ s/.{$padding}$/'=' x $padding/e if $padding; ## Fix the end padding if flag (from above) is set
+ if ($res) {
+ while ($res =~ s/(.{1,76})//s) { ## Send it to the email server.
+ print $SERVER "$1$CRLF";
+ }
+ }
+
+ close (FILETOATTACH) || do {
+ printmsg("ERROR - Closing the filehandle for file [$filename] failed with the error: $!", 0);
+ return(2);
+ };
+
+ ## Return 0 errors
+ return(0);
+
+}
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function: $string = get_hostname (boot $fqdn)
+##
+## Description: Tries really hard to returns the short (or FQDN) hostname of the current
+## system. Uses techniques and code from the Sys-Hostname module.
+##
+## Input: $fqdn A true value (1) will cause this function to return a FQDN hostname
+## rather than a short hostname.
+##
+## Output: Returns a string
+###############################################################################################
+sub get_hostname {
+ ## Assign incoming parameters to variables
+ my ( $fqdn ) = @_;
+ my $hostname = "";
+
+ ## STEP 1: Get short hostname
+
+ ## Load Sys::Hostname if it's available
+ eval { require Sys::Hostname; };
+ unless ($@) {
+ $hostname = Sys::Hostname::hostname();
+ }
+
+ ## If that didn't get us a hostname, try a few other things
+ else {
+ ## Windows systems
+ if ($^O !~ /win/i) {
+ if ($ENV{'COMPUTERNAME'}) { $hostname = $ENV{'COMPUTERNAME'}; }
+ if (!$hostname) { $hostname = gethostbyname('localhost'); }
+ if (!$hostname) { chomp($hostname = `hostname 2> NUL`) };
+ }
+
+ ## Unix systems
+ else {
+ local $ENV{PATH} = '/usr/bin:/bin:/usr/sbin:/sbin'; ## Paranoia
+
+ ## Try the environment first (Help! What other variables could/should I be checking here?)
+ if ($ENV{'HOSTNAME'}) { $hostname = $ENV{'HOSTNAME'}; }
+
+ ## Try the hostname command
+ eval { local $SIG{__DIE__}; local $SIG{CHLD}; $hostname = `hostname 2>/dev/null`; chomp($hostname); } ||
+
+ ## Try POSIX::uname(), which strictly can't be expected to be correct
+ eval { local $SIG{__DIE__}; require POSIX; $hostname = (POSIX::uname())[1]; } ||
+
+ ## Try the uname command
+ eval { local $SIG{__DIE__}; $hostname = `uname -n 2>/dev/null`; chomp($hostname); };
+
+ }
+
+ ## If we can't find anything else, return ""
+ if (!$hostname) {
+ print "WARNING => No hostname could be determined, please specify one with -o fqdn=FQDN option!\n";
+ return("unknown");
+ }
+ }
+
+ ## Return the short hostname
+ unless ($fqdn) {
+ $hostname =~ s/\..*//;
+ return(lc($hostname));
+ }
+
+ ## STEP 2: Determine the FQDN
+
+ ## First, if we already have one return it.
+ if ($hostname =~ /\w\.\w/) { return(lc($hostname)); }
+
+ ## Next try using
+ eval { $fqdn = (gethostbyname($hostname))[0]; };
+ if ($fqdn) { return(lc($fqdn)); }
+ return(lc($hostname));
+}
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function: printmsg (string $message, int $level)
+##
+## Description: Handles all messages - printing them to the screen only if the messages
+## $level is >= the global debug level. If $conf{'logFile'} is defined it
+## will also log the message to that file.
+##
+## Input: $message A message to be printed, logged, etc.
+## $level The debug level of the message. If
+## not defined 0 will be assumed. 0 is
+## considered a normal message, 1 and
+## higher is considered a debug message.
+##
+## Output: Prints to STDOUT
+##
+## Assumptions: $conf{'hostname'} should be the name of the computer we're running on.
+## $conf{'stdout'} should be set to 1 if you want to print to stdout
+## $conf{'logFile'} should be a full path to a log file if you want that
+## $conf{'debug'} should be an integer between 0 and 10.
+##
+## Example: printmsg("WARNING: We believe in generic error messages... NOT!", 0);
+###############################################################################################
+sub printmsg {
+ ## Assign incoming parameters to variables
+ my ( $message, $level ) = @_;
+
+ ## Make sure input is sane
+ $level = 0 if (!defined($level));
+ $message =~ s/\s+$//sgo;
+ $message =~ s/\r?\n/, /sgo;
+
+ ## Continue only if the debug level of the program is >= message debug level.
+ if ($conf{'debug'} >= $level) {
+
+ ## Get the date in the format: Dec 3 11:14:04
+ my ($sec, $min, $hour, $mday, $mon) = localtime();
+ $mon = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[$mon];
+ my $date = sprintf("%s %02d %02d:%02d:%02d", $mon, $mday, $hour, $min, $sec);
+
+ ## Print to STDOUT always if debugging is enabled, or if conf{stdout} is true.
+ if ( ($conf{'debug'} >= 1) or ($conf{'stdout'} == 1) ) {
+ print "$date $conf{'hostname'} $conf{'programName'}\[$$\]: $message\n";
+ }
+
+ ## Print to the log file if $conf{'logging'} is true
+ if ($conf{'logFile'}) {
+ if (openLogFile($conf{'logFile'})) { $conf{'logFile'} = ""; printmsg("ERROR => Opening the file [$conf{'logFile'}] for appending returned the error: $!", 1); }
+ print LOGFILE "$date $conf{'hostname'} $conf{'programName'}\[$$\]: $message\n";
+ }
+
+ }
+
+ ## Return 0 errors
+ return(0);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## FUNCTION:
+## openLogFile ( $filename )
+##
+##
+## DESCRIPTION:
+## Opens the file $filename and attaches it to the filehandle "LOGFILE". Returns 0 on success
+## and non-zero on failure. Error codes are listed below, and the error message gets set in
+## global variable $!.
+##
+##
+## Example:
+## openFile ("/var/log/sendEmail.log");
+##
+###############################################################################################
+sub openLogFile {
+ ## Get the incoming filename
+ my $filename = $_[0];
+
+ ## Make sure our file exists, and if the file doesn't exist then create it
+ if ( ! -f $filename ) {
+ print STDERR "NOTICE: The log file [$filename] does not exist. Creating it now with mode [0600].\n" if ($conf{'stdout'});
+ open (LOGFILE, ">>$filename");
+ close LOGFILE;
+ chmod (0600, $filename);
+ }
+
+ ## Now open the file and attach it to a filehandle
+ open (LOGFILE,">>$filename") or return (1);
+
+ ## Put the file into non-buffering mode
+ select LOGFILE;
+ $| = 1;
+ select STDOUT;
+
+ ## Return success
+ return(0);
+}
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function: read_file (string $filename)
+##
+## Description: Reads the contents of a file and returns a two part array:
+## ($status, $file-contents)
+## $status is 0 on success, non-zero on error.
+##
+## Example: ($status, $file) = read_file("/etc/passwd");
+###############################################################################################
+sub read_file {
+ my ( $filename ) = @_;
+
+ ## If the value specified is a file, load the file's contents
+ if ( (-e $filename and -r $filename) ) {
+ my $FILE;
+ if(!open($FILE, ' ' . $filename)) {
+ return((1, ""));
+ }
+ my $file = '';
+ while (<$FILE>) {
+ $file .= $_;
+ }
+ ## Strip an ending \r\n
+ $file =~ s/\r?\n$//os;
+ }
+ return((1, ""));
+}
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function: quit (string $message, int $errorLevel)
+##
+## Description: Exits the program, optionally printing $message. It
+## returns an exit error level of $errorLevel to the
+## system (0 means no errors, and is assumed if empty.)
+##
+## Example: quit("Exiting program normally", 0);
+###############################################################################################
+sub quit {
+ my ( $message, $errorLevel ) = @_;
+ $errorLevel = 0 if (!defined($errorLevel));
+
+ ## Print exit message
+ if ($message) {
+ printmsg($message, 0);
+ }
+
+ ## Exit
+ exit($errorLevel);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function: help ()
+##
+## Description: For all those newbies ;)
+## Prints a help message and exits the program.
+##
+###############################################################################################
+sub help {
+exit(1) if (!$conf{'stdout'});
+print <<EOM;
+
+${colorBold}$conf{'programName'}-$conf{'version'} by $conf{'authorName'} <$conf{'authorEmail'}>${colorNoBold}
+
+Synopsis: $conf{'programName'} -f ADDRESS [options]
+
+ ${colorRed}Required:${colorNormal}
+ -f ADDRESS from (sender) email address
+ * At least one recipient required via -t, -cc, or -bcc
+ * Message body required via -m, STDIN, or -o message-file=FILE
+
+ ${colorGreen}Common:${colorNormal}
+ -t ADDRESS [ADDR ...] to email address(es)
+ -u SUBJECT message subject
+ -m MESSAGE message body
+ -s SERVER[:PORT] smtp mail relay, default is $conf{'server'}:$conf{'port'}
+
+ ${colorGreen}Optional:${colorNormal}
+ -a FILE [FILE ...] file attachment(s)
+ -cc ADDRESS [ADDR ...] cc email address(es)
+ -bcc ADDRESS [ADDR ...] bcc email address(es)
+ -xu USERNAME username for SMTP authentication
+ -xp PASSWORD password for SMTP authentication
+
+ ${colorGreen}Paranormal:${colorNormal}
+ -b BINDADDR[:PORT] local host bind address
+ -l LOGFILE log to the specified file
+ -v verbosity, use multiple times for greater effect
+ -q be quiet (i.e. no STDOUT output)
+ -o NAME=VALUE advanced options, for details try: --help misc
+ -o message-content-type=<auto|text|html>
+ -o message-file=FILE -o message-format=raw
+ -o message-header=HEADER -o message-charset=CHARSET
+ -o reply-to=ADDRESS -o timeout=SECONDS
+ -o username=USERNAME -o password=PASSWORD
+ -o tls=<auto|yes|no> -o fqdn=FQDN
+
+
+ ${colorGreen}Help:${colorNormal}
+ --help the helpful overview you're reading now
+ --help addressing explain addressing and related options
+ --help message explain message body input and related options
+ --help networking explain -s, -b, etc
+ --help output explain logging and other output options
+ --help misc explain -o options, TLS, SMTP auth, and more
+
+EOM
+exit(1);
+}
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function: helpTopic ($topic)
+##
+## Description: For all those newbies ;)
+## Prints a help message and exits the program.
+##
+###############################################################################################
+sub helpTopic {
+ exit(1) if (!$conf{'stdout'});
+ my ($topic) = @_;
+
+ CASE: {
+
+
+
+
+## ADDRESSING
+ ($topic eq 'addressing') && do {
+ print <<EOM;
+
+${colorBold}ADDRESSING DOCUMENTATION${colorNormal}
+
+${colorGreen}Addressing Options${colorNormal}
+Options related to addressing:
+ -f ADDRESS
+ -t ADDRESS [ADDRESS ...]
+ -cc ADDRESS [ADDRESS ...]
+ -bcc ADDRESS [ADDRESS ...]
+ -o reply-to=ADDRESS
+
+-f ADDRESS
+ This required option specifies who the email is from, I.E. the sender's
+ email address.
+
+-t ADDRESS [ADDRESS ...]
+ This option specifies the primary recipient(s). At least one recipient
+ address must be specified via the -t, -cc. or -bcc options.
+
+-cc ADDRESS [ADDRESS ...]
+ This option specifies the "carbon copy" recipient(s). At least one
+ recipient address must be specified via the -t, -cc. or -bcc options.
+
+-bcc ADDRESS [ADDRESS ...]
+ This option specifies the "blind carbon copy" recipient(s). At least
+ one recipient address must be specified via the -t, -cc. or -bcc options.
+
+-o reply-to=ADDRESS
+ This option specifies that an optional "Reply-To" address should be
+ written in the email's headers.
+
+
+${colorGreen}Email Address Syntax${colorNormal}
+Email addresses may be specified in one of two ways:
+ Full Name: "John Doe <john.doe\@gmail.com>"
+ Just Address: "john.doe\@gmail.com"
+
+The "Full Name" method is useful if you want a name, rather than a plain
+email address, to be displayed in the recipient's From, To, or Cc fields
+when they view the message.
+
+
+${colorGreen}Multiple Recipients${colorNormal}
+The -t, -cc, and -bcc options each accept multiple addresses. They may be
+specified by separating them by either a white space, comma, or semi-colon
+separated list. You may also specify the -t, -cc, and -bcc options multiple
+times, each occurance will append the new recipients to the respective list.
+
+Examples:
+(I used "-t" in these examples, but it can be "-cc" or "-bcc" as well)
+
+ * Space separated list:
+ -t jane.doe\@yahoo.com "John Doe <john.doe\@gmail.com>"
+
+ * Semi-colon separated list:
+ -t "jane.doe\@yahoo.com; John Doe <john.doe\@gmail.com>"
+
+ * Comma separated list:
+ -t "jane.doe\@yahoo.com, John Doe <john.doe\@gmail.com>"
+
+ * Multiple -t, -cc, or -bcc options:
+ -t "jane.doe\@yahoo.com" -t "John Doe <john.doe\@gmail.com>"
+
+
+EOM
+ last CASE;
+ };
+
+
+
+
+
+
+## MESSAGE
+ ($topic eq 'message') && do {
+ print <<EOM;
+
+${colorBold}MESSAGE DOCUMENTATION${colorNormal}
+
+${colorGreen}Message Options${colorNormal}
+Options related to the email message body:
+ -u SUBJECT
+ -m MESSAGE
+ -o message-file=FILE
+ -o message-content-type=<auto|text|html>
+ -o message-header=EMAIL HEADER
+ -o message-charset=CHARSET
+ -o message-format=raw
+
+-u SUBJECT
+ This option allows you to specify the subject for your email message.
+ It is not required (anymore) that the subject be quoted, although it
+ is recommended. The subject will be read until an argument starting
+ with a hyphen (-) is found.
+ Examples:
+ -u "Contact information while on vacation"
+ -u New Microsoft vulnerability discovered
+
+-m MESSAGE
+ This option is one of three methods that allow you to specify the message
+ body for your email. The message may be specified on the command line
+ with this -m option, read from a file with the -o message-file=FILE
+ option, or read from STDIN if neither of these options are present.
+
+ It is not required (anymore) that the message be quoted, although it is
+ recommended. The message will be read until an argument starting with a
+ hyphen (-) is found.
+ Examples:
+ -m "See you in South Beach, Hawaii. -Todd"
+ -m Please ensure that you upgrade your systems right away
+
+ Multi-line message bodies may be specified with the -m option by putting
+ a "\\n" into the message. Example:
+ -m "This is line 1.\\nAnd this is line 2."
+
+ HTML messages are supported, simply begin your message with "<html>" and
+ sendEmail will properly label the mime header so MUAs properly render
+ the message. It is currently not possible without "-o message-format=raw"
+ to send a message with both text and html parts with sendEmail.
+
+-o message-file=FILE
+ This option is one of three methods that allow you to specify the message
+ body for your email. To use this option simply specify a text file
+ containing the body of your email message. Examples:
+ -o message-file=/root/message.txt
+ -o message-file="C:\\Program Files\\output.txt"
+
+-o message-content-type=<auto|text|html>
+ This option allows you to specify the content-type of the email. If your
+ email message is an html message but is being displayed as a text message
+ just add "-o message-content-type=html" to the command line to force it
+ to display as an html message. This actually just changes the Content-Type:
+ header. Advanced users will be happy to know that if you specify anything
+ other than the three options listed above it will use that as the vaule
+ for the Content-Type header.
+
+-o message-header=EMAIL HEADER
+ This option allows you to specify additional email headers to be included.
+ To add more than one message header simply use this option on the command
+ line more than once. If you specify a message header that sendEmail would
+ normally generate the one you specified will be used in it's place.
+ Do not use this unless you know what you are doing!
+ Example:
+ To scare a Microsoft Outlook user you may want to try this:
+ -o message-header="X-Message-Flag: Message contains illegal content"
+ Example:
+ To request a read-receipt try this:
+ -o message-header="Disposition-Notification-To: <user\@domain.com>"
+ Example:
+ To set the message priority try this:
+ -o message-header="X-Priority: 1"
+ Priority reference: 1=highest, 2=high, 3=normal, 4=low, 5=lowest
+
+-o message-charset=CHARSET
+ This option allows you to specify the character-set for the message body.
+ The default is iso-8859-1.
+
+-o message-format=raw
+ This option instructs sendEmail to assume the message (specified with -m,
+ read from STDIN, or read from the file specified in -o message-file=FILE)
+ is already a *complete* email message. SendEmail will not generate any
+ headers and will transmit the message as-is to the remote SMTP server.
+ Due to the nature of this option the following command line options will
+ be ignored when this one is used:
+ -u SUBJECT
+ -o message-header=EMAIL HEADER
+ -o message-charset=CHARSET
+ -a ATTACHMENT
+
+
+${colorGreen}The Message Body${colorNormal}
+The email message body may be specified in one of three ways:
+ 1) Via the -m MESSAGE command line option.
+ Example:
+ -m "This is the message body"
+
+ 2) By putting the message body in a file and using the -o message-file=FILE
+ command line option.
+ Example:
+ -o message-file=/root/message.txt
+
+ 3) By piping the message body to sendEmail when nither of the above command
+ line options were specified.
+ Example:
+ grep "ERROR" /var/log/messages | sendEmail -t you\@domain.com ...
+
+If the message body begins with "<html>" then the message will be treated as
+an HTML message and the MIME headers will be written so that a HTML capable
+email client will display the message in it's HTML form.
+Any of the above methods may be used with the -o message-format=raw option
+to deliver an already complete email message.
+
+
+EOM
+ last CASE;
+ };
+
+
+
+
+
+
+## MISC
+ ($topic eq 'misc') && do {
+ print <<EOM;
+
+${colorBold}MISC DOCUMENTATION${colorNormal}
+
+${colorGreen}Misc Options${colorNormal}
+Options that don't fit anywhere else:
+ -a ATTACHMENT [ATTACHMENT ...]
+ -xu USERNAME
+ -xp PASSWORD
+ -o username=USERNAME
+ -o password=PASSWORD
+ -o tls=<auto|yes|no>
+ -o timeout=SECONDS
+ -o fqdn=FQDN
+
+-a ATTACHMENT [ATTACHMENT ...]
+ This option allows you to attach any number of files to your email message.
+ To specify more than one attachment, simply separate each filename with a
+ space. Example: -a file1.txt file2.txt file3.txt
+
+-xu USERNAME
+ Alias for -o username=USERNAME
+
+-xp PASSWORD
+ Alias for -o password=PASSWORD
+
+-o username=USERNAME (synonym for -xu)
+ These options allow specification of a username to be used with SMTP
+ servers that require authentication. If a username is specified but a
+ password is not, you will be prompted to enter one at runtime.
+
+-o password=PASSWORD (synonym for -xp)
+ These options allow specification of a password to be used with SMTP
+ servers that require authentication. If a username is specified but a
+ password is not, you will be prompted to enter one at runtime.
+
+-o tls=<auto|yes|no>
+ This option allows you to specify if TLS (SSL for SMTP) should be enabled
+ or disabled. The default, auto, will use TLS automatically if your perl
+ installation has the IO::Socket::SSL and Net::SSLeay modules available,
+ and if the remote SMTP server supports TLS. To require TLS for message
+ delivery set this to yes. To disable TLS support set this to no. A debug
+ level of one or higher will reveal details about the status of TLS.
+
+-o timeout=SECONDS
+ This option sets the timeout value in seconds used for all network reads,
+ writes, and a few other things.
+
+-o fqdn=FQDN
+ This option sets the Fully Qualified Domain Name used during the initial
+ SMTP greeting. Normally this is automatically detected, but in case you
+ need to manually set it for some reason or get a warning about detection
+ failing, you can use this to override the default.
+
+
+EOM
+ last CASE;
+ };
+
+
+
+
+
+
+## NETWORKING
+ ($topic eq 'networking') && do {
+ print <<EOM;
+
+${colorBold}NETWORKING DOCUMENTATION${colorNormal}
+
+${colorGreen}Networking Options${colorNormal}
+Options related to networking:
+ -s SERVER[:PORT]
+ -b BINDADDR[:PORT]
+ -o tls=<auto|yes|no>
+ -o timeout=SECONDS
+
+-s SERVER[:PORT]
+ This option allows you to specify the SMTP server sendEmail should
+ connect to to deliver your email message to. If this option is not
+ specified sendEmail will try to connect to localhost:25 to deliver
+ the message. THIS IS MOST LIKELY NOT WHAT YOU WANT, AND WILL LIKELY
+ FAIL unless you have a email server (commonly known as an MTA) running
+ on your computer!
+ Typically you will need to specify your company or ISP's email server.
+ For example, if you use CableOne you will need to specify:
+ -s mail.cableone.net
+ If you have your own email server running on port 300 you would
+ probably use an option like this:
+ -s myserver.mydomain.com:300
+ If you're a GMail user try:
+ -s smtp.gmail.com:587 -xu me\@gmail.com -xp PASSWD
+
+-b BINDADDR[:PORT]
+ This option allows you to specify the local IP address (and optional
+ tcp port number) for sendEmail to bind to when connecting to the remote
+ SMTP server. This useful for people who need to send an email from a
+ specific network interface or source address and are running sendEmail on
+ a firewall or other host with several network interfaces.
+
+-o tls=<auto|yes|no>
+ This option allows you to specify if TLS (SSL for SMTP) should be enabled
+ or disabled. The default, auto, will use TLS automatically if your perl
+ installation has the IO::Socket::SSL and Net::SSLeay modules available,
+ and if the remote SMTP server supports TLS. To require TLS for message
+ delivery set this to yes. To disable TLS support set this to no. A debug
+ level of one or higher will reveal details about the status of TLS.
+
+-o timeout=SECONDS
+ This option sets the timeout value in seconds used for all network reads,
+ writes, and a few other things.
+
+
+EOM
+ last CASE;
+ };
+
+
+
+
+
+
+## OUTPUT
+ ($topic eq 'output') && do {
+ print <<EOM;
+
+${colorBold}OUTPUT DOCUMENTATION${colorNormal}
+
+${colorGreen}Output Options${colorNormal}
+Options related to output:
+ -l LOGFILE
+ -v
+ -q
+
+-l LOGFILE
+ This option allows you to specify a log file to append to. Every message
+ that is displayed to STDOUT is also written to the log file. This may be
+ used in conjunction with -q and -v.
+
+-q
+ This option tells sendEmail to disable printing to STDOUT. In other
+ words nothing will be printed to the console. This does not affect the
+ behavior of the -l or -v options.
+
+-v
+ This option allows you to increase the debug level of sendEmail. You may
+ either use this option more than once, or specify more than one v at a
+ time to obtain a debug level higher than one. Examples:
+ Specifies a debug level of 1: -v
+ Specifies a debug level of 2: -vv
+ Specifies a debug level of 2: -v -v
+ A debug level of one is recommended when doing any sort of debugging.
+ At that level you will see the entire SMTP transaction (except the
+ body of the email message), and hints will be displayed for most
+ warnings and errors. The highest debug level is three.
+
+
+EOM
+ last CASE;
+ };
+
+ ## Unknown option selected!
+ quit("ERROR => The help topic specified is not valid!", 1);
+ };
+
+exit(1);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#############################
+## ##
+## MAIN PROGRAM ##
+## ##
+#############################
+
+
+## Initialize
+initialize();
+
+## Process Command Line
+processCommandLine();
+$conf{'alarm'} = $opt{'timeout'};
+
+## Abort program after $conf{'alarm'} seconds to avoid infinite hangs
+alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32
+
+
+
+
+###################################################
+## Read $message from STDIN if -m was not used ##
+###################################################
+
+if (!($message)) {
+ ## Read message body from a file specified with -o message-file=
+ if ($opt{'message-file'}) {
+ if (! -e $opt{'message-file'}) {
+ printmsg("ERROR => Message body file specified [$opt{'message-file'}] does not exist!", 0);
+ printmsg("HINT => 1) check spelling of your file; 2) fully qualify the path; 3) doubble quote it", 1);
+ quit("", 1);
+ }
+ if (! -r $opt{'message-file'}) {
+ printmsg("ERROR => Message body file specified can not be read due to restricted permissions!", 0);
+ printmsg("HINT => Check permissions on file specified to ensure it can be read", 1);
+ quit("", 1);
+ }
+ if (!open(MFILE, "< " . $opt{'message-file'})) {
+ printmsg("ERROR => Error opening message body file [$opt{'message-file'}]: $!", 0);
+ quit("", 1);
+ }
+ while (<MFILE>) {
+ $message .= $_;
+ }
+ close(MFILE);
+ }
+
+ ## Read message body from STDIN
+ else {
+ alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32
+ if ($conf{'stdout'}) {
+ print "Reading message body from STDIN because the '-m' option was not used.\n";
+ print "If you are manually typing in a message:\n";
+ print " - First line must be received within $conf{'alarm'} seconds.\n" if ($^O !~ /win/i);
+ print " - End manual input with a CTRL-D on its own line.\n\n" if ($^O !~ /win/i);
+ print " - End manual input with a CTRL-Z on its own line.\n\n" if ($^O =~ /win/i);
+ }
+ while (<STDIN>) { ## Read STDIN into $message
+ $message .= $_;
+ alarm(0) if ($^O !~ /win/i); ## Disable the alarm since at least one line was received
+ }
+ printmsg("Message input complete.", 0);
+ }
+}
+
+## Replace bare LF's with CRLF's (\012 should always have \015 with it)
+$message =~ s/(\015)?(\012|$)/\015\012/g;
+
+## Replace bare CR's with CRLF's (\015 should always have \012 with it)
+$message =~ s/(\015)(\012|$)?/\015\012/g;
+
+## Check message for bare periods and encode them
+$message =~ s/(^|$CRLF)(\.{1})($CRLF|$)/$1.$2$3/g;
+
+## Get the current date for the email header
+my ($sec,$min,$hour,$mday,$mon,$year,$day) = gmtime();
+$year += 1900; $mon = return_month($mon); $day = return_day($day);
+my $date = sprintf("%s, %s %s %d %.2d:%.2d:%.2d %s",$day, $mday, $mon, $year, $hour, $min, $sec, $conf{'timezone'});
+
+
+
+
+##################################
+## Connect to the SMTP server ##
+##################################
+printmsg("DEBUG => Connecting to $conf{'server'}:$conf{'port'}", 1);
+$SIG{'ALRM'} = sub {
+ printmsg("ERROR => Timeout while connecting to $conf{'server'}:$conf{'port'} There was no response after $conf{'alarm'} seconds.", 0);
+ printmsg("HINT => Try specifying a different mail relay with the -s option.", 1);
+ quit("", 1);
+};
+alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32;
+$SERVER = IO::Socket::INET->new( PeerAddr => $conf{'server'},
+ PeerPort => $conf{'port'},
+ LocalAddr => $conf{'bindaddr'},
+ Proto => 'tcp',
+ Autoflush => 1,
+ timeout => $conf{'alarm'},
+);
+alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32;
+
+## Make sure we got connected
+if ( (!$SERVER) or (!$SERVER->opened()) ) {
+ printmsg("ERROR => Connection attempt to $conf{'server'}:$conf{'port'} failed: $@", 0);
+ printmsg("HINT => Try specifying a different mail relay with the -s option.", 1);
+ quit("", 1);
+}
+
+## Save our IP address for later
+$conf{'ip'} = $SERVER->sockhost();
+printmsg("DEBUG => My IP address is: $conf{'ip'}", 1);
+
+
+
+
+
+
+
+#########################
+## Do the SMTP Dance ##
+#########################
+
+## Read initial greeting to make sure we're talking to a live SMTP server
+if (SMTPchat()) { quit($conf{'error'}, 1); }
+
+## We're about to use $opt{'fqdn'}, make sure it isn't empty
+if (!$opt{'fqdn'}) {
+ ## Ok, that means we couldn't get a hostname, how about using the IP address for the HELO instead
+ $opt{'fqdn'} = "[" . $conf{'ip'} . "]";
+}
+
+## EHLO
+if (SMTPchat('EHLO ' . $opt{'fqdn'})) {
+ printmsg($conf{'error'}, 0);
+ printmsg("NOTICE => EHLO command failed, attempting HELO instead");
+ if (SMTPchat('HELO ' . $opt{'fqdn'})) { quit($conf{'error'}, 1); }
+ if ( $opt{'username'} and $opt{'password'} ) {
+ printmsg("WARNING => The mail server does not support SMTP authentication!", 0);
+ }
+}
+else {
+
+ ## Determin if the server supports TLS
+ if ($conf{'SMTPchat_response'} =~ /STARTTLS/) {
+ $conf{'tls_server'} = 1;
+ printmsg("DEBUG => The remote SMTP server supports TLS :)", 2);
+ }
+ else {
+ $conf{'tls_server'} = 0;
+ printmsg("DEBUG => The remote SMTP server does NOT support TLS :(", 2);
+ }
+
+ ## Start TLS if possible
+ if ($conf{'tls_server'} == 1 and $conf{'tls_client'} == 1 and $opt{'tls'} =~ /^(yes|auto)$/) {
+ printmsg("DEBUG => Starting TLS", 2);
+ if (SMTPchat('STARTTLS')) { quit($conf{'error'}, 1); }
+ if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv3:!SSLv2', , SSL_verify_mode => 0)) {
+ quit("ERROR => TLS setup failed: " . IO::Socket::SSL::errstr(), 1);
+ }
+ printmsg("DEBUG => TLS: Using cipher: ". $SERVER->get_cipher(), 3);
+ printmsg("DEBUG => TLS session initialized :)", 1);
+
+ ## Restart our SMTP session
+ if (SMTPchat('EHLO ' . $opt{'fqdn'})) { quit($conf{'error'}, 1); }
+ }
+ elsif ($opt{'tls'} eq 'yes' and $conf{'tls_server'} == 0) {
+ quit("ERROR => TLS not possible! Remote SMTP server, $conf{'server'}, does not support it.", 1);
+ }
+
+
+ ## Do SMTP Auth if required
+ if ( $opt{'username'} and $opt{'password'} ) {
+ if ($conf{'SMTPchat_response'} !~ /AUTH\s/) {
+ printmsg("NOTICE => Authentication not supported by the remote SMTP server!", 0);
+ }
+ else {
+ my $auth_succeeded = 0;
+ my $mutual_method = 0;
+
+ # ## SASL CRAM-MD5 authentication method
+ # if ($conf{'SMTPchat_response'} =~ /\bCRAM-MD5\b/i) {
+ # printmsg("DEBUG => SMTP-AUTH: Using CRAM-MD5 authentication method", 1);
+ # if (SMTPchat('AUTH CRAM-MD5')) { quit($conf{'error'}, 1); }
+ #
+ # ## FIXME!!
+ #
+ # printmsg("DEBUG => User authentication was successful", 1);
+ # }
+
+ ## SASL LOGIN authentication method
+ if ($auth_succeeded == 0 and $conf{'SMTPchat_response'} =~ /\bLOGIN\b/i) {
+ $mutual_method = 1;
+ printmsg("DEBUG => SMTP-AUTH: Using LOGIN authentication method", 1);
+ if (!SMTPchat('AUTH LOGIN')) {
+ if (!SMTPchat(base64_encode($opt{'username'}))) {
+ if (!SMTPchat(base64_encode($opt{'password'}))) {
+ $auth_succeeded = 1;
+ printmsg("DEBUG => User authentication was successful (Method: LOGIN)", 1);
+ }
+ }
+ }
+ if ($auth_succeeded == 0) {
+ printmsg("DEBUG => SMTP-AUTH: LOGIN authenticaion failed.", 1);
+ }
+ }
+
+ ## SASL PLAIN authentication method
+ if ($auth_succeeded == 0 and $conf{'SMTPchat_response'} =~ /\bPLAIN\b/i) {
+ $mutual_method = 1;
+ printmsg("DEBUG => SMTP-AUTH: Using PLAIN authentication method", 1);
+ if (SMTPchat('AUTH PLAIN ' . base64_encode("$opt{'username'}\0$opt{'username'}\0$opt{'password'}"))) {
+ printmsg("DEBUG => SMTP-AUTH: PLAIN authenticaion failed.", 1);
+ }
+ else {
+ $auth_succeeded = 1;
+ printmsg("DEBUG => User authentication was successful (Method: PLAIN)", 1);
+ }
+ }
+
+ ## If none of the authentication methods supported by sendEmail were supported by the server, let the user know
+ if ($mutual_method == 0) {
+ printmsg("WARNING => SMTP-AUTH: No mutually supported authentication methods available", 0);
+ }
+
+ ## If we didn't get authenticated, log an error message and exit
+ if ($auth_succeeded == 0) {
+ quit("ERROR => ERROR => SMTP-AUTH: Authentication to $conf{'server'}:$conf{'port'} failed.", 1);
+ }
+ }
+ }
+}
+
+## MAIL FROM
+if (SMTPchat('MAIL FROM:<' .(returnAddressParts($from))[1]. '>')) { quit($conf{'error'}, 1); }
+
+## RCPT TO
+my $oneRcptAccepted = 0;
+foreach my $rcpt (@to, @cc, @bcc) {
+ my ($name, $address) = returnAddressParts($rcpt);
+ if (SMTPchat('RCPT TO:<' . $address . '>')) {
+ printmsg("WARNING => The recipient <$address> was rejected by the mail server, error follows:", 0);
+ $conf{'error'} =~ s/^ERROR/WARNING/o;
+ printmsg($conf{'error'}, 0);
+ }
+ elsif ($oneRcptAccepted == 0) {
+ $oneRcptAccepted = 1;
+ }
+}
+## If no recipients were accepted we need to exit with an error.
+if ($oneRcptAccepted == 0) {
+ quit("ERROR => Exiting. No recipients were accepted for delivery by the mail server.", 1);
+}
+
+## DATA
+if (SMTPchat('DATA')) { quit($conf{'error'}, 1); }
+
+
+###############################
+## Build and send the body ##
+###############################
+printmsg("INFO => Sending message body",1);
+
+## If the message-format is raw just send the message as-is.
+if ($opt{'message-format'} =~ /^raw$/i) {
+ print $SERVER $message;
+}
+
+## If the message-format isn't raw, then build and send the message,
+else {
+
+ ## Message-ID: <MessageID>
+ if ($opt{'message-header'} !~ /^Message-ID:/iom) {
+ $header .= 'Message-ID: <' . $conf{'Message-ID'} . '@' . $conf{'hostname'} . '>' . $CRLF;
+ }
+
+ ## From: "Name" <address@domain.com> (the pointless test below is just to keep scoping correct)
+ if ($from and $opt{'message-header'} !~ /^From:/iom) {
+ my ($name, $address) = returnAddressParts($from);
+ $header .= 'From: "' . $name . '" <' . $address . '>' . $CRLF;
+ }
+
+ ## Reply-To:
+ if ($opt{'reply-to'} and $opt{'message-header'} !~ /^Reply-To:/iom) {
+ my ($name, $address) = returnAddressParts($opt{'reply-to'});
+ $header .= 'Reply-To: "' . $name . '" <' . $address . '>' . $CRLF;
+ }
+
+ ## To: "Name" <address@domain.com>
+ if ($opt{'message-header'} =~ /^To:/iom) {
+ ## The user put the To: header in via -o message-header - dont do anything
+ }
+ elsif (scalar(@to) > 0) {
+ $header .= "To:";
+ for (my $a = 0; $a < scalar(@to); $a++) {
+ my $msg = "";
+
+ my ($name, $address) = returnAddressParts($to[$a]);
+ $msg = " \"$name\" <$address>";
+
+ ## If we're not on the last address add a comma to the end of the line.
+ if (($a + 1) != scalar(@to)) {
+ $msg .= ",";
+ }
+
+ $header .= $msg . $CRLF;
+ }
+ }
+ ## We always want a To: line so if the only recipients were bcc'd they don't see who it was sent to
+ else {
+ $header .= "To: \"Undisclosed Recipients\" <>$CRLF";
+ }
+
+ if (scalar(@cc) > 0 and $opt{'message-header'} !~ /^Cc:/iom) {
+ $header .= "Cc:";
+ for (my $a = 0; $a < scalar(@cc); $a++) {
+ my $msg = "";
+
+ my ($name, $address) = returnAddressParts($cc[$a]);
+ $msg = " \"$name\" <$address>";
+
+ ## If we're not on the last address add a comma to the end of the line.
+ if (($a + 1) != scalar(@cc)) {
+ $msg .= ",";
+ }
+
+ $header .= $msg . $CRLF;
+ }
+ }
+
+ if ($opt{'message-header'} !~ /^Subject:/iom) {
+ $header .= 'Subject: ' . $subject . $CRLF; ## Subject
+ }
+ if ($opt{'message-header'} !~ /^Date:/iom) {
+ $header .= 'Date: ' . $date . $CRLF; ## Date
+ }
+ if ($opt{'message-header'} !~ /^X-Mailer:/iom) {
+ $header .= 'X-Mailer: sendEmail-'.$conf{'version'}.$CRLF; ## X-Mailer
+ }
+ ## I wonder if I should put this in by default?
+ # if ($opt{'message-header'} !~ /^X-Originating-IP:/iom) {
+ # $header .= 'X-Originating-IP: ['.$conf{'ip'}.']'.$CRLF; ## X-Originating-IP
+ # }
+
+ ## Encode all messages with MIME.
+ if ($opt{'message-header'} !~ /^MIME-Version:/iom) {
+ $header .= "MIME-Version: 1.0$CRLF";
+ }
+ if ($opt{'message-header'} !~ /^Content-Type:/iom) {
+ my $content_type = 'multipart/mixed';
+ if (scalar(@attachments) == 0) { $content_type = 'multipart/related'; }
+ $header .= "Content-Type: $content_type; boundary=\"$conf{'delimiter'}\"$CRLF";
+ }
+
+ ## Send additional message header line(s) if specified
+ if ($opt{'message-header'}) {
+ $header .= $opt{'message-header'};
+ }
+
+ ## Send the message header to the server
+ print $SERVER $header . $CRLF;
+
+ ## Start sending the message body to the server
+ print $SERVER "This is a multi-part message in MIME format. To properly display this message you need a MIME-Version 1.0 compliant Email program.$CRLF";
+ print $SERVER "$CRLF";
+
+
+ ## Send message body
+ print $SERVER "--$conf{'delimiter'}$CRLF";
+ ## Send a message content-type header:
+ ## If the message contains HTML...
+ if ($opt{'message-content-type'} eq 'html' or ($opt{'message-content-type'} eq 'auto' and $message =~ /^\s*(<HTML|<!DOCTYPE)/i) ) {
+ printmsg("Setting content-type: text/html", 1);
+ print $SERVER "Content-Type: text/html;$CRLF";
+ }
+ ## Otherwise assume it's plain text...
+ elsif ($opt{'message-content-type'} eq 'text' or $opt{'message-content-type'} eq 'auto') {
+ printmsg("Setting content-type: text/plain", 1);
+ print $SERVER "Content-Type: text/plain;$CRLF";
+ }
+ ## If they've specified their own content-type string...
+ else {
+ printmsg("Setting custom content-type: ".$opt{'message-content-type'}, 1);
+ print $SERVER "Content-Type: ".$opt{'message-content-type'}.";$CRLF";
+ }
+ print $SERVER " charset=\"" . $opt{'message-charset'} . "\"$CRLF";
+ print $SERVER "Content-Transfer-Encoding: 7bit$CRLF";
+ print $SERVER $CRLF . $message;
+
+
+
+ ## Send Attachemnts
+ if (scalar(@attachments) > 0) {
+ ## Disable the alarm so people on modems can send big attachments
+ alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32
+
+ ## Send the attachments
+ foreach my $filename (@attachments) {
+ ## This is check 2, we already checked this above, but just in case...
+ if ( ! -f $filename ) {
+ printmsg("ERROR => The file [$filename] doesn't exist! Email will be sent, but without that attachment.", 0);
+ }
+ elsif ( ! -r $filename ) {
+ printmsg("ERROR => Couldn't open the file [$filename] for reading: $! Email will be sent, but without that attachment.", 0);
+ }
+ else {
+ printmsg("DEBUG => Sending the attachment [$filename]", 1);
+ send_attachment($filename);
+ }
+ }
+ }
+
+
+ ## End the mime encoded message
+ print $SERVER "$CRLF--$conf{'delimiter'}--$CRLF";
+}
+
+
+## Tell the server we are done sending the email
+print $SERVER "$CRLF.$CRLF";
+if (SMTPchat()) { quit($conf{'error'}, 1); }
+
+
+
+####################
+# We are done!!! #
+####################
+
+## Disconnect from the server (don't SMTPchat(), it breaks when using TLS)
+print $SERVER "QUIT$CRLF";
+close $SERVER;
+
+
+
+
+
+
+#######################################
+## Generate exit message/log entry ##
+#######################################
+
+if ($conf{'debug'} or $conf{'logging'}) {
+ printmsg("Generating a detailed exit message", 3);
+
+ ## Put the message together
+ my $output = "Email was sent successfully! From: <" . (returnAddressParts($from))[1] . "> ";
+
+ if (scalar(@to) > 0) {
+ $output .= "To: ";
+ for ($a = 0; $a < scalar(@to); $a++) {
+ $output .= "<" . (returnAddressParts($to[$a]))[1] . "> ";
+ }
+ }
+ if (scalar(@cc) > 0) {
+ $output .= "Cc: ";
+ for ($a = 0; $a < scalar(@cc); $a++) {
+ $output .= "<" . (returnAddressParts($cc[$a]))[1] . "> ";
+ }
+ }
+ if (scalar(@bcc) > 0) {
+ $output .= "Bcc: ";
+ for ($a = 0; $a < scalar(@bcc); $a++) {
+ $output .= "<" . (returnAddressParts($bcc[$a]))[1] . "> ";
+ }
+ }
+ $output .= "Subject: [$subject] " if ($subject);
+ if (scalar(@attachments_names) > 0) {
+ $output .= "Attachment(s): ";
+ foreach(@attachments_names) {
+ $output .= "[$_] ";
+ }
+ }
+ $output .= "Server: [$conf{'server'}:$conf{'port'}]";
+
+
+######################
+# Exit the program #
+######################
+
+ ## Print / Log the detailed message
+ quit($output, 0);
+}
+else {
+ ## Or the standard message
+ quit("Email was sent successfully!", 0);
+}
+
<meta content="no-cache" http-equiv="Pragma" />
<meta content="0" http-equiv="Expires" />
<link rel="stylesheet" href="[% abspath %][% staticpath %]css/w3pro.css">
+ <link rel="stylesheet" href="[% abspath %][% staticpath %]vendor/fmicons/icons.css">
<title>Invoice Journal</title>
</head>
<body>
<div class="w3-top">
<div class="w3-bar w3-white w3-large" style="z-index:4">
- <button class="w3-bar-item w3-button w3-hide-large w3-hover-none w3-hover-text-light-grey" onclick="w3_open();" id="btnsidemenu"><img src="[% abspath %][% staticpath %]img/icons/menu.svg" style="height: 33px;"/></button>
+ <button class="w3-bar-item w3-button w3-hide-large w3-hover-none w3-hover-text-light-grey" onclick="w3_open();" id="btnsidemenu"><img src="[% abspath %][% staticpath %]img/icons/menu.svg" style="height: 24px;"/></button>
<span class="w3-bar-item">Invoice Journal</span>
<span class="w3-bar-item w3-right" id="modulename"></span>
</div>
<a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/invoicejournal/index.html','Journal');">Journal</a>
<a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/sales/index.html','Verkäufe');">Buchungen</a>
<!-- <a href="javascript:admin.loadpage('module/invoices/index.html','Rechnungs-Erstellung');" class="w3-bar-item w3-button">Rechnungs-Erstellung</a> -->
- <a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/accounts/index.html','Adressen');">Addressen</a>
+ <a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/accounts/index.html','Adressen');"><i class="icon-Adress_book_02"></i> Addressen</a>
<a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/bankaccount/index.html','Bankkonto');">Bankkonto</a>
<!-- <a href="javascript:admin.loadpage('module/documents/index.html','Dokumente');" class="w3-bar-item w3-button">Dokumente</a> -->
<a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/offers/index.html','Angebote');">Angebote</a>
--- /dev/null
+var accounts ={
+ tbl: null,
+ name: "accounts",
+ initform: function(){
+
+ },
+ inittable: function(){
+ accounts.tbl = new Tabulator("#tbl_" + accounts.name, {
+ headerFilterPlaceholder:"filter...",
+ height: "100vh",
+ layout:"fitDataFill",
+ selectable:1,
+ responsiveLayout:"collapse",
+ columns:[
+ {title:"K.Nr", field:"ident",headerFilter:"input"},
+ {title:"Name", field:"company",headerFilter:"input"},
+ {title:"E-Mail", field:"email",headerFilter:"input"},
+ {title:"Tel", field:"phone",headerFilter:"input"},
+ {title:"Addresse", field:"address",headerFilter:"input"},
+ ],
+ });
+ accounts.gettbldata();
+ },
+ gettbldata: function(){
+ req.reqdata("POST","db.cgi",{"db":mpref.cfg.db,"type":"array","sql":"SELECT id, company, prename,surname, address, zip, city, country, email, phone, mobile, ident FROM accounts;"},accounts.loadtbldata);
+ },
+ loadtbldata: function(data){
+ if (data && data.sqldata){
+ accounts.tbl.setData(data.sqldata);
+ }
+ },
+ add: function(){
+
+ },
+ edit: function(){
+
+ },
+ remove: function(){
+
+ }
+}
\ No newline at end of file
}
function loadtable(){
- tbl = new Tabulator("#maintbl", {
- headerFilterPlaceholder:"filter...",
- height: "100vh",
- layout:"fitDataFill",
- selectable:1,
- responsiveLayout:"collapse",
- columns:[
- {title:"K.Nr", field:"ident",headerFilter:"input"},
- {title:"Name", field:"company",headerFilter:"input"},
- {title:"E-Mail", field:"email",headerFilter:"input"},
- {title:"Tel", field:"phone",headerFilter:"input"},
- {title:"Addresse", field:"address",headerFilter:"input"},
- ],
-});
- gettbldata();
+
}
function gettbldata(){
- req.reqdata("POST","db.cgi",{"db":mpref.cfg.db,"type":"array","sql":"SELECT id, company, prename,surname, address, zip, city, country, email, phone, mobile, ident FROM accounts;"},filltbldata);
+
}
function filltbldata(data){
- if (data && data.sqldata){
- tbl.setData(data.sqldata);
- }
+
}
+
+
<div class="w3-display-container">
<!-- PAGE DATA START-->
- <div id="maintbl"></div>
+ <div id="tbl_Accounts"></div>
<!-- PAGE DATA END -->
</div>
// }
}
return false;
-}
\ No newline at end of file
+}
+
--- /dev/null
+var transactions = {
+ name: "transactions",
+ tbl: null,
+ initform: function(){
+
+ },
+ inittable: function(){
+
+ },
+ add: function(){
+
+ },
+ edit: function(){
+
+ },
+ remove: function(){
+
+ },
+ afterremove: function(){
+
+ }
+
+}
\ No newline at end of file
-var booking = {
- name: "booking",
+var bookings = {
+ name: "bookings",
+ tbl: null,
+ choices: {},
initform: function(){
},
inittable: function(){
-
+ bookings.tbl = new Tabulator("#tbl_" + bookings.name, {
+ height: "80vh",
+ layout: "fitColumns",
+ selectable: 1,
+ columns: [
+ { title: "Beschreibung", field: "description", formatter: "textarea", width: "400" },
+ {
+ title: "Anz.",
+ field: "quantity",
+ align: "right",
+ formatter: "money",
+ formatterParams: {
+ decimal: ",",
+ thousand: ".",
+ symbol: "",
+ symbolAfter: "p",
+ precision: 0,
+ }
+ },
+ { title: "Einheit", field: "unit" },
+ {
+ title: "Einzel",
+ field: "unitamount",
+ align: "right",
+ formatter: "money",
+ formatterParams: {
+ decimal: ",",
+ thousand: ".",
+ symbol: "€",
+ symbolAfter: "p",
+ precision: 2,
+ }
+ },
+ {
+ title: "Netto",
+ field: "netamount",
+ align: "right",
+ formatter: "money",
+ formatterParams: {
+ decimal: ",",
+ thousand: ".",
+ symbol: "€",
+ symbolAfter: "p",
+ precision: 2,
+ },
+ download: false
+ },
+ {
+ title: "MwSt.",
+ field: "taxamount",
+ align: "right",
+ formatter: "money",
+ formatterParams: {
+ decimal: ",",
+ thousand: ".",
+ symbol: "€",
+ symbolAfter: "p",
+ precision: 2,
+ },
+ download: false
+ }
+ ]
+ });
+ return false;
},
gettbldata: function(){
-
+ var udata = invoices.tbl.getSelectedData();
+ if (udata[0]) {
+ //console.log(udata[0]);
+ req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "bookingslist", "filter": "id_invoice=" + udata[0].id }, bookings.loadtbldata);
+ }
+ return false;
},
loadtbldata: function(data){
-
+ if (data && data.sqldata) {
+ bookings.tbl.setData(data.sqldata);
+ }
+ bookings.tbl.redraw(true);
+ return false;
},
add: function(){
-
+ cleanform("bookings");
+ module.viewdialog("bookings");
},
edit: function(){
-
+ cleanform("bookings");
+ var udata = bookings.tbl.getSelectedData();
+ if (udata[0]) {
+ req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "bookings", "filter": "id=" + udata[0].id }, bookings.fillform);
+ }
+ },
+ fillform: function(data){
+ if (data && data.sqldata) {
+ fillformbydataclass("bookings", data.sqldata[0],bookings.choices, false);
+ module.viewdialog("bookings");
+ }
},
- savebooking: function(){
+ save: function(){
},
- afterbookingsaved: function(data){
+ aftersaved: function(data){
}
}
\ No newline at end of file
-var tbl = null;
-var tblproducts = null;
-var tblfiles = null;
-var currentinvoice = null;
-var statustypes = [{ "value": "planned", "label": "geplant" },
- { "value": "sended", "label": "verschickt" },
- { "value": "received", "label": "erhalten" },
- { "value": "payed", "label": "bezahlt" },
- { "value": "overdue", "label": "überfällig" }
-];
-var currenttemplate = { "base": null, "elements": null };
-var statuslang = { "planned": "geplant", "payed": "bezahlt", "received": "erhalten", "overdue": "überfällig", "sended": "verschickt" };
-var quarters = [{ "value": "Q1", "label": "Q1" }, { "value": "Q2", "label": "Q2" }, { "value": "Q3", "label": "Q3" }, { "value": "Q4", "label": "Q4" }];
-var invoicetypes = [{ "value": "inv-out", "label": "Ausgangs-Rechnung" }, { "value": "inv-in", "label": "Eingangs-Rechnung" }, { "value": "crn-out", "label": "Ausgangs-Gutschrift" }, { "value": "crn-in", "label": "Eingangs-Gutschrift" }];
-
-// var templates = [{ "value": "dks-deutsch", "label": "DKS - Deutsch" }, { "value": "dks-french", "label": "DKS Französisch" }, { "value": "dks-english", "label": "DKS - english" }];
-
-var choice = {
- "invoices": {
- "status": null,
- "id_receipient": null,
- "id_sender": null,
- "bquarter": null,
- "byear": null,
- "invoicetype": null,
- "id_template": null
- }
-};
-
-var choicedata = {
- "invoices": {
- "status": { "data": statustypes },
- "id_receipient": { "view": "receipients" },
- "id_sender": { "view": "receipients" },
- "bquarter": { "view": "quarters" },
- "byear": { "view": "businessyears" },
- "invoicetype": { "data": invoicetypes },
- "id_template": { "view": "templates" }
- }
-};
+// var tbl = null;
+// var tblproducts = null;
+// var tblfiles = null;
+// var currentinvoice = null;
+
+
+// var choice = {
+// "invoices": {
+// "status": null,
+// "id_receipient": null,
+// "id_sender": null,
+// "bquarter": null,
+// "byear": null,
+// "invoicetype": null,
+// "id_template": null
+// }
+// };
+
+// var choicedata = {
+// "invoices": {
+// "status": { "data": statustypes },
+// "id_receipient": { "view": "receipients" },
+// "id_sender": { "view": "receipients" },
+// "bquarter": { "view": "quarters" },
+// "byear": { "view": "businessyears" },
+// "invoicetype": { "data": invoicetypes },
+// "id_template": { "view": templates }
+// }
+// };
function initpage() {
+ console.log(mpref.cfg);
+ console.log("APP:" + parent.app);
+ mpref.loadconfig();
+ invoices.inittable();
+ bookings.inittable();
+ invoices.initform();
//console.log(mpref.cfg);
//console.log("APP:" + parent.app);
- flatpickr(".datefield", {
- altInput: true,
- altFormat: "d.m.Y",
- dateFormat: "Y-m-d",
- allowInput: true,
- "locale": "de",
- });
-
-
- fillchoices();
- journal.inittable();
- inittblbookings();
- inittblfiles();
+
return false;
}
-function inittblinvoices() {
- tbl = new Tabulator("#tbl_invoices", {
- headerFilterPlaceholder: "filter...",
- height: "92vh",
- layout: "fitData",
- selectable: 1,
- // responsiveLayout:"collapse",
- columns: [
- { title: "Quartal", field: "bquarter", headerFilter: "input" },
- {
- title: "Datum",
- field: "invoicedate",
- formatter: "datetime",
- formatterParams: {
- inputFormat: "YYYY-MM-DD",
- outputFormat: "DD.MM.YYYY",
- invalidPlaceholder: ""
- }
- },
- { title: "Empfänger", field: "receipient", headerFilter: "input", width: 200 },
- { title: "Sender", field: "sender", headerFilter: "input" },
- { title: "Referenz", field: "reference", headerFilter: "input" },
- {
- title: "Status",
- field: "status",
- headerFilter: "input",
- formatter: function(cell, formatterParams) {
- var value = cell.getValue();
- //console.log(value.indexOf("bez"));
- if (value.indexOf("payed") >= 0) {
- return "<span style='color:green;'>" + statuslang[value] + "</span>";
- } else if (value.indexOf("overdue") >= 0) {
- return "<span style='color:red; font-weight: bold;'>" + statuslang[value] + "</span>";
- } else if (value.indexOf("planned") >= 0) {
- return "<span style='color:grey;'>" + statuslang[value] + "</span>";
- } else {
- return "<span style='color:orange;'>" + statuslang[value] + "</span>";
- }
- }
- },
- {
- title: "Netto",
- field: "netamount",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "€",
- symbolAfter: "p",
- precision: 2,
- }
- },
- {
- title: "MwSt",
- field: "vatamount",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "€",
- symbolAfter: "p",
- precision: 2,
- }
- }, {
- title: "Brutto",
- field: "grossamount",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "€",
- symbolAfter: "p",
- precision: 2,
- }
- }, {
- title: "Bezahlt",
- field: "payedamount",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "€",
- symbolAfter: "p",
- precision: 2,
- }
- }
- ]
- });
- gettbldata();
-}
+// function inittblinvoices() {
+// tbl = new Tabulator("#tbl_invoices", {
+// headerFilterPlaceholder: "filter...",
+// height: "92vh",
+// layout: "fitData",
+// selectable: 1,
+// // responsiveLayout:"collapse",
+// columns: [
+// { title: "Quartal", field: "bquarter", headerFilter: "input" },
+// {
+// title: "Datum",
+// field: "invoicedate",
+// formatter: "datetime",
+// formatterParams: {
+// inputFormat: "YYYY-MM-DD",
+// outputFormat: "DD.MM.YYYY",
+// invalidPlaceholder: ""
+// }
+// },
+// { title: "Empfänger", field: "receipient", headerFilter: "input", width: 200 },
+// { title: "Sender", field: "sender", headerFilter: "input" },
+// { title: "Referenz", field: "reference", headerFilter: "input" },
+// {
+// title: "Status",
+// field: "status",
+// headerFilter: "input",
+// formatter: function(cell, formatterParams) {
+// var value = cell.getValue();
+// //console.log(value.indexOf("bez"));
+// if (value.indexOf("payed") >= 0) {
+// return "<span style='color:green;'>" + statuslang[value] + "</span>";
+// } else if (value.indexOf("overdue") >= 0) {
+// return "<span style='color:red; font-weight: bold;'>" + statuslang[value] + "</span>";
+// } else if (value.indexOf("planned") >= 0) {
+// return "<span style='color:grey;'>" + statuslang[value] + "</span>";
+// } else {
+// return "<span style='color:orange;'>" + statuslang[value] + "</span>";
+// }
+// }
+// },
+// {
+// title: "Netto",
+// field: "netamount",
+// align: "right",
+// formatter: "money",
+// formatterParams: {
+// decimal: ",",
+// thousand: ".",
+// symbol: "€",
+// symbolAfter: "p",
+// precision: 2,
+// }
+// },
+// {
+// title: "MwSt",
+// field: "vatamount",
+// align: "right",
+// formatter: "money",
+// formatterParams: {
+// decimal: ",",
+// thousand: ".",
+// symbol: "€",
+// symbolAfter: "p",
+// precision: 2,
+// }
+// }, {
+// title: "Brutto",
+// field: "grossamount",
+// align: "right",
+// formatter: "money",
+// formatterParams: {
+// decimal: ",",
+// thousand: ".",
+// symbol: "€",
+// symbolAfter: "p",
+// precision: 2,
+// }
+// }, {
+// title: "Bezahlt",
+// field: "payedamount",
+// align: "right",
+// formatter: "money",
+// formatterParams: {
+// decimal: ",",
+// thousand: ".",
+// symbol: "€",
+// symbolAfter: "p",
+// precision: 2,
+// }
+// }
+// ]
+// });
+// gettbldata();
+// }
function inittblfiles() {
tblfiles = new Tabulator("#tbl_files", {
return false;
}
-function inittblbookings() {
- tblproducts = new Tabulator("#tbl_products", {
- height: "80vh",
- layout: "fitColumns",
- selectable: 1,
- columns: [
- { title: "Beschreibung", field: "description", formatter: "textarea", width: "400" },
- {
- title: "Anz.",
- field: "quantity",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "",
- symbolAfter: "p",
- precision: 0,
- }
- },
- { title: "Einheit", field: "unit" },
- {
- title: "Einzel",
- field: "unitamount",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "€",
- symbolAfter: "p",
- precision: 2,
- }
- },
- {
- title: "Netto",
- field: "netamount",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "€",
- symbolAfter: "p",
- precision: 2,
- },
- download: false
- },
- {
- title: "MwSt.(%)",
- field: "taxpercent",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "%",
- symbolAfter: "p",
- precision: 2,
- },
- download: false
- },
- {
- title: "MwSt.",
- field: "taxamount",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "€",
- symbolAfter: "p",
- precision: 2,
- },
- download: false
- }
- ]
- });
- return false;
-}
-
-function gettblbookingdata() {
- var udata = tbl.getSelectedData();
- if (udata[0]) {
- //console.log(udata[0]);
- req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "bookings", "filter": "id_invoice=" + udata[0].id }, loadtblbookingdata);
- }
- return false;
-}
-function loadtblbookingdata(data) {
- //console.log(data);
- if (data && data.sqldata) {
- tblproducts.setData(data.sqldata);
- }
- tblproducts.redraw(true);
- return false;
-}
-function gettbldata() {
- req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoicelist" }, loadtbldata);
- return false;
-}
-
-function loadtbldata(data) {
- //console.log(data);
- if (data && data.sqldata) {
- tbl.setData(data.sqldata);
- }
- return false;
-}
function edit() {
var udata = tbl.getSelectedData();
return false;
}
-function loadtab(tabname) {
- var i;
- var x = document.getElementsByClassName("tabpanel");
- for (i = 0; i < x.length; i++) {
- x[i].style.display = "none";
- }
- document.getElementById("tab_" + tabname).style.display = "block";
- x = document.getElementsByClassName("tabbtn");
+// function loadtab(tabname) {
+// var i;
+// var x = document.getElementsByClassName("tabpanel");
+// for (i = 0; i < x.length; i++) {
+// x[i].style.display = "none";
+// }
+// document.getElementById("tab_" + tabname).style.display = "block";
+// x = document.getElementsByClassName("tabbtn");
- for (i = 0; i < x.length; i++) {
- //console.log(x[i].classList);
- x[i].classList.remove("w3-blue-grey");
- }
- document.getElementById("tabbtn_" + tabname).classList.add("w3-blue-grey");
- x = document.getElementsByClassName("tabxbtn");
- for (i = 0; i < x.length; i++) {
- x[i].style.display = "none";
- }
- x = document.getElementsByClassName("tabbtn" + tabname);
- for (i = 0; i < x.length; i++) {
- x[i].style.display = "block";
- }
- return false;
-}
+// for (i = 0; i < x.length; i++) {
+// //console.log(x[i].classList);
+// x[i].classList.remove("w3-blue-grey");
+// }
+// document.getElementById("tabbtn_" + tabname).classList.add("w3-blue-grey");
+// x = document.getElementsByClassName("tabxbtn");
+// for (i = 0; i < x.length; i++) {
+// x[i].style.display = "none";
+// }
+// x = document.getElementsByClassName("tabbtn" + tabname);
+// for (i = 0; i < x.length; i++) {
+// x[i].style.display = "block";
+// }
+// return false;
+// }
-function geninvoice() {
- req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "templates", "filter": "id=" + document.getElementById("id_template").value }, gettemplateelements);
- return false;
-}
+// function geninvoice() {
+// req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "templates", "filter": "id=" + document.getElementById("id_template").value }, gettemplateelements);
+// return false;
+// }
-function gettemplateelements(data) {
- if (data && data.sqldata) {
- currenttemplate["base"] = data.sqldata[0];
- req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "templateelements", "filter": "id_template=" + document.getElementById("id_template").value }, makepdf);
- }
+// function gettemplateelements(data) {
+// if (data && data.sqldata) {
+// currenttemplate["base"] = data.sqldata[0];
+// req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "templateelements", "filter": "id_template=" + document.getElementById("id_template").value }, makepdf);
+// }
-}
+// }
-function makepdf(data) {
- console.log(currentinvoice);
- if (data && data.sqldata) {
- currenttemplate["elements"] = data.sqldata;
- }
- console.log(currenttemplate);
+// function makepdf(data) {
+// console.log(currentinvoice);
+// if (data && data.sqldata) {
+// currenttemplate["elements"] = data.sqldata;
+// }
+// console.log(currenttemplate);
- var doc = new jsPDF({
- orientation: currenttemplate.base.orientation,
- unit: currenttemplate.base.unit,
- format: "a4"
- });
- // for (var i in currenttemplate.elements) {
- // var cel = currenttemplate.elements[i];
- // // if (cel['etype'] == 'text') {
- // // setpdftext(doc, cel);
- // // }
- // if (cel['etype'] == 'image') {
- // //doc.addImage(cel['edata'], cel['filetype'], cel['xpos'], cel['ypos'], cel['width'], cel['height'], undefined, 'none');
- // setpdfimage(doc, cel);
- // }
- // }
-
- for (var i in currenttemplate.elements) {
- var cel = currenttemplate.elements[i];
- if (cel['etype'] == 'text') {
- console.log("add TEXT");
- setpdftext(doc, cel);
- }
- if (cel['etype'] == 'image') {
- console.log("add image");
- setpdfimage(doc, cel);
- }
- }
- // It can parse html:
- //doc.autoTable({ html: '#tbl_products' });
- doc.save(document.getElementById("reference").value + ".pdf");
- return false;
-}
+// var doc = new jsPDF({
+// orientation: currenttemplate.base.orientation,
+// unit: currenttemplate.base.unit,
+// format: "a4"
+// });
+// // for (var i in currenttemplate.elements) {
+// // var cel = currenttemplate.elements[i];
+// // // if (cel['etype'] == 'text') {
+// // // setpdftext(doc, cel);
+// // // }
+// // if (cel['etype'] == 'image') {
+// // //doc.addImage(cel['edata'], cel['filetype'], cel['xpos'], cel['ypos'], cel['width'], cel['height'], undefined, 'none');
+// // setpdfimage(doc, cel);
+// // }
+// // }
+
+// for (var i in currenttemplate.elements) {
+// var cel = currenttemplate.elements[i];
+// if (cel['etype'] == 'text') {
+// console.log("add TEXT");
+// setpdftext(doc, cel);
+// }
+// if (cel['etype'] == 'image') {
+// console.log("add image");
+// setpdfimage(doc, cel);
+// }
+// }
+// // It can parse html:
+// //doc.autoTable({ html: '#tbl_products' });
+// doc.save(document.getElementById("reference").value + ".pdf");
+// return false;
+// }
// function makepdf(data) {
// console.log(currentinvoice);
// });
// }
-function setpdftext(pdf, el) {
- if (el['fontsize']) {
- pdf.setFontSize(el['fontsize']);
- }
- const regex = /%%([\w]+)%%/gm;
- var etext = el['edata'];
- var m;
- while ((m = regex.exec(etext)) !== null) {
- // This is necessary to avoid infinite loops with zero-width matches
- if (m.index === regex.lastIndex) {
- regex.lastIndex++;
- }
+// function setpdftext(pdf, el) {
+// if (el['fontsize']) {
+// pdf.setFontSize(el['fontsize']);
+// }
+// const regex = /%%([\w]+)%%/gm;
+// var etext = el['edata'];
+// var m;
+// while ((m = regex.exec(etext)) !== null) {
+// // This is necessary to avoid infinite loops with zero-width matches
+// if (m.index === regex.lastIndex) {
+// regex.lastIndex++;
+// }
- // The result can be accessed through the `m`-variable.
- m.forEach((match, groupIndex) => {
- //etext.replace('')
- if (groupIndex == 1) {
- if (document.getElementById(match)) {
- etext.replace('%%' + match + '%%', currentinvoice[match]);
- }
+// // The result can be accessed through the `m`-variable.
+// m.forEach((match, groupIndex) => {
+// //etext.replace('')
+// if (groupIndex == 1) {
+// if (document.getElementById(match)) {
+// etext.replace('%%' + match + '%%', currentinvoice[match]);
+// }
- }
- //console.log(`Found match, group ${groupIndex}: ${match}`);
- });
+// }
+// //console.log(`Found match, group ${groupIndex}: ${match}`);
+// });
- }
- etext.replace(regex, '');
- pdf.text(etext, el['xpos'], el['ypos']);
- return false;
-}
+// }
+// etext.replace(regex, '');
+// pdf.text(etext, el['xpos'], el['ypos']);
+// return false;
+// }
-function setpdfimage(pdf, el) {
- //console.log("ADD IMAGE");
- //console.log(el);
- pdf.addImage(el['edata'], el['filetype'], el['xpos'], el['ypos'], el['width'], el['height'], undefined, 'none');
- return false;
-}
\ No newline at end of file
+// function setpdfimage(pdf, el) {
+// //console.log("ADD IMAGE");
+// //console.log(el);
+// pdf.addImage(el['edata'], el['filetype'], el['xpos'], el['ypos'], el['width'], el['height'], undefined, 'none');
+// return false;
+// }
\ No newline at end of file
[% PROCESS macro/fields.tt %]
<div class="w3-top w3-border-bottom w3-white">
<div class="w3-bar">
- <button class="w3-bar-item w3-button w3-border w3-round w3-blue" onclick="viewtable();"> Journal</button>
- <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-red invdata" onclick="invoice.genpdf();" style="display: none;"><i class="icon-pdf"></i></button>
- <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-red invlist" onclick="remove();"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
- <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue invlist" onclick="edit();"><img src="[% abspath%][% staticpath %]img/icons/edit_white.svg" style="height: 24px;"/></button>
- <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue invlist" onclick="add();"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
- <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue invdata" onclick="saveinvoice();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/Save.svg" style="height: 24px;"/></button>
+ <div class="toolbar" id="tbar_tbl_invoices">
+ <button class="w3-bar-item w3-button w3-border w3-blue-grey" onclick="module.viewpanel('tbl_invoices');"> Journal</button>
+
+ <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="invoices.remove();"><i class=" icon-Delete"></i></button>
+ <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="invoices.edit();"><i class=" icon-Edit"></i></button>
+ <button class="w3-bar-item w3-button w3-border w3-right w3-blue-gre" onclick="invoices.add();"><i class=" icon-Add"></i></button>
+ </div>
+ <div class="toolbar" id="tbar_frm_invoices" style="display: none;">
+ <button class="w3-bar-item w3-button w3-border w3-blue-grey" onclick="module.viewpanel('tbl_invoices');"> back</button>
+
+ <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="invoice.genpdf();"><i class="icon-Printer"></i></button>
+ <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="invoices.save();"><i class=" icon-Save"></i></button>
+ </div>
</div>
</div>
-<div class="w3-display-container" id="tbl_invoices" style="margin-top: 50px;"></div>
-<div class="w3-display-container" id="pnl_invoices" style="display: none; margin-top: 50px;">
+<div class="w3-display-container panel" id="pnl_tbl_invoices" style="margin-top: 50px;">
+ <div id="tbl_invoices"></div>
+</div>
+<div class="w3-display-container panel" id="pnl_frm_invoices" style="display: none; margin-top: 50px;"></div>
+
- <div class="w3-top" style="margin-top: 43px;">
- <div class="w3-bar w3-border-top w3-border-bottom tabbar w3-light-grey">
- <button class="w3-bar-item w3-button tabbtn" id="tabbtn_details" onclick="loadtab('details');"><img src="[% abspath%][% staticpath %]img/icons/Bill.svg" style="height: 24px;"/> Allgemein</button>
- <button class="w3-bar-item w3-button tabbtn" id="tabbtn_products" onclick="loadtab('products')"><img src="[% abspath%][% staticpath %]img/icons/package.svg" style="height: 24px;"/> Produkte</button>
- <button class="w3-bar-item w3-button tabbtn" id="tabbtn_files" onclick="loadtab('files');"><img src="[% abspath%][% staticpath %]img/icons/file.svg" style="height: 24px;"/> Dateien</button>
- <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-red tabxbtn tabbtnproducts" onclick="removeproduct();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
- <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue tabxbtn tabbtnproducts" onclick="editproduct();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/edit_white.svg" style="height: 24px;"/></button>
- <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue tabxbtn tabbtnproducts" onclick="addproduct();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
- <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-red tabxbtn tabbtnfiles" onclick="removefile();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
- <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue tabxbtn tabbtnfiles" onclick="addfile();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
- </div>
- </div>
- <div class="w3-container tabpanel" id="tab_details" style="margin-top: 100px;">
+ <div class="w3-container" >
+ <form id="frm_invoices">
+ <div class="w3-container w3-threequarter">
[% fieldhidden('id','invoices','ident') %]
[% fieldhidden('address','invoices') %]
<div class="w3-cell-row">
- [% fieldselectbox('invoicetype','invoices','Typ','w3-half','') %] [% fieldselectbox('id_template','invoices','Vorlage','w3-half','') %]
- </div>
- <div class="w3-cell-row">
- [% fieldselectbox('status','invoices','Status','w3-quarter','') %] [% fielddatebox('statusdate','invoices','Status-Datum','w3-quarter','readonly') %] [% fieldeditbox('statement','invoices','Kontoauszug','w3-quarter','') %] [% fieldselectbox('bquarter','invoices','G.Quartal','w3-quarter','')
- %]
+ [% fieldselectbox('invoicetype','invoices','Typ','w3-half','') %]
+ [% fieldselectbox('id_template','invoices','Vorlage','w3-half','') %]
</div>
<div class="w3-cell-row">
[% fieldselectbox('id_receipient','invoices','Empfänger','w3-half','') %] [% fieldselectbox('id_sender','invoices','Sender','w3-half','') %] [% fieldeditbox('reference','invoices','Referenz','','') %]
[% fielddatebox('invoicedate','invoices','Datum','w3-fifth','') %] [% fielddatebox('deadlinedate','invoices','Fälligkeit','w3-fifth','') %] [% fieldtagbox('reminderdates','invoices','Mahnungs-Daten','w3-threefifth','') %]
</div>
<div class="w3-cell-row">
- [% fieldtextarea('headernote','invoices','Vorwort','','','200px','') %]
+ [% fieldtextarea('headernote','invoices','Vorwort','','','100px','') %]
</div>
<div class="w3-cell-row">
- [% fieldtextarea('footernote','invoices','Nachwort','','','200px','') %]
+ [% fieldtextarea('footernote','invoices','Nachwort','','','100px','') %]
</div>
+ </div>
+ <div class="w3-container w3-quarter">
+ [% fieldmoneybox('netamount','invoices','Netto','','readonly') %]
+ [% fieldmoneybox('vatamount','invoices','MwSt','','readonly') %]
+ [% fieldmoneybox('grossamount','invoices','Brutto','','readonly') %]
+ [% fieldmoneybox('payedamount','invoices','Bezahlt','','') %]
+ [% fieldselectbox('status','invoices','Status','','') %]
+ [% fielddatebox('statusdate','invoices','Status-Datum','','readonly') %]
+ [% fieldeditbox('statement','invoices','Kontoauszug','','') %]
+ [% fieldselectbox('bquarter','invoices','G.Quartal','','')%]
+ </div>
+ </form>
</div>
- <div class="w3-container tabpanel" id="tab_products" style="margin-top: 100px;display: none;">
- <div id="tbl_products"></div>
- </div>
- <div class="w3-container tabpanel" id="tab_files" style="margin-top: 100px;display: none;">
- <div id="tbl_files"></div>
+ <div class="w3-bar">
+ <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="bookings.remove();" ><i class=" icon-Delete"></i></button>
+ <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="bookings.edit();" ><i class=" icon-Edit"></i></button>
+ <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="bookings.add();" ><i class=" icon-Add"></i></button>
</div>
- <div class="spacerx" style="height: 60px;"></div>
- <div class="w3-bottom w3-border-bottom w3-light-grey">
- <div class="w3-bar">
- [% fieldmoneybox('netamount','invoices','Netto','w3-quarter','') %] [% fieldmoneybox('vatamount','invoices','MwSt','w3-quarter','') %] [% fieldmoneybox('grossamount','invoices','Brutto','w3-quarter','') %] [% fieldmoneybox('payedamount','invoices','Bezahlt','w3-quarter','')
- %]
+ <div id="tbl_bookings"></div>
+
+
+
+
+ <!-- <div class="spacerx footer" style="height: 60px; display:none;"></div>
+ <div class="w3-bottom w3-border-bottom w3-light-grey footer" id="footerdata" style="display: none;">
+ <div class="w3-bar">
+
+ </div>
+ </div> -->
+
+</div>
+<div id="dlg_bookings" class="w3-modal">
+
+ <div class="w3-modal-content w3-animate-top w3-card-4">
+ <header class="w3-container">
+ <span onclick="document.getElementById('dlg_bookings').style.display='none'; return false;"
+ class="w3-button w3-display-topright">×</span>
+ <h2>Produkt/Dienstleistung</h2>
+ </header>
+ <div class="w3-container">
+ <form id="frm_bookings">
+ [% fieldhidden('id_booking','bookings','ident') %]
+ [% fieldhidden('id_invoice','bookings','ident') %]
+ <div class="w3-cell-row">
+ [% fieldnumberbox('quantity','bookings','Anzahl','w3-quarter','') %]
+ [% fieldeditbox('unit','bookings','Einheit','w3-quarter','') %]
+ [% fieldmoneybox('unitamount','bookings','Einheitspreis','w3-quarter','') %]
</div>
+ <div class="w3-cell-row">
+ [% fieldmoneybox('taxamount','bookings','MwSt','w3-quarter','') %]
+ [% fieldmoneybox('taxpercent','bookings','MwSt (%)','w3-quarter','') %]
+ [% fieldmoneybox('netamount','display','Netto','w3-quarter','readonly') %]
+ </div>
+ <div class="w3-cell-row">
+ [% fieldrichtextarea('description','bookings','Beschreibung','','','100px','') %]
+ </div>
+
+ </form>
</div>
+ <footer class="w3-container w3-right-align w3-padding-16">
+ <button class="w3-button w3-theme-light w3-margin-right w3-border" onclick="document.getElementById('dlg_bookings').style.display='none'; return false;">Abbrechern</button>
+ <button class="w3-button w3-red w3-margin-right w3-border" onclick="bookings.save();">Speichern</button>
+ </footer>
+ </div>
</div>
+
[% INCLUDE "block/dlgdataload.tt" %]
[% INCLUDE "block/dlgdeleterow.tt" %]
[% INCLUDE "block/dlgmessage.tt" %]
-<script src="panel/journal/journal.js"></script>
-<script src="panel/journal/invoice.js"></script>
-<script src="panel/journal/booking.js"></script>
\ No newline at end of file
+<script src="invoice.js"></script>
+<script src="booking.js"></script>
\ No newline at end of file
-var invoice = {
- name: "invoice",
- initform: function(){
+var statustypes = [{ "value": "planned", "label": "geplant" },
+ { "value": "sended", "label": "verschickt" },
+ { "value": "received", "label": "erhalten" },
+ { "value": "payed", "label": "bezahlt" },
+ { "value": "overdue", "label": "überfällig" }
+];
+// var currenttemplate = { "base": null, "elements": null };
+var statuslang = { "planned": "geplant", "payed": "bezahlt", "received": "erhalten", "overdue": "überfällig", "sended": "verschickt" };
+// var quarters = [{ "value": "Q1", "label": "Q1" }, { "value": "Q2", "label": "Q2" }, { "value": "Q3", "label": "Q3" }, { "value": "Q4", "label": "Q4" }];
+var invoicetypes = [{ "value": "inv-out", "label": "Ausgangs-Rechnung" }, { "value": "inv-in", "label": "Eingangs-Rechnung" }, { "value": "crn-out", "label": "Ausgangs-Gutschrift" }, { "value": "crn-in", "label": "Eingangs-Gutschrift" }];
+
+var templates = [{ "value": "dks-deutsch", "label": "DKS - Deutsch" }, { "value": "dks-french", "label": "DKS Französisch" }, { "value": "dks-english", "label": "DKS - english" }];
+var invoices = {
+ name: "invoices",
+ current: null,
+ choices: {"status": null,"id_receipient": null,"id_sender": null,"bquarter": null,"invoicetype": null,"id_template": null},//"byear": null,
+ choicesdata: {
+ "status": { "data": statustypes },
+ "id_receipient": { "view": "receipients" },
+ "id_sender": { "view": "receipients" },
+ "bquarter": { "view": "quarters" },
+ // "byear": { "view": "businessyears" },
+ "invoicetype": { "data": invoicetypes },
+ "id_template": { "data": templates }
+ },
+ initform: function(){
+ flatpickr(".datefield", {
+ altInput: true,
+ altFormat: "d.m.Y",
+ dateFormat: "Y-m-d",
+ allowInput: true,
+ "locale": "de",
+ });
+ for (var c in invoices.choices) {
+ invoices.choices[c] = new Choices('#' + c, {
+ searchEnabled: false,
+ itemSelectText: '',
+ removeItemButton: true,
+ choices: ((invoices.choicesdata[c]['data']) ? invoices.choicesdata[c]['data'] : []),
+ shouldSort: false
+ });
+ if (invoices.choicesdata[c]['view']) {
+ //console.log("We have a view:" + choicedata[f][c]['view']);
+ invoices.getchoicedata(invoices.choicesdata[c]['view']);
+ }
+ }
+ },
+ inittable: function(){
+ invoices.tbl = new Tabulator("#tbl_" + invoices.name, {
+ headerFilterPlaceholder: "filter...",
+ height: "92vh",
+ layout: "fitData",
+ selectable: 1,
+ // responsiveLayout:"collapse",
+ columns: [
+ { title: "Quartal", field: "bquarter", headerFilter: "input" },
+ {
+ title: "Datum",
+ field: "invoicedate",
+ formatter: "datetime",
+ formatterParams: {
+ inputFormat: "YYYY-MM-DD",
+ outputFormat: "DD.MM.YYYY",
+ invalidPlaceholder: ""
+ }
+ },
+ { title: "Empfänger", field: "receipient", headerFilter: "input", width: 200 },
+ { title: "Sender", field: "sender", headerFilter: "input" },
+ { title: "Referenz", field: "reference", headerFilter: "input" },
+ {
+ title: "Status",
+ field: "status",
+ headerFilter: "input",
+ formatter: function(cell, formatterParams) {
+ var value = cell.getValue();
+ //console.log(value.indexOf("bez"));
+ if (value.indexOf("payed") >= 0) {
+ return "<span style='color:green;'>" + statuslang[value] + "</span>";
+ } else if (value.indexOf("overdue") >= 0) {
+ return "<span style='color:red; font-weight: bold;'>" + statuslang[value] + "</span>";
+ } else if (value.indexOf("planned") >= 0) {
+ return "<span style='color:grey;'>" + statuslang[value] + "</span>";
+ } else {
+ return "<span style='color:orange;'>" + statuslang[value] + "</span>";
+ }
+ }
+ },
+ {
+ title: "Netto",
+ field: "netamount",
+ align: "right",
+ formatter: "money",
+ formatterParams: {
+ decimal: ",",
+ thousand: ".",
+ symbol: "€",
+ symbolAfter: "p",
+ precision: 2,
+ }
+ },
+ {
+ title: "MwSt",
+ field: "vatamount",
+ align: "right",
+ formatter: "money",
+ formatterParams: {
+ decimal: ",",
+ thousand: ".",
+ symbol: "€",
+ symbolAfter: "p",
+ precision: 2,
+ }
+ }, {
+ title: "Brutto",
+ field: "grossamount",
+ align: "right",
+ formatter: "money",
+ formatterParams: {
+ decimal: ",",
+ thousand: ".",
+ symbol: "€",
+ symbolAfter: "p",
+ precision: 2,
+ }
+ }, {
+ title: "Bezahlt",
+ field: "payedamount",
+ align: "right",
+ formatter: "money",
+ formatterParams: {
+ decimal: ",",
+ thousand: ".",
+ symbol: "€",
+ symbolAfter: "p",
+ precision: 2,
+ }
+ }
+ ]
+ });
+ invoices.gettbldata();
+ },
+ gettbldata: function(){
+ req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoicelist" }, invoices.loadtbldata);
+ return false;
+ },
+ loadtbldata: function(data){
+ if (data && data.sqldata) {
+ invoices.tbl.setData(data.sqldata);
+ }
+ return false;
},
add: function(){
-
+ cleanform("invoices");
+ bookings.tbl.clearData();
},
remove: function(){
+ var udata = journal.tbl.getSelectedData();
+ if (udata[0]) {
+ var uid = udata[0].id;
+ showdeletedlg("invoices",uid,"Êtes vous sûre de supprimer l'employé(e) sélectionnée?",invoices.afterdeletecallback);
+ //module.viewpanel('tbl_' + staff.name);
+ }
+ },
+ afterdeletecallback: function(){
},
edit: function(){
- var udata = journal.tbl.getSelectedData();
- //cleanform("invoices");
+ var udata = invoices.tbl.getSelectedData();
+ cleanform("invoices");
if (udata[0]) {
- currentinvoice = udata[0];
- //console.log(udata[0]);
- req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoices", "filter": "id=" + udata[0].id }, fillinvoice);
- viewinvoicepanel();
+ invoices.current = udata[0];
+ console.log(udata[0]);
+ req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoices", "filter": "id=" + udata[0].id }, invoices.fillinvoice);
+ module.viewpanel("frm_" + invoices.name);
}
return false;
},
},
geninvoice: function(){
+ },
+ getchoicedata: function(view){
+ req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": view }, invoices.setchoicesdata);
+ return false;
+ },
+ fillinvoice: function(data){
+ console.log("Data to fill in");
+ console.log(data);
+ if (data && data.sqldata) {
+
+ fillformbydataclass("invoices", data.sqldata[0],invoices.choices, false);
+ //console.log(data.sqldata[0].invoicetype);
+ invoices.current = data.sqldata[0];
+ if (data.sqldata[0].invoicetype == "inv-out") {
+ //document.getElementById("netamount").readonly = true;
+ }
+ bookings.gettbldata();
}
+ return false;
+ },
+ setchoicesdata: function (data) {
+ if (data && data.sqldata && data.view) {
+ for (var c in invoices.choices) {
+ if (invoices.choicesdata[c]['view'] && invoices.choicesdata[c]['view'] == data.view) {
+ console.log(c);
+ fillselectlist(invoices.choices[c], data.sqldata, "value", "label");
+ }
+ }
+ }
+ return false;
+}
+
}
\ No newline at end of file
+++ /dev/null
-var statustypes = [{ "value": "planned", "label": "geplant" },
- { "value": "sended", "label": "verschickt" },
- { "value": "received", "label": "erhalten" },
- { "value": "payed", "label": "bezahlt" },
- { "value": "overdue", "label": "überfällig" }
-];
-var currenttemplate = { "base": null, "elements": null };
-var statuslang = { "planned": "geplant", "payed": "bezahlt", "received": "erhalten", "overdue": "überfällig", "sended": "verschickt" };
-var quarters = [{ "value": "Q1", "label": "Q1" }, { "value": "Q2", "label": "Q2" }, { "value": "Q3", "label": "Q3" }, { "value": "Q4", "label": "Q4" }];
-var invoicetypes = [{ "value": "inv-out", "label": "Ausgangs-Rechnung" }, { "value": "inv-in", "label": "Eingangs-Rechnung" }, { "value": "crn-out", "label": "Ausgangs-Gutschrift" }, { "value": "crn-in", "label": "Eingangs-Gutschrift" }];
-
-var journal = {
- name:"journal",
- tbl:null,
- initform: function(){
-
- },
- inittable: function(){
- journal.tbl = new Tabulator("#tbl_" + journal.name, {
- headerFilterPlaceholder: "filter...",
- height: "92vh",
- layout: "fitData",
- selectable: 1,
- // responsiveLayout:"collapse",
- columns: [
- { title: "Quartal", field: "bquarter", headerFilter: "input" },
- {
- title: "Datum",
- field: "invoicedate",
- formatter: "datetime",
- formatterParams: {
- inputFormat: "YYYY-MM-DD",
- outputFormat: "DD.MM.YYYY",
- invalidPlaceholder: ""
- }
- },
- { title: "Empfänger", field: "receipient", headerFilter: "input", width: 200 },
- { title: "Sender", field: "sender", headerFilter: "input" },
- { title: "Referenz", field: "reference", headerFilter: "input" },
- {
- title: "Status",
- field: "status",
- headerFilter: "input",
- formatter: function(cell, formatterParams) {
- var value = cell.getValue();
- //console.log(value.indexOf("bez"));
- if (value.indexOf("payed") >= 0) {
- return "<span style='color:green;'>" + statuslang[value] + "</span>";
- } else if (value.indexOf("overdue") >= 0) {
- return "<span style='color:red; font-weight: bold;'>" + statuslang[value] + "</span>";
- } else if (value.indexOf("planned") >= 0) {
- return "<span style='color:grey;'>" + statuslang[value] + "</span>";
- } else {
- return "<span style='color:orange;'>" + statuslang[value] + "</span>";
- }
- }
- },
- {
- title: "Netto",
- field: "netamount",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "€",
- symbolAfter: "p",
- precision: 2,
- }
- },
- {
- title: "MwSt",
- field: "vatamount",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "€",
- symbolAfter: "p",
- precision: 2,
- }
- }, {
- title: "Brutto",
- field: "grossamount",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "€",
- symbolAfter: "p",
- precision: 2,
- }
- }, {
- title: "Bezahlt",
- field: "payedamount",
- align: "right",
- formatter: "money",
- formatterParams: {
- decimal: ",",
- thousand: ".",
- symbol: "€",
- symbolAfter: "p",
- precision: 2,
- }
- }
- ]
- });
- journal.gettbldata();
- },
- gettbldata: function(){
- req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoicelist" }, journal.loadtbldata);
- return false;
- },
- loadtbldata: function(data){
- if (data && data.sqldata) {
- journal.tbl.setData(data.sqldata);
- }
- return false;
- },
- add: function(){
-
- },
- edit: function(){
-
- },
- remove: function(){
-
- }
-}
\ No newline at end of file
<button class="w3-bar-item w3-button w3-border w3-blue-grey" onclick="viewtable();"><img src="[% abspath%][% staticpath %]img/icons/list_white.svg" style="height: 24px;"/> Rechnungen</button>
<!-- <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey " onclick="setusergroups();"><img src="[% abspath%][% staticpath %]img/icons/group_white.svg" style="height: 24px;"/></button>
<button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey " onclick="setlogin();"><img src="[% abspath%][% staticpath %]img/icons/user_white.svg" style="height: 24px;"/></button> -->
- <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="add();"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
- <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="remove();"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
- <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="edit();"><img src="[% abspath%][% staticpath %]img/icons/edit_white.svg" style="height: 24px;"/></button>
+ <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="add();"><i class=" icon-Add"></i></button>
+ <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="remove();"><i class=" icon-Delete"></i></button>
+ <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="edit();"><i class=" icon-Edit"></i></button>
</div>
</div>
<div class="w3-display-container" id="tbl_invoices" style="margin-top: 50px;"></div>
use pdfreport;
my $dbpath = $ENV{HOME}.'/Workspace/dksnas/data';
my $data = {
- dbtype => 'SQLite', #'PgPP' or ScLite
- dsn => 'DBI:SQLite:dbname='.$dbpath.'/invoicejournal/dksbuchhaltung.sqlite',
- dbuser => '',
- dbpassword => ''
+ id_invoice => "469",
+ dsn => 'DBI:SQLite:dbname='.$dbpath.'/invoicejournal/dksbuchhaltung.sqlite'
};
-my $rep = pdfreport->new({tmplpath => $RealBin.'/report', tmp => $RealBin.'/tmp',data => {}});
-my ($result,$file) = $rep->createpdf('ttinvoice',$RealBin.'/output/textinvoice.pdf');
+my $rep = pdfreport->new({tmplpath => $RealBin.'/report', tmp => $RealBin.'/tmp'});
+my ($result,$file) = $rep->createpdf('ttinvoice',$RealBin.'/output/textinvoice.pdf',$data);
print "$result: $file\n";
my $self = bless {}, $class;
$self->{tmplpath} =$p->{tmplpath};
$self->{tmp} =$p->{tmp};
- $self->{data} = $p->{data};
- $self->{PDFAPP} = "/usr/local/bin/wkhtmltopdf";
+ $self->{pdf} = undef;
+ $self->{template} = undef;
+ #$self->{template} = $p->{template};
+ $self->{pdf}->{app} = "/usr/local/bin/wkhtmltopdf";
return $self;
}
my $self = shift;
my $template = shift;
my $output = shift;
- my $pdfcfg = ();
+ my $inputdata = shift;
my $r = -1;
print $self->{tmplpath}.'/'.$template.'.conf'."\n";
if (-e $self->{tmplpath}.'/'.$template.'.conf'){
- $pdfcfg = $self->readpdfconfig($template);
- print Dumper($pdfcfg);
+ $self->readpdfconfig($template,$inputdata);
+ print Dumper($self->{template});
}
+ print Dumper($self->{pdf});
+ print Dumper($self->{template});
my $tmpreportpath=$self->{tmplpath};
- if (exists($pdfcfg->{ENGINE}) && ($pdfcfg->{ENGINE} eq "Template::Toolkit")){
+ if (exists($self->{pdf}->{engine}) && ($self->{pdf}->{engine} eq "Template::Toolkit")){
$template = $self->createTTReport($template);
$tmpreportpath = $self->{tmp};
}
- if ((keys(%{$pdfcfg}) > 0) && (-e $tmpreportpath.'/'.$template.'.html')){
- my $cmd = '"'.$self->{PDFAPP}.'"';
- if ($pdfcfg->{PDFBOTTOM}){ $cmd .= " -B ".$pdfcfg->{PDFBOTTOM}; }
- if ($pdfcfg->{PDFLEFT}){ $cmd .= " -L ".$pdfcfg->{PDFLEFT}; }
- if ($pdfcfg->{PDFRIGHT}){ $cmd .= " -R ".$pdfcfg->{PDFRIGHT}; }
- if ($pdfcfg->{PDFTOP}){ $cmd .= " -T ".$pdfcfg->{PDFTOP}; }
- if ($pdfcfg->{PDFORIENTATION}){ $cmd .= " -O ".$pdfcfg->{PDFORIENTATION}; }
- if ($pdfcfg->{PDFSIZE}){ $cmd .= " -s ".$pdfcfg->{PDFSIZE}; }
+ if ((keys(%{$self}) > 0) && (-e $tmpreportpath.'/'.$template.'.html')){
+ my $cmd = '"'.$self->{pdf}->{app}.'"';
+ if ($self->{pdf}->{bottom}){ $cmd .= " -B ".$self->{pdf}->{bottom}; }
+ if ($self->{pdf}->{left}){ $cmd .= " -L ".$self->{pdf}->{left}; }
+ if ($self->{pdf}->{right}){ $cmd .= " -R ".$self->{pdf}->{right}; }
+ if ($self->{pdf}->{top}){ $cmd .= " -T ".$self->{pdf}->{top}; }
+ if ($self->{pdf}->{orientation}){ $cmd .= " -O ".$self->{pdf}->{orientation}; }
+ if ($self->{pdf}->{size}){ $cmd .= " -s ".$self->{pdf}->{size}; }
+ if ($self->{pdf}->{encoding}){ $cmd .= " --encoding '".$self->{pdf}->{encoding}."'"; }
if (-e $tmpreportpath.'/'.$template.'.header.html'){
$cmd .= ' --header-html "'.$tmpreportpath.'/'.$template.'.header.html"';
}
my $template = shift;
my $uniquekey = $$;
if (-e $self->{tmplpath}.'/'.$template.".tt"){
- $self->TTtoHTML($self->{tmplpath}.'/'.$template.".tt",$self->{tmp}.'/'.$template.$$.".html",$self->{data});
+ $self->TTtoHTML($self->{tmplpath}.'/'.$template.".tt",$self->{tmp}.'/'.$template.$$.".html");
}
if (-e $self->{tmplpath}.'/'.$template.".header.tt"){
- $self->TTtoHTML($self->{tmplpath}.'/'.$template.".header.tt",$self->{tmp}.'/'.$template.$$.".header.html",$self->{data});
+ $self->TTtoHTML($self->{tmplpath}.'/'.$template.".header.tt",$self->{tmp}.'/'.$template.$$.".header.html");
}
if (-e $self->{tmplpath}.'/'.$template.".footer.tt"){
- $self->TTtoHTML($self->{tmplpath}.'/'.$template.".footer.tt",$self->{tmp}.'/'.$template.$$.".footer.html",$self->{data});
+ $self->TTtoHTML($self->{tmplpath}.'/'.$template.".footer.tt",$self->{tmp}.'/'.$template.$$.".footer.html");
}
if (-d $self->{tmplpath}.'/'.$template){
dircopy($self->{tmplpath}.'/'.$template,$self->{tmp}.'/'.$template);
my $self = shift;
my $ttfile = shift;
my $outfile = shift;
- my $data = shift;
- my $template = Template->new({INCLUDE_PATH => [dirname($ttfile)],OUTPUT => $outfile});
- $template->process(basename($ttfile),$data) || die "Template process failed: ", $template->error(), "\n";
+ my $template = Template->new({INCLUDE_PATH => [dirname($ttfile)]});#,ENCODING => 'utf8'
+ $template->process(basename($ttfile),$self->{template},$outfile) || die "Template process failed: ", $template->error(), "\n";#,{binmode => ':utf8'}
}
sub readpdfconfig(){
my $self = shift;
my $template = shift;
- my $cfg = ();
+ my $inputdata = shift;
open(CFG,$self->{tmplpath}.'/'.$template.'.conf');
while (my $l = <CFG>){
chomp($l);
+ print $l."\n";
$l =~ s/^\s+//;
if (($l =~ /^#/) || ($l eq "")) {next;}
if ($l =~ /\w+=.+/){
- my ($k,$v) = $l =~ m/^(\w+)=\"(.+)\"$/;
- $cfg->{$k} = $v;
+ my ($k1,$k2,$v) = $l =~ m/^(\w+)_(\w+)=\"(.+)\"$/;
+ $self->{lc($k1)}->{lc($k2)} = $v;
}
}
close(CFG);
- return $cfg;
+ foreach my $ik (keys(%{$inputdata})){
+ $self->{template}->{lc($ik)} = $inputdata->{$ik};
+ }
}
1;
\ No newline at end of file
<td style="width: 60mm"> </td>
<td style="width: 50mm;text-align: right;">
<div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
- <b>DKS s.Ã Â r.l.</b><br/>
- 8b, rue du Moulin<br/>
- L-6914 Roodt-sur-Syre<br/><br/>
+ <b>DKS s.Ã r.l.</b><br/>
+ 4, rue Principale<br/>
+ L-3770 Tétange<br/><br/>
Tel: +352 691 504 574<br/>
info@dks.lu / www.dks.lu<br/>
</div>
</td>
- <tr><td style="text-align: left;">Database knowledge Solutions - <b>Simplify IT</b></td><td></td><td></td></tr>
+ <tr><td style="text-align: left;">Database Knowledge Solutions - <b>Simplify IT</b></td><td></td><td></td></tr>
</tr>
</table>
</body></html>
<!DOCTYPE html>
<html lang="en">
+<meta charset="UTF-8">
<head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
-PDFTOP="40mm"
-PDFBOTTOM="20mm"
-PDFLEFT="20mm"
-PDFRIGHT="10mm"
-PDFSIZE="A4"
-PDFORIENTATION="Portrait"
-ENGINE="Template::Toolkit"
+PDF_TOP="40mm"
+PDF_BOTTOM="20mm"
+PDF_LEFT="20mm"
+PDF_RIGHT="10mm"
+PDF_SIZE="A4"
+PDF_ORIENTATION="Portrait"
+PDF_ENGINE="Template::Toolkit"
+PDF_ENCODING="UTF-8"
+TEMPLATE_DSN=""
+TEMPLATE_DBUSER=""
+TEMPLATE_DBPASSWORD=""
\ No newline at end of file
<!DOCTYPE html>
-<html><head><script>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
function subst() {
var vars = {};
var query_strings_from_url = document.location.search.substring(1).split('&');
}
}
}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
+</script></head>
+<body style="border:0; margin: 0;" onload="subst()">
<table style="width: 100%;" >
- <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
+ <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
<b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
<tr>
<td></td>
<!DOCTYPE html>
<html><head>
-
+<meta charset="UTF-8">
</head><body style="border:0; margin: 0;" o>
<table style="width: 100%;">
<tr>
<td style="width: 150mm; margin-top:5mm;"><img src="ttinvoice/sitc.png" style="height: 35mm;"/></td>
<td style="width: 60mm;text-align: right;">
<div style="text-align: left;width: 60mm; font-size: 12pt;font: sans;">
- <b>SAFFRAN IT Consulting S.Ã r.l.</b><br/>
+ <b>SAFFRAN IT Consulting S.Ã r.l.</b><br/>
4, rue Principale<br/>
- L-3770 Tétange<br/><br/>
+ L-3770 Tétange<br/><br/>
Tel: +352 691 504 574<br/>
info@saffran.lu / www.saffran.lu<br/>
</div>
+[% USE DBI %]
+[% USE dksdb = DBI(dsn, dbuser, dbpassword) %]
<!DOCTYPE html>
-<html lang="en">
+<html>
<head>
- <meta charset="ISO-8859-1">
- <title>Document</title>
+ <title>Invoice</title>
<style>
div {
font-size: 18pt;
</style>
</head>
<body>
-
+ [% qginv = dksdb.prepare("select * from vw_invoiceoutlist WHERE id= ?") %]
+ [% ginv = qginv.execute(id_invoice) %]
+ [% inv = ginv.get_all() %]
<table style="width: 100%;">
<tr>
<td style="width: 60%;"></td>
<td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
- </tr>
+ </tr>
<tr>
<td style="vertical-align: top; font-size: 25pt;">
- Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
+ [% inv.0.receipient %]<br/>[% inv.0.address %]<br>[% inv.0.zip %] [% inv.0.city %]<br/>[% inv.0.country %]<br/>
</td>
<td >
<table style="border: 1px solid black; width: 100%; font-size: 18pt;">
- <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
- <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
+ <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">[% inv.0.reference %]</td></tr>
+ <tr> <td class="invdatalbl">Datum</td><td class="invdataval">[% inv.0.invoicedate %]</td> </tr>
+ <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">[% inv.0.deadlinedate %]</td> </tr>
+ <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">[% inv.0.ident %]</td> </tr>
</table>
</td>
</tr>
</table>
+ [% qbookings = dksdb.prepare("SELECT id, id_invoice, quantity, unit, description, unitamount, netamount, taxamount, taxpercent, totalamount FROM vw_bookingoutlist where id_invoice= ?;") %]
+
<table id="tbl_products" >
- <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
+ <thead>
+ <tr>
+ <th>Produkt / Dienstleistung</th>
+ <th style="width: 25mm;" colspan="2">Anz.</th>
+ <th style="width: 25mm;">Einzel-Preis</th>
+ <th style="width: 25mm;">Netto-Summe</th>
+ </tr>
+ </thead>
<tbody>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
+ [% FOREACH book = qbookings.execute(id_invoice) %]
+ <tr>
+ <td>[% book.description %]</td>
+ <td class="right" style="width: 10mm;">[% book.quantity %]</td>
+ <td style="width: 15mm;">[% book.unit %]</td>
+ <td class="right">[% book.unitamount %] €</td>
+ <td class="right">[% book.netamount %] €</td>
+ </tr>
+ [% END %]
+
</tbody>
<tfoot>
<tr>
<th colspan="4" class="footer right">Total Netto</td>
- <td colspan="2" class="right" >0000,00 ?</td>
+ <td colspan="2" class="right" >[% inv.0.totalnet %] €</td>
</tr>
<tr>
<th colspan="4" class="footer right">MwSt. (17%)</td>
- <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
+ <td colspan="2" class="right" style="font-style: italic;">[% inv.0.totalvat %] €</td>
</tr>
<tr>
<th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
- <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
+ <td colspan="2" class="right" style="font-weight: bold;">[% inv.0.totalgross %] €</td>
</tr>
</tfoot>
</table>
--- /dev/null
+PDF_TOP="40mm"
+PDF_BOTTOM="20mm"
+PDF_LEFT="20mm"
+PDF_RIGHT="10mm"
+PDF_SIZE="A4"
+PDF_ORIENTATION="Portrait"
+PDF_ENGINE="Template::Toolkit"
+PDF_ENCODING="UTF-8"
+TEMPLATE_DSN=""
+TEMPLATE_DBUSER=""
+TEMPLATE_DBPASSWORD=""
\ No newline at end of file
<!DOCTYPE html>
-<html><head><script>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
function subst() {
var vars = {};
var query_strings_from_url = document.location.search.substring(1).split('&');
}
}
}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
+</script></head>
+<body style="border:0; margin: 0;" onload="subst()">
<table style="width: 100%;" >
- <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
+ <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
<b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
<tr>
<td></td>
<!DOCTYPE html>
<html><head>
-
+<meta charset="UTF-8">
</head><body style="border:0; margin: 0;" o>
<table style="width: 100%;">
<tr>
<td style="width: 150mm; margin-top:5mm;"><img src="ttinvoice/sitc.png" style="height: 35mm;"/></td>
<td style="width: 60mm;text-align: right;">
<div style="text-align: left;width: 60mm; font-size: 12pt;font: sans;">
- <b>SAFFRAN IT Consulting S.Ã r.l.</b><br/>
+ <b>SAFFRAN IT Consulting S.Ã r.l.</b><br/>
4, rue Principale<br/>
- L-3770 Tétange<br/><br/>
+ L-3770 Tétange<br/><br/>
Tel: +352 691 504 574<br/>
- info@saffran.lu / www.saffrans.lu<br/>
+ info@saffran.lu / www.saffran.lu<br/>
</div>
</td>
<tr><td style="text-align: left;"></td><td></td></tr>
--- /dev/null
+[% USE DBI %]
+[% USE dksdb = DBI(dsn, dbuser, dbpassword) %]
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Invoice</title>
+ <style>
+ div {
+ font-size: 18pt;
+}
+table {
+ font-size: 18pt;
+ border-spacing: unset;
+ border-collapse: unset;
+}
+td.invdatalbl {
+ font-weight: bold;
+ margin: 1mm;
+ padding: 2mm;
+ border-collapse:collapse;;
+ width: 30mm;
+ background-color: #c6c6c6;
+}
+td.invdataval {
+ font-weight: normal;
+ margin: 1mm;
+ padding: 2mm;
+}
+.right{
+ text-align: right;
+}
+table#tbl_products {
+ border-spacing: 0;
+ border-collapse: 0;
+ margin-top: 10mm;
+ width: 100%;
+}
+table#tbl_products td {
+ padding: 2mm;
+ border-bottom: 1px solid black;
+}
+
+table#tbl_products th {
+ margin: 1mm;
+ border: 1px solid #fff;
+ border-bottom: 0px;
+ padding: 2mm;
+ background-color: #c6c6c6;
+}
+
+th.footer {
+ margin: 1mm;
+ border: 1px solid #fff;
+ background-color: unset;
+ border-bottom: 0px;
+ padding: 2mm;
+ text-align: right;
+}
+ </style>
+</head>
+<body>
+ [% qginv = dksdb.prepare("select * from vw_invoiceoutlist WHERE id= ?") %]
+ [% ginv = qginv.execute(id_invoice) %]
+ [% inv = ginv.get_all() %]
+ <table style="width: 100%;">
+ <tr>
+ <td style="width: 60%;"></td>
+ <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
+ </tr>
+ <tr>
+ <td style="vertical-align: top; font-size: 25pt;">
+ [% inv.0.receipient %]<br/>[% inv.0.address %]<br>[% inv.0.zip %] [% inv.0.city %]<br/>[% inv.0.country %]<br/>
+ </td>
+ <td >
+ <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
+ <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">[% inv.0.reference %]</td></tr>
+ <tr> <td class="invdatalbl">Datum</td><td class="invdataval">[% inv.0.invoicedate %]</td> </tr>
+ <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">[% inv.0.deadlinedate %]</td> </tr>
+ <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">[% inv.0.ident %]</td> </tr>
+ </table>
+ </td>
+ </tr>
+
+ </table>
+ [% qbookings = dksdb.prepare("SELECT id, id_invoice, quantity, unit, description, unitamount, netamount, taxamount, taxpercent, totalamount FROM vw_bookingoutlist where id_invoice= ?;") %]
+
+ <table id="tbl_products" >
+ <thead>
+ <tr>
+ <th>Produkt / Dienstleistung</th>
+ <th style="width: 25mm;" colspan="2">Anz.</th>
+ <th style="width: 25mm;">Einzel-Preis</th>
+ <th style="width: 25mm;">Netto-Summe</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH book = qbookings.execute(id_invoice) %]
+ <tr>
+ <td>[% book.description %]</td>
+ <td class="right" style="width: 10mm;">[% book.quantity %]</td>
+ <td style="width: 15mm;">[% book.unit %]</td>
+ <td class="right">[% book.unitamount %] €</td>
+ <td class="right">[% book.netamount %] €</td>
+ </tr>
+ [% END %]
+
+ </tbody>
+ <tfoot>
+ <tr>
+ <th colspan="4" class="footer right">Total Netto</td>
+ <td colspan="2" class="right" >[% inv.0.totalnet %] €</td>
+ </tr>
+ <tr>
+ <th colspan="4" class="footer right">MwSt. (17%)</td>
+ <td colspan="2" class="right" style="font-style: italic;">[% inv.0.totalvat %] €</td>
+ </tr>
+ <tr>
+ <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
+ <td colspan="2" class="right" style="font-weight: bold;">[% inv.0.totalgross %] €</td>
+ </tr>
+ </tfoot>
+ </table>
+ <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
+ <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
+</body>
+</html>
\ No newline at end of file
+++ /dev/null
-div {
- font-size: 18pt;
-}
-table {
- font-size: 18pt;
- border-spacing: unset;
- border-collapse: unset;
-}
-td.invdatalbl {
- font-weight: bold;
- margin: 1mm;
- padding: 2mm;
- border-collapse:collapse;;
- width: 30mm;
- background-color: #c6c6c6;
-}
-td.invdataval {
- font-weight: normal;
- margin: 1mm;
- padding: 2mm;
-}
-.right{
- text-align: right;
-}
-table#tbl_products {
- border-spacing: 0;
- border-collapse: 0;
- margin-top: 10mm;
- width: 100%;
-}
-table#tbl_products td {
- padding: 2mm;
- border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
- margin: 1mm;
- border: 1px solid #fff;
- border-bottom: 0px;
- padding: 2mm;
- background-color: #c6c6c6;
-}
-
-th.footer {
- margin: 1mm;
- border: 1px solid #fff;
- background-color: unset;
- border-bottom: 0px;
- padding: 2mm;
- text-align: right;
-}
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
- var vars = {};
- var query_strings_from_url = document.location.search.substring(1).split('&');
- for (var query_string in query_strings_from_url) {
- if (query_strings_from_url.hasOwnProperty(query_string)) {
- var temp_var = query_strings_from_url[query_string].split('=', 2);
- vars[temp_var[0]] = decodeURI(temp_var[1]);
- }
- }
- var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
- for (var css_class in css_selector_classes) {
- if (css_selector_classes.hasOwnProperty(css_class)) {
- var element = document.getElementsByClassName(css_selector_classes[css_class]);
- for (var j = 0; j < element.length; ++j) {
- element[j].textContent = vars[css_selector_classes[css_class]];
- }
- }
- }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
- <tr><td colspan="2" style="text-align: center;"><b>DKS</b>, Soci�t� �responsabilit� limit�e, <b>RC</b> B168572 - <b>TVA:</b> LU 25375617 - <b>No. Aut:</b> 10024550 / 0<br/>
- <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
- <tr>
- <td></td>
- <td style="text-align:right">
- Seite <span class="page"></span>/<span class="topage"></span>
- </td>
- </tr>
-</table>
-</body></html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
- <tr>
- <td style="width: 100mm; margin-top:5mm;"><img src="dks_500.png" style="height: 35mm;"/></td>
- <td style="width: 60mm"> </td>
- <td style="width: 50mm;text-align: right;">
- <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
- <b>DKS s.Ã r.l.</b><br/>
- 4, rue Principale<br/>
- L-3770 Tétange<br/><br/>
- Tel: +352 691 504 574<br/>
- info@saffran.lu / www.saffrans.lu<br/>
- </div>
- </td>
- <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
- </tr>
-</table>
-</body></html>
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="UTF-8">
- <title>Document</title>
- <link rel="stylesheet" href="ttinvoice.css"/>
- </style>
-</head>
-<body>
-
- <table style="width: 100%;">
- <tr>
- <td style="width: 60%;"></td>
- <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
- </tr>
- <tr>
- <td style="vertical-align: top; font-size: 25pt;">
- Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
- </td>
- <td >
- <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
- <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
- <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
- </table>
- </td>
- </tr>
-
- </table>
- <table id="tbl_products" >
- <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
- <tbody>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- </tbody>
- <tfoot>
- <tr>
- <th colspan="4" class="footer right">Total Netto</td>
- <td colspan="2" class="right" >0000,00 €</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">MwSt. (17%)</td>
- <td colspan="2" class="right" style="font-style: italic;">0000,00 €</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
- <td colspan="2" class="right" style="font-weight: bold;">0000,00 €</td>
- </tr>
- </tfoot>
- </table>
- <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
- <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
- var vars = {};
- var query_strings_from_url = document.location.search.substring(1).split('&');
- for (var query_string in query_strings_from_url) {
- if (query_strings_from_url.hasOwnProperty(query_string)) {
- var temp_var = query_strings_from_url[query_string].split('=', 2);
- vars[temp_var[0]] = decodeURI(temp_var[1]);
- }
- }
- var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
- for (var css_class in css_selector_classes) {
- if (css_selector_classes.hasOwnProperty(css_class)) {
- var element = document.getElementsByClassName(css_selector_classes[css_class]);
- for (var j = 0; j < element.length; ++j) {
- element[j].textContent = vars[css_selector_classes[css_class]];
- }
- }
- }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
- <tr><td colspan="2" style="text-align: center;"><b>DKS</b>, Soci�t� �responsabilit� limit�e, <b>RC</b> B168572 - <b>TVA:</b> LU 25375617 - <b>No. Aut:</b> 10024550 / 0<br/>
- <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
- <tr>
- <td></td>
- <td style="text-align:right">
- Seite <span class="page"></span>/<span class="topage"></span>
- </td>
- </tr>
-</table>
-</body></html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
- <tr>
- <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
- <td style="width: 60mm"> </td>
- <td style="width: 50mm;text-align: right;">
- <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
- <b>DKS s.Ã r.l.</b><br/>
- 4, rue Principale<br/>
- L-3770 Tétange<br/><br/>
- Tel: +352 691 504 574<br/>
- info@saffran.lu / www.saffrans.lu<br/>
- </div>
- </td>
- <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
- </tr>
-</table>
-</body></html>
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="UTF-8">
- <title>Document</title>
- <link rel="stylesheet" href="ttinvoice.css"/>
- </style>
-</head>
-<body>
-
- <table style="width: 100%;">
- <tr>
- <td style="width: 60%;"></td>
- <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
- </tr>
- <tr>
- <td style="vertical-align: top; font-size: 25pt;">
- Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
- </td>
- <td >
- <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
- <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
- <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
- </table>
- </td>
- </tr>
-
- </table>
- <table id="tbl_products" >
- <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
- <tbody>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- </tbody>
- <tfoot>
- <tr>
- <th colspan="4" class="footer right">Total Netto</td>
- <td colspan="2" class="right" >0000,00 €</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">MwSt. (17%)</td>
- <td colspan="2" class="right" style="font-style: italic;">0000,00 €</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
- <td colspan="2" class="right" style="font-weight: bold;">0000,00 €</td>
- </tr>
- </tfoot>
- </table>
- <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
- <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
- var vars = {};
- var query_strings_from_url = document.location.search.substring(1).split('&');
- for (var query_string in query_strings_from_url) {
- if (query_strings_from_url.hasOwnProperty(query_string)) {
- var temp_var = query_strings_from_url[query_string].split('=', 2);
- vars[temp_var[0]] = decodeURI(temp_var[1]);
- }
- }
- var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
- for (var css_class in css_selector_classes) {
- if (css_selector_classes.hasOwnProperty(css_class)) {
- var element = document.getElementsByClassName(css_selector_classes[css_class]);
- for (var j = 0; j < element.length; ++j) {
- element[j].textContent = vars[css_selector_classes[css_class]];
- }
- }
- }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
- <tr><td colspan="2" style="text-align: center;"><b>DKS</b>, Soci�t� �responsabilit� limit�e, <b>RC</b> B168572 - <b>TVA:</b> LU 25375617 - <b>No. Aut:</b> 10024550 / 0<br/>
- <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
- <tr>
- <td></td>
- <td style="text-align:right">
- Seite <span class="page"></span>/<span class="topage"></span>
- </td>
- </tr>
-</table>
-</body></html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
- <tr>
- <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
- <td style="width: 60mm"> </td>
- <td style="width: 50mm;text-align: right;">
- <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
- <b>DKS s.Ã r.l.</b><br/>
- 4, rue Principale<br/>
- L-3770 Tétange<br/><br/>
- Tel: +352 691 504 574<br/>
- info@saffran.lu / www.saffrans.lu<br/>
- </div>
- </td>
- <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
- </tr>
-</table>
-</body></html>
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="ISO-8859-1">
- <title>Document</title>
- <style>
- div {
- font-size: 18pt;
-}
-table {
- font-size: 18pt;
- border-spacing: unset;
- border-collapse: unset;
-}
-td.invdatalbl {
- font-weight: bold;
- margin: 1mm;
- padding: 2mm;
- border-collapse:collapse;;
- width: 30mm;
- background-color: #c6c6c6;
-}
-td.invdataval {
- font-weight: normal;
- margin: 1mm;
- padding: 2mm;
-}
-.right{
- text-align: right;
-}
-table#tbl_products {
- border-spacing: 0;
- border-collapse: 0;
- margin-top: 10mm;
- width: 100%;
-}
-table#tbl_products td {
- padding: 2mm;
- border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
- margin: 1mm;
- border: 1px solid #fff;
- border-bottom: 0px;
- padding: 2mm;
- background-color: #c6c6c6;
-}
-
-th.footer {
- margin: 1mm;
- border: 1px solid #fff;
- background-color: unset;
- border-bottom: 0px;
- padding: 2mm;
- text-align: right;
-}
- </style>
-</head>
-<body>
-
- <table style="width: 100%;">
- <tr>
- <td style="width: 60%;"></td>
- <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
- </tr>
- <tr>
- <td style="vertical-align: top; font-size: 25pt;">
- Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
- </td>
- <td >
- <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
- <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
- <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
- </table>
- </td>
- </tr>
-
- </table>
- <table id="tbl_products" >
- <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
- <tbody>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
- </tbody>
- <tfoot>
- <tr>
- <th colspan="4" class="footer right">Total Netto</td>
- <td colspan="2" class="right" >0000,00 €</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">MwSt. (17%)</td>
- <td colspan="2" class="right" style="font-style: italic;">0000,00 €</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
- <td colspan="2" class="right" style="font-weight: bold;">0000,00 €</td>
- </tr>
- </tfoot>
- </table>
- <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
- <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
- var vars = {};
- var query_strings_from_url = document.location.search.substring(1).split('&');
- for (var query_string in query_strings_from_url) {
- if (query_strings_from_url.hasOwnProperty(query_string)) {
- var temp_var = query_strings_from_url[query_string].split('=', 2);
- vars[temp_var[0]] = decodeURI(temp_var[1]);
- }
- }
- var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
- for (var css_class in css_selector_classes) {
- if (css_selector_classes.hasOwnProperty(css_class)) {
- var element = document.getElementsByClassName(css_selector_classes[css_class]);
- for (var j = 0; j < element.length; ++j) {
- element[j].textContent = vars[css_selector_classes[css_class]];
- }
- }
- }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
- <tr><td colspan="2" style="text-align: center;"><b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 25375617 - <b>No. Aut:</b> 10024550 / 0<br/>
- <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
- <tr>
- <td></td>
- <td style="text-align:right">
- Seite <span class="page"></span>/<span class="topage"></span>
- </td>
- </tr>
-</table>
-</body></html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
- <tr>
- <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
- <td style="width: 60mm"> </td>
- <td style="width: 50mm;text-align: right;">
- <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
- <b>DKS s.Ã r.l.</b><br/>
- 4, rue Principale<br/>
- L-3770 Tétange<br/><br/>
- Tel: +352 691 504 574<br/>
- info@saffran.lu / www.saffrans.lu<br/>
- </div>
- </td>
- <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
- </tr>
-</table>
-</body></html>
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="ISO-8859-1">
- <title>Document</title>
- <style>
- div {
- font-size: 18pt;
-}
-table {
- font-size: 18pt;
- border-spacing: unset;
- border-collapse: unset;
-}
-td.invdatalbl {
- font-weight: bold;
- margin: 1mm;
- padding: 2mm;
- border-collapse:collapse;;
- width: 30mm;
- background-color: #c6c6c6;
-}
-td.invdataval {
- font-weight: normal;
- margin: 1mm;
- padding: 2mm;
-}
-.right{
- text-align: right;
-}
-table#tbl_products {
- border-spacing: 0;
- border-collapse: 0;
- margin-top: 10mm;
- width: 100%;
-}
-table#tbl_products td {
- padding: 2mm;
- border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
- margin: 1mm;
- border: 1px solid #fff;
- border-bottom: 0px;
- padding: 2mm;
- background-color: #c6c6c6;
-}
-
-th.footer {
- margin: 1mm;
- border: 1px solid #fff;
- background-color: unset;
- border-bottom: 0px;
- padding: 2mm;
- text-align: right;
-}
- </style>
-</head>
-<body>
-
- <table style="width: 100%;">
- <tr>
- <td style="width: 60%;"></td>
- <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
- </tr>
- <tr>
- <td style="vertical-align: top; font-size: 25pt;">
- Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
- </td>
- <td >
- <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
- <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
- <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
- </table>
- </td>
- </tr>
-
- </table>
- <table id="tbl_products" >
- <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
- <tbody>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- </tbody>
- <tfoot>
- <tr>
- <th colspan="4" class="footer right">Total Netto</td>
- <td colspan="2" class="right" >0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">MwSt. (17%)</td>
- <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
- <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
- </tr>
- </tfoot>
- </table>
- <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
- <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
- var vars = {};
- var query_strings_from_url = document.location.search.substring(1).split('&');
- for (var query_string in query_strings_from_url) {
- if (query_strings_from_url.hasOwnProperty(query_string)) {
- var temp_var = query_strings_from_url[query_string].split('=', 2);
- vars[temp_var[0]] = decodeURI(temp_var[1]);
- }
- }
- var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
- for (var css_class in css_selector_classes) {
- if (css_selector_classes.hasOwnProperty(css_class)) {
- var element = document.getElementsByClassName(css_selector_classes[css_class]);
- for (var j = 0; j < element.length; ++j) {
- element[j].textContent = vars[css_selector_classes[css_class]];
- }
- }
- }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
- <tr><td colspan="2" style="text-align: center;"><b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 25375617 - <b>No. Aut:</b> 10024550 / 0<br/>
- <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
- <tr>
- <td></td>
- <td style="text-align:right">
- Seite <span class="page"></span>/<span class="topage"></span>
- </td>
- </tr>
-</table>
-</body></html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
- <tr>
- <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
- <td style="width: 60mm"> </td>
- <td style="width: 50mm;text-align: right;">
- <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
- <b>SAFFRAN IT Consulting S.Ã r.l.</b><br/>
- 4, rue Principale<br/>
- L-3770 Tétange<br/><br/>
- Tel: +352 691 504 574<br/>
- info@saffran.lu / www.saffrans.lu<br/>
- </div>
- </td>
- <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
- </tr>
-</table>
-</body></html>
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="ISO-8859-1">
- <title>Document</title>
- <style>
- div {
- font-size: 18pt;
-}
-table {
- font-size: 18pt;
- border-spacing: unset;
- border-collapse: unset;
-}
-td.invdatalbl {
- font-weight: bold;
- margin: 1mm;
- padding: 2mm;
- border-collapse:collapse;;
- width: 30mm;
- background-color: #c6c6c6;
-}
-td.invdataval {
- font-weight: normal;
- margin: 1mm;
- padding: 2mm;
-}
-.right{
- text-align: right;
-}
-table#tbl_products {
- border-spacing: 0;
- border-collapse: 0;
- margin-top: 10mm;
- width: 100%;
-}
-table#tbl_products td {
- padding: 2mm;
- border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
- margin: 1mm;
- border: 1px solid #fff;
- border-bottom: 0px;
- padding: 2mm;
- background-color: #c6c6c6;
-}
-
-th.footer {
- margin: 1mm;
- border: 1px solid #fff;
- background-color: unset;
- border-bottom: 0px;
- padding: 2mm;
- text-align: right;
-}
- </style>
-</head>
-<body>
-
- <table style="width: 100%;">
- <tr>
- <td style="width: 60%;"></td>
- <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
- </tr>
- <tr>
- <td style="vertical-align: top; font-size: 25pt;">
- Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
- </td>
- <td >
- <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
- <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
- <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
- </table>
- </td>
- </tr>
-
- </table>
- <table id="tbl_products" >
- <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
- <tbody>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- </tbody>
- <tfoot>
- <tr>
- <th colspan="4" class="footer right">Total Netto</td>
- <td colspan="2" class="right" >0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">MwSt. (17%)</td>
- <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
- <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
- </tr>
- </tfoot>
- </table>
- <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
- <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
- <tr>
- <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
- <td style="width: 40mm"> </td>
- <td style="width: 70mm;text-align: right;">
- <div style="text-align: left;width: 7'mm; font-size: 12pt;font: sans;">
- <b>SAFFRAN IT Consulting S.Ã r.l.</b><br/>
- 4, rue Principale<br/>
- L-3770 Tétange<br/><br/>
- Tel: +352 691 504 574<br/>
- info@saffran.lu / www.saffrans.lu<br/>
- </div>
- </td>
- <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
- </tr>
-</table>
-</body></html>
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="ISO-8859-1">
- <title>Document</title>
- <style>
- div {
- font-size: 18pt;
-}
-table {
- font-size: 18pt;
- border-spacing: unset;
- border-collapse: unset;
-}
-td.invdatalbl {
- font-weight: bold;
- margin: 1mm;
- padding: 2mm;
- border-collapse:collapse;;
- width: 30mm;
- background-color: #c6c6c6;
-}
-td.invdataval {
- font-weight: normal;
- margin: 1mm;
- padding: 2mm;
-}
-.right{
- text-align: right;
-}
-table#tbl_products {
- border-spacing: 0;
- border-collapse: 0;
- margin-top: 10mm;
- width: 100%;
-}
-table#tbl_products td {
- padding: 2mm;
- border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
- margin: 1mm;
- border: 1px solid #fff;
- border-bottom: 0px;
- padding: 2mm;
- background-color: #c6c6c6;
-}
-
-th.footer {
- margin: 1mm;
- border: 1px solid #fff;
- background-color: unset;
- border-bottom: 0px;
- padding: 2mm;
- text-align: right;
-}
- </style>
-</head>
-<body>
-
- <table style="width: 100%;">
- <tr>
- <td style="width: 60%;"></td>
- <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
- </tr>
- <tr>
- <td style="vertical-align: top; font-size: 25pt;">
- Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
- </td>
- <td >
- <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
- <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
- <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
- </table>
- </td>
- </tr>
-
- </table>
- <table id="tbl_products" >
- <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
- <tbody>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- </tbody>
- <tfoot>
- <tr>
- <th colspan="4" class="footer right">Total Netto</td>
- <td colspan="2" class="right" >0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">MwSt. (17%)</td>
- <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
- <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
- </tr>
- </tfoot>
- </table>
- <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
- <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
- <tr>
- <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
- <td style="width: 40mm"> </td>
- <td style="width: 70mm;text-align: right;">
- <div style="text-align: left;width: 7'mm; font-size: 12pt;font: sans;">
- <b>SAFFRAN IT Consulting S.Ã r.l.</b><br/>
- 4, rue Principale<br/>
- L-3770 Tétange<br/><br/>
- Tel: +352 691 504 574<br/>
- info@saffran.lu / www.saffrans.lu<br/>
- </div>
- </td>
- <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
- </tr>
-</table>
-</body></html>
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="ISO-8859-1">
- <title>Document</title>
- <style>
- div {
- font-size: 18pt;
-}
-table {
- font-size: 18pt;
- border-spacing: unset;
- border-collapse: unset;
-}
-td.invdatalbl {
- font-weight: bold;
- margin: 1mm;
- padding: 2mm;
- border-collapse:collapse;;
- width: 30mm;
- background-color: #c6c6c6;
-}
-td.invdataval {
- font-weight: normal;
- margin: 1mm;
- padding: 2mm;
-}
-.right{
- text-align: right;
-}
-table#tbl_products {
- border-spacing: 0;
- border-collapse: 0;
- margin-top: 10mm;
- width: 100%;
-}
-table#tbl_products td {
- padding: 2mm;
- border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
- margin: 1mm;
- border: 1px solid #fff;
- border-bottom: 0px;
- padding: 2mm;
- background-color: #c6c6c6;
-}
-
-th.footer {
- margin: 1mm;
- border: 1px solid #fff;
- background-color: unset;
- border-bottom: 0px;
- padding: 2mm;
- text-align: right;
-}
- </style>
-</head>
-<body>
-
- <table style="width: 100%;">
- <tr>
- <td style="width: 60%;"></td>
- <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
- </tr>
- <tr>
- <td style="vertical-align: top; font-size: 25pt;">
- Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
- </td>
- <td >
- <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
- <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
- <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
- </table>
- </td>
- </tr>
-
- </table>
- <table id="tbl_products" >
- <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
- <tbody>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- </tbody>
- <tfoot>
- <tr>
- <th colspan="4" class="footer right">Total Netto</td>
- <td colspan="2" class="right" >0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">MwSt. (17%)</td>
- <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
- <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
- </tr>
- </tfoot>
- </table>
- <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
- <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
- var vars = {};
- var query_strings_from_url = document.location.search.substring(1).split('&');
- for (var query_string in query_strings_from_url) {
- if (query_strings_from_url.hasOwnProperty(query_string)) {
- var temp_var = query_strings_from_url[query_string].split('=', 2);
- vars[temp_var[0]] = decodeURI(temp_var[1]);
- }
- }
- var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
- for (var css_class in css_selector_classes) {
- if (css_selector_classes.hasOwnProperty(css_class)) {
- var element = document.getElementsByClassName(css_selector_classes[css_class]);
- for (var j = 0; j < element.length; ++j) {
- element[j].textContent = vars[css_selector_classes[css_class]];
- }
- }
- }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
- <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
- <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
- <tr>
- <td></td>
- <td style="text-align:right">
- Seite <span class="page"></span>/<span class="topage"></span>
- </td>
- </tr>
-</table>
-</body></html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
- <tr>
- <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
- <td style="width: 50mm"> </td>
- <td style="width: 60mm;text-align: right;">
- <div style="text-align: left;width: 60mm; font-size: 12pt;font: sans;">
- <b>SAFFRAN IT Consulting S.Ã r.l.</b><br/>
- 4, rue Principale<br/>
- L-3770 Tétange<br/><br/>
- Tel: +352 691 504 574<br/>
- info@saffran.lu / www.saffrans.lu<br/>
- </div>
- </td>
- <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
- </tr>
-</table>
-</body></html>
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="ISO-8859-1">
- <title>Document</title>
- <style>
- div {
- font-size: 18pt;
-}
-table {
- font-size: 18pt;
- border-spacing: unset;
- border-collapse: unset;
-}
-td.invdatalbl {
- font-weight: bold;
- margin: 1mm;
- padding: 2mm;
- border-collapse:collapse;;
- width: 30mm;
- background-color: #c6c6c6;
-}
-td.invdataval {
- font-weight: normal;
- margin: 1mm;
- padding: 2mm;
-}
-.right{
- text-align: right;
-}
-table#tbl_products {
- border-spacing: 0;
- border-collapse: 0;
- margin-top: 10mm;
- width: 100%;
-}
-table#tbl_products td {
- padding: 2mm;
- border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
- margin: 1mm;
- border: 1px solid #fff;
- border-bottom: 0px;
- padding: 2mm;
- background-color: #c6c6c6;
-}
-
-th.footer {
- margin: 1mm;
- border: 1px solid #fff;
- background-color: unset;
- border-bottom: 0px;
- padding: 2mm;
- text-align: right;
-}
- </style>
-</head>
-<body>
-
- <table style="width: 100%;">
- <tr>
- <td style="width: 60%;"></td>
- <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
- </tr>
- <tr>
- <td style="vertical-align: top; font-size: 25pt;">
- Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
- </td>
- <td >
- <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
- <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
- <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
- </table>
- </td>
- </tr>
-
- </table>
- <table id="tbl_products" >
- <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
- <tbody>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- </tbody>
- <tfoot>
- <tr>
- <th colspan="4" class="footer right">Total Netto</td>
- <td colspan="2" class="right" >0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">MwSt. (17%)</td>
- <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
- <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
- </tr>
- </tfoot>
- </table>
- <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
- <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
- var vars = {};
- var query_strings_from_url = document.location.search.substring(1).split('&');
- for (var query_string in query_strings_from_url) {
- if (query_strings_from_url.hasOwnProperty(query_string)) {
- var temp_var = query_strings_from_url[query_string].split('=', 2);
- vars[temp_var[0]] = decodeURI(temp_var[1]);
- }
- }
- var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
- for (var css_class in css_selector_classes) {
- if (css_selector_classes.hasOwnProperty(css_class)) {
- var element = document.getElementsByClassName(css_selector_classes[css_class]);
- for (var j = 0; j < element.length; ++j) {
- element[j].textContent = vars[css_selector_classes[css_class]];
- }
- }
- }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
- <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
- <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
- <tr>
- <td></td>
- <td style="text-align:right">
- Seite <span class="page"></span>/<span class="topage"></span>
- </td>
- </tr>
-</table>
-</body></html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="ISO-8859-1">
- <title>Document</title>
- <style>
- div {
- font-size: 18pt;
-}
-table {
- font-size: 18pt;
- border-spacing: unset;
- border-collapse: unset;
-}
-td.invdatalbl {
- font-weight: bold;
- margin: 1mm;
- padding: 2mm;
- border-collapse:collapse;;
- width: 30mm;
- background-color: #c6c6c6;
-}
-td.invdataval {
- font-weight: normal;
- margin: 1mm;
- padding: 2mm;
-}
-.right{
- text-align: right;
-}
-table#tbl_products {
- border-spacing: 0;
- border-collapse: 0;
- margin-top: 10mm;
- width: 100%;
-}
-table#tbl_products td {
- padding: 2mm;
- border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
- margin: 1mm;
- border: 1px solid #fff;
- border-bottom: 0px;
- padding: 2mm;
- background-color: #c6c6c6;
-}
-
-th.footer {
- margin: 1mm;
- border: 1px solid #fff;
- background-color: unset;
- border-bottom: 0px;
- padding: 2mm;
- text-align: right;
-}
- </style>
-</head>
-<body>
-
- <table style="width: 100%;">
- <tr>
- <td style="width: 60%;"></td>
- <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
- </tr>
- <tr>
- <td style="vertical-align: top; font-size: 25pt;">
- Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
- </td>
- <td >
- <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
- <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
- <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
- <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
- </table>
- </td>
- </tr>
-
- </table>
- <table id="tbl_products" >
- <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
- <tbody>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
- </tbody>
- <tfoot>
- <tr>
- <th colspan="4" class="footer right">Total Netto</td>
- <td colspan="2" class="right" >0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">MwSt. (17%)</td>
- <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
- </tr>
- <tr>
- <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
- <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
- </tr>
- </tfoot>
- </table>
- <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
- <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
--- /dev/null
+PDF_TOP="40mm"
+PDF_BOTTOM="20mm"
+PDF_LEFT="20mm"
+PDF_RIGHT="10mm"
+PDF_SIZE="A4"
+PDF_ORIENTATION="Portrait"
+PDF_ENGINE="Template::Toolkit"
+PDF_ENCODING="UTF-8"
+TEMPLATE_DSN=""
+TEMPLATE_DBUSER=""
+TEMPLATE_DBPASSWORD=""
+REPORT_NAME="DKS - deutsch"
\ No newline at end of file
<!DOCTYPE html>
-<html><head><script>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
function subst() {
var vars = {};
var query_strings_from_url = document.location.search.substring(1).split('&');
}
}
}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
+</script></head>
+<body style="border:0; margin: 0;" onload="subst()">
<table style="width: 100%;" >
- <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
+ <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
<b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
<tr>
<td></td>
--- /dev/null
+<!DOCTYPE html>
+<html><head>
+<meta charset="UTF-8">
+</head><body style="border:0; margin: 0;" o>
+<table style="width: 100%;">
+ <tr>
+ <td style="width: 150mm; margin-top:5mm;"><img src="ttinvoice/sitc.png" style="height: 35mm;"/></td>
+ <td style="width: 60mm;text-align: right;">
+ <div style="text-align: left;width: 60mm; font-size: 12pt;font: sans;">
+ <b>SAFFRAN IT Consulting S.Ã r.l.</b><br/>
+ 4, rue Principale<br/>
+ L-3770 Tétange<br/><br/>
+ Tel: +352 691 504 574<br/>
+ info@saffran.lu / www.saffran.lu<br/>
+ </div>
+ </td>
+ <tr><td style="text-align: left;"></td><td></td></tr>
+ </tr>
+</table>
+</body></html>
--- /dev/null
+[% USE DBI %]
+[% USE dksdb = DBI(dsn, dbuser, dbpassword) %]
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Invoice</title>
+ <style>
+ div {
+ font-size: 18pt;
+}
+table {
+ font-size: 18pt;
+ border-spacing: unset;
+ border-collapse: unset;
+}
+td.invdatalbl {
+ font-weight: bold;
+ margin: 1mm;
+ padding: 2mm;
+ border-collapse:collapse;;
+ width: 30mm;
+ background-color: #c6c6c6;
+}
+td.invdataval {
+ font-weight: normal;
+ margin: 1mm;
+ padding: 2mm;
+}
+.right{
+ text-align: right;
+}
+table#tbl_products {
+ border-spacing: 0;
+ border-collapse: 0;
+ margin-top: 10mm;
+ width: 100%;
+}
+table#tbl_products td {
+ padding: 2mm;
+ border-bottom: 1px solid black;
+}
+
+table#tbl_products th {
+ margin: 1mm;
+ border: 1px solid #fff;
+ border-bottom: 0px;
+ padding: 2mm;
+ background-color: #c6c6c6;
+}
+
+th.footer {
+ margin: 1mm;
+ border: 1px solid #fff;
+ background-color: unset;
+ border-bottom: 0px;
+ padding: 2mm;
+ text-align: right;
+}
+ </style>
+</head>
+<body>
+ [% qginv = dksdb.prepare("select * from vw_invoiceoutlist WHERE id= ?") %]
+ [% ginv = qginv.execute(id_invoice) %]
+ [% inv = ginv.get_all() %]
+ <table style="width: 100%;">
+ <tr>
+ <td style="width: 60%;"></td>
+ <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
+ </tr>
+ <tr>
+ <td style="vertical-align: top; font-size: 25pt;">
+ [% inv.0.receipient %]<br/>[% inv.0.address %]<br>[% inv.0.zip %] [% inv.0.city %]<br/>[% inv.0.country %]<br/>
+ </td>
+ <td >
+ <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
+ <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">[% inv.0.reference %]</td></tr>
+ <tr> <td class="invdatalbl">Datum</td><td class="invdataval">[% inv.0.invoicedate %]</td> </tr>
+ <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">[% inv.0.deadlinedate %]</td> </tr>
+ <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">[% inv.0.ident %]</td> </tr>
+ </table>
+ </td>
+ </tr>
+
+ </table>
+ [% qbookings = dksdb.prepare("SELECT id, id_invoice, quantity, unit, description, unitamount, netamount, taxamount, taxpercent, totalamount FROM vw_bookingoutlist where id_invoice= ?;") %]
+
+ <table id="tbl_products" >
+ <thead>
+ <tr>
+ <th>Produkt / Dienstleistung</th>
+ <th style="width: 25mm;" colspan="2">Anz.</th>
+ <th style="width: 25mm;">Einzel-Preis</th>
+ <th style="width: 25mm;">Netto-Summe</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH book = qbookings.execute(id_invoice) %]
+ <tr>
+ <td>[% book.description %]</td>
+ <td class="right" style="width: 10mm;">[% book.quantity %]</td>
+ <td style="width: 15mm;">[% book.unit %]</td>
+ <td class="right">[% book.unitamount %] €</td>
+ <td class="right">[% book.netamount %] €</td>
+ </tr>
+ [% END %]
+
+ </tbody>
+ <tfoot>
+ <tr>
+ <th colspan="4" class="footer right">Total Netto</td>
+ <td colspan="2" class="right" >[% inv.0.totalnet %] €</td>
+ </tr>
+ <tr>
+ <th colspan="4" class="footer right">MwSt. (17%)</td>
+ <td colspan="2" class="right" style="font-style: italic;">[% inv.0.totalvat %] €</td>
+ </tr>
+ <tr>
+ <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
+ <td colspan="2" class="right" style="font-weight: bold;">[% inv.0.totalgross %] €</td>
+ </tr>
+ </tfoot>
+ </table>
+ <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
+ <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
+</body>
+</html>
\ No newline at end of file
}
}
closedir(API);
- mount "/htdocs" => Plack::App::File->new(root => $RealBin."/htdocs",)->to_app;
+ mount "/htdocs" => Plack::App::File->new(root => $RealBin."/htdocs")->to_app;
# if (-e $cfgpath.'/'.$name.'.passwd'){
# enable "Auth::Basic", authenticator => \&authen_cb;
# }
+++ /dev/null
-/*----Fonts----*/
-
-@import url('https://fonts.googleapis.com/css?family=Roboto');
-
-
-/*----Bootstrap----*/
-
-:root {
- --blue: #007bff;
- --indigo: #6610f2;
- --purple: #6f42c1;
- --pink: #e83e8c;
- --red: #dc3545;
- --orange: #fd7e14;
- --yellow: #ffc107;
- --green: #28a745;
- --teal: #20c997;
- --cyan: #17a2b8;
- --white: #fff;
- --gray: #6c757d;
- --gray-dark: #343a40;
- --primary: #3a59b1;
- --secondary: #6c757d;
- --success: #22b24c;
- --info: yellow;
- --warning: #ffc107;
- --danger: #fc3434;
- --light: white;
- --dark: #6a8ed3;
- --breakpoint-xs: 0;
- --breakpoint-sm: 576px;
- --breakpoint-md: 768px;
- --breakpoint-lg: 992px;
- --breakpoint-xl: 1200px;
- --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
-}
-
-@media print {
- *,
- *::before,
- *::after {
- text-shadow: none !important;
- box-shadow: none !important;
- }
- a:not(.btn) {
- text-decoration: underline;
- }
- abbr[title]::after {
- content: " (" attr(title) ")";
- }
- pre {
- white-space: pre-wrap !important;
- }
- pre,
- blockquote {
- border: 1px solid #adb5bd;
- page-break-inside: avoid;
- }
- thead {
- display: table-header-group;
- }
- tr,
- img {
- page-break-inside: avoid;
- }
- p,
- h2,
- h3 {
- orphans: 3;
- widows: 3;
- }
- h2,
- h3 {
- page-break-after: avoid;
- }
- @page {
- size: a3;
- }
- body {
- min-width: 992px !important;
- }
- .container {
- min-width: 992px !important;
- }
- .navbar {
- display: none;
- }
- .badge {
- border: 1px solid #000;
- }
- .table {
- border-collapse: collapse !important;
- }
- .table td,
- .table th {
- background-color: #fff !important;
- }
- .table-bordered th,
- .table-bordered td {
- border: 1px solid #dee2e6 !important;
- }
- .table-dark {
- color: inherit;
- }
- .table-dark th,
- .table-dark td,
- .table-dark thead th,
- .table-dark tbody + tbody {
- border-color: #dee2e6;
- }
- .table .thead-dark th {
- color: inherit;
- border-color: #dee2e6;
- }
-}
-
-*,
-*::before,
-*::after {
- box-sizing: border-box;
-}
-
-html {
- font-family: sans-serif;
- line-height: 1.15;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
- -ms-overflow-style: scrollbar;
- -webkit-tap-highlight-color: transparent;
-}
-
-@-ms-viewport {
- width: device-width;
-}
-
-article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
- display: block;
-}
-
-body {
- margin: 0;
- font-family: Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- font-size: 0.81rem;
- font-weight: 400;
- line-height: 1.5;
- color: #212529;
- text-align: left;
- background-color: #fff;
-}
-
-[tabindex="-1"]:focus {
- outline: 0 !important;
-}
-
-hr {
- box-sizing: content-box;
- height: 0;
- overflow: visible;
-}
-
-h1, h2, h3, h4, h5, h6 {
- margin-top: 0;
- margin-bottom: 0.5rem;
-}
-
-p {
- margin-top: 0;
- margin-bottom: 1rem;
-}
-
-abbr[title],
-abbr[data-original-title] {
- text-decoration: underline;
- -webkit-text-decoration: underline dotted;
- text-decoration: underline dotted;
- cursor: help;
- border-bottom: 0;
-}
-
-address {
- margin-bottom: 1rem;
- font-style: normal;
- line-height: inherit;
-}
-
-ol,
-ul,
-dl {
- margin-top: 0;
- margin-bottom: 1rem;
-}
-
-ol ol,
-ul ul,
-ol ul,
-ul ol {
- margin-bottom: 0;
-}
-
-dt {
- font-weight: 700;
-}
-
-dd {
- margin-bottom: .5rem;
- margin-left: 0;
-}
-
-blockquote {
- margin: 0 0 1rem;
-}
-
-dfn {
- font-style: italic;
-}
-
-b,
-strong {
- font-weight: bolder;
-}
-
-small {
- font-size: 80%;
-}
-
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-
-sub {
- bottom: -.25em;
-}
-
-sup {
- top: -.5em;
-}
-
-a {
- color: #3a59b1;
- text-decoration: none;
- background-color: transparent;
- -webkit-text-decoration-skip: objects;
-}
-
-a:hover {
- color: #273c77;
- text-decoration: underline;
-}
-
-a:not([href]):not([tabindex]) {
- color: inherit;
- text-decoration: none;
-}
-
-a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
- color: inherit;
- text-decoration: none;
-}
-
-a:not([href]):not([tabindex]):focus {
- outline: 0;
-}
-
-pre,
-code,
-kbd,
-samp {
- font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
- font-size: 1em;
-}
-
-pre {
- margin-top: 0;
- margin-bottom: 1rem;
- overflow: auto;
- -ms-overflow-style: scrollbar;
-}
-
-figure {
- margin: 0 0 1rem;
-}
-
-img {
- vertical-align: middle;
- border-style: none;
-}
-
-svg {
- overflow: hidden;
- vertical-align: middle;
-}
-
-table {
- border-collapse: collapse;
-}
-
-caption {
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- color: #6c757d;
- text-align: left;
- caption-side: bottom;
-}
-
-th {
- text-align: inherit;
-}
-
-label {
- display: inline-block;
- margin-bottom: 0.5rem;
-}
-
-button {
- border-radius: 0;
-}
-
-button:focus {
- outline: 1px dotted;
- outline: 5px auto -webkit-focus-ring-color;
-}
-
-input,
-button,
-select,
-optgroup,
-textarea {
- margin: 0;
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
-}
-
-button,
-input {
- overflow: visible;
-}
-
-button,
-select {
- text-transform: none;
-}
-
-button,
-html [type="button"],
-[type="reset"],
-[type="submit"] {
- -webkit-appearance: button;
-}
-
-button::-moz-focus-inner,
-[type="button"]::-moz-focus-inner,
-[type="reset"]::-moz-focus-inner,
-[type="submit"]::-moz-focus-inner {
- padding: 0;
- border-style: none;
-}
-
-input[type="radio"],
-input[type="checkbox"] {
- box-sizing: border-box;
- padding: 0;
-}
-
-input[type="date"],
-input[type="time"],
-input[type="datetime-local"],
-input[type="month"] {
- -webkit-appearance: listbox;
-}
-
-textarea {
- overflow: auto;
- resize: vertical;
-}
-
-fieldset {
- min-width: 0;
- padding: 0;
- margin: 0;
- border: 0;
-}
-
-legend {
- display: block;
- width: 100%;
- max-width: 100%;
- padding: 0;
- margin-bottom: .5rem;
- font-size: 1.5rem;
- line-height: inherit;
- color: inherit;
- white-space: normal;
-}
-
-progress {
- vertical-align: baseline;
-}
-
-[type="number"]::-webkit-inner-spin-button,
-[type="number"]::-webkit-outer-spin-button {
- height: auto;
-}
-
-[type="search"] {
- outline-offset: -2px;
- -webkit-appearance: none;
-}
-
-[type="search"]::-webkit-search-cancel-button,
-[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-
-::-webkit-file-upload-button {
- font: inherit;
- -webkit-appearance: button;
-}
-
-output {
- display: inline-block;
-}
-
-summary {
- display: list-item;
- cursor: pointer;
-}
-
-template {
- display: none;
-}
-
-[hidden] {
- display: none !important;
-}
-
-h1, h2, h3, h4, h5, h6,
-.h1, .h2, .h3, .h4, .h5, .h6 {
- margin-bottom: 0.5rem;
- font-family: inherit;
- font-weight: 200;
- line-height: 1.1;
- color: inherit;
-}
-
-h1, .h1 {
- font-size: 1.5rem;
-}
-
-h2, .h2 {
- font-size: 1.25rem;
-}
-
-h3, .h3 {
- font-size: 1.4175rem;
-}
-
-h4, .h4 {
- font-size: 1.215rem;
-}
-
-h5, .h5 {
- font-size: 1.0125rem;
-}
-
-h6, .h6 {
- font-size: 0.81rem;
-}
-
-.lead {
- font-size: 1.0125rem;
- font-weight: 300;
-}
-
-.display-1 {
- font-size: 6rem;
- font-weight: 300;
- line-height: 1.1;
-}
-
-.display-2 {
- font-size: 5.5rem;
- font-weight: 300;
- line-height: 1.1;
-}
-
-.display-3 {
- font-size: 4.5rem;
- font-weight: 300;
- line-height: 1.1;
-}
-
-.display-4 {
- font-size: 3.5rem;
- font-weight: 300;
- line-height: 1.1;
-}
-
-hr {
- margin-top: 1rem;
- margin-bottom: 1rem;
- border: 0;
- border-top: 1px solid rgba(0, 0, 0, 0.1);
-}
-
-small,
-.small {
- font-size: 80%;
- font-weight: 400;
-}
-
-mark,
-.mark {
- padding: 0.2em;
- background-color: #fcf8e3;
-}
-
-.list-unstyled {
- padding-left: 0;
- list-style: none;
-}
-
-.list-inline {
- padding-left: 0;
- list-style: none;
-}
-
-.list-inline-item {
- display: inline-block;
-}
-
-.list-inline-item:not(:last-child) {
- margin-right: 0.5rem;
-}
-
-.initialism {
- font-size: 90%;
- text-transform: uppercase;
-}
-
-.blockquote {
- margin-bottom: 1rem;
- font-size: 1.0125rem;
-}
-
-.blockquote-footer {
- display: block;
- font-size: 80%;
- color: #6c757d;
-}
-
-.blockquote-footer::before {
- content: "\2014 \00A0";
-}
-
-.img-fluid {
- max-width: 100%;
- height: auto;
-}
-
-.img-thumbnail {
- padding: 0.25rem;
- background-color: #fff;
- border: 1px solid #dee2e6;
- max-width: 100%;
- height: auto;
-}
-
-.figure {
- display: inline-block;
-}
-
-.figure-img {
- margin-bottom: 0.5rem;
- line-height: 1;
-}
-
-.figure-caption {
- font-size: 90%;
- color: #6c757d;
-}
-
-code {
- font-size: 87.5%;
- color: #e83e8c;
- word-break: break-word;
-}
-
-a > code {
- color: inherit;
-}
-
-kbd {
- padding: 0.2rem 0.4rem;
- font-size: 87.5%;
- color: #fff;
- background-color: #212529;
-}
-
-kbd kbd {
- padding: 0;
- font-size: 100%;
- font-weight: 700;
-}
-
-pre {
- display: block;
- font-size: 87.5%;
- color: #212529;
-}
-
-pre code {
- font-size: inherit;
- color: inherit;
- word-break: normal;
-}
-
-.pre-scrollable {
- max-height: 340px;
- overflow-y: scroll;
-}
-
-.container {
- width: 100%;
- padding-right: 15px;
- padding-left: 15px;
- margin-right: auto;
- margin-left: auto;
-}
-
-@media (min-width: 576px) {
- .container {
- max-width: 540px;
- }
-}
-
-@media (min-width: 768px) {
- .container {
- max-width: 720px;
- }
-}
-
-@media (min-width: 992px) {
- .container {
- max-width: 960px;
- }
-}
-
-@media (min-width: 1200px) {
- .container {
- max-width: 1140px;
- }
-}
-
-.container-fluid {
- width: 100%;
- padding-right: 15px;
- padding-left: 15px;
- margin-right: auto;
- margin-left: auto;
-}
-
-.row {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- margin-right: -15px;
- margin-left: -15px;
-}
-
-.no-gutters {
- margin-right: 0;
- margin-left: 0;
-}
-
-.no-gutters > .col,
-.no-gutters > [class*="col-"] {
- padding-right: 0;
- padding-left: 0;
-}
-
-.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
-.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
-.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
-.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
-.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
-.col-xl-auto {
- position: relative;
- width: 100%;
- min-height: 1px;
- padding-right: 15px;
- padding-left: 15px;
-}
-
-.col {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
-}
-
-.col-auto {
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- width: auto;
- max-width: none;
-}
-
-.col-1 {
- -ms-flex: 0 0 8.333333%;
- flex: 0 0 8.333333%;
- max-width: 8.333333%;
-}
-
-.col-2 {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
-}
-
-.col-3 {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
-}
-
-.col-4 {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
-}
-
-.col-5 {
- -ms-flex: 0 0 41.666667%;
- flex: 0 0 41.666667%;
- max-width: 41.666667%;
-}
-
-.col-6 {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
-}
-
-.col-7 {
- -ms-flex: 0 0 58.333333%;
- flex: 0 0 58.333333%;
- max-width: 58.333333%;
-}
-
-.col-8 {
- -ms-flex: 0 0 66.666667%;
- flex: 0 0 66.666667%;
- max-width: 66.666667%;
-}
-
-.col-9 {
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
-}
-
-.col-10 {
- -ms-flex: 0 0 83.333333%;
- flex: 0 0 83.333333%;
- max-width: 83.333333%;
-}
-
-.col-11 {
- -ms-flex: 0 0 91.666667%;
- flex: 0 0 91.666667%;
- max-width: 91.666667%;
-}
-
-.col-12 {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
-}
-
-.order-first {
- -ms-flex-order: -1;
- order: -1;
-}
-
-.order-last {
- -ms-flex-order: 13;
- order: 13;
-}
-
-.order-0 {
- -ms-flex-order: 0;
- order: 0;
-}
-
-.order-1 {
- -ms-flex-order: 1;
- order: 1;
-}
-
-.order-2 {
- -ms-flex-order: 2;
- order: 2;
-}
-
-.order-3 {
- -ms-flex-order: 3;
- order: 3;
-}
-
-.order-4 {
- -ms-flex-order: 4;
- order: 4;
-}
-
-.order-5 {
- -ms-flex-order: 5;
- order: 5;
-}
-
-.order-6 {
- -ms-flex-order: 6;
- order: 6;
-}
-
-.order-7 {
- -ms-flex-order: 7;
- order: 7;
-}
-
-.order-8 {
- -ms-flex-order: 8;
- order: 8;
-}
-
-.order-9 {
- -ms-flex-order: 9;
- order: 9;
-}
-
-.order-10 {
- -ms-flex-order: 10;
- order: 10;
-}
-
-.order-11 {
- -ms-flex-order: 11;
- order: 11;
-}
-
-.order-12 {
- -ms-flex-order: 12;
- order: 12;
-}
-
-.offset-1 {
- margin-left: 8.333333%;
-}
-
-.offset-2 {
- margin-left: 16.666667%;
-}
-
-.offset-3 {
- margin-left: 25%;
-}
-
-.offset-4 {
- margin-left: 33.333333%;
-}
-
-.offset-5 {
- margin-left: 41.666667%;
-}
-
-.offset-6 {
- margin-left: 50%;
-}
-
-.offset-7 {
- margin-left: 58.333333%;
-}
-
-.offset-8 {
- margin-left: 66.666667%;
-}
-
-.offset-9 {
- margin-left: 75%;
-}
-
-.offset-10 {
- margin-left: 83.333333%;
-}
-
-.offset-11 {
- margin-left: 91.666667%;
-}
-
-@media (min-width: 576px) {
- .col-sm {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
- }
- .col-sm-auto {
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- width: auto;
- max-width: none;
- }
- .col-sm-1 {
- -ms-flex: 0 0 8.333333%;
- flex: 0 0 8.333333%;
- max-width: 8.333333%;
- }
- .col-sm-2 {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
- }
- .col-sm-3 {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-sm-4 {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
- }
- .col-sm-5 {
- -ms-flex: 0 0 41.666667%;
- flex: 0 0 41.666667%;
- max-width: 41.666667%;
- }
- .col-sm-6 {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-sm-7 {
- -ms-flex: 0 0 58.333333%;
- flex: 0 0 58.333333%;
- max-width: 58.333333%;
- }
- .col-sm-8 {
- -ms-flex: 0 0 66.666667%;
- flex: 0 0 66.666667%;
- max-width: 66.666667%;
- }
- .col-sm-9 {
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-sm-10 {
- -ms-flex: 0 0 83.333333%;
- flex: 0 0 83.333333%;
- max-width: 83.333333%;
- }
- .col-sm-11 {
- -ms-flex: 0 0 91.666667%;
- flex: 0 0 91.666667%;
- max-width: 91.666667%;
- }
- .col-sm-12 {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-sm-first {
- -ms-flex-order: -1;
- order: -1;
- }
- .order-sm-last {
- -ms-flex-order: 13;
- order: 13;
- }
- .order-sm-0 {
- -ms-flex-order: 0;
- order: 0;
- }
- .order-sm-1 {
- -ms-flex-order: 1;
- order: 1;
- }
- .order-sm-2 {
- -ms-flex-order: 2;
- order: 2;
- }
- .order-sm-3 {
- -ms-flex-order: 3;
- order: 3;
- }
- .order-sm-4 {
- -ms-flex-order: 4;
- order: 4;
- }
- .order-sm-5 {
- -ms-flex-order: 5;
- order: 5;
- }
- .order-sm-6 {
- -ms-flex-order: 6;
- order: 6;
- }
- .order-sm-7 {
- -ms-flex-order: 7;
- order: 7;
- }
- .order-sm-8 {
- -ms-flex-order: 8;
- order: 8;
- }
- .order-sm-9 {
- -ms-flex-order: 9;
- order: 9;
- }
- .order-sm-10 {
- -ms-flex-order: 10;
- order: 10;
- }
- .order-sm-11 {
- -ms-flex-order: 11;
- order: 11;
- }
- .order-sm-12 {
- -ms-flex-order: 12;
- order: 12;
- }
- .offset-sm-0 {
- margin-left: 0;
- }
- .offset-sm-1 {
- margin-left: 8.333333%;
- }
- .offset-sm-2 {
- margin-left: 16.666667%;
- }
- .offset-sm-3 {
- margin-left: 25%;
- }
- .offset-sm-4 {
- margin-left: 33.333333%;
- }
- .offset-sm-5 {
- margin-left: 41.666667%;
- }
- .offset-sm-6 {
- margin-left: 50%;
- }
- .offset-sm-7 {
- margin-left: 58.333333%;
- }
- .offset-sm-8 {
- margin-left: 66.666667%;
- }
- .offset-sm-9 {
- margin-left: 75%;
- }
- .offset-sm-10 {
- margin-left: 83.333333%;
- }
- .offset-sm-11 {
- margin-left: 91.666667%;
- }
-}
-
-@media (min-width: 768px) {
- .col-md {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
- }
- .col-md-auto {
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- width: auto;
- max-width: none;
- }
- .col-md-1 {
- -ms-flex: 0 0 8.333333%;
- flex: 0 0 8.333333%;
- max-width: 8.333333%;
- }
- .col-md-2 {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
- }
- .col-md-3 {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-md-4 {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
- }
- .col-md-5 {
- -ms-flex: 0 0 41.666667%;
- flex: 0 0 41.666667%;
- max-width: 41.666667%;
- }
- .col-md-6 {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-md-7 {
- -ms-flex: 0 0 58.333333%;
- flex: 0 0 58.333333%;
- max-width: 58.333333%;
- }
- .col-md-8 {
- -ms-flex: 0 0 66.666667%;
- flex: 0 0 66.666667%;
- max-width: 66.666667%;
- }
- .col-md-9 {
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-md-10 {
- -ms-flex: 0 0 83.333333%;
- flex: 0 0 83.333333%;
- max-width: 83.333333%;
- }
- .col-md-11 {
- -ms-flex: 0 0 91.666667%;
- flex: 0 0 91.666667%;
- max-width: 91.666667%;
- }
- .col-md-12 {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-md-first {
- -ms-flex-order: -1;
- order: -1;
- }
- .order-md-last {
- -ms-flex-order: 13;
- order: 13;
- }
- .order-md-0 {
- -ms-flex-order: 0;
- order: 0;
- }
- .order-md-1 {
- -ms-flex-order: 1;
- order: 1;
- }
- .order-md-2 {
- -ms-flex-order: 2;
- order: 2;
- }
- .order-md-3 {
- -ms-flex-order: 3;
- order: 3;
- }
- .order-md-4 {
- -ms-flex-order: 4;
- order: 4;
- }
- .order-md-5 {
- -ms-flex-order: 5;
- order: 5;
- }
- .order-md-6 {
- -ms-flex-order: 6;
- order: 6;
- }
- .order-md-7 {
- -ms-flex-order: 7;
- order: 7;
- }
- .order-md-8 {
- -ms-flex-order: 8;
- order: 8;
- }
- .order-md-9 {
- -ms-flex-order: 9;
- order: 9;
- }
- .order-md-10 {
- -ms-flex-order: 10;
- order: 10;
- }
- .order-md-11 {
- -ms-flex-order: 11;
- order: 11;
- }
- .order-md-12 {
- -ms-flex-order: 12;
- order: 12;
- }
- .offset-md-0 {
- margin-left: 0;
- }
- .offset-md-1 {
- margin-left: 8.333333%;
- }
- .offset-md-2 {
- margin-left: 16.666667%;
- }
- .offset-md-3 {
- margin-left: 25%;
- }
- .offset-md-4 {
- margin-left: 33.333333%;
- }
- .offset-md-5 {
- margin-left: 41.666667%;
- }
- .offset-md-6 {
- margin-left: 50%;
- }
- .offset-md-7 {
- margin-left: 58.333333%;
- }
- .offset-md-8 {
- margin-left: 66.666667%;
- }
- .offset-md-9 {
- margin-left: 75%;
- }
- .offset-md-10 {
- margin-left: 83.333333%;
- }
- .offset-md-11 {
- margin-left: 91.666667%;
- }
-}
-
-@media (min-width: 992px) {
- .col-lg {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
- }
- .col-lg-auto {
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- width: auto;
- max-width: none;
- }
- .col-lg-1 {
- -ms-flex: 0 0 8.333333%;
- flex: 0 0 8.333333%;
- max-width: 8.333333%;
- }
- .col-lg-2 {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
- }
- .col-lg-3 {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-lg-4 {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
- }
- .col-lg-5 {
- -ms-flex: 0 0 41.666667%;
- flex: 0 0 41.666667%;
- max-width: 41.666667%;
- }
- .col-lg-6 {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-lg-7 {
- -ms-flex: 0 0 58.333333%;
- flex: 0 0 58.333333%;
- max-width: 58.333333%;
- }
- .col-lg-8 {
- -ms-flex: 0 0 66.666667%;
- flex: 0 0 66.666667%;
- max-width: 66.666667%;
- }
- .col-lg-9 {
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-lg-10 {
- -ms-flex: 0 0 83.333333%;
- flex: 0 0 83.333333%;
- max-width: 83.333333%;
- }
- .col-lg-11 {
- -ms-flex: 0 0 91.666667%;
- flex: 0 0 91.666667%;
- max-width: 91.666667%;
- }
- .col-lg-12 {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-lg-first {
- -ms-flex-order: -1;
- order: -1;
- }
- .order-lg-last {
- -ms-flex-order: 13;
- order: 13;
- }
- .order-lg-0 {
- -ms-flex-order: 0;
- order: 0;
- }
- .order-lg-1 {
- -ms-flex-order: 1;
- order: 1;
- }
- .order-lg-2 {
- -ms-flex-order: 2;
- order: 2;
- }
- .order-lg-3 {
- -ms-flex-order: 3;
- order: 3;
- }
- .order-lg-4 {
- -ms-flex-order: 4;
- order: 4;
- }
- .order-lg-5 {
- -ms-flex-order: 5;
- order: 5;
- }
- .order-lg-6 {
- -ms-flex-order: 6;
- order: 6;
- }
- .order-lg-7 {
- -ms-flex-order: 7;
- order: 7;
- }
- .order-lg-8 {
- -ms-flex-order: 8;
- order: 8;
- }
- .order-lg-9 {
- -ms-flex-order: 9;
- order: 9;
- }
- .order-lg-10 {
- -ms-flex-order: 10;
- order: 10;
- }
- .order-lg-11 {
- -ms-flex-order: 11;
- order: 11;
- }
- .order-lg-12 {
- -ms-flex-order: 12;
- order: 12;
- }
- .offset-lg-0 {
- margin-left: 0;
- }
- .offset-lg-1 {
- margin-left: 8.333333%;
- }
- .offset-lg-2 {
- margin-left: 16.666667%;
- }
- .offset-lg-3 {
- margin-left: 25%;
- }
- .offset-lg-4 {
- margin-left: 33.333333%;
- }
- .offset-lg-5 {
- margin-left: 41.666667%;
- }
- .offset-lg-6 {
- margin-left: 50%;
- }
- .offset-lg-7 {
- margin-left: 58.333333%;
- }
- .offset-lg-8 {
- margin-left: 66.666667%;
- }
- .offset-lg-9 {
- margin-left: 75%;
- }
- .offset-lg-10 {
- margin-left: 83.333333%;
- }
- .offset-lg-11 {
- margin-left: 91.666667%;
- }
-}
-
-@media (min-width: 1200px) {
- .col-xl {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
- }
- .col-xl-auto {
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- width: auto;
- max-width: none;
- }
- .col-xl-1 {
- -ms-flex: 0 0 8.333333%;
- flex: 0 0 8.333333%;
- max-width: 8.333333%;
- }
- .col-xl-2 {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
- }
- .col-xl-3 {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-xl-4 {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
- }
- .col-xl-5 {
- -ms-flex: 0 0 41.666667%;
- flex: 0 0 41.666667%;
- max-width: 41.666667%;
- }
- .col-xl-6 {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-xl-7 {
- -ms-flex: 0 0 58.333333%;
- flex: 0 0 58.333333%;
- max-width: 58.333333%;
- }
- .col-xl-8 {
- -ms-flex: 0 0 66.666667%;
- flex: 0 0 66.666667%;
- max-width: 66.666667%;
- }
- .col-xl-9 {
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-xl-10 {
- -ms-flex: 0 0 83.333333%;
- flex: 0 0 83.333333%;
- max-width: 83.333333%;
- }
- .col-xl-11 {
- -ms-flex: 0 0 91.666667%;
- flex: 0 0 91.666667%;
- max-width: 91.666667%;
- }
- .col-xl-12 {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-xl-first {
- -ms-flex-order: -1;
- order: -1;
- }
- .order-xl-last {
- -ms-flex-order: 13;
- order: 13;
- }
- .order-xl-0 {
- -ms-flex-order: 0;
- order: 0;
- }
- .order-xl-1 {
- -ms-flex-order: 1;
- order: 1;
- }
- .order-xl-2 {
- -ms-flex-order: 2;
- order: 2;
- }
- .order-xl-3 {
- -ms-flex-order: 3;
- order: 3;
- }
- .order-xl-4 {
- -ms-flex-order: 4;
- order: 4;
- }
- .order-xl-5 {
- -ms-flex-order: 5;
- order: 5;
- }
- .order-xl-6 {
- -ms-flex-order: 6;
- order: 6;
- }
- .order-xl-7 {
- -ms-flex-order: 7;
- order: 7;
- }
- .order-xl-8 {
- -ms-flex-order: 8;
- order: 8;
- }
- .order-xl-9 {
- -ms-flex-order: 9;
- order: 9;
- }
- .order-xl-10 {
- -ms-flex-order: 10;
- order: 10;
- }
- .order-xl-11 {
- -ms-flex-order: 11;
- order: 11;
- }
- .order-xl-12 {
- -ms-flex-order: 12;
- order: 12;
- }
- .offset-xl-0 {
- margin-left: 0;
- }
- .offset-xl-1 {
- margin-left: 8.333333%;
- }
- .offset-xl-2 {
- margin-left: 16.666667%;
- }
- .offset-xl-3 {
- margin-left: 25%;
- }
- .offset-xl-4 {
- margin-left: 33.333333%;
- }
- .offset-xl-5 {
- margin-left: 41.666667%;
- }
- .offset-xl-6 {
- margin-left: 50%;
- }
- .offset-xl-7 {
- margin-left: 58.333333%;
- }
- .offset-xl-8 {
- margin-left: 66.666667%;
- }
- .offset-xl-9 {
- margin-left: 75%;
- }
- .offset-xl-10 {
- margin-left: 83.333333%;
- }
- .offset-xl-11 {
- margin-left: 91.666667%;
- }
-}
-
-.table {
- width: 100%;
- margin-bottom: 1rem;
- background-color: transparent;
-}
-
-.table th,
-.table td {
- padding: 0.5rem;
- vertical-align: top;
- border-top: 1px solid #dee2e6;
-}
-
-.table thead th {
- vertical-align: bottom;
- border-bottom: 2px solid #dee2e6;
-}
-
-.table tbody + tbody {
- border-top: 2px solid #dee2e6;
-}
-
-.table .table {
- background-color: #fff;
-}
-
-.table-sm th,
-.table-sm td {
- padding: 0.3rem;
-}
-
-.table-bordered {
- border: 1px solid #dee2e6;
-}
-
-.table-bordered th,
-.table-bordered td {
- border: 1px solid #dee2e6;
-}
-
-.table-bordered thead th,
-.table-bordered thead td {
- border-bottom-width: 2px;
-}
-
-.table-borderless th,
-.table-borderless td,
-.table-borderless thead th,
-.table-borderless tbody + tbody {
- border: 0;
-}
-
-.table-striped tbody tr:nth-of-type(odd) {
- background-color: rgba(0, 0, 0, 0.05);
-}
-
-.table-hover tbody tr:hover {
- background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-primary,
-.table-primary > th,
-.table-primary > td {
- background-color: #c8d1e9;
-}
-
-.table-hover .table-primary:hover {
- background-color: #b6c2e2;
-}
-
-.table-hover .table-primary:hover > td,
-.table-hover .table-primary:hover > th {
- background-color: #b6c2e2;
-}
-
-.table-secondary,
-.table-secondary > th,
-.table-secondary > td {
- background-color: #d6d8db;
-}
-
-.table-hover .table-secondary:hover {
- background-color: #c8cbcf;
-}
-
-.table-hover .table-secondary:hover > td,
-.table-hover .table-secondary:hover > th {
- background-color: #c8cbcf;
-}
-
-.table-success,
-.table-success > th,
-.table-success > td {
- background-color: #c1e9cd;
-}
-
-.table-hover .table-success:hover {
- background-color: #aee2be;
-}
-
-.table-hover .table-success:hover > td,
-.table-hover .table-success:hover > th {
- background-color: #aee2be;
-}
-
-.table-info,
-.table-info > th,
-.table-info > td {
- background-color: #ffffb8;
-}
-
-.table-hover .table-info:hover {
- background-color: #ffff9f;
-}
-
-.table-hover .table-info:hover > td,
-.table-hover .table-info:hover > th {
- background-color: #ffff9f;
-}
-
-.table-warning,
-.table-warning > th,
-.table-warning > td {
- background-color: #ffeeba;
-}
-
-.table-hover .table-warning:hover {
- background-color: #ffe8a1;
-}
-
-.table-hover .table-warning:hover > td,
-.table-hover .table-warning:hover > th {
- background-color: #ffe8a1;
-}
-
-.table-danger,
-.table-danger > th,
-.table-danger > td {
- background-color: #fec6c6;
-}
-
-.table-hover .table-danger:hover {
- background-color: #feadad;
-}
-
-.table-hover .table-danger:hover > td,
-.table-hover .table-danger:hover > th {
- background-color: #feadad;
-}
-
-.table-light,
-.table-light > th,
-.table-light > td {
- background-color: white;
-}
-
-.table-hover .table-light:hover {
- background-color: #f2f2f2;
-}
-
-.table-hover .table-light:hover > td,
-.table-hover .table-light:hover > th {
- background-color: #f2f2f2;
-}
-
-.table-dark,
-.table-dark > th,
-.table-dark > td {
- background-color: #d5dff3;
-}
-
-.table-hover .table-dark:hover {
- background-color: #c1d0ed;
-}
-
-.table-hover .table-dark:hover > td,
-.table-hover .table-dark:hover > th {
- background-color: #c1d0ed;
-}
-
-.table-active,
-.table-active > th,
-.table-active > td {
- background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-hover .table-active:hover {
- background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-hover .table-active:hover > td,
-.table-hover .table-active:hover > th {
- background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table .thead-dark th {
- color: #fff;
- background-color: #212529;
- border-color: #32383e;
-}
-
-.table .thead-light th {
- color: #495057;
- background-color: #e9ecef;
- border-color: #dee2e6;
-}
-
-.table-dark {
- color: #fff;
- background-color: #212529;
-}
-
-.table-dark th,
-.table-dark td,
-.table-dark thead th {
- border-color: #32383e;
-}
-
-.table-dark.table-bordered {
- border: 0;
-}
-
-.table-dark.table-striped tbody tr:nth-of-type(odd) {
- background-color: rgba(255, 255, 255, 0.05);
-}
-
-.table-dark.table-hover tbody tr:hover {
- background-color: rgba(255, 255, 255, 0.075);
-}
-
-@media (max-width: 575.98px) {
- .table-responsive-sm {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- -ms-overflow-style: -ms-autohiding-scrollbar;
- }
- .table-responsive-sm > .table-bordered {
- border: 0;
- }
-}
-
-@media (max-width: 767.98px) {
- .table-responsive-md {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- -ms-overflow-style: -ms-autohiding-scrollbar;
- }
- .table-responsive-md > .table-bordered {
- border: 0;
- }
-}
-
-@media (max-width: 991.98px) {
- .table-responsive-lg {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- -ms-overflow-style: -ms-autohiding-scrollbar;
- }
- .table-responsive-lg > .table-bordered {
- border: 0;
- }
-}
-
-@media (max-width: 1199.98px) {
- .table-responsive-xl {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- -ms-overflow-style: -ms-autohiding-scrollbar;
- }
- .table-responsive-xl > .table-bordered {
- border: 0;
- }
-}
-
-.table-responsive {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- -ms-overflow-style: -ms-autohiding-scrollbar;
-}
-
-.table-responsive > .table-bordered {
- border: 0;
-}
-
-.form-control {
- display: block;
- width: 100%;
- height: calc(1.965rem + 2px);
- padding: 0.375rem 0.38rem;
- font-size: 0.81rem;
- line-height: 1.5;
- color: #495057;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid #ced4da;
- border-radius: 0;
- transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- .form-control {
- transition: none;
- }
-}
-
-.form-control::-ms-expand {
- background-color: transparent;
- border: 0;
-}
-
-.form-control:focus {
- color: #495057;
- background-color: #fff;
- border-color: #90a3db;
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.form-control::-webkit-input-placeholder {
- color: #6c757d;
- opacity: 1;
-}
-
-.form-control::-moz-placeholder {
- color: #6c757d;
- opacity: 1;
-}
-
-.form-control:-ms-input-placeholder {
- color: #6c757d;
- opacity: 1;
-}
-
-.form-control::-ms-input-placeholder {
- color: #6c757d;
- opacity: 1;
-}
-
-.form-control::placeholder {
- color: #6c757d;
- opacity: 1;
-}
-
-.form-control:disabled, .form-control[readonly] {
- background-color: #e9ecef;
- opacity: 1;
-}
-
-select.form-control:focus::-ms-value {
- color: #495057;
- background-color: #fff;
-}
-
-.form-control-file,
-.form-control-range {
- display: block;
- width: 100%;
-}
-
-.col-form-label {
- padding-top: calc(0.375rem + 1px);
- padding-bottom: calc(0.375rem + 1px);
- margin-bottom: 0;
- font-size: inherit;
- line-height: 1.5;
-}
-
-.col-form-label-lg {
- padding-top: calc(0.5rem + 1px);
- padding-bottom: calc(0.5rem + 1px);
- font-size: 1.0125rem;
- line-height: 1.5;
-}
-
-.col-form-label-sm {
- padding-top: calc(0.25rem + 1px);
- padding-bottom: calc(0.25rem + 1px);
- font-size: 0.70875rem;
- line-height: 1.5;
-}
-
-.form-control-plaintext {
- display: block;
- width: 100%;
- padding-top: 0.375rem;
- padding-bottom: 0.375rem;
- margin-bottom: 0;
- line-height: 1.5;
- color: #212529;
- background-color: transparent;
- border: solid transparent;
- border-width: 1px 0;
-}
-
-.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {
- padding-right: 0;
- padding-left: 0;
-}
-
-.form-control-sm {
- height: calc(1.563125rem + 2px);
- padding: 0.25rem 0.5rem;
- font-size: 0.70875rem;
- line-height: 1.5;
-}
-
-.form-control-lg {
- height: calc(2.51875rem + 2px);
- padding: 0.5rem 1rem;
- font-size: 1.0125rem;
- line-height: 1.5;
-}
-
-select.form-control[size], select.form-control[multiple] {
- height: auto;
-}
-
-textarea.form-control {
- height: auto;
-}
-
-.form-group {
- margin-bottom: 1rem;
-}
-
-.form-text {
- display: block;
- margin-top: 0.25rem;
-}
-
-.form-row {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- margin-right: -5px;
- margin-left: -5px;
-}
-
-.form-row > .col,
-.form-row > [class*="col-"] {
- padding-right: 5px;
- padding-left: 5px;
-}
-
-.form-check {
- position: relative;
- display: block;
- padding-left: 1.25rem;
-}
-
-.form-check-input {
- position: absolute;
- margin-top: 0.3rem;
- margin-left: -1.25rem;
-}
-
-.form-check-input:disabled ~ .form-check-label {
- color: #6c757d;
-}
-
-.form-check-label {
- margin-bottom: 0;
-}
-
-.form-check-inline {
- display: -ms-inline-flexbox;
- display: inline-flex;
- -ms-flex-align: center;
- align-items: center;
- padding-left: 0;
- margin-right: 0.75rem;
-}
-
-.form-check-inline .form-check-input {
- position: static;
- margin-top: 0;
- margin-right: 0.3125rem;
- margin-left: 0;
-}
-
-.valid-feedback {
- display: none;
- width: 100%;
- margin-top: 0.25rem;
- font-size: 80%;
- color: #22b24c;
-}
-
-.valid-tooltip {
- position: absolute;
- top: 100%;
- z-index: 5;
- display: none;
- max-width: 100%;
- padding: 0.25rem 0.5rem;
- margin-top: .1rem;
- font-size: 0.70875rem;
- line-height: 1.5;
- color: #fff;
- background-color: rgba(34, 178, 76, 0.9);
-}
-
-.was-validated .form-control:valid, .form-control.is-valid, .was-validated
-.custom-select:valid,
-.custom-select.is-valid {
- border-color: #22b24c;
-}
-
-.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated
-.custom-select:valid:focus,
-.custom-select.is-valid:focus {
- border-color: #22b24c;
- box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.25);
-}
-
-.was-validated .form-control:valid ~ .valid-feedback,
-.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,
-.form-control.is-valid ~ .valid-tooltip, .was-validated
-.custom-select:valid ~ .valid-feedback,
-.was-validated
-.custom-select:valid ~ .valid-tooltip,
-.custom-select.is-valid ~ .valid-feedback,
-.custom-select.is-valid ~ .valid-tooltip {
- display: block;
-}
-
-.was-validated .form-control-file:valid ~ .valid-feedback,
-.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,
-.form-control-file.is-valid ~ .valid-tooltip {
- display: block;
-}
-
-.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
- color: #22b24c;
-}
-
-.was-validated .form-check-input:valid ~ .valid-feedback,
-.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,
-.form-check-input.is-valid ~ .valid-tooltip {
- display: block;
-}
-
-.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {
- color: #22b24c;
-}
-
-.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {
- background-color: #70e492;
-}
-
-.was-validated .custom-control-input:valid ~ .valid-feedback,
-.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,
-.custom-control-input.is-valid ~ .valid-tooltip {
- display: block;
-}
-
-.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
- background-color: #30d761;
-}
-
-.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(34, 178, 76, 0.25);
-}
-
-.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {
- border-color: #22b24c;
-}
-
-.was-validated .custom-file-input:valid ~ .custom-file-label::after, .custom-file-input.is-valid ~ .custom-file-label::after {
- border-color: inherit;
-}
-
-.was-validated .custom-file-input:valid ~ .valid-feedback,
-.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,
-.custom-file-input.is-valid ~ .valid-tooltip {
- display: block;
-}
-
-.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
- box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.25);
-}
-
-.invalid-feedback {
- display: none;
- width: 100%;
- margin-top: 0.25rem;
- font-size: 80%;
- color: #fc3434;
-}
-
-.invalid-tooltip {
- position: absolute;
- top: 100%;
- z-index: 5;
- display: none;
- max-width: 100%;
- padding: 0.25rem 0.5rem;
- margin-top: .1rem;
- font-size: 0.70875rem;
- line-height: 1.5;
- color: #fff;
- background-color: rgba(252, 52, 52, 0.9);
-}
-
-.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated
-.custom-select:invalid,
-.custom-select.is-invalid {
- border-color: #fc3434;
-}
-
-.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated
-.custom-select:invalid:focus,
-.custom-select.is-invalid:focus {
- border-color: #fc3434;
- box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.25);
-}
-
-.was-validated .form-control:invalid ~ .invalid-feedback,
-.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,
-.form-control.is-invalid ~ .invalid-tooltip, .was-validated
-.custom-select:invalid ~ .invalid-feedback,
-.was-validated
-.custom-select:invalid ~ .invalid-tooltip,
-.custom-select.is-invalid ~ .invalid-feedback,
-.custom-select.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-
-.was-validated .form-control-file:invalid ~ .invalid-feedback,
-.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,
-.form-control-file.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-
-.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
- color: #fc3434;
-}
-
-.was-validated .form-check-input:invalid ~ .invalid-feedback,
-.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,
-.form-check-input.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-
-.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {
- color: #fc3434;
-}
-
-.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {
- background-color: #feb2b2;
-}
-
-.was-validated .custom-control-input:invalid ~ .invalid-feedback,
-.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,
-.custom-control-input.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-
-.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
- background-color: #fd6666;
-}
-
-.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(252, 52, 52, 0.25);
-}
-
-.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {
- border-color: #fc3434;
-}
-
-.was-validated .custom-file-input:invalid ~ .custom-file-label::after, .custom-file-input.is-invalid ~ .custom-file-label::after {
- border-color: inherit;
-}
-
-.was-validated .custom-file-input:invalid ~ .invalid-feedback,
-.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,
-.custom-file-input.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-
-.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
- box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.25);
-}
-
-.form-inline {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.form-inline .form-check {
- width: 100%;
-}
-
-@media (min-width: 576px) {
- .form-inline label {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: center;
- justify-content: center;
- margin-bottom: 0;
- }
- .form-inline .form-group {
- display: -ms-flexbox;
- display: flex;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- -ms-flex-align: center;
- align-items: center;
- margin-bottom: 0;
- }
- .form-inline .form-control {
- display: inline-block;
- width: auto;
- vertical-align: middle;
- }
- .form-inline .form-control-plaintext {
- display: inline-block;
- }
- .form-inline .input-group,
- .form-inline .custom-select {
- width: auto;
- }
- .form-inline .form-check {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: center;
- justify-content: center;
- width: auto;
- padding-left: 0;
- }
- .form-inline .form-check-input {
- position: relative;
- margin-top: 0;
- margin-right: 0.25rem;
- margin-left: 0;
- }
- .form-inline .custom-control {
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: center;
- justify-content: center;
- }
- .form-inline .custom-control-label {
- margin-bottom: 0;
- }
-}
-
-.btn {
- display: inline-block;
- font-weight: 400;
- text-align: center;
- white-space: nowrap;
- vertical-align: middle;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- border: 1px solid transparent;
- padding: 0.375rem 1rem;
- font-size: 0.81rem;
- line-height: 1.5;
- border-radius: 0;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- .btn {
- transition: none;
- }
-}
-
-.btn:hover, .btn:focus {
- text-decoration: none;
-}
-
-.btn:focus, .btn.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.btn.disabled, .btn:disabled {
- opacity: 0.65;
-}
-
-.btn:not(:disabled):not(.disabled) {
- cursor: pointer;
-}
-
-a.btn.disabled,
-fieldset:disabled a.btn {
- pointer-events: none;
-}
-
-.btn-primary {
- color: #fff;
- background-color: #3a59b1;
- border-color: #3a59b1;
-}
-
-.btn-primary:hover {
- color: #fff;
- background-color: #314b94;
- border-color: #2d468b;
-}
-
-.btn-primary:focus, .btn-primary.focus {
- box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.5);
-}
-
-.btn-primary.disabled, .btn-primary:disabled {
- color: #fff;
- background-color: #3a59b1;
- border-color: #3a59b1;
-}
-
-.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,
-.show > .btn-primary.dropdown-toggle {
- color: #fff;
- background-color: #2d468b;
- border-color: #2a4181;
-}
-
-.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-primary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.5);
-}
-
-.btn-secondary {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-
-.btn-secondary:hover {
- color: #fff;
- background-color: #5a6268;
- border-color: #545b62;
-}
-
-.btn-secondary:focus, .btn-secondary.focus {
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-
-.btn-secondary.disabled, .btn-secondary:disabled {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-
-.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,
-.show > .btn-secondary.dropdown-toggle {
- color: #fff;
- background-color: #545b62;
- border-color: #4e555b;
-}
-
-.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-secondary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-
-.btn-success {
- color: #fff;
- background-color: #22b24c;
- border-color: #22b24c;
-}
-
-.btn-success:hover {
- color: #fff;
- background-color: #1c923e;
- border-color: #1a873a;
-}
-
-.btn-success:focus, .btn-success.focus {
- box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.5);
-}
-
-.btn-success.disabled, .btn-success:disabled {
- color: #fff;
- background-color: #22b24c;
- border-color: #22b24c;
-}
-
-.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,
-.show > .btn-success.dropdown-toggle {
- color: #fff;
- background-color: #1a873a;
- border-color: #187c35;
-}
-
-.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,
-.show > .btn-success.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.5);
-}
-
-.btn-info {
- color: #212529;
- background-color: yellow;
- border-color: yellow;
-}
-
-.btn-info:hover {
- color: #212529;
- background-color: #d9d900;
- border-color: #cccc00;
-}
-
-.btn-info:focus, .btn-info.focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 255, 0, 0.5);
-}
-
-.btn-info.disabled, .btn-info:disabled {
- color: #212529;
- background-color: yellow;
- border-color: yellow;
-}
-
-.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,
-.show > .btn-info.dropdown-toggle {
- color: #212529;
- background-color: #cccc00;
- border-color: #bfbf00;
-}
-
-.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,
-.show > .btn-info.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 255, 0, 0.5);
-}
-
-.btn-warning {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-
-.btn-warning:hover {
- color: #212529;
- background-color: #e0a800;
- border-color: #d39e00;
-}
-
-.btn-warning:focus, .btn-warning.focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-
-.btn-warning.disabled, .btn-warning:disabled {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-
-.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,
-.show > .btn-warning.dropdown-toggle {
- color: #212529;
- background-color: #d39e00;
- border-color: #c69500;
-}
-
-.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,
-.show > .btn-warning.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-
-.btn-danger {
- color: #fff;
- background-color: #fc3434;
- border-color: #fc3434;
-}
-
-.btn-danger:hover {
- color: #fff;
- background-color: #fb0e0e;
- border-color: #f90404;
-}
-
-.btn-danger:focus, .btn-danger.focus {
- box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.5);
-}
-
-.btn-danger.disabled, .btn-danger:disabled {
- color: #fff;
- background-color: #fc3434;
- border-color: #fc3434;
-}
-
-.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,
-.show > .btn-danger.dropdown-toggle {
- color: #fff;
- background-color: #f90404;
- border-color: #ed0303;
-}
-
-.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,
-.show > .btn-danger.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.5);
-}
-
-.btn-light {
- color: #212529;
- background-color: white;
- border-color: white;
-}
-
-.btn-light:hover {
- color: #212529;
- background-color: #ececec;
- border-color: #e6e6e6;
-}
-
-.btn-light:focus, .btn-light.focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5);
-}
-
-.btn-light.disabled, .btn-light:disabled {
- color: #212529;
- background-color: white;
- border-color: white;
-}
-
-.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,
-.show > .btn-light.dropdown-toggle {
- color: #212529;
- background-color: #e6e6e6;
- border-color: #dfdfdf;
-}
-
-.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,
-.show > .btn-light.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5);
-}
-
-.btn-dark {
- color: #fff;
- background-color: #6a8ed3;
- border-color: #6a8ed3;
-}
-
-.btn-dark:hover {
- color: #fff;
- background-color: #4c78ca;
- border-color: #4370c7;
-}
-
-.btn-dark:focus, .btn-dark.focus {
- box-shadow: 0 0 0 0.2rem rgba(106, 142, 211, 0.5);
-}
-
-.btn-dark.disabled, .btn-dark:disabled {
- color: #fff;
- background-color: #6a8ed3;
- border-color: #6a8ed3;
-}
-
-.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,
-.show > .btn-dark.dropdown-toggle {
- color: #fff;
- background-color: #4370c7;
- border-color: #3a69c4;
-}
-
-.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,
-.show > .btn-dark.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(106, 142, 211, 0.5);
-}
-
-.btn-outline-primary {
- color: #3a59b1;
- background-color: transparent;
- background-image: none;
- border-color: #3a59b1;
-}
-
-.btn-outline-primary:hover {
- color: #fff;
- background-color: #3a59b1;
- border-color: #3a59b1;
-}
-
-.btn-outline-primary:focus, .btn-outline-primary.focus {
- box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.5);
-}
-
-.btn-outline-primary.disabled, .btn-outline-primary:disabled {
- color: #3a59b1;
- background-color: transparent;
-}
-
-.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,
-.show > .btn-outline-primary.dropdown-toggle {
- color: #fff;
- background-color: #3a59b1;
- border-color: #3a59b1;
-}
-
-.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-primary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.5);
-}
-
-.btn-outline-secondary {
- color: #6c757d;
- background-color: transparent;
- background-image: none;
- border-color: #6c757d;
-}
-
-.btn-outline-secondary:hover {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-
-.btn-outline-secondary:focus, .btn-outline-secondary.focus {
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-
-.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
- color: #6c757d;
- background-color: transparent;
-}
-
-.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,
-.show > .btn-outline-secondary.dropdown-toggle {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-
-.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-secondary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-
-.btn-outline-success {
- color: #22b24c;
- background-color: transparent;
- background-image: none;
- border-color: #22b24c;
-}
-
-.btn-outline-success:hover {
- color: #fff;
- background-color: #22b24c;
- border-color: #22b24c;
-}
-
-.btn-outline-success:focus, .btn-outline-success.focus {
- box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.5);
-}
-
-.btn-outline-success.disabled, .btn-outline-success:disabled {
- color: #22b24c;
- background-color: transparent;
-}
-
-.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,
-.show > .btn-outline-success.dropdown-toggle {
- color: #fff;
- background-color: #22b24c;
- border-color: #22b24c;
-}
-
-.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-success.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.5);
-}
-
-.btn-outline-info {
- color: yellow;
- background-color: transparent;
- background-image: none;
- border-color: yellow;
-}
-
-.btn-outline-info:hover {
- color: #212529;
- background-color: yellow;
- border-color: yellow;
-}
-
-.btn-outline-info:focus, .btn-outline-info.focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 255, 0, 0.5);
-}
-
-.btn-outline-info.disabled, .btn-outline-info:disabled {
- color: yellow;
- background-color: transparent;
-}
-
-.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,
-.show > .btn-outline-info.dropdown-toggle {
- color: #212529;
- background-color: yellow;
- border-color: yellow;
-}
-
-.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-info.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 255, 0, 0.5);
-}
-
-.btn-outline-warning {
- color: #ffc107;
- background-color: transparent;
- background-image: none;
- border-color: #ffc107;
-}
-
-.btn-outline-warning:hover {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-
-.btn-outline-warning:focus, .btn-outline-warning.focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-
-.btn-outline-warning.disabled, .btn-outline-warning:disabled {
- color: #ffc107;
- background-color: transparent;
-}
-
-.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,
-.show > .btn-outline-warning.dropdown-toggle {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-
-.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-warning.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-
-.btn-outline-danger {
- color: #fc3434;
- background-color: transparent;
- background-image: none;
- border-color: #fc3434;
-}
-
-.btn-outline-danger:hover {
- color: #fff;
- background-color: #fc3434;
- border-color: #fc3434;
-}
-
-.btn-outline-danger:focus, .btn-outline-danger.focus {
- box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.5);
-}
-
-.btn-outline-danger.disabled, .btn-outline-danger:disabled {
- color: #fc3434;
- background-color: transparent;
-}
-
-.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,
-.show > .btn-outline-danger.dropdown-toggle {
- color: #fff;
- background-color: #fc3434;
- border-color: #fc3434;
-}
-
-.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-danger.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.5);
-}
-
-.btn-outline-light {
- color: white;
- background-color: transparent;
- background-image: none;
- border-color: white;
-}
-
-.btn-outline-light:hover {
- color: #212529;
- background-color: white;
- border-color: white;
-}
-
-.btn-outline-light:focus, .btn-outline-light.focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5);
-}
-
-.btn-outline-light.disabled, .btn-outline-light:disabled {
- color: white;
- background-color: transparent;
-}
-
-.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,
-.show > .btn-outline-light.dropdown-toggle {
- color: #212529;
- background-color: white;
- border-color: white;
-}
-
-.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-light.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5);
-}
-
-.btn-outline-dark {
- color: #6a8ed3;
- background-color: transparent;
- background-image: none;
- border-color: #6a8ed3;
-}
-
-.btn-outline-dark:hover {
- color: #fff;
- background-color: #6a8ed3;
- border-color: #6a8ed3;
-}
-
-.btn-outline-dark:focus, .btn-outline-dark.focus {
- box-shadow: 0 0 0 0.2rem rgba(106, 142, 211, 0.5);
-}
-
-.btn-outline-dark.disabled, .btn-outline-dark:disabled {
- color: #6a8ed3;
- background-color: transparent;
-}
-
-.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,
-.show > .btn-outline-dark.dropdown-toggle {
- color: #fff;
- background-color: #6a8ed3;
- border-color: #6a8ed3;
-}
-
-.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-dark.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(106, 142, 211, 0.5);
-}
-
-.btn-link {
- font-weight: 400;
- color: #3a59b1;
- background-color: transparent;
-}
-
-.btn-link:hover {
- color: #273c77;
- text-decoration: underline;
- background-color: transparent;
- border-color: transparent;
-}
-
-.btn-link:focus, .btn-link.focus {
- text-decoration: underline;
- border-color: transparent;
- box-shadow: none;
-}
-
-.btn-link:disabled, .btn-link.disabled {
- color: #6c757d;
- pointer-events: none;
-}
-
-.btn-lg, .btn-group-lg > .btn {
- padding: 0.5rem 1rem;
- font-size: 1.0125rem;
- line-height: 1.5;
- border-radius: 0;
-}
-
-.btn-sm, .btn-group-sm > .btn {
- padding: 0.25rem 0.5rem;
- font-size: 0.70875rem;
- line-height: 1.5;
- border-radius: 0;
-}
-
-.btn-block {
- display: block;
- width: 100%;
-}
-
-.btn-block + .btn-block {
- margin-top: 0.5rem;
-}
-
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
- width: 100%;
-}
-
-.fade {
- transition: opacity 0.15s linear;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- .fade {
- transition: none;
- }
-}
-
-.fade:not(.show) {
- opacity: 0;
-}
-
-.collapse:not(.show) {
- display: none;
-}
-
-.collapsing {
- position: relative;
- height: 0;
- overflow: hidden;
- transition: height 0.35s ease;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- .collapsing {
- transition: none;
- }
-}
-
-.dropup,
-.dropright,
-.dropdown,
-.dropleft {
- position: relative;
-}
-
-.dropdown-toggle::after {
- display: inline-block;
- width: 0;
- height: 0;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: "";
- border-top: 0.3em solid;
- border-right: 0.3em solid transparent;
- border-bottom: 0;
- border-left: 0.3em solid transparent;
-}
-
-.dropdown-toggle:empty::after {
- margin-left: 0;
-}
-
-.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 1000;
- display: none;
- float: left;
- min-width: 10rem;
- padding: 0.5rem 0;
- margin: 0.125rem 0 0;
- font-size: 0.81rem;
- color: #212529;
- text-align: left;
- list-style: none;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.15);
-}
-
-.dropdown-menu-right {
- right: 0;
- left: auto;
-}
-
-.dropup .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-top: 0;
- margin-bottom: 0.125rem;
-}
-
-.dropup .dropdown-toggle::after {
- display: inline-block;
- width: 0;
- height: 0;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: "";
- border-top: 0;
- border-right: 0.3em solid transparent;
- border-bottom: 0.3em solid;
- border-left: 0.3em solid transparent;
-}
-
-.dropup .dropdown-toggle:empty::after {
- margin-left: 0;
-}
-
-.dropright .dropdown-menu {
- top: 0;
- right: auto;
- left: 100%;
- margin-top: 0;
- margin-left: 0.125rem;
-}
-
-.dropright .dropdown-toggle::after {
- display: inline-block;
- width: 0;
- height: 0;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: "";
- border-top: 0.3em solid transparent;
- border-right: 0;
- border-bottom: 0.3em solid transparent;
- border-left: 0.3em solid;
-}
-
-.dropright .dropdown-toggle:empty::after {
- margin-left: 0;
-}
-
-.dropright .dropdown-toggle::after {
- vertical-align: 0;
-}
-
-.dropleft .dropdown-menu {
- top: 0;
- right: 100%;
- left: auto;
- margin-top: 0;
- margin-right: 0.125rem;
-}
-
-.dropleft .dropdown-toggle::after {
- display: inline-block;
- width: 0;
- height: 0;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: "";
-}
-
-.dropleft .dropdown-toggle::after {
- display: none;
-}
-
-.dropleft .dropdown-toggle::before {
- display: inline-block;
- width: 0;
- height: 0;
- margin-right: 0.255em;
- vertical-align: 0.255em;
- content: "";
- border-top: 0.3em solid transparent;
- border-right: 0.3em solid;
- border-bottom: 0.3em solid transparent;
-}
-
-.dropleft .dropdown-toggle:empty::after {
- margin-left: 0;
-}
-
-.dropleft .dropdown-toggle::before {
- vertical-align: 0;
-}
-
-.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] {
- right: auto;
- bottom: auto;
-}
-
-.dropdown-divider {
- height: 0;
- margin: 0.5rem 0;
- overflow: hidden;
- border-top: 1px solid #e9ecef;
-}
-
-.dropdown-item {
- display: block;
- width: 100%;
- padding: 0.25rem 1.5rem;
- clear: both;
- font-weight: 400;
- color: #212529;
- text-align: inherit;
- white-space: nowrap;
- background-color: transparent;
- border: 0;
-}
-
-.dropdown-item:hover, .dropdown-item:focus {
- color: #16181b;
- text-decoration: none;
- background-color: #f8f9fa;
-}
-
-.dropdown-item.active, .dropdown-item:active {
- color: #fff;
- text-decoration: none;
- background-color: #3a59b1;
-}
-
-.dropdown-item.disabled, .dropdown-item:disabled {
- color: #6c757d;
- background-color: transparent;
-}
-
-.dropdown-menu.show {
- display: block;
-}
-
-.dropdown-header {
- display: block;
- padding: 0.5rem 1.5rem;
- margin-bottom: 0;
- font-size: 0.70875rem;
- color: #6c757d;
- white-space: nowrap;
-}
-
-.dropdown-item-text {
- display: block;
- padding: 0.25rem 1.5rem;
- color: #212529;
-}
-
-.btn-group,
-.btn-group-vertical {
- position: relative;
- display: -ms-inline-flexbox;
- display: inline-flex;
- vertical-align: middle;
-}
-
-.btn-group > .btn,
-.btn-group-vertical > .btn {
- position: relative;
- -ms-flex: 0 1 auto;
- flex: 0 1 auto;
-}
-
-.btn-group > .btn:hover,
-.btn-group-vertical > .btn:hover {
- z-index: 1;
-}
-
-.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
-.btn-group-vertical > .btn:focus,
-.btn-group-vertical > .btn:active,
-.btn-group-vertical > .btn.active {
- z-index: 1;
-}
-
-.btn-group .btn + .btn,
-.btn-group .btn + .btn-group,
-.btn-group .btn-group + .btn,
-.btn-group .btn-group + .btn-group,
-.btn-group-vertical .btn + .btn,
-.btn-group-vertical .btn + .btn-group,
-.btn-group-vertical .btn-group + .btn,
-.btn-group-vertical .btn-group + .btn-group {
- margin-left: -1px;
-}
-
-.btn-toolbar {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -ms-flex-pack: start;
- justify-content: flex-start;
-}
-
-.btn-toolbar .input-group {
- width: auto;
-}
-
-.btn-group > .btn:first-child {
- margin-left: 0;
-}
-
-.dropdown-toggle-split {
- padding-right: 0.75rem;
- padding-left: 0.75rem;
-}
-
-.dropdown-toggle-split::after,
-.dropup .dropdown-toggle-split::after,
-.dropright .dropdown-toggle-split::after {
- margin-left: 0;
-}
-
-.dropleft .dropdown-toggle-split::before {
- margin-right: 0;
-}
-
-.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
- padding-right: 0.375rem;
- padding-left: 0.375rem;
-}
-
-.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
- padding-right: 0.75rem;
- padding-left: 0.75rem;
-}
-
-.btn-group-vertical {
- -ms-flex-direction: column;
- flex-direction: column;
- -ms-flex-align: start;
- align-items: flex-start;
- -ms-flex-pack: center;
- justify-content: center;
-}
-
-.btn-group-vertical .btn,
-.btn-group-vertical .btn-group {
- width: 100%;
-}
-
-.btn-group-vertical > .btn + .btn,
-.btn-group-vertical > .btn + .btn-group,
-.btn-group-vertical > .btn-group + .btn,
-.btn-group-vertical > .btn-group + .btn-group {
- margin-top: -1px;
- margin-left: 0;
-}
-
-.btn-group-toggle > .btn,
-.btn-group-toggle > .btn-group > .btn {
- margin-bottom: 0;
-}
-
-.btn-group-toggle > .btn input[type="radio"],
-.btn-group-toggle > .btn input[type="checkbox"],
-.btn-group-toggle > .btn-group > .btn input[type="radio"],
-.btn-group-toggle > .btn-group > .btn input[type="checkbox"] {
- position: absolute;
- clip: rect(0, 0, 0, 0);
- pointer-events: none;
-}
-
-.input-group {
- position: relative;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -ms-flex-align: stretch;
- align-items: stretch;
- width: 100%;
-}
-
-.input-group > .form-control,
-.input-group > .custom-select,
-.input-group > .custom-file {
- position: relative;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- width: 1%;
- margin-bottom: 0;
-}
-
-.input-group > .form-control + .form-control,
-.input-group > .form-control + .custom-select,
-.input-group > .form-control + .custom-file,
-.input-group > .custom-select + .form-control,
-.input-group > .custom-select + .custom-select,
-.input-group > .custom-select + .custom-file,
-.input-group > .custom-file + .form-control,
-.input-group > .custom-file + .custom-select,
-.input-group > .custom-file + .custom-file {
- margin-left: -1px;
-}
-
-.input-group > .form-control:focus,
-.input-group > .custom-select:focus,
-.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {
- z-index: 3;
-}
-
-.input-group > .custom-file .custom-file-input:focus {
- z-index: 4;
-}
-
-.input-group > .custom-file {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.input-group-prepend,
-.input-group-append {
- display: -ms-flexbox;
- display: flex;
-}
-
-.input-group-prepend .btn,
-.input-group-append .btn {
- position: relative;
- z-index: 2;
-}
-
-.input-group-prepend .btn + .btn,
-.input-group-prepend .btn + .input-group-text,
-.input-group-prepend .input-group-text + .input-group-text,
-.input-group-prepend .input-group-text + .btn,
-.input-group-append .btn + .btn,
-.input-group-append .btn + .input-group-text,
-.input-group-append .input-group-text + .input-group-text,
-.input-group-append .input-group-text + .btn {
- margin-left: -1px;
-}
-
-.input-group-prepend {
- margin-right: -1px;
-}
-
-.input-group-append {
- margin-left: -1px;
-}
-
-.input-group-text {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- padding: 0.375rem 0.38rem;
- margin-bottom: 0;
- font-size: 0.81rem;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- text-align: center;
- white-space: nowrap;
- background-color: #e9ecef;
- border: 1px solid #ced4da;
-}
-
-.input-group-text input[type="radio"],
-.input-group-text input[type="checkbox"] {
- margin-top: 0;
-}
-
-.input-group-lg > .form-control,
-.input-group-lg > .input-group-prepend > .input-group-text,
-.input-group-lg > .input-group-append > .input-group-text,
-.input-group-lg > .input-group-prepend > .btn,
-.input-group-lg > .input-group-append > .btn {
- height: calc(2.51875rem + 2px);
- padding: 0.5rem 1rem;
- font-size: 1.0125rem;
- line-height: 1.5;
-}
-
-.input-group-sm > .form-control,
-.input-group-sm > .input-group-prepend > .input-group-text,
-.input-group-sm > .input-group-append > .input-group-text,
-.input-group-sm > .input-group-prepend > .btn,
-.input-group-sm > .input-group-append > .btn {
- height: calc(1.563125rem + 2px);
- padding: 0.25rem 0.5rem;
- font-size: 0.70875rem;
- line-height: 1.5;
-}
-
-.custom-control {
- position: relative;
- display: block;
- min-height: 1.215rem;
- padding-left: 1.5rem;
-}
-
-.custom-control-inline {
- display: -ms-inline-flexbox;
- display: inline-flex;
- margin-right: 1rem;
-}
-
-.custom-control-input {
- position: absolute;
- z-index: -1;
- opacity: 0;
-}
-
-.custom-control-input:checked ~ .custom-control-label::before {
- color: #fff;
- background-color: #3a59b1;
-}
-
-.custom-control-input:focus ~ .custom-control-label::before {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.custom-control-input:active ~ .custom-control-label::before {
- color: #fff;
- background-color: #b6c3e7;
-}
-
-.custom-control-input:disabled ~ .custom-control-label {
- color: #6c757d;
-}
-
-.custom-control-input:disabled ~ .custom-control-label::before {
- background-color: #e9ecef;
-}
-
-.custom-control-label {
- position: relative;
- margin-bottom: 0;
-}
-
-.custom-control-label::before {
- position: absolute;
- top: 0.1075rem;
- left: -1.5rem;
- display: block;
- width: 1rem;
- height: 1rem;
- pointer-events: none;
- content: "";
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- background-color: #dee2e6;
-}
-
-.custom-control-label::after {
- position: absolute;
- top: 0.1075rem;
- left: -1.5rem;
- display: block;
- width: 1rem;
- height: 1rem;
- content: "";
- background-repeat: no-repeat;
- background-position: center center;
- background-size: 50% 50%;
-}
-
-.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before {
- background-color: #3a59b1;
-}
-
-.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E");
-}
-
-.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
- background-color: #3a59b1;
-}
-
-.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E");
-}
-
-.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
- background-color: rgba(58, 89, 177, 0.5);
-}
-
-.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {
- background-color: rgba(58, 89, 177, 0.5);
-}
-
-.custom-radio .custom-control-label::before {
- border-radius: 50%;
-}
-
-.custom-radio .custom-control-input:checked ~ .custom-control-label::before {
- background-color: #3a59b1;
-}
-
-.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");
-}
-
-.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
- background-color: rgba(58, 89, 177, 0.5);
-}
-
-.custom-select {
- display: inline-block;
- width: 100%;
- height: calc(1.965rem + 2px);
- padding: 0.375rem 1.75rem 0.375rem 0.75rem;
- line-height: 1.5;
- color: #495057;
- vertical-align: middle;
- background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center;
- background-size: 8px 10px;
- border: 1px solid #ced4da;
- border-radius: 0;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
-}
-
-.custom-select:focus {
- border-color: #90a3db;
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(144, 163, 219, 0.5);
-}
-
-.custom-select:focus::-ms-value {
- color: #495057;
- background-color: #fff;
-}
-
-.custom-select[multiple], .custom-select[size]:not([size="1"]) {
- height: auto;
- padding-right: 0.75rem;
- background-image: none;
-}
-
-.custom-select:disabled {
- color: #6c757d;
- background-color: #e9ecef;
-}
-
-.custom-select::-ms-expand {
- opacity: 0;
-}
-
-.custom-select-sm {
- height: calc(1.563125rem + 2px);
- padding-top: 0.375rem;
- padding-bottom: 0.375rem;
- font-size: 75%;
-}
-
-.custom-select-lg {
- height: calc(2.51875rem + 2px);
- padding-top: 0.375rem;
- padding-bottom: 0.375rem;
- font-size: 125%;
-}
-
-.custom-file {
- position: relative;
- display: inline-block;
- width: 100%;
- height: calc(1.965rem + 2px);
- margin-bottom: 0;
-}
-
-.custom-file-input {
- position: relative;
- z-index: 2;
- width: 100%;
- height: calc(1.965rem + 2px);
- margin: 0;
- opacity: 0;
-}
-
-.custom-file-input:focus ~ .custom-file-label {
- border-color: #90a3db;
- box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.custom-file-input:focus ~ .custom-file-label::after {
- border-color: #90a3db;
-}
-
-.custom-file-input:disabled ~ .custom-file-label {
- background-color: #e9ecef;
-}
-
-.custom-file-input:lang(en) ~ .custom-file-label::after {
- content: "Browse";
-}
-
-.custom-file-label {
- position: absolute;
- top: 0;
- right: 0;
- left: 0;
- z-index: 1;
- height: calc(1.965rem + 2px);
- padding: 0.375rem 0.75rem;
- line-height: 1.5;
- color: #495057;
- background-color: #fff;
- border: 1px solid #ced4da;
-}
-
-.custom-file-label::after {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- z-index: 3;
- display: block;
- height: 1.965rem;
- padding: 0.375rem 0.75rem;
- line-height: 1.5;
- color: #495057;
- content: "Browse";
- background-color: #e9ecef;
- border-left: 1px solid #ced4da;
-}
-
-.custom-range {
- width: 100%;
- padding-left: 0;
- background-color: transparent;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
-}
-
-.custom-range:focus {
- outline: none;
-}
-
-.custom-range:focus::-webkit-slider-thumb {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.custom-range:focus::-moz-range-thumb {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.custom-range:focus::-ms-thumb {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.custom-range::-moz-focus-outer {
- border: 0;
-}
-
-.custom-range::-webkit-slider-thumb {
- width: 1rem;
- height: 1rem;
- margin-top: -0.25rem;
- background-color: #3a59b1;
- border: 0;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- -webkit-appearance: none;
- appearance: none;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- .custom-range::-webkit-slider-thumb {
- transition: none;
- }
-}
-
-.custom-range::-webkit-slider-thumb:active {
- background-color: #b6c3e7;
-}
-
-.custom-range::-webkit-slider-runnable-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: #dee2e6;
- border-color: transparent;
-}
-
-.custom-range::-moz-range-thumb {
- width: 1rem;
- height: 1rem;
- background-color: #3a59b1;
- border: 0;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- -moz-appearance: none;
- appearance: none;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- .custom-range::-moz-range-thumb {
- transition: none;
- }
-}
-
-.custom-range::-moz-range-thumb:active {
- background-color: #b6c3e7;
-}
-
-.custom-range::-moz-range-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: #dee2e6;
- border-color: transparent;
-}
-
-.custom-range::-ms-thumb {
- width: 1rem;
- height: 1rem;
- margin-top: 0;
- margin-right: 0.2rem;
- margin-left: 0.2rem;
- background-color: #3a59b1;
- border: 0;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- appearance: none;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- .custom-range::-ms-thumb {
- transition: none;
- }
-}
-
-.custom-range::-ms-thumb:active {
- background-color: #b6c3e7;
-}
-
-.custom-range::-ms-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: transparent;
- border-color: transparent;
- border-width: 0.5rem;
-}
-
-.custom-range::-ms-fill-lower {
- background-color: #dee2e6;
-}
-
-.custom-range::-ms-fill-upper {
- margin-right: 15px;
- background-color: #dee2e6;
-}
-
-.custom-control-label::before,
-.custom-file-label,
-.custom-select {
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- .custom-control-label::before,
- .custom-file-label,
- .custom-select {
- transition: none;
- }
-}
-
-.nav {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
-}
-
-.nav-link {
- display: block;
- padding: 0.5rem 1rem;
-}
-
-.nav-link:hover, .nav-link:focus {
- text-decoration: none;
-}
-
-.nav-link.disabled {
- color: #6c757d;
-}
-
-.nav-tabs {
- border-bottom: 1px solid #dee2e6;
-}
-
-.nav-tabs .nav-item {
- margin-bottom: -1px;
-}
-
-.nav-tabs .nav-link {
- border: 1px solid transparent;
-}
-
-.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
- border-color: #e9ecef #e9ecef #dee2e6;
-}
-
-.nav-tabs .nav-link.disabled {
- color: #6c757d;
- background-color: transparent;
- border-color: transparent;
-}
-
-.nav-tabs .nav-link.active,
-.nav-tabs .nav-item.show .nav-link {
- color: #495057;
- background-color: #fff;
- border-color: #dee2e6 #dee2e6 #fff;
-}
-
-.nav-tabs .dropdown-menu {
- margin-top: -1px;
-}
-
-.nav-pills .nav-link.active,
-.nav-pills .show > .nav-link {
- color: #fff;
- background-color: #3a59b1;
-}
-
-.nav-fill .nav-item {
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- text-align: center;
-}
-
-.nav-justified .nav-item {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- text-align: center;
-}
-
-.tab-content > .tab-pane {
- display: none;
-}
-
-.tab-content > .active {
- display: block;
-}
-
-.navbar {
- position: relative;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: justify;
- justify-content: space-between;
- padding: 0rem 0.25rem;
-}
-
-.navbar > .container,
-.navbar > .container-fluid {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: justify;
- justify-content: space-between;
-}
-
-.navbar-brand {
- display: inline-block;
- padding-top: 0.348125rem;
- padding-bottom: 0.348125rem;
- margin-right: 0.25rem;
- font-size: 1.0125rem;
- line-height: inherit;
- white-space: nowrap;
-}
-
-.navbar-brand:hover, .navbar-brand:focus {
- text-decoration: none;
-}
-
-.navbar-nav {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
-}
-
-.navbar-nav .nav-link {
- padding-right: 0;
- padding-left: 0;
-}
-
-.navbar-nav .dropdown-menu {
- position: static;
- float: none;
-}
-
-.navbar-text {
- display: inline-block;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
-}
-
-.navbar-collapse {
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.navbar-toggler {
- padding: 0.25rem 0.75rem;
- font-size: 1.0125rem;
- line-height: 1;
- background-color: transparent;
- border: 1px solid transparent;
-}
-
-.navbar-toggler:hover, .navbar-toggler:focus {
- text-decoration: none;
-}
-
-.navbar-toggler:not(:disabled):not(.disabled) {
- cursor: pointer;
-}
-
-.navbar-toggler-icon {
- display: inline-block;
- width: 1.5em;
- height: 1.5em;
- vertical-align: middle;
- content: "";
- background: no-repeat center center;
- background-size: 100% 100%;
-}
-
-@media (max-width: 575.98px) {
- .navbar-expand-sm > .container,
- .navbar-expand-sm > .container-fluid {
- padding-right: 0;
- padding-left: 0;
- }
-}
-
-@media (min-width: 576px) {
- .navbar-expand-sm {
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -ms-flex-pack: start;
- justify-content: flex-start;
- }
- .navbar-expand-sm .navbar-nav {
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .navbar-expand-sm .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-sm .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-sm > .container,
- .navbar-expand-sm > .container-fluid {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- }
- .navbar-expand-sm .navbar-collapse {
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
- }
- .navbar-expand-sm .navbar-toggler {
- display: none;
- }
-}
-
-@media (max-width: 767.98px) {
- .navbar-expand-md > .container,
- .navbar-expand-md > .container-fluid {
- padding-right: 0;
- padding-left: 0;
- }
-}
-
-@media (min-width: 768px) {
- .navbar-expand-md {
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -ms-flex-pack: start;
- justify-content: flex-start;
- }
- .navbar-expand-md .navbar-nav {
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .navbar-expand-md .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-md .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-md > .container,
- .navbar-expand-md > .container-fluid {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- }
- .navbar-expand-md .navbar-collapse {
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
- }
- .navbar-expand-md .navbar-toggler {
- display: none;
- }
-}
-
-@media (max-width: 991.98px) {
- .navbar-expand-lg > .container,
- .navbar-expand-lg > .container-fluid {
- padding-right: 0;
- padding-left: 0;
- }
-}
-
-@media (min-width: 992px) {
- .navbar-expand-lg {
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -ms-flex-pack: start;
- justify-content: flex-start;
- }
- .navbar-expand-lg .navbar-nav {
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .navbar-expand-lg .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-lg .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-lg > .container,
- .navbar-expand-lg > .container-fluid {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- }
- .navbar-expand-lg .navbar-collapse {
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
- }
- .navbar-expand-lg .navbar-toggler {
- display: none;
- }
-}
-
-@media (max-width: 1199.98px) {
- .navbar-expand-xl > .container,
- .navbar-expand-xl > .container-fluid {
- padding-right: 0;
- padding-left: 0;
- }
-}
-
-@media (min-width: 1200px) {
- .navbar-expand-xl {
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -ms-flex-pack: start;
- justify-content: flex-start;
- }
- .navbar-expand-xl .navbar-nav {
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .navbar-expand-xl .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-xl .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-xl > .container,
- .navbar-expand-xl > .container-fluid {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- }
- .navbar-expand-xl .navbar-collapse {
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
- }
- .navbar-expand-xl .navbar-toggler {
- display: none;
- }
-}
-
-.navbar-expand {
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -ms-flex-pack: start;
- justify-content: flex-start;
-}
-
-.navbar-expand > .container,
-.navbar-expand > .container-fluid {
- padding-right: 0;
- padding-left: 0;
-}
-
-.navbar-expand .navbar-nav {
- -ms-flex-direction: row;
- flex-direction: row;
-}
-
-.navbar-expand .navbar-nav .dropdown-menu {
- position: absolute;
-}
-
-.navbar-expand .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
-}
-
-.navbar-expand > .container,
-.navbar-expand > .container-fluid {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
-}
-
-.navbar-expand .navbar-collapse {
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
-}
-
-.navbar-expand .navbar-toggler {
- display: none;
-}
-
-.navbar-light .navbar-brand {
- color: #000;
-}
-
-.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {
- color: #000;
-}
-
-.navbar-light .navbar-nav .nav-link {
- color: rgba(0, 0, 0, 0.7);
-}
-
-.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
- color: #000;
-}
-
-.navbar-light .navbar-nav .nav-link.disabled {
- color: rgba(0, 0, 0, 0.3);
-}
-
-.navbar-light .navbar-nav .show > .nav-link,
-.navbar-light .navbar-nav .active > .nav-link,
-.navbar-light .navbar-nav .nav-link.show,
-.navbar-light .navbar-nav .nav-link.active {
- color: #000;
-}
-
-.navbar-light .navbar-toggler {
- color: rgba(0, 0, 0, 0.7);
- border-color: rgba(0, 0, 0, 0.1);
-}
-
-.navbar-light .navbar-toggler-icon {
- background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.7)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
-}
-
-.navbar-light .navbar-text {
- color: rgba(0, 0, 0, 0.7);
-}
-
-.navbar-light .navbar-text a {
- color: #000;
-}
-
-.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {
- color: #000;
-}
-
-.navbar-dark .navbar-brand {
- color: #fff;
-}
-
-.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {
- color: #fff;
-}
-
-.navbar-dark .navbar-nav .nav-link {
- color: rgba(255, 255, 255, 0.5);
-}
-
-.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {
- color: rgba(255, 255, 255, 0.75);
-}
-
-.navbar-dark .navbar-nav .nav-link.disabled {
- color: rgba(255, 255, 255, 0.25);
-}
-
-.navbar-dark .navbar-nav .show > .nav-link,
-.navbar-dark .navbar-nav .active > .nav-link,
-.navbar-dark .navbar-nav .nav-link.show,
-.navbar-dark .navbar-nav .nav-link.active {
- color: #fff;
-}
-
-.navbar-dark .navbar-toggler {
- color: rgba(255, 255, 255, 0.5);
- border-color: rgba(255, 255, 255, 0.1);
-}
-
-.navbar-dark .navbar-toggler-icon {
- background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
-}
-
-.navbar-dark .navbar-text {
- color: rgba(255, 255, 255, 0.5);
-}
-
-.navbar-dark .navbar-text a {
- color: #fff;
-}
-
-.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {
- color: #fff;
-}
-
-.card {
- position: relative;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
- min-width: 0;
- word-wrap: break-word;
- background-color: #fff;
- background-clip: border-box;
- border: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.card > hr {
- margin-right: 0;
- margin-left: 0;
-}
-
-.card-body {
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- padding: 1.25rem;
-}
-
-.card-title {
- margin-bottom: 8px;
-}
-
-.card-subtitle {
- margin-top: -4px;
- margin-bottom: 0;
-}
-
-.card-text:last-child {
- margin-bottom: 0;
-}
-
-.card-link:hover {
- text-decoration: none;
-}
-
-.card-link + .card-link {
- margin-left: 1.25rem;
-}
-
-.card-header {
- padding: 8px 1.25rem;
- margin-bottom: 0;
- background-color: rgba(0, 0, 0, 0.03);
- border-bottom: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.card-header + .list-group .list-group-item:first-child {
- border-top: 0;
-}
-
-.card-footer {
- padding: 8px 1.25rem;
- background-color: rgba(0, 0, 0, 0.03);
- border-top: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.card-header-tabs {
- margin-right: -0.625rem;
- margin-bottom: -8px;
- margin-left: -0.625rem;
- border-bottom: 0;
-}
-
-.card-header-pills {
- margin-right: -0.625rem;
- margin-left: -0.625rem;
-}
-
-.card-img-overlay {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- padding: 1.25rem;
-}
-
-.card-img {
- width: 100%;
-}
-
-.card-img-top {
- width: 100%;
-}
-
-.card-img-bottom {
- width: 100%;
-}
-
-.card-deck {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
-}
-
-.card-deck .card {
- margin-bottom: 15px;
-}
-
-@media (min-width: 576px) {
- .card-deck {
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- margin-right: -15px;
- margin-left: -15px;
- }
- .card-deck .card {
- display: -ms-flexbox;
- display: flex;
- -ms-flex: 1 0 0%;
- flex: 1 0 0%;
- -ms-flex-direction: column;
- flex-direction: column;
- margin-right: 15px;
- margin-bottom: 0;
- margin-left: 15px;
- }
-}
-
-.card-group {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
-}
-
-.card-group > .card {
- margin-bottom: 15px;
-}
-
-@media (min-width: 576px) {
- .card-group {
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- }
- .card-group > .card {
- -ms-flex: 1 0 0%;
- flex: 1 0 0%;
- margin-bottom: 0;
- }
- .card-group > .card + .card {
- margin-left: 0;
- border-left: 0;
- }
-}
-
-.card-columns .card {
- margin-bottom: 8px;
-}
-
-@media (min-width: 576px) {
- .card-columns {
- -webkit-column-count: 3;
- -moz-column-count: 3;
- column-count: 3;
- -webkit-column-gap: 1.25rem;
- -moz-column-gap: 1.25rem;
- column-gap: 1.25rem;
- orphans: 1;
- widows: 1;
- }
- .card-columns .card {
- display: inline-block;
- width: 100%;
- }
-}
-
-.accordion .card:not(:first-of-type):not(:last-of-type) {
- border-bottom: 0;
- border-radius: 0;
-}
-
-.accordion .card:not(:first-of-type) .card-header:first-child {
- border-radius: 0;
-}
-
-.accordion .card:first-of-type {
- border-bottom: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-.accordion .card:last-of-type {
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-
-.breadcrumb {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- padding: 0.75rem 0.5rem;
- margin-bottom: 1rem;
- list-style: none;
- background-color: #e9ecef;
-}
-
-.breadcrumb-item + .breadcrumb-item {
- padding-left: 0.5rem;
-}
-
-.breadcrumb-item + .breadcrumb-item::before {
- display: inline-block;
- padding-right: 0.5rem;
- color: #6c757d;
- content: "/";
-}
-
-.breadcrumb-item + .breadcrumb-item:hover::before {
- text-decoration: underline;
-}
-
-.breadcrumb-item + .breadcrumb-item:hover::before {
- text-decoration: none;
-}
-
-.breadcrumb-item.active {
- color: #6c757d;
-}
-
-.pagination {
- display: -ms-flexbox;
- display: flex;
- padding-left: 0;
- list-style: none;
-}
-
-.page-link {
- position: relative;
- display: block;
- padding: 0.5rem 0.75rem;
- margin-left: -1px;
- line-height: 1.25;
- color: #3a59b1;
- background-color: #fff;
- border: 1px solid #EB6864;
-}
-
-.page-link:hover {
- z-index: 2;
- color: #fff;
- text-decoration: none;
- background-color: #EB6864;
- border-color: #dee2e6;
-}
-
-.page-link:focus {
- z-index: 2;
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.page-link:not(:disabled):not(.disabled) {
- cursor: pointer;
-}
-
-.page-item:first-child .page-link {
- margin-left: 0;
-}
-
-.page-item.active .page-link {
- z-index: 1;
- color: #fff;
- background-color: #3a59b1;
- border-color: #3a59b1;
-}
-
-.page-item.disabled .page-link {
- color: #6c757d;
- pointer-events: none;
- cursor: auto;
- background-color: #fff;
- border-color: #dee2e6;
-}
-
-.pagination-lg .page-link {
- padding: 0.75rem 1.5rem;
- font-size: 1.0125rem;
- line-height: 1.5;
-}
-
-.pagination-sm .page-link {
- padding: 0.25rem 0.5rem;
- font-size: 0.70875rem;
- line-height: 1.5;
-}
-
-.badge {
- display: inline-block;
- padding: 0.25rem 0.4em;
- font-size: 75%;
- font-weight: 700;
- line-height: 1;
- text-align: center;
- white-space: nowrap;
- vertical-align: baseline;
-}
-
-.badge:empty {
- display: none;
-}
-
-.btn .badge {
- position: relative;
- top: -1px;
-}
-
-.badge-pill {
- padding-right: 0.6em;
- padding-left: 0.6em;
-}
-
-.badge-primary {
- color: #fff;
- background-color: #3a59b1;
-}
-
-.badge-primary[href]:hover, .badge-primary[href]:focus {
- color: #fff;
- text-decoration: none;
- background-color: #2d468b;
-}
-
-.badge-secondary {
- color: #fff;
- background-color: #6c757d;
-}
-
-.badge-secondary[href]:hover, .badge-secondary[href]:focus {
- color: #fff;
- text-decoration: none;
- background-color: #545b62;
-}
-
-.badge-success {
- color: #fff;
- background-color: #22b24c;
-}
-
-.badge-success[href]:hover, .badge-success[href]:focus {
- color: #fff;
- text-decoration: none;
- background-color: #1a873a;
-}
-
-.badge-info {
- color: #212529;
- background-color: yellow;
-}
-
-.badge-info[href]:hover, .badge-info[href]:focus {
- color: #212529;
- text-decoration: none;
- background-color: #cccc00;
-}
-
-.badge-warning {
- color: #212529;
- background-color: #ffc107;
-}
-
-.badge-warning[href]:hover, .badge-warning[href]:focus {
- color: #212529;
- text-decoration: none;
- background-color: #d39e00;
-}
-
-.badge-danger {
- color: #fff;
- background-color: #fc3434;
-}
-
-.badge-danger[href]:hover, .badge-danger[href]:focus {
- color: #fff;
- text-decoration: none;
- background-color: #f90404;
-}
-
-.badge-light {
- color: #212529;
- background-color: white;
-}
-
-.badge-light[href]:hover, .badge-light[href]:focus {
- color: #212529;
- text-decoration: none;
- background-color: #e6e6e6;
-}
-
-.badge-dark {
- color: #fff;
- background-color: #6a8ed3;
-}
-
-.badge-dark[href]:hover, .badge-dark[href]:focus {
- color: #fff;
- text-decoration: none;
- background-color: #4370c7;
-}
-
-.jumbotron {
- padding: 1.44rem 0.72rem;
- margin-bottom: 1.44rem;
- background-color: #e9ecef;
-}
-
-@media (min-width: 576px) {
- .jumbotron {
- padding: 2.88rem 1.44rem;
- }
-}
-
-.jumbotron-fluid {
- padding-right: 0;
- padding-left: 0;
-}
-
-.alert {
- position: relative;
- padding: 0.5rem 1.25rem;
- margin-bottom: 1rem;
- border: 1px solid transparent;
-}
-
-.alert-heading {
- color: inherit;
-}
-
-.alert-link {
- font-weight: 700;
-}
-
-.alert-dismissible {
- padding-right: 3.715rem;
-}
-
-.alert-dismissible .close {
- position: absolute;
- top: 0;
- right: 0;
- padding: 0.5rem 1.25rem;
- color: inherit;
-}
-
-.alert-primary {
- color: #1e2e5c;
- background-color: #d8deef;
- border-color: #c8d1e9;
-}
-
-.alert-primary hr {
- border-top-color: #b6c2e2;
-}
-
-.alert-primary .alert-link {
- color: #111b36;
-}
-
-.alert-secondary {
- color: #383d41;
- background-color: #e2e3e5;
- border-color: #d6d8db;
-}
-
-.alert-secondary hr {
- border-top-color: #c8cbcf;
-}
-
-.alert-secondary .alert-link {
- color: #202326;
-}
-
-.alert-success {
- color: #125d28;
- background-color: #d3f0db;
- border-color: #c1e9cd;
-}
-
-.alert-success hr {
- border-top-color: #aee2be;
-}
-
-.alert-success .alert-link {
- color: #0a3216;
-}
-
-.alert-info {
- color: #858500;
- background-color: #ffffcc;
- border-color: #ffffb8;
-}
-
-.alert-info hr {
- border-top-color: #ffff9f;
-}
-
-.alert-info .alert-link {
- color: #525200;
-}
-
-.alert-warning {
- color: #856404;
- background-color: #fff3cd;
- border-color: #ffeeba;
-}
-
-.alert-warning hr {
- border-top-color: #ffe8a1;
-}
-
-.alert-warning .alert-link {
- color: #533f03;
-}
-
-.alert-danger {
- color: #831b1b;
- background-color: #fed6d6;
- border-color: #fec6c6;
-}
-
-.alert-danger hr {
- border-top-color: #feadad;
-}
-
-.alert-danger .alert-link {
- color: #591212;
-}
-
-.alert-light {
- color: #858585;
- background-color: white;
- border-color: white;
-}
-
-.alert-light hr {
- border-top-color: #f2f2f2;
-}
-
-.alert-light .alert-link {
- color: #6c6c6c;
-}
-
-.alert-dark {
- color: #374a6e;
- background-color: #e1e8f6;
- border-color: #d5dff3;
-}
-
-.alert-dark hr {
- border-top-color: #c1d0ed;
-}
-
-.alert-dark .alert-link {
- color: #26334c;
-}
-
-@-webkit-keyframes progress-bar-stripes {
- from {
- background-position: 1rem 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-@keyframes progress-bar-stripes {
- from {
- background-position: 1rem 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-.progress {
- display: -ms-flexbox;
- display: flex;
- height: 1rem;
- overflow: hidden;
- font-size: 0.6075rem;
- background-color: #e9ecef;
-}
-
-.progress-bar {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
- -ms-flex-pack: center;
- justify-content: center;
- color: #fff;
- text-align: center;
- white-space: nowrap;
- background-color: #3a59b1;
- transition: width 0.6s ease;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- .progress-bar {
- transition: none;
- }
-}
-
-.progress-bar-striped {
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-size: 1rem 1rem;
-}
-
-.progress-bar-animated {
- -webkit-animation: progress-bar-stripes 1s linear infinite;
- animation: progress-bar-stripes 1s linear infinite;
-}
-
-.media {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: start;
- align-items: flex-start;
-}
-
-.media-body {
- -ms-flex: 1;
- flex: 1;
-}
-
-.list-group {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
- padding-left: 0;
- margin-bottom: 0;
-}
-
-.list-group-item-action {
- width: 100%;
- color: #495057;
- text-align: inherit;
-}
-
-.list-group-item-action:hover, .list-group-item-action:focus {
- color: #495057;
- text-decoration: none;
- background-color: #f8f9fa;
-}
-
-.list-group-item-action:active {
- color: #212529;
- background-color: #e9ecef;
-}
-
-.list-group-item {
- position: relative;
- display: block;
- padding: 0.5rem 0.5rem;
- margin-bottom: -1px;
- background-color: #fff;
- border: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.list-group-item:last-child {
- margin-bottom: 0;
-}
-
-.list-group-item:hover, .list-group-item:focus {
- z-index: 1;
- text-decoration: none;
-}
-
-.list-group-item.disabled, .list-group-item:disabled {
- color: #6c757d;
- background-color: #fff;
-}
-
-.list-group-item.active {
- z-index: 2;
- color: #fff;
- background-color: #3a59b1;
- border-color: #3a59b1;
-}
-
-.list-group-flush .list-group-item {
- border-right: 0;
- border-left: 0;
-}
-
-.list-group-flush:first-child .list-group-item:first-child {
- border-top: 0;
-}
-
-.list-group-flush:last-child .list-group-item:last-child {
- border-bottom: 0;
-}
-
-.list-group-item-primary {
- color: #1e2e5c;
- background-color: #c8d1e9;
-}
-
-.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {
- color: #1e2e5c;
- background-color: #b6c2e2;
-}
-
-.list-group-item-primary.list-group-item-action.active {
- color: #fff;
- background-color: #1e2e5c;
- border-color: #1e2e5c;
-}
-
-.list-group-item-secondary {
- color: #383d41;
- background-color: #d6d8db;
-}
-
-.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {
- color: #383d41;
- background-color: #c8cbcf;
-}
-
-.list-group-item-secondary.list-group-item-action.active {
- color: #fff;
- background-color: #383d41;
- border-color: #383d41;
-}
-
-.list-group-item-success {
- color: #125d28;
- background-color: #c1e9cd;
-}
-
-.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {
- color: #125d28;
- background-color: #aee2be;
-}
-
-.list-group-item-success.list-group-item-action.active {
- color: #fff;
- background-color: #125d28;
- border-color: #125d28;
-}
-
-.list-group-item-info {
- color: #858500;
- background-color: #ffffb8;
-}
-
-.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {
- color: #858500;
- background-color: #ffff9f;
-}
-
-.list-group-item-info.list-group-item-action.active {
- color: #fff;
- background-color: #858500;
- border-color: #858500;
-}
-
-.list-group-item-warning {
- color: #856404;
- background-color: #ffeeba;
-}
-
-.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {
- color: #856404;
- background-color: #ffe8a1;
-}
-
-.list-group-item-warning.list-group-item-action.active {
- color: #fff;
- background-color: #856404;
- border-color: #856404;
-}
-
-.list-group-item-danger {
- color: #831b1b;
- background-color: #fec6c6;
-}
-
-.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {
- color: #831b1b;
- background-color: #feadad;
-}
-
-.list-group-item-danger.list-group-item-action.active {
- color: #fff;
- background-color: #831b1b;
- border-color: #831b1b;
-}
-
-.list-group-item-light {
- color: #858585;
- background-color: white;
-}
-
-.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {
- color: #858585;
- background-color: #f2f2f2;
-}
-
-.list-group-item-light.list-group-item-action.active {
- color: #fff;
- background-color: #858585;
- border-color: #858585;
-}
-
-.list-group-item-dark {
- color: #374a6e;
- background-color: #d5dff3;
-}
-
-.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {
- color: #374a6e;
- background-color: #c1d0ed;
-}
-
-.list-group-item-dark.list-group-item-action.active {
- color: #fff;
- background-color: #374a6e;
- border-color: #374a6e;
-}
-
-.close {
- float: right;
- font-size: 1.215rem;
- font-weight: 700;
- line-height: 1;
- color: #000;
- text-shadow: 0 1px 0 #fff;
- opacity: .5;
-}
-
-.close:not(:disabled):not(.disabled) {
- cursor: pointer;
-}
-
-.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {
- color: #000;
- text-decoration: none;
- opacity: .75;
-}
-
-button.close {
- padding: 0;
- background-color: transparent;
- border: 0;
- -webkit-appearance: none;
-}
-
-.modal-open {
- overflow: hidden;
-}
-
-.modal-open .modal {
- overflow-x: hidden;
- overflow-y: auto;
-}
-
-.modal {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1050;
- display: none;
- overflow: hidden;
- outline: 0;
-}
-
-.modal-dialog {
- position: relative;
- width: auto;
- margin: 0.5rem;
- pointer-events: none;
-}
-
-.modal.fade .modal-dialog {
- transition: -webkit-transform 0.3s ease-out;
- transition: transform 0.3s ease-out;
- transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
- -webkit-transform: translate(0, -25%);
- transform: translate(0, -25%);
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- .modal.fade .modal-dialog {
- transition: none;
- }
-}
-
-.modal.show .modal-dialog {
- -webkit-transform: translate(0, 0);
- transform: translate(0, 0);
-}
-
-.modal-dialog-centered {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- min-height: calc(100% - (0.5rem * 2));
-}
-
-.modal-dialog-centered::before {
- display: block;
- height: calc(100vh - (0.5rem * 2));
- content: "";
-}
-
-.modal-content {
- position: relative;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
- width: 100%;
- pointer-events: auto;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.2);
- outline: 0;
-}
-
-.modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1040;
- background-color: #000;
-}
-
-.modal-backdrop.fade {
- opacity: 0;
-}
-
-.modal-backdrop.show {
- opacity: 0.5;
-}
-
-.modal-header {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: start;
- align-items: flex-start;
- -ms-flex-pack: justify;
- justify-content: space-between;
- padding: 1rem;
- border-bottom: 1px solid #e9ecef;
-}
-
-.modal-header .close {
- padding: 1rem;
- margin: -1rem -1rem -1rem auto;
-}
-
-.modal-title {
- margin-bottom: 0;
- line-height: 1.5;
-}
-
-.modal-body {
- position: relative;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- padding: 1rem;
-}
-
-.modal-footer {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: end;
- justify-content: flex-end;
- padding: 1rem;
- border-top: 1px solid #e9ecef;
-}
-
-.modal-footer > :not(:first-child) {
- margin-left: .25rem;
-}
-
-.modal-footer > :not(:last-child) {
- margin-right: .25rem;
-}
-
-.modal-scrollbar-measure {
- position: absolute;
- top: -9999px;
- width: 50px;
- height: 50px;
- overflow: scroll;
-}
-
-@media (min-width: 576px) {
- .modal-dialog {
- max-width: 500px;
- margin: 1.75rem auto;
- }
- .modal-dialog-centered {
- min-height: calc(100% - (1.75rem * 2));
- }
- .modal-dialog-centered::before {
- height: calc(100vh - (1.75rem * 2));
- }
- .modal-sm {
- max-width: 300px;
- }
-}
-
-@media (min-width: 992px) {
- .modal-lg {
- max-width: 800px;
- }
-}
-
-.tooltip {
- position: absolute;
- z-index: 1070;
- display: block;
- margin: 0;
- font-family: Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- font-style: normal;
- font-weight: 400;
- line-height: 1.5;
- text-align: left;
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- letter-spacing: normal;
- word-break: normal;
- word-spacing: normal;
- white-space: normal;
- line-break: auto;
- font-size: 0.70875rem;
- word-wrap: break-word;
- opacity: 0;
-}
-
-.tooltip.show {
- opacity: 0.9;
-}
-
-.tooltip .arrow {
- position: absolute;
- display: block;
- width: 0.8rem;
- height: 0.4rem;
-}
-
-.tooltip .arrow::before {
- position: absolute;
- content: "";
- border-color: transparent;
- border-style: solid;
-}
-
-.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] {
- padding: 0.4rem 0;
-}
-
-.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow {
- bottom: 0;
-}
-
-.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before {
- top: 0;
- border-width: 0.4rem 0.4rem 0;
- border-top-color: #000;
-}
-
-.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] {
- padding: 0 0.4rem;
-}
-
-.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow {
- left: 0;
- width: 0.4rem;
- height: 0.8rem;
-}
-
-.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before {
- right: 0;
- border-width: 0.4rem 0.4rem 0.4rem 0;
- border-right-color: #000;
-}
-
-.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] {
- padding: 0.4rem 0;
-}
-
-.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow {
- top: 0;
-}
-
-.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before {
- bottom: 0;
- border-width: 0 0.4rem 0.4rem;
- border-bottom-color: #000;
-}
-
-.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] {
- padding: 0 0.4rem;
-}
-
-.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow {
- right: 0;
- width: 0.4rem;
- height: 0.8rem;
-}
-
-.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before {
- left: 0;
- border-width: 0.4rem 0 0.4rem 0.4rem;
- border-left-color: #000;
-}
-
-.tooltip-inner {
- max-width: 200px;
- padding: 0.25rem 0.5rem;
- color: #fff;
- text-align: center;
- background-color: #000;
-}
-
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1060;
- display: block;
- max-width: 276px;
- font-family: Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- font-style: normal;
- font-weight: 400;
- line-height: 1.5;
- text-align: left;
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- letter-spacing: normal;
- word-break: normal;
- word-spacing: normal;
- white-space: normal;
- line-break: auto;
- font-size: 0.70875rem;
- word-wrap: break-word;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.2);
-}
-
-.popover .arrow {
- position: absolute;
- display: block;
- width: 1rem;
- height: 0.5rem;
- margin: 0 0.3rem;
-}
-
-.popover .arrow::before, .popover .arrow::after {
- position: absolute;
- display: block;
- content: "";
- border-color: transparent;
- border-style: solid;
-}
-
-.bs-popover-top, .bs-popover-auto[x-placement^="top"] {
- margin-bottom: 0.5rem;
-}
-
-.bs-popover-top .arrow, .bs-popover-auto[x-placement^="top"] .arrow {
- bottom: calc((0.5rem + 1px) * -1);
-}
-
-.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^="top"] .arrow::before,
-.bs-popover-top .arrow::after,
-.bs-popover-auto[x-placement^="top"] .arrow::after {
- border-width: 0.5rem 0.5rem 0;
-}
-
-.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^="top"] .arrow::before {
- bottom: 0;
- border-top-color: rgba(0, 0, 0, 0.25);
-}
-
-
-.bs-popover-top .arrow::after,
-.bs-popover-auto[x-placement^="top"] .arrow::after {
- bottom: 1px;
- border-top-color: #fff;
-}
-
-.bs-popover-right, .bs-popover-auto[x-placement^="right"] {
- margin-left: 0.5rem;
-}
-
-.bs-popover-right .arrow, .bs-popover-auto[x-placement^="right"] .arrow {
- left: calc((0.5rem + 1px) * -1);
- width: 0.5rem;
- height: 1rem;
- margin: 0.3rem 0;
-}
-
-.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^="right"] .arrow::before,
-.bs-popover-right .arrow::after,
-.bs-popover-auto[x-placement^="right"] .arrow::after {
- border-width: 0.5rem 0.5rem 0.5rem 0;
-}
-
-.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^="right"] .arrow::before {
- left: 0;
- border-right-color: rgba(0, 0, 0, 0.25);
-}
-
-
-.bs-popover-right .arrow::after,
-.bs-popover-auto[x-placement^="right"] .arrow::after {
- left: 1px;
- border-right-color: #fff;
-}
-
-.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] {
- margin-top: 0.5rem;
-}
-
-.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^="bottom"] .arrow {
- top: calc((0.5rem + 1px) * -1);
-}
-
-.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^="bottom"] .arrow::before,
-.bs-popover-bottom .arrow::after,
-.bs-popover-auto[x-placement^="bottom"] .arrow::after {
- border-width: 0 0.5rem 0.5rem 0.5rem;
-}
-
-.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^="bottom"] .arrow::before {
- top: 0;
- border-bottom-color: rgba(0, 0, 0, 0.25);
-}
-
-
-.bs-popover-bottom .arrow::after,
-.bs-popover-auto[x-placement^="bottom"] .arrow::after {
- top: 1px;
- border-bottom-color: #fff;
-}
-
-.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before {
- position: absolute;
- top: 0;
- left: 50%;
- display: block;
- width: 1rem;
- margin-left: -0.5rem;
- content: "";
- border-bottom: 1px solid #f7f7f7;
-}
-
-.bs-popover-left, .bs-popover-auto[x-placement^="left"] {
- margin-right: 0.5rem;
-}
-
-.bs-popover-left .arrow, .bs-popover-auto[x-placement^="left"] .arrow {
- right: calc((0.5rem + 1px) * -1);
- width: 0.5rem;
- height: 1rem;
- margin: 0.3rem 0;
-}
-
-.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^="left"] .arrow::before,
-.bs-popover-left .arrow::after,
-.bs-popover-auto[x-placement^="left"] .arrow::after {
- border-width: 0.5rem 0 0.5rem 0.5rem;
-}
-
-.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^="left"] .arrow::before {
- right: 0;
- border-left-color: rgba(0, 0, 0, 0.25);
-}
-
-
-.bs-popover-left .arrow::after,
-.bs-popover-auto[x-placement^="left"] .arrow::after {
- right: 1px;
- border-left-color: #fff;
-}
-
-.popover-header {
- padding: 0.5rem 0.75rem;
- margin-bottom: 0;
- font-size: 0.81rem;
- color: inherit;
- background-color: #f7f7f7;
- border-bottom: 1px solid #ebebeb;
-}
-
-.popover-header:empty {
- display: none;
-}
-
-.popover-body {
- padding: 0.5rem 0.75rem;
- color: #212529;
-}
-
-.carousel {
- position: relative;
-}
-
-.carousel-inner {
- position: relative;
- width: 100%;
- overflow: hidden;
-}
-
-.carousel-item {
- position: relative;
- display: none;
- -ms-flex-align: center;
- align-items: center;
- width: 100%;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden;
- -webkit-perspective: 1000px;
- perspective: 1000px;
-}
-
-.carousel-item.active,
-.carousel-item-next,
-.carousel-item-prev {
- display: block;
- transition: -webkit-transform 0.6s ease;
- transition: transform 0.6s ease;
- transition: transform 0.6s ease, -webkit-transform 0.6s ease;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- .carousel-item.active,
- .carousel-item-next,
- .carousel-item-prev {
- transition: none;
- }
-}
-
-.carousel-item-next,
-.carousel-item-prev {
- position: absolute;
- top: 0;
-}
-
-.carousel-item-next.carousel-item-left,
-.carousel-item-prev.carousel-item-right {
- -webkit-transform: translateX(0);
- transform: translateX(0);
-}
-
-@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {
- .carousel-item-next.carousel-item-left,
- .carousel-item-prev.carousel-item-right {
- -webkit-transform: translate3d(0, 0, 0);
- transform: translate3d(0, 0, 0);
- }
-}
-
-.carousel-item-next,
-.active.carousel-item-right {
- -webkit-transform: translateX(100%);
- transform: translateX(100%);
-}
-
-@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {
- .carousel-item-next,
- .active.carousel-item-right {
- -webkit-transform: translate3d(100%, 0, 0);
- transform: translate3d(100%, 0, 0);
- }
-}
-
-.carousel-item-prev,
-.active.carousel-item-left {
- -webkit-transform: translateX(-100%);
- transform: translateX(-100%);
-}
-
-@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {
- .carousel-item-prev,
- .active.carousel-item-left {
- -webkit-transform: translate3d(-100%, 0, 0);
- transform: translate3d(-100%, 0, 0);
- }
-}
-
-.carousel-fade .carousel-item {
- opacity: 0;
- transition-duration: .6s;
- transition-property: opacity;
-}
-
-.carousel-fade .carousel-item.active,
-.carousel-fade .carousel-item-next.carousel-item-left,
-.carousel-fade .carousel-item-prev.carousel-item-right {
- opacity: 1;
-}
-
-.carousel-fade .active.carousel-item-left,
-.carousel-fade .active.carousel-item-right {
- opacity: 0;
-}
-
-.carousel-fade .carousel-item-next,
-.carousel-fade .carousel-item-prev,
-.carousel-fade .carousel-item.active,
-.carousel-fade .active.carousel-item-left,
-.carousel-fade .active.carousel-item-prev {
- -webkit-transform: translateX(0);
- transform: translateX(0);
-}
-
-@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {
- .carousel-fade .carousel-item-next,
- .carousel-fade .carousel-item-prev,
- .carousel-fade .carousel-item.active,
- .carousel-fade .active.carousel-item-left,
- .carousel-fade .active.carousel-item-prev {
- -webkit-transform: translate3d(0, 0, 0);
- transform: translate3d(0, 0, 0);
- }
-}
-
-.carousel-control-prev,
-.carousel-control-next {
- position: absolute;
- top: 0;
- bottom: 0;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: center;
- justify-content: center;
- width: 15%;
- color: #fff;
- text-align: center;
- opacity: 0.5;
-}
-
-.carousel-control-prev:hover, .carousel-control-prev:focus,
-.carousel-control-next:hover,
-.carousel-control-next:focus {
- color: #fff;
- text-decoration: none;
- outline: 0;
- opacity: .9;
-}
-
-.carousel-control-prev {
- left: 0;
-}
-
-.carousel-control-next {
- right: 0;
-}
-
-.carousel-control-prev-icon,
-.carousel-control-next-icon {
- display: inline-block;
- width: 20px;
- height: 20px;
- background: transparent no-repeat center center;
- background-size: 100% 100%;
-}
-
-.carousel-control-prev-icon {
- background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E");
-}
-
-.carousel-control-next-icon {
- background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E");
-}
-
-.carousel-indicators {
- position: absolute;
- right: 0;
- bottom: 10px;
- left: 0;
- z-index: 15;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-pack: center;
- justify-content: center;
- padding-left: 0;
- margin-right: 15%;
- margin-left: 15%;
- list-style: none;
-}
-
-.carousel-indicators li {
- position: relative;
- -ms-flex: 0 1 auto;
- flex: 0 1 auto;
- width: 30px;
- height: 3px;
- margin-right: 3px;
- margin-left: 3px;
- text-indent: -999px;
- cursor: pointer;
- background-color: rgba(255, 255, 255, 0.5);
-}
-
-.carousel-indicators li::before {
- position: absolute;
- top: -10px;
- left: 0;
- display: inline-block;
- width: 100%;
- height: 10px;
- content: "";
-}
-
-.carousel-indicators li::after {
- position: absolute;
- bottom: -10px;
- left: 0;
- display: inline-block;
- width: 100%;
- height: 10px;
- content: "";
-}
-
-.carousel-indicators .active {
- background-color: #fff;
-}
-
-.carousel-caption {
- position: absolute;
- right: 15%;
- bottom: 20px;
- left: 15%;
- z-index: 10;
- padding-top: 20px;
- padding-bottom: 20px;
- color: #fff;
- text-align: center;
-}
-
-.align-baseline {
- vertical-align: baseline !important;
-}
-
-.align-top {
- vertical-align: top !important;
-}
-
-.align-middle {
- vertical-align: middle !important;
-}
-
-.align-bottom {
- vertical-align: bottom !important;
-}
-
-.align-text-bottom {
- vertical-align: text-bottom !important;
-}
-
-.align-text-top {
- vertical-align: text-top !important;
-}
-
-.bg-primary {
- background-color: #3a59b1 !important;
-}
-
-a.bg-primary:hover, a.bg-primary:focus,
-button.bg-primary:hover,
-button.bg-primary:focus {
- background-color: #2d468b !important;
-}
-
-.bg-secondary {
- background-color: #6c757d !important;
-}
-
-a.bg-secondary:hover, a.bg-secondary:focus,
-button.bg-secondary:hover,
-button.bg-secondary:focus {
- background-color: #545b62 !important;
-}
-
-.bg-success {
- background-color: #22b24c !important;
-}
-
-a.bg-success:hover, a.bg-success:focus,
-button.bg-success:hover,
-button.bg-success:focus {
- background-color: #1a873a !important;
-}
-
-.bg-info {
- background-color: yellow !important;
-}
-
-a.bg-info:hover, a.bg-info:focus,
-button.bg-info:hover,
-button.bg-info:focus {
- background-color: #cccc00 !important;
-}
-
-.bg-warning {
- background-color: #ffc107 !important;
-}
-
-a.bg-warning:hover, a.bg-warning:focus,
-button.bg-warning:hover,
-button.bg-warning:focus {
- background-color: #d39e00 !important;
-}
-
-.bg-danger {
- background-color: #fc3434 !important;
-}
-
-a.bg-danger:hover, a.bg-danger:focus,
-button.bg-danger:hover,
-button.bg-danger:focus {
- background-color: #f90404 !important;
-}
-
-.bg-light {
- background-color: white !important;
-}
-
-a.bg-light:hover, a.bg-light:focus,
-button.bg-light:hover,
-button.bg-light:focus {
- background-color: #e6e6e6 !important;
-}
-
-.bg-dark {
- background-color: #6a8ed3 !important;
-}
-
-a.bg-dark:hover, a.bg-dark:focus,
-button.bg-dark:hover,
-button.bg-dark:focus {
- background-color: #4370c7 !important;
-}
-
-.bg-white {
- background-color: #fff !important;
-}
-
-.bg-transparent {
- background-color: transparent !important;
-}
-
-.border {
- border: 1px solid #dee2e6 !important;
-}
-
-.border-top {
- border-top: 1px solid #dee2e6 !important;
-}
-
-.border-right {
- border-right: 1px solid #dee2e6 !important;
-}
-
-.border-bottom {
- border-bottom: 1px solid #dee2e6 !important;
-}
-
-.border-left {
- border-left: 1px solid #dee2e6 !important;
-}
-
-.border-0 {
- border: 0 !important;
-}
-
-.border-top-0 {
- border-top: 0 !important;
-}
-
-.border-right-0 {
- border-right: 0 !important;
-}
-
-.border-bottom-0 {
- border-bottom: 0 !important;
-}
-
-.border-left-0 {
- border-left: 0 !important;
-}
-
-.border-primary {
- border-color: #3a59b1 !important;
-}
-
-.border-secondary {
- border-color: #6c757d !important;
-}
-
-.border-success {
- border-color: #22b24c !important;
-}
-
-.border-info {
- border-color: yellow !important;
-}
-
-.border-warning {
- border-color: #ffc107 !important;
-}
-
-.border-danger {
- border-color: #fc3434 !important;
-}
-
-.border-light {
- border-color: white !important;
-}
-
-.border-dark {
- border-color: #6a8ed3 !important;
-}
-
-.border-white {
- border-color: #fff !important;
-}
-
-.rounded {
- border-radius: 0.25rem !important;
-}
-
-.rounded-top {
- border-top-left-radius: 0.25rem !important;
- border-top-right-radius: 0.25rem !important;
-}
-
-.rounded-right {
- border-top-right-radius: 0.25rem !important;
- border-bottom-right-radius: 0.25rem !important;
-}
-
-.rounded-bottom {
- border-bottom-right-radius: 0.25rem !important;
- border-bottom-left-radius: 0.25rem !important;
-}
-
-.rounded-left {
- border-top-left-radius: 0.25rem !important;
- border-bottom-left-radius: 0.25rem !important;
-}
-
-.rounded-circle {
- border-radius: 50% !important;
-}
-
-.rounded-0 {
- border-radius: 0 !important;
-}
-
-.clearfix::after {
- display: block;
- clear: both;
- content: "";
-}
-
-.d-none {
- display: none !important;
-}
-
-.d-inline {
- display: inline !important;
-}
-
-.d-inline-block {
- display: inline-block !important;
-}
-
-.d-block {
- display: block !important;
-}
-
-.d-table {
- display: table !important;
-}
-
-.d-table-row {
- display: table-row !important;
-}
-
-.d-table-cell {
- display: table-cell !important;
-}
-
-.d-flex {
- display: -ms-flexbox !important;
- display: flex !important;
-}
-
-.d-inline-flex {
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
-}
-
-@media (min-width: 576px) {
- .d-sm-none {
- display: none !important;
- }
- .d-sm-inline {
- display: inline !important;
- }
- .d-sm-inline-block {
- display: inline-block !important;
- }
- .d-sm-block {
- display: block !important;
- }
- .d-sm-table {
- display: table !important;
- }
- .d-sm-table-row {
- display: table-row !important;
- }
- .d-sm-table-cell {
- display: table-cell !important;
- }
- .d-sm-flex {
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-sm-inline-flex {
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
- }
-}
-
-@media (min-width: 768px) {
- .d-md-none {
- display: none !important;
- }
- .d-md-inline {
- display: inline !important;
- }
- .d-md-inline-block {
- display: inline-block !important;
- }
- .d-md-block {
- display: block !important;
- }
- .d-md-table {
- display: table !important;
- }
- .d-md-table-row {
- display: table-row !important;
- }
- .d-md-table-cell {
- display: table-cell !important;
- }
- .d-md-flex {
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-md-inline-flex {
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
- }
-}
-
-@media (min-width: 992px) {
- .d-lg-none {
- display: none !important;
- }
- .d-lg-inline {
- display: inline !important;
- }
- .d-lg-inline-block {
- display: inline-block !important;
- }
- .d-lg-block {
- display: block !important;
- }
- .d-lg-table {
- display: table !important;
- }
- .d-lg-table-row {
- display: table-row !important;
- }
- .d-lg-table-cell {
- display: table-cell !important;
- }
- .d-lg-flex {
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-lg-inline-flex {
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
- }
-}
-
-@media (min-width: 1200px) {
- .d-xl-none {
- display: none !important;
- }
- .d-xl-inline {
- display: inline !important;
- }
- .d-xl-inline-block {
- display: inline-block !important;
- }
- .d-xl-block {
- display: block !important;
- }
- .d-xl-table {
- display: table !important;
- }
- .d-xl-table-row {
- display: table-row !important;
- }
- .d-xl-table-cell {
- display: table-cell !important;
- }
- .d-xl-flex {
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-xl-inline-flex {
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
- }
-}
-
-@media print {
- .d-print-none {
- display: none !important;
- }
- .d-print-inline {
- display: inline !important;
- }
- .d-print-inline-block {
- display: inline-block !important;
- }
- .d-print-block {
- display: block !important;
- }
- .d-print-table {
- display: table !important;
- }
- .d-print-table-row {
- display: table-row !important;
- }
- .d-print-table-cell {
- display: table-cell !important;
- }
- .d-print-flex {
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-print-inline-flex {
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
- }
-}
-
-.embed-responsive {
- position: relative;
- display: block;
- width: 100%;
- padding: 0;
- overflow: hidden;
-}
-
-.embed-responsive::before {
- display: block;
- content: "";
-}
-
-.embed-responsive .embed-responsive-item,
-.embed-responsive iframe,
-.embed-responsive embed,
-.embed-responsive object,
-.embed-responsive video {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 100%;
- border: 0;
-}
-
-.embed-responsive-21by9::before {
- padding-top: 42.857143%;
-}
-
-.embed-responsive-16by9::before {
- padding-top: 56.25%;
-}
-
-.embed-responsive-4by3::before {
- padding-top: 75%;
-}
-
-.embed-responsive-1by1::before {
- padding-top: 100%;
-}
-
-.flex-row {
- -ms-flex-direction: row !important;
- flex-direction: row !important;
-}
-
-.flex-column {
- -ms-flex-direction: column !important;
- flex-direction: column !important;
-}
-
-.flex-row-reverse {
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
-}
-
-.flex-column-reverse {
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
-}
-
-.flex-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
-}
-
-.flex-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
-}
-
-.flex-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
-}
-
-.flex-fill {
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
-}
-
-.flex-grow-0 {
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
-}
-
-.flex-grow-1 {
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
-}
-
-.flex-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
-}
-
-.flex-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
-}
-
-.justify-content-start {
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
-}
-
-.justify-content-end {
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
-}
-
-.justify-content-center {
- -ms-flex-pack: center !important;
- justify-content: center !important;
-}
-
-.justify-content-between {
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
-}
-
-.justify-content-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
-}
-
-.align-items-start {
- -ms-flex-align: start !important;
- align-items: flex-start !important;
-}
-
-.align-items-end {
- -ms-flex-align: end !important;
- align-items: flex-end !important;
-}
-
-.align-items-center {
- -ms-flex-align: center !important;
- align-items: center !important;
-}
-
-.align-items-baseline {
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
-}
-
-.align-items-stretch {
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
-}
-
-.align-content-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
-}
-
-.align-content-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
-}
-
-.align-content-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
-}
-
-.align-content-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
-}
-
-.align-content-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
-}
-
-.align-content-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
-}
-
-.align-self-auto {
- -ms-flex-item-align: auto !important;
- align-self: auto !important;
-}
-
-.align-self-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
-}
-
-.align-self-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
-}
-
-.align-self-center {
- -ms-flex-item-align: center !important;
- align-self: center !important;
-}
-
-.align-self-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
-}
-
-.align-self-stretch {
- -ms-flex-item-align: stretch !important;
- align-self: stretch !important;
-}
-
-@media (min-width: 576px) {
- .flex-sm-row {
- -ms-flex-direction: row !important;
- flex-direction: row !important;
- }
- .flex-sm-column {
- -ms-flex-direction: column !important;
- flex-direction: column !important;
- }
- .flex-sm-row-reverse {
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
- }
- .flex-sm-column-reverse {
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
- }
- .flex-sm-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
- }
- .flex-sm-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
- }
- .flex-sm-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
- }
- .flex-sm-fill {
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
- }
- .flex-sm-grow-0 {
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
- }
- .flex-sm-grow-1 {
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
- }
- .flex-sm-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
- }
- .flex-sm-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
- }
- .justify-content-sm-start {
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
- }
- .justify-content-sm-end {
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
- }
- .justify-content-sm-center {
- -ms-flex-pack: center !important;
- justify-content: center !important;
- }
- .justify-content-sm-between {
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
- }
- .justify-content-sm-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
- }
- .align-items-sm-start {
- -ms-flex-align: start !important;
- align-items: flex-start !important;
- }
- .align-items-sm-end {
- -ms-flex-align: end !important;
- align-items: flex-end !important;
- }
- .align-items-sm-center {
- -ms-flex-align: center !important;
- align-items: center !important;
- }
- .align-items-sm-baseline {
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
- }
- .align-items-sm-stretch {
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
- }
- .align-content-sm-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
- }
- .align-content-sm-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
- }
- .align-content-sm-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
- }
- .align-content-sm-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
- }
- .align-content-sm-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
- }
- .align-content-sm-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
- }
- .align-self-sm-auto {
- -ms-flex-item-align: auto !important;
- align-self: auto !important;
- }
- .align-self-sm-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
- }
- .align-self-sm-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
- }
- .align-self-sm-center {
- -ms-flex-item-align: center !important;
- align-self: center !important;
- }
- .align-self-sm-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
- }
- .align-self-sm-stretch {
- -ms-flex-item-align: stretch !important;
- align-self: stretch !important;
- }
-}
-
-@media (min-width: 768px) {
- .flex-md-row {
- -ms-flex-direction: row !important;
- flex-direction: row !important;
- }
- .flex-md-column {
- -ms-flex-direction: column !important;
- flex-direction: column !important;
- }
- .flex-md-row-reverse {
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
- }
- .flex-md-column-reverse {
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
- }
- .flex-md-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
- }
- .flex-md-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
- }
- .flex-md-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
- }
- .flex-md-fill {
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
- }
- .flex-md-grow-0 {
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
- }
- .flex-md-grow-1 {
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
- }
- .flex-md-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
- }
- .flex-md-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
- }
- .justify-content-md-start {
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
- }
- .justify-content-md-end {
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
- }
- .justify-content-md-center {
- -ms-flex-pack: center !important;
- justify-content: center !important;
- }
- .justify-content-md-between {
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
- }
- .justify-content-md-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
- }
- .align-items-md-start {
- -ms-flex-align: start !important;
- align-items: flex-start !important;
- }
- .align-items-md-end {
- -ms-flex-align: end !important;
- align-items: flex-end !important;
- }
- .align-items-md-center {
- -ms-flex-align: center !important;
- align-items: center !important;
- }
- .align-items-md-baseline {
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
- }
- .align-items-md-stretch {
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
- }
- .align-content-md-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
- }
- .align-content-md-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
- }
- .align-content-md-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
- }
- .align-content-md-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
- }
- .align-content-md-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
- }
- .align-content-md-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
- }
- .align-self-md-auto {
- -ms-flex-item-align: auto !important;
- align-self: auto !important;
- }
- .align-self-md-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
- }
- .align-self-md-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
- }
- .align-self-md-center {
- -ms-flex-item-align: center !important;
- align-self: center !important;
- }
- .align-self-md-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
- }
- .align-self-md-stretch {
- -ms-flex-item-align: stretch !important;
- align-self: stretch !important;
- }
-}
-
-@media (min-width: 992px) {
- .flex-lg-row {
- -ms-flex-direction: row !important;
- flex-direction: row !important;
- }
- .flex-lg-column {
- -ms-flex-direction: column !important;
- flex-direction: column !important;
- }
- .flex-lg-row-reverse {
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
- }
- .flex-lg-column-reverse {
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
- }
- .flex-lg-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
- }
- .flex-lg-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
- }
- .flex-lg-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
- }
- .flex-lg-fill {
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
- }
- .flex-lg-grow-0 {
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
- }
- .flex-lg-grow-1 {
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
- }
- .flex-lg-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
- }
- .flex-lg-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
- }
- .justify-content-lg-start {
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
- }
- .justify-content-lg-end {
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
- }
- .justify-content-lg-center {
- -ms-flex-pack: center !important;
- justify-content: center !important;
- }
- .justify-content-lg-between {
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
- }
- .justify-content-lg-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
- }
- .align-items-lg-start {
- -ms-flex-align: start !important;
- align-items: flex-start !important;
- }
- .align-items-lg-end {
- -ms-flex-align: end !important;
- align-items: flex-end !important;
- }
- .align-items-lg-center {
- -ms-flex-align: center !important;
- align-items: center !important;
- }
- .align-items-lg-baseline {
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
- }
- .align-items-lg-stretch {
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
- }
- .align-content-lg-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
- }
- .align-content-lg-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
- }
- .align-content-lg-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
- }
- .align-content-lg-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
- }
- .align-content-lg-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
- }
- .align-content-lg-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
- }
- .align-self-lg-auto {
- -ms-flex-item-align: auto !important;
- align-self: auto !important;
- }
- .align-self-lg-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
- }
- .align-self-lg-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
- }
- .align-self-lg-center {
- -ms-flex-item-align: center !important;
- align-self: center !important;
- }
- .align-self-lg-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
- }
- .align-self-lg-stretch {
- -ms-flex-item-align: stretch !important;
- align-self: stretch !important;
- }
-}
-
-@media (min-width: 1200px) {
- .flex-xl-row {
- -ms-flex-direction: row !important;
- flex-direction: row !important;
- }
- .flex-xl-column {
- -ms-flex-direction: column !important;
- flex-direction: column !important;
- }
- .flex-xl-row-reverse {
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
- }
- .flex-xl-column-reverse {
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
- }
- .flex-xl-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
- }
- .flex-xl-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
- }
- .flex-xl-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
- }
- .flex-xl-fill {
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
- }
- .flex-xl-grow-0 {
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
- }
- .flex-xl-grow-1 {
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
- }
- .flex-xl-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
- }
- .flex-xl-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
- }
- .justify-content-xl-start {
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
- }
- .justify-content-xl-end {
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
- }
- .justify-content-xl-center {
- -ms-flex-pack: center !important;
- justify-content: center !important;
- }
- .justify-content-xl-between {
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
- }
- .justify-content-xl-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
- }
- .align-items-xl-start {
- -ms-flex-align: start !important;
- align-items: flex-start !important;
- }
- .align-items-xl-end {
- -ms-flex-align: end !important;
- align-items: flex-end !important;
- }
- .align-items-xl-center {
- -ms-flex-align: center !important;
- align-items: center !important;
- }
- .align-items-xl-baseline {
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
- }
- .align-items-xl-stretch {
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
- }
- .align-content-xl-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
- }
- .align-content-xl-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
- }
- .align-content-xl-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
- }
- .align-content-xl-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
- }
- .align-content-xl-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
- }
- .align-content-xl-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
- }
- .align-self-xl-auto {
- -ms-flex-item-align: auto !important;
- align-self: auto !important;
- }
- .align-self-xl-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
- }
- .align-self-xl-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
- }
- .align-self-xl-center {
- -ms-flex-item-align: center !important;
- align-self: center !important;
- }
- .align-self-xl-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
- }
- .align-self-xl-stretch {
- -ms-flex-item-align: stretch !important;
- align-self: stretch !important;
- }
-}
-
-.float-left {
- float: left !important;
-}
-
-.float-right {
- float: right !important;
-}
-
-.float-none {
- float: none !important;
-}
-
-@media (min-width: 576px) {
- .float-sm-left {
- float: left !important;
- }
- .float-sm-right {
- float: right !important;
- }
- .float-sm-none {
- float: none !important;
- }
-}
-
-@media (min-width: 768px) {
- .float-md-left {
- float: left !important;
- }
- .float-md-right {
- float: right !important;
- }
- .float-md-none {
- float: none !important;
- }
-}
-
-@media (min-width: 992px) {
- .float-lg-left {
- float: left !important;
- }
- .float-lg-right {
- float: right !important;
- }
- .float-lg-none {
- float: none !important;
- }
-}
-
-@media (min-width: 1200px) {
- .float-xl-left {
- float: left !important;
- }
- .float-xl-right {
- float: right !important;
- }
- .float-xl-none {
- float: none !important;
- }
-}
-
-.position-static {
- position: static !important;
-}
-
-.position-relative {
- position: relative !important;
-}
-
-.position-absolute {
- position: absolute !important;
-}
-
-.position-fixed {
- position: fixed !important;
-}
-
-.position-sticky {
- position: -webkit-sticky !important;
- position: sticky !important;
-}
-
-.fixed-top {
- position: fixed;
- top: 0;
- right: 0;
- left: 0;
- z-index: 1030;
-}
-
-.fixed-bottom {
- position: fixed;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1030;
-}
-
-@supports ((position: -webkit-sticky) or (position: sticky)) {
- .sticky-top {
- position: -webkit-sticky;
- position: sticky;
- top: 0;
- z-index: 1020;
- }
-}
-
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- padding: 0;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- white-space: nowrap;
- border: 0;
-}
-
-.sr-only-focusable:active, .sr-only-focusable:focus {
- position: static;
- width: auto;
- height: auto;
- overflow: visible;
- clip: auto;
- white-space: normal;
-}
-
-.shadow-sm {
- box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
-}
-
-.shadow {
- box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
-}
-
-.shadow-lg {
- box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
-}
-
-.shadow-none {
- box-shadow: none !important;
-}
-
-.w-25 {
- width: 25% !important;
-}
-
-.w-50 {
- width: 50% !important;
-}
-
-.w-75 {
- width: 75% !important;
-}
-
-.w-100 {
- width: 100% !important;
-}
-
-.w-auto {
- width: auto !important;
-}
-
-.h-25 {
- height: 25% !important;
-}
-
-.h-50 {
- height: 50% !important;
-}
-
-.h-75 {
- height: 75% !important;
-}
-
-.h-100 {
- height: 100% !important;
-}
-
-.h-auto {
- height: auto !important;
-}
-
-.mw-100 {
- max-width: 100% !important;
-}
-
-.mh-100 {
- max-height: 100% !important;
-}
-
-.m-0 {
- margin: 0 !important;
-}
-
-.mt-0,
-.my-0 {
- margin-top: 0 !important;
-}
-
-.mr-0,
-.mx-0 {
- margin-right: 0 !important;
-}
-
-.mb-0,
-.my-0 {
- margin-bottom: 0 !important;
-}
-
-.ml-0,
-.mx-0 {
- margin-left: 0 !important;
-}
-
-.m-1 {
- margin: 0.25rem !important;
-}
-
-.mt-1,
-.my-1 {
- margin-top: 0.25rem !important;
-}
-
-.mr-1,
-.mx-1 {
- margin-right: 0.25rem !important;
-}
-
-.mb-1,
-.my-1 {
- margin-bottom: 0.25rem !important;
-}
-
-.ml-1,
-.mx-1 {
- margin-left: 0.25rem !important;
-}
-
-.m-2 {
- margin: 0.5rem !important;
-}
-
-.mt-2,
-.my-2 {
- margin-top: 0.5rem !important;
-}
-
-.mr-2,
-.mx-2 {
- margin-right: 0.5rem !important;
-}
-
-.mb-2,
-.my-2 {
- margin-bottom: 0.5rem !important;
-}
-
-.ml-2,
-.mx-2 {
- margin-left: 0.5rem !important;
-}
-
-.m-3 {
- margin: 1rem !important;
-}
-
-.mt-3,
-.my-3 {
- margin-top: 1rem !important;
-}
-
-.mr-3,
-.mx-3 {
- margin-right: 1rem !important;
-}
-
-.mb-3,
-.my-3 {
- margin-bottom: 1rem !important;
-}
-
-.ml-3,
-.mx-3 {
- margin-left: 1rem !important;
-}
-
-.m-4 {
- margin: 1.5rem !important;
-}
-
-.mt-4,
-.my-4 {
- margin-top: 1.5rem !important;
-}
-
-.mr-4,
-.mx-4 {
- margin-right: 1.5rem !important;
-}
-
-.mb-4,
-.my-4 {
- margin-bottom: 1.5rem !important;
-}
-
-.ml-4,
-.mx-4 {
- margin-left: 1.5rem !important;
-}
-
-.m-5 {
- margin: 3rem !important;
-}
-
-.mt-5,
-.my-5 {
- margin-top: 3rem !important;
-}
-
-.mr-5,
-.mx-5 {
- margin-right: 3rem !important;
-}
-
-.mb-5,
-.my-5 {
- margin-bottom: 3rem !important;
-}
-
-.ml-5,
-.mx-5 {
- margin-left: 3rem !important;
-}
-
-.p-0 {
- padding: 0 !important;
-}
-
-.pt-0,
-.py-0 {
- padding-top: 0 !important;
-}
-
-.pr-0,
-.px-0 {
- padding-right: 0 !important;
-}
-
-.pb-0,
-.py-0 {
- padding-bottom: 0 !important;
-}
-
-.pl-0,
-.px-0 {
- padding-left: 0 !important;
-}
-
-.p-1 {
- padding: 0.25rem !important;
-}
-
-.pt-1,
-.py-1 {
- padding-top: 0.25rem !important;
-}
-
-.pr-1,
-.px-1 {
- padding-right: 0.25rem !important;
-}
-
-.pb-1,
-.py-1 {
- padding-bottom: 0.25rem !important;
-}
-
-.pl-1,
-.px-1 {
- padding-left: 0.25rem !important;
-}
-
-.p-2 {
- padding: 0.5rem !important;
-}
-
-.pt-2,
-.py-2 {
- padding-top: 0.5rem !important;
-}
-
-.pr-2,
-.px-2 {
- padding-right: 0.5rem !important;
-}
-
-.pb-2,
-.py-2 {
- padding-bottom: 0.5rem !important;
-}
-
-.pl-2,
-.px-2 {
- padding-left: 0.5rem !important;
-}
-
-.p-3 {
- padding: 1rem !important;
-}
-
-.pt-3,
-.py-3 {
- padding-top: 1rem !important;
-}
-
-.pr-3,
-.px-3 {
- padding-right: 1rem !important;
-}
-
-.pb-3,
-.py-3 {
- padding-bottom: 1rem !important;
-}
-
-.pl-3,
-.px-3 {
- padding-left: 1rem !important;
-}
-
-.p-4 {
- padding: 1.5rem !important;
-}
-
-.pt-4,
-.py-4 {
- padding-top: 1.5rem !important;
-}
-
-.pr-4,
-.px-4 {
- padding-right: 1.5rem !important;
-}
-
-.pb-4,
-.py-4 {
- padding-bottom: 1.5rem !important;
-}
-
-.pl-4,
-.px-4 {
- padding-left: 1.5rem !important;
-}
-
-.p-5 {
- padding: 3rem !important;
-}
-
-.pt-5,
-.py-5 {
- padding-top: 3rem !important;
-}
-
-.pr-5,
-.px-5 {
- padding-right: 3rem !important;
-}
-
-.pb-5,
-.py-5 {
- padding-bottom: 3rem !important;
-}
-
-.pl-5,
-.px-5 {
- padding-left: 3rem !important;
-}
-
-.m-auto {
- margin: auto !important;
-}
-
-.mt-auto,
-.my-auto {
- margin-top: auto !important;
-}
-
-.mr-auto,
-.mx-auto {
- margin-right: auto !important;
-}
-
-.mb-auto,
-.my-auto {
- margin-bottom: auto !important;
-}
-
-.ml-auto,
-.mx-auto {
- margin-left: auto !important;
-}
-
-@media (min-width: 576px) {
- .m-sm-0 {
- margin: 0 !important;
- }
- .mt-sm-0,
- .my-sm-0 {
- margin-top: 0 !important;
- }
- .mr-sm-0,
- .mx-sm-0 {
- margin-right: 0 !important;
- }
- .mb-sm-0,
- .my-sm-0 {
- margin-bottom: 0 !important;
- }
- .ml-sm-0,
- .mx-sm-0 {
- margin-left: 0 !important;
- }
- .m-sm-1 {
- margin: 0.25rem !important;
- }
- .mt-sm-1,
- .my-sm-1 {
- margin-top: 0.25rem !important;
- }
- .mr-sm-1,
- .mx-sm-1 {
- margin-right: 0.25rem !important;
- }
- .mb-sm-1,
- .my-sm-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-sm-1,
- .mx-sm-1 {
- margin-left: 0.25rem !important;
- }
- .m-sm-2 {
- margin: 0.5rem !important;
- }
- .mt-sm-2,
- .my-sm-2 {
- margin-top: 0.5rem !important;
- }
- .mr-sm-2,
- .mx-sm-2 {
- margin-right: 0.5rem !important;
- }
- .mb-sm-2,
- .my-sm-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-sm-2,
- .mx-sm-2 {
- margin-left: 0.5rem !important;
- }
- .m-sm-3 {
- margin: 1rem !important;
- }
- .mt-sm-3,
- .my-sm-3 {
- margin-top: 1rem !important;
- }
- .mr-sm-3,
- .mx-sm-3 {
- margin-right: 1rem !important;
- }
- .mb-sm-3,
- .my-sm-3 {
- margin-bottom: 1rem !important;
- }
- .ml-sm-3,
- .mx-sm-3 {
- margin-left: 1rem !important;
- }
- .m-sm-4 {
- margin: 1.5rem !important;
- }
- .mt-sm-4,
- .my-sm-4 {
- margin-top: 1.5rem !important;
- }
- .mr-sm-4,
- .mx-sm-4 {
- margin-right: 1.5rem !important;
- }
- .mb-sm-4,
- .my-sm-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-sm-4,
- .mx-sm-4 {
- margin-left: 1.5rem !important;
- }
- .m-sm-5 {
- margin: 3rem !important;
- }
- .mt-sm-5,
- .my-sm-5 {
- margin-top: 3rem !important;
- }
- .mr-sm-5,
- .mx-sm-5 {
- margin-right: 3rem !important;
- }
- .mb-sm-5,
- .my-sm-5 {
- margin-bottom: 3rem !important;
- }
- .ml-sm-5,
- .mx-sm-5 {
- margin-left: 3rem !important;
- }
- .p-sm-0 {
- padding: 0 !important;
- }
- .pt-sm-0,
- .py-sm-0 {
- padding-top: 0 !important;
- }
- .pr-sm-0,
- .px-sm-0 {
- padding-right: 0 !important;
- }
- .pb-sm-0,
- .py-sm-0 {
- padding-bottom: 0 !important;
- }
- .pl-sm-0,
- .px-sm-0 {
- padding-left: 0 !important;
- }
- .p-sm-1 {
- padding: 0.25rem !important;
- }
- .pt-sm-1,
- .py-sm-1 {
- padding-top: 0.25rem !important;
- }
- .pr-sm-1,
- .px-sm-1 {
- padding-right: 0.25rem !important;
- }
- .pb-sm-1,
- .py-sm-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-sm-1,
- .px-sm-1 {
- padding-left: 0.25rem !important;
- }
- .p-sm-2 {
- padding: 0.5rem !important;
- }
- .pt-sm-2,
- .py-sm-2 {
- padding-top: 0.5rem !important;
- }
- .pr-sm-2,
- .px-sm-2 {
- padding-right: 0.5rem !important;
- }
- .pb-sm-2,
- .py-sm-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-sm-2,
- .px-sm-2 {
- padding-left: 0.5rem !important;
- }
- .p-sm-3 {
- padding: 1rem !important;
- }
- .pt-sm-3,
- .py-sm-3 {
- padding-top: 1rem !important;
- }
- .pr-sm-3,
- .px-sm-3 {
- padding-right: 1rem !important;
- }
- .pb-sm-3,
- .py-sm-3 {
- padding-bottom: 1rem !important;
- }
- .pl-sm-3,
- .px-sm-3 {
- padding-left: 1rem !important;
- }
- .p-sm-4 {
- padding: 1.5rem !important;
- }
- .pt-sm-4,
- .py-sm-4 {
- padding-top: 1.5rem !important;
- }
- .pr-sm-4,
- .px-sm-4 {
- padding-right: 1.5rem !important;
- }
- .pb-sm-4,
- .py-sm-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-sm-4,
- .px-sm-4 {
- padding-left: 1.5rem !important;
- }
- .p-sm-5 {
- padding: 3rem !important;
- }
- .pt-sm-5,
- .py-sm-5 {
- padding-top: 3rem !important;
- }
- .pr-sm-5,
- .px-sm-5 {
- padding-right: 3rem !important;
- }
- .pb-sm-5,
- .py-sm-5 {
- padding-bottom: 3rem !important;
- }
- .pl-sm-5,
- .px-sm-5 {
- padding-left: 3rem !important;
- }
- .m-sm-auto {
- margin: auto !important;
- }
- .mt-sm-auto,
- .my-sm-auto {
- margin-top: auto !important;
- }
- .mr-sm-auto,
- .mx-sm-auto {
- margin-right: auto !important;
- }
- .mb-sm-auto,
- .my-sm-auto {
- margin-bottom: auto !important;
- }
- .ml-sm-auto,
- .mx-sm-auto {
- margin-left: auto !important;
- }
-}
-
-@media (min-width: 768px) {
- .m-md-0 {
- margin: 0 !important;
- }
- .mt-md-0,
- .my-md-0 {
- margin-top: 0 !important;
- }
- .mr-md-0,
- .mx-md-0 {
- margin-right: 0 !important;
- }
- .mb-md-0,
- .my-md-0 {
- margin-bottom: 0 !important;
- }
- .ml-md-0,
- .mx-md-0 {
- margin-left: 0 !important;
- }
- .m-md-1 {
- margin: 0.25rem !important;
- }
- .mt-md-1,
- .my-md-1 {
- margin-top: 0.25rem !important;
- }
- .mr-md-1,
- .mx-md-1 {
- margin-right: 0.25rem !important;
- }
- .mb-md-1,
- .my-md-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-md-1,
- .mx-md-1 {
- margin-left: 0.25rem !important;
- }
- .m-md-2 {
- margin: 0.5rem !important;
- }
- .mt-md-2,
- .my-md-2 {
- margin-top: 0.5rem !important;
- }
- .mr-md-2,
- .mx-md-2 {
- margin-right: 0.5rem !important;
- }
- .mb-md-2,
- .my-md-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-md-2,
- .mx-md-2 {
- margin-left: 0.5rem !important;
- }
- .m-md-3 {
- margin: 1rem !important;
- }
- .mt-md-3,
- .my-md-3 {
- margin-top: 1rem !important;
- }
- .mr-md-3,
- .mx-md-3 {
- margin-right: 1rem !important;
- }
- .mb-md-3,
- .my-md-3 {
- margin-bottom: 1rem !important;
- }
- .ml-md-3,
- .mx-md-3 {
- margin-left: 1rem !important;
- }
- .m-md-4 {
- margin: 1.5rem !important;
- }
- .mt-md-4,
- .my-md-4 {
- margin-top: 1.5rem !important;
- }
- .mr-md-4,
- .mx-md-4 {
- margin-right: 1.5rem !important;
- }
- .mb-md-4,
- .my-md-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-md-4,
- .mx-md-4 {
- margin-left: 1.5rem !important;
- }
- .m-md-5 {
- margin: 3rem !important;
- }
- .mt-md-5,
- .my-md-5 {
- margin-top: 3rem !important;
- }
- .mr-md-5,
- .mx-md-5 {
- margin-right: 3rem !important;
- }
- .mb-md-5,
- .my-md-5 {
- margin-bottom: 3rem !important;
- }
- .ml-md-5,
- .mx-md-5 {
- margin-left: 3rem !important;
- }
- .p-md-0 {
- padding: 0 !important;
- }
- .pt-md-0,
- .py-md-0 {
- padding-top: 0 !important;
- }
- .pr-md-0,
- .px-md-0 {
- padding-right: 0 !important;
- }
- .pb-md-0,
- .py-md-0 {
- padding-bottom: 0 !important;
- }
- .pl-md-0,
- .px-md-0 {
- padding-left: 0 !important;
- }
- .p-md-1 {
- padding: 0.25rem !important;
- }
- .pt-md-1,
- .py-md-1 {
- padding-top: 0.25rem !important;
- }
- .pr-md-1,
- .px-md-1 {
- padding-right: 0.25rem !important;
- }
- .pb-md-1,
- .py-md-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-md-1,
- .px-md-1 {
- padding-left: 0.25rem !important;
- }
- .p-md-2 {
- padding: 0.5rem !important;
- }
- .pt-md-2,
- .py-md-2 {
- padding-top: 0.5rem !important;
- }
- .pr-md-2,
- .px-md-2 {
- padding-right: 0.5rem !important;
- }
- .pb-md-2,
- .py-md-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-md-2,
- .px-md-2 {
- padding-left: 0.5rem !important;
- }
- .p-md-3 {
- padding: 1rem !important;
- }
- .pt-md-3,
- .py-md-3 {
- padding-top: 1rem !important;
- }
- .pr-md-3,
- .px-md-3 {
- padding-right: 1rem !important;
- }
- .pb-md-3,
- .py-md-3 {
- padding-bottom: 1rem !important;
- }
- .pl-md-3,
- .px-md-3 {
- padding-left: 1rem !important;
- }
- .p-md-4 {
- padding: 1.5rem !important;
- }
- .pt-md-4,
- .py-md-4 {
- padding-top: 1.5rem !important;
- }
- .pr-md-4,
- .px-md-4 {
- padding-right: 1.5rem !important;
- }
- .pb-md-4,
- .py-md-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-md-4,
- .px-md-4 {
- padding-left: 1.5rem !important;
- }
- .p-md-5 {
- padding: 3rem !important;
- }
- .pt-md-5,
- .py-md-5 {
- padding-top: 3rem !important;
- }
- .pr-md-5,
- .px-md-5 {
- padding-right: 3rem !important;
- }
- .pb-md-5,
- .py-md-5 {
- padding-bottom: 3rem !important;
- }
- .pl-md-5,
- .px-md-5 {
- padding-left: 3rem !important;
- }
- .m-md-auto {
- margin: auto !important;
- }
- .mt-md-auto,
- .my-md-auto {
- margin-top: auto !important;
- }
- .mr-md-auto,
- .mx-md-auto {
- margin-right: auto !important;
- }
- .mb-md-auto,
- .my-md-auto {
- margin-bottom: auto !important;
- }
- .ml-md-auto,
- .mx-md-auto {
- margin-left: auto !important;
- }
-}
-
-@media (min-width: 992px) {
- .m-lg-0 {
- margin: 0 !important;
- }
- .mt-lg-0,
- .my-lg-0 {
- margin-top: 0 !important;
- }
- .mr-lg-0,
- .mx-lg-0 {
- margin-right: 0 !important;
- }
- .mb-lg-0,
- .my-lg-0 {
- margin-bottom: 0 !important;
- }
- .ml-lg-0,
- .mx-lg-0 {
- margin-left: 0 !important;
- }
- .m-lg-1 {
- margin: 0.25rem !important;
- }
- .mt-lg-1,
- .my-lg-1 {
- margin-top: 0.25rem !important;
- }
- .mr-lg-1,
- .mx-lg-1 {
- margin-right: 0.25rem !important;
- }
- .mb-lg-1,
- .my-lg-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-lg-1,
- .mx-lg-1 {
- margin-left: 0.25rem !important;
- }
- .m-lg-2 {
- margin: 0.5rem !important;
- }
- .mt-lg-2,
- .my-lg-2 {
- margin-top: 0.5rem !important;
- }
- .mr-lg-2,
- .mx-lg-2 {
- margin-right: 0.5rem !important;
- }
- .mb-lg-2,
- .my-lg-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-lg-2,
- .mx-lg-2 {
- margin-left: 0.5rem !important;
- }
- .m-lg-3 {
- margin: 1rem !important;
- }
- .mt-lg-3,
- .my-lg-3 {
- margin-top: 1rem !important;
- }
- .mr-lg-3,
- .mx-lg-3 {
- margin-right: 1rem !important;
- }
- .mb-lg-3,
- .my-lg-3 {
- margin-bottom: 1rem !important;
- }
- .ml-lg-3,
- .mx-lg-3 {
- margin-left: 1rem !important;
- }
- .m-lg-4 {
- margin: 1.5rem !important;
- }
- .mt-lg-4,
- .my-lg-4 {
- margin-top: 1.5rem !important;
- }
- .mr-lg-4,
- .mx-lg-4 {
- margin-right: 1.5rem !important;
- }
- .mb-lg-4,
- .my-lg-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-lg-4,
- .mx-lg-4 {
- margin-left: 1.5rem !important;
- }
- .m-lg-5 {
- margin: 3rem !important;
- }
- .mt-lg-5,
- .my-lg-5 {
- margin-top: 3rem !important;
- }
- .mr-lg-5,
- .mx-lg-5 {
- margin-right: 3rem !important;
- }
- .mb-lg-5,
- .my-lg-5 {
- margin-bottom: 3rem !important;
- }
- .ml-lg-5,
- .mx-lg-5 {
- margin-left: 3rem !important;
- }
- .p-lg-0 {
- padding: 0 !important;
- }
- .pt-lg-0,
- .py-lg-0 {
- padding-top: 0 !important;
- }
- .pr-lg-0,
- .px-lg-0 {
- padding-right: 0 !important;
- }
- .pb-lg-0,
- .py-lg-0 {
- padding-bottom: 0 !important;
- }
- .pl-lg-0,
- .px-lg-0 {
- padding-left: 0 !important;
- }
- .p-lg-1 {
- padding: 0.25rem !important;
- }
- .pt-lg-1,
- .py-lg-1 {
- padding-top: 0.25rem !important;
- }
- .pr-lg-1,
- .px-lg-1 {
- padding-right: 0.25rem !important;
- }
- .pb-lg-1,
- .py-lg-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-lg-1,
- .px-lg-1 {
- padding-left: 0.25rem !important;
- }
- .p-lg-2 {
- padding: 0.5rem !important;
- }
- .pt-lg-2,
- .py-lg-2 {
- padding-top: 0.5rem !important;
- }
- .pr-lg-2,
- .px-lg-2 {
- padding-right: 0.5rem !important;
- }
- .pb-lg-2,
- .py-lg-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-lg-2,
- .px-lg-2 {
- padding-left: 0.5rem !important;
- }
- .p-lg-3 {
- padding: 1rem !important;
- }
- .pt-lg-3,
- .py-lg-3 {
- padding-top: 1rem !important;
- }
- .pr-lg-3,
- .px-lg-3 {
- padding-right: 1rem !important;
- }
- .pb-lg-3,
- .py-lg-3 {
- padding-bottom: 1rem !important;
- }
- .pl-lg-3,
- .px-lg-3 {
- padding-left: 1rem !important;
- }
- .p-lg-4 {
- padding: 1.5rem !important;
- }
- .pt-lg-4,
- .py-lg-4 {
- padding-top: 1.5rem !important;
- }
- .pr-lg-4,
- .px-lg-4 {
- padding-right: 1.5rem !important;
- }
- .pb-lg-4,
- .py-lg-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-lg-4,
- .px-lg-4 {
- padding-left: 1.5rem !important;
- }
- .p-lg-5 {
- padding: 3rem !important;
- }
- .pt-lg-5,
- .py-lg-5 {
- padding-top: 3rem !important;
- }
- .pr-lg-5,
- .px-lg-5 {
- padding-right: 3rem !important;
- }
- .pb-lg-5,
- .py-lg-5 {
- padding-bottom: 3rem !important;
- }
- .pl-lg-5,
- .px-lg-5 {
- padding-left: 3rem !important;
- }
- .m-lg-auto {
- margin: auto !important;
- }
- .mt-lg-auto,
- .my-lg-auto {
- margin-top: auto !important;
- }
- .mr-lg-auto,
- .mx-lg-auto {
- margin-right: auto !important;
- }
- .mb-lg-auto,
- .my-lg-auto {
- margin-bottom: auto !important;
- }
- .ml-lg-auto,
- .mx-lg-auto {
- margin-left: auto !important;
- }
-}
-
-@media (min-width: 1200px) {
- .m-xl-0 {
- margin: 0 !important;
- }
- .mt-xl-0,
- .my-xl-0 {
- margin-top: 0 !important;
- }
- .mr-xl-0,
- .mx-xl-0 {
- margin-right: 0 !important;
- }
- .mb-xl-0,
- .my-xl-0 {
- margin-bottom: 0 !important;
- }
- .ml-xl-0,
- .mx-xl-0 {
- margin-left: 0 !important;
- }
- .m-xl-1 {
- margin: 0.25rem !important;
- }
- .mt-xl-1,
- .my-xl-1 {
- margin-top: 0.25rem !important;
- }
- .mr-xl-1,
- .mx-xl-1 {
- margin-right: 0.25rem !important;
- }
- .mb-xl-1,
- .my-xl-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-xl-1,
- .mx-xl-1 {
- margin-left: 0.25rem !important;
- }
- .m-xl-2 {
- margin: 0.5rem !important;
- }
- .mt-xl-2,
- .my-xl-2 {
- margin-top: 0.5rem !important;
- }
- .mr-xl-2,
- .mx-xl-2 {
- margin-right: 0.5rem !important;
- }
- .mb-xl-2,
- .my-xl-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-xl-2,
- .mx-xl-2 {
- margin-left: 0.5rem !important;
- }
- .m-xl-3 {
- margin: 1rem !important;
- }
- .mt-xl-3,
- .my-xl-3 {
- margin-top: 1rem !important;
- }
- .mr-xl-3,
- .mx-xl-3 {
- margin-right: 1rem !important;
- }
- .mb-xl-3,
- .my-xl-3 {
- margin-bottom: 1rem !important;
- }
- .ml-xl-3,
- .mx-xl-3 {
- margin-left: 1rem !important;
- }
- .m-xl-4 {
- margin: 1.5rem !important;
- }
- .mt-xl-4,
- .my-xl-4 {
- margin-top: 1.5rem !important;
- }
- .mr-xl-4,
- .mx-xl-4 {
- margin-right: 1.5rem !important;
- }
- .mb-xl-4,
- .my-xl-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-xl-4,
- .mx-xl-4 {
- margin-left: 1.5rem !important;
- }
- .m-xl-5 {
- margin: 3rem !important;
- }
- .mt-xl-5,
- .my-xl-5 {
- margin-top: 3rem !important;
- }
- .mr-xl-5,
- .mx-xl-5 {
- margin-right: 3rem !important;
- }
- .mb-xl-5,
- .my-xl-5 {
- margin-bottom: 3rem !important;
- }
- .ml-xl-5,
- .mx-xl-5 {
- margin-left: 3rem !important;
- }
- .p-xl-0 {
- padding: 0 !important;
- }
- .pt-xl-0,
- .py-xl-0 {
- padding-top: 0 !important;
- }
- .pr-xl-0,
- .px-xl-0 {
- padding-right: 0 !important;
- }
- .pb-xl-0,
- .py-xl-0 {
- padding-bottom: 0 !important;
- }
- .pl-xl-0,
- .px-xl-0 {
- padding-left: 0 !important;
- }
- .p-xl-1 {
- padding: 0.25rem !important;
- }
- .pt-xl-1,
- .py-xl-1 {
- padding-top: 0.25rem !important;
- }
- .pr-xl-1,
- .px-xl-1 {
- padding-right: 0.25rem !important;
- }
- .pb-xl-1,
- .py-xl-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-xl-1,
- .px-xl-1 {
- padding-left: 0.25rem !important;
- }
- .p-xl-2 {
- padding: 0.5rem !important;
- }
- .pt-xl-2,
- .py-xl-2 {
- padding-top: 0.5rem !important;
- }
- .pr-xl-2,
- .px-xl-2 {
- padding-right: 0.5rem !important;
- }
- .pb-xl-2,
- .py-xl-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-xl-2,
- .px-xl-2 {
- padding-left: 0.5rem !important;
- }
- .p-xl-3 {
- padding: 1rem !important;
- }
- .pt-xl-3,
- .py-xl-3 {
- padding-top: 1rem !important;
- }
- .pr-xl-3,
- .px-xl-3 {
- padding-right: 1rem !important;
- }
- .pb-xl-3,
- .py-xl-3 {
- padding-bottom: 1rem !important;
- }
- .pl-xl-3,
- .px-xl-3 {
- padding-left: 1rem !important;
- }
- .p-xl-4 {
- padding: 1.5rem !important;
- }
- .pt-xl-4,
- .py-xl-4 {
- padding-top: 1.5rem !important;
- }
- .pr-xl-4,
- .px-xl-4 {
- padding-right: 1.5rem !important;
- }
- .pb-xl-4,
- .py-xl-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-xl-4,
- .px-xl-4 {
- padding-left: 1.5rem !important;
- }
- .p-xl-5 {
- padding: 3rem !important;
- }
- .pt-xl-5,
- .py-xl-5 {
- padding-top: 3rem !important;
- }
- .pr-xl-5,
- .px-xl-5 {
- padding-right: 3rem !important;
- }
- .pb-xl-5,
- .py-xl-5 {
- padding-bottom: 3rem !important;
- }
- .pl-xl-5,
- .px-xl-5 {
- padding-left: 3rem !important;
- }
- .m-xl-auto {
- margin: auto !important;
- }
- .mt-xl-auto,
- .my-xl-auto {
- margin-top: auto !important;
- }
- .mr-xl-auto,
- .mx-xl-auto {
- margin-right: auto !important;
- }
- .mb-xl-auto,
- .my-xl-auto {
- margin-bottom: auto !important;
- }
- .ml-xl-auto,
- .mx-xl-auto {
- margin-left: auto !important;
- }
-}
-
-.text-monospace {
- font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
-}
-
-.text-justify {
- text-align: justify !important;
-}
-
-.text-nowrap {
- white-space: nowrap !important;
-}
-
-.text-truncate {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.text-left {
- text-align: left !important;
-}
-
-.text-right {
- text-align: right !important;
-}
-
-.text-center {
- text-align: center !important;
-}
-
-@media (min-width: 576px) {
- .text-sm-left {
- text-align: left !important;
- }
- .text-sm-right {
- text-align: right !important;
- }
- .text-sm-center {
- text-align: center !important;
- }
-}
-
-@media (min-width: 768px) {
- .text-md-left {
- text-align: left !important;
- }
- .text-md-right {
- text-align: right !important;
- }
- .text-md-center {
- text-align: center !important;
- }
-}
-
-@media (min-width: 992px) {
- .text-lg-left {
- text-align: left !important;
- }
- .text-lg-right {
- text-align: right !important;
- }
- .text-lg-center {
- text-align: center !important;
- }
-}
-
-@media (min-width: 1200px) {
- .text-xl-left {
- text-align: left !important;
- }
- .text-xl-right {
- text-align: right !important;
- }
- .text-xl-center {
- text-align: center !important;
- }
-}
-
-.text-lowercase {
- text-transform: lowercase !important;
-}
-
-.text-uppercase {
- text-transform: uppercase !important;
-}
-
-.text-capitalize {
- text-transform: capitalize !important;
-}
-
-.font-weight-light {
- font-weight: 300 !important;
-}
-
-.font-weight-normal {
- font-weight: 400 !important;
-}
-
-.font-weight-bold {
- font-weight: 700 !important;
-}
-
-.font-italic {
- font-style: italic !important;
-}
-
-.text-white {
- color: #fff !important;
-}
-
-.text-primary {
- color: #3a59b1 !important;
-}
-
-a.text-primary:hover, a.text-primary:focus {
- color: #2d468b !important;
-}
-
-.text-secondary {
- color: #6c757d !important;
-}
-
-a.text-secondary:hover, a.text-secondary:focus {
- color: #545b62 !important;
-}
-
-.text-success {
- color: #22b24c !important;
-}
-
-a.text-success:hover, a.text-success:focus {
- color: #1a873a !important;
-}
-
-.text-info {
- color: yellow !important;
-}
-
-a.text-info:hover, a.text-info:focus {
- color: #cccc00 !important;
-}
-
-.text-warning {
- color: #ffc107 !important;
-}
-
-a.text-warning:hover, a.text-warning:focus {
- color: #d39e00 !important;
-}
-
-.text-danger {
- color: #fc3434 !important;
-}
-
-a.text-danger:hover, a.text-danger:focus {
- color: #f90404 !important;
-}
-
-.text-light {
- color: white !important;
-}
-
-a.text-light:hover, a.text-light:focus {
- color: #e6e6e6 !important;
-}
-
-.text-dark {
- color: #6a8ed3 !important;
-}
-
-a.text-dark:hover, a.text-dark:focus {
- color: #4370c7 !important;
-}
-
-.text-body {
- color: #212529 !important;
-}
-
-.text-muted {
- color: #6c757d !important;
-}
-
-.text-black-50 {
- color: rgba(0, 0, 0, 0.5) !important;
-}
-
-.text-white-50 {
- color: rgba(255, 255, 255, 0.5) !important;
-}
-
-.text-hide {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-
-.visible {
- visibility: visible !important;
-}
-
-.invisible {
- visibility: hidden !important;
-}
-
-/*----Custom CSS----*/
-
.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none}
.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block}
.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s}
-.w3-input{padding:4px;display:block;border:1px solid #ccc;width:100%;background-color: #e8f0fe; border-radius:4px}
+.w3-input{padding:4px;display:block;border:1px solid #ccc;width:100%;background-color: #e8f0fe; }
.w3-select{padding:4px 0; display:block;width:100%;border:1px solid #ccc;background-color: #e8f0fe;}
.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer}
.w3-dropdown-hover:hover .w3-dropdown-content{display:block; }
margin: 0;
border-bottom: 1px solid #aaa;
box-shadow: 0 1px 0 1px rgba(0,0,0,.04);
- /* border-radius: .5em; */
+ border-radius: 0px;
-moz-appearance: none;
-webkit-appearance: none;
appearance: none;
background-color: #333;
color: #fff;
text-align: center;
- border-radius: 2px;
+
padding: 16px;
position: fixed;
z-index: 1;
background-color: #e8f0fe;
border: 1px solid #ccc;
font-weight: normal;
- border-radius:4px;
}
.w3-readonly {
return false;
}
-function fillformbydataclass(dataclass, data, readonly = false) {
+function fillformbydataclass(dataclass, data,choices, readonly = false) {
//console.log(data);
var frm = document.querySelectorAll('.data_' + dataclass);
if (data) {
frm[f]._flatpickr.setDate(data[frm[f].id]);
} else if (frm[f].classList.contains("choices__input")) {
if ((data[frm[f].id] != null) && (data[frm[f].id] != '[""]')) {
- choice[dataclass][frm[f].id].setValue(JSON.parse(data[frm[f].id]));
+ choices[frm[f].id].setValue(JSON.parse(data[frm[f].id]));
}
} else {
frm[f].value = data[frm[f].id];
if (frm[f].classList.contains("choices__input")) {
if (frm[f].multiple == true) {
//console.log(data[frm[f].id]);
- choice[dataclass][frm[f].id].setChoiceByValue(JSON.parse(data[frm[f].id]));
+ choices[frm[f].id].setChoiceByValue(JSON.parse(data[frm[f].id]));
} else {
- choice[dataclass][frm[f].id].setChoiceByValue(data[frm[f].id]);
+ choices[frm[f].id].setChoiceByValue(data[frm[f].id]);
}
} else {
frm[f].value = data[frm[f].id];
alert('dlg_' +dlgname + ' not found!');
}
+ },
+ viewtab: function(tabname){
+ var i;
+ var x = document.getElementsByClassName("tabpanel");
+ for (i = 0; i < x.length; i++) {
+ x[i].style.display = "none";
+ }
+ document.getElementById("tab_" + tabname).style.display = "block";
+ x = document.getElementsByClassName("tabbtn");
+
+ for (i = 0; i < x.length; i++) {
+ //console.log(x[i].classList);
+ x[i].classList.remove("w3-blue");
+ }
+ document.getElementById("tabbtn_" + tabname).classList.add("w3-blue");
+ x = document.getElementsByClassName("tabxbtn");
+ for (i = 0; i < x.length; i++) {
+ x[i].style.display = "none";
+ }
+ x = document.getElementsByClassName("tabbtn" + tabname);
+ for (i = 0; i < x.length; i++) {
+ x[i].style.display = "block";
+ }
+ return false;
}
}
if (method.toUpperCase() == 'GET') {
sendurl = sendurl + '?' + rdata;
}
- //console.log("sending URL: " + method + " => " + sendurl + '?' + rdata);
+ console.log("sending URL: " + method + " => " + sendurl + '?' + rdata);
request.open(method.toUpperCase(), sendurl, true);
request.onload = function() {
if (request.status >= 200 && request.status <= 400) {
--- /dev/null
+add
+edit
+remove
+pdf
+invoices
+menu
+logout
+close
+banktransactions
+save
+journal
+directory
+files
+print
+addressbook
+usercard
+dashboard
+offers
+products
+templates
+sales
+contract
+timer
+email
+database
\ No newline at end of file