// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: bool exprtk::function_compositor<double>::compile_expression<std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::deque>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::deque<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&, bool)
bool compile_expression(const std::string& name,
                              const std::string& expression,
                              const Sequence<std::string,Allocator>& input_var_list,
                              bool  return_present = false)
      {
         expression_t compiled_expression;
         symbol_table_t local_symbol_table;

         local_symbol_table.load_from(symbol_table_);
         local_symbol_table.add_constants();

         if (load_variables_)
         {
            local_symbol_table.load_variables_from(symbol_table_);
         }

         if (load_vectors_)
         {
            local_symbol_table.load_vectors_from(symbol_table_);
         }

         error_list_.clear();

         if (!valid(name,input_var_list.size()))
         {
            parser_error::type error =
               parser_error::make_error(
                  parser_error::e_parser,
                  lexer::token(),
                  "ERR283 - Function '" + name + "' is an invalid overload",
                  exprtk_error_location);

            error_list_.push_back(error);
            return false;
         }

         if (!forward(name,
                      input_var_list.size(),
                      local_symbol_table,
                      return_present))
            return false;

         compiled_expression.register_symbol_table(local_symbol_table);

         for (std::size_t i = 0; i < auxiliary_symtab_list_.size(); ++i)
         {
            compiled_expression.register_symbol_table((*auxiliary_symtab_list_[i]));
         }

         std::string mod_expression;

         for (std::size_t i = 0; i < input_var_list.size(); ++i)
         {
            mod_expression += " var " + input_var_list[i] + "{};\n";
         }

         if (
              ('{' == details::front(expression)) &&
              ('}' == details::back (expression))
            )
            mod_expression += "~" + expression + ";";
         else
            mod_expression += "~{" + expression + "};";

         if (!parser_.compile(mod_expression,compiled_expression))
         {
            exprtk_debug(("Compositor Error: %s\n", parser_.error().c_str()));
            exprtk_debug(("Compositor modified expression: \n%s\n", mod_expression.c_str()));

            remove(name,input_var_list.size());

            for (std::size_t err_index = 0; err_index < parser_.error_count(); ++err_index)
            {
               error_list_.push_back(parser_.get_error(err_index));
            }

            return false;
         }

         if (!return_present && parser_.dec().return_present())
         {
            remove(name,input_var_list.size());
            return compile_expression(name, expression, input_var_list, true);
         }

         // Make sure every return point has a scalar as its first parameter
         if (parser_.dec().return_present())
         {
            typedef std::vector<std::string> str_list_t;

            str_list_t ret_param_list = parser_.dec().return_param_type_list();

            for (std::size_t i = 0; i < ret_param_list.size(); ++i)
            {
               const std::string& params = ret_param_list[i];

               if (params.empty() || ('T' != params[0]))
               {
                  exprtk_debug(("Compositor Error: Return statement in function '%s' is invalid\n",
                                name.c_str()));

                  remove(name,input_var_list.size());

                  return false;
               }
            }
         }

         expr_map_[name] = compiled_expression;

         exprtk::ifunction<T>& ifunc = (*(fp_map_[input_var_list.size()])[name]);

         if (symbol_table_.add_function(name,ifunc))
            return true;
         else
         {
            exprtk_debug(("Compositor Error: Failed to add function '%s' to symbol table\n",
                          name.c_str()));
            return false;
         }
      }

