%%
%% This is file `datatool.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% datatool.dtx  (with options: `datatool.sty,package')
%% 
%%  datatool.dtx
%%  Copyright 2007 Nicola Talbot
%% 
%%  This work may be distributed and/or modified under the
%%  conditions of the LaTeX Project Public License, either version 1.3
%%  of this license of (at your option) any later version.
%%  The latest version of this license is in
%%    http://www.latex-project.org/lppl.txt
%%  and version 1.3 or later is part of all distributions of LaTeX
%%  version 2005/12/01 or later.
%% 
%%  This work has the LPPL maintenance status `maintained'.
%% 
%%  The Current Maintainer of this work is Nicola Talbot.
%% 
%%  This work consists of the files datatool.dtx and datatool.ins and the derived files datatool.sty, datapie.sty, dataplot.sty, databar.sty, databib.sty, databib.bst.
%% 
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{datatool}[2007/08/17 v1.01 (NLCT)]
\RequirePackage{xkeyval}
\RequirePackage{ifthen}
\RequirePackage{xfor}
\RequirePackage{fp}
\RequirePackage{substr}
\newcommand*{\@dtl@separator}{,}
\newcommand*{\DTLsetseparator}[1]{%
\renewcommand*{\@dtl@separator}{#1}%
\@dtl@construct@lopoffs
}
\begingroup
\catcode`\ 12
\gdef\DTLsettabseparator{%
  \catcode`\ 12
  \DTLsetseparator{ }%
}
\endgroup
\begingroup
\catcode`\"12\relax
\gdef\@dtl@delimiter{"}
\endgroup
\newcommand*\DTLsetdelimiter[1]{%
\renewcommand*{\@dtl@delimiter}{#1}%
\@dtl@construct@lopoffs}
\edef\@dtl@construct@lopoff#1#2{%
\noexpand\long\noexpand\def\noexpand\@dtl@lopoff#1##1##2\noexpand
\to##3##4{%
\noexpand\ifx#2##1\noexpand\relax
\noexpand\@dtl@qlopoff#1##1##2\noexpand\to##3##4\relax
\noexpand\else
\noexpand\@dtl@lop@ff#1##1##2\noexpand\to##3##4\relax
\noexpand\fi
}}
\edef\@dtl@construct@qlopoff#1#2{%
\noexpand\long\noexpand\def\noexpand\@dtl@qlopoff#1#2##1#2#1##2\noexpand
\to##3##4{%
\noexpand\def##4{##1}\noexpand\def##3{#1##2}%
}}
\edef\@dtl@construct@lop@ff#1{%
\noexpand\long\noexpand\def\noexpand\@dtl@lop@ff#1##1#1##2\noexpand
\to##3##4{%
\noexpand\def##4{##1}\noexpand\def##3{#1##2}%
}}
\newcommand{\@dtl@construct@lopoffs}{%
\edef\@dtl@chars{{\@dtl@separator}{\@dtl@delimiter}}%
\expandafter\@dtl@construct@lopoff\@dtl@chars
\expandafter\@dtl@construct@qlopoff\@dtl@chars
\expandafter\@dtl@construct@lop@ff\expandafter{\@dtl@separator}%
}
\newcommand*{\@dtl@decimal}{.}
\newcommand*{\@dtl@numbergroupchar}{,}
\newcommand*{\DTLsetnumberchars}[2]{%
\renewcommand*{\@dtl@numbergroupchar}{#1}%
\renewcommand*{\@dtl@decimal}{#2}%
\@dtl@construct@getnums
\@dtl@construct@stripnumgrpchar{#1}}
\edef\@dtl@construct@getintfrac#1{%
\noexpand\def\noexpand\@dtl@getintfrac##1#1##2\noexpand\relax{%
\noexpand\@dtl@get@intpart{##1}%
\noexpand\def\noexpand\@dtl@fracpart{##2}%
\noexpand\ifx\noexpand\@empty\noexpand\@dtl@fracpart
 \noexpand\def\noexpand\@dtl@fracpart{0}%
\noexpand\else
 \noexpand\@dtl@getfracpart##2\noexpand\relax
 \noexpand\@dtl@choptrailingzeroes{\noexpand\@dtl@fracpart}%
\noexpand\fi
}%
\noexpand\def\noexpand\@dtl@getfracpart##1#1\noexpand\relax{%
\noexpand\def\noexpand\@dtl@fracpart{##1}%
}%
\noexpand\def\noexpand\DTLconverttodecimal##1##2{%
\noexpand\dtl@ifsingle{##1}%
{\noexpand\expandafter\noexpand\toks@\noexpand\expandafter{##1}%
\noexpand\edef\noexpand\@dtl@tmp{\noexpand\the\noexpand\toks@}}%
{\noexpand\def\noexpand\@dtl@tmp{##1}}%
 \noexpand\@dtl@standardize@currency\noexpand\@dtl@tmp
 \noexpand\ifx\noexpand\@dtl@org@currency\noexpand\@empty
 \noexpand\else
   \noexpand\let\noexpand\@dtl@currency\noexpand\@dtl@org@currency
 \noexpand\fi
\noexpand\expandafter
\noexpand\@dtl@getintfrac\noexpand\@dtl@tmp#1\noexpand\relax
\noexpand\edef##2{\noexpand\@dtl@intpart.\noexpand\@dtl@fracpart}}%
}
\newcommand*{\@dtl@construct@getnums}{%
\expandafter\@dtl@construct@getintfrac\expandafter{\@dtl@decimal}}
\newcommand*{\@dtl@get@intpart}[1]{%
\@dtl@tmpcount=1\relax
\def\@dtl@intpart{#1}%
\ifx\@dtl@intpart\@empty
  \def\@dtl@intpart{0}%
\else
  \def\@dtl@intpart{}%
  \@dtl@get@int@part#1.\relax%
\fi
\ifnum\@dtl@tmpcount<0\relax
  \edef\@dtl@intpart{-\@dtl@intpart}%
\fi
\@dtl@strip@numgrpchar{\@dtl@intpart}%
}
\def\@dtl@get@int@part#1#2\relax{%
\def\@dtl@argi{#1}%
\def\@dtl@argii{#2}%
\ifx\protect#1\relax%
  \let\@dtl@get@nextintpart=\@dtl@get@int@part
\else
  \expandafter\ifx\@dtl@argi\$%
    \let\@dtl@get@nextintpart=\@dtl@get@int@part
  \else
    \ifx-#1%
      \multiply\@dtl@tmpcount by -1\relax
      \let\@dtl@get@nextintpart=\@dtl@get@int@part
    \else
      \if\@dtl@argi+%
        \let\@dtl@get@nextintpart=\@dtl@get@int@part
      \else
        \def\@dtl@intpart{#1}%
        \ifx.\@dtl@argii
          \let\@dtl@get@nextintpart=\@gobble
        \else
          \let\@dtl@get@nextintpart=\@dtl@get@next@intpart
        \fi
      \fi
    \fi
  \fi
\fi
\@dtl@get@nextintpart#2\relax
}
\def\@dtl@get@next@intpart#1.\relax{%
\edef\@dtl@intpart{\@dtl@intpart#1}%
}
\newcommand*{\@dtl@choptrailingzeroes}[1]{%
\def\@dtl@tmpcpz{}%
\expandafter\@dtl@chop@trailingzeroes#1\@nil%
\let#1=\@dtl@tmpcpz
}
\def\@dtl@chop@trailingzeroes#1#2\@nil{%
\FPifeq{#2}{0}%
  \edef\@dtl@tmpcpz{\@dtl@tmpcpz#1}%
  \let\@dtl@chopzeroesnext=\@dtl@gobbletonil
\else
 \edef\@dtl@tmpcpz{\@dtl@tmpcpz#1}%
 \let\@dtl@chopzeroesnext=\@dtl@chop@trailingzeroes
\fi
\@dtl@chopzeroesnext#2\@nil
}
\def\@dtl@gobbletonil#1\@nil{}
\newcommand*{\dtl@truncatedecimal}[1]{%
\expandafter\@dtl@truncatedecimal#1.\@nil#1}
\def\@dtl@truncatedecimal#1.#2\@nil#3{%
\def#3{#1}}
\newcommand*{\@dtl@strip@numgrpchar}[1]{%
\def\@dtl@stripped{}%
\edef\@dtl@do@stripnumgrpchar{%
\noexpand\@@dtl@strip@numgrpchar#1\@dtl@numbergroupchar
\noexpand\relax}%
\@dtl@do@stripnumgrpchar
\let#1=\@dtl@stripped
}
\edef\@dtl@construct@stripnumgrpchar#1{%
\noexpand\def\noexpand\@@dtl@strip@numgrpchar##1#1##2\noexpand\relax{%
\noexpand\expandafter\noexpand\toks@\noexpand\expandafter
{\noexpand\@dtl@stripped}%
\noexpand\edef\noexpand\@dtl@stripped{\noexpand\the\noexpand\toks@
##1}%
\noexpand\def\noexpand\@dtl@tmp{##2}%
\noexpand\ifx\noexpand\@dtl@tmp\noexpand\@empty
 \noexpand\let\noexpand\@dtl@next=\noexpand\relax
\noexpand\else
 \noexpand\let\noexpand\@dtl@next=\noexpand\@@dtl@strip@numgrpchar
\noexpand\fi
\noexpand\@dtl@next##2\noexpand\relax
}%
}
\newcommand*{\DTLdecimaltolocale}[2]{%
\edef\@dtl@tmpdtl{#1}%
\expandafter\@dtl@decimaltolocale\@dtl@tmpdtl.\relax
\FPifeq{\@dtl@fracpart}{0}%
 \edef#2{\@dtl@intpart}%
\else
 \edef#2{\@dtl@intpart\@dtl@decimal\@dtl@fracpart}%
\fi
}
\def\@dtl@decimaltolocale#1.#2\relax{%
\@dtl@decimaltolocaleint{#1}%
\def\@dtl@fracpart{#2}%
\ifx\@dtl@fracpart\@empty
 \def\@dtl@fracpart{0}%
\else
 \@dtl@decimaltolocalefrac#2\relax
\fi
}
\def\@dtl@decimaltolocaleint#1{%
\@dtl@tmpcount=0\relax
\@dtl@countdigits#1.\relax
\@dtl@numgrpsepcount=\@dtl@tmpcount\relax
\divide\@dtl@numgrpsepcount by 3\relax
\multiply\@dtl@numgrpsepcount by 3\relax
\advance\@dtl@numgrpsepcount by -\@dtl@tmpcount\relax
\ifnum\@dtl@numgrpsepcount<0\relax
  \advance\@dtl@numgrpsepcount by 3\relax
\fi
\def\@dtl@intpart{}%
\@dtl@decimal@to@localeint#1.\relax
}
\def\@dtl@countdigits#1#2\relax{%
\advance\@dtl@tmpcount by 1\relax
\ifx.#2\relax
 \let\@dtl@countnext=\@gobble
\else
 \let\@dtl@countnext=\@dtl@countdigits
\fi
\@dtl@countnext#2\relax
}
\def\@dtl@decimal@to@localeint#1#2\relax{%
\advance\@dtl@numgrpsepcount by 1\relax
\ifx.#2\relax
 \edef\@dtl@intpart{\@dtl@intpart#1}%
 \let\@dtl@localeintnext=\@gobble
\else
 \ifnum\@dtl@numgrpsepcount=3\relax
   \edef\@dtl@intpart{\@dtl@intpart#1\@dtl@numbergroupchar}%
   \@dtl@numgrpsepcount=0\relax
 \else
   \ifnum\@dtl@numgrpsepcount>3\relax
     \@dtl@numgrpsepcount=0\relax
   \fi
   \edef\@dtl@intpart{\@dtl@intpart#1}%
 \fi
 \let\@dtl@localeintnext=\@dtl@decimal@to@localeint
\fi
\@dtl@localeintnext#2\relax
}
\def\@dtl@decimaltolocalefrac#1.\relax{%
\def\@dtl@fracpart{#1}%
\@dtl@choptrailingzeroes{\@dtl@fracpart}%
}
\newcommand*{\DTLdecimaltocurrency}[2]{%
\edef\@dtl@tmpdtl{#1}%
\expandafter\@dtl@decimaltolocale\@dtl@tmpdtl.\relax
\dtl@truncatedecimal\@dtl@tmpdtl
\@dtl@tmpcount=\@dtl@tmpdtl\relax
\expandafter\@dtl@toks\expandafter{\@dtl@currency}%
\FPifeq{\@dtl@fracpart}{0}%
 \ifnum\@dtl@tmpcount<0\relax
   \@dtl@tmpcount = -\@dtl@tmpcount\relax
   \edef#2{-\the\@dtl@toks\the\@dtl@tmpcount\@dtl@decimal00}%
 \else
   \edef#2{\the\@dtl@toks\@dtl@intpart\@dtl@decimal00}%
 \fi
\else
 \ifnum\@dtl@tmpcount<0\relax
   \@dtl@tmpcount = -\@dtl@tmpcount\relax
   \ifnum\@dtl@fracpart<10\relax
     \edef#2{-\the\@dtl@toks\number\@dtl@tmpcount
        \@dtl@decimal\@dtl@fracpart0}%
   \else
     \edef#2{-\the\@dtl@toks\number\@dtl@tmpcount
        \@dtl@decimal\@dtl@fracpart}%
   \fi
 \else
   \ifnum\@dtl@fracpart<10\relax
     \edef#2{\the\@dtl@toks\@dtl@intpart\@dtl@decimal\@dtl@fracpart0}%
   \else
     \edef#2{\the\@dtl@toks\@dtl@intpart\@dtl@decimal\@dtl@fracpart}%
   \fi
 \fi
\fi
}
\@dtl@construct@lopoffs
\@dtl@construct@getnums
\expandafter\@dtl@construct@stripnumgrpchar\expandafter
{\@dtl@numbergroupchar}
\define@key{datatool.sty}{separator}{%
\DTLsetseparator{#1}}
\define@key{datatool.sty}{delimiter}{%
\DTLsetdelimiter{#1}}
\define@boolkey{datatool.sty}[dtl]{verbose}[true]{%
\ifdtlverbose \FPmessagestrue\else \FPmessagesfalse\fi}
\newcommand*{\dtl@message}[1]{%
\ifdtlverbose\typeout{#1}\fi}
\ProcessOptionsX
\DeclareRobustCommand\DTLpar{\@par}
\newcount\@dtl@datatype
\newcount\@dtl@tmpcount
\newlength\dtl@tmplength
\newcount\@dtl@numgrpsepcount
\newcommand{\@dtl@checknumerical}[1]{%
\@dtl@numgrpsepfalse
\def\@dtl@tmp{#1}%
\ifx\@empty#1\@empty
 \@dtl@datatype=0\relax
\else
 \dtl@ifsingle{#1}%
 {\expandafter\toks@\expandafter{#1}%
 \edef\@dtl@tmp{\the\toks@}}%
 {\def\@dtl@tmp{#1}}%
 \@dtl@tmpcount=0\relax
 \@dtl@datatype=0\relax
 \@dtl@numgrpsepcount=2\relax
 \@dtl@standardize@currency\@dtl@tmp
 \ifx\@dtl@org@currency\@empty
 \else
   \let\@dtl@currency\@dtl@org@currency
 \fi
 \expandafter\@dtl@checknumericalstart\@dtl@tmp\@nil\@nil
\fi
\ifnum\@dtl@numgrpsepcount>-1\relax
  \if@dtl@numgrpsep
    \ifnum\@dtl@numgrpsepcount=3\relax
    \else
      \@dtl@datatype=0\relax
    \fi
  \fi
\fi
}
\def\@dtl@checknumericalstart#1#2\@nil\@nil{%
\ifx#1\protect
  \@dtl@checknumericalstart#2\@nil\@nil\relax
\else
  \ifx-#1\relax
    \def\@dtl@tmp{#2}%
    \ifx\@empty\@dtl@tmp
      \@dtl@datatype=0\relax
    \else
      \ifnum\@dtl@datatype=0\relax
        \@dtl@datatype=1\relax
      \fi
      \@dtl@checknumericalstart#2\@nil\@nil\relax
    \fi
  \else
    \ifx+#1\relax
      \def\@dtl@tmp{#2}%
      \ifx\@empty\@dtl@tmp
        \@dtl@datatype=0\relax
      \else
        \ifnum\@dtl@datatype=0\relax
          \@dtl@datatype=1\relax
        \fi
        \@dtl@checknumericalstart#2\@nil\@nil\relax
      \fi
    \else
    \def\@dtl@tmp{#1}%
      \ifx#1\$\relax
        \@dtl@datatype=3\relax
        \@dtl@checknumericalstart#2\@nil\@nil\relax
      \else
        \ifx\@empty\@dtl@tmp
          \@dtl@datatype=0\relax
        \else
          \ifnum\@dtl@datatype=0\relax
            \@dtl@datatype=1\relax
          \fi
          \@dtl@checknumericalloop#1#2\@nil\@nil\relax
        \fi
      \fi
    \fi
  \fi
\fi
}
\newif\if@dtl@numgrpsep
\newcommand*{\@dtl@ifDigitOrDecimalSep}[3]{%
\ifx0#1\relax
 #2%
\else
 \ifx1#1\relax
  #2%
 \else
   \ifx2#1\relax
     #2%
   \else
     \ifx3#1\relax
       #2%
     \else
       \ifx4#1\relax
         #2%
       \else
         \ifx5#1\relax
          #2%
         \else
           \ifx6#1\relax
             #2%
           \else
             \ifx7#1\relax
               #2%
             \else
               \ifx8#1\relax
                 #2%
               \else
                 \ifx9#1\relax
                   #2%
                 \else
                   \expandafter\ifx\@dtl@decimal#1\relax
                     #2%
                   \else
                     #3%
                   \fi
                 \fi
               \fi
             \fi
           \fi
         \fi
       \fi
     \fi
   \fi
 \fi
\fi
}
\def\@dtl@checknumericalloop#1#2\@nil{%
\def\@dtl@tmp{#1}%
\ifx\@nnil\@dtl@tmp\relax
 \let\@dtl@chcknumnext=\@dtl@checknumericalnoop%
\else
  \@dtl@ifDigitOrDecimalSep{#1}{%
  \let\@dtl@chcknumnext=\@dtl@checknumericalloop%
  \expandafter\ifx\@dtl@decimal#1\relax
     \if@dtl@numgrpsep
       \ifnum\@dtl@numgrpsepcount=3\relax
        \@dtl@numgrpsepcount=-1\relax
       \else
        \@dtl@datatype=0\relax
        \let\@dtl@chcknumnext=\@dtl@checknumericalnoop
       \fi
     \else
       \@dtl@numgrpsepcount=-1\relax
     \fi
   \else
     \ifnum\@dtl@numgrpsepcount=-1\relax
     \else
       \advance\@dtl@numgrpsepcount by 1\relax
     \fi
   \fi
}{%
\ifx\@dtl@numbergroupchar\@dtl@tmp\relax
  \@dtl@numgrpseptrue
  \ifnum\@dtl@numgrpsepcount<3\relax
    \@dtl@datatype=0\relax
    \let\@dtl@chcknumnext=\@dtl@checknumericalnoop
  \else
     \@dtl@numgrpsepcount=0\relax
  \fi
\else
  \@dtl@datatype=0\relax
  \let\@dtl@chcknumnext=\@dtl@checknumericalnoop
\fi
}%
  \ifx\@dtl@decimal\@dtl@tmp\relax
   \ifnum\@dtl@datatype<3\relax
     \@dtl@datatype=2\relax
   \fi
   \advance\@dtl@tmpcount by 1\relax
   \ifnum\@dtl@tmpcount>1\relax
     \@dtl@datatype=0\relax
     \let\@dtl@chcknumnext=\@dtl@checknumericalnoop%
   \fi
  \fi
\fi
\@dtl@chcknumnext#2\@nil
}
\def\@dtl@checknumericalnoop#1\@nil#2{}
\newcommand{\DTLifnumerical}[3]{%
\@dtl@checknumerical{#1}%
\ifnum\@dtl@datatype=0\relax#3\else#2\fi
}
\newcommand{\DTLifreal}[3]{%
\@dtl@checknumerical{#1}%
\ifnum\@dtl@datatype=2\relax #2\else #3\fi
}
\newcommand{\DTLifint}[3]{%
\@dtl@checknumerical{#1}%
\ifnum\@dtl@datatype=1\relax #2\else #3\fi
}
\newcommand{\DTLifstring}[3]{%
\@dtl@checknumerical{#1}%
\ifnum\@dtl@datatype=0\relax #2\else #3\fi
}
\newcommand{\DTLifcurrency}[3]{%
\@dtl@checknumerical{#1}%
\ifnum\@dtl@datatype=3\relax #2\else #3\fi
}
\newcommand*{\DTLifcurrencyunit}[4]{%
\@dtl@checknumerical{#1}%
\ifnum\@dtl@datatype=3\relax
  \ifthenelse{\equal{\@dtl@org@currency}{#2}}{#3}{#4}%
\else
  #4%
\fi
}
\newcommand{\DTLifcasedatatype}[5]{%
\@dtl@checknumerical{#1}%
\ifcase\@dtl@datatype
 #2% string
\or
 #3% integer
\or
 #4% number
\or
 #5% currency
\fi
}
\newcommand*{\dtl@testbothnumerical}[2]{%
\dtl@ifsingle{#1}{%
 \edef\@dtl@tmp{#1}}{%
 \def\@dtl@tmp{#1}}%
\expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}%
\edef\@dtl@firsttype{\number\@dtl@datatype}%
\dtl@ifsingle{#2}{%
 \edef\@dtl@tmp{#2}}{%
 \def\@dtl@tmp{#2}}%
\expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}%
\multiply\@dtl@datatype by \@dtl@firsttype\relax
\ifnum\@dtl@datatype>0\relax
 \@dtl@conditiontrue
\else
 \@dtl@conditionfalse
\fi
}
\newcommand*{\DTLifnumlt}[4]{%
  \DTLconverttodecimal{#1}{\@dtl@numi}%
  \DTLconverttodecimal{#2}{\@dtl@numii}%
  \FPiflt{\@dtl@numi}{\@dtl@numii}%
   #3%
  \else
   #4%
  \fi
}
\newcommand*{\dtlcompare}[3]{%
\dtl@subnobrsp{#2}{\@dtl@argA}%
\dtl@subnobrsp{#3}{\@dtl@argB}%
\ifx\@dtl@argA\@empty
 \ifx\@dtl@argB\@empty
   #1=0\relax
 \else
   #1=-1\relax
 \fi
\else
  \ifx\@dtl@argB\@empty
    #1=1\relax
  \else
    \DTLsubstituteall{\@dtl@argA}{ }{\space }%
    \DTLsubstituteall{\@dtl@argB}{ }{\space }%
    \expandafter\dtl@getfirst\@dtl@argA\end
    \let\dtl@firstA=\dtl@first
    \let\dtl@restA=\dtl@rest
    \expandafter\dtl@getfirst\@dtl@argB\end
    \let\dtl@firstB=\dtl@first
    \let\dtl@restB=\dtl@rest
    \expandafter\dtl@ifsingle\expandafter{\dtl@firstA}{%
    \expandafter\dtl@ifsingle\expandafter{\dtl@firstB}{%
    \expandafter\dtl@setcharcode\expandafter{\dtl@firstA}{\dtl@codeA}%
    \expandafter\dtl@setcharcode\expandafter{\dtl@firstB}{\dtl@codeB}%
    \ifnum\dtl@codeA=-1\relax
      \ifnum\dtl@codeB=-1\relax
         \protected@edef\dtl@donext{%
           \noexpand\dtlcompare{\noexpand#1}{\dtl@restA}{\dtl@restB}}%
         \dtl@donext
      \else
         \protected@edef\dtl@donext{%
           \noexpand\dtlcompare
             {\noexpand#1}{\dtl@restA}{\dtl@firstB\dtl@restB}}%
         \dtl@donext
      \fi
    \else
      \ifnum\dtl@codeB=-1\relax
         \protected@edef\dtl@donext{%
           \noexpand\dtlcompare
             {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@restB}}%
         \dtl@donext
      \else
        \ifnum\dtl@codeA<\dtl@codeB
          #1=-1\relax
        \else
          \ifnum\dtl@codeA>\dtl@codeB
            #1=1\relax
          \else
             \ifx\dtl@restA\@empty
               \ifx\dtl@restB\@empty
                 #1=0\relax
               \else
                 #1=-1\relax
               \fi
             \else
               \ifx\restB\@empty
                 #1=1\relax
               \else
                 \protected@edef\dtl@donext{%
                   \noexpand\dtlcompare
                     {\noexpand#1}{\dtl@restA}{\dtl@restB}}%
                 \dtl@donext
               \fi
             \fi
          \fi
        \fi
      \fi
    \fi
    }{%
    \protected@edef\dtl@donext{%
      \noexpand\dtlcompare
        {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}%
    \dtl@donext
    }}{%
    \protected@edef\dtl@donext{%
      \noexpand\dtlcompare
        {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}%
    \dtl@donext
    }%
  \fi
\fi
}
\def\dtl@getfirst#1#2\end{%
\def\dtl@first{#1}%
\ifx\dtl@first\@empty
 \def\dtl@rest{#2}%
\else
 \dtl@ifsingle{#1}{\def\dtl@rest{#2}}{\dtl@getfirst#1#2\end}%
\fi
}
\newcount\dtl@codeA
\newcount\dtl@codeB
\newcommand*{\dtl@setcharcode}[2]{%
\def\@dtl@tmp{#1}%
\ifx\@dtl@tmp\@empty
 #2=-1\relax
\else
 \ifx#1\space\relax
   #2=`\ \relax
 \else
   \ifx#1~\relax
     #2=`\ \relax
   \else
     \ifcat\noexpand#1\relax%
       #2=-1\relax
     \else
       #2=`#1\relax
     \fi
   \fi
 \fi
\fi
}
\newcommand*{\dtl@setlccharcode}[2]{%
\def\@dtl@tmp{#1}%
\ifx\@dtl@tmp\@empty
 #2=-1\relax
\else
 \ifx#1\space\relax
   #2=`\ \relax
 \else
   \ifx#1~\relax
     #2=`\ \relax
   \else
     \ifcat\noexpand#1\relax%
       #2=-1\relax
     \else
       #2=\lccode`#1\relax
     \fi
   \fi
 \fi
\fi
}
\newcommand*{\dtlicompare}[3]{%
\dtl@subnobrsp{#2}{\@dtl@argA}%
\dtl@subnobrsp{#3}{\@dtl@argB}%
\ifx\@dtl@argA\@empty
 \ifx\@dtl@argB\@empty
   #1=0\relax
 \else
   #1=-1\relax
 \fi
\else
  \ifx\@dtl@argB\@empty
    #1=1\relax
  \else
    \DTLsubstituteall{\@dtl@argA}{ }{\space }%
    \DTLsubstituteall{\@dtl@argB}{ }{\space }%
    \expandafter\dtl@getfirst\@dtl@argA\end
    \let\dtl@firstA=\dtl@first
    \let\dtl@restA=\dtl@rest
    \expandafter\dtl@getfirst\@dtl@argB\end
    \let\dtl@firstB=\dtl@first
    \let\dtl@restB=\dtl@rest
    \expandafter\dtl@ifsingle\expandafter{\dtl@firstA}{%
    \expandafter\dtl@ifsingle\expandafter{\dtl@firstB}{%
    \expandafter\dtl@setlccharcode\expandafter{\dtl@firstA}{\dtl@codeA}%
    \expandafter\dtl@setlccharcode\expandafter{\dtl@firstB}{\dtl@codeB}%
    \ifnum\dtl@codeA=-1\relax
      \ifnum\dtl@codeB=-1\relax
         \protected@edef\dtl@donext{%
           \noexpand\dtlicompare{\noexpand#1}{\dtl@restA}{\dtl@restB}}%
         \dtl@donext
      \else
         \protected@edef\dtl@donext{%
           \noexpand\dtlicompare
             {\noexpand#1}{\dtl@restA}{\dtl@firstB\dtl@restB}}%
         \dtl@donext
      \fi
    \else
      \ifnum\dtl@codeB=-1\relax
         \protected@edef\dtl@donext{%
           \noexpand\dtlicompare
             {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@restB}}%
         \dtl@donext
      \else
        \ifnum\dtl@codeA<\dtl@codeB
          #1=-1\relax
        \else
          \ifnum\dtl@codeA>\dtl@codeB
            #1=1\relax
          \else
             \ifx\dtl@restA\@empty
               \ifx\dtl@restB\@empty
                 #1=0\relax
               \else
                 #1=-1\relax
               \fi
             \else
               \ifx\restB\@empty
                 #1=1\relax
               \else
                 \protected@edef\dtl@donext{%
                   \noexpand\dtlicompare
                     {\noexpand#1}{\dtl@restA}{\dtl@restB}}%
                 \dtl@donext
               \fi
             \fi
          \fi
        \fi
      \fi
    \fi
    }{%
    \protected@edef\dtl@donext{%
      \noexpand\dtlicompare
        {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}%
    \dtl@donext
    }}{%
    \protected@edef\dtl@donext{%
      \noexpand\dtlicompare
        {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}%
    \dtl@donext
    }%
  \fi
\fi
}
\newcommand*{\DTLifstringlt}{\@ifstar\@sDTLifstringlt\@DTLifstringlt}
\newcommand*{\@DTLifstringlt}[4]{%
\protected@edef\@dtl@tmpcmp{%
  \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#2}}%
\@dtl@tmpcmp
\ifnum\@dtl@tmpcount<0\relax
  #3%
\else
  #4%
\fi
}
\newcommand*{\@sDTLifstringlt}[4]{%
\protected@edef\@dtl@tmpcmp{%
  \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#2}}%
\@dtl@tmpcmp
\ifnum\@dtl@tmpcount<0\relax
  #3%
\else
  #4%
\fi
}
\newcommand*{\DTLiflt}{\@ifstar\@sDTLiflt\@DTLiflt}
\newcommand*{\@DTLiflt}[4]{%
\dtl@testbothnumerical{#1}{#2}%
\if@dtl@condition
 \DTLifnumlt{#1}{#2}{#3}{#4}%
\else
 \@DTLifstringlt{#1}{#2}{#3}{#4}%
\fi
}
\newcommand*{\@sDTLiflt}[4]{%
\dtl@testbothnumerical{#1}{#2}%
\if@dtl@condition
 \DTLifnumlt{#1}{#2}{#3}{#4}%
\else
 \@sDTLifstringlt{#1}{#2}{#3}{#4}%
\fi
}
\newcommand*{\DTLifnumgt}[4]{%
  \DTLconverttodecimal{#1}{\@dtl@numi}%
  \DTLconverttodecimal{#2}{\@dtl@numii}%
  \FPifgt{\@dtl@numi}{\@dtl@numii}%
   #3%
  \else
   #4%
  \fi
}
\newcommand*{\DTLifstringgt}{\@ifstar\@sDTLifstringgt\@DTLifstringgt}
\newcommand*{\@DTLifstringgt}[4]{%
\protected@edef\@dtl@tmpcmp{%
  \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#2}}%
\@dtl@tmpcmp
\ifnum\@dtl@tmpcount>0\relax
  #3%
\else
  #4%
\fi
}
\newcommand*{\@sDTLifstringgt}[4]{%
\protected@edef\@dtl@tmpcmp{%
  \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#2}}%
\@dtl@tmpcmp
\ifnum\@dtl@tmpcount>0\relax
  #3%
\else
  #4%
\fi
}
\newcommand*{\DTLifgt}{\@ifstar\@sDTLifgt\@DTLifgt}
\newcommand*{\@DTLifgt}[4]{%
\dtl@testbothnumerical{#1}{#2}%
\if@dtl@condition
 \DTLifnumgt{#1}{#2}{#3}{#4}%
\else
 \@DTLifstringgt{#1}{#2}{#3}{#4}%
\fi
}
\newcommand*{\@sDTLifgt}[4]{%
\dtl@testbothnumerical{#1}{#2}%
\if@dtl@condition
 \DTLifnumgt{#1}{#2}{#3}{#4}%
\else
 \@sDTLifstringgt{#1}{#2}{#3}{#4}%
\fi
}
\newcommand*{\DTLifnumeq}[4]{%
  \DTLconverttodecimal{#1}{\@dtl@numi}%
  \DTLconverttodecimal{#2}{\@dtl@numii}%
  \FPifeq{\@dtl@numi}{\@dtl@numii}%
   #3%
  \else
   #4%
  \fi
}
\newcommand*{\DTLifstringeq}{\@ifstar\@sDTLifstringeq\@DTLifstringeq}
\newcommand*{\@DTLifstringeq}[4]{%
\protected@edef\@dtl@tmpcmp{%
  \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#2}}%
\@dtl@tmpcmp
\ifnum\@dtl@tmpcount=0\relax
  #3%
\else
  #4%
\fi
}
\newcommand*{\@sDTLifstringeq}[4]{%
\protected@edef\@dtl@tmpcmp{%
  \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#2}}%
\@dtl@tmpcmp
\ifnum\@dtl@tmpcount=0\relax
  #3%
\else
  #4%
\fi
}
\newcommand*{\DTLifeq}{\@ifstar\@sDTLifeq\@DTLifeq}
\newcommand*{\@DTLifeq}[4]{%
\dtl@testbothnumerical{#1}{#2}%
\if@dtl@condition
 \DTLifnumeq{#1}{#2}{#3}{#4}%
\else
 \@DTLifstringeq{#1}{#2}{#3}{#4}%
\fi
}
\newcommand*{\@sDTLifeq}[4]{%
\dtl@testbothnumerical{#1}{#2}%
\if@dtl@condition
 \DTLifnumeq{#1}{#2}{#3}{#4}%
\else
 \@sDTLifstringeq{#1}{#2}{#3}{#4}%
\fi
}
\newcommand*{\DTLifSubString}[4]{%
\protected@edef\@dtl@tmp{\noexpand\dtl@testifsubstring
{#1}{#2}}%
\@dtl@tmp
\if@dtl@condition
 #3%
\else
 #4%
\fi
}
\newcommand*{\dtl@testifsubstring}[2]{%
\dtl@subnobrsp{#1}{\@dtl@argA}%
\dtl@subnobrsp{#2}{\@dtl@argB}%
\ifx\@dtl@argB\@empty
 \@dtl@conditiontrue
\else
 \ifx\@dtl@argA\@empty
   \@dtl@conditionfalse
 \else
   \dtl@teststartswith{#1}{#2}%
   \if@dtl@condition
   \else
     \DTLsubstituteall{\@dtl@argA}{ }{\space }%
     \expandafter\dtl@getfirst\@dtl@argA\end
     \expandafter\dtl@ifsingle\expandafter{\dtl@first}{%
       \expandafter\dtl@testifsubstring\expandafter{\dtl@rest}{#2}%
     }{%
       \protected@edef\@dtl@donext{\noexpand\dtl@testifsubstring
          {\dtl@first\dtl@rest}{\@dtl@argB}}%
       \@dtl@donext
     }%
   \fi
 \fi
\fi
}
\newcommand*{\DTLifStartsWith}[4]{%
\@dtl@conditionfalse
\protected@edef\@dtl@tmp{\noexpand\dtl@teststartswith{#1}{#2}}%
\@dtl@tmp
\if@dtl@condition
 #3%
\else
 #4%
\fi
}
\newcommand*{\dtl@teststartswith}[2]{%
\dtl@subnobrsp{#1}{\@dtl@argA}%
\dtl@subnobrsp{#2}{\@dtl@argB}%
\ifx\@dtl@argA\@empty
 \ifx\@dtl@argB\@empty
   \@dtl@conditiontrue
 \else
   \@dtl@conditionfalse
 \fi
\else
  \ifx\@dtl@argB\@empty
   \@dtl@conditiontrue
  \else
    \DTLsubstituteall{\@dtl@argA}{ }{\space }%
    \DTLsubstituteall{\@dtl@argB}{ }{\space }%
    \expandafter\dtl@getfirst\@dtl@argA\end
    \let\dtl@firstA=\dtl@first
    \let\dtl@restA=\dtl@rest
    \expandafter\dtl@getfirst\@dtl@argB\end
    \let\dtl@firstB=\dtl@first
    \let\dtl@restB=\dtl@rest
    \expandafter\dtl@ifsingle\expandafter{\dtl@firstA}{%
    \expandafter\dtl@ifsingle\expandafter{\dtl@firstB}{%
    \expandafter\dtl@setcharcode\expandafter{\dtl@firstA}{\dtl@codeA}%
    \expandafter\dtl@setcharcode\expandafter{\dtl@firstB}{\dtl@codeB}%
    \ifnum\dtl@codeA=-1\relax
      \ifnum\dtl@codeB=-1\relax
         \protected@edef\dtl@donext{%
           \noexpand\dtl@teststartswith{\dtl@restA}{\dtl@restB}}%
         \dtl@donext
      \else
         \protected@edef\dtl@donext{%
           \noexpand\dtl@teststartswith
             {\dtl@restA}{\dtl@firstB\dtl@restB}}%
         \dtl@donext
      \fi
    \else
      \ifnum\dtl@codeB=-1\relax
         \protected@edef\dtl@donext{%
           \noexpand\dtl@teststartswith
             {\dtl@firstA\dtl@restA}{\dtl@restB}}%
         \dtl@donext
      \else
        \ifnum\dtl@codeA=\dtl@codeB
          \protected@edef\dtl@donext{%
            \noexpand\dtl@teststartswith{\dtl@restA}{\dtl@restB}}%
          \dtl@donext
        \else
          \@dtl@conditionfalse
        \fi
      \fi
    \fi
    }{%
    \protected@edef\dtl@donext{%
      \noexpand\dtl@teststartswith
        {\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}%
    \dtl@donext
    }}{%
    \protected@edef\dtl@donext{%
      \noexpand\dtl@teststartswith
        {\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}%
    }%
  \fi
\fi
}
\newcommand*{\DTLifnumclosedbetween}[5]{%
\DTLconverttodecimal{#1}{\@dtl@numi}%
\DTLconverttodecimal{#2}{\@dtl@numii}%
\DTLconverttodecimal{#3}{\@dtl@numiii}%
\DTLifFPclosedbetween{\@dtl@numi}{\@dtl@numii}{\@dtl@numiii}{#4}{#5}%
}
\newcommand*{\DTLifstringclosedbetween}{%
\@ifstar\@sDTLifstringclosedbetween\@DTLifstringclosedbetween}
\newcommand*{\@DTLifstringclosedbetween}[5]{%
\protected@edef\@dtl@tmpcmp{%
  \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#2}}%
\@dtl@tmpcmp
\let\@dtl@dovalue\relax
\ifnum\@dtl@tmpcount<0\relax
  \def\@dtl@dovalue{#5}%
\fi
\ifx\@dtl@dovalue\relax
  \protected@edef\@dtl@tmpcmp{%
    \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#3}}%
  \@dtl@tmpcmp
  \ifnum\@dtl@tmpcount>0\relax
    \def\@dtl@dovalue{#5}%
  \else
    \def\@dtl@dovalue{#4}%
  \fi
\fi
\@dtl@dovalue
}
\newcommand*{\@sDTLifstringclosedbetween}[5]{%
\protected@edef\@dtl@tmpcmp{%
  \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#2}}%
\@dtl@tmpcmp
\let\@dtl@dovalue\relax
\ifnum\@dtl@tmpcount<0\relax
  \def\@dtl@dovalue{#5}%
\fi
\ifx\@dtl@dovalue\relax
  \protected@edef\@dtl@tmpcmp{%
    \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#3}}%
  \@dtl@tmpcmp
  \ifnum\@dtl@tmpcount>0\relax
    \def\@dtl@dovalue{#5}%
  \else
    \def\@dtl@dovalue{#4}%
  \fi
\fi
\@dtl@dovalue
}
\newcommand*{\DTLifclosedbetween}{%
\@ifstar\@sDTLifclosedbetween\@DTLifclosedbetween}
\newcommand*{\@DTLifclosedbetween}[5]{%
\dtl@testbothnumerical{#2}{#3}%
\if@dtl@condition
  \dtl@ifsingle{#1}{%
    \edef\@dtl@tmp{#1}}{%
    \def\@dtl@tmp{#1}}%
  \expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}%
  \ifnum\@dtl@datatype>0\relax
    \DTLifnumclosedbetween{#1}{#2}{#3}{#4}{#5}%
  \else
    \@DTLifstringclosedbetween{#1}{#2}{#3}{#4}{#5}%
  \fi
\else
  \@DTLifstringclosedbetween{#1}{#2}{#3}{#4}{#5}%
\fi
}
\newcommand*{\@sDTLifclosedbetween}[5]{%
\dtl@testbothnumerical{#2}{#3}%
\if@dtl@condition
  \dtl@ifsingle{#1}{%
    \edef\@dtl@tmp{#1}}{%
    \def\@dtl@tmp{#1}}%
  \expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}%
  \ifnum\@dtl@datatype>0\relax
    \DTLifnumclosedbetween{#1}{#2}{#3}{#4}{#5}%
  \else
    \@sDTLifstringclosedbetween{#1}{#2}{#3}{#4}{#5}%
  \fi
\else
  \@sDTLifstringclosedbetween{#1}{#2}{#3}{#4}{#5}%
\fi
}
\newcommand*{\DTLifnumopenbetween}[5]{%
\DTLconverttodecimal{#1}{\@dtl@numi}%
\DTLconverttodecimal{#2}{\@dtl@numii}%
\DTLconverttodecimal{#3}{\@dtl@numiii}%
\DTLifFPopenbetween{\@dtl@numi}{\@dtl@numii}{\@dtl@numiii}{#4}{#5}%
}
\newcommand*{\DTLifstringopenbetween}{%
\@ifstar\@sDTLifstringopenbetween\@DTLifstringopenbetween}
\newcommand*{\@DTLifstringopenbetween}[5]{%
\protected@edef\@dtl@tmpcmp{%
  \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#2}}%
\@dtl@tmpcmp
\let\@dtl@dovalue\relax
\ifnum\@dtl@tmpcount>0\relax
\else
  \def\@dtl@dovalue{#5}%
\fi
\ifx\@dtl@dovalue\relax
  \protected@edef\@dtl@tmpcmp{%
    \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#3}}%
  \@dtl@tmpcmp
  \ifnum\@dtl@tmpcount<0\relax
    \def\@dtl@dovalue{#4}%
  \else
    \def\@dtl@dovalue{#5}%
  \fi
\fi
\@dtl@dovalue
}
\newcommand*{\@sDTLifstringopenbetween}[5]{%
\protected@edef\@dtl@tmpcmp{%
  \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#2}}%
\@dtl@tmpcmp
\let\@dtl@dovalue\relax
\ifnum\@dtl@tmpcount>0\relax
\else
  \def\@dtl@dovalue{#5}%
\fi
\ifx\@dtl@dovalue\relax
  \protected@edef\@dtl@tmpcmp{%
    \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#3}}%
  \@dtl@tmpcmp
  \ifnum\@dtl@tmpcount<0\relax
    \def\@dtl@dovalue{#4}%
  \else
    \def\@dtl@dovalue{#5}%
  \fi
\fi
\@dtl@dovalue
}
\newcommand*{\DTLifopenbetween}{%
\@ifstar\@sDTLifopenbetween\@DTLifopenbetween}
\newcommand*{\@DTLifopenbetween}[5]{%
\dtl@testbothnumerical{#2}{#3}%
\if@dtl@condition
  \dtl@ifsingle{#1}{%
    \edef\@dtl@tmp{#1}}{%
    \def\@dtl@tmp{#1}}%
  \expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}%
  \ifnum\@dtl@datatype>0\relax
    \DTLifnumopenbetween{#1}{#2}{#3}{#4}{#5}%
  \else
    \@DTLifstringopenbetween{#1}{#2}{#3}{#4}{#5}%
  \fi
\else
  \@DTLifstringopenbetween{#1}{#2}{#3}{#4}{#5}%
\fi
}
\newcommand*{\@sDTLifopenbetween}[5]{%
\dtl@testbothnumerical{#2}{#3}%
\if@dtl@condition
  \dtl@ifsingle{#1}{%
    \edef\@dtl@tmp{#1}}{%
    \def\@dtl@tmp{#1}}%
  \expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}%
  \ifnum\@dtl@datatype>0\relax
    \DTLifnumopenbetween{#1}{#2}{#3}{#4}{#5}%
  \else
    \@sDTLifstringopenbetween{#1}{#2}{#3}{#4}{#5}%
  \fi
\else
  \@sDTLifstringopenbetween{#1}{#2}{#3}{#4}{#5}%
\fi
}
\newcommand*{\DTLifFPopenbetween}[5]{%
  \let\@dtl@dovalue\relax
  \FPifgt{#1}{#2}%
  \else
    \def\@dtl@dovalue{#5}%
  \fi
  \FPiflt{#1}{#3}%
    \ifx\@dtl@dovalue\relax
      \def\@dtl@dovalue{#4}%
    \fi
  \else
    \def\@dtl@dovalue{#5}%
  \fi
\@dtl@dovalue
}
\newcommand*{\DTLifFPclosedbetween}[5]{%
  \let\@dtl@dovalue\relax
  \FPifgt{#1}{#3}%
    \def\@dtl@dovalue{#5}%
  \fi
  \FPiflt{#1}{#2}%
    \ifx\@dtl@dovalue\relax
      \def\@dtl@dovalue{#5}%
    \fi
  \else
    \def\@dtl@dovalue{#4}%
  \fi
\@dtl@dovalue
}
\newcommand{\DTLiffirstrow}[2]{%
\ifnum\dtlforeachlevel=0\relax
 \PackageError{datatool}{\string\DTLiffirstrow\space can only
 be used inside \string\DTLforeach}{}%
\else
\expandafter\ifnum\csname c@DTLrow\romannumeral
\dtlforeachlevel\endcsname
=1\relax#1\else#2\fi
\fi}
\newcommand{\DTLiflastrow}[2]{%
\ifnum\dtlforeachlevel=0\relax
 \PackageError{datatool}{\string\DTLiflastrow\space can only
 be used inside \string\DTLforeach}{}%
\else
\ifx\@dtl@nextrow\@nnil
#1\else #2\fi
\fi
}
\newcommand{\DTLifoddrow}[2]{%
\ifnum\dtlforeachlevel=0\relax
 \PackageError{datatool}{\string\DTLifoddrow\space can only
 be used inside \string\DTLforeach}{}%
\else
\expandafter\ifodd\csname c@DTLrow\romannumeral
\dtlforeachlevel\endcsname
#1\else #2\fi
\fi
}
\newif\if@dtl@condition
\newcommand*{\dtl@testlt}[2]{%
\DTLiflt{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLislt}[2]{%
\TE@throw\noexpand\dtl@testlt{#1}{#2}\noexpand\if@dtl@condition}
\newcommand*{\dtl@testiclt}[2]{%
\@sDTLiflt{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLisilt}[2]{%
\TE@throw\noexpand\dtl@testiclt{#1}{#2}\noexpand\if@dtl@condition}
\newcommand*{\dtl@testgt}[2]{%
\DTLifgt{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLisgt}[2]{%
\TE@throw\noexpand\dtl@testgt{#1}{#2}\noexpand\if@dtl@condition}
\newcommand*{\dtl@testicgt}[2]{%
\@sDTLifgt{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLisigt}[2]{%
\TE@throw\noexpand\dtl@testicgt{#1}{#2}\noexpand\if@dtl@condition}
\newcommand*{\dtl@testeq}[2]{%
\DTLifeq{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLiseq}[2]{%
\TE@throw\noexpand\dtl@testeq{#1}{#2}\noexpand\if@dtl@condition}
\newcommand*{\dtl@testiceq}[2]{%
\@sDTLifeq{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLisieq}[2]{%
\TE@throw\noexpand\dtl@testiceq{#1}{#2}\noexpand\if@dtl@condition}
\newcommand*{\DTLisSubString}[2]{%
\TE@throw\noexpand\dtl@testifsubstring{#1}{#2}%
\noexpand\if@dtl@condition}
\newcommand*{\DTLisPrefix}[2]{%
\TE@throw\noexpand\dtl@teststartswith{#1}{#2}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@testclosedbetween}[3]{%
\DTLifclosedbetween{#1}{#2}{#3}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLisclosedbetween}[3]{%
\TE@throw\noexpand\dtl@testclosedbetween{#1}{#2}{#3}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@testiclosedbetween}[3]{%
\@sDTLifclosedbetween{#1}{#2}{#3}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLisiclosedbetween}[3]{%
\TE@throw\noexpand\dtl@testiclosedbetween{#1}{#2}{#3}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@testopenbetween}[3]{%
\DTLifopenbetween{#1}{#2}{#3}{\@dtl@conditiontrue
}{\@dtl@conditionfalse}}
\newcommand*{\DTLisopenbetween}[3]{%
\TE@throw\noexpand\dtl@testopenbetween{#1}{#2}{#3}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@testiopenbetween}[3]{%
\@sDTLifopenbetween{#1}{#2}{#3}{\@dtl@conditiontrue
}{\@dtl@conditionfalse}}
\newcommand*{\DTLisiopenbetween}[3]{%
\TE@throw\noexpand\dtl@testiopenbetween{#1}{#2}{#3}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@testFPclosedbetween}[3]{%
\DTLifFPclosedbetween{#1}{#2}{#3}%
{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLisFPclosedbetween}[3]{%
\TE@throw\noexpand\dtl@testFPclosedbetween{#1}{#2}{#3}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@testFPopenbetween}[3]{%
\DTLifFPopenbetween{#1}{#2}{#3}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLisFPopenbetween}[3]{%
\TE@throw\noexpand\dtl@testFPopenbetween{#1}{#2}{#3}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@testFPislt}[2]{%
\FPiflt{#1}{#2}\@dtl@conditiontrue\else\@dtl@conditionfalse\fi}
\newcommand*{\DTLisFPlt}[2]{%
\TE@throw\noexpand\dtl@testFPislt{#1}{#2}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@testFPisgt}[2]{%
\FPifgt{#1}{#2}\@dtl@conditiontrue\else\@dtl@conditionfalse\fi}
\newcommand*{\DTLisFPgt}[2]{%
\TE@throw\noexpand\dtl@testFPisgt{#1}{#2}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@testFPiseq}[2]{%
\FPifeq{#1}{#2}\@dtl@conditiontrue\else\@dtl@conditionfalse\fi}
\newcommand*{\DTLisFPeq}[2]{%
\TE@throw\noexpand\dtl@testFPiseq{#1}{#2}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@testFPislteq}[2]{%
\FPiflt{#1}{#2}\@dtl@conditiontrue\else\@dtl@conditionfalse\fi
\if@dtl@condition
\else
 \dtl@testFPiseq{#1}{#2}%
\fi
}
\newcommand*{\DTLisFPlteq}[2]{%
\TE@throw\noexpand\dtl@testFPislteq{#1}{#2}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@testFPisgteq}[2]{%
\FPifgt{#1}{#2}\@dtl@conditiontrue\else\@dtl@conditionfalse\fi
\if@dtl@condition
\else
 \dtl@testFPiseq{#1}{#2}%
\fi
}
\newcommand*{\DTLisFPgteq}[2]{%
\TE@throw\noexpand\dtl@testFPisgteq{#1}{#2}%
\noexpand\if@dtl@condition}
\newcommand*{\dtl@teststring}[1]{%
\DTLifstring{#1}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLisstring}[1]{%
\TE@throw\noexpand\dtl@teststring{#1}\noexpand\if@dtl@condition}
\newcommand*{\dtl@testnumerical}[1]{%
\DTLifnumerical{#1}{\@dtl@conditiontrue}{\@dtl@conditionfalse}%
}
\newcommand*{\DTLisnumerical}[1]{%
\TE@throw\noexpand\dtl@testnumerical{#1}\noexpand\if@dtl@condition}
\newcommand*{\dtl@testint}[1]{%
\DTLifint{#1}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLisint}[1]{%
\TE@throw\noexpand\dtl@testint{#1}\noexpand\if@dtl@condition}
\newcommand*{\dtl@testreal}[1]{%
\DTLifreal{#1}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLisreal}[1]{%
\TE@throw\noexpand\dtl@testreal{#1}\noexpand\if@dtl@condition}
\newcommand*{\dtl@testcurrency}[1]{%
\DTLifcurrency{#1}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLiscurrency}[1]{%
\TE@throw\noexpand\dtl@testcurrency{#1}\noexpand\if@dtl@condition}
\newcommand*{\dtl@testcurrencyunit}[2]{%
\DTLifcurrencyunit{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}}
\newcommand*{\DTLiscurrencyunit}[2]{%
\TE@throw\noexpand\dtl@testcurrencyunit{#1}{#2}%
\noexpand\if@dtl@condition}
\newcommand*{\DTLnewdb}[1]{%
\DTLifdbexists{#1}{%
\PackageError{datatool}{Database `#1' already exists}{}}{%
\dtl@message{Creating database `#1'}%
\expandafter\gdef\csname dtldb@#1\endcsname{}%
\expandafter\gdef\csname dtlkeys@#1\endcsname{}%
\expandafter\global\expandafter\newcount\csname dtlrows@#1\endcsname}}
\newcommand*{\DTLrowcount}[1]{%
\expandafter\number\csname dtlrows@#1\endcsname}
\newcommand{\DTLifdbempty}[3]{%
\DTLifdbexists{#1}{%
\expandafter\ifx\csname dtldb@#1\endcsname\@empty
 #2%
\else
 #3%
\fi}{%
\PackageError{Database `#1' doesn't exist}{}{}}}
\newcommand*{\DTLnewrow}[1]{%
\DTLifdbempty{#1}{%
  \expandafter\gdef\csname dtldb@#1\endcsname{{}}%
  \expandafter\global\expandafter\advance
     \csname dtlrows@#1\endcsname by 1\relax
  \dtl@message{New row added to database `#1'}%
}{%
  \expandafter\let\expandafter\@dtl@olddb\csname dtldb@#1\endcsname%
  \expandafter\toks@\expandafter{\@dtl@olddb,{}}%
  \expandafter\xdef\csname dtldb@#1\endcsname{\the\toks@}%
  \expandafter\global\expandafter\advance
     \csname dtlrows@#1\endcsname by 1\relax
  \dtl@message{New row added to database `#1'}%
}}
\newcommand{\DTLnewdbentry}[3]{%
\@dtl@toks{#3}%
\edef\@dtl@dbvalue{\the\@dtl@toks}%
\edef\@dtl@dbid{#2}%
\edef\@dtl@dbentry{{\@dtl@dbid}{\the\@dtl@toks}}%
\DTLifdbempty{#1}{\DTLnewrow{#1}}{}%
\expandafter\dtl@choplast\expandafter{%
\csname dtldb@#1\endcsname}{\@dtl@dbrest}{\@dtl@dblastrow}%
\dtl@ifrowcontains{#2}{\@dtl@dblastrow}{%
\PackageError{datatool}{Can't add entry with ID `#2' to current
row of database `#1'}{There is already an entry with this ID on
the current row}}{%
\expandafter\@dtl@toks\expandafter{\@dtl@dbentry}%
\ifthenelse{\equal{}{\@dtl@dblastrow}}{%
  \edef\@dtl@dblastrow{\the\@dtl@toks}%
}{%
  \expandafter\toks@\expandafter{\@dtl@dblastrow}%
  \edef\@dtl@dblastrow{\the\toks@,\the\@dtl@toks}%
}%
\expandafter\@dtl@toks\expandafter{\@dtl@dblastrow}%
\ifthenelse{\equal{}{\@dtl@dbrest}}{%
  \expandafter\long\expandafter\xdef\csname dtldb@#1\endcsname{%
    {\the\@dtl@toks}}%
}{%
  \expandafter\toks@\expandafter{\@dtl@dbrest}%
  \expandafter\long\expandafter\xdef\csname dtldb@#1\endcsname{%
    \the\toks@,{\the\@dtl@toks}}%
}%
\@dtl@setidtype{#1}{#2}{#3}%
\expandafter\@dtl@setkeys\expandafter{#2}{#1}%
}%
\dtl@message{Added #2\space -> #3\space to database `#1'}%
}
\newcommand{\@dtl@setidtype}[3]{%
\@dtl@checknumerical{#3}%
\def\@dtl@value{#3}%
\@ifundefined{@dtl@idtype@#1@#2}{%
\ifx\@dtl@value\@empty
 \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{}%
\else
 \expandafter\xdef\csname @dtl@idtype@#1@#2\endcsname{%
   \the\@dtl@datatype}%
\fi
}{%
\ifx\@dtl@value\@empty
\else
  \expandafter\ifx\csname @dtl@idtype@#1@#2\endcsname\@empty
    \expandafter\xdef\csname @dtl@idtype@#1@#2\endcsname{%
      \the\@dtl@datatype}%
  \else
    \expandafter\@dtl@tmpcount\expandafter=
      \csname @dtl@idtype@#1@#2\endcsname\relax
    \ifcase\@dtl@tmpcount
    \or
      \expandafter\xdef\csname @dtl@idtype@#1@#2\endcsname{%
        \the\@dtl@datatype}%
    \or
      \ifnum\@dtl@datatype=0\relax
        \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{0}%
      \else
        \ifnum\@dtl@datatype=3\relax
          \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{3}%
        \else
          \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{2}%
        \fi
      \fi
    \or
      \ifnum\@dtl@datatype=0\relax
        \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{0}%
      \else
        \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{3}%
      \fi
    \fi
  \fi
\fi
}%
}
\newcommand*{\@dtl@setkeys}[2]{%
\edef\@dtl@tmp{\csname dtlkeys@#2\endcsname}%
\expandafter\@dtl@toks\expandafter{\@dtl@tmp}%
\expandafter\ifx\csname dtlkeys@#2\endcsname\@empty
   \expandafter\gdef\csname dtlkeys@#2\endcsname{#1}%
\else
  \@for\dtl@key:=\@dtl@tmp\do{%
  \ifthenelse{\equal{\dtl@key}{#1}}{\@endfortrue}{}%
  }%
  \if@endfor
  \else
   \expandafter\xdef\csname dtlkeys@#2\endcsname{\the\@dtl@toks,#1}%
  \fi
\fi
}
\newcommand*{\@dtl@getidtype}[2]{%
\csname @dtl@idtype@#1@#2\endcsname}
\newcommand{\DTLifdbexists}[3]{%
\@ifundefined{dtldb@#1}{#3}{#2}}
\newcommand{\dtl@ifrowcontains}[4]{%
\@for\@dtl@element:=#2\do{%
\dtl@getentryid{\@dtl@element}{\@dtl@entryid}%
\ifthenelse{\equal{#1}{\@dtl@entryid}}{\@endfortrue}{}%
}%
\if@endfor #3\else #4\fi
}
\newcommand*{\dtl@getentryid}[2]{\expandafter\@dtl@getentryid#1#2}
\long\def\@dtl@getentryid#1#2#3{\def#3{#1}}
\newcommand*{\dtl@getentryvalue}[2]{%
\expandafter\@dtl@getentryvalue#1#2}
\long\def\@dtl@getentryvalue#1#2#3{\gdef#3{#2}}
\global\newcount\dtlforeachlevel
\newcounter{DTLrowi}
\newcounter{DTLrowii}
\newcounter{DTLrowiii}
\newcounter{DTLrow}
\def\theHDTLrow{\arabic{DTLrow}}
\def\theHDTLrowi{\theHDTLrow.\arabic{DTLrowi}}
\def\theHDTLrowii{\theHDTLrowi.\arabic{DTLrowii}}
\def\theHDTLrowiii{\theHDTLrowii.\arabic{DTLrowiii}}
\newcommand*{\DTLsavelastrowcount}[1]{%
\ifnum\dtlforeachlevel>2\relax
  \def#1{0}%
\else
  \ifnum\dtlforeachlevel<0\relax
    \def#1{0}%
  \else
    \@dtl@tmpcount=\dtlforeachlevel
    \advance\@dtl@tmpcount by 1\relax
    \edef#1{\expandafter\number
      \csname c@DTLrow\romannumeral\@dtl@tmpcount\endcsname}%
  \fi
\fi}
\newcommand*{\DTLforeach}{\@ifstar\@sDTLforeach\@DTLforeach}
\newcommand{\@DTLforeach}[4][\boolean{true}]{%
\DTLifdbexists{#2}{%
\refstepcounter{DTLrow}%
\global\c@DTLrow=\c@DTLrow
\gdef\@dtl@dbname{#2}%
\global\advance\dtlforeachlevel by 1\relax
\ifnum\dtlforeachlevel>3\relax
  \PackageError{datatool}{\string\DTLforeach\space nested too
deeply}{}%
\else
  \expandafter\global
    \csname c@DTLrow\romannumeral\dtlforeachlevel\endcsname = 0\relax
  \expandafter\global\expandafter\let
    \csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname
      =\@empty
  \expandafter\global\expandafter\let
    \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname
      =\@dtl@dbname
  \expandafter\let\expandafter\@dtl@db\csname dtldb@#2\endcsname%
  \@for\@dtl@currentrow:=\@dtl@db\do{%
  \expandafter\global\expandafter
    \let\csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel
        \endcsname=\@dtl@currentrow
  \global\let\@dtl@nextrow\@xfor@nextelement
  \ifx\relax#3\relax
  \else
    \@dtl@assign{#3}%
  \fi
  \ifthenelse{#1}{%
  \refstepcounter{DTLrow\romannumeral\dtlforeachlevel}%
  \expandafter\edef\expandafter\DTLcurrentindex\expandafter
    {\arabic{DTLrow\romannumeral\dtlforeachlevel}}%
  #4%
  }{}%
  \expandafter\let\expandafter\@dtl@thiscurrentrow
    \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname
  \ifx\@dtl@thiscurrentrow\@empty
  \else
    \expandafter\@dtl@toks\expandafter{\@dtl@thiscurrentrow}%
    \expandafter
    \ifx
      \csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname
       \@empty
      \expandafter
        \xdef\csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname{%
          {\the\@dtl@toks}}%
    \else
      \expandafter\let\expandafter\@dtl@foreachrows\expandafter
        =\csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname
      \expandafter\toks@\expandafter{\@dtl@foreachrows}%
      \expandafter
      \xdef\csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname{%
        \the\toks@,{\the\@dtl@toks}}%
    \fi
  \fi
\@endforfalse
}%
\expandafter\let\expandafter\@dtl@foreachrows\expandafter
  =\csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname
\expandafter\global
  \expandafter\let\csname dtldb@#2\endcsname=\@dtl@foreachrows
\fi
\global\advance\dtlforeachlevel by -1\relax
}{%
\PackageError{datatool}{Database `#2' doesn't exist}{}}%
}
\newcommand{\@sDTLforeach}[4][\boolean{true}]{%
\DTLifdbexists{#2}{%
\refstepcounter{DTLrow}%
\global\c@DTLrow=\c@DTLrow
\gdef\@dtl@dbname{#2}%
\global\advance\dtlforeachlevel by 1\relax
\ifnum\dtlforeachlevel>3\relax
  \PackageError{datatool}{\string\DTLforeach\space nested too
deeply}{}%
\else
  \expandafter\global
    \csname c@DTLrow\romannumeral\dtlforeachlevel\endcsname = 0\relax
  \expandafter\global\expandafter\let
    \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname
      =\@nnil
  \expandafter\let\expandafter\@dtl@db\csname dtldb@#2\endcsname%
  \@for\@dtl@currentrow:=\@dtl@db\do{%
  \expandafter\global\expandafter
    \let\csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel
        \endcsname=\@dtl@currentrow
  \global\let\@dtl@nextrow\@xfor@nextelement
  \ifx\relax#3\relax
  \else
    \@dtl@assign{#3}%
  \fi
  \ifthenelse{#1}{%
  \refstepcounter{DTLrow\romannumeral\dtlforeachlevel}%
  \expandafter\edef\expandafter\DTLcurrentindex\expandafter
    {\arabic{DTLrow\romannumeral\dtlforeachlevel}}%
  #4%
  }{}%
\@endforfalse
}%
\fi
\global\advance\dtlforeachlevel by -1\relax
}{%
\PackageError{datatool}{Database `#2' doesn't exist}{}}%
}
\newcommand*{\DTLappendtorow}[2]{%
\ifnum\dtlforeachlevel=0\relax
 \PackageError{datatool}{\string\DTLappendtorow\space can only
 be used inside \string\DTLforeach}{}%
\else
  \expandafter\let\expandafter\@dtl@thisdb
    \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname
  \ifx\@dtl@thisdb\@nnil
    \PackageError{datatool}{\string\DTLappendtorow\space can't
    be used inside \string\DTLforeach*}{The starred version of
    \string\DTLforeach\space is read only}%
  \else
  \expandafter\@dtl@toks\expandafter{#2}%
  \edef\@dtl@dbvalue{\the\@dtl@toks}%
  \edef\@dtl@dbid{#1}%
  \edef\@dtl@dbentry{{\@dtl@dbid}{\the\@dtl@toks}}%
  \expandafter\let\expandafter\@dtl@thisrow
   \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname
  \dtl@ifrowcontains{#1}{\@dtl@thisrow}{%
  \PackageError{datatool}{Can't add entry with ID `#1' to current
  row of database `\@dtl@thisdb'}{There is already an entry with
  this ID on the current row}}{%
  \expandafter\@dtl@toks\expandafter{\@dtl@dbentry}%
  \ifx\@dtl@thisrow\@empty
    \expandafter
     \xdef\csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname{%
        \the\@dtl@toks}%
  \else
    \expandafter\toks@\expandafter{\@dtl@thisrow}%
    \expandafter
     \xdef\csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname{%
       \the\toks@,\the\@dtl@toks}%
  \fi
  }
  \@dtl@setidtype{\@dtl@thisdb}{#1}{#2}%
  \expandafter\@dtl@setkeys\expandafter{#1}{\@dtl@thisdb}%
 \fi
\fi
}
\newcommand*{\DTLremoveentryfromrow}[1]{%
\ifnum\dtlforeachlevel=0\relax
 \PackageError{datatool}{\string\DTLremoveentryfromrow\space can only
 be used inside \string\DTLforeach}{}%
\else
  \expandafter\let\expandafter\@dtl@thisdb
    \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname
  \ifx\@dtl@thisdb\@nnil
    \PackageError{datatool}{\string\DTLremoveentryfromrow\space can't
    be used inside \string\DTLforeach*}{The starred version of
    \string\DTLforeach\space is read only}%
  \else
  \expandafter\let\expandafter\@dtl@thisrow
   \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname
  \dtl@ifrowcontains{#1}{\@dtl@thisrow}{%
   \let\@dtl@pre=\@empty
   \@for\dtl@thisentry:=\@dtl@thisrow\do{%
     \dtl@getentryid\dtl@thisentry\@dtl@id
     \ifthenelse{\equal{\@dtl@id}{#1}}{%
     }{%
       \expandafter\@dtl@toks\expandafter{\dtl@thisentry}%
       \ifx\@dtl@pre\@empty
         \edef\@dtl@pre{{\the\@dtl@toks}}%
       \else
         \expandafter\toks@\expandafter{\@dtl@pre}%
         \edef\@dtl@pre{\the\toks@,{\the\@dtl@toks}}%
       \fi
     }
   }%
  \expandafter\let
   \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname
    =\@dtl@pre
  }{%
    \PackageError{datatool}{Can't remove entry given by key `#1'
     from current row in database `\@dtl@thisdb', no such entry}{}%
  }%
  \fi
\fi
}
\newcommand*{\DTLreplaceentryforrow}[2]{%
\ifnum\dtlforeachlevel=0\relax
 \PackageError{datatool}{\string\DTLreplaceentryforrow\space can only
 be used inside \string\DTLforeach}{}%
\else
  \expandafter\let\expandafter\@dtl@thisdb
    \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname
  \ifx\@dtl@thisdb\@nnil
    \PackageError{datatool}{\string\DTLreplaceentryforrow\space can't
    be used inside \string\DTLforeach*}{The starred version of
    \string\DTLforeach\space is read only}%
  \else
  \expandafter\@dtl@toks\expandafter{#2}%
  \edef\@dtl@dbvalue{\the\@dtl@toks}%
  \edef\@dtl@dbid{#1}%
  \edef\dtl@newentry{{\@dtl@dbid}{\the\@dtl@toks}}%
  \expandafter\let\expandafter\@dtl@thisrow
   \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname
  \dtl@ifrowcontains{#1}{\@dtl@thisrow}{%
   \let\@dtl@pre=\@empty
   \@for\dtl@thisentry:=\@dtl@thisrow\do{%
     \dtl@getentryid\dtl@thisentry\@dtl@id
     \ifthenelse{\equal{\@dtl@id}{#1}}{%
       \expandafter\@dtl@toks\expandafter{\dtl@newentry}%
     }{%
       \expandafter\@dtl@toks\expandafter{\dtl@thisentry}%
     }
     \ifx\@dtl@pre\@empty
       \edef\@dtl@pre{{\the\@dtl@toks}}%
     \else
       \expandafter\toks@\expandafter{\@dtl@pre}%
       \edef\@dtl@pre{\the\toks@,{\the\@dtl@toks}}%
     \fi
   }%
  \expandafter\let
   \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname
    =\@dtl@pre
  }{%
    \PackageError{datatool}{Can't remove entry given by key `#1'
     from current row in database `\@dtl@thisdb', no such entry}{}%
  }%
  \fi
\fi
}
\newcommand*{\DTLremovecurrentrow}{%
\ifnum\dtlforeachlevel=0\relax
 \PackageError{datatool}{\string\DTLremovecurrentrow\space can only
 be used inside \string\DTLforeach}{}%
\else
  \expandafter\ifx
    \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname\@nnil
    \PackageError{datatool}{\string\DTLremovecurrentrow\space can't
    be used inside \string\DTLforeach*}{The starred version of
    \string\DTLforeach\space is read only}%
  \else
  \expandafter\let
   \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname
     =\@empty
  \fi
\fi
}
\newcommand*{\DTLforeachkeyinrow}[2]{%
\ifnum\dtlforeachlevel=0\relax
 \PackageError{datatool}{\string\DTLforeachkeyinrow\space can only
 be used inside \string\DTLforeach}{}%
\else
  \expandafter\let\expandafter\@dtl@thisrow
   \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname
   \@for\dtl@thisentry:=\@dtl@thisrow\do{%
     \dtl@getentryvalue\dtl@thisentry{#1}%
     #2%
   }%
\fi
}
\newcommand{\DTLaddentryforrow}[5]{%
\gdef\@dtl@dbname{#1}%
\DTLifdbexists{#1}{%
  \expandafter\@dtl@toks\expandafter{#5}%
  \edef\@dtl@dbvalue{\the\@dtl@toks}%
  \edef\@dtl@dbid{#4}%
  \edef\@dtl@dbentry{{\@dtl@dbid}{\the\@dtl@toks}}%
  \expandafter
    \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname%
  \let\@dtl@prerow=\@empty
  \@for\@dtl@currentrow:=\@dtl@db\do{%
  \@dtl@assign{#2}%
  \ifthenelse{#3}{%
    \expandafter\@dtl@toks\expandafter{\@dtl@dbentry}%
    \ifx\@dtl@currentrow\@empty
      \edef\@dtl@currentrow{{\the\@dtl@toks}}%
    \else
      \expandafter\toks@\expandafter{\@dtl@currentrow}%
      \edef\@dtl@currentrow{\the\toks@,{\the\@dtl@toks}}%
    \fi
    \@endfortrue
  }{%
  }%
  \expandafter\@dtl@toks\expandafter{\@dtl@currentrow}%
  \ifx\@dtl@prerow\@empty
    \edef\@dtl@prerow{{\the\@dtl@toks}}%
  \else
    \expandafter\toks@\expandafter{\@dtl@prerow}%
    \edef\@dtl@prerow{\the\toks@,{\the\@dtl@toks}}%
  \fi
}%
\if@endfor
  \expandafter\@dtl@toks\expandafter{\@forremainder}%
  \expandafter\toks@\expandafter{\@dtl@prerow}%
  \edef\@dtl@prerow{\the\toks@,{\the\@dtl@toks}}%
  \expandafter\global\expandafter
    \let\csname dtldb@\@dtl@dbname\endcsname=\@dtl@prerow
\else
  \PackageError{datatool}{Unable to add `#5' for key `#4' - condition
    not met for any row in database `#1'}{}%
\fi
\@endforfalse
}{%
\PackageError{datatool}{Database `#1' doesn't exist}{}}%
}
\newcommand*{\@dtl@assign}[2][\@dtl@currentrow]{%
\@dtl@assigncmd#2,\relax\@@{#1}%
}
\def\@dtl@assigncmd#1=#2,#3\@@#4{%
\@for\@dtl@entry:=#4\do{%
\dtl@getentryid\@dtl@entry\@dtl@id
\ifthenelse{\equal{\@dtl@id}{#2}}{%
\dtl@getentryvalue\@dtl@entry#1%
\@endfortrue}{}%
}%
\if@endfor
\else
 \@dtl@setnull{#1}{#2}%
\fi
\@endforfalse
\ifx\relax#3%
 \let\@dtl@next=\@dtl@assigncmdnoop
\else
 \let\@dtl@next=\@dtl@assigncmd
\fi
\@dtl@next#3\@@{#4}%
}
\def\@dtl@assigncmdnoop#1\@@#2{}
\newcommand*{\@dtl@setnull}[2]{%
\@ifundefined{@dtl@idtype@\@dtl@dbname @#2}{%
\global\let#1=\DTLstringnull}{%
\edef\@dtl@tmp{0\@dtl@getidtype{\@dtl@dbname}{#2}}%
\expandafter\ifnum\@dtl@tmp=0\relax
  \global\let#1=\DTLstringnull
\else
  \global\let#1=\DTLnumbernull
\fi
}}
\newcommand*{\DTLstringnull}{NULL}
\newcommand*{\DTLnumbernull}{0}
\newcommand*{\DTLifnull}[3]{%
\ifx\DTLstringnull#1\relax
 #2%
\else
 \ifx\DTLnumbernull#1\relax
   #2%
 \else
   #3%
 \fi
\fi}
\newcommand{\dtl@gathervalues}[3][key]{%
\expandafter\let\expandafter\@dtl@tmp\expandafter
  =\csname dtlkeys@#2\endcsname%
\def\@dtl@list{}%
\@for\dtl@key:=\@dtl@tmp\do{%
 \expandafter\@dtl@setnull\expandafter{%
   \csname @dtl@#1@\dtl@key\endcsname}{\dtl@key}%
 \@for\dtl@thiselement:=#3\do{%
  \dtl@getentryid\dtl@thiselement\@dtl@id
  \ifthenelse{\equal{\@dtl@id}{\dtl@key}}{%
  \dtl@getentryvalue\dtl@thiselement\@dtl@value%
  \expandafter\toks@\expandafter{\@dtl@value}%
  \expandafter\edef\csname @dtl@#1@\dtl@key\endcsname{%
    \the\toks@}%
  \@endfortrue}{}%
 }%
\@endforfalse
}%
}
\newcommand*{\DTLsumforkeys}[4][\boolean{true}\and
\DTLisnumerical{\DTLthisval}]{%
\def#4{0}%
\@for\@dtl@dbname:=#2\do{%
  \DTLifdbexists{\@dtl@dbname}{%
  \expandafter
    \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname%
  \@for\@dtl@currentrow:=\@dtl@db\do{%
    \dtl@gathervalues{\@dtl@dbname}{\@dtl@currentrow}%
    \@for\@dtl@key:=#3\do{%
      \protected@edef\DTLthisval{%
           \csname @dtl@key@\@dtl@key\endcsname}%
      \ifthenelse{#1}{\DTLadd{#4}{#4}{\DTLthisval}}{}%
  }}%
  }{\PackageError{datatool}{Database `\@dtl@dbname' doesn't exist}{}%
  }%
}%
}
\newcommand*{\DTLmeanforkeys}[4][\boolean{true}\and
\DTLisnumerical{\DTLthisval}]{%
\def#4{0}%
\def\dtl@n{0}%
\@for\@dtl@dbname:=#2\do{%
\DTLifdbexists{\@dtl@dbname}{%
  \expandafter
    \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname%
  \@for\@dtl@currentrow:=\@dtl@db\do{%
    \dtl@gathervalues{\@dtl@dbname}{\@dtl@currentrow}%
    \@for\@dtl@key:=#3\do{%
      \protected@edef\DTLthisval{%
         \csname @dtl@key@\@dtl@key\endcsname}%
      \ifthenelse{#1}{%
        \DTLadd{#4}{#4}{\DTLthisval}%
        \DTLadd{\dtl@n}{\dtl@n}{1}%
    }{}%
  }}%
}{\PackageError{datatool}{Database `\@dtl@dbname' doesn't exist}{}}}%
\ifnum\dtl@n=0\relax
 \PackageError{datatool}{Can't compute mean, no data!}{}%
\else
  \DTLdiv{#4}{#4}{\dtl@n}%
\fi
}
\newcommand*{\DTLvarianceforkeys}[4][\boolean{true}\and
\DTLisnumerical{\DTLthisval}]{%
\DTLmeanforkeys[#1]{#2}{#3}{\dtl@mean}%
\def#4{0}%
\@for\@dtl@dbname:=#2\do{%
  \DTLifdbexists{\@dtl@dbname}{%
  \expandafter
    \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname
  \@for\@dtl@currentrow:=\@dtl@db\do{%
    \dtl@gathervalues{\@dtl@dbname}{\@dtl@currentrow}%
    \@for\@dtl@key:=#3\do{%
      \protected@edef\DTLthisval{%
           \csname @dtl@key@\@dtl@key\endcsname}%
      \ifthenelse{#1}{%
        \DTLsub{\dtl@diff}{\DTLthisval}{\dtl@mean}%
        \DTLmul{\dtl@diff}{\dtl@diff}{\dtl@diff}%
        \DTLadd{#4}{#4}{\dtl@diff}%
      }{}%
  }}%
  }{\PackageError{datatool}{Database `\@dtl@dbname' doesn't exist}{}%
  }%
}%
\ifnum\dtl@n=0\relax
  \PackageError{datatool}{Can't compute variance, no data!}{}%
\else
  \DTLdiv{#4}{#4}{\dtl@n}%
\fi
}
\newcommand*{\DTLsdforkeys}[4][\boolean{true}\and
\DTLisnumerical{\DTLthisval}]{%
\DTLvarianceforkeys[#1]{#2}{#3}{#4}%
\DTLsqrt{#4}{#4}%
}
\newcommand*{\DTLminforkeys}[4][\boolean{true}\and
\DTLisnumerical{\DTLthisval}]{%
\def#4{}%
\@for\@dtl@dbname:=#2\do{%
\DTLifdbexists{\@dtl@dbname}{%
  \expandafter
    \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname%
  \@for\@dtl@currentrow:=\@dtl@db\do{%
    \dtl@gathervalues{\@dtl@dbname}{\@dtl@currentrow}%
    \@for\@dtl@key:=#3\do{%
      \protected@edef\DTLthisval{%
         \csname @dtl@key@\@dtl@key\endcsname}%
      \ifthenelse{#1}{%
        \ifx#4\@empty
          \let#4=\DTLthisval
        \else
          \DTLmin{#4}{#4}{\DTLthisval}%
        \fi
    }{}%
}}%
  }{\PackageError{datatool}{Database `\@dtl@dbname' doesn't exist}{}%
  }%
}}
\newcommand*{\DTLmaxforkeys}[4][\boolean{true}\and
\DTLisnumerical{\DTLthisval}]{%
\def#4{}%
\@for\@dtl@dbname:=#2\do{%
\DTLifdbexists{\@dtl@dbname}{%
  \expandafter
    \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname%
  \@for\@dtl@currentrow:=\@dtl@db\do{%
    \dtl@gathervalues{\@dtl@dbname}{\@dtl@currentrow}%
    \@for\@dtl@key:=#3\do{%
      \protected@edef\DTLthisval{%
         \csname @dtl@key@\@dtl@key\endcsname}%
      \ifthenelse{#1}{%
        \ifx#4\@empty
          \let#4=\DTLthisval
        \else
          \DTLmax{#4}{#4}{\DTLthisval}%
        \fi
    }{}%
}}%
  }{\PackageError{datatool}{Database `\@dtl@dbname' doesn't exist}{}%
  }%
}}
\newcommand*{\DTLcomputebounds}[8][\boolean{true}]{%
\let#5=\relax
\let#6=\relax
\let#7=\relax
\let#8=\relax
\@for\dtl@thisdb:=#2\do{%
  \@sDTLforeach[#1]{\dtl@thisdb}{\DTLthisX=#3,\DTLthisY=#4}{%
    \DTLconverttodecimal{\DTLthisX}{\dtl@decx}%
    \DTLconverttodecimal{\DTLthisY}{\dtl@decy}%
    \ifx#5\relax
      \let#5=\dtl@decx
      \let#6=\dtl@decy
      \let#7=\dtl@decx
      \let#8=\dtl@decy
    \else
      \FPmin{#5}{#5}{\dtl@decx}%
      \FPmin{#6}{#6}{\dtl@decy}%
      \FPmax{#7}{#7}{\dtl@decx}%
      \FPmax{#8}{#8}{\dtl@decy}%
    \fi
  }%
}%
}
\newcommand*{\DTLgetvalueforkey}[5]{%
{%
\global\let#1=\DTLstringnull
\@sDTLforeach{#3}{\dtl@valueA=#2,\dtl@refvalue=#4}{%
\DTLifnull{\dtl@refvalue}{}{%
\ifthenelse{\equal{\dtl@refvalue}{#5}}{%
\global\let#1=\dtl@valueA
\@endfortrue
}{}}}%
}}
\newcommand*{\DTLgetrowforkey}[4]{%
{%
\global\let#1=\@empty
\@sDTLforeach{#2}{\dtl@refvalue=#3}{%
\DTLifnull{\dtl@refvalue}{}{%
\ifthenelse{\equal{\dtl@refvalue}{#4}}{%
\expandafter\global\expandafter\let\expandafter#1
   \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname
\@endfortrue
}{}}}%
}}
\newcommand*{\DTLsort}{\@ifstar\@sDTLsort\@DTLsort}
\newcommand*{\@DTLsort}[3][]{%
\edef\@dtl@replacementkeys{#1}%
\edef\@dtl@sortorder{#2}%
\edef\@dtl@dbname{#3}%
\let\@dtl@comparecs=\dtlcompare
\expandafter\let\expandafter\@dtl@list\csname dtldb@#3\endcsname
\dtl@sortlist{\@dtl@list}{\@dtl@sortcriteria}%
\expandafter\global\expandafter
  \let\csname dtldb@#3\endcsname=\@dtl@list}
\newcommand*{\@sDTLsort}[3][]{%
\edef\@dtl@replacementkeys{#1}%
\edef\@dtl@sortorder{#2}%
\edef\@dtl@dbname{#3}%
\let\@dtl@comparecs=\dtlicompare
\expandafter\let\expandafter\@dtl@list\csname dtldb@#3\endcsname
\dtl@sortlist{\@dtl@list}{\@dtl@sortcriteria}%
\expandafter\global\expandafter
  \let\csname dtldb@#3\endcsname=\@dtl@list}
\newcommand{\@dtl@sortcriteria}[2]{%
\@for\@dtl@level:=\@dtl@sortorder\do{%
 \expandafter\@dtl@getsortdirection\@dtl@level=\relax%
 \@ifundefined{@dtl@idtype@\@dtl@dbname @\@dtl@key}{%
 \ifx\@dtl@replacementkeys\@empty
   \PackageError{datatool}{Unknown key `\@dtl@key' for database
   `\@dtl@dbname'}{}%
 \else
   \dtl@gathervalues[keya]{\@dtl@dbname}{#1}%
   \dtl@gathervalues[keyb]{\@dtl@dbname}{#2}%
   \@ifundefined{@dtl@keya@\@dtl@key}{%
     \@dtl@setnull{\@dtl@tmpa}{\@dtl@key}%
   }{%
   \expandafter\let\expandafter\@dtl@tmpa\expandafter
     =\csname @dtl@keya@\@dtl@key\endcsname}%
   \@ifundefined{@dtl@keyb@\@dtl@key}{%
     \@dtl@setnull{\@dtl@tmpb}{\@dtl@key}%
   }{%
   \expandafter\let\expandafter\@dtl@tmpb\expandafter
     =\csname @dtl@keyb@\@dtl@key\endcsname}%
   \let\@dtl@keya=\@dtl@key
   \let\@dtl@keyb=\@dtl@key
   \DTLifnull{\@dtl@tmpa}{%
   % find first non null key in list of replacement keys
     \@for\@dtl@keya:=\@dtl@replacementkeys\do{%
       \@ifundefined{@dtl@keya@\@dtl@keya}{}{%
       \expandafter\let\expandafter\@dtl@tmpa\expandafter
         =\csname @dtl@keya@\@dtl@keya\endcsname
       \DTLifnull{\@dtl@tmpa}{}{\@endfortrue}}%
     }%
     \if@endfor \else\let\@dtl@keya=\@dtl@key \fi
     \@endforfalse
   }{}%
   \DTLifnull{\@dtl@tmpb}{%
   % find first non null key in list of replacement keys
     \@for\@dtl@keyb:=\@dtl@replacementkeys\do{%
       \@ifundefined{@dtl@keyb@\@dtl@keyb}{}{%
       \expandafter\let\expandafter\@dtl@tmpb\expandafter
         =\csname @dtl@keyb@\@dtl@keyb\endcsname
       \DTLifnull{\@dtl@tmpb}{}{\@endfortrue}}%
     }%
     \if@endfor \else\let\@dtl@keyb=\@dtl@key \fi
     \@endforfalse
   }{}%
   \@ifundefined{@dtl@idtype@\@dtl@dbname @\@dtl@keya}{%
     \@ifundefined{@dtl@idtype@\@dtl@dbname @\@dtl@keyb}{%
     \dtl@sortresult=0\relax}{\dtl@sortresult=-1\relax}%
   }{%
     \@ifundefined{@dtl@idtype@\@dtl@dbname @\@dtl@keyb}{%
     \dtl@sortresult=1\relax}{%
       \dtl@compare@{\@dtl@keya}{\@dtl@keyb}{#1}{#2}%
     }%
   }%
 \fi
 }{%
 \ifx\@dtl@replacementkeys\@empty
   \dtl@compare{\@dtl@key}{#1}{#2}%
 \else
   \dtl@gathervalues[keya]{\@dtl@dbname}{#1}%
   \dtl@gathervalues[keyb]{\@dtl@dbname}{#2}%
   \@ifundefined{@dtl@keya@\@dtl@key}{%
     \@dtl@setnull{\@dtl@tmpa}{\@dtl@key}%
   }{%
   \expandafter\let\expandafter\@dtl@tmpa\expandafter
     =\csname @dtl@keya@\@dtl@key\endcsname}%
   \@ifundefined{@dtl@keyb@\@dtl@key}{%
     \@dtl@setnull{\@dtl@tmpb}{\@dtl@key}%
   }{%
   \expandafter\let\expandafter\@dtl@tmpb\expandafter
     =\csname @dtl@keyb@\@dtl@key\endcsname}%
   \let\@dtl@keya=\@dtl@key
   \let\@dtl@keyb=\@dtl@key
   \DTLifnull{\@dtl@tmpa}{%
   % find first non null key in list of replacement keys
     \@for\@dtl@keya:=\@dtl@replacementkeys\do{%
       \@ifundefined{@dtl@keya@\@dtl@keya}{}{%
       \expandafter\let\expandafter\@dtl@tmpa\expandafter
         =\csname @dtl@keya@\@dtl@keya\endcsname
       \DTLifnull{\@dtl@tmpa}{}{\@endfortrue}}%
     }%
     \if@endfor \else\let\@dtl@keya=\@dtl@key \fi
     \@endforfalse
   }{}%
   \DTLifnull{\@dtl@tmpb}{%
   % find first non null key in list of replacement keys
     \@for\@dtl@keyb:=\@dtl@replacementkeys\do{%
       \@ifundefined{@dtl@keyb@\@dtl@keyb}{}{%
       \expandafter\let\expandafter\@dtl@tmpb\expandafter
         =\csname @dtl@keyb@\@dtl@keyb\endcsname
       \DTLifnull{\@dtl@tmpb}{}{\@endfortrue}}%
     }%
     \if@endfor \else\let\@dtl@keyb=\@dtl@key \fi
     \@endforfalse
   }{}%
   \dtl@compare@{\@dtl@keya}{\@dtl@keyb}{#1}{#2}%
  \fi
 \multiply\dtl@sortresult by \@dtl@sortdirection\relax
 \ifnum\dtl@sortresult=0\relax
 \else
  \@endfortrue
 \fi
 }%
}%
}
\def\@dtl@getsortdirection#1=#2\relax{%
\def\@dtl@key{#1}%
\def\@dtl@sortdirection{#2}%
\ifx\@dtl@sortdirection\@empty
 \def\@dtl@sortdirection{-1}%
\else
 \@dtl@get@sortdirection#2%
 \ifthenelse{\equal{\@dtl@sortdirection}{ascending}}{%
 \def\@dtl@sortdirection{-1}}{%
  \ifthenelse{\equal{\@dtl@sortdirection}{descending}}{%
   \def\@dtl@sortdirection{1}}{%
   \PackageError{datatool}{Invalid sort direction
    `\@dtl@sortdirection'}{%
    The sort direction can only be one of `ascending' or
    `descending'}\def\@dtl@sortdirection{-1}}}%
\fi
}
\def\@dtl@get@sortdirection#1={\def\@dtl@sortdirection{#1}}
\newtoks\@dtl@toksA\newtoks\@dtl@toksB
\newcommand{\dtl@compare}[3]{%
\dtl@gathervalues{\@dtl@dbname}{#2}%
\expandafter\let\expandafter\@dtl@tmp\expandafter
 =\csname @dtl@key@#1\endcsname
\expandafter\@dtl@toksA\expandafter{\@dtl@tmp}%
\edef\@dtl@a{\the\@dtl@toksA}%
\dtl@gathervalues{\@dtl@dbname}{#3}%
\expandafter\let\expandafter\@dtl@tmp\expandafter
 =\csname @dtl@key@#1\endcsname
\expandafter\@dtl@toksB\expandafter{\@dtl@tmp}%
\edef\@dtl@b{\the\@dtl@toksB}%
\expandafter\@dtl@datatype\expandafter=
 \csname @dtl@idtype@\@dtl@dbname @#1\endcsname\relax
\ifnum\@dtl@datatype=0\relax
  \edef\@dtl@tmpcmp{%
    \noexpand\@dtl@comparecs{\noexpand\dtl@sortresult}%
      {\the\@dtl@toksA}{\the\@dtl@toksB}}%
  \@dtl@tmpcmp
\else
  \DTLifnumlt{\@dtl@a}{\@dtl@b}{\dtl@sortresult=-1\relax}{%
  \DTLifnumgt{\@dtl@a}{\@dtl@b}{\dtl@sortresult=1\relax}{%
  \dtl@sortresult=0\relax}}%
\fi
\ifdtlverbose
\@onelevel@sanitize\@dtl@a
\@onelevel@sanitize\@dtl@b
\fi
\dtl@message{`\@dtl@a' <=> `\@dtl@b' = \number\dtl@sortresult}%
}
\newcommand{\dtl@compare@}[4]{%
\dtl@gathervalues{\@dtl@dbname}{#3}%
\expandafter\let\expandafter\@dtl@tmp\expandafter
 =\csname @dtl@key@#1\endcsname
\expandafter\@dtl@toksA\expandafter{\@dtl@tmp}%
\edef\@dtl@a{\the\@dtl@toksA}%
\dtl@gathervalues{\@dtl@dbname}{#4}%
\expandafter\let\expandafter\@dtl@tmp\expandafter
 =\csname @dtl@key@#2\endcsname
\expandafter\@dtl@toksB\expandafter{\@dtl@tmp}%
\edef\@dtl@b{\the\@dtl@toksB}%
\expandafter\@dtl@tmpcount\expandafter=
 \csname @dtl@idtype@\@dtl@dbname @#1\endcsname\relax
\expandafter\@dtl@datatype\expandafter=
 \csname @dtl@idtype@\@dtl@dbname @#2\endcsname\relax
\multiply\@dtl@datatype by \@dtl@tmpcount\relax
\ifnum\@dtl@datatype=0\relax
  \edef\@dtl@tmpcmp{%
    \noexpand\@dtl@comparecs{\noexpand\dtl@sortresult}%
      {\the\@dtl@toksA}{\the\@dtl@toksB}}%
  \@dtl@tmpcmp
\else
  \DTLifnumlt{\@dtl@a}{\@dtl@b}{\dtl@sortresult=-1\relax}{%
  \DTLifnumgt{\@dtl@a}{\@dtl@b}{\dtl@sortresult=1\relax}{%
  \dtl@sortresult=0\relax}}%
\fi
\ifdtlverbose
\@onelevel@sanitize\@dtl@a
\@onelevel@sanitize\@dtl@b
\fi
\dtl@message{`\@dtl@a' <=> `\@dtl@b' = \number\dtl@sortresult}%
}
\newcommand*{\dtl@choplast}[3]{%
\let#2\@empty
\let#3\@empty
\@for\@dtl@element:=#1\do{%
\ifx#3\@empty
\else
 \ifx#2\@empty
   \expandafter\toks@\expandafter{#3}%
   \edef#2{{\the\toks@}}%
 \else
   \expandafter\toks@\expandafter{#3}%
   \expandafter\@dtl@toks\expandafter{#2}%
   \edef#2{\the\@dtl@toks,{\the\toks@}}%
 \fi
\fi
\let#3=\@dtl@element%
}%
}
\newcommand*{\dtl@chopfirst}[3]{%
\let#2=\@empty
\let#3=\@empty
\@for\@dtl@element:=#1\do{%
 \let#2=\@dtl@element
 \@endfortrue
}%
\if@endfor
 \let#3=\@forremainder
\fi
\@endforfalse
}
\newcommand{\dtl@sortlist}[2]{%
\def\@dtl@sortedlist{}%
\@for\@dtl@currentrow:=#1\do{%
\expandafter\dtl@insertinto\expandafter
  {\@dtl@currentrow}{\@dtl@sortedlist}{#2}%
\@endforfalse}%
\let#1=\@dtl@sortedlist
}
\newtoks\@dtl@toks
\newcommand{\dtl@insertinto}[3]{%
\def\@dtl@newsortedlist{}%
\@dtl@insertdonefalse
\@for\dtl@srtelement:=#2\do{%
\if@dtl@insertdone
  \expandafter\toks@\expandafter{\dtl@srtelement}%
  \edef\@dtl@newstuff{{\the\toks@}}%
\else
  \expandafter#3\expandafter{\dtl@srtelement}{#1}%
  \ifnum\dtl@sortresult<0\relax
    \expandafter\toks@\expandafter{\dtl@srtelement}%
    \@dtl@toks{#1}%
    \edef\@dtl@newstuff{{\the\@dtl@toks},{\the\toks@}}%
    \@dtl@insertdonetrue
  \else
    \expandafter\toks@\expandafter{\dtl@srtelement}%
    \edef\@dtl@newstuff{{\the\toks@}}%
  \fi
\fi
\ifx\@dtl@newsortedlist\@empty
  \expandafter\toks@\expandafter{\@dtl@newstuff}%
  \edef\@dtl@newsortedlist{\the\toks@}%
\else
  \expandafter\toks@\expandafter{\@dtl@newsortedlist}%
  \expandafter\@dtl@toks\expandafter{\@dtl@newstuff}%
  \edef\@dtl@newsortedlist{\the\toks@,\the\@dtl@toks}%
\fi
\@endforfalse
}%
 \ifx\@dtl@newsortedlist\@empty
   \@dtl@toks{#1}%
   \edef\@dtl@newsortedlist{{\the\@dtl@toks}}%
 \else
   \if@dtl@insertdone
   \else
     \expandafter\toks@\expandafter{\@dtl@newsortedlist}%
     \@dtl@toks{#1}%
     \edef\@dtl@newsortedlist{\the\toks@,{\the\@dtl@toks}}%
   \fi
 \fi
\global\let#2=\@dtl@newsortedlist
}
\newif\if@dtl@insertdone
\newcount\dtl@sortresult
\newcommand*{\DTLadd}[3]{%
\DTLconverttodecimal{#2}{\@dtl@numi}%
\DTLconverttodecimal{#3}{\@dtl@numii}%
\FPadd{\@dtl@tmp}{\@dtl@numi}{\@dtl@numii}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@tmp}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@tmp}{#1}%
\fi
}
\newcommand*{\DTLgadd}[3]{%
\DTLadd{\@dtl@tmpii}{#2}{#3}%
\global\let#1=\@dtl@tmpii
}
\newcommand*{\DTLaddall}[2]{%
\def\@dtl@sum{0}%
\@for\dtl@thisval:=#2\do{%
  \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}%
  \FPadd{\@dtl@sum}{\@dtl@sum}{\@dtl@num}%
}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@sum}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@sum}{#1}%
\fi
}
\newcommand*{\DTLgaddall}[2]{%
\DTLaddall{\@dtl@tmpi}{#2}%
\global\let#1=\@dtl@tmpi
}
\newcommand*{\DTLsub}[3]{%
\DTLconverttodecimal{#2}{\@dtl@numi}%
\DTLconverttodecimal{#3}{\@dtl@numii}%
\FPsub{\@dtl@tmp}{\@dtl@numi}{\@dtl@numii}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@tmp}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@tmp}{#1}%
\fi
}
\newcommand*{\DTLgsub}[3]{%
\DTLsub{\@dtl@tmpii}{#2}{#3}%
\global\let#1=\@dtl@tmpii
}
\newcommand*{\DTLmul}[3]{%
\let\@dtl@thisreplaced=\@empty
\DTLconverttodecimal{#2}{\@dtl@numi}%
\ifx\@dtl@replaced\@empty
\else
  \let\@dtl@thisreplaced=\@dtl@replaced
\fi
\DTLconverttodecimal{#3}{\@dtl@numii}%
\ifx\@dtl@replaced\@empty
\else
  \let\@dtl@thisreplaced=\@dtl@replaced
\fi
\FPmul{\@dtl@tmp}{\@dtl@numi}{\@dtl@numii}%
\ifx\@dtl@thisreplaced\@empty
  \DTLdecimaltolocale{\@dtl@tmp}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@tmp}{#1}%
\fi
}
\newcommand*{\DTLgmul}[3]{%
\DTLmul{\@dtl@tmpii}{#2}{#3}%
\global\let#1=\@dtl@tmpii
}
\newcommand*{\DTLdiv}[3]{%
\let\@dtl@thisreplaced=\@empty
\DTLconverttodecimal{#2}{\@dtl@numi}%
\ifx\@dtl@replaced\@empty
\else
  \let\@dtl@thisreplaced=\@dtl@replaced
\fi
\DTLconverttodecimal{#3}{\@dtl@numii}%
\FPdiv{\@dtl@tmp}{\@dtl@numi}{\@dtl@numii}%
\ifx\@dtl@thisreplaced\@empty
  \DTLdecimaltolocale{\@dtl@tmp}{#1}%
\else
  \ifx\@dtl@thisreplaced\@dtl@replaced
    \DTLdecimaltolocale{\@dtl@tmp}{#1}%
  \else
    \DTLdecimaltocurrency{\@dtl@tmp}{#1}%
  \fi
\fi
}
\newcommand*{\DTLgdiv}[3]{%
\DTLdiv{\@dtl@tmpii}{#2}{#3}%
\global\let#1=\@dtl@tmpii
}
\newcommand*{\DTLabs}[2]{%
\DTLconverttodecimal{#2}{\@dtl@numi}%
\FPabs{\@dtl@tmp}{\@dtl@numi}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@tmp}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@tmp}{#1}%
\fi
}
\newcommand*{\DTLgabs}[2]{%
\DTLabs{\@dtl@tmpii}{#2}%
\global\let#1=\@dtl@tmpii
}
\newcommand*{\DTLneg}[2]{%
\DTLconverttodecimal{#2}{\@dtl@numi}%
\FPneg{\@dtl@tmp}{\@dtl@numi}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@tmp}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@tmp}{#1}%
\fi
}
\newcommand*{\DTLgneg}[2]{%
\DTLneg{\@dtl@tmpii}{#2}%
\global\let#1=\@dtl@tmpii
}
\newcommand*{\DTLsqrt}[2]{%
\DTLconverttodecimal{#2}{\@dtl@numi}%
\FProot{\@dtl@tmpi}{\@dtl@numi}{2}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@tmpi}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@tmpi}{#1}%
\fi
}
\newcommand*{\DTLgsqrt}[2]{%
\DTLsqrt{\@dtl@tmpii}{#2}%
\global\let#1=\@dtl@tmpii
}
\newcommand*{\DTLmin}[3]{%
\DTLconverttodecimal{#2}{\@dtl@numi}%
\DTLconverttodecimal{#3}{\@dtl@numii}%
\FPiflt{\@dtl@numi}{\@dtl@numii}%
 \dtl@ifsingle{#2}{%
  \let#1=#2}{%
  \def#1{#2}}%
\else
 \dtl@ifsingle{#3}{%
  \let#1=#3}{%
  \def#1{#3}}%
\fi
}
\newcommand*{\DTLgmin}[3]{%
\DTLmin{\@dtl@tmpii}{#2}{#3}%
\global\let#1=\@dtl@tmpii
}
\newcommand*{\DTLminall}[2]{%
\let\@dtl@min=\@empty
\@for\dtl@thisval:=#2\do{%
  \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}%
  \ifx\@dtl@min\@empty
    \let\@dtl@min=\@dtl@num
  \else
    \FPmin{\@dtl@min}{\@dtl@min}{\@dtl@num}%
  \fi
}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@min}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@min}{#1}%
\fi
}
\newcommand*{\DTLgminall}[2]{%
\DTLminall{\@dtl@tmpi}{#2}%
\global\let#1=\@dtl@tmpi
}
\newcommand*{\DTLmax}[3]{%
\DTLconverttodecimal{#2}{\@dtl@numi}%
\DTLconverttodecimal{#3}{\@dtl@numii}%
\FPmax{\@dtl@tmp}{\@dtl@numi}{\@dtl@numii}%
\FPifgt{\@dtl@numi}{\@dtl@numii}%
 \dtl@ifsingle{#2}{%
  \let#1=#2}{%
  \def#1{#2}}%
\else
 \dtl@ifsingle{#3}{%
  \let#1=#3}{%
  \def#1{#3}}%
\fi
}
\newcommand*{\DTLgmax}[3]{%
\DTLmax{\@dtl@tmpii}{#2}{#3}%
\global\let#1=\@dtl@tmpii
}
\newcommand*{\DTLmaxall}[2]{%
\let\@dtl@max=\@empty
\@for\dtl@thisval:=#2\do{%
  \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}%
  \ifx\@dtl@max\@empty
    \let\@dtl@max\@dtl@num
  \else
    \FPmax{\@dtl@max}{\@dtl@max}{\@dtl@num}%
  \fi
}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@max}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@max}{#1}%
\fi
}
\newcommand*{\DTLgmaxall}[2]{%
\DTLmaxall{\@dtl@tmpi}{#2}%
\global\let#1=\@dtl@tmpi
}
\newcommand*{\DTLmeanforall}[2]{%
\def\@dtl@mean{0}%
\def\@dtl@n{0}%
\@for\dtl@thisval:=#2\do{%
  \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}%
  \FPadd{\@dtl@mean}{\@dtl@mean}{\@dtl@num}%
  \FPadd{\@dtl@n}{\@dtl@n}{1}%
}%
\FPdiv{\@dtl@mean}{\@dtl@mean}{\@dtl@n}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@mean}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@mean}{#1}%
\fi
}
\newcommand*{\DTLgmeanforall}[2]{%
\DTLmeanforall{\@dtl@tmpi}{#2}%
\global\let#1=\@dtl@tmpi
}
\newcommand*{\DTLvarianceforall}[2]{%
\def\@dtl@mean{0}%
\def\@dtl@n{0}%
\let\@dtl@decvals=\@empty
\@for\dtl@thisval:=#2\do{%
  \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}%
  \ifx\@dtl@decvals\@empty
   \let\@dtl@decvals=\@dtl@num
  \else
   \expandafter\toks@\expandafter{\@dtl@decvals}%
   \edef\@dtl@decvals{\the\toks@,\@dtl@num}%
  \fi
  \FPadd{\@dtl@mean}{\@dtl@mean}{\@dtl@num}%
  \FPadd{\@dtl@n}{\@dtl@n}{1}%
}%
\FPdiv{\@dtl@mean}{\@dtl@mean}{\@dtl@n}%
\def\@dtl@var{0}%
\@for\@dtl@num:=\@dtl@decvals\do{%
  \FPsub{\@dtl@diff}{\@dtl@num}{\@dtl@mean}%
  \FPmul{\@dtl@diff}{\@dtl@diff}{\@dtl@diff}%
  \FPadd{\@dtl@var}{\@dtl@var}{\@dtl@diff}%
}%
\FPdiv{\@dtl@var}{\@dtl@var}{\@dtl@n}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@var}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@var}{#1}%
\fi
}
\newcommand*{\DTLgvarianceforall}[2]{%
\DTLvarianceforall{\@dtl@tmpi}{#2}%
\global\let#1=\@dtl@tmpi
}
\newcommand*{\DTLsdforall}[2]{%
\def\@dtl@mean{0}%
\def\@dtl@n{0}%
\let\@dtl@decvals=\@empty
\@for\dtl@thisval:=#2\do{%
  \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}%
  \ifx\@dtl@decvals\@empty
   \let\@dtl@decvals=\@dtl@num
  \else
   \expandafter\toks@\expandafter{\@dtl@decvals}%
   \edef\@dtl@decvals{\the\toks@,\@dtl@num}%
  \fi
  \FPadd{\@dtl@mean}{\@dtl@mean}{\@dtl@num}%
  \FPadd{\@dtl@n}{\@dtl@n}{1}%
}%
\FPdiv{\@dtl@mean}{\@dtl@mean}{\@dtl@n}%
\def\@dtl@sd{0}%
\@for\@dtl@num:=\@dtl@decvals\do{%
  \FPsub{\@dtl@diff}{\@dtl@num}{\@dtl@mean}%
  \FPmul{\@dtl@diff}{\@dtl@diff}{\@dtl@diff}%
  \FPadd{\@dtl@sd}{\@dtl@sd}{\@dtl@diff}%
}%
\FPdiv{\@dtl@sd}{\@dtl@sd}{\@dtl@n}%
\FProot{\@dtl@sd}{\@dtl@sd}{2}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@sd}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@sd}{#1}%
\fi
}
\newcommand*{\DTLgsdforall}[2]{%
\DTLsdforall{\@dtl@tmpi}{#2}%
\global\let#1=\@dtl@tmpi
}
\newcommand*{\DTLround}[3]{%
\DTLconverttodecimal{#2}{\@dtl@numi}%
\FPround{\@dtl@tmp}{\@dtl@numi}{#3}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@tmp}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@tmp}{#1}%
\fi
}
\newcommand*{\DTLground}[3]{%
\DTLround{\@dtl@tmpii}{#2}{#3}%
\global\let#1=\@dtl@tmpii
}
\newcommand*{\DTLtrunc}[3]{%
\DTLconverttodecimal{#2}{\@dtl@numi}%
\FPtrunc{\@dtl@tmp}{\@dtl@numi}{#3}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@tmp}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@tmp}{#1}%
\fi
}
\newcommand*{\DTLgtrunc}[3]{%
\DTLtrunc{\@dtl@tmpii}{#2}{#3}%
\global\let#1=\@dtl@tmpii
}
\newcommand*{\DTLclip}[2]{%
\DTLconverttodecimal{#2}{\@dtl@numi}%
\FPclip{\@dtl@tmp}{\@dtl@numi}%
\ifx\@dtl@replaced\@empty
  \DTLdecimaltolocale{\@dtl@tmp}{#1}%
\else
  \DTLdecimaltocurrency{\@dtl@tmp}{#1}%
\fi
}
\newcommand*{\DTLgclip}[3]{%
\DTLclip{\@dtl@tmpii}{#2}%
\global\let#1=\@dtl@tmpii
}
\newcommand*\DTLinitials[1]{%
\def\dtl@initialscmd{}%
\dtl@subnobrsp{#1}{\dtl@string}%
\DTLsubstituteall{\dtl@string}{~}{ }%
\DTLsubstituteall{\dtl@string}{\ }{ }%
\DTLsubstituteall{\dtl@string}{\space}{ }%
\expandafter\dtl@initials\dtl@string{} \@nil%
\dtl@initialscmd}%
\edef\dtl@construct@subnobrsp{%
\noexpand\def\noexpand\@dtl@subnobrsp##1\noexpand\protect
\expandafter\noexpand\csname nobreakspace \endcsname ##2{%
\noexpand\toks@{##1}%
\noexpand\expandafter\noexpand\@dtl@toks\noexpand\expandafter{%
\noexpand\@dtl@string}%
\noexpand\edef\noexpand\@dtl@string{\noexpand\the\noexpand\@dtl@toks
\noexpand\the\noexpand\toks@}%
\noexpand\def\noexpand\@dtl@tmp{##2}%
\noexpand\ifx\noexpand\@dtl@tmp\noexpand\@nnil
  \noexpand\let\noexpand\@dtl@subnobrspnext=\noexpand\relax
\noexpand\else
  \noexpand\toks@{ }%
  \noexpand\expandafter\noexpand\@dtl@toks\noexpand\expandafter{%
  \noexpand\@dtl@string}%
  \noexpand\edef\noexpand\@dtl@string{\noexpand\the\noexpand\@dtl@toks
  \noexpand\the\noexpand\toks@}%
  \noexpand\let\noexpand\@dtl@subnobrspnext=\noexpand\@dtl@subnobrsp
\noexpand\fi
\noexpand\@dtl@subnobrspnext
}%
\noexpand\def\noexpand\dtl@subnobrsp##1##2{%
\noexpand\def\noexpand\@dtl@string{}%
\noexpand\@dtl@subnobrsp ##1\noexpand\protect\expandafter\noexpand
\csname nobreakspace \endcsname \noexpand\@nil
\noexpand\let##2=\noexpand\@dtl@string
}}
\dtl@construct@subnobrsp
\newcommand*{\DTLstoreinitials}[2]{%
\def\dtl@initialscmd{}%
\dtl@subnobrsp{#1}{\dtl@string}%
\DTLsubstituteall{\dtl@string}{~}{ }%
\DTLsubstituteall{\dtl@string}{\ }{ }%
\DTLsubstituteall{\dtl@string}{\space}{ }%
\expandafter\dtl@initials\dtl@string{} \@nil
\let#2=\dtl@initialscmd
}
\def\dtl@initials#1#2 #3{%
\dtl@ifsingle{#1}{%
\ifcat\noexpand#1\relax\relax
   \def\@dtl@donextinitials{\@dtl@initials#2 {#3}}%
\else
   \def\@dtl@donextinitials{\@dtl@initials#1#2 {#3}}%
\fi
}{%
 \def\@dtl@donextinitials{\@dtl@initials{#1}#2 {#3}}%
}%
\@dtl@donextinitials
}
\def\@dtl@initials#1#2 #3{%
\dtl@initialshyphen#2-{}\dtl@endhyp
\expandafter\@dtl@toks\expandafter{\dtl@initialscmd}%
\toks@{#1}%
\ifx\dtl@inithyphen\@empty
\else
  \edef\dtl@initialscmd{\the\@dtl@toks\the\toks@}%
  \expandafter\@dtl@toks\expandafter{\dtl@initialscmd}%
  \expandafter\toks@\expandafter{\dtl@inithyphen}%
\fi
\def\dtl@tmp{#3}%
\ifx\@nnil\dtl@tmp
 \edef\dtl@initialscmd{\the\@dtl@toks\the\toks@\DTLafterinitials}%
 \let\dtl@initialsnext=\@gobble
\else
 \edef\dtl@initialscmd{\the\@dtl@toks\the\toks@\DTLbetweeninitials}%
 \let\dtl@initialsnext=\dtl@initials
\fi
\dtl@initialsnext{#3}}
\def\dtl@initialshyphen#1-#2#3\dtl@endhyp{%
\def\dtl@inithyphen{#2}%
\ifx\dtl@inithyphen\@empty
\else
 \edef\dtl@inithyphen{%
   \DTLafterinitialbeforehyphen\DTLinitialhyphen#2}%
\fi
}
\newcommand*{\DTLafterinitials}{.}
\newcommand*{\DTLbetweeninitials}{.}
\newcommand*{\DTLafterinitialbeforehyphen}{.}
\newcommand*{\DTLinitialhyphen}{-}
\newcommand*{\DTLifAllUpperCase}[3]{%
\protected@edef\dtl@tuc{#1}%
\expandafter\dtl@testifuppercase\dtl@tuc\@nil\relax
\if@dtl@condition#2\else#3\fi
}
\def\dtl@testifuppercase#1#2{%
\def\dtl@argi{#1}%
\def\dtl@argii{#2}%
\def\dtl@tc@rest{}%
\ifx\dtl@argi\@nnil
  \let\dtl@testifuppernext=\@nnil
\else
  \ifx#1\protect
    \let\dtl@testifuppernext=\dtl@testifuppercase
  \else
    \ifx\uppercase#1\relax
      \@dtl@conditiontrue
      \def\dtl@tc@rest{}%
      \let\dtl@testifuppernext=\relax
    \else
      \edef\dtl@tc@arg{\string#1}%
      \expandafter\dtl@test@ifuppercase\dtl@tc@arg\end
      \ifx\dtl@argii\@nnil
        \let\dtl@testifuppernext=\@dtl@gobbletonil
      \fi
    \fi
  \fi
\fi
\ifx\dtl@testifuppernext\relax
 \edef\dtl@dotestifuppernext{%
   \noexpand\dtl@testifuppercase}%
\else
 \ifx\dtl@testifuppernext\@nnil
   \edef\dtl@dotestifuppernext{#2}%
 \else
   \expandafter\toks@\expandafter{\dtl@tc@rest}%
   \@dtl@toks{#2}%
   \edef\dtl@dotestifuppernext{%
     \noexpand\dtl@testifuppernext\the\toks@\the\@dtl@toks}%
 \fi
\fi
\dtl@dotestifuppernext
}
\def\dtl@test@ifuppercase#1#2\end{%
\def\dtl@tc@rest{#2}%
\IfSubStringInString{\string\MakeUppercase}{#1#2}{%
  \@dtl@conditiontrue
  \def\dtl@tc@rest{}%
  \let\dtl@testifuppernext=\relax
}{%
 \IfSubStringInString{\string\MakeTextUppercase}{#1#2}{%
    \@dtl@conditiontrue
    \def\dtl@tc@rest{}%
    \let\dtl@testifuppernext=\relax
 }{%
  \edef\dtl@uccode{\the\uccode`#1}%
  \edef\dtl@code{\number`#1}%
  \ifnum\dtl@code=\dtl@uccode\relax
    \@dtl@conditiontrue
    \let\dtl@testifuppernext=\dtl@testifuppercase
  \else
    \ifnum\dtl@uccode=0\relax
      \@dtl@conditiontrue
      \let\dtl@testifuppernext=\dtl@testifuppercase
    \else
      \@dtl@conditionfalse
      \let\dtl@testifuppernext=\@dtl@gobbletonil
    \fi
  \fi
}}}
\newcommand*{\DTLifAllLowerCase}[3]{%
\protected@edef\dtl@tlc{#1}%
\expandafter\dtl@testiflowercase\dtl@tlc\@nil\relax
\if@dtl@condition#2\else#3\fi
}
\def\dtl@testiflowercase#1#2{%
\def\dtl@argi{#1}%
\def\dtl@argii{#2}%
\ifx\dtl@argi\@nnil
  \let\dtl@testiflowernext=\@nnil
\else
  \ifx#1\protect
    \let\dtl@testiflowernext=\dtl@testiflowercase
  \else
    \ifx\lowercase#1\relax
      \@dtl@conditiontrue
      \def\dtl@tc@rest{}%
      \let\dtl@testiflowernext=\relax
    \else
      \edef\dtl@tc@arg{\string#1}%
      \expandafter\dtl@test@iflowercase\dtl@tc@arg\end
      \ifx\dtl@argii\@nnil
        \let\dtl@testiflowernext=\@dtl@gobbletonil
      \fi
    \fi
  \fi
\fi
\ifx\dtl@testiflowernext\relax
 \edef\dtl@dotestiflowernext{%
   \noexpand\dtl@testiflowercase}%
\else
 \ifx\dtl@testiflowernext\@nnil
   \edef\dtl@dotestiflowernext{#2}%
 \else
   \expandafter\toks@\expandafter{\dtl@tc@rest}%
   \@dtl@toks{#2}%
   \edef\dtl@dotestiflowernext{%
     \noexpand\dtl@testiflowernext\the\toks@\the\@dtl@toks}%
 \fi
\fi
\dtl@dotestiflowernext
}
\def\dtl@test@iflowercase#1#2\end{%
\def\dtl@tc@rest{#2}%
\IfSubStringInString{\string\MakeLowercase}{#1#2}{%
  \@dtl@conditiontrue
  \def\dtl@tc@rest{}%
  \let\dtl@testiflowernext=\relax
}{%
 \IfSubStringInString{\string\MakeTextLowercase}{#1#2}{%
    \@dtl@conditiontrue
    \def\dtl@tc@rest{}%
    \let\dtl@testiflowernext=\relax
 }{%
  \edef\dtl@lccode{\the\lccode`#1}%
  \edef\dtl@code{\number`#1}%
  \ifnum\dtl@code=\dtl@lccode\relax
    \@dtl@conditiontrue
    \let\dtl@testiflowernext=\dtl@testiflowercase
  \else
    \ifnum\dtl@lccode=0\relax
      \@dtl@conditiontrue
      \let\dtl@testiflowernext=\dtl@testiflowercase
    \else
      \@dtl@conditionfalse
      \let\dtl@testiflowernext=\@dtl@gobbletonil
    \fi
  \fi
}}}
\newwrite\@dtl@write
\newcommand*{\DTLsavedb}[2]{%
\DTLifdbexists{#1}{%
\openout\@dtl@write=#2%
\edef\@dtl@keys{\csname dtlkeys@#1\endcsname}%
\def\@dtl@header{}%
\@for\@dtl@key:=\@dtl@keys\do{%
\expandafter\@dtl@toks\expandafter{\@dtl@header}%
\ifx\@dtl@header\@empty
 \IfSubStringInString{\@dtl@separator}{\@dtl@key}{%
   \protected@edef\@dtl@header{%
     \@dtl@delimiter\@dtl@key\@dtl@delimiter}%
 }{%
   \protected@edef\@dtl@header{\@dtl@key}%
 }%
\else
 \IfSubStringInString{\@dtl@separator}{\@dtl@key}{%
   \protected@edef\@dtl@header{\the\@dtl@toks\@dtl@separator
     \@dtl@delimiter\@dtl@key\@dtl@delimiter}%
 }{%
   \protected@edef\@dtl@header{\the\@dtl@toks\@dtl@separator
     \@dtl@key}%
 }%
\fi
}%
\protected@write\@dtl@write{}{\@dtl@header}%
\expandafter\let\expandafter\@dtl@db\csname dtldb@#1\endcsname%
\@for\@dtl@currentrow:=\@dtl@db\do{%
\dtl@gathervalues{#1}{\@dtl@currentrow}%
\def\@dtl@outputrow{}%
\@for\@dtl@key:=\@dtl@keys\do{%
\protected@edef\@dtl@element{\csname @dtl@key@\@dtl@key\endcsname}%
\expandafter\@dtl@toks\expandafter{\@dtl@outputrow}%
\ifx\@dtl@outputrow\@empty
 \IfSubStringInString{\@dtl@separator}{\@dtl@element}{%
   \protected@edef\@dtl@outputrow{%
    \@dtl@delimiter\@dtl@element\@dtl@delimiter}%
 }{%
   \protected@edef\@dtl@outputrow{\@dtl@element}%
 }%
\else
 \IfSubStringInString{\@dtl@separator}{\@dtl@element}{%
   \protected@edef\@dtl@outputrow{\the\@dtl@toks\@dtl@separator
      \@dtl@delimiter\@dtl@element\@dtl@delimiter}%
 }{%
   \protected@edef\@dtl@outputrow{\the\@dtl@toks\@dtl@separator
      \@dtl@element}%
 }%
\fi
}%
\protected@write\@dtl@write{}{\@dtl@outputrow}%
}%
\closeout\@dtl@write
}{%
\PackageError{datatool}{Database `#1' doesn't exist}{}%
}}
\newcommand*{\DTLsavetexdb}[2]{%
\DTLifdbexists{#1}{%
\def\@dtl@dbname{#1}%
\openout\@dtl@write=#2%
\edef\@dtl@keys{\csname dtlkeys@#1\endcsname}%
\protected@write\@dtl@write{}{\string\DTLnewdb{#1}}%
\expandafter\let\expandafter\@dtl@db\csname dtldb@#1\endcsname%
\@for\@dtl@currentrow:=\@dtl@db\do{%
\dtl@gathervalues{#1}{\@dtl@currentrow}%
\protected@write\@dtl@write{}{\string\DTLnewrow{#1}}%
\@for\@dtl@key:=\@dtl@keys\do{%
\expandafter\DTLifnull\csname @dtl@key@\@dtl@key\endcsname
{}{%
\protected@edef\@dtl@element{\csname @dtl@key@\@dtl@key\endcsname}%
\protected@write\@dtl@write{}{\string\DTLnewdbentry
 {#1}{\@dtl@key}{\@dtl@element}}%
}%
}%
}%
\closeout\@dtl@write
}{%
\PackageError{datatool}{Database `#1' doesn't exist}{}%
}}
\newread\@dtl@read
\newcount\dtl@entrycr
\gdef\DTLloaddb#1#2{%
\IfFileExists{#2}{%
\begingroup
\catcode`\"12\relax
\openin\@dtl@read=#2%
\dtl@message{Reading `#2'}%
\DTLnewdb{#1}%
\ifeof\@dtl@read
\else
  \loop
    \@dtl@conditionfalse
    \ifeof\@dtl@read
    \else
      \read\@dtl@read to \@dtl@line
      \dtl@trim\@dtl@line
      \if\@dtl@line\par
        \@dtl@conditiontrue
      \fi
    \fi
  \if@dtl@condition
  \repeat
  \ifeof\@dtl@read
  \else
  \protected@edef\@dtl@lin@{\@dtl@separator\@dtl@line\@dtl@separator}%
  \@dtl@tmpcount=0\relax
  \whiledo{\not\equal{\@dtl@lin@}{\@dtl@separator}}{%
    \expandafter\@dtl@lopoff\@dtl@lin@\to\@dtl@lin@\@dtl@key
    \advance\@dtl@tmpcount by 1\relax
    \expandafter\@dtl@toks\expandafter{\@dtl@key}%
    \expandafter
      \edef\csname @dtl@inky@\romannumeral\@dtl@tmpcount\endcsname{%
        \the\@dtl@toks}%
   }%
   \ifeof\@dtl@read
   \else
     \@dtl@conditiontrue
     \loop
      \read\@dtl@read to \@dtl@line
      \dtl@trim\@dtl@line
      \ifthenelse{\equal{\@dtl@line}{}}{}%
      {%
        \DTLnewrow{#1}%
        \expandafter\@dtl@toks\expandafter{\@dtl@line}%
        \edef\@dtl@lin@{\@dtl@separator\the\@dtl@toks
          \@dtl@separator}%
        \dtl@entrycr=0\relax
        \whiledo{\not\equal{\@dtl@lin@}{\@dtl@separator}}{%
          \expandafter\@dtl@lopoff\@dtl@lin@\to
            \@dtl@lin@\@dtl@thisentry
          \advance\dtl@entrycr by 1\relax
          \edef\@dtl@thiskey{%
            \csname @dtl@inky@\romannumeral\dtl@entrycr\endcsname}%
        \expandafter\@dtl@toks\expandafter{\@dtl@thisentry}%
        \edef\@do@dtlnewentry{\noexpand\DTLnewdbentry
          {#1}{\@dtl@thiskey}{\the\@dtl@toks}}%
        \@do@dtlnewentry
      }%
      }%
     \ifeof\@dtl@read \@dtl@conditionfalse\fi
     \if@dtl@condition
     \repeat
   \fi
  \fi
\fi
\closein\@dtl@read
\endgroup
}{%
\PackageError{datatool}{Can't load database `#1' (file `#2'
doesn't exist)}{}%
}}
\newcommand{\dtl@trim}[1]{%
\def\@dtl@trmstr{}%
\expandafter\@dtl@starttrim#1\@nil%
\let#1=\@dtl@trmstr
}
\long\def\@dtl@starttrim#1#2{%
\ifx\par#1%
 \def\@dtl@dotrim{\@dtl@trim{} #2}%
\else
 \def\@dtl@dotrim{\@dtl@trim#1#2}%
\fi
\@dtl@dotrim%
}
\long\def\@dtl@trim#1 \@nil{\long\def\@dtl@trmstr{#1}}
\gdef\DTLloadrawdb#1#2{%
\IfFileExists{#2}{%
\openin\@dtl@read=#2%
\dtl@message{Reading `#2'}%
\DTLnewdb{#1}%
\ifeof\@dtl@read
\else
  \loop
    \@dtl@conditionfalse
    \ifeof\@dtl@read
    \else
      \@dtl@rawread\@dtl@read to\@dtl@line
      \dtl@trim\@dtl@line
      \if\@dtl@line\par
        \@dtl@conditiontrue
      \fi
    \fi
  \if@dtl@condition
  \repeat
  \ifeof\@dtl@read
  \else
  \dtl@domappings\@dtl@line
  \protected@edef\@dtl@lin@{\@dtl@separator\@dtl@line\@dtl@separator}%
  \@dtl@tmpcount=0\relax
  \whiledo{\not\equal{\@dtl@lin@}{\@dtl@separator}}{%
    \expandafter\@dtl@lopoff\@dtl@lin@\to\@dtl@lin@\@dtl@key
    \advance\@dtl@tmpcount by 1\relax
    \expandafter\@dtl@toks\expandafter{\@dtl@key}%
    \expandafter
      \edef\csname @dtl@inky@\romannumeral\@dtl@tmpcount\endcsname{%
        \the\@dtl@toks}%
   }%
   \ifeof\@dtl@read
   \else
     \@dtl@conditiontrue
     \loop
      \@dtl@rawread\@dtl@read to\@dtl@line
      \dtl@trim\@dtl@line
      \ifthenelse{\equal{\@dtl@line}{}}{}%
      {%
        \DTLnewrow{#1}%
        \dtl@domappings\@dtl@line
        \expandafter\@dtl@toks\expandafter{\@dtl@line}%
        \edef\@dtl@lin@{\@dtl@separator\the\@dtl@toks
          \@dtl@separator}%
        \dtl@entrycr=0\relax
        \whiledo{\not\equal{\@dtl@lin@}{\@dtl@separator}}{%
          \expandafter\@dtl@lopoff\@dtl@lin@\to
            \@dtl@lin@\@dtl@thisentry
          \advance\dtl@entrycr by 1\relax
          \edef\@dtl@thiskey{%
            \csname @dtl@inky@\romannumeral\dtl@entrycr\endcsname}%
        \expandafter\@dtl@toks\expandafter{\@dtl@thisentry}%
        \edef\@do@dtlnewentry{\noexpand\DTLnewdbentry
          {#1}{\@dtl@thiskey}{\the\@dtl@toks}}%
        \@do@dtlnewentry
      }%
      }%
     \ifeof\@dtl@read \@dtl@conditionfalse\fi
     \if@dtl@condition
     \repeat
   \fi
  \fi
\fi
\closein\@dtl@read
}{%
\PackageError{datatool}{Can't load database `#1' (file `#2'
doesn't exist)}{}%
}}
\begingroup
\catcode`\%=\active
\catcode`$=\active
\catcode`&=\active
\catcode`~=\active
\catcode`_=\active
\catcode`^=\active
\catcode`#=\active
\catcode`?=6\relax
\catcode`<=1\relax
\catcode`>=2\relax
\catcode`\{=\active
\catcode`\}=\active
\gdef\@dtl@rawread?1to?2<\relax
<<\catcode`\%=\active
\catcode`$=\active
\catcode`&=\active
\catcode`~=\active
\catcode`_=\active
\catcode`^=\active
\catcode`#=\active
\catcode`\{=\active
\catcode`\}=\active
\def%<\noexpand\%>\relax
\def$<\noexpand\$>\relax
\def&<\&>\relax
\def#<\#>\relax
\def~<\noexpand\textasciitilde>\relax
\def_<\noexpand\_>\relax
\def^<\noexpand\textasciicircum>\relax
\@dtl@activatebraces
\@dtl@doreadraw?1?2>>>
\gdef\@dtl@doreadraw?1?2<\relax
\read?1 to \tmp
\xdef?2<\tmp>\relax
>
\endgroup
\begingroup
\catcode`\{=\active
\catcode`\}=\active
\catcode`<=1\relax
\catcode`>=2\relax
\gdef\@dtl@activatebraces<%
 \catcode`\{=\active
 \catcode`\}=\active
 \def{<\noexpand\{>%
 \def}<\noexpand\}>%
>%
\endgroup
\newcommand*{\DTLrawmap}[2]{%
\expandafter\@dtl@toks\expandafter{\@dtl@rawmappings}%
\ifx\@dtl@rawmappings\@empty
  \def\@dtl@rawmappings{{#1}{#2}}%
\else
  \def\@dtl@tmp{{#1}{#2}}
  \protected@edef\@dtl@rawmappings{\the\@dtl@toks,\@dtl@tmp}
\fi
}
\newcommand*{\@dtl@rawmappings}{}
\newcommand*{\dtl@domappings}[1]{%
\@for\@dtl@map:=\@dtl@rawmappings\do{%
  \expandafter\DTLsubstitute\expandafter#1\@dtl@map
}}
\newcommand{\DTLsubstitute}[3]{%
\expandafter\DTLsplitstring\expandafter
  {#1}{#2}{\@dtl@beforepart}{\@dtl@afterpart}%
\ifx\@dtl@replaced\@empty
\else
  \def#1{}%
  \expandafter\@dtl@toks\expandafter{\@dtl@beforepart}%
  \expandafter\toks@\expandafter{#1}%
  \protected@edef#1{\the\toks@\the\@dtl@toks#3}%
  \expandafter\@dtl@toks\expandafter{\@dtl@afterpart}%
  \expandafter\toks@\expandafter{#1}%
  \edef#1{\the\toks@\the\@dtl@toks}%
\fi
}
\newcommand*{\DTLsplitstring}[4]{%
\def\dtl@splitstr##1#2##2\@nil{%
\def#3{##1}%
\def#4{##2}%
\ifx#4\@empty
  \let\@dtl@replaced=\@empty
\else
  \def\@dtl@replaced{#2}%
  \dtl@split@str##2\@nil
\fi
}%
\def\dtl@split@str##1#2\@nil{%
\def#4{##1}}%
\dtl@splitstr#1#2\@nil
}
\newcommand{\DTLsubstituteall}[3]{%
\def\@dtl@splitsubstr{}%
\let\@dtl@afterpart=#1\relax
\@dtl@dosubstitute{#2}{#3}%
\expandafter\toks@\expandafter{\@dtl@splitsubstr}%
\expandafter\@dtl@toks\expandafter{\@dtl@afterpart}%
\edef#1{\the\toks@\the\@dtl@toks}%
}
\def\@dtl@dosubstitute#1#2{%
\expandafter\DTLsplitstring\expandafter
 {\@dtl@afterpart}{#1}{\@dtl@beforepart}{\@dtl@afterpart}%
\expandafter\toks@\expandafter{\@dtl@splitsubstr}%
\expandafter\@dtl@toks\expandafter{\@dtl@beforepart}%
\edef\@dtl@splitsubstr{\the\toks@\the\@dtl@toks}%
\ifx\@dtl@replaced\@empty
  \let\@dtl@dosubstnext=\@dtl@dosubstitutenoop
\else
  \expandafter\toks@\expandafter{\@dtl@splitsubstr}%
  \@dtl@toks{#2}%
  \edef\@dtl@splitsubstr{\the\toks@\the\@dtl@toks}%
  \let\@dtl@dosubstnext=\@dtl@dosubstitute
\fi
\@dtl@dosubstnext{#1}{#2}%
}
\def\@dtl@dosubstitutenoop#1#2{}
\newcommand*{\@dtl@currencies}{\$,\pounds}
\newcommand*{\DTLnewcurrencysymbol}[1]{%
\expandafter\toks@\expandafter{\@dtl@currencies}%
\@dtl@toks{#1}%
\edef\@dtl@currencies{\the\@dtl@toks,\the\toks@}%
}
\AtBeginDocument{%
\@ifundefined{texteuro}{}{\DTLnewcurrencysymbol{\texteuro}}%
\@ifundefined{textdollar}{}{\DTLnewcurrencysymbol{\textdollar}}%
\@ifundefined{textstirling}{}{\DTLnewcurrencysymbol{\textstirling}}%
\@ifundefined{textyen}{}{\DTLnewcurrencysymbol{\textyen}}%
\@ifundefined{textwon}{}{\DTLnewcurrencysymbol{\textwon}}%
\@ifundefined{textcurrency}{}{\DTLnewcurrencysymbol{\textcurrency}}%
\@ifundefined{euro}{}{\DTLnewcurrencysymbol{\euro}}%
\@ifundefined{yen}{}{\DTLnewcurrencysymbol{\yen}}%
}
\newcommand{\@dtl@standardize@currency}[1]{%
\def\@dtl@org@currency{}%
\@for\@dtl@thiscurrency:=\@dtl@currencies\do{%
  \expandafter\toks@\expandafter{\@dtl@thiscurrency}%
  \edef\@dtl@dosubs{\noexpand\DTLsubstitute{\noexpand#1}%
   {\the\toks@}{\noexpand\$}}%
  \@dtl@dosubs
  \ifx\@dtl@replaced\@empty
  \else
    \let\@dtl@org@currency=\@dtl@replaced
    \@endfortrue
  \fi
}%
\@endforfalse}
\newcommand*{\@dtl@currency}{\$}
\newcommand*{\DTLsetdefaultcurrency}[1]{%
\renewcommand*{\@dtl@currency}{#1}}
\newcommand{\dtl@ifsingle}[3]{%
\def\@dtl@arg{#1}%
\ifx\@dtl@arg\@empty
  #3%
\else
  \@dtl@ifsingle#1\@nil{#2}{#3}%
\fi
}
\def\@dtl@ifsingle#1#2\@nil#3#4{%
\def\dtl@sg@arg{#2}%
\ifx\dtl@sg@arg\@empty
 #3%
\else
 #4%
\fi
}
\newcommand*{\dtlshowdb}[1]{%
\expandafter\show\csname dtldb@#1\endcsname}
\newcommand*{\dtlshowdbkeys}[1]{%
\expandafter\show\csname dtlkeys@#1\endcsname}
\newcommand*{\dtlshowtype}[2]{%
\expandafter\show\csname @dtl@idtype@#1@#2\endcsname}
\endinput
%%
%% End of file `datatool.sty'.
