% Copyright 2013 by Mark Wibrow
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.



\edef\tikz@math@at@catcode{\the\catcode`\@}
\catcode`\@=11

\def\tikz@math@gobblespaces#1{\pgfutil@ifnextchar x{#1}{#1}}

\def\tikz@math@meaning@macro{macro}
\def\tikz@math@meaning@dimen{dimen}
\def\tikz@math@meaning@count{count}
\def\tikz@math@meaning@null{null}

\def\tikz@math@getmeaning#1{\expandafter\tikz@math@@getmeaning\meaning#1\tikz@math@getmeaning@stop}

\def\tikz@math@@getmeaning#1#2#3#4#5\tikz@math@getmeaning@stop{%
	\if#1u% undefined
		\let\tikz@math@meaning=\tikz@math@meaning@macro%
	\else%
		\if#1m%
			\let\tikz@math@meaning=\tikz@math@meaning@macro%
		\else%
			\if#2d%
				\let\tikz@math@meaning=\tikz@math@meaning@dimen%
			\else%
				\if#2c%
					\let\tikz@math@meaning=\tikz@math@meaning@count%
				\else%
					\if#3k% A skip. Treat like a dimen.
						\let\tikz@math@meaning=\tikz@math@meaning@dimen%
					\else%
						\let\tikz@math@meaning=\tikz@math@meaning@null%
					\fi%
				\fi%
			\fi%
		\fi%
	\fi%
}

\def\tikz@math@firstoftwo#1#2{#1}
\def\tikz@math@secondoftwo#1#2{#2}


\def\tikz@math@getvarstring#1{%
	\begingroup%
		\escapechar=-1\relax%
		\expandafter\tikz@math@@getvarstring\string#1\tikz@math}

\def\tikz@math@@getvarstring#1\tikz@math#2{%
	\endgroup%
	\def#2{#1}%		
}

