%%
%% This is file `xskak-keys.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% xskak-src.dtx  (with options: `xskak-keys')
%% 
%% xskak: a package to parse and print chess games
%% Copyright 2006-2015 Ulrike Fischer (chess@nililand.de)
%% -------------------------------------------
%% 
%% This file can be redistributed and/or modified under the terms of
%% the LaTeX Project Public License distributed from CTAN archives in
%% the directory macros/latex/base/lppl.txt; either version 1 of the
%% License, or (at your option) any later version.
%% 
%% For error reports see documentation.
\ProvidesFile{xskak-keys.sty}[2015/01/02 version v1.4 key definitions for xskak.sty]
%%$Date: 2011/03/17 16:54:07 $$Version: 041ab49ae0e2 $

%%%%%%%%%%%%%%%%%%%%%
%%%% Keys
%%%%%%%%%%%%%%%%%%%%%
%% \newchessgame: fam: new
\define@key[UFXS]{new}{id}[\xskak@val@defaultid]{\xdef\xskak@val@gameid{#1}}

\define@key[UFXS]{new}{movenr}{\xdef\xskak@val@movenr{#1}}

\define@key[UFXS]{new}{player}{\xdef\xskak@val@player{#1}}

\define@key[UFXS]{new}{moveid}[\xskak@val@defaultmovenr\xskak@val@defaultplayer]{%
 \edef\@tempa{#1}%
 \xskak@split@moveid{\@tempa}%
 \global\let\xskak@val@movenr\xskak@temp@movenr
 \global\let\xskak@val@player\xskak@temp@player}

\define@key[UFXS]{new}{newvar}[\xskak@val@gameid]{%
 \xdef\xskak@val@refgameid{#1}%
 \xdef\xskak@val@movenr{\csname Xskak#1lastmovenr\endcsname}%
 \xdef\xskak@val@player{\csname Xskak#1lastplayer\endcsname}}%

\define@key[UFXS]{new}{reftag}{%
 \xdef\xskak@val@currenttag{#1}}

\define@key[UFXS]{new}{refid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refpastmovenr}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@movenr{\csname xskak@tag@#1@refpastmovenr\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refnextmovenr}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@movenr{\csname xskak@tag@#1@refnextmovenr\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refpastplayer}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@movenr{\csname xskak@tag@#1@refpastmovenr\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refnextplayer}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@player{\csname xskak@tag@#1@refnextplayer\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refpastmoveid}{%
  \ifcsname xskak@tag@#1@refid\endcsname
   \UFXS@new@moveid{%
    \csname xskak@tag@#1@refpastmovenr\endcsname
    \csname xskak@tag@#1@refpastplayer\endcsname}%
  \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refnextmoveid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi
 \UFXS@new@moveid{%
  \csname xskak@tag@#1@refnextmovenr\endcsname
  \csname xskak@tag@#1@refnextplayer\endcsname}}

\define@key[UFXS]{new}{refpast}{%
 \ifcsname xskak@tag@#1@refid\endcsname
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi
 \UFXS@new@refpastmoveid{#1}%
 \UFXS@new@refid{#1}}

\define@key[UFXS]{new}{refnext}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@refnextmoveid{#1}%
  \UFXS@new@refid{#1}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

%% \xskakset: fam set
\define@key[UFXS]{set}{id}[\xskak@val@defaultid]{\UFXS@new@id{#1}}

\define@key[UFXS]{set}{movenr}{\UFXS@new@moveid{#1}}

\define@key[UFXS]{set}{player}{\UFXS@new@player{#1}}

\define@key[UFXS]{set}{moveid}[\xskak@val@defaultmovenr\xskak@val@defaultplayer]{%
 \UFXS@new@moveid{#1}}%

\define@key[UFXS]{set}{stepmoveid}[1]{%
  \count@=#1\relax
   \ifthenelse{\the\count@>0}
     {\whiledo{\the\count@>0}%
       {\xskak@do@getnextmoveid{\xskak@val@movenr}{\xskak@val@player}%
        \advance\count@ by -1%
        \global\let\xskak@val@movenr\xskak@temp@movenr
        \global\let\xskak@val@player\xskak@temp@player}%
     }%
     {\ifthenelse{\the\count@=0}%
       {}%
       {\whiledo{\the\count@<0}%
        {\xskak@do@getpreviousmoveid{\xskak@val@movenr}{\xskak@val@player}%
         \advance\count@ by 1%
         \global\let\xskak@val@movenr\xskak@temp@movenr
         \global\let\xskak@val@player\xskak@temp@player}%
         \ifthenelse{\the\count@<1}%
          {\PackageWarning{xskak}{Move number below 1!}{}}%
          {}}}}

\define@key[UFXS]{set}{lastmoveid}[\xskak@val@gameid]{%
  \ifcsname Xskak#1initfen\endcsname
   \xdef\xskak@val@gameid{#1}%
  \else\PackageError{xskak}{Game with the id #1 doesn't exist.}{}%
  \fi
  \xdef\xskak@val@movenr{\csname Xskak\xskak@val@gameid lastmovenr\endcsname}%
  \xdef\xskak@val@player{\csname Xskak\xskak@val@gameid lastplayer\endcsname}}%

\define@key[UFXS]{set}{defaultmoveid}{%
 \edef\@tempa{#1}\xskak@split@moveid{\@tempa}%
 %\xdef\xskak@val@movedefaultid{#1}%
 \xdef\xskak@val@defaultmovenr{\xskak@temp@movenr}%
 \xdef\xskak@val@defaultplayer{\xskak@temp@player}}

\define@key[UFXS]{set}{defaultmovenr}{%
 \xdef\xskak@val@defaultmovenr{#1}}

\define@key[UFXS]{set}{defaultplayer}{%
 \xdef\xskak@val@defaultplayer{#1}}

\define@key[UFXS]{set}{defaultid}{\gdef\xskak@val@defaultid{#1}}

\define@key[UFXS]{set}{defaultfen}{\gdef\xskak@val@defaultfen{#1}}

\define@key[UFXS]{set}{tag}{%
 \ifcsname xskak@tag@#1@refid\endcsname
   \PackageWarning{xskak}{Overwrite tag name #1}{}%
 \fi
 \expandafter\xdef
  \csname xskak@tag@#1@refid\endcsname{\xskak@val@gameid}%
 \ifnum\the\c@move=0
   \PackageWarning{xskak}{You haven't started a game yet. I won't set a tag!}{}%
 \else
  \expandafter\xdef
   \csname xskak@tag@#1@refnextmovenr\endcsname{\the\c@move}%
  \expandafter\xdef
   \csname xskak@tag@#1@refnextplayer\endcsname{\WhiteToMove{w}{b}}%
  \expandafter\xdef
   \csname xskak@tag@#1@refpastplayer\endcsname{\WhiteToMove{b}{w}}%
  \expandafter\xdef
   \csname xskak@tag@#1@refnextmoveid\endcsname{\the\c@move\WhiteToMove{w}{b}}%
  \WhiteToMove
   {\expandafter\xdef
    \csname xskak@tag@#1@refpastmovenr\endcsname{\the\numexpr\the\c@move-1\relax}}
   {\expandafter\xdef
    \csname xskak@tag@#1@refpastmovenr\endcsname{\the\c@move}}
  \expandafter\xdef
   \csname xskak@tag@#1@refpastmoveid\endcsname{%
   \csname xskak@tag@#1@refpastmovenr\endcsname
   \csname xskak@tag@#1@refpastplayer\endcsname}%
 \fi
  }

\define@key[UFXS]{set}{reftag}{%
 \UFXS@new@reftag{#1}}

\define@key[UFXS]{set}{refid}{%
 \UFXS@new@refid{#1}}

\define@key[UFXS]{set}{refpastmovenr}{%
 \UFXS@new@refpastmovenr{#1}}

\define@key[UFXS]{set}{refnextmovenr}{%
 \UFXS@new@refnextmovenr{#1}}

\define@key[UFXS]{set}{refpastplayer}{%
  \UFXS@new@refpastplayer{#1}}

\define@key[UFXS]{set}{refnextplayer}{%
  \UFXS@new@refnextplayer{#1}}

\define@key[UFXS]{set}{refpastmoveid}{%
   \UFXS@new@refpastmoveid{#1}}

\define@key[UFXS]{set}{refnextmoveid}{%
  \UFXS@new@refnextmoveid{#1}}

\define@key[UFXS]{set}{refpast}{%
  \UFXS@new@refpast{#1}}

\define@key[UFXS]{set}{refnext}{%
  \UFXS@new@refnext{#1}}

\define@key[UFXS]{set}{style}{%
 \ifcsname xskak@style@#1@1@item\endcsname
  \def\xskak@val@stylename{#1}%
  \def\mainlinestyle{%
   \xskak@use@varstyle{\xskak@val@curlevel}%
   \xskak@do@splitlevel{\xskak@val@curlevel}%
   \ifnum\xskak@temp@levelnumber=0\relax
   \else
    \csname xskak@style@#1@\xskak@temp@levelnumber @xfont\endcsname
   \fi
   \csname xskak@style@#1@\xskak@val@curlevel @font\endcsname}%
  \let\variationstyle\mainlinestyle
 \else
  \PackageError{xskak}{Style #1 doesn't exist!}{}
 \fi}

\define@key[UFXS]{set}{gstyle}{%
 \ifcsname xskak@style@#1@1@item\endcsname
  \xdef\xskak@val@stylename{#1}%
  \gdef\mainlinestyle{%
   \xskak@use@varstyle{\xskak@val@curlevel}%
   \xskak@do@splitlevel{\xskak@val@curlevel}%
   \ifnum\xskak@temp@levelnumber=0\relax
   \else
    \csname xskak@style@#1@\xskak@temp@levelnumber @xfont\endcsname
   \fi
   \csname xskak@style@#1@\xskak@val@curlevel @font\endcsname}%
  \global\let\variationstyle\mainlinestyle
 \else
  \PackageError{xskak}{Style #1 doesn't exist!}{}
 \fi}

\define@key[UFXS]{set}{level}{%
 \edef\xskak@val@curlevel{#1}}%

\define@key[UFXS]{set}{glevel}{%
 \xdef\xskak@val@curlevel{#1}}%

\define@key[UFXS]{set}{invar}[]{%
 \ifxskakpdfmatch
  \xskak@do@splitlevel{\xskak@val@curlevel}%
  \ifnum\xskak@temp@levelnumber=0\relax
   \PackageWarning{xskak}{key invar ignored}{}%
  \else
   \edef\xskak@val@curlevel{%
          \xskak@temp@levelprefix
          \the\numexpr\xskak@temp@levelnumber+1\relax
          \xskak@temp@levelpostfix}%
  \fi
 \else
 %% no pdfmatch. Will give an error if the level is not a number
   \edef\xskak@val@curlevel{%
          \the\numexpr\xskak@val@curlevel+1\relax}%
 \fi}

\define@key[UFXS]{set}{ginvar}[]{%
 \ifxskakpdfmatch
  \xskak@do@splitlevel{\xskak@val@curlevel}%
  \ifnum\xskak@temp@levelnumber=0\relax
   \PackageWarning{xskak}{key ginvar ignored}{}%
  \else
   \xdef\xskak@val@curlevel{%
          \xskak@temp@levelprefix
          \the\numexpr\xskak@temp@levelnumber+1\relax
          \xskak@temp@levelpostfix}%
  \fi
 \else
 %% no pdfmatch. Will give an error if the level is not a number
   \xdef\xskak@val@curlevel{%
          \the\numexpr\xskak@val@curlevel+1\relax}%
 \fi}

\define@key[UFXS]{set}{outvar}[]{%
 \ifxskakpdfmatch
  \xskak@do@splitlevel{\xskak@val@curlevel}%
   \ifnum\xskak@temp@levelnumber=0\relax
    \PackageWarning{xskak}{key outvar ignored}{}%
   \else
     \ifnum\xskak@temp@levelnumber=1\relax
      \PackageWarning{xskak}{Level has already  value 1}{}%
     \else
       \edef\xskak@val@curlevel{%
          \xskak@temp@levelprefix
          \the\numexpr\xskak@temp@levelnumber-1\relax
          \xskak@temp@levelpostfix}%
     \fi
  \fi
 \else
   \ifnum\xskak@val@curlevel=1\relax
     \PackageWarning{xskak}{Level has already  value 1}{}%
   \else
     \edef\xskak@val@curlevel{%
          \the\numexpr\xskak@val@curlevel-1}%
   \fi
 \fi}

\define@key[UFXS]{set}{goutvar}[]{%
 \ifxskakpdfmatch
  \xskak@do@splitlevel{\xskak@val@curlevel}%
   \ifnum\xskak@temp@levelnumber=0\relax
    \PackageWarning{xskak}{key goutvar ignored}{}%
   \else
     \ifnum\xskak@temp@levelnumber=1\relax
      \PackageWarning{xskak}{Level has already  value 1}{}%
     \else
       \xdef\xskak@val@curlevel{%
          \xskak@temp@levelprefix
          \the\numexpr\xskak@temp@levelnumber-1\relax
          \xskak@temp@levelpostfix}%
     \fi
  \fi
 \else
   \ifnum\xskak@val@curlevel=1\relax
     \PackageWarning{xskak}{Level has already  value 1}{}%
   \else
     \xdef\xskak@val@curlevel{%
          \the\numexpr\xskak@val@curlevel-1}%
   \fi
 \fi}

%% \resumechessgame: fam res
\define@key[UFXS]{res}{id}{\UFXS@new@id{#1}}

\define@key[UFXS]{res}{movenr}{\def\xskak@temp@movenr{#1}}

\define@key[UFXS]{res}{player}{\def\xskak@temp@player{#1}}

\define@key[UFXS]{res}{moveid}{\edef\@tempa{#1}\xskak@split@moveid{\@tempa}}

\define@key[UFXS]{res}{newvar}[\xskak@val@gameid]{%
 \xdef\xskak@val@refgameid{#1}%
 \xdef\xskak@val@gameid{#1}%
 \def\xskak@temp@movenr{\csname Xskak\xskak@val@gameid lastmovenr\endcsname}%
 \def\xskak@temp@player{\csname Xskak\xskak@val@gameid lastplayer\endcsname}}%

\define@key[UFXS]{res}{reftag}{%
 \UFXS@new@reftag{#1}}

\define@key[UFXS]{res}{refid}{%
 \UFXS@new@refid{#1}}

\define@key[UFXS]{res}{refpastmovenr}{%
 \UFXS@new@refpastmovenr{#1}}

\define@key[UFXS]{res}{refnextmovenr}{%
 \UFXS@new@refnextmovenr{#1}}

\define@key[UFXS]{res}{refpastplayer}{%
  \UFXS@new@refpastplayer{#1}}

\define@key[UFXS]{res}{refnextplayer}{%
  \UFXS@new@refnextplayer{#1}}

\define@key[UFXS]{res}{refpastmoveid}{%
   \UFXS@new@refpastmoveid{#1}}

\define@key[UFXS]{res}{refnextmoveid}{%
  \UFXS@new@refnextmoveid{#1}}

\define@key[UFXS]{res}{refpast}{%
  \UFXS@new@refpast{#1}}

\define@key[UFXS]{res}{refnext}{%
  \UFXS@new@refnext{#1}}

%% pgn-keys are defined during definition.

%%% xskakexportgames
\define@key[UFXS]{export}{file}{\edef\xskak@val@exportfile{#1.xsk}}
\define@key[UFXS]{export}{games}{\edef\xskak@val@exportgames{#1}}

%%% xskakloop
\define@key[UFXS]{loop}{id}{\UFXS@new@id{#1}}

\define@key[UFXS]{loop}{reftag}{%
 \UFXS@new@reftag{#1}}

\define@key[UFXS]{loop}{refid}{%
 \UFXS@new@refid{#1}}

\define@key[UFXS]{loop}{initmoveid}{%
 \xskak@split@moveid{#1}%
 \global\let\xskak@val@movenr\xskak@temp@movenr
 \global\let\xskak@val@player\xskak@temp@player
 }
\define@key[UFXS]{loop}{initmovenr}{%
 \xdef\xskak@val@movenr{#1}}

\define@key[UFXS]{loop}{initplayer}{%
 \xdef\xskak@val@player{#1}}

\define@key[UFXS]{loop}{stopmoveid}{%
 \xskak@split@moveid{#1}%
 \global\let\xskak@val@stopmovenr\xskak@temp@movenr
 \global\let\xskak@val@stopplayer\xskak@temp@player
 }
\define@key[UFXS]{loop}{stopmovenr}{%
 \xdef\xskak@val@stopmovenr{#1}}

\define@key[UFXS]{loop}{stopplayer}{%
 \xdef\xskak@val@stopplayer{#1}}

\define@key[UFXS]{loop}{step}{\xdef\xskak@val@loopstep{#1}}

\define@boolkey[UFXS]{loop}{showlast}[true]{}

%%
%% style items.

%% keys
\define@key[UFXS]{styleitem}{whiteopen}{%
 \expandafter\gdef\csname\xskak@temp@name whiteopen\endcsname{#1}}
\define@key[UFXS]{styleitem}{blackopen}{%
 \expandafter\gdef\csname\xskak@temp@name blackopen\endcsname{#1}}
\define@key[UFXS]{styleitem}{opencommands}{%
 \expandafter\gdef\csname\xskak@temp@name opencommands\endcsname{#1}}
\define@key[UFXS]{styleitem}{closecommands}{%
 \expandafter\gdef\csname\xskak@temp@name closecommands\endcsname{#1}}
\define@key[UFXS]{styleitem}{beforenumber}{%
 \expandafter\gdef\csname\xskak@temp@name beforenumber\endcsname{#1}}
\define@key[UFXS]{styleitem}{beforewhite}{%
 \expandafter\gdef\csname\xskak@temp@name beforewhite\endcsname{#1}}
\define@key[UFXS]{styleitem}{afterwhite}{%
 \expandafter\gdef\csname\xskak@temp@name afterwhite\endcsname{#1}}
\define@key[UFXS]{styleitem}{beforeblack}{%
 \expandafter\gdef\csname\xskak@temp@name beforeblack\endcsname{#1}}
\define@key[UFXS]{styleitem}{afterblack}{%
 \expandafter\gdef\csname\xskak@temp@name afterblack\endcsname{#1}}
\define@key[UFXS]{styleitem}{beforecomment}{%
 \expandafter\gdef\csname\xskak@temp@name xskak@beforecomment\endcsname{#1}}
\define@key[UFXS]{styleitem}{beforeNAG}{%
 \expandafter\gdef\csname\xskak@temp@name xskak@beforeNAG\endcsname{#1}}

\define@key[UFXS]{styleiteminit}{template}{% from #1 to current style. Make sure to have set temp@name correctly!
 \xskak@do@copystyleitem{xskak@styleitem@#1@}{\xskak@temp@name}}

%% style

\define@key[UFXS]{style}{level}[1]{%
  \def\xskak@val@curlevel{#1}}

\define@key[UFXS]{style}{font}{%
 \expandafter\gdef\csname\xskak@temp@name\xskak@val@curlevel @font\endcsname{#1}}

\define@key[UFXS]{style}{styleitem}{%
 \ifcsname xskak@styleitem@#1@whiteopen\endcsname
  \expandafter\xdef
   \csname\xskak@temp@name\xskak@val@curlevel @item\endcsname{#1}%
 \else
  \PackageError{xskak}{style item #1 doesn't exist!}{}%
 \fi}

\define@key[UFXS]{style}{xfont}{%
 \xskak@do@splitlevel{\xskak@val@curlevel}%
 \ifnum\xskak@temp@levelnumber=0\relax
  \PackageWarning{xskak}{key xfont ignored (no number found)}{}%
 \else
  \expandafter\gdef\csname\xskak@temp@name\xskak@temp@levelnumber @xfont\endcsname{#1}%
 \fi}

%% printing
%% style and level for all printing commands

\define@key[UFXS]{print}{style}{%
 \UFXS@set@style{#1}}

\define@key[UFXS]{print}{gstyle}{%
 \UFXS@set@gstyle{#1}}

\define@key[UFXS]{print}{level}{%
 \edef\xskak@val@curlevel{#1}}%

\define@key[UFXS]{print}{glevel}{%
 \xdef\xskak@val@curlevel{#1}}%

\define@key[UFXS]{print}{invar}[]{%
  \UFXS@set@invar{#1}}

\define@key[UFXS]{print}{outvar}[]{%
 \UFXS@set@outvar{#1}}

%% keys only for \printchessgame
\define@key[UFXS]{xprint}{id}{\def\xskak@val@gameid{#1}}
\define@key[UFXS]{xprint}{initmoveid}{%
 \xskak@split@moveid{#1}%
 \let\xskak@val@movenr\xskak@temp@movenr
 \let\xskak@val@player\xskak@temp@player
 }
\define@key[UFXS]{xprint}{initmovenr}{%
 \def\xskak@val@movenr{#1}}

\define@key[UFXS]{xprint}{initplayer}{%
 \def\xskak@val@player{#1}}

\define@key[UFXS]{xprint}{stopmoveid}{%
 \xskak@split@moveid{#1}%
 \let\xskak@val@stopmovenr\xskak@temp@movenr
 \let\xskak@val@stopplayer\xskak@temp@player
 }
\define@key[UFXS]{xprint}{stopmovenr}{%
 \def\xskak@val@stopmovenr{#1}}

\define@key[UFXS]{xprint}{stopplayer}{%
 \def\xskak@val@stopplayer{#1}}

\define@key[UFXS]{xprint}{reftag}{%
 \UFXS@new@reftag{#1}}

\define@key[UFXS]{xprint}{refid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@print@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

%% new keys for chessboard. Move to chessboard.sty??
%% empty keys to avoid errors:

\define@key[UFCB]{locfill}{tag}{}%
\define@key[UFCB]{locfill}{ref}{}%
\define@key[UFCB]{locfill}{defaultid}{}%
\define@key[UFCB]{locfill}{defaultmoveid}{}%
\define@key[UFCB]{locfill}{defaultfen}{}%

%% real keys (should also be defined in fam glofill):
\define@key[UFCB]{locfill}{id}[\xskak@val@defaultid]{%
 \ifcsname Xskak#1initfen\endcsname
   \edef\xskak@val@gameid{#1}%
 \else
  \PackageError{xskak}{Game with the id #1 doesn't exist.}{}%
 \fi}%

\define@key[UFCB]{glofill}{id}[\xskak@val@defaultid]{%
    \board@do@l@addto@macro\board@val@savedkeylist{,id=#1}}%

\define@key[UFCB]{locfill}{moveid}{%
 \edef\@tempa{#1}\xskak@split@moveid{\@tempa}%
 \let\xskak@val@movenr\xskak@temp@movenr
 \let\xskak@val@player\xskak@temp@player}%

\define@key[UFCB]{glofill}{moveid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,moveid=#1}}%

\define@key[UFCB]{locfill}{stepmoveid}[1]{%
  \count@=#1\relax
   \ifthenelse{\the\count@>0}
     {\whiledo{\the\count@>0}%
       {\xskak@do@getnextmoveid{\xskak@val@movenr}{\xskak@val@player}%
        \advance\count@ by -1%
        \let\xskak@val@movenr\xskak@temp@movenr
        \let\xskak@val@player\xskak@temp@player}%
     }%
     {\ifthenelse{\the\count@=0}%
       {}%
       {\whiledo{\the\count@<0}%
        {\xskak@do@getpreviousmoveid{\xskak@val@movenr}{\xskak@val@player}%
         \advance\count@ by 1%
         \let\xskak@val@movenr\xskak@temp@movenr
         \let\xskak@val@player\xskak@temp@player}%
         \ifthenelse{\the\count@<1}%
          {\PackageWarning{xskak}{Move number below 1!}{}}%
          {}}}}

\define@key[UFCB]{glofill}{stepmoveid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,stepmoveid=#1}}%

\define@key[UFCB]{locfill}{player}{\def\xskak@val@player{#1}}%

\define@key[UFCB]{glofill}{player}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,player=#1}}%

\define@key[UFCB]{locfill}{movenr}{\def\xskak@val@movenr{#1}}%

\define@key[UFCB]{glofill}{movenr}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,movenr=#1}}%

\define@key[UFCB]{locfill}{newvar}[\xskak@val@refgameid]{%
 \UFCB@locfill@setfen{%
  \csname Xskak.#1.%
    \csname Xskak#1lastmovenr\endcsname.%
    \csname Xskak#1lastplayer\endcsname.%
    pastfen\endcsname}%
 }%

\define@key[UFCB]{glofill}{newvar}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,newvar=#1}}%

\define@key[UFCB]{locfill}{reftag}{%
 \edef\xskak@val@currenttag{#1}}

\define@key[UFCB]{glofill}{reftag}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,reftag=#1}}%

\define@key[UFCB]{locfill}{lastmoveid}[\xskak@val@gameid]{%
 \ifcsname Xskak#1initfen\endcsname
  \edef\xskak@val@gameid{#1}%
 \else
  \PackageError{xskak}{Game with the id #1 doesn't exist.}{}%
 \fi
 \edef\xskak@val@movenr{\csname Xskak#1lastmovenr\endcsname}%
 \edef\xskak@val@player{\csname Xskak#1lastplayer\endcsname}%
 }%

\define@key[UFCB]{glofill}{lastmoveid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,lastmoveid=#1}}%

\define@key[UFCB]{locfill}{refid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refid=#1}}%

\define@key[UFCB]{locfill}{refpastmovenr}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@movenr{\csname xskak@tag@#1@refpastmovenr\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refpastmovenr}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refpastmovenr=#1}}%

\define@key[UFCB]{locfill}{refnextmovenr}{%
 \ifcsname xskak@tag@#1@refid\endcsname
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi
 \UFCB@locfill@movenr{\csname xskak@tag@#1@refnextmovenr\endcsname}}

\define@key[UFCB]{glofill}{refnextmovenr}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refnextmovenr=#1}}%

\define@key[UFCB]{locfill}{refpastplayer}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@player{\csname xskak@tag@#1@refpastplayer\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refpastplayer}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refpastplayer=#1}}%

\define@key[UFCB]{locfill}{refnextplayer}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@player{\csname xskak@tag@#1@refnextplayer\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refnextplayer}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refnextplayer=#1}}%

\define@key[UFCB]{locfill}{refpastmoveid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@moveid{\csname xskak@tag@#1@refpastmoveid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refpastmoveid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refpastmoveid=#1}}%

\define@key[UFCB]{locfill}{refnextmoveid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@moveid{\csname xskak@tag@#1@refnextmoveid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refnextmoveid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refnextmoveid=#1}}%

\define@key[UFCB]{locfill}{refpast}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@movenr{\csname xskak@tag@#1@refpastmovenr\endcsname}%
  \UFCB@locfill@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refpast}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refpast=#1}}%

\define@key[UFCB]{locfill}{refnext}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@movenr{\csname xskak@tag@#1@refnextmovenr\endcsname}%
  \UFCB@locfill@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refnext}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refnext=#1}}%

\define@key[UFCB]{locfill}{refpast}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@movenr{\csname xskak@tag@#1@refpastmovenr\endcsname}%
  \UFCB@locfill@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refpast}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refpast=#1}}%

\define@key[UFCB]{locfill}{reffen}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@addfen{%
  \csname
   Xskak.%
   \csname xskak@tag@#1@refid\endcsname.%
   \csname xskak@tag@#1@refnextmovenr\endcsname.%
   \csname xskak@tag@#1@refnextplayer\endcsname.%
   pastfen%
  \endcsname}
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{reffen}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,reffen=#1}}%

%% currently not described. Perhaps delete. Perhaps change name to adapt to ref-keys?
\define@key[UFCB]{locfill}{setgame}[\xskak@val@gameid]{%
 \ifcsname Xskak#1initfen\endcsname
  \edef\xskak@val@gameid{#1}%
 \else
  \PackageError{xskak}{Game with the id #1 doesn't exist.}{}%
 \fi
 \edef\board@temp@curfen{\csname Xskak#1lastfen\endcsname}%
 \board@do@setsinglekeys*[UFCB]{locfill}{language=english, setfen=\board@temp@curfen, language=\board@val@savelang}}%

\define@key[UFCB]{glofill}{setgame}[\xskak@val@gameid]{%
    \board@do@l@addto@macro\board@val@savedkeylist{,showgame=#1}}%

%% currently not described. Perhaps delete. Perhaps change name to adapt to ref-keys?
\define@key[UFCB]{locfill}{addgame}[\xskak@val@gameid]{%
 \ifcsname Xskak#1initfen\endcsname
   \edef\xskak@val@gameid{#1}%
 \else\PackageError{xskak}{Game with the id #1 doesn't exist.}{}%
 \fi
 \edef\board@temp@curfen{\csname Xskak#1lastfen\endcsname}%
 \board@do@setsinglekeys*[UFCB]{locfill}{language=english, addfen=\board@temp@curfen, language=\board@val@savelang}}%

\define@key[UFCB]{glofill}{addgame}[\xskak@val@gameid]{%
    \board@do@l@addto@macro\board@val@savedkeylist{,showgame=#1}}%

\endinput
%%
%% End of file `xskak-keys.sty'.