// Assembly:
subq $0x478, %rsp            # imm = 0x478
movb %r8b, %al
movq %rdi, 0x468(%rsp)
movq %rsi, 0x460(%rsp)
movq %rdx, 0x458(%rsp)
movq %rcx, 0x450(%rsp)
andb $0x1, %al
movb %al, 0x44f(%rsp)
movq 0x468(%rsp), %rax
movq %rax, 0xb0(%rsp)
leaq 0x428(%rsp), %rdi
callq 0x22e450
leaq 0x420(%rsp), %rdi
movl $0x1, %esi
callq 0x22de90
jmp 0x584ad4
movq 0xb0(%rsp), %rsi
leaq 0x420(%rsp), %rdi
callq 0x586520
jmp 0x584aeb
leaq 0x420(%rsp), %rdi
callq 0x22ded0
jmp 0x584afa
movq 0xb0(%rsp), %rax
testb $0x1, 0x9e0(%rax)
je 0x584b56
movq 0xb0(%rsp), %rsi
leaq 0x420(%rsp), %rdi
callq 0x586bc0
jmp 0x584b22
jmp 0x584b56
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
jmp 0x585710
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
jmp 0x585703
movq 0xb0(%rsp), %rax
testb $0x1, 0x9e1(%rax)
je 0x584b80
movq 0xb0(%rsp), %rsi
leaq 0x420(%rsp), %rdi
callq 0x586cf0
jmp 0x584b7e
jmp 0x584b80
movq 0xb0(%rsp), %rdi
addq $0x990, %rdi            # imm = 0x990
callq 0x3718e0
movq 0x460(%rsp), %rax
movq %rax, 0xa0(%rsp)
movq 0x450(%rsp), %rdi
callq 0x565500
movq 0xb0(%rsp), %rdi
movq 0xa0(%rsp), %rsi
movq %rax, 0x408(%rsp)
leaq 0x408(%rsp), %rdx
callq 0x586e70
movb %al, 0xaf(%rsp)
jmp 0x584bdf
movb 0xaf(%rsp), %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x584bf1
jmp 0x584df9
leaq 0x330(%rsp), %rdi
callq 0x251250
jmp 0x584c00
movq 0x460(%rsp), %rdx
leaq 0x49c61(%rip), %rsi     # 0x5ce870
leaq 0x2f0(%rsp), %rdi
callq 0x3784f0
jmp 0x584c1e
leaq 0x49c5f(%rip), %rdx     # 0x5ce884
leaq 0x310(%rsp), %rdi
leaq 0x2f0(%rsp), %rsi
callq 0x29dc30
jmp 0x584c3c
leaq 0x2b0(%rsp), %rdi
movl $0xaa3b, %esi           # imm = 0xAA3B
callq 0x371f20
jmp 0x584c50
leaq 0x222bc(%rip), %rsi     # 0x5a6f13
leaq 0x2d0(%rsp), %rdi
leaq 0x2b0(%rsp), %rdx
callq 0x29dd70
jmp 0x584c6e
leaq 0x360(%rsp), %rdi
movl $0x9, %esi
leaq 0x330(%rsp), %rdx
leaq 0x310(%rsp), %rcx
leaq 0x2d0(%rsp), %r8
callq 0x3741e0
jmp 0x584c9a
leaq 0x2d0(%rsp), %rdi
callq 0x11b838
leaq 0x2b0(%rsp), %rdi
callq 0x11b838
leaq 0x310(%rsp), %rdi
callq 0x11b838
leaq 0x2f0(%rsp), %rdi
callq 0x11b838
leaq 0x330(%rsp), %rdi
callq 0x2512e0
movq 0xb0(%rsp), %rdi
addq $0x990, %rdi            # imm = 0x990
leaq 0x360(%rsp), %rsi
callq 0x374d00
jmp 0x584cf9
movb $0x0, 0x477(%rsp)
movl $0x1, 0x2ac(%rsp)
leaq 0x360(%rsp), %rdi
callq 0x371330
jmp 0x5856d8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
jmp 0x584dc1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
jmp 0x584db4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
jmp 0x584da7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
jmp 0x584d9a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
leaq 0x2d0(%rsp), %rdi
callq 0x11b838
leaq 0x2b0(%rsp), %rdi
callq 0x11b838
leaq 0x310(%rsp), %rdi
callq 0x11b838
leaq 0x2f0(%rsp), %rdi
callq 0x11b838
leaq 0x330(%rsp), %rdi
callq 0x2512e0
jmp 0x585703
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
leaq 0x360(%rsp), %rdi
callq 0x371330
jmp 0x585703
movq 0x460(%rsp), %rax
movq %rax, 0x90(%rsp)
movq 0x450(%rsp), %rdi
callq 0x565500
movq 0xb0(%rsp), %rdi
movq 0x90(%rsp), %rsi
movq %rax, 0x2a0(%rsp)
movzbl 0x44f(%rsp), %r8d
andl $0x1, %r8d
leaq 0x2a0(%rsp), %rdx
leaq 0x420(%rsp), %rcx
callq 0x586f40
movb %al, 0x9f(%rsp)
jmp 0x584e59
movb 0x9f(%rsp), %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x584e68
jmp 0x584e80
movb $0x0, 0x477(%rsp)
movl $0x1, 0x2ac(%rsp)
jmp 0x5856d8
leaq 0x428(%rsp), %rdi
leaq 0x420(%rsp), %rsi
callq 0x22e500
jmp 0x584e97
movq $0x0, 0x298(%rsp)
movq 0xb0(%rsp), %rdi
movq 0x298(%rsp), %rax
movq %rax, 0x88(%rsp)
addq $0x978, %rdi            # imm = 0x978
callq 0x587930
movq %rax, %rcx
movq 0x88(%rsp), %rax
cmpq %rcx, %rax
jae 0x584f1d
movq 0xb0(%rsp), %rdi
addq $0x978, %rdi            # imm = 0x978
movq 0x298(%rsp), %rsi
callq 0x587950
movq (%rax), %rsi
leaq 0x428(%rsp), %rdi
callq 0x22e500
jmp 0x584f05
jmp 0x584f07
movq 0x298(%rsp), %rax
addq $0x1, %rax
movq %rax, 0x298(%rsp)
jmp 0x584ea3
leaq 0x278(%rsp), %rdi
callq 0x11b2b0
movq $0x0, 0x270(%rsp)
movq 0x270(%rsp), %rax
movq %rax, 0x80(%rsp)
movq 0x450(%rsp), %rdi
callq 0x565500
movq %rax, %rcx
movq 0x80(%rsp), %rax
cmpq %rcx, %rax
jae 0x58505f
movq 0x450(%rsp), %rdi
movq 0x270(%rsp), %rsi
callq 0x587970
movq %rax, %rdx
leaq 0x49917(%rip), %rsi     # 0x5ce89d
leaq 0x230(%rsp), %rdi
callq 0x3784f0
jmp 0x584f95
leaq 0x49907(%rip), %rdx     # 0x5ce8a3
leaq 0x250(%rsp), %rdi
leaq 0x230(%rsp), %rsi
callq 0x29dc30
jmp 0x584fb3
leaq 0x278(%rsp), %rdi
leaq 0x250(%rsp), %rsi
callq 0x11b0e0
jmp 0x584fca
leaq 0x250(%rsp), %rdi
callq 0x11b838
leaq 0x230(%rsp), %rdi
callq 0x11b838
movq 0x270(%rsp), %rax
addq $0x1, %rax
movq %rax, 0x270(%rsp)
jmp 0x584f36
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
jmp 0x5856c9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
jmp 0x58504d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
leaq 0x250(%rsp), %rdi
callq 0x11b838
leaq 0x230(%rsp), %rdi
callq 0x11b838
jmp 0x5856c9
movq 0x458(%rsp), %rdi
callq 0x5879a0
movq %rax, 0x78(%rsp)
jmp 0x585073
movq 0x78(%rsp), %rax
movsbl (%rax), %ecx
movl $0x7b, %eax
cmpl %ecx, %eax
jne 0x58516c
movq 0x458(%rsp), %rdi
callq 0x5879c0
movq %rax, 0x70(%rsp)
jmp 0x58509c
movq 0x70(%rsp), %rax
movsbl (%rax), %ecx
movl $0x7d, %eax
cmpl %ecx, %eax
jne 0x58516c
movq 0x458(%rsp), %rdx
leaq 0x22418(%rip), %rsi     # 0x5a74d8
leaq 0x1f0(%rsp), %rdi
callq 0x3784f0
jmp 0x5850cf
leaq 0x3ec17(%rip), %rdx     # 0x5c3ced
leaq 0x210(%rsp), %rdi
leaq 0x1f0(%rsp), %rsi
callq 0x29dc30
jmp 0x5850ed
leaq 0x278(%rsp), %rdi
leaq 0x210(%rsp), %rsi
callq 0x11b0e0
jmp 0x585104
leaq 0x210(%rsp), %rdi
callq 0x11b838
leaq 0x1f0(%rsp), %rdi
callq 0x11b838
jmp 0x585224
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
jmp 0x58515a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
leaq 0x210(%rsp), %rdi
callq 0x11b838
leaq 0x1f0(%rsp), %rdi
callq 0x11b838
jmp 0x5856c9
movq 0x458(%rsp), %rdx
leaq 0x4972d(%rip), %rsi     # 0x5ce8a8
leaq 0x1b0(%rsp), %rdi
callq 0x3784f0
jmp 0x58518a
leaq 0x53f7f(%rip), %rdx     # 0x5d9110
leaq 0x1d0(%rsp), %rdi
leaq 0x1b0(%rsp), %rsi
callq 0x29dc30
jmp 0x5851a8
leaq 0x278(%rsp), %rdi
leaq 0x1d0(%rsp), %rsi
callq 0x11b0e0
jmp 0x5851bf
leaq 0x1d0(%rsp), %rdi
callq 0x11b838
leaq 0x1b0(%rsp), %rdi
callq 0x11b838
jmp 0x585224
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
jmp 0x585212
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
leaq 0x1d0(%rsp), %rdi
callq 0x11b838
leaq 0x1b0(%rsp), %rdi
callq 0x11b838
jmp 0x5856c9
movq 0xb0(%rsp), %rdi
addq $0x8, %rdi
leaq 0x278(%rsp), %rsi
leaq 0x428(%rsp), %rdx
callq 0x22ef80
movb %al, 0x6f(%rsp)
jmp 0x58524b
movb 0x6f(%rsp), %al
testb $0x1, %al
jne 0x585384
jmp 0x585259
movq 0x460(%rsp), %rax
movq %rax, 0x60(%rsp)
movq 0x450(%rsp), %rdi
callq 0x565500
movq 0xb0(%rsp), %rdi
movq 0x60(%rsp), %rsi
movq %rax, 0x1a8(%rsp)
leaq 0x1a8(%rsp), %rdx
callq 0x584900
jmp 0x585297
movq $0x0, 0x1a0(%rsp)
movq 0xb0(%rsp), %rdi
movq 0x1a0(%rsp), %rax
movq %rax, 0x50(%rsp)
addq $0x8, %rdi
callq 0x587a00
movq %rax, 0x58(%rsp)
jmp 0x5852c8
movq 0x50(%rsp), %rax
movq 0x58(%rsp), %rcx
cmpq %rcx, %rax
jae 0x58536c
movq 0xb0(%rsp), %rsi
movq %rsi, %rax
addq $0x990, %rax            # imm = 0x990
movq %rax, 0x48(%rsp)
addq $0x8, %rsi
leaq 0xf8(%rsp), %rdi
leaq 0x1a0(%rsp), %rdx
callq 0x587a50
jmp 0x58530c
movq 0x48(%rsp), %rdi
leaq 0xf8(%rsp), %rsi
callq 0x587a20
jmp 0x585320
leaq 0xf8(%rsp), %rdi
callq 0x371330
movq 0x1a0(%rsp), %rax
addq $0x1, %rax
movq %rax, 0x1a0(%rsp)
jmp 0x5852a3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
leaq 0xf8(%rsp), %rdi
callq 0x371330
jmp 0x5856c9
movb $0x0, 0x477(%rsp)
movl $0x1, 0x2ac(%rsp)
jmp 0x5856ba
testb $0x1, 0x44f(%rsp)
jne 0x58544a
movq 0xb0(%rsp), %rdi
addq $0x8, %rdi
callq 0x5657b0
movq %rax, %rdi
callq 0x587b30
movb %al, 0x47(%rsp)
jmp 0x5853b1
movb 0x47(%rsp), %al
testb $0x1, %al
jne 0x5853be
jmp 0x58544a
movq 0x460(%rsp), %rax
movq %rax, 0x38(%rsp)
movq 0x450(%rsp), %rdi
callq 0x565500
movq 0xb0(%rsp), %rdi
movq 0x38(%rsp), %rsi
movq %rax, 0xf0(%rsp)
leaq 0xf0(%rsp), %rdx
callq 0x584900
jmp 0x5853fc
movq 0xb0(%rsp), %rdi
movq 0x460(%rsp), %rsi
movq 0x458(%rsp), %rdx
movq 0x450(%rsp), %rcx
movl $0x1, %r8d
callq 0x584a70
movb %al, 0x37(%rsp)
jmp 0x58542d
movb 0x37(%rsp), %al
andb $0x1, %al
movb %al, 0x477(%rsp)
movl $0x1, 0x2ac(%rsp)
jmp 0x5856ba
movq 0xb0(%rsp), %rdi
addq $0x8, %rdi
callq 0x5657b0
movq %rax, %rdi
callq 0x587b30
movb %al, 0x36(%rsp)
jmp 0x585469
movb 0x36(%rsp), %al
testb $0x1, %al
jne 0x585476
jmp 0x5855da
movq 0xb0(%rsp), %rdi
addq $0x8, %rdi
callq 0x5657b0
movq %rax, %rsi
leaq 0xd8(%rsp), %rdi
callq 0x587b40
jmp 0x585499
movq $0x0, 0xd0(%rsp)
movq 0xd0(%rsp), %rax
movq %rax, 0x28(%rsp)
leaq 0xd8(%rsp), %rdi
callq 0x51ddd0
movq %rax, %rcx
movq 0x28(%rsp), %rax
cmpq %rcx, %rax
jae 0x5855af
movq 0xd0(%rsp), %rsi
leaq 0xd8(%rsp), %rdi
callq 0x551340
movq %rax, 0xc8(%rsp)
movq 0xc8(%rsp), %rdi
callq 0x11b260
testb $0x1, %al
jne 0x58551b
movq 0xc8(%rsp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x11b770
movsbl (%rax), %ecx
movl $0x54, %eax
cmpl %ecx, %eax
je 0x585594
movq 0x460(%rsp), %rax
movq %rax, 0x20(%rsp)
movq 0x450(%rsp), %rdi
callq 0x565500
movq 0xb0(%rsp), %rdi
movq 0x20(%rsp), %rsi
movq %rax, 0xc0(%rsp)
leaq 0xc0(%rsp), %rdx
callq 0x584900
jmp 0x585559
movb $0x0, 0x477(%rsp)
movl $0x1, 0x2ac(%rsp)
jmp 0x5855ba
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x418(%rsp)
movl %eax, 0x414(%rsp)
leaq 0xd8(%rsp), %rdi
callq 0x371380
jmp 0x5856c9
jmp 0x585596
movq 0xd0(%rsp), %rax
addq $0x1, %rax
movq %rax, 0xd0(%rsp)
jmp 0x5854a5
movl $0x0, 0x2ac(%rsp)
leaq 0xd8(%rsp), %rdi
callq 0x371380
movl 0x2ac(%rsp), %eax
testl %eax, %eax
jne 0x5856ba
jmp 0x5855d8
jmp 0x5855da
movq 0xb0(%rsp), %rdi
addq $0x930, %rdi            # imm = 0x930
movq 0x460(%rsp), %rsi
callq 0x585c50
movq %rax, 0x18(%rsp)
jmp 0x5855fd
movq 0x18(%rsp), %rdi
leaq 0x428(%rsp), %rsi
callq 0x587b70
jmp 0x585611
movq 0xb0(%rsp), %rax
addq $0x960, %rax            # imm = 0x960
movq %rax, 0x8(%rsp)
movq 0x450(%rsp), %rdi
callq 0x565500
movq 0x8(%rsp), %rdi
movq %rax, %rsi
callq 0x585730
movq %rax, %rdi
movq 0x460(%rsp), %rsi
callq 0x585750
movq %rax, 0x10(%rsp)
jmp 0x585655
movq 0xb0(%rsp), %rdi
movq 0x10(%rsp), %rax
movq (%rax), %rax
movq %rax, 0xb8(%rsp)
movq 0x460(%rsp), %rsi
movq 0xb8(%rsp), %rdx
callq 0x22e3b0
movb %al, 0x7(%rsp)
jmp 0x585688
movb 0x7(%rsp), %al
testb $0x1, %al
jne 0x585692
jmp 0x5856a7
movb $0x1, 0x477(%rsp)
movl $0x1, 0x2ac(%rsp)
jmp 0x5856ba
movb $0x0, 0x477(%rsp)
movl $0x1, 0x2ac(%rsp)
leaq 0x278(%rsp), %rdi
callq 0x11b838
jmp 0x5856d8
leaq 0x278(%rsp), %rdi
callq 0x11b838
jmp 0x585703
leaq 0x420(%rsp), %rdi
callq 0x22fc60
leaq 0x428(%rsp), %rdi
callq 0x22fb60
movb 0x477(%rsp), %al
andb $0x1, %al
addq $0x478, %rsp            # imm = 0x478
retq
leaq 0x420(%rsp), %rdi
callq 0x22fc60
leaq 0x428(%rsp), %rdi
callq 0x22fb60
movq 0x418(%rsp), %rdi
callq 0x11b4e0
nopw (%rax,%rax)