\long\def\tikz@math@collecttosemicolon@other#1#2;{%
	\def\tikz@math@collected{#2}#1}
\def\tikz@math@semicolon@other{;}%

{\catcode`\;=13
\long\gdef\tikz@math@collecttosemicolon@active#1#2;{%
	\def\tikz@math@collected{#2}#1}
\gdef\tikz@math@semicolon@active{;}%
}


\def\tikz@math@setvartype#1#2{%
	\expandafter\let\csname tikz@math@var@vartype@\string#1\endcsname=#2%
}


\def\tikz@math@getvartype#1#2{%
	\def\tikz@math@marshal{\let#1=}%
	\expandafter\tikz@math@marshal\csname 
	tikz@math@var@vartype@\string#2\endcsname%
}



\def\tikz@math@ifvarcoordinate#1{%
	\expandafter\ifx\csname 
	tikz@math@var@vartype@\string#1\endcsname\tikz@math@keyword@coordinate%
		\let\tikz@math@next=\tikz@math@firstoftwo%
	\else%
		\let\tikz@math@next=\tikz@math@secondoftwo%
	\fi%
	\tikz@math@next%
}

\def\tikz@math@ifvarinteger#1{%
	\expandafter\ifx\csname 
	tikz@math@var@vartype@\string#1\endcsname\tikz@math@keyword@integer%
		\let\tikz@math@next=\tikz@math@firstoftwo%
	\else%
		\let\tikz@math@next=\tikz@math@secondoftwo%
	\fi%
	\tikz@math@next%
}


\def\tikz@math@setvarindexed#1{%
	\expandafter\let\csname 
	tikz@math@var@subtype@\string#1\endcsname=\tikz@math@subtype@indexed%
}

\def\tikz@math@clearvarindexed#1{%
	\expandafter\let\csname tikz@math@var@subtype@\string#1\endcsname=\relax%
}

\def\tikz@math@ifvarindexed#1{%
	\expandafter\ifx\csname tikz@math@var@subtype@\string#1\endcsname\relax%
		\let\tikz@math@next=\tikz@math@secondoftwo%
	\else%
		\let\tikz@math@next=\tikz@math@firstoftwo%
	\fi%
	\tikz@math@next%
}

\def\tikz@math@stop{@}

\let\tikz@math@parse@hook@before=\pgfutil@empty
\let\tikz@math@parse@hook@after=\pgfutil@empty

\def\tikz@math{%
	\ifnum\catcode`\;=13\relax%
		\let\tikz@math@semicolon=\tikz@math@semicolon@active%
		\let\tikz@math@collecttosemicolon=\tikz@math@collecttosemicolon@active%
	\else%
		\let\tikz@math@semicolon=\tikz@math@semicolon@other%
		\let\tikz@math@collecttosemicolon=\tikz@math@collecttosemicolon@other%
	\fi%
	\tikz@math@parse@hook@before%
	\tikz@@math}




\long\def\tikz@@math#1{%
	\def\tikz@math@marshal{\tikz@math@parse#1}%
	\expandafter\expandafter\expandafter\tikz@math@marshal\expandafter\tikz@math@stop\tikz@math@semicolon}
	
\def\tikz@math@parse{\pgfutil@ifnextchar\bgroup\tikz@math@@parse@bgroup\tikz@math@@parse@nobgroup}


\def\tikz@math@@parse@bgroup{%
	\tikz@math@collecttosemicolon{%
		% MW: Don't know how reliable this test is.
		\ifx\pgf@selectfontorig\tikz@math@undefined%
			\begingroup\tikz@math@collected\endgroup%
		\else%
			\begingroup\csname nullfont\endcsname\tikz@math@collected\endgroup%
		\fi\tikz@math@parse}}
	


\def\tikz@math@@parse@nobgroup{\tikz@math@collecttosemicolon{\tikz@math@@parse@@nobgroup}}

\def\tikz@math@@parse@@nobgroup{%
	\let\tikz@math@tmp=\tikz@math@collected%
	\ifx\tikz@math@tmp\tikz@math@stop%
		\def\tikz@math@next{\expandafter\tikz@math@parse@finish\tikz@math@semicolon}%
	\else%
		\def\tikz@math@next{\expandafter\expandafter\expandafter\tikz@math@parse@keyword@check\expandafter\tikz@math@tmp\tikz@math@semicolon}%
	\fi%
	\tikz@math@next%
}

\def\tikz@math@parse@finish{%
	\tikz@math@collecttosemicolon{\tikz@math@parse@hook@after}%
}



\newif\iftikz@math@let
\def\tikz@math@parse@keyword@check#1{%
	\tikz@math@letfalse%
	\tikz@math@getmeaning{#1}%
	\ifx\tikz@math@meaning\tikz@math@meaning@null%
		\let\tikz@math@next=\tikz@math@parse@keyword%
	\else%
		\let\tikz@math@next=\tikz@math@parse@nokeyword%
	\fi%
	\tikz@math@next#1}


\def\tikz@math@parse@keyword{%
	\let\tikz@math@parsed@keyword=\pgfutil@empty%
	\futurelet\tikz@math@parse@token\tikz@math@@parse@keyword}

\def\tikz@math@@parse@keyword{%
	\ifx\tikz@math@parse@token\pgfutil@sptoken%
		\let\tikz@math@next=\tikz@math@@@parse@keyword%
	\else%
		\ifx\tikz@math@parse@token(%
			\let\tikz@math@next=\tikz@math@@@parse@keyword%
		\else%
			\ifx\tikz@math@parse@token\bgroup%
				\let\tikz@math@next=\tikz@math@@@parse@keyword%
			\else%
				\let\tikz@math@next=\tikz@math@@@@parse@keyword%
			\fi%
		\fi%
	\fi%
	\tikz@math@next}

\def\tikz@math@error#1{\pgfutil@packageerror{tikz}{tikz math library: #1}{}}

\def\tikz@math@@@parse@keyword{%
		\expandafter\ifx\csname tikz@math@process@keyword@\tikz@math@parsed@keyword\endcsname\relax%
			\expandafter\ifx\csname pgfmath\tikz@math@parsed@keyword\endcsname\relax%
					\tikz@math@error{Unknown function or keyword '\tikz@math@parsed@keyword'}%
			\else%
				\def\tikz@math@next{\tikz@math@collecttosemicolon{\tikz@math@function@noassign}}%
			\fi%
		\else%
			\expandafter\def\expandafter\tikz@math@next\expandafter{\csname tikz@math@process@keyword@\tikz@math@parsed@keyword\endcsname}%
		\fi%
	\tikz@math@next}
	
\def\tikz@math@@@@parse@keyword#1{%
	\edef\tikz@math@parsed@keyword{\tikz@math@parsed@keyword#1}%
	\futurelet\tikz@math@parse@token\tikz@math@@parse@keyword%
}

\def\tikz@math@function@noassign{%
	\pgfmathparse{\tikz@math@parsed@keyword\tikz@math@collected}%
	\tikz@math@parse%
}
		
	
	

\def\tikz@math@process@keyword@count{\tikz@math@collecttosemicolon{\tikz@math@process@keyword@@count}}
\def\tikz@math@process@keyword@@count{%
\def\tikz@math@assign@register{\csname newcount\endcsname}%
\expandafter\tikz@math@gobblespaces\expandafter\tikz@math@process@registers\tikz@math@collected,@,}

\def\tikz@math@process@keyword@length{\tikz@math@collecttosemicolon{\tikz@math@process@keyword@@length}}
\def\tikz@math@process@keyword@@length{%
\def\tikz@math@assign@register{\csname newdimen\endcsname}%
\show\tikz@math@collected
\expandafter\tikz@math@gobblespaces\expandafter\tikz@math@process@registers\tikz@math@collected,@,}


\def\tikz@math@process@registers#1#2,{%
	\def\tikz@math@var{#1}%	
	\ifx\tikz@math@var\tikz@math@stop%
		\let\tikz@math@next=\tikz@math@parse%
	\else%
		\tikz@math@assign@register#1\relax%
		\let\tikz@math@next=\tikz@math@process@registers%
	\fi%
	\tikz@math@gobblespaces\tikz@math@next%
}


\def\tikz@math@process@keyword@if#1then{%
	\def\tikz@math@if@condition{#1}%
	\tikz@math@gobblespaces\tikz@math@parse@if@iftrue%
}
\def\tikz@math@parse@if@iftrue#1{%
	\def\tikz@math@if@trueaction{#1}%
	\pgfutil@ifnextchar e{\tikz@math@parse@else}{\tikz@math@if@doif}}

\def\tikz@math@parse@else else{\tikz@math@gobblespaces\tikz@math@if@doifelse}

\def\tikz@math@if@doif{\tikz@math@collecttosemicolon{\tikz@math@if@@doif}}

\def\tikz@math@if@@doif{%
	\pgfmathparse{\tikz@math@if@condition}%
	\ifdim\pgfmathresult pt=0pt\relax%
	\else%
		\expandafter\tikz@math\expandafter{\tikz@math@if@trueaction}%
	\fi%
	\tikz@math@parse%
}
\def\tikz@math@if@doifelse{\tikz@math@collecttosemicolon{\tikz@math@if@@doifelse}}
\def\tikz@math@if@@doifelse{%
	\pgfmathparse{\tikz@math@if@condition}%
	\let\tikz@math@if@falseaction=\tikz@math@collected%
	\ifdim\pgfmathresult pt=0pt\relax%
		\expandafter\tikz@math\expandafter{\tikz@math@if@falseaction}%
	\else%
		\expandafter\tikz@math\expandafter{\tikz@math@if@trueaction}%
	\fi%
	\tikz@math@parse%
}
\def\tikz@math@process@keyword@let{%
	\tikz@math@lettrue%
	\tikz@math@gobblespaces\tikz@math@parse@nokeyword%
}


\def\tikz@math@parse@nokeyword#1{%
	\def\tikz@math@var{#1}%
	\tikz@math@getvarstring{#1}\tikz@math@varstring%
	\let\tikz@math@vartype=\pgfutil@empty%
	\ifx\tikz@math@var\tikz@math@stop%
		\let\tikz@math@next=\tikz@math@parse@finish%
	\else%
         \ifx\tikz@math@semicolon\tikz@math@var%
        	\let\tikz@math@next=\tikz@math@parse%
			\else%
				\let\tikz@math@next=\tikz@math@parse@index@check%
			\fi%
	\fi%
	\tikz@math@next}

\def\tikz@math@parse@index@check{%
	\pgfutil@ifnextchar={\tikz@math@parse@noindex}{\tikz@math@parse@index}}
	
\def\tikz@math@parse@noindex{%
	\expandafter\tikz@math@clearvarindexed\tikz@math@var%
	\let\tikz@math@current@index=\pgfutil@empty%
	\tikz@math@parse@afterindex%
}

\def\tikz@math@parse@index#1{%
	\def\tikz@math@tmp{#1}%
	\expandafter\tikz@math@setvarindexed\tikz@math@var% {}
	\edef\tikz@math@current@index{#1}%
	\tikz@math@parse@afterindex%
}
\def\tikz@math@parse@afterindex#1={\tikz@math@gobblespaces\tikz@math@parse@assignment}%

\def\tikz@math@parse@assignment{\tikz@math@collecttosemicolon{\tikz@math@parse@@assignment}}
\def\tikz@math@parse@@assignment{%
	\expandafter\expandafter\expandafter\tikz@math@doassignment\expandafter\expandafter\expandafter%
		{\expandafter\tikz@math@var\expandafter}\expandafter{\tikz@math@collected}%
	\tikz@math@parse%
}

\def\tikz@math@dollar@char{$}
\def\tikz@math@dollar@char{$}% For annoying syntax highlighters

\def\tikz@math@doassignment#1#2{%
	\tikz@math@ifvarcoordinate{#1}{%
		\def\tikz@math@var{#1}% Unfortunately, we must do this again.
		\tikz@math@getvarstring{#1}\tikz@math@varstring% And this
		\expandafter\pgfutil@in@\tikz@math@dollar@char{#2}%
		\edef\tikz@math@expression{#2}%
		\ifpgfutil@in@%
			\expandafter\tikz@scan@one@point\expandafter\tikz@math@assign@coordinate\tikz@math@expression%
		\else%
			\expandafter\ifx\csname tikz@library@calc@loaded\endcsname\relax%
				\expandafter\tikz@scan@one@point\expandafter\tikz@math@assign@coordinate\tikz@math@expression%
			\else%
				\expandafter\tikz@scan@one@point\expandafter\tikz@math@assign@coordinate\expandafter%
				(\expandafter$\tikz@math@expression$)%
			\fi%
		\fi%
	}{%
		\iftikz@math@let% Not really a let
			\ifx\tikz@math@current@index\pgfutil@empty%
				\edef#1{#2}%
			\else%
				\edef\tikz@math@tmp{#2}%
				\expandafter\expandafter\expandafter\tikz@math@assign@index\expandafter\expandafter\expandafter%
					{\expandafter\tikz@math@varstring\expandafter}\expandafter{\tikz@math@tmp}%
			\fi%
			\tikz@math@letfalse%
		\else%
			\ifx\tikz@math@current@index\pgfutil@empty%
				\tikz@math@getmeaning{#1}%
				\ifx\tikz@math@meaning\tikz@math@meaning@dimen%
					\pgfmathsetlength{#1}{#2}%
					\let\tikz@math@last@assigned@value=\pgfmathresult%
				\else%
					\ifx\tikz@math@meaning\tikz@math@meaning@count%
						\pgfmathsetcount{#1}{#2}%
						\let\tikz@math@last@assigned@value=\pgfmathresult%
					\else%
						\tikz@math@ifvarinteger{#1}{\pgfmathparse{int(#2)}}{\pgfmathparse{#2}}%
						\let\tikz@math@last@assigned@value=\pgfmathresult%
						\let#1=\pgfmathresult%
					\fi%
				\fi%
			\else%
				\tikz@math@ifvarinteger{#1}{\pgfmathparse{int(#2)}}{\pgfmathparse{#2}}%
				\expandafter\tikz@math@assign@index\expandafter{\tikz@math@varstring}\pgfmathresult%
				\let\tikz@math@last@assigned@value=\pgfmathresult%
			\fi%
		\fi%
	}%
}



\def\tikz@math@assign@index#1#2{%
	\expandafter\def\csname#1\endcsname##1{\csname 
	tikz@math@var@indexed@#1@##1\endcsname}%
	\expandafter\edef\csname 
	tikz@math@var@indexed@#1@\tikz@math@current@index\endcsname{#2}\relax%
}



\def\tikz@math@assign@coordinate#1{%
	\pgf@process{#1}%
	\ifx\tikz@math@current@index\pgfutil@empty%
		\expandafter\edef\csname\tikz@math@varstring\endcsname{\the\pgf@x,\the\pgf@y}%
		\expandafter\edef\csname\tikz@math@varstring x\endcsname{\the\pgf@x}%
		\expandafter\edef\csname\tikz@math@varstring y\endcsname{\the\pgf@y}%
	\else%
		\expandafter\tikz@math@assign@index\expandafter{\tikz@math@varstring}{\the\pgf@x,\the\pgf@y}%
		\expandafter\tikz@math@assign@index\expandafter{\tikz@math@varstring x}{\the\pgf@x}%
		\expandafter\tikz@math@assign@index\expandafter{\tikz@math@varstring y}{\the\pgf@y}%
	\fi%
}



\def\tikz@math@keyword@coordinate{coordinate}
\def\tikz@math@process@keyword@coordinate{%
	\let\tikz@math@vartype=\tikz@math@keyword@coordinate%
	\tikz@math@gobblespaces\tikz@math@process@vartypes%
}

\def\tikz@math@keyword@integer{integer}
\def\tikz@math@process@keyword@integer{%
	\let\tikz@math@vartype=\tikz@math@keyword@integer%
	\tikz@math@gobblespaces\tikz@math@process@vartypes%
}
\def\tikz@math@process@keyword@int{%
	\tikz@math@process@keyword@integer%
}

\def\tikz@math@keyword@real{real}
\def\tikz@math@process@keyword@real{%
	\let\tikz@math@vartype=\tikz@math@keyword@real%
	\tikz@math@gobblespaces\tikz@math@process@vartypes%
}

\def\tikz@math@process@keyword@point{\tikz@math@process@keyword@coordinate}


\def\tikz@math@process@vartypes{\tikz@math@collecttosemicolon{\tikz@math@process@@vartypes}}

\def\tikz@math@process@@vartypes{%
	\expandafter\tikz@math@@process@vartypes\tikz@math@collected,@,\tikz@math%
}

\def\tikz@math@@process@vartypes#1#2,{%
	\def\tikz@math@var{#1}%
	\tikz@math@getvarstring{#1}\tikz@math@varstring%
	\ifx\tikz@math@var\tikz@math@stop%
		\let\tikz@math@next=\tikz@math@@@process@vartypes%
	\else%
		\expandafter\tikz@math@setvartype\tikz@math@var\tikz@math@vartype%
		\def\tikz@math@next{\tikz@math@gobblespaces\tikz@math@@process@vartypes}%
	\fi%
	\tikz@math@next%
}

\def\tikz@math@process@keyword@print{\tikz@math@collecttosemicolon{\tikz@math@process@keyword@@print}}
\def\tikz@math@process@keyword@@print{%
	\begingroup\tikz@math@collected\endgroup\tikz@math@parse%
}

\def\tikz@math@@@process@vartypes#1\tikz@math{%
	\tikz@math@parse%
}

\newcount\tikz@math@for@depth

\def\tikz@math@for@namedef#1{\expandafter\def\csname tikz@math@for@def@#1@\the\tikz@math@for@depth\endcsname}
\def\tikz@math@for@nameedef#1{\expandafter\edef\csname tikz@math@for@def@#1@\the\tikz@math@for@depth\endcsname}
\def\tikz@math@for@namelet#1{\expandafter\let\csname tikz@math@for@def@#1@\the\tikz@math@for@depth\endcsname}

\def\tikz@math@for@namegetvalue#1#2{%
	\def\tikz@math@marshal{\let#2=}%
	\expandafter\tikz@math@marshal\csname tikz@math@for@def@#1@\the\tikz@math@for@depth\endcsname}

\def\tikz@math@process@keyword@for{%
	\tikz@math@for%
}

\def\tikz@math@for@external{%
	\ifnum\catcode`\;=13\relax%
		\let\tikz@math@semicolon=\tikz@math@semicolon@active%
		\let\tikz@math@collecttosemicolon=\tikz@math@collecttosemicolon@active%
	\else%
		\let\tikz@math@semicolon=\tikz@math@semicolon@other%
		\let\tikz@math@collecttosemicolon=\tikz@math@collecttosemicolon@other%
	\fi	
	\advance\tikz@math@for@depth by1\relax%
	\tikz@math@for@namedef{execute}{\tikz@math@for@external@execute}%
	\tikz@math@for@namedef{finished}{\relax}%
	\tikz@math@gobblespaces\tikz@math@for@parsevar}

\def\tikz@math@for@external@execute#1{#1}

\def\tikz@math@for{%
	\advance\tikz@math@for@depth by1\relax%
	\tikz@math@for@namedef{execute}{\tikz@math}%
	\tikz@math@for@namedef{finished}{\tikz@math@parse}%
	\tikz@math@gobblespaces\tikz@math@for@parsevar}


\def\tikz@math@for@parsevar#1{%
	\tikz@math@for@namedef{var}{#1}%
	\tikz@math@for@parsein}

\def\tikz@math@getindex#1{%
	\tikz@math@@getindex#1\tikz@math@getindex\tikz@math@@getindex%
}

\def\tikz@math@@getindex#1#2\tikz@math@@getindex{#1}

\def\tikz@math@for@parsein#1in{%
	\def\tikz@math@tmp{#1}%
	\ifx\tikz@math@tmp\pgfutil@empty%
		\tikz@math@for@namedef{index}{}%
	\else%
		\tikz@math@for@nameedef{index}{\tikz@math@getindex{#1}}%
	\fi%
	\tikz@math@gobblespaces\tikz@math@for@parselist%
}


\long\def\tikz@math@for@parselist#1{%
	\edef\tikz@math@for@list{#1}%
	\tikz@math@collecttosemicolon{\tikz@math@for@parseaction}}

\def\tikz@math@for@parseaction{%
	\tikz@math@for@namedef{prevvalue}{}%
	\tikz@math@for@namedef{prevprevvalue}{}%
	\tikz@math@for@namelet{action}=\tikz@math@collected%
	\expandafter\tikz@math@for@scan\tikz@math@for@list,\tikz@math,\tikz@@math%
}

\def\tikz@math@token{\tikz@math}


\def\tikz@math@for@scan#1,{%
	\def\tikz@math@for@value{#1}%
	\ifx\tikz@math@for@value\tikz@math@token%
		\let\tikz@math@next=\tikz@math@for@scan@end%
	\else%
		\ifx\tikz@math@for@value\pgfutil@empty%
			\let\tikz@math@next=\tikz@math@for@scan@end%
		\else%
			\pgfutil@in@{...}{#1}%
			\ifpgfutil@in@%
				\let\tikz@math@next=\tikz@math@for@scan@dots%
			\else%
				\tikz@math@for@namegetvalue{var}{\tikz@math@var}%
				\tikz@math@for@namegetvalue{index}{\tikz@math@current@index}%
				\tikz@math@for@namegetvalue{action}{\tikz@math@action}%
				\expandafter\tikz@math@getvarstring\expandafter{\tikz@math@var}\tikz@math@varstring%
				\expandafter\tikz@math@doassignment\expandafter{\tikz@math@var}{#1}%
				\tikz@math@for@namelet{value}=\tikz@math@last@assigned@value%
				\tikz@math@for@namegetvalue{execute}{\tikz@math@execute}%
				\expandafter\tikz@math@execute\expandafter{\tikz@math@action}%
				\tikz@math@for@namegetvalue{prevvalue}{\tikz@math@prevvalue}%
				\tikz@math@for@namelet{prevprevvalue}=\tikz@math@prevvalue%
				\tikz@math@for@namegetvalue{value}{\tikz@math@value}%
				\tikz@math@for@namelet{prevvalue}=\tikz@math@value%
				\let\tikz@math@next=\tikz@math@for@scan%
			\fi%
		\fi%
	\fi%
	\tikz@math@next%	
}

\newdimen\tikz@math@dimen

\def\tikz@math@for@scan@dots#1,{%
	\pgfmathparse{#1}\let\tikz@math@value=\pgfmathresult%
	\tikz@math@for@nameedef{endvalue}{\tikz@math@value}%
	\tikz@math@for@namegetvalue{prevvalue}{\tikz@math@prevvalue}%
	\tikz@math@for@namegetvalue{prevprevvalue}{\tikz@math@prevprevvalue}%
	\tikz@math@dimen=\tikz@math@prevvalue pt\relax%
	\ifx\tikz@math@prevprevvalue\pgfutil@empty%
		\ifdim\tikz@math@prevvalue pt<\tikz@math@value pt\relax%%
			\def\tikz@math@step{1pt}%
		\else%
			\def\tikz@math@step{-1pt}%
		\fi%
	\else%	
		\tikz@math@dimen=\tikz@math@prevvalue pt\relax%
		\advance\tikz@math@dimen by-\tikz@math@prevprevvalue pt\relax%
		\edef\tikz@math@step{\the\tikz@math@dimen}%
	\fi%
	\ifdim\tikz@math@step<0pt\relax%
		\tikz@math@for@namedef{comparitor}{<}%
	\else%
		\tikz@math@for@namedef{comparitor}{>}%
	\fi%
	\tikz@math@for@nameedef{step}{\tikz@math@step}%
	\tikz@math@for@doloop%
}

\def\tikz@math@for@doloop{%
	\tikz@math@for@namegetvalue{prevvalue}{\tikz@math@prevvalue}%
	\tikz@math@for@namegetvalue{step}{\tikz@math@step}%
	\tikz@math@for@namegetvalue{comparitor}{\tikz@math@comparitor}%
	\tikz@math@for@namegetvalue{endvalue}{\tikz@math@endvalue}%
	\tikz@math@dimen=\tikz@math@prevvalue pt\relax%
	\advance\tikz@math@dimen by\tikz@math@step\relax%
	\ifdim\tikz@math@dimen\tikz@math@comparitor\tikz@math@endvalue pt\relax%
		\let\tikz@math@next=\tikz@math@for@endloop%
	\else%
		\tikz@math@for@nameedef{value}{\pgfmath@tonumber{\tikz@math@dimen}}%
		\tikz@math@for@namegetvalue{var}{\tikz@math@var}%
		\expandafter\tikz@math@getvarstring\expandafter{\tikz@math@var}\tikz@math@varstring%
		\tikz@math@for@namegetvalue{index}{\tikz@math@current@index}%
		\tikz@math@for@namegetvalue{action}{\tikz@math@action}%
		\tikz@math@for@namegetvalue{value}{\tikz@math@value}%
		\expandafter\expandafter\expandafter\tikz@math@doassignment\expandafter\expandafter\expandafter%
			{\expandafter\tikz@math@var\expandafter}\expandafter{\tikz@math@value}%
		\tikz@math@for@namegetvalue{execute}{\tikz@math@execute}%
		\expandafter\tikz@math@execute\expandafter{\tikz@math@action}%
		\tikz@math@for@namegetvalue{prevvalue}{\tikz@math@prevvalue}%
		\tikz@math@for@namelet{prevprevvalue}=\tikz@math@prevvalue%
		\tikz@math@for@namegetvalue{value}{\tikz@math@value}%
		\tikz@math@for@namelet{prevvalue}=\tikz@math@value%
		\let\tikz@math@next=\tikz@math@for@doloop%
	\fi%
	\tikz@math@next%
}

\def\tikz@math@for@endloop{%
\tikz@math@for@scan}




\def\tikz@math@for@scan@end#1\tikz@@math{%
\tikz@math@for@namegetvalue{finished}{\tikz@math@next}%
\advance\tikz@math@for@depth by-1\relax%
\tikz@math@next}





\def\tikz@math@process@keyword@return{%
	\tikz@math@collecttosemicolon{\pgfmathparse{\tikz@math@collected}\tikz@math@parse}}

\def\tikz@math@process@keyword@function{\tikz@math@collecttosemicolon{\tikz@math@process@keyword@@function}}
\def\tikz@math@process@keyword@@function{%
	\let\tikz@math@function@name=\pgfutil@empty%
	\let\tikz@math@function@arguments=\pgfutil@empty%
	\let\tikz@math@function@body=\pgfutil@empty%
	\expandafter\expandafter\expandafter\tikz@math@@declarefunction\expandafter\tikz@math@collected\tikz@math@semicolon%
}

\def\tikz@math@@declarefunction{%
	\pgfutil@ifnextchar\bgroup\tikz@math@@@collectbody\tikz@math@@@declarefunction}


\def\tikz@math@@@declarefunction#1{%
	\if#1(%)
		\let\tikz@math@next=\tikz@math@@@collectarguments%
	\else%
		\expandafter\def\expandafter\tikz@math@function@name\expandafter{\tikz@math@function@name#1}%
		\let\tikz@math@next=\tikz@math@@declarefunction%
	\fi%
	\tikz@math@next%
}
\def\tikz@math@@@collectarguments#1){%
	\def\tikz@math@function@arguments{#1}%
	\tikz@math@@declarefunction%
}

\newtoks\tikz@math@toks
\tikz@math@toks={#}
\edef\tikz@math@char@hash{\the\tikz@math@toks}
\tikz@math@toks={}

\def\tikz@math@@@collectbody{\tikz@math@collecttosemicolon{\tikz@math@@@@collectbody}}

\def\tikz@math@@@@collectbody{%
	\tikz@math@toks={}%
	\c@pgf@counta=0\relax%
	\ifx\tikz@math@function@arguments\pgfutil@empty%
	\else%
		\expandafter\tikz@math@createargumentlist\tikz@math@function@arguments,,%
		\expandafter\tikz@math@addto@toks\expandafter{\tikz@math@collected}%
	\fi%
	\edef\tikz@math@local@temp{%
		\noexpand\pgfmathdeclarefunction{\tikz@math@function@name}{\the\c@pgf@counta}%
		{\noexpand\def\noexpand\return{0}\noexpand\tikz@math{\the\tikz@math@toks}}%
	}%
	\tikz@math@local@temp
	\tikz@math@parse%
}

\def\tikz@math@addto@toks#1{%
	\expandafter\tikz@math@toks\expandafter{\the\tikz@math@toks#1}}	

\def\tikz@math@createargumentlist{%
	\pgfutil@ifnextchar 
	x\tikz@math@@createargumentlist\tikz@math@@createargumentlist}

\def\tikz@math@comma{,}
\def\tikz@math@@createargumentlist#1,{%
	\def\tikz@math@tmp{#1}%
	\ifx\tikz@math@tmp\pgfutil@empty%
		\let\tikz@math@next=\relax%
	\else%
		\advance\c@pgf@counta by1\relax%
		\tikz@math@addto@toks{#1=}%
		\expandafter\expandafter\expandafter\tikz@math@addto@toks\expandafter\expandafter\expandafter%
			{\expandafter\tikz@math@char@hash\the\c@pgf@counta;}%
		\let\tikz@math@next=\tikz@math@createargumentlist%
	\fi%
	\tikz@math@next%
}



\let\tikzmath=\tikz@math
\tikzset{evaluate/.code={\tikz@math{#1}}}
\let\tikzmathfor=\tikz@math@for@external


\catcode`\@=\tikz@math@at@catcode\relax
