%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
%   This is 'catoptions' package (Version 0.2, August 2010)               %
%                                                                         %
%   The catoptions package changes LaTeX package loading internals        %
%   so that all subsequently loaded packages can rely on having           %
%   normal catcodes in effect. The package also contains some useful      %
%   facilities unconnected with catcodes. In particular, it contains      %
%   options processing facilities that have the familiar and simple       %
%   syntax of LaTeX's legacy options parsing mechanism, but with          %
%   improved robustness in terms of option value default, preservation    %
%   of braces in option values, and parsing of expandable package         %
%   and class option values. Also, it contains some API.                  %
%                                                                         %
%   The catcode facilities of the package are an extension of the         %
%   'pcatcode' package by Michael J. Downes and David M. Jones.           %
%                                                                         %
%   This package and accompanying files may be distributed and/or         %
%   modified under the conditions of the LaTeX Project Public License,    %
%   either version 1.3 of this license or any later version.              %
%                                                                         %
%   The LPPL maintenance status of this software is 'author-maintained'.  %
%                                                                         %
%   Copyright (c) 2011 Ahmed Musa (a.musa@rocketmail.com).                %
%                                                                         %
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%

\begingroup
\chardef\%\catcode37\catcode37 14\relax\expandafter\iffalse\string\
\fi\let\e\endlinechar\chardef\E\e\e13\chardef\n\catcode\e\catcode\e5 %
\chardef\s\catcode32 \catcode32 10
\chardef\=\catcode61 \catcode61 12
\chardef\l=\catcode123 \catcode123=1
\chardef\r=\catcode125 \catcode125=2
\chardef\[=\catcode91 \catcode91=12
\chardef\]=\catcode93 \catcode93=12
\chardef\^=\catcode94 \catcode94=7
\chardef\.=\catcode46 \catcode46=12
\chardef\/=\catcode47 \catcode47=12
\chardef\~=\catcode126 \catcode126=13
\chardef\&=\catcode38 \catcode38=4
\chardef\$=\catcode36 \catcode36=3
\chardef\_=\catcode95 \catcode95=8
\chardef\+=\catcode43 \catcode43=12
\chardef\!=\catcode33 \catcode33=12
\chardef\'=\catcode39 \catcode39=12
\chardef\(=\catcode40 \catcode40=12
\chardef\)=\catcode41 \catcode41=12
\chardef\*=\catcode42 \catcode42=12
\chardef\,=\catcode44 \catcode44=12
\chardef\-=\catcode45 \catcode45=12
\chardef\:=\catcode58 \catcode58=12
\chardef\<=\catcode60 \catcode60=12
\chardef\>=\catcode62 \catcode62=12
\chardef\`=\catcode96 \catcode96=12
\edef\x{%
  \endgroup
  \def\noexpand\cptrestorecatcodes{%
    \endlinechar=\number\E \catcode\number\e=\number\n
    \catcode32=\number\s \catcode123=\number\l
    \catcode125=\number\r \catcode37=\number\%
    \catcode61=\number\= \catcode91=\number\[
    \catcode93=\number\] \catcode94=\number\^
    \catcode46=\number\. \catcode47=\number\/
    \catcode126=\number\~ \catcode38=\number\&
    \catcode36=\number\$ \catcode95=\number\_
    \catcode43=\number\+ \catcode33=\number\!
    \catcode39=\number\' \catcode40=\number\(
    \catcode41=\number\) \catcode42=\number\*
    \catcode44=\number\, \catcode45=\number\-
    \catcode58=\number\: \catcode60=\number\<
    \catcode62=\number\> \catcode96=\number\`
  }%
}
\x
\catcode37 14\relax\expandafter\iffalse\string\
\fi\endlinechar13\catcode13 5 %
\catcode61\string=12
\catcode32=10
\catcode123=1
\catcode125=2
\catcode91=12
\catcode93=12
\catcode46=12
\catcode47=12
\catcode94=7
\catcode126=13
\chardef\cpt@xiipt=12
\chardef\active=13
\chardef\cpt@xciipt=92
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesPackage{catoptions}
  [2011/02/021 v0.2 Preserving catcodes and parsing options (AM)]
\ifcase%
  \ifx\eTeXversion\cpt@undefined\z@\else
    \ifnum\eTeXversion<\tw@\z@\else\@ne\fi\fi
  \PackageError{catoptions}{eTeX not loaded or old version}%
    {This package requires eTeX version 2 or later.}%
  \expandafter\endinput
\fi
\def\cptnormalcatcodes{%
  \endlinechar13
  \catcode33=12\catcode34=12\catcode35=6\catcode36=3\catcode37=14
  \catcode38=4\catcode39=12\catcode40=12\catcode41=12\catcode42=12
  \catcode43=12\catcode44=12\catcode45=12\catcode46=12\catcode47=12
  \catcode58=12\catcode59=12\catcode60=12\catcode61=12\catcode62=12
  \catcode63=12\catcode91=12\catcode92=0\catcode93=12\catcode94=7
  \catcode95=8\catcode96=12\catcode123=1\catcode124=12\catcode125=2
  \catcode126=13\catcode32=10\catcode13=5\catcode9=10\catcode10=12
}
\begingroup
\let\s\string
\escapechar\m@ne
\xdef\cpt@otherchars{%
  \s\!\s\"\s\#\s\$\s\%\s\&\s\'\s\(\s\)\s\*\s+\s\,\s\-\s\.\s\/\s\:%
  \s\;\s\<\s\=\s\>\s\?\s\[\s\\\s\]\s\^\s\_\s\`\s\{\s\|\s\}\s\~%
}
\endgroup
\newcommand*\BeginOverlookWhiteSpace{%
  \edef\cpt@spacecatcode{\the\catcode`\ }%
  \edef\cpt@tabcatcode{\the\catcode`\^^I}%
  \chardef\cpt@endlinechar=\number\endlinechar
  \catcode`\ =9\relax
  \catcode`\^^I=9\relax
  \endlinechar\m@ne
}
\newcommand*\EndOverlookWhiteSpace{%
  \catcode`\ =\cpt@spacecatcode
  \catcode`\^^I=\cpt@tabcatcode
  \endlinechar\cpt@endlinechar
}
\def\cpt@catcodestack{}
\def\cptpushcatcodes{%
  \begingroup
  \def\x##1{%
    \ifx##1\@nnil\else
      \catcode\number`##1=\the\catcode`##1\relax
      \expandafter\x
    \fi
  }%
  \xdef\cpt@catcodestack{%
    \expandafter\x\cpt@otherchars\ \
    \^^I\^^J\@nnil{\cpt@catcodestack}%
  }%
  \endgroup
}
\cptpushcatcodes
\cptnormalcatcodes
\def\cptpopcatcodes{%
  \begingroup
  \def\x##1##{\endgroup##1\xdef\cpt@catcodestack}%
  \expandafter\x\cpt@catcodestack
}
\@ifdefinable\currentcatcodesubset\relax
\newcommand*\GetCurrentCatcodeSubset{%
  \begingroup
  \def\x##1{%
    \ifx##1\cpt@nnil\else
      \@space(\string##1\@firstofone{:\number\catcode`##1})%
      \expandafter\x
    \fi
  }%
  \edef\x{%
    \def\noexpand\currentcatcodesubset{%
      \x\^^I\^^J\^^L\^^M\ \!\"\#\$\%\&%
      \'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\}\|\~\cpt@nnil
    }%
  }%
  \expandafter\endgroup\x
}
\newcommand*\declarefutureletset[2][fl@]{%
  \xdef\cpt@fletprefix{\xp@despace{#1}}%
  \cptexpandargonce
    {\cpt@filtermergelists[,]\cpt@fletprefixes}\cpt@fletprefix{}%
  \ifblankTF{#2}{%
    \def\neededfutureletchars{}%
  }{%
    \def\neededfutureletchars{#2}%
    \cpt@sttrue\cpt@csvnormalize[,]\neededfutureletchars
    \oifstrcmpFT\neededfutureletchars{all}{}{%
      \def\neededfutureletchars{}%
      \def\cpt@tempa##1\@##2\@{%
        \ifx##1\end\else
          \cptaddtocommalist\neededfutureletchars{##1}%
          \expandafter\cpt@tempa
        \fi
      }%
      \expandafter\cpt@tempa\cpt@futureletchars\end\@\@
    }%
  }%
  \globalize\neededfutureletchars
  \globalize\cpt@fletprefixes
}
\begingroup
\cptrestorecatcodes
\begingroup
\catcode`\3="3 \catcode`\4="4 \catcode`\7="7 \catcode`\8="8
\catcode`\A="A \catcode`\B="B \catcode`\C="C \catcode`\D="D
\gdef\cpt@flet@a#1#2{%
  \begingroup
  \edef\cpt@tempa{\noexpandcsn{\cpt@fletprefix#1}}%
  \edef\cpt@tempb{\noexpandcsn{if\cpt@fletprefix#1}}%
  \xifinsetTF
  {,\cptoxdetok\cpt@tempa,}{,\cptoxdetok\cptfutureletmacros,}{}{%
    \xdef\cptfutureletmacros{%
      \ifcsnullTF\cptfutureletmacros{}%
        {\expandcsonce\cptfutureletmacros,}%
      \expandcsonce\cpt@tempa,\expandcsonce\cpt@tempb
    }%
  }%
  \def\siso@do##1{\lccode`##1=`#2}%
  \simplesisoloop{034678BCD}%
  \lccode`\0=`#2\lccode`\3=`#2\lccode`\4=`#2\lccode`\6=`#2%
  \lccode`\7=`#2\lccode`\8=`#2\lccode`\B=`#2\lccode`\C=`#2%
  \lccode`\D=`#2%
  \ifnum\catcode`#2=\active
    \def\do##1{\noexpand\do\noexpand##1\noexpand}%
    \lowercase{%
      \xdef\cpt@activecharacters{%
        \cpt@activecharacters
        \do#2D%
      }%
    }%
  \fi
  \xdef\cpt@tempa{%
    \let\noexpand\cpt@tempa\noexpand\cpt@undefined
    \cptglet\expandcsonce\cpt@tempa= %
  }%
  \aftergroup\cpt@tempa
  \lowercase{%
    \expandafter\endgroup
    \ifcase\numexpr\catcode`#2\relax
      0\or \bgroup\or \egroup\or 3\or 4\or 5\or 6\or 7\or
      8\or 9\or \@sptoken\or B\or C\else D\fi
  }%
}
\endgroup
\gdef\cpt@futureletchars{%
  space\@\ \@ exclam\@\!\@ dblquote\@\"\@ hash\@\#\@ dollar\@\$\@
  ampersand\@\&\@ rquote\@\'\@ lparen\@\(\@ rparen\@\)\@ star\@\*\@
  plus\@\+\@ comma\@\,\@ hyphen\@\-\@ period\@\.\@ slash\@\/\@
  colon\@\:\@ semicolon\@\;\@ less\@\<\@ equal\@\=\@ greater\@\>\@
  question\@\?\@ lbracket\@\[\@ rbracket\@\]\@ hat\@\^\@
  underscore\@\_\@ lquote\@\`\@ lbrace\@\{\@ vert\@\|\@ rbrace\@\}\@
  tilde\@\~\@ bslash\@\\\@
}
\gdef\cptfutureletsetup{%
  \gdef\cpt@activecharacters{}%
  \gdef\cptfutureletmacros{}%
  \def\cpt@flet@b##1\@##2\@{%
    \ifx##1\end\else
      \xifinsetFT{##1}\neededfutureletchars{}{%
        \cpt@flet@a{##1}{##2}%
      }%
      \expandafter\cpt@flet@b
    \fi
  }%
  \def\fifo@do##1{%
    \gundefcsn{##1\currentoption}%
    \gundefcsn{if##1\currentoption}%
  }%
  \def\cpt@fletundef##1\@##2\@{%
    \ifx##1\end\else
      \def\currentoption{##1}%
      \simpleexpandarg\simplefifoloop{\cpt@fletprefixes}%
      \expandafter\cpt@fletundef
    \fi
  }%
  \def\cpt@fletdef##1\@##2\@{%
    \ifxTF##1\end{}{%
      \xifinsetFT{##1}\neededfutureletchars{}{%
        \csn@xdef{if\cpt@fletprefix##1}####1{%
          \noexpand\usecsn{@\noexpand\ifx
            \noexpandcsn{\cpt@fletprefix##1}%
            ####1\unexpanded{\@empty first\else second\fi oftwo}%
          }%
        }%
      }%
      \cpt@fletdef
    }%
  }%
  \expandafter\cpt@fletundef\cpt@futureletchars\end\@\@
  \expandafter\cpt@fletdef\cpt@futureletchars\end\@\@
  \expandafter\cpt@flet@b\cpt@futureletchars\end\@\@
}
\AtBeginDocument{\cptrestorecatcodes}
\gdef\futureletresetactives{%
  \def\do##1##2{\let##1= ##2}%
  \cpt@activecharacters
  \let\do\relax
}
\endgroup

\@ifdefinable\UseNormalCatcodes\relax
\protected\def\UseNormalCatcodes{%
  \ifcsnullTF\@currname{%
    \cpt@warn{\noexpand\UseNormalCatcodes issued in
      document: ignored}%
  }{%
    \let\UseNormalCatcodes\relax
    \cptpushcatcodes
    \cptnormalcatcodes
    \AfterEndOfStyleFile{%
      \cptpopcatcodes
      \let\UseNormalCatcodes\rc@UseNormalCatcodes
    }%
  }%
}
\@ifdefinable\rc@UseNormalCatcodes{%
  \global\let\rc@UseNormalCatcodes\UseNormalCatcodes
}
\newcommand\cptswap[2]{#2#1}
\newcommand\cptswapfirstbraced[2]{#2{#1}}
\cptswap{ }{\let\@sptoken= }
\def\@space{ }
\newcommand\usecsn[1]{\csname#1\endcsname}% long
\newcommand\gusecsn[1]{\global\csname#1\endcsname}
\newcommand\cptuse[1]{\ifcsndefFT{#1}{}{\usecsn{#1}}}
\long\def\@gobblethree#1#2#3{}
\long\def\@firstofthree#1#2#3{#1}
\long\def\@secondofthree#1#2#3{#2}
\long\def\@thirdofthree#1#2#3{#3}
\let\@iden\@firstofone
\newcommand\cptalloftwo[2]{#1#2}
\protected\def\cpt@nil{}
\def\cpt@nnil{\cpt@nil}
\protected\def\cpt@unique{\cpt@unique}
\long\def\cpt@car#1#2\car@nil{#1}
\long\def\cpt@cdr#1#2\cdr@nil{#2}
\long\def\remove@to@nnil#1\@nnil{}
\long\def\catch@to@nnil#1\@nnil{#1}
\long\def\remove@to@dot#1.{}
\long\def\catch@to@dot#1.{#1}
\@ifdefinable\cpt@rnm{\let\cpt@rnm\romannumeral}
\def\cptthreexp{\expandafter\expandafter\expandafter}
\def\cptsevenxp{\expandafter\expandafter\expandafter
  \expandafter\expandafter\expandafter\expandafter}
\protected\def\cptlocalxp#1{\begingroup\cptthreexp\endgroup#1}
\protected\def\cptlocalxpxp{\cptlocalxp\expandafter}
\newcommand*\cptzapspaces[1]{%
  \def\cptzapspaces##1{\cpt@rnm0\cpt@zapspaces.\@space##1#1\cpt@nil}%
}
\cptzapspaces{ }
\def\cpt@zapspaces#1 #2\cpt@nil{%
  \usecsn{@\ifx\cpt@unique#2\cpt@unique first\else second\fi oftwo}%
  {\remove@to@dot#1}{%
    \expandafter\cpt@zapspaces\expandafter
    .\remove@to@dot#1#2\cpt@nil
  }%
}
\newcommand*\ifpdfstrcmpTF[2]{%
  \usecsn{@\ifnum\pdfstrcmp{\detokenize{#1}}%
  {\detokenize{#2}}=\z@ first\else second\fi oftwo}%
}
\@ifdefinable\kernel@for{\let\kernel@for\@for}
\newcommand*\newvariables[1]{\@testopt{\cpt@newvariables{#1}}{}}%
\protected\def\cpt@newvariables#1[#2]#3{%
  \@testopt{\cpt@newv@riables{#1}{#2}{#3}}{}%
}
\protected\def\cpt@newv@riables#1#2#3[#4]{%
  \def\cpt@rsvda##1{%
    \ifx\cpt@unique#4\cpt@unique\def\cpt@tempc{##1}\else
      \def\cpt@tempc{#4}\fi
  }%
  \edef\cpt@tempb{\ifpdfstrcmpTF{#1}{if}{if}{}}%
  \kernel@for\cpt@tempa:=\cpt@rnm0\cptzapspaces{\@space#3}\do{%
    \usecsn{@\ifcsname\cpt@tempb#2\cpt@tempa\endcsname
      first\else second\fi oftwo}%
    {%
      \edef\reserved@a{\cpt@tempb#2\cpt@tempa}\@notdefinable
    }{%
      \csname new#1\expandafter\endcsname\csname
        \cpt@tempb#2\cpt@tempa\endcsname
      \ifpdfstrcmpTF{#1}{if}{%
        \cpt@rsvda{false}%
        \csname#2\cpt@tempa\cpt@tempc\endcsname
      }{%
        \ifpdfstrcmpTF{#1}{toks}{%
          \cpt@rsvda{}%
          \csname#2\cpt@tempa\endcsname\expandafter{\cpt@tempc}%
        }{%
          \ifpdfstrcmpTF{#1}{box}{%
            \cpt@rsvda\z@
            \setbox\csname#2\cpt@tempa\endcsname\newboxtype
              to\cpt@tempc{\newboxcontent}\relax
          }{%
            \cpt@rsvda\z@
            \csname#2\cpt@tempa\endcsname\cpt@tempc\relax
          }%
        }%
      }%
    }%
  }%
}
\@ifdefinable\newboxtype{\let\newboxtype=\hbox}
\@ifdefinable\newboxcontent{\def\newboxcontent{}}
\newvariables{if}[cpt@]{st,pl,pm,verbose,usepox,optf,igopt,
  inpox,olddx}\relax
\newvariables{if}[@]{iscounter,breakloop,choicefd,useempty,
  checklp,robdes}\relax
\newvariables{count}[cpt@]{depth,grouplevel,grouptype}\relax
\@ifdefinable\cptbreakloop{\let\cptbreakloop\@breaklooptrue}
\newcommand*\UseEmptyEntry{\global\@useemptytrue}
\newcommand*\DiscardEmptyEntry{\global\@useemptyfalse}
\newcommand*\UseRobustDespace{\global\@robdestrue}
\newcommand*\UseNormalDespace{\global\@robdesfalse}
\newcommand*\MsgBrk{\MessageBreak}
\newcommand*\cptgetcatcode[1]{%
  \number
  \ifcat\noexpand#1\bgroup1\else
  \ifcat\noexpand#1\egroup2\else
  \ifcat\noexpand#1$3\else %$
  \ifcat\noexpand#1&4\else
  \ifcat\noexpand#1##6\else
  \ifcat\noexpand#1^7\else
  \ifcat\noexpand#1_8\else
  \ifcat\noexpand#1\@sptoken10\else
  \ifcat\noexpand#1a11\else
  \ifcat\noexpand#1!12\else
  \ifcat\noexpand#1\noexpand~13\else
  -1\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
}
\newcommand\cptremovescape[1]{%
  \ifx\cpt@unique#1\cpt@unique
    \expandafter\@gobble\else\expandafter\@iden\fi
  {\expandafter\@gobble\string#1}%
}
\newcommand\cptgobblescape[1]{%
  \ifx\cpt@unique#1\cpt@unique
    \expandafter\@gobble\else\expandafter\@iden\fi
  {\ifnum\escapechar>\@cclv\else
  \ifnum\escapechar<\z@\else
    \expandafter\expandafter
    \csname @gobble\ifnum\escapechar=\@xxxii @space\fi
    \cptthreexp\endcsname
  \fi\fi
  \string#1}%
}
\newcommand\ifnullTF[1]{%
  \usecsn{@\ifnum\pdfstrcmp{}{\detokenize{#1}}%
    =\z@ first\else second\fi oftwo}%
}
\newcommand\ifnullFT[1]{\ifnullTF{#1}\@secondoftwo\@firstoftwo}
\newcommand\oifnullTF[1]{\expandafter\ifnullTF\expandafter{#1}}
\newcommand\oifnullFT[1]{\expandafter\ifnullFT\expandafter{#1}}
\newcommand\xifnullTF[1]{\cptexpandarg\ifnullTF{#1}}
\newcommand\xifnullFT[1]{\cptexpandarg\ifnullFT{#1}}
\@ifdefinable\iftoksnullTF\relax
\def\iftoksnullTF#1#{%
  \expandafter\ifnullTF\expandafter{\the#1}%
}
\newcommand\ifblankTF[1]{%
  \usecsn{@\ifnum\pdfstrcmp{}{\detokenize\expandafter
  {\@gobble#1.}}=\z@ first\else second\fi oftwo}%
}
\newcommand\ifblankFT[1]{\ifblankTF{#1}\@secondoftwo\@firstoftwo}
\newcommand\oifblankTF[1]{\expandafter\ifblankTF\expandafter{#1}}
\newcommand\oifblankFT[1]{\expandafter\ifblankFT\expandafter{#1}}
\newcommand\xifblankTF[1]{\cptexpandarg\ifblankTF{#1}}
\newcommand\xifblankFT[1]{\cptexpandarg\ifblankFT{#1}}
\newcommand*\ifdefTF[1]{%
  \usecsn{@\ifdefined#1\ifx#1\relax second\else first\fi
  \else second\fi oftwo}%
}
\newcommand*\ifdefFT[1]{\ifdefTF{#1}\@secondoftwo\@firstoftwo}
\newcommand*\oifdefTF[1]{\expandafter\ifdefTF\expandafter{#1}}
\newcommand*\oifdefFT[1]{\expandafter\ifdefFT\expandafter{#1}}
\newcommand*\xifdefTF[1]{\cptexpandarg\ifdefTF{#1}}
\newcommand*\xifdefFT[1]{\cptexpandarg\ifdefFT{#1}}
\newcommand*\ifcsndefTF[1]{%
  \ifcsname#1\endcsname
    \expandafter\@firstofone
  \else
    \cptthreexp\@secondoftwo\expandafter\@gobble
  \fi
  {\aftercsname\ifdefTF{#1}}%
}
\newcommand*\ifcsndefFT[1]{\ifcsndefTF{#1}\@secondoftwo\@firstoftwo}
\newcommand*\oifcsndefTF[1]{\expandafter\ifcsndefTF\expandafter{#1}}
\newcommand*\oifcsndefFT[1]{\expandafter\ifcsndefFT\expandafter{#1}}
\newcommand*\xifcsndefTF[1]{\cptexpandarg\ifcsndefTF{#1}}
\newcommand*\xifcsndefFT[1]{\cptexpandarg\ifcsndefFT{#1}}
\newcommand*\newletcs[2]{\ifcptdefinable{#1}{\let#1=#2}}
\newcommand*\ifcptdefinable[2]{%
  \edef\reserved@a{\cptgobblescape#1}%
  \ifdefTF{#1}\@notdefinable{%
    \ifcsndefTF{end\reserved@a}\@notdefinable{#2}%
  }%
}
\newcommand\cpt@def@[3]{%
  \ifcptdefinable#3{%
    \ifnullTF{#2}{}\protected
    \cptthreexp\l@ngrel@x\usecsn{#1def}#3%
  }%
}
\ifcptdefinable\robust@def\relax
\protected\def\robust@def{\@star@or@long{\cpt@def@{}{p}}}
\robust@def*\new@def{\@star@or@long{\cpt@def@{}{}}}
\robust@def*\new@gdef{\@star@or@long{\cpt@def@{g}{}}}
\robust@def*\robust@gdef{\@star@or@long{\cpt@def@{g}{p}}}
\robust@def*\new@edef{\@star@or@long{\cpt@def@{e}{}}}
\robust@def*\robust@edef{\@star@or@long{\cpt@def@{e}{p}}}
\robust@def*\new@xdef{\@star@or@long{\cpt@def@{x}{}}}
\robust@def*\robust@xdef{\@star@or@long{\cpt@def@{x}{p}}}
\robust@def*\renew@def{\@star@or@long{\cpt@redef@{}}}
\robust@def*\robust@redef{\@star@or@long{\cpt@redef@{p}}}
\new@def*\cpt@redef@#1#2{%
  \ifdefFT#2{}{%
    \ifcpt@verbose
      \@latex@info{Command '\string#2' redefined}%
    \fi
  }%
  \ifstrcmpTF{#1}{p}\protected\relax\l@ngrel@x\def#2%
}
\new@def*\ifcounterTF#1{%
  \ifstrcmpTF{\count}{#1}\@secondoftwo{%
    \expandafter\cpt@ifcounter@a\meaning#1:\cpt@unique
  }%
}
\edef\cpt@ifcounter@a#1#2{%
  \def#1##1:##2\cpt@unique{#2##1\string\count\cpt@unique}%
  \def#2##1\string\count##2\cpt@unique{\noexpand\ifblankTF{##1}}%
}
\cpt@ifcounter@a\cpt@ifcounter@a\cpt@ifcounter@b
\robust@def*\pushnumber#1{%
  \ifdefTF#1{%
    \edef#1{\the\numexpr#1+1}%
  }{%
    \let#1\@ne
  }%
}
\robust@def*\popnumber#1{%
  \ifdefTF#1{%
    \ifnumTF#1=\z@{%
      \let\relax\relax
      \cpt@err{Number '\string#1' is already 0}\@ehc
    }{%
      \edef#1{\the\numexpr#1-1}%
    }%
  }{%
    \let\relax\relax
    \cpt@err{Number '\string#1' is undefined}\@ehc
  }%
}
\robust@def*\pushcounter#1{%
  \ifdefTF#1{%
    \if@iscounter
      \global\advance#1\@ne
    \else
      \ifcounterTF#1{%
        \global\advance#1\@ne
      }{%
        \cpt@err{Number '\string#1' isn't a counter}\@ehc
      }%
    \fi
  }{%
    \usecsn{newcount}#1%
  }%
  \@iscounterfalse
}
\robust@def*\popcounter#1{%
  \ifdefTF#1{%
    \ifnumTF#1=\z@{%
      \cpt@err{Counter or number '\string#1' is already 0}\@ehc
    }{%
      \if@iscounter
        \global\advance#1\m@ne
      \else
        \ifcounterTF#1{%
          \global\advance#1\m@ne
        }{%
          \cpt@err{Number '\string#1' isn't a counter}\@ehc
        }%
      \fi
    }%
  }{%
    \cpt@err{Counter '\string#1' is undefined}\@ehc
  }%
  \@iscounterfalse
}
\new@def*\push@rnarg#1{\expandafter\cptremovescape\push@arg @\cpt@rnm#1}
\robust@def*\pushfunctions#1#2{%
  \ifcounterTF#2{%
    \@iscountertrue\pushcounter#2%
  }{%
    \global\pushnumber#2%
  }%
  \def\push@@do{\letcsntocs{\push@rnarg{#2}}}%
  \def\push@do{\expandafter\push@@do\push@arg}%
  \let\rc@escapechar\escapechar\escapechar\cpt@xciipt
  \pushingloop{#1}%
  \escapechar\rc@escapechar
}
\robust@def*\popfunctions#1#2{%
  \ifnum#2=\z@
    \cpt@err{Number '\string#2' is currently '0'}\@ehc
  \fi
  \def\push@do{%
    \expandafter\letcstocsn\push@arg{\push@rnarg{#2}}%
    \undefcsn{\push@rnarg{#2}}%
  }%
  \let\rc@escapechar\escapechar\escapechar\cpt@xciipt
  \pushingloop{#1}%
  \escapechar\rc@escapechar
  \ifcounterTF#2{%
    \@iscountertrue\popcounter#2%
  }{%
    \global\popnumber#2%
  }%
}
\robust@def*\pushingloop#1{\cpt@pushingloop#1,\cpt@nil,}
\robust@def*\cpt@pushingloop#1,{%
  \edef\push@arg{\unexpanded{#1}}%
  \ifxTF\push@arg\cpt@nnil{}{%
    \normal@despacecontent\push@arg
    \push@do\relax\cpt@pushingloop
  }%
}
\robust@def*\cpt@toodeep#1#2{%
  \cpt@err{Command '\string#1' nested too deeply}%
    {Sorry, but command '\string#1' can't be nested
    \MsgBrk to depth(s) higher than #2.}%
  \@gobble
}
\robust@def*\oneDloop{%
  \@robdestrue\cpt@ifstar\oneDloop@b\oneDloop@a
}
\robust@def*\normaloneDloop{%
  \@robdesfalse\cpt@ifstar\oneDloop@b\oneDloop@a
}
\robust@def\oneDloop@b#1{\expandafter\oneDloop@a\expandafter{#1}}
\robust@def\oneDloop@a#1#2#3{%
  \pushnumber\oneDloopdepth
  \ifnum\oneDloopdepth>\@ne\cpt@toodeep\oneDloop1\fi
  \@breakloopfalse
  \cpt@Dloop@a#1,\cpt@nil,\cpt@unique#2{#3}%
  \popnumber\oneDloopdepth
  \UseNormalDespace
}
\robust@def*\xDloop{%
  \@robdestrue\cpt@ifstar\xDloop@b\xDloop@a
}
\robust@def*\normalxDloop{%
  \@robdesfalse\cpt@ifstar\xDloop@b\xDloop@a
}
\robust@def\xDloop@b#1{\expandafter\xDloop@a\expandafter{#1}}
\robust@def\xDloop@a#1#2#3{%
  \pushfunctions
    {#2,\if@useempty,\if@breakloop,\if@robdes}\cpt@depth
  \@breakloopfalse
  \cpt@Dloop@a#1,\cpt@nil,\cpt@unique#2{#3}%
  \popfunctions
    {#2,\if@useempty,\if@breakloop,\if@robdes}\cpt@depth
  \UseNormalDespace
}
\robust@def*\cpt@Dloop@a{%
  \if@boolTF{@breakloop}{%
    \defpass\gobble@remainder##1\cpt@unique##2##3{}%
  }{%
    \cpt@Dloop@b.%
  }%
}
\robust@def\cpt@Dloop@b#1,#2\cpt@unique#3#4{%
  \edef#3{\expandcsonce{\remove@to@dot#1}}%
  \ifxTF#3\cpt@nnil{}{%
    \ifcsnullTF#3{%
      \if@useempty#4\relax\fi
    }{%
      \usecsn{\if@robdes robust\else normal\fi
        @despacecontent}#3%
      #4\relax
    }%
    \cpt@Dloop@a#2\cpt@unique#3{#4}%
  }%
}
\robust@def*\foreachitem{\cpt@testst\cpt@foreach}
\newcommand\cpt@foreach[4][,]{%
  \pushfunctions
    {#3,\if@useempty,\if@breakloop,\if@robdes}\cpt@depth
  \@breakloopfalse
  \ifcpt@st\let#3#2\else\edef#3{\unexpanded{#2}}\fi
  \long\def\cpt@foreach@a{%
    \if@boolTF{@breakloop}{%
      \defpass\gobble@remainder####1\cpt@unique####2####3{}%
    }{%
      \cpt@foreach@b.%
    }%
  }%
  \long\def\cpt@foreach@b##1#1##2\cpt@unique##3##4{%
    \edef##3{\expandcsonce{\remove@to@dot##1}}%
    \ifxTF##3\cpt@nnil{}{%
      \ifcsnullTF##3{%
        \if@useempty##4\relax\fi
      }{%
        \usecsn{\if@robdes robust\else normal\fi
          @despacecontent}##3%
        ##4\relax
      }%
      \cpt@foreach@a##2\cpt@unique##3{##4}%
    }%
  }%
  \expandafter\cpt@foreach@a#3#1\cpt@nil#1\cpt@unique#3{#4}%
  \popfunctions
    {#3,\if@useempty,\if@breakloop,\if@robdes}\cpt@depth
  \UseNormalDespace
}
\robust@def*\oneDfifo{\cpt@teststoptb\cpt@oneDfifo}
\robust@def*\cpt@oneDfifo[#1]#2{%
  \declarefifoparser{#1}%
  \pushnumber\oneDfifodepth
  \ifnum\oneDfifodepth>\@ne\cpt@toodeep\oneDfifo1\fi
  \let\on@currlevel\@secondoftwo
  \@breakloopfalse
  \begingroup
  \if@boolTF{cpt@st}%
    {\let\reserved@a#2}{\edef\reserved@a{\unexpanded{#2}}}%
  \expandafter\endgroup\expandafter\cpt@fifoloop@a
    \reserved@a#1\cpt@nil#1%
  \popnumber\oneDfifodepth
  \let\on@currlevel\rc@on@currlevel
}
\robust@def*\xDfifo{\cpt@teststoptb\cpt@xDfifo}
\robust@def*\cpt@xDfifo[#1]#2{%
  \declarefifoparser{#1}%
  \pushfunctions{\fifo@do,\if@breakloop,\if@useempty}\cpt@depth
  \let\curr@level\cpt@depth
  \@breakloopfalse
  \begingroup
  \if@boolTF{cpt@st}%
    {\let\reserved@a#2}{\edef\reserved@a{\unexpanded{#2}}}%
  \expandafter\endgroup\expandafter\cpt@fifoloop@a
    \reserved@a#1\cpt@nil#1%
  \popfunctions{\fifo@do,\if@breakloop,\if@useempty}\cpt@depth
}
\robust@def*\declarefifoparser#1{%
  \protected\def\cpt@fifoloop@a{%
    \if@boolTF{@breakloop}{%
      \defpass\gobble@remainder####1\cpt@nil#1{}%
    }{%
      \cpt@fifoloop@b.%
    }%
  }%
  \protected\def\cpt@fifoloop@b##1#1{%
    \edef\fifo@arg{\expandcsonce{\@gobble##1}}%
    \ifxTF\fifo@arg\cpt@nnil{}{%
      \ifcsnullTF\fifo@arg{%
        \if@boolTF{@useempty}{\on@currlevel{}\fifo@do{}\relax}{}%
      }{%
        \cptexpandargonce{\on@currlevel{}\fifo@do}\fifo@arg\relax
      }%
      \cpt@fifoloop@a
    }%
  }%
}
\robust@def*\simplefifoloop#1{\cpt@simplefifoloop#1,\cpt@nil,}
\robust@def*\cpt@simplefifoloop#1,{%
  \edef\fifo@arg{\unexpanded{#1}}%
  \ifx\fifo@arg\cpt@nnil\else
    \fifo@do{#1}\relax
    \expandafter\cpt@simplefifoloop
  \fi
}
\let\rc@on@currlevel\on@currlevel
\robust@def*\oneDsiso{\cpt@testst\cpt@oneDsiso}
\robust@def\cpt@oneDsiso#1{%
  \pushnumber\oneDsisodepth
  \ifnum\oneDsisodepth>\@ne\cpt@toodeep\oneDsiso1\fi
  \let\on@currlevel\@secondoftwo
  \@breakloopfalse
  \begingroup
  \if@boolTF{cpt@st}%
    {\let\reserved@a#1}{\edef\reserved@a{\unexpanded{#1}}}%
  \expandafter\endgroup\expandafter\cpt@sisoloop\reserved@a\sisorepeat
  \popnumber\oneDsisodepth
  \let\on@currlevel\rc@on@currlevel
}
\robust@def*\xDsiso{\cpt@testst\cpt@xDsiso}
\robust@def\cpt@xDsiso#1{%
  \pushfunctions{\siso@do,\if@useempty,\if@breakloop}\cpt@depth
  \let\curr@level\cpt@depth
  \@breakloopfalse
  \begingroup
  \ifcpt@st\let\reserved@a#1\else\edef\reserved@a{\unexpanded{#1}}\fi
  \expandafter\endgroup\expandafter\cpt@sisoloop\reserved@a\sisorepeat
  \popfunctions{\siso@do,\if@useempty,\if@breakloop}\cpt@depth
}
\robust@def*\cpt@sisoloop{%
  \if@boolTF{@breakloop}{%
    \defpass\gobble@remainder##1\sisorepeat{}%
  }{%
    \begingroup
    \let\temp@bgroup\bgroup
    \let\bgroup\cpt@undefined
    \futurelet\next\cpt@sisol@op
  }%
}
\robust@def\cpt@sisol@op#1{%
  \expandafter\endgroup
  \ifx\next\temp@bgroup\def\siso@arg{{#1}}\else\def\siso@arg{#1}\fi
  \ifblankTF{#1}{%
    \if@useempty\on@currlevel{}\siso@do{}\relax\fi
  }{%
    \ifx#1\sisorepeat\sisorepeat\fi
    \cptexpandargonce{\on@currlevel{}\siso@do}\siso@arg\relax
  }%
  \cpt@sisoloop
}
\robust@def\sisorepeat#1\cpt@sisoloop{\fi}
\robust@def*\simplesisoloop#1{\cpt@simplesisoloop#1\cpt@nnil}
\robust@def*\cpt@simplesisoloop#1{%
  \ifxTF#1\cpt@nnil{}{%
    \siso@do{#1}\relax
    \cpt@simplesisoloop
  }%
}
\robust@def*\csv@@parse{%
  \let\csv@kv@nr\z@
  \cpt@teststoptb\csv@kv@parse
}
\robust@def*\kv@@parse{%
  \let\csv@kv@nr\@ne
  \cpt@teststoptb\csv@kv@parse
}
\newcommand\csv@kv@parse[2][,]{%
  \letcstocsn\csv@kv@do{\ifnum\csv@kv@nr=\z@ csv\else kv\fi @do}%
  \ifdefTF\csv@kv@do{}{%
    \cpt@err{'\string\csv@do' or '\string\kv@do' undefined}\@ehc
  }%
  \long\def\csv@tempa{%
    \if@boolTF{@breakloop}{%
      \defpass\gobble@remainder####1\cpt@nil#1{}%
    }{%
      \csv@tempb.%
    }%
  }%
  \long\def\csv@tempb##1#1{%
    \edef\csv@tempc{\expandcsonce{\remove@to@dot##1}}%
    \ifxTF\csv@tempc\cpt@nnil{}{%
      \ifcsnullTF\csv@tempc{%
        \if@boolTF{@useempty}{\on@currlevel{}\csv@kv@do{}\relax}{}%
      }{%
        \expandafter\on@currlevel\expandafter\@empty
        \expandafter\csv@kv@do\expandafter{\csv@tempc}\relax
      }%
      \csv@tempa
    }%
  }%
  \if@boolTF{cpt@st}%
    {\let\csv@tempc#2}{\edef\csv@tempc{\unexpanded{#2}}}%
  \ifcsnullTF\csv@tempc{}{%
    \cpt@sttrue
    \usecsn{cpt@\ifnum\csv@kv@nr=\@ne kv\else csv\fi normalize}%
    [#1]\csv@tempc
  }%
  \pushfunctions{\csv@kv@do,\if@useempty,\if@breakloop}\cpt@depth
  \@breakloopfalse
  \let\curr@level\cpt@depth
  \expandafter\csv@tempa\csv@tempc#1\cpt@nil#1%
  \popfunctions{\csv@kv@do,\if@useempty,\if@breakloop}\cpt@depth
}
\robust@def*\on@currlevel#1#2{%
  \ifdefTF\curr@level{%
    \ifnum\curr@level=\z@
      \cpt@err{'\string\curr@level' is zero}{%
        I can't do anything on zero current level.}%
    \fi
  }{%
    \cpt@err{'\string\curr@level' undefined}\@ehc
  }%
  \cptexpandsecond
    {#1}{\noexpandcsn{\cptgobblescape#2@\cpt@rnm\curr@level}}%
}
\new@def\cptafterfi#1\fi{\fi#1}
\new@def\cptafterelsefi#1\else#2\fi{\fi#1}
\new@def\cptafterfifi#1\fi#2\fi{\fi\fi#1}
\robust@def*\emptify#1{\let#1\@empty}
\robust@def*\gemptify#1{\global\let#1\@empty}
\robust@def*\genemptify{\cpt@teststpm\cpt@genemptify}
\def\cpt@genemptify#1{%
  \ifcpt@pm\global\fi\ifcpt@st\else\long\fi\def#1{}%
}
\robust@def*\emptifycsn{\aftercsname\emptify}
\robust@def*\gemptifycsn{\global\aftercsname\emptify}
\robust@def*\emptifycsset#1{%
  \normaloneDloop{#1}\cpt@tempa{%
    \expandafter\ifescapedTF\expandafter{\cpt@tempa}{%
      \expandafter\def\cpt@tempa{}%
    }{%
      \cpt@err{Can't emptify unescaped macro}\@ehc
    }%
  }%
}
\robust@def*\cptonlypreamble#1{%
  \begingroup
  \def\cpt@resa{}%
  \normaloneDloop{#1}\cpt@tempa{%
    \ifcsnullTF\cpt@tempa{}{%
      \simpleexpandarg\ifescapedFT\cpt@tempa{%
        \cpt@err{'\expandcsonce\cpt@tempa' not a command}\@ehc
      }{%
        \simpleexpandarg\ifsingletokenTF\cpt@tempa{%
          \xifinsetTF{,\expandcsonce\cpt@tempa,}
            {,\expandcsonce\cpt@resa,}{%
            \cpt@warn{Command '\expandcsonce\cpt@tempa' multiply
              \MsgBrk submitted to \string\cptonlypreamble}%
          }{%
            \expandafter\@onlypreamble\cpt@tempa
            \cptaddtocommalist\cpt@resa\cpt@tempa
          }%
        }{%
          \cpt@err{Invalid multiple arguments
            '\expandcsonce\cpt@tempa'}\@ehc
        }%
      }%
    }%
  }%
  \endgroup
}
\newletcs\IfFileExistsTF\IfFileExists
\new@def*\IfFileExistsFT#1{\IfFileExists{#1}\@secondoftwo\@firstoftwo}
\new@def*\ifcsnullTF#1{%
  \@nameuse{@\expandafter\ifx\expandafter\cpt@unique
    \@gobble#1.\cpt@unique second\else first\fi oftwo}%
  {\@nameuse{@\ifx#1\@empty first\else second\fi oftwo}}%
  \@secondoftwo
}
\new@def*\ifcsnullFT#1{\ifcsnullTF{#1}\@secondoftwo\@firstoftwo}
\new@def*\oifcsnullTF#1{\expandafter\ifcsnullTF#1}
\new@def*\oifcsnullFT#1{\expandafter\ifcsnullFT#1}
\new@def*\ifcsnnullTF#1{%
  \ifblankTF{#1}{%
    \@secondoftwo
  }{%
    \ifcsndefTF{#1}{%
      \expandafter\ifx\csname#1\endcsname\@empty
        \expandafter\@firstoftwo
      \else
        \expandafter\@secondoftwo
      \fi
    }{%
      \@secondoftwo
    }%
  }%
}
\new@def*\ifcsnnullFT#1{\ifcsnnullTF{#1}\@secondoftwo\@firstoftwo}
\new@def*\ifdefnotnullTF#1{%
  \ifdefTF{#1}{\ifcsnullTF{#1}\@secondoftwo\@firstoftwo}\@secondoftwo
}
\new@def*\ifdefnotnullFT#1{\ifdefnotnullTF{#1}\@secondoftwo\@firstoftwo}
\robust@def*\advexpandarg#1#2{%
  \ifsingletokenTF{#1}{%
    \expandafter#1\expandafter{#2}%
  }{%
    \LTS@err{Argument \detokenize{#1} has more than one token}\@ehc
  }%
}
\new@def*\simpleexpandarg#1#2{\expandafter#1\expandafter{#2}}
\new@def*\expandcsonce#1{\unexpanded\expandafter{#1}}
\new@def*\expandcsnonce#1{\cptthreexp\expandcsonce\usecsn{#1}}
\new@def*\noexpandcsn#1{\expandcsonce{\csname#1\endcsname}}
\let\cptmakecs\noexpandcsn
\new@def*\cptoxdetok#1{\detokenize\expandafter{#1}}
\new@def*\cpttxdetok#1{\detokenize\cptthreexp{#1}}
\new@def*\cptsxdetok#1{\detokenize\cptsevenxp{#1}}
\robust@def\cptpassexpanded#1{%
  \begingroup\protected@edef\x{\endgroup#1}\x
}
\let\cptexpanded\cptpassexpanded
\robust@def\cptpassunexpanded#1{\begingroup\long\def\x{\endgroup#1}\x}
\robust@def\defpass#1#2#{\afterassignment#1\long\def#1#2}
\robust@def\edefpass#1#2#{\afterassignment#1\long\edef#1#2}
\robust@def*\cptexpandarg#1#2{\cptpassexpanded{\unexpanded{#1}{#2}}}
\let\cptexpandargbraced\cptexpandarg
\robust@def*\cptexpandargonce#1#2{%
  \cptpassexpanded{\unexpanded{#1}{\expandcsonce{#2}}}%
}
\robust@def*\cptexpandsecond#1#2{\cptpassexpanded{\unexpanded{#1}#2}}
\let\cptexpandargunbraced\cptexpandsecond
\robust@def*\cptexpandsecondonce#1#2{%
  \cptpassexpanded{\unexpanded{#1}\expandcsonce{#2}}%
}
\robust@def*\cptexpandsecondarg#1#2#3{%
  \cptpassexpanded{\unexpanded{#1#2}{#3}}%
}
\robust@def*\cptexpandsecondargonce#1#2#3{%
  \cptpassexpanded{\unexpanded{#1#2}{\expandcsonce{#3}}}%
}
\robust@def*\cptexpandtwoargs#1#2#3{%
  \cptpassexpanded{\unexpanded{#1}{#2}{#3}}%
}
\robust@def*\cptexpandtwoargsonce#1#2#3{%
  \cptpassexpanded
  {\unexpanded{#1}{\expandcsonce{#2}}{\expandcsonce{#3}}}%
}
\robust@def*\StyleFileRCSInfo$#1 #2 #3 #4 #5 #6 #7 #8 ${%
  \def\cpt@filedate{#4}%
  \def\cpt@fileversion{v#3}%
  \def\cpt@filetime{#5}%
  \def\cpt@fileauthor{#6\@space#7}%
}
\new@def*\cpt@filedesc{}
\defpass\cpt@tempa#1{%
  \robust@def*\StyleFilePurpose##1{%
    \gdef\cpt@filedesc{##1#1(\cpt@fileauthor)}%
  }%
}{ }
\new@def*\StyleFileInfo{%
  \cpt@filedate\@space\cpt@fileversion\@space\cpt@filedesc
}
\robust@def*\SetStyleFileMessages{%
  \begingroup
  \catcode`\ =9\catcode`\^^I=9\relax
  \edef\cpt@tempa{\expandafter\@carcube\@currname\@nil @}%
  \def\cpt@tempb{\@testopt{\expandafter\endgroup\cpt@SetStyleFileMessages}}%
  \expandafter\cpt@tempb\expandafter{\cpt@tempa}%
}
\robust@def*\cpt@SetStyleFileMessages[#1]#2#3#4{%
  \begingroup
  \def\cpt@tempa##1{\noexpandcsn{##1}}%
  \protected\def\cpt@tempb{\global\protected\@namedef}%
  \edef\cpt@tempc{\ifx\@currext\@pkgextension Package\else Class\fi}%
  \@tempswafalse
  \kernel@for\cpt@rsvda:={#2,#3,#4}\do{%
    \ifcsname#1\cpt@rsvda\endcsname
      \@tempswatrue\let\cpt@rsvdb\cpt@rsvda
    \fi
  }%
  \if@tempswa
    \def\reserved@a{#1\cpt@rsvdb}\@notdefinable
  \else
    \cptpassexpanded{%
      \cpt@tempb{#1#2}####1{\cpt@tempa{\cpt@tempc Info}%
        {\@currname}{####1\noexpand\@gobble}}%
      \cpt@tempb{#1#3}####1{\cpt@tempa{\cpt@tempc WarningNoLine}%
        {\@currname}{####1}}%
      \cpt@tempb{#1#4}####1####2{\cpt@tempa{\cpt@tempc Error}%
        {\@currname}{####1}{####2}}%
    }%
  \fi
  \endgroup
  \interactionmode\thr@@
}
\SetStyleFileMessages[cpt@]{info}{warn}{err}
\robust@def*\cpt@begingroup{%
  \begingroup
  \cpt@grouplevel\currentgrouplevel
  \cpt@grouptype\currentgrouptype
}
\robust@def*\cpt@endgroup{%
  \ifnum\cpt@grouptype=\currentgrouptype
    \ifnum\cpt@grouplevel=\currentgrouplevel\else
      \cpt@err{There is a group level mismatch}\@ehc
      \aftergroup\showgroups
    \fi
  \else
    \cpt@err{There is a group type mismatch}\@ehc
    \aftergroup\showgroups
  \fi
  \endgroup
}
\new@def*\ifboolTF#1{%
  \ifcsndefTF{if#1}{%
    \if@boolTF{#1}%
  }{%
    \cpt@err{Boolean '\usecsn{#1}' undefined}\@ehc
  }%
}
\new@def*\ifboolFT#1{\ifboolTF{#1}\@secondoftwo\@firstoftwo}
\new@def*\ifbooleanTF#1#{\ifboolTF{#1}}
\new@def*\if@boolTF#1{%
  \usecsn{if#1}\expandafter\@firstoftwo\else
    \expandafter\@secondoftwo\fi
}
\new@def*\if@boolFT#1{\if@boolTF{#1}\@secondoftwo\@firstoftwo}
\new@def*\ifnumTF#1#{%
  \usecsn{@\ifnum#1first\else second\fi oftwo}%
}
\new@def*\ifnumFT#1#{\usecsn{@\ifnumTF#1{second}{first}oftwo}}
\new@def*\ifoddTF#1#{%
  \usecsn{@\ifodd#1\@empty first\else second\fi oftwo}%
}
\new@def*\ifoddFT#1#{\usecsn{@\ifoddTF#1{second}{first}oftwo}}
\robust@def*\cptnumdef#1#2{\edef#1{\the\numexpr#2}}
\robust@def*\cptdimdef#1#2{\edef#1{\the\dimexpr#2}}
\robust@def*\cptnumadd#1#2{\edef#1{\the\numexpr#1+#2}}
\robust@def*\cptdimadd#1#2{\edef#1{\the\dimexpr#1+#2}}
\new@edef*\@leftbracechar{\expandafter\@car\string{\@nil\iffalse}\fi}
\new@def\cptstrcmp#1#2{%
  \ifnum\pdfstrcmp{#1}{#2}=\z@\expandafter\@firstoftwo\else
    \expandafter\@secondoftwo\fi
}
\new@def\ifstrcmpTF#1#2{%
  \cptstrcmp{\detokenize{#1}}{\detokenize{#2}}%
}
\new@def\ifstrcmpFT#1#2{\ifstrcmpTF{#1}{#2}\@secondoftwo\@firstoftwo}
\robust@def\oifstrcmpTF#1#2{\cptexpandtwoargsonce\ifstrcmpTF{#1}{#2}}
\robust@def\oifstrcmpFT#1#2{\cptexpandtwoargsonce\ifstrcmpFT{#1}{#2}}
\robust@def\xifstrcmpTF#1#2{\cptexpandtwoargs\ifstrcmpTF{#1}{#2}}
\robust@def\xifstrcmpFT#1#2{\cptexpandtwoargs\ifstrcmpFT{#1}{#2}}
\robust@def\ifstreqTF#1#2{%
  \begingroup
  \robust@despace{#1}\cpt@tempa
  \robust@despace{#2}\cpt@tempb
  \aftercsname\endgroup{@\ifnum\pdfstrcmp
  {\cptoxdetok\cpt@tempa}{\cptoxdetok\cpt@tempb}%
  =\z@ first\else second\fi oftwo}%
}
\robust@def\ifstreqFT#1#2{\ifstreqTF{#1}{#2}\@secondoftwo\@firstoftwo}
\robust@def\oifstreqTF#1#2{\cptexpandtwoargsonce\ifstreqTF{#1}{#2}}
\robust@def\oifstreqFT#1#2{\cptexpandtwoargsonce\ifstreqFT{#1}{#2}}
\robust@def\xifstreqTF#1#2{\cptexpandtwoargs\ifstreqTF{#1}{#2}}
\robust@def\xifstreqFT#1#2{\cptexpandtwoargs\ifstreqFT{#1}{#2}}
\long\def\ifbracedTF#1{%
  \cptstrcmp{\detokenize\expandafter{\@gobble#1.}}{}\@secondoftwo{%
    \cptstrcmp{\detokenize\expandafter{\@gobble#1}}{}{%
      \cptstrcmp{\expandafter\cpt@car\detokenize{#1}\car@nil}{\@leftbracechar}%
        \@firstoftwo\@secondoftwo
    }{%
      \@secondoftwo
    }%
  }%
}
\newcommand\ifbracedFT[1]{\ifbracedTF{#1}\@secondoftwo\@firstoftwo}
\long\def\ifleftbracedTF#1{%
  \cptstrcmp{\detokenize\expandafter{\@gobble#1.}}{}\@secondoftwo{%
    \cptstrcmp{\expandafter\cpt@car\detokenize{#1}\car@nil}{\@leftbracechar}%
      \@firstoftwo\@secondoftwo
  }%
}
\new@def\ifxTF#1#2{%
  \usecsn{@\ifx#1#2\@empty first\else second\fi oftwo}%
}
\new@def\ifxFT#1#2{\ifxTF{#1}{#2}\@secondoftwo\@firstoftwo}
\new@def*\ifcptdefeqTF#1#2{%
  \ifdefTF{#1}{%
    \ifdefTF{#2}{%
      \usecsn{@\ifx#1#2first\else second\fi of oftwo}%
    }\@secondoftwo
  }\@secondoftwo
}
\new@def\ifcatTF#1#{%
  \usecsn{@\ifcat#1first\else second\fi oftwo}%
}
\new@def\ifcharcmpTF#1#2{%
  \ifsingletokenTF{#1}{%
    \ifsingletokenTF{#2}{%
      \usecsn{@\if\detokenize\expandafter{\cpt@rnm\expandafter
        \cptswap\expandafter{\cpt@rnm-`\q#2}{-`\q#1}}%
        first\else second\fi oftwo}%
    }{%
      \cpt@err{More than one token in '\detokenize{#2}'}\@ehc
      \@secondoftwo
    }%
  }{%
    \cpt@err{More than one token in '\detokenize{#1}'}\@ehc
    \@secondoftwo
  }%
}
\new@def\ifcharcmpFT#1#2{\ifcharcmpTF{#1}{#2}\@secondoftwo\@firstoftwo}
\new@def\ifexpandableTF#1#2#3{%
  \cpt@rnm\ifleftbracedTF{#1}\@secondoftwo{%
  \ifblankTF{#1}\@secondoftwo{\expandafter\ifx\noexpand#1#1%
  \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}}%
  {0 #2}{0 #3}%
}
\new@def*\iffirstisspaceTF#1{%
  \long\def\iffirstisspaceTF##1##2##3{%
    \cpt@rnm\usecsn{@\ifblankTF{##1}{second}%
    {\cpt@iffirstisspace.##1#1\@nnil}oftwo}{0#1##2}{0#1##3}%
  }%
}
\iffirstisspaceTF{ }
\new@def\cpt@iffirstisspace#1 {%
  \expandafter\ifblankTF\expandafter{\@gobble#1}{first}{second}%
  \remove@to@nnil
}
\new@def\ifsingletokenTF#1#2#3{%
  \cpt@rnm\ifblankTF{#1}\@secondoftwo{%
    \ifbracedTF{#1}\@secondoftwo{%
      \iffirstisspaceTF{#1}{%
        \expandafter\ifblankTF\expandafter{\@gobblespace#1}%
      }{%
        \expandafter\ifblankTF\expandafter{\@secondoftwo#1{}}%
      }%
      \@firstoftwo\@secondoftwo
    }%
  }{0 #2}{0 #3}%
}
\robust@def*\ifsingletokenFT#1{%
  \ifsingletokenTF{#1}\@secondoftwo\@firstoftwo
}
\robust@def*\cpt@checklistparser#1#2{%
  \ifsingletokenTF{#1}{%
    \xifinsetTF{\detokenize{#1}}{\detokenize{,;:/+-|*&}}{%
      #2
    }{%
      \cpt@err{Invalid list parser '#1'}\@ehc
    }%
  }{%
    \cpt@err{Invalid list parser '#1'}\@ehc
  }%
}
\robust@def\exitgroupdef#1{%
  \cptpassexpanded{\endgroup\edef
    \noexpand#1{\noexpand\unexpanded{\expandcsonce#1}}}%
}
\robust@def*\cptaftergroup#1{%
  \advance\@tempcnta\@ne
  \csn@xdef{cpt@aftergroup@\cpt@rnm\@tempcnta}{%
    \gundefcsn{cpt@aftergroup@\cpt@rnm\@tempcnta}%
    \unexpanded\ifnullTF{#1}{}\expandafter{#1}%
  }%
  \aftercsname\aftergroup{cpt@aftergroup@\cpt@rnm\@tempcnta}%
}
\robust@def\cptafterassignment#1{%
  \begingroup
  \advance\@tempcnta\@ne
  \csn@xdef{cpt@afterassignment@\cpt@rnm\@tempcnta}{%
    \gundefcsn{cpt@afterassignment@\cpt@rnm\@tempcnta}%
    \unexpanded\ifnullTF{#1}{}\expandafter{#1}%
  }%
  \aftercsname{\endgroup\afterassignment}{%
    cpt@afterassignment@\cpt@rnm\@tempcnta}%
}
\robust@def*\cptexpandmacro#1#2{%
  \ifcptmacroTF{#1}{%
    \ifexpandableTF{#1}{%
      \simpleexpandarg\cptexpandmacro{#1}%
    }{%
      \edef#2{\unexpanded{#1}}%
    }%
  }{%
    \edef#2{\unexpanded{#1}}%
  }%
}
\robust@def\cpt@ifnextchar#1#2#3{%
  \kernel@ifnextchar\bgroup
  {\kernel@ifnextchar{#1}{#2}{#3}}{\cpt@ifn@xtchar{#1}{#2}{#3}}%
}
\robust@def\cpt@ifn@xtchar#1#2#3#4{%
  \csname @\if\detokenize{#1#4}first\else
    second\fi oftwo\endcsname{#2}{#3}#4%
}
\robust@def\cpt@testopt#1#2{\cpt@ifnextchar[{#1}{#1[{#2}]}}
\robust@def*\cpt@ifbrack#1#2{\cpt@ifnextchar[{#1}{#2}}
\new@def*\cpt@xtestopt#1#2#3{%
  \cpt@xifbrack#1\cpt@unique[\cpt@unique{#2#1}{#2[{#3}]{#1}}%
}
\new@def*\cpt@xifbrack#1[#2\cpt@unique#3#{%
  \usecsn{@\ifnullTF{#1#2}{first}{second}oftwo}%
}
\robust@def\cpt@testpnopt#1#2{\cpt@ifnextchar({#1}{#1({#2})}}
\robust@def\cpt@ifstar#1{\cpt@ifnextchar*{\@firstoftwo{#1}}}
\robust@def\cpt@ifplus#1{\cpt@ifnextchar+{\@firstoftwo{#1}}}
\robust@def\cpt@ifprime#1{\cpt@ifnextchar'{\@firstoftwo{#1}}}
\robust@def\cpt@testst#1{\cpt@ifstar{\cpt@sttrue#1}{\cpt@stfalse#1}}
\robust@def\cpt@testpl#1{\cpt@ifplus{\cpt@pltrue#1}{\cpt@plfalse#1}}
\robust@def\cpt@teststpl#1{\cpt@testst{\cpt@testpl{#1}}}
\robust@def\cpt@testpm#1{\cpt@ifprime{\cpt@pmtrue#1}{\cpt@pmfalse#1}}
\robust@def\cpt@teststpm#1{\cpt@testst{\cpt@testpm{#1}}}
\robust@def\cpt@teststopta#1{\cpt@testst{\cpt@testopt{#1}{}}}
\robust@def\cpt@teststoptb#1{\cpt@testst{\cpt@testopt{#1}{,}}}
\new@def*\ifcptstrcase#1{\cpt@xtestopt{#1}\cpt@ifstrcase{}}
\new@def\cpt@ifstrcase[#1]#2#3{%
  \expandafter\cptswapfirstbraced\expandafter{#2}%
    {\cpt@ifstrc@se#3\cpt@mil\cpt@mil\cpt@nil}{#1}%
}
\new@def\cpt@ifstrc@se#1#2#3\cpt@nil#4#5{%
  \ifnullTF{#3}{#5}{%
    \ifstrcmpTF{#1}{#4}{#2}{%
      \cpt@ifstrc@se#3\cpt@nil{#4}{#5}%
    }%
  }%
}
\robust@def\cptinset#1#2{%
  \begingroup
  \def\in@@##1#1##2##3\in@@{\endgroup
    \ifx##2\in@\in@false\else\in@true\fi
  }%
  \in@@#2{\in@@}#1\in@\in@@
}
\robust@def\ifinsetTF#1#2{%
  \cptinset{#1}{#2}%
  \@nameuse{@\ifin@ first\else second\fi oftwo}%
}
\robust@def\ifinsetFT#1#2{\ifinsetTF{#1}{#2}\@secondoftwo\@firstoftwo}
\robust@def\oifinsetTF#1#2{%
  \begingroup
  \edef\cpt@tempa{{\expandcsonce{#1}}{\expandcsonce{#2}}}%
  \expandafter\endgroup\expandafter\ifinsetTF\cpt@tempa
}
\robust@def\oifinsetFT#1#2{\oifinsetTF{#1}{#2}\@secondoftwo\@firstoftwo}
\robust@def\xifinsetTF#1#2{%
  \begingroup
  \protected@edef\cpt@tempa{{#1}{#2}}%
  \expandafter\endgroup\expandafter\ifinsetTF\cpt@tempa
}
\robust@def\xifinsetFT#1#2{\xifinsetTF{#1}{#2}\@secondoftwo\@firstoftwo}
\robust@def*\cptaddtolist{\cpt@teststoptb\cpt@addtolist}
\robust@def\cpt@addtolist[#1]#2#3{%
  \if@checklp\cpt@checklistparser{#1}\relax\fi
  \begingroup
  \def\cpt@tempa{\endgroup
    \ifdefTF#2{%
      \ifcpt@st
        \protected@edef#2{\ifcsnullTF#2{}{\expandcsonce#2#1}#3}%
      \else
        \edef#2{\ifcsnullTF#2{}{\expandcsonce#2#1}\unexpanded{#3}}%
      \fi
    }{%
      \ifcpt@st
        \protected@edef#2{#3}%
      \else
        \edef#2{\unexpanded{#3}}%
      \fi
    }%
  }%
  \ifblankTF{#3}{\if@useempty\cpt@tempa\else\endgroup\fi}%
  \cpt@tempa
}
\robust@def*\cptaddtocommalist#1#2{%
  \ifdefTF{#1}{%
    \xdef#1{%
      \ifcsnullTF#1{}{\expandcsonce{#1},}\expandcsonce{#2}%
    }%
  }{%
    \xdef#1{\expandcsonce{#2}}%
  }%
}
\robust@def*\cptkilloneelement{\cpt@testopt\cpt@killoneelement{,}}
\robust@def\cpt@killoneelement[#1]#2#3{%
  \if@checklp\cpt@checklistparser{#1}\relax\fi
  \begingroup
  \@onelevel@sanitize#3%
  \edef\cpt@rsvda{\detokenize{#2}}%
  \cpttrimparser[#1]\cpt@rsvda
  \cptpassexpanded{\unexpanded{\def\cpt@rsvdb##1#1}\cpt@rsvda}%
    #1##2\cpt@nil{##1#1##2\cpt@mil}%
  \def\cpt@rsvdc##1#1\cpt@mil##2\cpt@mil{\ifx#1##1\@empty\else##1\fi}%
  \cptpassexpanded{\edef\noexpand#3{\unexpanded{\expandafter\cpt@rsvdc
    \cpt@rsvdb}#1#3#1\noexpand\cpt@mil#1\cpt@rsvda#1\cpt@nil}}%
  \exitgroupdef#3%
  \cptscantokens#3%
}
\robust@def*\cptkillelements{\cpt@testopt\cpt@killelements{,}}
\robust@def\cpt@killelements[#1]#2#3{%
  \edef\kill@tempa{\unexpanded{#2}}%
  \cpt@sttrue\cpt@csvnormalize[#1]\kill@tempa
  \cpt@sttrue\cpt@csvnormalize[#1]#3%
  \pushfunctions\if@checklp\cpt@depth
  \@checklpfalse
  \long\def\fifo@do##1{\cpt@killoneelement[#1]{##1}#3}%
  \expandafter\simplefifoloop\expandafter{\kill@tempa}%
  \undefcs\kill@tempa
  \popfunctions\if@checklp\cpt@depth
}
\robust@def*\cptremoveoneelement{\cpt@testopt\cpt@removeoneelement{,}}
\robust@def\cpt@removeoneelement[#1]#2#3{%
  \if@checklp\cpt@checklistparser{#1}\relax\fi
  \begingroup
  \def\cpt@removeone##1#1#2#1##2\remove@nil{%
    \gdef#3{##1#1##2}%
    \xifinsetFT{\remove@nil#1}{\remove@nil\expandcsonce{#3}}{}{%
      \def\cpt@removeone#1####1\remove@nil{\gdef#3{####1}}%
      \expandafter\cpt@removeone#3\remove@nil
    }%
    \xifinsetFT{#1\remove@nil}{\expandcsonce{#3}\remove@nil}{}{%
      \def\cpt@removeone####1#1\remove@nil{\gdef#3{####1}}%
      \expandafter\cpt@removeone#3\remove@nil
    }%
  }%
  \xifinsetFT{#1\unexpanded{#2}#1}{#1\expandcsonce{#3}#1}{}{%
    \protected\def\remove@nil{}%
    \expandafter\cpt@removeone\expandafter#1#3#1\remove@nil
  }%
  \endgroup
}
\robust@def*\cptremoveelements{\cpt@testopt\cpt@removeelements{,}}
\robust@def\cpt@removeelements[#1]#2#3{%
  \edef\remove@tempa{\unexpanded{#2}}%
  \cpt@sttrue\cpt@csvnormalize[#1]\remove@tempa
  \cpt@sttrue\cpt@csvnormalize[#1]#3%
  \pushfunctions\if@checklp\cpt@depth
  \@checklpfalse
  \long\def\fifo@do##1{\cpt@removeoneelement[#1]{##1}#3}%
  \expandafter\simplefifoloop\expandafter{\remove@tempa}%
  \undefcs\remove@tempa
  \popfunctions\if@checklp\cpt@depth
}
\robust@def*\cptdeclarefilter#1{%
  \edef\cpt@usefilter##1##2{%
    \ifblankTF{#1}{\let##2##1}{%
      \ifxTF{#1}\relax{\let##2##1}{\unexpanded{#1}{##1}{##2}}%
    }%
  }%
}
\robust@def*\cptfiltermergelists{\cpt@testopt\cpt@filtermergelists{,}}
\robust@def*\cpt@filtermergelists[#1]#2#3#4{%
  \begingroup
  \cptdeclarefilter{#4}%
  \ifdefTF{#2}{%
    \ifcsnullTF#2{}{\cpt@sttrue\cpt@csvnormalize[#1]#2}%
  }{%
    \def#2{}%
  }%
  \ifblankTF{#3}{%
    \def\cpt@update{}%
  }{%
    \edef\cpt@update{\unexpanded{#3}}%
    \cpt@sttrue\cpt@csvnormalize[#1]\cpt@update
  }%
  \def\cpt@add##1{%
    \edef#2{\ifx#2\@empty\else\expandcsonce#2#1\fi
      \expandcsonce{##1}}%
  }%
  \def\fifo@do##1{%
    \@choicefdfalse
    \edef\cpt@merge@a{\unexpanded{##1}}%
    \cpt@usefilter\cpt@merge@a\cpt@merge@b
    \def\fifo@do####1{%
      \edef\cpt@merge@c{\unexpanded{####1}}%
      \cpt@usefilter\cpt@merge@c\cpt@merge@d
      \cptscantokens\cpt@merge@b
      \cptscantokens\cpt@merge@d
      \ifx\cpt@merge@b\cpt@merge@d
        \@choicefdtrue\cpt@add\cpt@merge@a
      \else
        \cpt@add\cpt@merge@c
      \fi
    }%
    \cptexpandargonce{\def#2{}\cpt@stfalse\cpt@xDfifo[#1]}#2%
    \if@boolTF{@choicefd}{}{\cpt@add\cpt@merge@a}%
  }%
  \ifcsnullTF#2{%
    \edef#2{\expandcsonce\cpt@update}%
  }{%
    \ifcsnullTF\cpt@update{}{%
      \cpt@sttrue\cpt@xDfifo[#1]\cpt@update
    }%
  }%
  \exitgroupdef#2%
}
\robust@def*\cptfilterremoveelements{%
  \cpt@testopt\cpt@filterremoveelements{,}%
}
\robust@def*\cpt@filterremoveelements[#1]#2#3#4{%
  \begingroup
  \cptdeclarefilter{#4}%
  \ifdefTF{#2}{}{\def#2{}}%
  \ifcsnullTF#2{}{\cpt@sttrue\cpt@csvnormalize[#1]#2}%
  \edef\cpt@delete{\unexpanded{#3}}%
  \ifcsnullTF\cpt@delete
    {}{\cpt@sttrue\cpt@csvnormalize[#1]\cpt@delete}%
  \edef\cpt@tempd##1{%
    {\detokenize{#1}\noexpand\cptoxdetok{##1}\detokenize{#1}}%
    {\detokenize{#1}\cptoxdetok\cpt@delete\detokenize{#1}}%
  }%
  \def\cpt@tempc{}%
  \def\fifo@do##1{%
    \edef\cpt@tempa{\unexpanded{##1}}%
    \cpt@usefilter\cpt@tempa\cpt@tempb
    \expandafter\xifinsetTF\cpt@tempd\cpt@tempb{}{%
      \cpt@stfalse\cpt@addtolist[#1]\cpt@tempc{##1}%
    }%
  }%
  \ifcsnullTF#2{}{%
    \ifcsnullTF\cpt@delete{}{\cpt@sttrue\cpt@oneDfifo[#1]#2}%
  }%
  \let#2\cpt@tempc
  \exitgroupdef#2%
}
\robust@def*\preservebracedefQ#1#2{%
  \def\preserve@prefix{#1}%
  \def\preserve@delimiter{#2}%
}
\preservebracedefQ{\long}{\@nil}
\robust@def*\preservebracedef#1{%
  \cpt@preservebracedef
  \cpt@pr@servebracedef#1.%
}
\robust@def*\PreserveBraceDef#1#2{%
  \cpt@preservebracedef
  \long\edef\preserve@after{\unexpanded{#1}}%
  \afterassignment\preserve@after
  \cpt@pr@servebracedef#2.%
}
\robust@def*\cpt@preservebracedef{%
  \begingroup
  \def\x{\endgroup\preserve@prefix
    \def\cpt@pr@servebracedef####1####2}%
  \expandafter\x\preserve@delimiter{%
    \preserve@prefix\edef##1{%
      \unexpanded\expandafter{\remove@to@dot##2}%
    }%
  }%
}
\robust@def*\cptglet{\global\let}
\@namedef{@gobblespace} {}
\robust@def*\csn@def#1{\cptthreexp\def\usecsn{#1}}
\robust@def*\csn@gdef#1{\cptthreexp\gdef\usecsn{#1}}
\robust@def*\csn@edef#1{\cptthreexp\edef\usecsn{#1}}
\robust@def*\csn@xdef#1{\cptthreexp\xdef\usecsn{#1}}
\robust@def*\letcsntocs#1{\cptthreexp\let\usecsn{#1}}
\robust@def*\gletcsntocs#1{\global\cptthreexp\let\usecsn{#1}}
\robust@def*\letcstocsn#1#2{%
  \begingroup\expandafter\endgroup\expandafter
  \let\expandafter#1\csname#2\endcsname
}
\robust@def*\gletcstocsn#1#2{%
  \begingroup\expandafter\endgroup\expandafter\global
  \expandafter\let\expandafter#1\csname#2\endcsname
}
\robust@def*\letcsntocsn#1#2{%
  \begingroup\expandafter\endgroup
  \expandafter\let\csname#1\expandafter
  \endcsname\csname#2\endcsname
}
\robust@def*\gletcsntocsn#1#2{%
  \begingroup\expandafter\endgroup\expandafter
  \global\expandafter\let\csname#1\expandafter
  \endcsname\csname#2\endcsname
}
\new@def\aftercsname#1#2{%
  \expandafter\cptswap\expandafter{\csname#2\endcsname}{#1}%
}
\new@def\xaftercsname#1#2{%
  \cptsevenxp\cptswap\cptthreexp{\csname#2\endcsname}{#1}%
}
\robust@def*\globalize#1{\cptglet#1#1}
\robust@def*\globalizecsn#1{%
  \begingroup\expandafter\endgroup\expandafter
  \global\expandafter\let\csname#1\expandafter\endcsname
  \csname#1\endcsname
}
\robust@def*\undefcs#1{\let#1\cpt@undefined}
\robust@def*\gundefcs{\global\undefcs}
\robust@def*\undefcsn#1{\aftercsname\undefcs{#1}}
\robust@def*\gundefcsn{\global\undefcsn}
\robust@def*\undefcsset{\cpt@testst\cpt@undefcsset}
\robust@def*\cpt@undefcsset#1{%
  \ifcpt@st\let\cpt@tempa#1\else\def\cpt@tempa{#1}\fi
  \normaloneDloop*\cpt@tempa\cpt@tempa{%
    \expandafter\ifescapedTF\expandafter{\cpt@tempa}{%
      \expandafter\undefcs\cpt@tempa
    }{%
      \cpt@err{I can't find escape in token
        '\cptoxdetok\cpt@tempa':\MsgBrk
        Maybe it's an active character}\@ehc
    }%
  }%
}
\robust@def*\cpttrimparser{\cpt@testopt\cpt@trimparser{,}}
\robust@def\cpt@trimparser[#1]#2{%
  \begingroup
  \edef\cpt@tempd{\detokenize{#1}}%
  \let\trimparser@nil\cpt@nil
  \def\cpt@trimb{%
    \xifinsetFT{\cpt@tempd\trimparser@nil}{\cptoxdetok{#2}\trimparser@nil}{}{%
      \cptexpandsecond{\def\cpt@trimc####1}\cpt@tempd\trimparser@nil{%
        \edef#2{\expandcsonce{\@gobble####1}}%
        \cpt@trimb
      }%
      \expandafter\cpt@trimc\expandafter.#2\trimparser@nil
    }%
  }%
  \defpass\cpt@trima{%
    \xifinsetTF{\trimparser@nil\cpt@tempd}{\trimparser@nil\cptoxdetok{#2}}{%
      \expandafter\def\expandafter\cpt@trimc\cpt@tempd####1\trimparser@nil{%
        \edef#2{\unexpanded{####1}}%
        \cpt@trima
      }%
      \expandafter\cpt@trimc#2\trimparser@nil
    }{%
      \cpt@trimb
    }%
  }%
  \exitgroupdef#2%
}
\robust@def*\stripouterbraces{\cpt@testopt\cpt@stripouterbraces\@ne}
\robust@def\cpt@stripouterbraces[#1]{%
  \begingroup
  \def\after@def##1##2##3{\exitgroupdef{##3}}%
  \let\nr\z@
  \catcode`\{=1
  \catcode`\}=2
  \catcode`\#=6
  \cpt@str@pouterbraces{#1}%
}
\robust@def\cpt@str@pouterbraces#1#2#3{%
  \edef\nr{\the\numexpr\nr+1}%
  \edef#3{\unexpanded{#2}}%
  \cpt@str@pouterbr@ces#2\strip@nil#3#1%
}
\robust@def\cpt@str@pouterbr@ces#1\strip@nil#2#3{%
  \defcmp@ifx{#1}#2%
    \expandafter\after@def
  \else
    \ifnum\nr>#3\relax
      \cptthreexp\after@def
    \else
      \cptthreexp\cpt@str@pouterbraces
    \fi
  \fi
  {#3}{#1}{#2}%
}
\robust@def\stripallouterbraces#1#2{%
  \edef#2{%
    \unexpanded\cptthreexp{\cpt@stripallouterbraces{#1}}%
  }%
}
\robust@def\stripallouterbraces@incs#1{%
  \expandafter\stripallouterbraces\expandafter{#1}#1%
}
\robust@def\cpt@stripallouterbraces#1{%
  \cpt@rnm\ifbracedTF{#1}{%
    \expandafter\ifnullTF\expandafter{\@secondoftwo#1{}}{%
      \expandafter\@gobble\cpt@stripallouterbraces#1%
    }{0 #1}%
  }{0 #1}%
}
\robust@def\defcmp@ifx#1#2{%
  \begingroup
  \edef\cpt@tempa{\unexpanded{#1}}%
  \expandafter\endgroup\ifx#2\cpt@tempa
}
\robust@def\defcmp@ifxTF#1#2{%
  \begingroup
  \edef\cpt@tempa{\unexpanded{#1}}%
  \ifxTF#2\cpt@tempa
    {\endgroup\@firstoftwo}{\endgroup\@secondoftwo}%
}
\robust@def*\cptbracearg{\cpt@testopt\cpt@bracearg\@ne}
\robust@def\cpt@bracearg[#1]#2#3{%
  \begingroup
  \let\nr\z@
  \loop
    \edef#3{\unexpanded{{#2}}}%
    \pushnumber\nr
    \ifnum\nr<#1\relax
  \repeat
  \exitgroupdef#3%
}
\defpass\cpt@tempa#1{%
  \new@def\xp@despace##1{%
    \cpt@rnm-`\q\cpt@normaldespace.##1\despace@nil#1\despace@nil
  }%
  \robust@def\normal@despace##1##2{%
    \edef##2{%
      \unexpanded\expandafter
      {\cpt@rnm-`\q\cpt@normaldespace.##1\despace@nil#1\despace@nil}%
    }%
  }%
  \robust@def\cpt@normaldespace##1#1\despace@nil{%
    \cpt@norm@ldespace##1\despace@nil
  }%
  \robust@def\cpt@norm@ldespace##1\despace@nil##2{%
    \expandafter\noexpand\@gobble##1%
  }%
}{ }
\robust@def\robust@despace#1#2{%
  \edef#2{\unexpanded{#1}}%
  \let\despace@tempa#2%
  \normal@despace{#1}#2%
  \ifxTF#2\despace@tempa{}{%
    \expandafter\robust@despace\expandafter{#2}#2%
  }%
}
\new@def*\despacecs{\cpt@testpm\cpt@despacecs}
\new@def*\cpt@despacecs#1{%
  \usecsn{\ifcpt@pm robust\else normal\fi @despacecontent}{#1}%
}
\robust@def*\normal@despacecontent#1{%
  \expandafter\normal@despace\expandafter{#1}#1%
}
\robust@def*\robust@despacecontent#1{%
  \expandafter\robust@despace\expandafter{#1}#1%
}
\robust@def*\normal@despacecsvlist{%
  \let\despace@type\z@
  \cpt@testopt\cpt@despacecsvlist{,}%
}
\robust@def*\robust@despacecsvlist{%
  \let\despace@type\@ne
  \cpt@testopt\cpt@despacecsvlist{,}%
}
\robust@def*\cpt@despacecsvlist[#1]#2{%
  \begingroup
  \let\cpt@rsvdb\@empty
  \UseEmptyEntry
  \ifnum\despace@type=\z@\let\do\normal@despace\else
    \let\do\robust@despace\fi
  \def\fifo@do##1{%
    \do{##1}\cpt@rsvda
    \cpt@sttrue\cpt@addtolist[#1]\cpt@rsvdb\cpt@rsvda
  }%
  \cpt@sttrue\cpt@oneDfifo[#1]{#2}%
  \let#2\cpt@rsvdb
  \exitgroupdef#2%
  \undefcs\despace@type
}
\new@edef*\ifcptmacroTF#1{%
  \unexpanded{\expandafter\cpt@ifmacro\meaning}%
  #1\detokenize{macro}:\cpt@nil
}
\new@def*\ifcptmacroFT#1{\ifcptmacroTF{#1}\@secondoftwo\@firstoftwo}
\edef\cpt@ifmacro{%
  \def\noexpand\cpt@ifmacro##1\detokenize{macro}:##2\cpt@nil
}
\cpt@ifmacro{\usecsn{@\ifblankTF{#2}{second}{first}oftwo}}
\robust@def*\ifescapedTF#1{%
  \begingroup\escapechar92\relax
  \edef\cpt@tempa{\expandafter\cpt@car\string#1x\car@nil}%
  \cptthreexp\endgroup\usecsn{@\ifx\cpt@tempa
    \@backslashchar first\else second\fi oftwo}%
}
\robust@def*\ifescapedFT#1{\ifescapedTF{#1}\@secondoftwo\@firstoftwo}
\newcommand*\simplerobustify[1]{%
  \def\fifo@do##1{%
    \ifescapedTF{##1}{%
      \ifdefTF##1{%
        \aftercsname\newletcs{rcv@\cptgobblescape##1}##1%
        \protected\edef##1{\noexpandcsn{rcv@\cptgobblescape##1}}%
      }{%
        \cpt@err{Command '\string##1' undefined}\@ehc
      }%
    }{%
      \cpt@err{String '\detokenize{##1}' not escaped}\@ehc
    }%
  }%
  \simplefifoloop{#1}%
}
\robust@def*\leftaddtocs{%
  \let\cpt@def\edef\let\swap\cptswap\cpt@addtocs
}
\robust@def*\gleftaddtocs{%
  \let\cpt@def\xdef\let\swap\cptswap\cpt@addtocs
}
\robust@def*\rightaddtocs{%
  \let\cpt@def\edef\let\swap\cptalloftwo\cpt@addtocs
}
\robust@def*\grightaddtocs{%
  \let\cpt@def\xdef\let\swap\cptalloftwo\cpt@addtocs
}
\robust@def*\rightaddtocsn{\aftercsname\rightaddtocs}
\robust@def*\grightaddtocsn{\aftercsname\grightaddtocs}
\robust@def*\leftaddtocsn{\aftercsname\leftaddtocs}
\robust@def*\gleftaddtocsn{\aftercsname\gleftaddtocs}
\robust@def\cpt@addtocs#1#2{%
  \cpt@getmacroprefix{#1}%
  \ifdefTF#1{%
    \macroprefix\cpt@def#1{\swap{\expandcsonce{#1}}{\unexpanded{#2}}}%
  }{%
    \macroprefix\cpt@def#1{\unexpanded{#2}}%
  }%
  \undefcs\cpt@def\undefcs\swap
}
\robust@def*\cpt@getmacroprefix#1{%
  \begingroup
  \edef\cpt@tempa##1{\def##1####1\detokenize{macro}:####2\cpt@unique}%
  \cpt@tempa\@ifmacro{%
    \def\macroprefix{##1}%
    \usecsn{@\ifblankTF{##2}{second}{first}oftwo}%
  }%
  \edef\cpt@tempb##1{##1\detokenize{macro}:\cpt@unique}%
  \cpt@tempb{\expandafter\@ifmacro\meaning#1}{%
    \@testtrue
  }{%
    \@testfalse\def\macroprefix{}%
  }%
  \cptpassexpanded{%
    \endgroup\noexpand\scantokens
    {\def\noexpand\macroprefix{\macroprefix}\relax}%
  }%
}
\robust@def*\BeforeStartOfDocument{%
  \grightaddtocs\cpt@beforestartdoc@hook
}
\new@def*\cpt@beforestartdoc@hook{}
\gleftaddtocs\document{%
  \endgroup
  \let\BeforeStartOfDocument\@firstofone
  \cpt@beforestartdoc@hook
  \let\BeforeStartOfDocument\@notprerr
  \gundefcs\cpt@beforestartdoc@hook
  \begingroup
}
\robust@def*\AfterStartOfDocument{%
  \grightaddtocs\cpt@afterstartdoc@hook
}
\new@def*\cpt@afterstartdoc@hook{}
\grightaddtocs\document{%
  \let\AfterStartOfDocument\@firstofone
  \cpt@afterstartdoc@hook
  \let\AfterStartOfDocument\@notprerr
  \gundefcs\cpt@afterstartdoc@hook
  \ignorespaces
}
\gleftaddtocs\@popfilename{%
  \usecsn{%
    @\ifcsname\@currname.\@currext-cpt@h@@k\endcsname
    iden\else gobble\fi
  }%
  {\usecsn{\@currname.\@currext-cpt@h@@k}}%
  \gundefcsn{\@currname.\@currext-cpt@h@@k}%
}
\def\cptloadpackages#1{%
  \ifcsnullTF\@currname{%
    \cpt@err{Not in a style or class file}\@ehc
  }{%
    \def\cpt@loadpackages##1##2##3\cpt@nil{%
      \@ifpackageloaded{##1}{}{\RequirePackage[##2]{##1}[##3]}%
    }%
    \@useemptyfalse
    \normalxDloop{#1}\cpt@tempa{%
      \expandafter\cpt@loadpackages\cpt@tempa\cpt@nil
    }%
  }%
}
\robust@def*\AfterEndOfStyleFile{%
  \begingroup
  \def\cpt@tempa{\endgroup
    \expandafter\grightaddtocs
    \csname\@currname.\@currext-cpt@h@@k\endcsname
  }%
  \ifcsnullTF\@currname\endgroup\cpt@tempa
}
\edef\cpt@hashchar{\string#}
\robust@def*\cpt@pushhash{%
  \begingroup
  \@makeother{\#}%
  \endlinechar\m@ne
  \cpt@pop@hash
}
\robust@def\cpt@push@hash#1#2{%
  \xifinsetTF\cpt@hashchar{\detokenize{#1}}{%
    \edef\x##1{##1\detokenize{#1}\cpt@hashchar\cpt@nil}%
    \edef\y##1{\def##1####1\cpt@hashchar####2\cpt@nil}%
    \y\y{%
      \ifblankTF{##2}{%
        \toks@\expandafter{\the\toks@##1}%
      }{%
        \cptpassexpanded
          {\toks@{\the\toks@##1\cpt@hashchar\cpt@hashchar}}%
        \y##2\cpt@nil
      }%
    }%
    \x{\toks@{}\y}%
  }{%
    \toks@\expandafter{\detokenize{#1}}%
  }%
  \edef#2{\the\toks@}%
  \exitgroupdef#2%
}
\robust@def*\cpt@pophash{%
  \begingroup
  \@makeother{\#}%
  \endlinechar\m@ne
  \cpt@push@hash
}
\robust@def\cpt@pop@hash#1#2{%
  \xifinsetTF{\detokenize{##}}{\detokenize{#1}}{%
    \edef\x##1{##1\detokenize{#1##}\cpt@nil}%
    \edef\y##1{\def##1####1\detokenize{##}####2\cpt@nil}%
    \y\y{%
      \ifblankTF{##2}{%
        \toks@\expandafter{\the\toks@##1}%
      }{%
        \cptpassexpanded{\toks@{\the\toks@##1\cpt@hashchar}}%
        \y##2\cpt@nil
      }%
    }%
    \x{\toks@{}\y}%
  }{%
    \toks@\expandafter{\detokenize{#1}}%
  }%
  \edef#2{\the\toks@}%
  \exitgroupdef#2%
}
\robust@def*\cpteveryscantokens{%
  \everyeof{\noexpand}%
  \endlinechar\m@ne
  \makeatletter
  \catcode`\ =10\relax
  \catcode`\\\z@
  \catcode`\{\@ne
  \catcode`\}\tw@
}
\robust@def*\cptscantokens#1{%
  \begingroup
  \edef#1{\def\string#1{\cptoxdetok{#1}}}%
  \cpteveryscantokens
  \scantokens\expandafter{#1}\relax
  \exitgroupdef#1%
}
\cptonlypreamble{%
  \cptpushcatcodes,\cptpopcatcodes,
  \UseNormalCatcodes,\rc@UseNormalCatcodes,
  \StyleFilePurpose,\StyleFileInfo,\AfterEndOfStyleFile,
  \StyleFileRCSInfo,\SetStyleFileMessages,
  \XDeclareOption,\XDeclareCommandOption,\XDeclareBooleanOption,
  \XDeclareCommandOptions,\XDeclareBooleanOptions,
  \XDeclareBiBooleanOptions,\XProcessOptions,\XExecuteOptions,
  \cpt@processedoptions,\cpt@optionlist,\cpt@splitoption,
  \cpt@processoptions,\cpt@xprocessoptions,\cpt@pr@cessoptions,
  \cpt@pr@c@ssoptions,\BeforeStartOfDocument,
  \AfterStartOfDocument
}
\robust@def*\csv@@normalize{\cpt@teststoptb\cpt@csvnormalize}
\robust@def\cpt@csvnormalize[#1]#2{%
  \let\normalize@listtype\z@
  \csv@kv@normalize{#1}{#2}\normalized@csvlist
}
\robust@def*\kv@@normalize{\cpt@teststoptb\cpt@kvnormalize}
\robust@def\cpt@kvnormalize[#1]#2{%
  \let\normalize@listtype\@ne
  \csv@kv@normalize{#1}{#2}\normalized@kvlist
}
\robust@def\csv@kv@normalize#1#2#3{%
  \let\if@normst\ifcpt@st
  \cpt@checklistparser{#1}\relax
  \begingroup
  \expandafter\setup@parser@normalize\string#1%
  \if@normst
    \toks@\expandafter{\expandafter#1#2#1}%
  \else
    \toks@{#1#2#1}%
  \fi
  \normalize@activeparser
  \expandafter\normalize@spaceletter\string#1%
  \expandafter\normalize@letterspace\string#1%
  \expandafter\normalize@doubleletter\string#1%
  \ifnumFT\normalize@listtype=\@ne{}{%
    \normalize@activeequal
    \expandafter\normalize@spaceletter\string=%
    \expandafter\normalize@letterspace\string=%
    \expandafter\normalize@doubleletter\string=%
    \commaequal@err
  }%
  \edef#3{\the\toks@}%
  \expandafter\cpttrimparser\expandafter[\string#1]#3%
  \exitgroupdef#3%
  \if@normst\let#2#3\undefcs#3\fi
  \undefcs\if@normst
}
\def\setup@parser@normalize#1{%
  \begingroup
  \uccode`\~\string=`#1%
  \uppercase{\endgroup
    \def\normalize@activeparser{%
      \def\cpt@tempa####1~####2\cpt@nil{%
        \toks@\expandafter{\the\toks@####1}%
        \ifblankTF{####2}{}{\cpt@tempa#1####2\cpt@nil}%
      }%
      \toks@\expandafter{\expandafter}%
      \expandafter\cpt@tempa\the\toks@~\cpt@nil
    }%
  }%
}
\begingroup
\uccode`\~\string=`\=%
\uppercase{\endgroup
  \def\normalize@activeequal{%
    \def\cpt@tempa##1~##2\cpt@nil{%
      \expandafter\ifblankTF\expandafter{\the\toks@}{%
        \toks@{##1}%
      }{%
        \toks@\expandafter{\the\toks@=##1}%
      }%
      \ifblankTF{##2}{}{\cpt@tempa##2\cpt@nil}%
    }%
    \toks@\expandafter{\expandafter}\expandafter
    \cpt@tempa\the\toks@~\cpt@nil
  }%
}
\def\normalize@doubleletter#1{%
  \def\cpt@tempa##1#1#1##2\cpt@nil{%
    \ifblankTF{##2}{%
      \toks@{##1}%
    }{%
      \toks@{##1#1##2}%
      \expandafter\cpt@tempa\the\toks@\cpt@nil
    }%
  }%
  \expandafter\cpt@tempa\the\toks@#1#1\cpt@nil
}
\defpass\cpt@tempa#1{%
  \def\normalize@spaceletter##1{%
    \def\cpt@tempa####1#1##1####2\cpt@nil{%
      \ifblankTF{####2}{%
        \toks@{####1}%
      }{%
        \toks@{####1##1####2}%
        \expandafter\cpt@tempa\the\toks@\cpt@nil
      }%
    }%
    \expandafter\cpt@tempa\the\toks@#1##1\cpt@nil
  }%
  \def\normalize@letterspace##1{%
    \def\cpt@tempa####1##1#1####2\cpt@nil{%
      \ifblankTF{####2}{%
        \toks@{####1}%
      }{%
        \toks@{####1##1####2}%
        \expandafter\cpt@tempa\the\toks@\cpt@nil
      }%
    }%
    \expandafter\cpt@tempa\the\toks@##1#1\cpt@nil
  }%
}{ }
\robust@def*\commaequal@err{%
  \def\cpt@tempa##1,=##2\cpt@nil{%
    \ifblankTF{##2}{}{%
      \cpt@err{There is 'comma' next to 'equal' (,=) in
        \MsgBrk your key-value list}\@ehc
    }%
  }%
  \expandafter\cpt@tempa\the\toks@,=\cpt@nil
}
\let\cpt@documentclass\cpt@undefined
\robust@def*\cpt@getdocumentclass{%
  \normaloneDloop*\@filelist\cpt@tempa{%
    \filename@parse\cpt@tempa
    \ifx\filename@ext\@clsextension
      \ifcsndefFT{opt@\filename@area\filename@base.\filename@ext}{}{%
        \xdef\cpt@documentclass{%
          \filename@area\filename@base.\filename@ext
        }%
      }%
    \fi
    \ifx\cpt@documentclass\cpt@undefined\else\@breaklooptrue\fi
  }%
  \ifdefTF\cpt@documentclass{}{%
    \@latex@info@no@line{'catoptions' package loaded before
      \string\documentclass: \MsgBrk no problem}%
  }%
}
\cptpassunexpanded{%
  \ifx\@filelist\relax
  \else
    \ifx\@filelist\@gobble
    \else
      \ifx\@filelist\@empty
      \else
        \cptsevenxp\cpt@getdocumentclass
      \fi
    \fi
  \fi
  \ifxTF\cpt@documentclass\cpt@undefined{%
    \let\cpt@documentclass\@empty
    \let\cpt@classoptionslist\@empty
  }{%
    \ifxTF\@classoptionslist\relax{}{%
      \ifxTF\@classoptionslist\@empty{}{%
        \cpt@sttrue\cpt@kvnormalize[,]\@classoptionslist
      }%
    }%
    \let\cpt@classoptionslist\@classoptionslist
    \cptexpandargonce{\emptify\@classoptionslist
    \normaloneDloop}\@classoptionslist\cpt@tempa{%
      \oifinsetTF{=}\cpt@tempa{}{%
        \cptaddtocommalist\@classoptionslist\cpt@tempa
      }%
    }%
  }%
}
\robust@def*\cpt@testfam#1{%
  \cpt@ifnextchar<{#1}{#1<{\@currname.\@currext}>}%
}
\robust@redef\@pass@ptions#1#2#3{%
  \begingroup
  \ifsingletokenTF{#2}{%
    \ifcptmacroTF{#2}{%
      \let\@expand\expandcsonce
    }{%
      \let\@expand\unexpanded
    }%
  }{%
    \let\@expand\unexpanded
  }%
  \ifcsndefTF{opt@#3.#1}{%
    \ifblankTF{#2}{}{%
      \cptexpandarg{\cptexpandsecond{\cpt@filtermergelists[,]}%
        {\cptmakecs{opt@#3.#1}}}{\@expand{#2}}{}%
    }%
  }{%
    \csn@edef{opt@#3.#1}{\@expand{#2}}%
  }%
  \globalizecsn{opt@#3.#1}%
  \endgroup
}
\robust@redef*\OptionNotUsed{%
  \ifx\@currext\@clsextension
    \cptaddtocommalist\@unusedoptionlist\CurrentOption
  \fi
}
\robust@redef*\@use@ption{%
  \xifinsetFT{,\cptoxdetok\CurrentOption,}%
    {,\cptoxdetok\@unusedoptionlist,}{}{%
    \cptexpandargonce{\cpt@killoneelement[,]}\CurrentOption
      \@unusedoptionlist
  }%
  \csname ds@\CurrentOption\endcsname
}
\robust@redef*\@fileswith@pti@ns#1[#2]#3[#4]{%
  \begingroup
  \edef\fileopts{\unexpanded{#2}}%
  \ifcsnullTF\fileopts{}{\cpt@sttrue\cpt@kvnormalize[,]\fileopts}%
  \def\fileswithopts##1##2{%
    \noexpand\@onefilewithoptions{##1}%
    [\expandcsonce\fileopts]\unexpanded{[#4]##2}%
  }%
  \def\file@withopts##1{\cptpassexpanded{\toks@{##1}}}%
  \toks@{}%
  \ifxTF#1\@clsextension{%
    \ifx\@classoptionslist\relax
      \xdef\@classoptionslist{\expandcsonce\fileopts}%
      \file@withopts{\fileswithopts{#3}{#1\@documentclasshook}}%
    \else
      \file@withopts{\fileswithopts{#3}{#1}}%
    \fi
  }{%
    \edef\cpt@tempa{\cptzapspaces{#3}}%
    \DiscardEmptyEntry
    \normaloneDloop*\cpt@tempa\cpt@tempa{%
      \file@withopts{\the\toks@\fileswithopts{\cpt@tempa}\@pkgextension}%
    }%
  }%
  \expandafter\endgroup\the\toks@
}
\let\@@fileswith@pti@ns\@fileswith@pti@ns
\robust@def*\RecoverAtEndOfPackage#1{%
  \letcsntocs{rc@\expandafter\@gobble\string#1}#1%
  \begingroup
  \edef\cpt@tempa{%
    \let\unexpanded{#1}%
    \noexpandcsn{rc@\expandafter\@gobble\string#1}%
  }%
  \edef\cpt@tempb{\expandcsnonce{\@currname.\@currext-h@@k}}%
  \xifinsetTF{\cptoxdetok\cpt@tempa}{\cptoxdetok\cpt@tempb}{}{%
    \expandafter\AtEndOfPackage\expandafter{\cpt@tempa}%
  }%
  \xifinsetTF{\cptoxdetok\cpt@tempa}{\cptoxdetok\RequirePackage}{}{%
    \xdef\RequirePackage{%
      \expandcsonce\cpt@tempa\expandcsonce\RequirePackage
    }%
  }%
  \endgroup
}
\RecoverAtEndOfPackage\cpt@defdefault@ds
\robust@def*\cpt@badoptionerr{%
  \expandafter\ifescapedTF\expandafter{\curropt}{%
    \cpt@err{Bad option name '\expandcsonce\curropt'}\@ehc
  }{%
    \expandafter\ifcptmacroFT\expandafter{\curropt}{}{%
      \cpt@err{Bad option name '\expandcsonce\curropt'}\@ehc
    }%
  }%
}
\robust@def*\XDeclareOption{%
  \let\@fileswith@pti@ns\@badrequireerror
  \cpt@ifstar
    {\cpt@testfam\cpt@defdefault@ds}%
    {\cpt@testfam\cpt@declareoption}%
}
\robust@def*\cpt@declareoption<#1>#2{%
  \normal@despace{#1}\currfam
  \normal@despace{#2}\curropt
  \cpt@badoptionerr
  \cptexpandarg\cpt@testopt
    {\cpt@d@clareoption{\currfam}{\curropt}}{}%
}
\robust@def\cpt@d@clareoption#1#2[#3]#4{%
  \cpt@d@cl@reoption{#1}{#2}{#3}%
  \if@boolTF{cpt@olddx}{%
    \global\long\csn@edef{#1@ds@#2}{\unexpanded{#4}}%
  }{%
    \begingroup
    \long\def\cpt@tempa##1{\endgroup
      \global\long\csn@def{#1@ds@#2}####1{##1}%
    }%
    \cpt@tempa{#4}%
  }%
  \cpt@olddxfalse
}
\robust@def*\XDeclareOptions{%
  \let\@fileswith@pti@ns\@badrequireerror
  \cpt@ifstar{%
    \cpt@err{Command \noexpand\XDeclareOptions has no
      star form}\@ehc
  }{%
    \cpt@testfam\cpt@declareoptions
  }%
}
\robust@def*\cpt@declareoptions<#1>#2{%
  \cpt@testopt{\cpt@d@clareoptions{#1}{#2}}{}%
}
\robust@def\cpt@d@clareoptions#1#2[#3]#4{%
  \edef\curr@fam{\xp@despace{#1}}%
  \def\curr@opts{#2}%
  \cpt@sttrue\cpt@csvnormalize[,]\curr@opts
  \def\fifo@do##1{%
    \def\curropt{##1}%
    \cpt@badoptionerr
    \expandafter\cpt@d@clareoption
    \expandafter{\curr@fam}{##1}[#3]{#4}%
  }%
  \cpt@stfalse\cptexpandargonce{\cpt@xDfifo[,]}\curr@opts
  \undefcs\curr@opts\undefcs\curr@fam
}
\robust@def*\XDeclareCommandOption{%
  \let\@fileswith@pti@ns\@badrequireerror
  \let\cmdoption\@ne
  \cpt@testfam\cpt@declarecmdoption
}
\robust@def*\XDeclareCommandOptions{%
  \let\@fileswith@pti@ns\@badrequireerror
  \let\cmdoption\@ne
  \cpt@testfam\cpt@declarecmdoptions
}
\robust@def*\XDeclareBooleanOption{%
  \let\@fileswith@pti@ns\@badrequireerror
  \let\cmdoption\z@
  \cpt@testfam\cpt@declarecmdoption
}
\robust@def*\cpt@declarecmdoption<#1>#2{%
  \normal@despace{#1}\currfam
  \normal@despace{#2}\curropt
  \cpt@badoptionerr
  \cptexpandarg\cpt@testopt
    {\cpt@d@clarecmdoption{\currfam}{\curropt}}{}%
}
\robust@def\cpt@d@clarecmdoption#1#2[#3]{%
  \cptexpandarg{\cpt@testpnopt{\cpt@d@cl@recmdoption
    {#1}{#2}{#3}}}{\ifnum\cmdoption=\@ne cmd\fi\@currname @}%
}
\robust@def\cpt@d@cl@recmdoption#1#2#3(#4)#5{%
  \cpt@d@cl@reoption{#1}{#2}{#3}%
  \ifnum\cmdoption=\@ne
    \def\cpt@rsvda{\csn@def{#4#2}{####1}}%
  \else
    \cptexpandsecond{\usecsn{newif}}{\noexpandcsn{if#4#2}}%
    \def\cpt@rsvda{%
      \ifinsetTF{,####1,}{,true,false,}{}{%
        \@latex@error{Invalid value for option '#2'}\@ehc
      }%
      \cptuse{#4#2####1}%
    }%
  \fi
  \long\def\cpt@rsvdb##1{%
    \long\csn@gdef{#1@ds@#2}####1{##1\relax}%
  }%
  \expandafter\cpt@rsvdb\expandafter{\cpt@rsvda#5}%
}
\robust@def*\XDeclareBooleanOptions{%
  \let\@fileswith@pti@ns\@badrequireerror
  \let\cmdoption\z@
  \cpt@testfam\cpt@declarecmdoptions
}
\robust@def*\cpt@declarecmdoptions<#1>#2{%
  \cpt@testopt{\cpt@d@clarecmdoptions{#1}{#2}}{}%
}
\robust@def\cpt@d@clarecmdoptions#1#2[#3]{%
  \cptexpandarg{\cpt@testpnopt{\cpt@d@cl@recmdoptions
    {#1}{#2}{#3}}}{\ifnum\cmdoption=\@ne cmd\fi\@currname @}%
}
\robust@def\cpt@d@cl@recmdoptions#1#2#3(#4)#5{%
  \edef\curr@fam{\xp@despace{#1}}%
  \def\curr@opts{#2}%
  \cpt@sttrue\cpt@csvnormalize[,]\curr@opts
  \def\fifo@do##1{%
    \def\curropt{##1}%
    \cpt@badoptionerr
    \expandafter\cpt@d@cl@recmdoption
    \expandafter{\curr@fam}{##1}{#3}(#4){#5}%
  }%
  \cpt@stfalse\cptexpandargonce{\cpt@xDfifo[,]}\curr@opts
  \undefcs\curr@opts\undefcs\curr@fam
}
\robust@def*\XDeclareBiBooleanOptions{%
  \let\@fileswith@pti@ns\@badrequireerror
  \let\cmdoption\z@
  \cpt@testfam\cpt@declarebibooloptions
}
\robust@def*\cpt@declarebibooloptions<#1>#2{%
  \begingroup
  \@tempcnta\z@
  \def\fifo@do##1{\advance\@tempcnta\@ne}%
  \simplefifoloop{#2}%
  \ifnum\@tempcnta>\tw@
    \cpt@err{Biboolean options '#2' more than 2}\@ehc
    \aftergroup\@gobble
  \else
    \ifnum\@tempcnta<\tw@
      \cpt@err{Biboolean options '#2' less than 2}\@ehc
      \aftergroup\@gobble
    \fi
  \fi
  \endgroup
  \cpt@testopt{\cpt@d@clarebibooloptions{#1}{#2}}{}%
}
\robust@def\cpt@d@clarebibooloptions#1#2[#3]{%
  \cptexpandarg{\cpt@testpnopt{\cpt@d@cl@rebibooloptions
    {#1}{#2}{#3}}}{\@currname @}%
}
\robust@def\cpt@d@cl@rebibooloptions#1#2#3(#4)#5#6{%
  \edef\curr@fam{\xp@despace{#1}}%
  \def\curr@opts{#2}%
  \cpt@sttrue\cpt@csvnormalize[,]\curr@opts
  \edef\do@prompted##1##2##3{%
    \unexpanded{\cptsevenxp\ifstrcmpTF\cptthreexp}%
    {\noexpand\csname#4##1@prompted\noexpand\endcsname}{true}{}{%
      \XExecuteOptions<\curr@fam>{##2=##3}%
    }%
  }%
  \begingroup
  \def\cpt@tempa##1,##2\cpt@nil{%
    \endgroup
    \csn@def{#4##1@prompted}{false}%
    \csn@def{#4##2@prompted}{false}%
    \simpleexpandarg\cpt@d@cl@recmdoption\curr@fam{##1}{#3}(#4){%
      #5%
      \csn@def{#4##2@prompted}{true}%
      \ifboolTF{#4##1}{%
        \do@prompted{##1}{##2}{false}%
      }{%
        \do@prompted{##1}{##2}{true}%
      }%
      \csn@def{#4##2@prompted}{false}%
    }%
    \simpleexpandarg\cpt@d@cl@recmdoption\curr@fam{##2}{#3}(#4){%
      #6%
      \csn@def{#4##1@prompted}{true}%
      \ifboolTF{#4##2}{%
        \do@prompted{##2}{##1}{false}%
      }{%
        \do@prompted{##2}{##1}{true}%
      }%
      \csn@def{#4##1@prompted}{false}%
    }%
  }%
  \expandafter\cpt@tempa\curr@opts\cpt@nil
  \undefcs\curr@opts\undefcs\curr@fam
}
\robust@def\cpt@d@cl@reoption#1#2#3{%
  \ifcsndefTF{#1@declaredoptions}{%
    \xifinsetTF{,\detokenize{#2},}{,\cpt@getdeclaredoptions{#1},}{%
      \cpt@warn{Option '#2' multiply defined\MsgBrk in
        family '#1'\MsgBrk (in \@cls@pkg\@space'\@currname')%
      }%
    }{%
      \cpt@stfalse
      \cptexpandarg{\cpt@addtolist[,]}%
        {\noexpandcsn{#1@declaredoptions}}{#2}%
    }%
  }{%
    \csn@def{#1@declaredoptions}{#2}%
  }%
  \global\csn@edef{#1@ds@#2@default}{%
    \noexpandcsn{#1@ds@#2}{\unexpanded{#3}}%
  }%
}
\new@def*\cpt@getdeclaredoptions#1{%
  \ifcsnnullTF{#1@declaredoptions}{}{%
    \detokenize\cptsevenxp{\usecsn{#1@declaredoptions}}%
  }%
}
\robust@def*\cpt@defdefault@ds<#1>#2{%
  \csn@edef{#1@default@ds}{\unexpanded{#2}}%
  \protected\def\cpt@defdefault@ds<##1>##2{%
    \cpt@err{'\string\XDeclareOption*' multiply defined in
      \MsgBrk\@cls@pkg\space'\@currname'}{Multiple star
      variant of \string\XDeclareOption\@space in
      \@cls@pkg\@space'\@currname'.}%
  }%
}
\newletcs\rc@cpt@defdefault@ds\cpt@defdefault@ds
\new@def*\cpt@optionlist#1{%
  \ifcsndefFT{opt@#1}{}{\unexpanded\cptsevenxp{\usecsn{opt@#1}}}%
}
\newletcs\cpt@processedoptions\@empty
\robust@def*\XProcessOptions{%
  \let\@fileswith@pti@ns\@badrequireerror
  \edef\cpt@testname{\@currname.\@currext}%
  \ifx\cpt@testname\cpt@documentclass
    \let\@unusedoptionlist\cpt@classoptionslist
  \fi
  \edef\cpt@classoptions{%
    \ifx\cpt@testname\cpt@documentclass\else
      \expandcsonce\cpt@classoptionslist\fi
  }%
  \edef\@curroptions{\cpt@optionlist{\@currname.\@currext}}%
  \ifcsnullTF\@curroptions{}%
    {\cpt@sttrue\cpt@kvnormalize[,]\@curroptions}%
  \cpt@ifstar
    {\cpt@sttrue\cpt@testfam\cpt@processoptions}%
    {\cpt@stfalse\cpt@testfam\cpt@processoptions}%
}
\robust@def*\cpt@processoptions<#1>{%
  \if@boolTF{cpt@st}{%
    \cpt@testopt{\cpt@xprocessoptions#1}{}%
  }{%
    \cpt@testopt{\cpt@pr@cessoptions#1}{}%
  }%
}
\robust@def*\cpt@pr@cessoptions#1[#2]{%
  \normal@despace{#1}\currfam
  \def\kv@do##1{%
    \edef\CurrentOption{\unexpanded{##1}}%
    \ifcsnullTF\CurrentOption{}{%
      \cpt@splitoption\z@
      \if@boolFT{cpt@optf}{}{%
        \cpt@inpoxtrue
        \ifcsndefFT{#1@ds@\curropt}{}{%
          \ifblankTF{#2}{%
            \cpt@igoptfalse
          }{%
            \oifinsetTF{\curropt}{#2}{%
              \cpt@igopttrue
            }{%
              \cpt@igoptfalse
            }%
          }%
          \cpt@useoption
        }%
      }%
    }%
  }%
  \ifcsnullTF\cpt@classoptions{}{%
    \cptexpandarg{\kv@@parse*}{\noexpandcsn{#1@declaredoptions}}%
  }%
  \cpt@pr@c@ssoptions{#1}{#2}%
}
\robust@def*\cpt@xprocessoptions#1[#2]{%
  \normal@despace{#1}\currfam
  \def\kv@do##1{%
    \edef\CurrentOption{\unexpanded{##1}}%
    \ifcsnullTF\CurrentOption{}{%
      \cpt@splitoption\@ne
      \xifinsetFT{,\cptoxdetok\curropt,}%
        {,\cpt@getdeclaredoptions{#1},}{}{%
        \cpt@inpoxtrue
        \ifcsndefFT{#1@ds@\curropt}{}{%
          \ifblankTF{#2}{%
            \cpt@igoptfalse
          }{%
            \oifinsetTF{\curropt}{#2}{%
              \cpt@igopttrue
            }{%
              \cpt@igoptfalse
            }%
          }%
          \cpt@useoption
        }%
      }%
    }%
  }%
  \ifcsnullTF\cpt@classoptions{}{\kv@@parse*\cpt@classoptions}%
  \cpt@pr@c@ssoptions{#1}{#2}%
}
\robust@def*\cpt@pr@c@ssoptions#1#2{%
  \normal@despace{#1}\currfam
  \def\kv@do##1{%
    \edef\CurrentOption{\unexpanded{##1}}%
    \ifcsnullTF\CurrentOption{}{%
      \cpt@splitoption\@ne
      \cpt@inpoxtrue
      \ifcsndefTF{#1@ds@\curropt}{%
        \ifblankTF{#2}{%
          \cpt@igoptfalse
        }{%
          \oifinsetTF{\curropt}{#2}{%
            \cpt@igopttrue
          }{%
            \cpt@igoptfalse
          }%
        }%
        \cpt@useoption
      }{%
        \ifcsndefTF{#1@default@ds}{%
          \usecsn{#1@default@ds}%
        }{%
          \default@ds
        }%
      }%
    }%
  }%
  \ifcsnullTF\@curroptions{}{\kv@@parse*\@curroptions}%
  \let\CurrentOption\@empty
  \ifx\cpt@documentclass\cpt@undefined
    \cptglet\cpt@pr@cessedoptions\cpt@processedoptions
  \else
    \let\cpt@pr@cessedoptions\@empty
  \fi
  \undefcs\cpt@classoptions
  \let\cpt@processedoptions\@empty
  \let\@fileswith@pti@ns\@@fileswith@pti@ns
  \cpt@olddxfalse
  \AtEndOfPackage{\let\@unprocessedoptions\relax}%
}
\robust@def*\XExecuteOptions{\cpt@testfam\cpt@executeoptions}
\robust@def*\cpt@executeoptions<#1>#2{%
  \normal@despace{#1}\currfam
  \let\cpt@executedoptions\@empty
  \let\rc@CurrentOption\CurrentOption
  \def\kv@do##1{%
    \edef\CurrentOption{\unexpanded{##1}}%
    \ifcsnullTF\CurrentOption{}{%
      \cpt@splitoption\@ne
      \xifinsetTF{,\cptoxdetok\curropt,}%
        {,\cpt@getdeclaredoptions{#1},}{%
        \xifinsetTF{,\cptoxdetok\curropt,}%
          {,\cptoxdetok\cpt@executedoptions,}{%
          \cpt@warn{Option '\curropt' multiply submitted to
            \MsgBrk\string\XExecuteOptions: re-executed}%
        }{%
          \cptaddtocommalist\cpt@executedoptions\curropt
        }%
        \cpt@inpoxfalse\cpt@igoptfalse\cpt@useoption
      }{%
        \cpt@warn{Option '\expandcsonce\curropt' not
          declared: ignored}%
      }%
    }%
  }%
  \kv@@parse{#2}%
  \let\CurrentOption\rc@CurrentOption
  \let\cpt@executedoptions\@empty
  \cpt@olddxfalse
}
\robust@def\cpt@splitoption#1{%
  \ifcase#1\relax
    \cpt@optffalse
    \oneDloop@b\cpt@classoptions\@currentoption{%
      \ifcsnullTF\@currentoption{}{%
        \xifinsetTF{=}{\cptoxdetok\@currentoption}{%
          \expandafter\cpt@split@ption\@currentoption=\cpt@nil
        }{%
          \let\@curropt\@currentoption
          \let\@currval\@empty
        }%
        \let\currval\@currval
        \ifx\@curropt\CurrentOption
          \cpt@optftrue\@breaklooptrue
          \let\curropt\@curropt
          \let\currentoption\@currentoption
        \fi
      }%
    }%
  \or
    \let\currentoption\CurrentOption
    \xifinsetTF{=}{\cptoxdetok\CurrentOption}{%
      \expandafter\cpt@split@ption\CurrentOption=\cpt@nil
      \let\curropt\@curropt
      \let\currval\@currval
    }{%
      \let\curropt\CurrentOption
      \let\currval\@empty
    }%
  \else
    \cpt@err{Invalid case '\expandcsonce{#1}' for
      command '\string\cpt@splitoption'}\@ehc
  \fi
}
\def\cpt@split@ption#1=#2\cpt@nil{%
  \edef\@curropt{\unexpanded{#1}}%
  \ifinsetTF{=\cpt@nil}{#2\cpt@nil}{%
    \begingroup
    \def\cpt@tempa##1=##2\cpt@nil{\endgroup
      \edef\@currval{\expandcsonce{\remove@to@dot##1}}%
    }%
    \cpt@tempa.#2\cpt@nil
  }{%
    \edef\@currval{\unexpanded{#2}}%
  }%
}
\robust@def*\cpt@useoption{%
  \ifcpt@inpox
    \xifinsetTF{,\cptoxdetok\CurrentOption,}%
      {,\cptoxdetok\cpt@processedoptions,}{}{%
      \cptaddtocommalist\cpt@processedoptions\CurrentOption
    }%
    \remove@curr@option\currentoption
    \ifx\currentoption\CurrentOption\else
      \remove@curr@option\CurrentOption
    \fi
  \fi
  \ifcpt@igopt\else
    \ifcpt@olddx
      \cptuse{\currfam @ds@\curropt}%
    \else
      \ifcsndefFT{\currfam @ds@\curropt}{}{%
        \ifcsnullTF\currval{%
          \cptthreexp\cpt@usedefault
          \csname\currfam @ds@\curropt @default\endcsname\cpt@nil
        }{%
          \cpt@use@ption
        }%
      }%
    \fi
  \fi
}
\robust@def*\cpt@use@ption{%
  \cpt@pushoptionstate
  \cptexpandargonce{\cptuse{\currfam @ds@\curropt}}\currval\relax
  \cpt@popoptionstate
}
\robust@def*\cpt@usedefault#1#2\cpt@nil{%
  \ifcptmacroTF{#1}{%
    \edef\cpt@tempa{\expandafter\@gobble\string#1}%
  }{%
    \cpt@err{Invalid option macro passed to command
      '\string\cpt@usedefault'}\@ehc
  }%
  \edef\cpt@tempb{\currfam @ds@\curropt}%
  \@onelevel@sanitize\cpt@tempb
  \ifxTF\cpt@tempa\cpt@tempb{%
    \begingroup
    \csn@def{\currfam @ds@\curropt}##1{%
      \toks@{\def\currval{##1}}%
    }%
    \cptuse{\currfam @ds@\curropt @default}%
    \expandafter\endgroup\the\toks@
    \cpt@use@ption
  }{%
    \cpt@warn{Non-standard default function for option
      '\expandcsonce\curropt':\MsgBrk Executed anyway}%
    \cpt@pushoptionstate
    \cptuse{\currfam @ds@\curropt @default}\relax
    \cpt@popoptionstate
  }%
}
\robust@def*\cpt@pushoptionstate{%
  \pushfunctions{\currfam,\curropt,\currval,\CurrentOption,%
  \currentoption,\ifcpt@inpox,\ifcpt@optf,\ifcpt@igopt}\cpt@optdepth
}
\robust@def*\cpt@popoptionstate{%
  \popfunctions{\currfam,\curropt,\currval,\CurrentOption,%
  \currentoption,\ifcpt@inpox,\ifcpt@optf,\ifcpt@igopt}\cpt@optdepth
}
\robust@def*\remove@curr@option#1{%
  \cptexpandargonce{\cpt@killoneelement[,]}{#1}\@unusedoptionlist
}
\BeforeStartOfDocument{%
  \ifdefFT\cpt@pr@cessedoptions{}{%
    \ifcsnullTF\cpt@pr@cessedoptions{}{%
      \ifcsnullTF\@unusedoptionlist{}{%
        \oneDloop@b\cpt@pr@cessedoptions\cpt@tempa{%
          \xifinsetFT{,\cptoxdetok\cpt@tempa,}%
            {,\cptoxdetok\@unusedoptionlist,}{}{%
            \remove@curr@option\cpt@tempa
          }%
        }%
      }%
    }%
  }%
  \globalize\@unusedoptionlist
  \undefcs\cpt@pr@cessedoptions
}
\cptpassunexpanded{%
  \begingroup
  \def\cpt@tempa{\endgroup
    \cptglet\cpt@kernel@DeclareOption\DeclareOption
    \cptglet\cpt@kernel@ProcessOptions\ProcessOptions
    \cptglet\cpt@kernel@ExecuteOptions\ExecuteOptions
    \gdef\DeclareOption{\cpt@olddxtrue\XDeclareOption}%
    \gdef\ProcessOptions{\cpt@olddxtrue\XProcessOptions}%
    \gdef\ExecuteOptions{\cpt@olddxtrue\XExecuteOptions}%
    \AtEndOfPackage{%
      \ifcpt@usepox\else
        \def\documentclass{%
          \let\documentclass\@twoclasseserror
          \if@compatibility\else
            \def\usepackage{%
              \cptglet\DeclareOption\cpt@kernel@DeclareOption
              \cptglet\ProcessOptions\cpt@kernel@ProcessOptions
              \cptglet\ExecuteOptions\cpt@kernel@ExecuteOptions
              \cpt@olddxfalse
              \RequirePackage
            }%
          \fi
          \@fileswithoptions\@clsextension
        }%
      \fi
    }%
  }%
  \ifx\cpt@documentclass\cpt@undefined
    \expandafter\cpt@tempa\else\expandafter\endgroup\fi
}
\XDeclareBooleanOption{verbose}[true](cpt@){}
\XDeclareBiBooleanOptions{draft,final}[true](mp@){}{}
\XDeclareBooleanOption{usepox}[true](cpt@){%
  \ifcpt@usepox
    \AtEndOfPackage{%
      \gdef\DeclareOption{\cpt@olddxtrue\XDeclareOption}%
      \gdef\ProcessOptions{\cpt@olddxtrue\XProcessOptions}%
      \gdef\ExecuteOptions{\cpt@olddxtrue\XExecuteOptions}%
    }%
  \fi
}
\XDeclareOption*{\cpt@warn{Unknown option '\CurrentOption' ignored}}
\XExecuteOptions{verbose=false,usepox=true}
\XProcessOptions*

\cptpopcatcodes
\cptrestorecatcodes
\declarefutureletset[fl@]{lbracket,star,rquote}

\endinput

%% End of file catoptions.sty %%
