// File: /workspace/github_cpp_makefile_star2_O1/jliesch[P]ofxget/pugixml/pugixml.cpp
// Function: pugi::impl::(anonymous namespace)::xpath_parser::parse_step(pugi::impl::(anonymous namespace)::xpath_ast_node*)
xpath_ast_node* parse_step(xpath_ast_node* set)
		{
			if (set && set->rettype() != xpath_type_node_set)
				return error("Step has to be applied to node set");

			bool axis_specified = false;
			axis_t axis = axis_child; // implied child axis

			if (_lexer.current() == lex_axis_attribute)
			{
				axis = axis_attribute;
				axis_specified = true;

				_lexer.next();
			}
			else if (_lexer.current() == lex_dot)
			{
				_lexer.next();

				if (_lexer.current() == lex_open_square_brace)
					return error("Predicates are not allowed after an abbreviated step");

				return alloc_node(ast_step, set, axis_self, nodetest_type_node, 0);
			}
			else if (_lexer.current() == lex_double_dot)
			{
				_lexer.next();

				if (_lexer.current() == lex_open_square_brace)
					return error("Predicates are not allowed after an abbreviated step");

				return alloc_node(ast_step, set, axis_parent, nodetest_type_node, 0);
			}

			nodetest_t nt_type = nodetest_none;
			xpath_lexer_string nt_name;

			if (_lexer.current() == lex_string)
			{
				// node name test
				nt_name = _lexer.contents();
				_lexer.next();

				// was it an axis name?
				if (_lexer.current() == lex_double_colon)
				{
					// parse axis name
					if (axis_specified)
						return error("Two axis specifiers in one step");

					axis = parse_axis_name(nt_name, axis_specified);

					if (!axis_specified)
						return error("Unknown axis");

					// read actual node test
					_lexer.next();

					if (_lexer.current() == lex_multiply)
					{
						nt_type = nodetest_all;
						nt_name = xpath_lexer_string();
						_lexer.next();
					}
					else if (_lexer.current() == lex_string)
					{
						nt_name = _lexer.contents();
						_lexer.next();
					}
					else
					{
						return error("Unrecognized node test");
					}
				}

				if (nt_type == nodetest_none)
				{
					// node type test or processing-instruction
					if (_lexer.current() == lex_open_brace)
					{
						_lexer.next();

						if (_lexer.current() == lex_close_brace)
						{
							_lexer.next();

							nt_type = parse_node_test_type(nt_name);

							if (nt_type == nodetest_none)
								return error("Unrecognized node type");

							nt_name = xpath_lexer_string();
						}
						else if (nt_name == PUGIXML_TEXT("processing-instruction"))
						{
							if (_lexer.current() != lex_quoted_string)
								return error("Only literals are allowed as arguments to processing-instruction()");

							nt_type = nodetest_pi;
							nt_name = _lexer.contents();
							_lexer.next();

							if (_lexer.current() != lex_close_brace)
								return error("Unmatched brace near processing-instruction()");
							_lexer.next();
						}
						else
						{
							return error("Unmatched brace near node type test");
						}
					}
					// QName or NCName:*
					else
					{
						if (nt_name.end - nt_name.begin > 2 && nt_name.end[-2] == ':' && nt_name.end[-1] == '*') // NCName:*
						{
							nt_name.end--; // erase *

							nt_type = nodetest_all_in_namespace;
						}
						else
						{
							nt_type = nodetest_name;
						}
					}
				}
			}
			else if (_lexer.current() == lex_multiply)
			{
				nt_type = nodetest_all;
				_lexer.next();
			}
			else
			{
				return error("Unrecognized node test");
			}

			const char_t* nt_name_copy = alloc_string(nt_name);
			if (!nt_name_copy) return 0;

			xpath_ast_node* n = alloc_node(ast_step, set, axis, nt_type, nt_name_copy);
			if (!n) return 0;

			xpath_ast_node* last = 0;

			while (_lexer.current() == lex_open_square_brace)
			{
				_lexer.next();

				xpath_ast_node* expr = parse_expression();
				if (!expr) return 0;

				xpath_ast_node* pred = alloc_node(ast_predicate, 0, expr, predicate_default);
				if (!pred) return 0;

				if (_lexer.current() != lex_close_square_brace)
					return error("Expected ']' to match an opening '['");
				_lexer.next();

				if (last) last->set_next(pred);
				else n->set_right(pred);

				last = pred;
			}

			return n;
		}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
