// File: Kei18[P]pibt/./src/solver/pps.cpp
// Function: PPS::FEASIBLE(Agent*, std::vector<Node*, std::allocator<Node*>>&, std::vector<Node*, std::allocator<Node*>>&, bool)
RES PPS::FEASIBLE(Agent* c, Nodes &pi, Nodes &T, bool swap) {
  if (pi.size() < 2) return RES::FAIL;  // l.1
  Node* v = pi[1];  // l.2

  if (inArray(c, M)) {
    return RES::FAIL;
  }

  if (reserved(v, M)) {  // l.3
    return RES::PAUSE;  // l.4
  }

  if (inArray(v, L)) {  // l.5, reserved
    return RES::PAUSE;  // l.6
  }

  auto itrA = std::find_if(A.begin(), A.end(),
                           [v] (Agent* a) { return a->getNode() == v; });
  Nodes pi_one, pi_two;
  Agent* a = nullptr;

  if (itrA != A.end() && swap == false) {  // l.10
    a = *itrA;
    if (inS(a)) return RES::FAIL;  // l.11

    pi_one = SHORTEST_PATH(c->getNode(), c->getGoal());  // l.12
    pi_two = SHORTEST_PATH(a->getNode(), a->getGoal());  // l.13

    if (DEPEND(pi_one, pi_two)) {  // l.15
      SETUP_SWAP(c, a);  // l.16 & 17
      return RES::FAIL;  // l.18
    }

  } else if (itrA != A.end() && swap == true) {  // l.19
    a = *itrA;
    if (inS(a)) {  // l.20
      Agent* origin = c;
      if (!H.empty()) origin = H[0];
      if (inS(origin)) {
        if (CHECK_PRIORITY(origin, a) == CHECK::INVALID) {
          return RES::FAIL;  // l.22
        }
      }
    }
  } else if (itrA == A.end()) {
    return RES::SUCCESS;  // l.23
  }

  a = *itrA;
  H.push_back(c);
  return PUSH(a, T, swap);  // l.24, recursive push
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x170, %rsp            # imm = 0x170
movb %r8b, %al
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
andb $0x1, %al
movb %al, -0x29(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x128(%rbp)
movq -0x20(%rbp), %rdi
callq 0x3b0e0
cmpq $0x2, %rax
jae 0x8fe99
movl $0x1, -0x4(%rbp)
jmp 0x90436
movq -0x20(%rbp), %rdi
movl $0x1, %esi
callq 0xda90
movq -0x128(%rbp), %rsi
movq (%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x18(%rbp), %rdi
addq $0xe0, %rsi
callq 0x8f430
testb $0x1, %al
jne 0x8fecb
jmp 0x8fed7
movl $0x1, -0x4(%rbp)
jmp 0x90436
movq -0x128(%rbp), %rdi
movq -0x38(%rbp), %rsi
movq %rdi, %rdx
addq $0xe0, %rdx
callq 0x913c0
testb $0x1, %al
jne 0x8fef7
jmp 0x8ff03
movl $0x2, -0x4(%rbp)
jmp 0x90436
movq -0x128(%rbp), %rsi
movq -0x38(%rbp), %rdi
addq $0x110, %rsi            # imm = 0x110
callq 0x91410
testb $0x1, %al
jne 0x8ff20
jmp 0x8ff2c
movl $0x2, -0x4(%rbp)
jmp 0x90436
movq -0x128(%rbp), %rdi
addq $0x20, %rdi
callq 0x39b60
movq -0x128(%rbp), %rdi
movq %rax, -0x48(%rbp)
addq $0x20, %rdi
callq 0x399f0
movq %rax, -0x50(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x48(%rbp), %rdi
movq -0x50(%rbp), %rsi
movq -0x58(%rbp), %rdx
callq 0x91480
movq %rax, -0x40(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x3e880
leaq -0x88(%rbp), %rdi
callq 0x3e880
movq -0x128(%rbp), %rdi
movq $0x0, -0x90(%rbp)
addq $0x20, %rdi
callq 0x399f0
movq %rax, -0x98(%rbp)
leaq -0x40(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x51bd0
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0x129(%rbp)
jne 0x8ffc9
jmp 0x8ffdd
movb -0x29(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
sete %al
movb %al, -0x129(%rbp)
movb -0x129(%rbp), %al
testb $0x1, %al
jne 0x8ffec
jmp 0x90214
leaq -0x40(%rbp), %rdi
callq 0x51c10
movq -0x128(%rbp), %rdi
movq (%rax), %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rsi
callq 0x8f510
movb %al, -0x12a(%rbp)
jmp 0x9001a
movb -0x12a(%rbp), %al
testb $0x1, %al
jne 0x90026
jmp 0x90053
movl $0x1, -0x4(%rbp)
movl $0x1, -0xa8(%rbp)
jmp 0x90408
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
jmp 0x9041f
movq -0x18(%rbp), %rdi
callq 0x51cb0
movq %rax, -0x138(%rbp)
jmp 0x90065
movq -0x18(%rbp), %rdi
callq 0x56820
movq %rax, -0x140(%rbp)
jmp 0x90077
movq -0x140(%rbp), %rcx
movq -0x138(%rbp), %rdx
movq -0x128(%rbp), %rsi
leaq -0xc0(%rbp), %rdi
callq 0x910b0
jmp 0x9009a
leaq -0x70(%rbp), %rdi
leaq -0xc0(%rbp), %rsi
movq %rsi, -0x150(%rbp)
callq 0x3f230
movq -0x150(%rbp), %rdi
callq 0xd7d0
movq -0x90(%rbp), %rdi
callq 0x51cb0
movq %rax, -0x148(%rbp)
jmp 0x900d2
movq -0x90(%rbp), %rdi
callq 0x56820
movq %rax, -0x158(%rbp)
jmp 0x900e7
movq -0x158(%rbp), %rcx
movq -0x148(%rbp), %rdx
movq -0x128(%rbp), %rsi
leaq -0xd8(%rbp), %rdi
callq 0x910b0
jmp 0x9010a
leaq -0x88(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
movq %rsi, -0x160(%rbp)
callq 0x3f230
movq -0x160(%rbp), %rdi
callq 0xd7d0
leaq -0xf0(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x3aff0
jmp 0x90142
leaq -0x108(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x3aff0
jmp 0x90157
movq -0x128(%rbp), %rdi
leaq -0xf0(%rbp), %rsi
leaq -0x108(%rbp), %rdx
callq 0x914e0
movb %al, -0x161(%rbp)
jmp 0x90179
leaq -0x108(%rbp), %rdi
callq 0xd7d0
leaq -0xf0(%rbp), %rdi
callq 0xd7d0
movb -0x161(%rbp), %al
testb $0x1, %al
jne 0x9019d
jmp 0x9020f
movq -0x128(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x90(%rbp), %rdx
callq 0x915b0
jmp 0x901b6
movl $0x1, -0x4(%rbp)
movl $0x1, -0xa8(%rbp)
jmp 0x90408
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
jmp 0x901fe
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
leaq -0x108(%rbp), %rdi
callq 0xd7d0
leaq -0xf0(%rbp), %rdi
callq 0xd7d0
jmp 0x9041f
jmp 0x903a3
movq -0x128(%rbp), %rdi
addq $0x20, %rdi
callq 0x399f0
movq %rax, -0x110(%rbp)
leaq -0x40(%rbp), %rdi
leaq -0x110(%rbp), %rsi
callq 0x51bd0
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0x162(%rbp)
jne 0x9024c
jmp 0x90260
movb -0x29(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x1, %eax
sete %al
movb %al, -0x162(%rbp)
movb -0x162(%rbp), %al
testb $0x1, %al
jne 0x9026f
jmp 0x9035f
leaq -0x40(%rbp), %rdi
callq 0x51c10
movq -0x128(%rbp), %rdi
movq (%rax), %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rsi
callq 0x8f510
movb %al, -0x163(%rbp)
jmp 0x9029d
movb -0x163(%rbp), %al
testb $0x1, %al
jne 0x902ac
jmp 0x9035d
movq -0x128(%rbp), %rdi
movq -0x18(%rbp), %rax
movq %rax, -0x118(%rbp)
addq $0x128, %rdi            # imm = 0x128
callq 0x8bdd0
testb $0x1, %al
jne 0x902ef
movq -0x128(%rbp), %rdi
addq $0x128, %rdi            # imm = 0x128
xorl %eax, %eax
movl %eax, %esi
callq 0x53720
movq (%rax), %rax
movq %rax, -0x118(%rbp)
movq -0x128(%rbp), %rdi
movq -0x118(%rbp), %rsi
callq 0x8f510
movb %al, -0x164(%rbp)
jmp 0x9030a
movb -0x164(%rbp), %al
testb $0x1, %al
jne 0x90316
jmp 0x9035b
movq -0x128(%rbp), %rdi
movq -0x118(%rbp), %rsi
movq -0x90(%rbp), %rdx
callq 0x91910
movl %eax, -0x168(%rbp)
jmp 0x90338
movl -0x168(%rbp), %eax
cmpl $0x1, %eax
jne 0x90359
movl $0x1, -0x4(%rbp)
movl $0x1, -0xa8(%rbp)
jmp 0x90408
jmp 0x9035b
jmp 0x9035d
jmp 0x903a1
movq -0x128(%rbp), %rdi
addq $0x20, %rdi
callq 0x399f0
movq %rax, -0x120(%rbp)
leaq -0x40(%rbp), %rdi
leaq -0x120(%rbp), %rsi
callq 0x55800
testb $0x1, %al
jne 0x9038c
jmp 0x9039f
movl $0x0, -0x4(%rbp)
movl $0x1, -0xa8(%rbp)
jmp 0x90408
jmp 0x903a1
jmp 0x903a3
leaq -0x40(%rbp), %rdi
callq 0x51c10
movq -0x128(%rbp), %rdi
movq (%rax), %rax
movq %rax, -0x90(%rbp)
addq $0x128, %rdi            # imm = 0x128
leaq -0x18(%rbp), %rsi
callq 0xdab0
jmp 0x903cf
movq -0x128(%rbp), %rdi
movq -0x90(%rbp), %rsi
movq -0x28(%rbp), %rdx
movzbl -0x29(%rbp), %ecx
andl $0x1, %ecx
callq 0x8f5d0
movl %eax, -0x16c(%rbp)
jmp 0x903f5
movl -0x16c(%rbp), %eax
movl %eax, -0x4(%rbp)
movl $0x1, -0xa8(%rbp)
leaq -0x88(%rbp), %rdi
callq 0xd7d0
leaq -0x70(%rbp), %rdi
callq 0xd7d0
jmp 0x90436
leaq -0x88(%rbp), %rdi
callq 0xd7d0
leaq -0x70(%rbp), %rdi
callq 0xd7d0
jmp 0x90442
movl -0x4(%rbp), %eax
addq $0x170, %rsp            # imm = 0x170
popq %rbp
retq
movq -0xa0(%rbp), %rdi
callq 0x8880
nop