movq %rsi, %r15
movq %rdi, %rbx
testq %rsi, %rsi
je 0x2c664
cmpb $0x1, 0x1(%r15)
jne 0x2c68c
leaq 0x8(%rbx), %r14
movl 0x28(%rbx), %eax
cmpl $0x18, %eax
je 0x2c6cb
cmpl $0x17, %eax
je 0x2c699
cmpl $0x16, %eax
jne 0x2c6f0
movq %r14, %rdi
callq 0x2af4e
movl $0x2, %ecx
movb $0x1, %bpl
jmp 0x2c6f7
movq 0x40(%rbx), %rax
leaq 0x8621(%rip), %rcx      # 0x34cb8
jmp 0x2c6e8
movq %r14, %rdi
callq 0x2af4e
cmpl $0x12, 0x28(%rbx)
je 0x2c6dd
movq (%rbx), %rdi
movl $0x28, %esi
callq 0x2c52c
testq %rax, %rax
je 0x2cbe1
movq %rax, %r12
movl $0x20c0138, (%rax)      # imm = 0x20C0138
jmp 0x2c786
movq %r14, %rdi
callq 0x2af4e
cmpl $0x12, 0x28(%rbx)
jne 0x2c767
movq 0x40(%rbx), %rax
leaq 0x8995(%rip), %rcx      # 0x3507d
movq %rcx, (%rax)
jmp 0x2cbd5
movl $0x3, %ecx
xorl %ebp, %ebp
xorps %xmm0, %xmm0
movaps %xmm0, (%rsp)
movl 0x28(%rbx), %eax
cmpl $0x9, %eax
movq %r14, 0x18(%rsp)
je 0x2c750
leaq 0x89cd(%rip), %r13      # 0x350df
cmpl $0x14, %eax
jne 0x2cbce
movl %ecx, 0x24(%rsp)
leaq 0x18(%rbx), %r12
movups 0x18(%rbx), %xmm0
movaps %xmm0, (%rsp)
movq 0x18(%rsp), %rdi
callq 0x2af4e
cmpl $0x19, 0x28(%rbx)
jne 0x2c7a2
testb %bpl, %bpl
je 0x2c94e
leaq 0x8967(%rip), %r13      # 0x350b2
jmp 0x2cbce
movl %ecx, 0x24(%rsp)
movq %r14, %rdi
callq 0x2af4e
movl $0x7, %r14d
jmp 0x2c7f7
movq (%rbx), %rdi
movl $0x28, %esi
callq 0x2c52c
testq %rax, %rax
je 0x2cbe1
movq %rax, %r12
movl $0x2090138, (%rax)      # imm = 0x2090138
movq %r15, 0x8(%r12)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%r12)
movq $0x0, 0x20(%r12)
jmp 0x2cbe4
xorl %r13d, %r13d
movb $0x1, %bpl
movq 0x18(%rsp), %r14
testb %bpl, %bpl
je 0x2c7f4
cmpl $0xc, 0x28(%rbx)
jne 0x2c9cb
movq %r14, %rdi
callq 0x2af4e
movl 0x28(%rbx), %ebp
cmpl $0xd, %ebp
jne 0x2ca4a
movq %r14, %rdi
callq 0x2af4e
movq %rsp, %rdi
callq 0x2c3c0
testl %eax, %eax
je 0x2cc17
movl %eax, %r14d
xorps %xmm0, %xmm0
movaps %xmm0, (%rsp)
jmp 0x2c7f7
movl %r13d, %r14d
movq (%rsp), %r12
testq %r12, %r12
je 0x2c832
movq 0x8(%rsp), %rbp
subq %r12, %rbp
movq (%rbx), %rdi
leaq 0x1(%rbp), %rsi
callq 0x2c52c
testq %rax, %rax
je 0x2c83b
movq %rax, %r13
movq %rax, %rdi
movq %r12, %rsi
movq %rbp, %rdx
callq 0x6090
movb $0x0, (%r13,%rbp)
jmp 0x2c83e
leaq 0x48d0(%rip), %r13      # 0x31109
jmp 0x2c83e
xorl %r13d, %r13d
testq %r13, %r13
je 0x2cbe1
movq (%rbx), %rdi
movl $0x28, %esi
callq 0x2c52c
testq %rax, %rax
je 0x2c884
movq %rax, %r12
movw $0x138, (%rax)          # imm = 0x138
movl 0x24(%rsp), %eax
movb %al, 0x2(%r12)
movb %r14b, 0x3(%r12)
movq %r15, 0x8(%r12)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%r12)
movq %r13, 0x20(%r12)
jmp 0x2c887
xorl %r12d, %r12d
movq 0x18(%rsp), %r13
testq %r12, %r12
je 0x2cbe1
xorl %ebp, %ebp
cmpl $0x12, 0x28(%rbx)
jne 0x2cbe4
movq %r13, %rdi
callq 0x2af4e
xorl %r14d, %r14d
movq %rbx, %rdi
xorl %esi, %esi
callq 0x2b264
testq %rax, %rax
je 0x2c8e9
movq %rax, %r13
movq (%rbx), %rdi
movl $0x28, %esi
callq 0x2c52c
testq %rax, %rax
je 0x2c8f0
movq %rax, %r15
movl $0x110, (%rax)          # imm = 0x110
xorl %eax, %eax
movq %rax, 0x8(%r15)
movq %r13, 0x10(%r15)
movq %rax, 0x18(%r15)
jmp 0x2c8f3
movq 0x18(%rsp), %r13
jmp 0x2c940
xorl %r15d, %r15d
movq 0x18(%rsp), %r13
testq %r15, %r15
je 0x2c930
cmpl $0x13, 0x28(%rbx)
jne 0x2c916
movq %r13, %rdi
callq 0x2af4e
testq %rbp, %rbp
je 0x2c935
movq %r15, 0x18(%rbp)
jmp 0x2c93a
movq 0x40(%rbx), %rax
leaq 0x84d2(%rip), %rcx      # 0x34df3
movq %rcx, (%rax)
movq 0x10(%rbx), %rcx
subq 0x30(%rbx), %rcx
movq %rcx, 0x8(%rax)
xorl %r14d, %r14d
jmp 0x2c940
movq %r15, 0x10(%r12)
movb $0x1, %r14b
movq %r15, %rbp
testb %r14b, %r14b
jne 0x2c897
jmp 0x2cbe1
movq (%rsp), %rax
movzbl (%rax), %eax
cmpl $0x6d, %eax
jg 0x2ca0e
addl $-0x61, %eax
cmpl $0x5, %eax
ja 0x2cb8f
leaq 0x61fb(%rip), %rcx      # 0x32b6c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0x8821(%rip), %rsi      # 0x351a2
movq %rsp, %rdi
callq 0x2c4da
xorl %ecx, %ecx
movb $0x1, %bpl
testb %al, %al
jne 0x2cb96
leaq 0x880e(%rip), %rsi      # 0x351ab
movq %rsp, %rdi
callq 0x2c4da
movl $0x1, %ecx
testb %al, %al
jne 0x2cb96
leaq 0x6abe(%rip), %rsi      # 0x33477
movq %rsp, %rdi
callq 0x2c4da
movl $0x2, %ecx
jmp 0x2cb8b
movq 0x8(%rsp), %rax
movq %rax, %rcx
subq (%rsp), %rcx
movl $0x1, %r14d
cmpq $0x3, %rcx
jl 0x2c7f7
cmpb $0x3a, -0x2(%rax)
jne 0x2c7f7
cmpb $0x2a, -0x1(%rax)
jne 0x2c7f7
decq %rax
movq %rax, 0x8(%rsp)
movl $0x8, %r14d
jmp 0x2c7f7
cmpl $0x6e, %eax
je 0x2cb27
cmpl $0x70, %eax
je 0x2cb44
cmpl $0x73, %eax
jne 0x2cb8f
leaq 0x8787(%rip), %rsi      # 0x351b7
movq %rsp, %rdi
callq 0x2c4da
testb %al, %al
je 0x2cb8f
movl $0xc, %ecx
jmp 0x2cb3f
leaq 0x828a(%rip), %rsi      # 0x34cdb
movq %rsp, %rdi
callq 0x2c4da
testb %al, %al
je 0x2ca94
cmpl $0xe, %ebp
jne 0x2cc20
movups (%r12), %xmm0
movaps %xmm0, (%rsp)
movq %r14, %rdi
callq 0x2af4e
cmpl $0xd, 0x28(%rbx)
jne 0x2cc29
movq %r14, %rdi
callq 0x2af4e
movl $0x6, %r14d
jmp 0x2c7f7
leaq 0x86e3(%rip), %r13      # 0x3517e
jmp 0x2cbce
leaq 0x8715(%rip), %rsi      # 0x351bc
movq %rsp, %rdi
callq 0x2c4da
movl $0x4, %ecx
movb $0x1, %bpl
testb %al, %al
jne 0x2cb96
leaq 0x8701(%rip), %rsi      # 0x351c7
movq %rsp, %rdi
callq 0x2c4da
movl $0x5, %ecx
jmp 0x2cb8b
leaq 0x86fb(%rip), %rsi      # 0x351da
movq %rsp, %rdi
callq 0x2c4da
movl $0x6, %ecx
movb $0x1, %bpl
testb %al, %al
jne 0x2cb96
leaq 0x86e6(%rip), %rsi      # 0x351e4
movq %rsp, %rdi
callq 0x2c4da
movl $0x7, %ecx
jmp 0x2cb8b
leaq 0x6b9e(%rip), %rsi      # 0x336b2
movq %rsp, %rdi
callq 0x2c4da
testb %al, %al
je 0x2cb8f
movl $0x3, %ecx
jmp 0x2cb3f
leaq 0x86c8(%rip), %rsi      # 0x351f6
movq %rsp, %rdi
callq 0x2c4da
testb %al, %al
je 0x2cb8f
movl $0x8, %ecx
movb $0x1, %bpl
jmp 0x2cb96
leaq 0x7f47(%rip), %rsi      # 0x34a92
movq %rsp, %rdi
callq 0x2c4da
movl $0x9, %ecx
movb $0x1, %bpl
testb %al, %al
jne 0x2cb96
leaq 0x869a(%rip), %rsi      # 0x35200
movq %rsp, %rdi
callq 0x2c4da
movl $0xa, %ecx
testb %al, %al
jne 0x2cb96
leaq 0x868c(%rip), %rsi      # 0x3520a
movq %rsp, %rdi
callq 0x2c4da
movl $0xb, %ecx
testb %al, %al
jne 0x2cb96
movl $0x3, %ecx
xorl %ebp, %ebp
testb %bpl, %bpl
je 0x2cbc7
movl %ecx, 0x24(%rsp)
movq 0x18(%rsp), %rdi
callq 0x2af4e
movl 0x28(%rbx), %eax
cmpl $0x14, %eax
je 0x2cbf6
cmpl $0x9, %eax
jne 0x2cbce
xorps %xmm0, %xmm0
movaps %xmm0, (%rsp)
movl $0x7, %r13d
xorl %ebp, %ebp
jmp 0x2cc05
leaq 0x8504(%rip), %r13      # 0x350d2
movq 0x40(%rbx), %rax
movq %r13, (%rax)
movq 0x10(%rbx), %rcx
subq 0x30(%rbx), %rcx
movq %rcx, 0x8(%rax)
xorl %r12d, %r12d
movq %r12, %rax
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movups (%r12), %xmm0
movaps %xmm0, (%rsp)
xorl %r13d, %r13d
movb $0x1, %bpl
movq 0x18(%rsp), %r14
movq %r14, %rdi
callq 0x2af4e
jmp 0x2c7ad
leaq 0x84d8(%rip), %r13      # 0x350f6
jmp 0x2cbce
leaq 0x84e6(%rip), %r13      # 0x3510d
jmp 0x2cbce
leaq 0x8520(%rip), %r13      # 0x35150
jmp 0x2cbce