// File: /workspace/github_c_makefile_star2_O0/cyb70289[P]tt/src/common/tree.c
// Function: tt_rbtree_delete
static int tt_rbtree_delete(struct tt_bintree *tree, struct tt_bintree_node *z)
{
	struct tt_bintree_node *w, *x, *y = z;
	enum tt_bintree_color ycolor = y->ext.color;

	/* Delete node */
	if (!z->left) {
		x = z->right;
		tt_rbtree_trans(tree, z, z->right);
	} else if (!z->right) {
		x = z->left;
		tt_rbtree_trans(tree, z, z->left);
	} else {
		y = tt_rbtree_min(z->right);
		ycolor = y->ext.color;
		x = y->right;
		if (y->parent == z) {
			if (x)
				x->parent = y;
		} else {
			tt_rbtree_trans(tree, y, y->right);
			y->right = z->right;
			y->right->parent = y;
		}
		tt_rbtree_trans(tree, z, y);
		y->left = z->left;
		y->left->parent = y;
		y->ext.color = z->ext.color;
	}
	free(z);

	if (ycolor != TT_BINTREE_BLACK)
		return 0;

	/* Rotate to maintain red-black property */
	while (x && x != tree->_root && x->ext.color == TT_BINTREE_BLACK) {
		if (x == x->parent->left) {
			w = x->parent->right;
			if (w->ext.color == TT_BINTREE_RED) {
				w->ext.color = TT_BINTREE_BLACK;
				x->parent->ext.color = TT_BINTREE_RED;
				tt_rbtree_rotate_left(tree, x->parent);
				w = x->parent->right;
			}
			bool l = !w->left ||
				w->left->ext.color == TT_BINTREE_BLACK;
			bool r = !w->right ||
				w->right->ext.color == TT_BINTREE_BLACK;
			if (l && r) {
				w->ext.color = TT_BINTREE_RED;
				x = x->parent;
			} else if (r) {
				w->left->ext.color = TT_BINTREE_BLACK;
				w->ext.color = TT_BINTREE_RED;
				tt_rbtree_rotate_right(tree, w);
				w = x->parent->right;
			} else {
				w->ext.color = x->parent->ext.color;
				x->parent->ext.color = TT_BINTREE_BLACK;
				w->right->ext.color = TT_BINTREE_BLACK;
				tt_rbtree_rotate_left(tree, x->parent);
				x = tree->_root;
			}
		} else {
			w = x->parent->left;
			if (w->ext.color == TT_BINTREE_RED) {
				w->ext.color = TT_BINTREE_BLACK;
				x->parent->ext.color = TT_BINTREE_RED;
				tt_rbtree_rotate_right(tree, x->parent);
				w = x->parent->left;
			}
			bool r = !w->right ||
				w->right->ext.color == TT_BINTREE_BLACK;
			bool l = !w->left ||
				w->left->ext.color == TT_BINTREE_BLACK;
			if (r && l) {
				w->ext.color = TT_BINTREE_RED;
				x = x->parent;
			} else if (l) {
				w->right->ext.color = TT_BINTREE_BLACK;
				w->ext.color = TT_BINTREE_RED;
				tt_rbtree_rotate_left(tree, w);
				w = x->parent->left;
			} else {
				w->ext.color = x->parent->ext.color;
				x->parent->ext.color = TT_BINTREE_BLACK;
				w->left->ext.color = TT_BINTREE_BLACK;
				tt_rbtree_rotate_right(tree, x->parent);
				x = tree->_root;
			}
		}
	}
	if (x)
		x->ext.color = TT_BINTREE_BLACK;

	return 0;
}

// Assembly:
subq $0x48, %rsp
movq %rdi, 0x38(%rsp)
movq %rsi, 0x30(%rsp)
movq 0x30(%rsp), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
movl 0x28(%rax), %eax
movl %eax, 0x14(%rsp)
movq 0x30(%rsp), %rax
cmpq $0x0, 0x18(%rax)
jne 0x68db
movq 0x30(%rsp), %rax
movq 0x20(%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x38(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x30(%rsp), %rax
movq 0x20(%rax), %rdx
callq 0x6fe0
jmp 0x69ed
movq 0x30(%rsp), %rax
cmpq $0x0, 0x20(%rax)
jne 0x6912
movq 0x30(%rsp), %rax
movq 0x18(%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x38(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x30(%rsp), %rax
movq 0x18(%rax), %rdx
callq 0x6fe0
jmp 0x69eb
movq 0x30(%rsp), %rax
movq 0x20(%rax), %rdi
callq 0x63e0
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
movl 0x28(%rax), %eax
movl %eax, 0x14(%rsp)
movq 0x18(%rsp), %rax
movq 0x20(%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x18(%rsp), %rax
movq 0x10(%rax), %rax
cmpq 0x30(%rsp), %rax
jne 0x6967
cmpq $0x0, 0x20(%rsp)
je 0x6965
movq 0x18(%rsp), %rcx
movq 0x20(%rsp), %rax
movq %rcx, 0x10(%rax)
jmp 0x69a3
movq 0x38(%rsp), %rdi
movq 0x18(%rsp), %rsi
movq 0x18(%rsp), %rax
movq 0x20(%rax), %rdx
callq 0x6fe0
movq 0x30(%rsp), %rax
movq 0x20(%rax), %rcx
movq 0x18(%rsp), %rax
movq %rcx, 0x20(%rax)
movq 0x18(%rsp), %rcx
movq 0x18(%rsp), %rax
movq 0x20(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x38(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x18(%rsp), %rdx
callq 0x6fe0
movq 0x30(%rsp), %rax
movq 0x18(%rax), %rcx
movq 0x18(%rsp), %rax
movq %rcx, 0x18(%rax)
movq 0x18(%rsp), %rcx
movq 0x18(%rsp), %rax
movq 0x18(%rax), %rax
movq %rcx, 0x10(%rax)
movq 0x30(%rsp), %rax
movl 0x28(%rax), %ecx
movq 0x18(%rsp), %rax
movl %ecx, 0x28(%rax)
jmp 0x69ed
movq 0x30(%rsp), %rdi
callq 0x1030
cmpl $0x1, 0x14(%rsp)
je 0x6a0b
movl $0x0, 0x44(%rsp)
jmp 0x6d9e
jmp 0x6a0d
xorl %eax, %eax
cmpq $0x0, 0x20(%rsp)
movb %al, 0xf(%rsp)
je 0x6a41
movq 0x20(%rsp), %rcx
movq 0x38(%rsp), %rdx
xorl %eax, %eax
cmpq 0x28(%rdx), %rcx
movb %al, 0xf(%rsp)
je 0x6a41
movq 0x20(%rsp), %rax
cmpl $0x1, 0x28(%rax)
sete %al
movb %al, 0xf(%rsp)
movb 0xf(%rsp), %al
testb $0x1, %al
jne 0x6a4e
jmp 0x6d82
movq 0x20(%rsp), %rax
movq 0x20(%rsp), %rcx
movq 0x10(%rcx), %rcx
cmpq 0x18(%rcx), %rax
jne 0x6bf3
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x20(%rax), %rax
movq %rax, 0x28(%rsp)
movq 0x28(%rsp), %rax
cmpl $0x0, 0x28(%rax)
jne 0x6ac4
movq 0x28(%rsp), %rax
movl $0x1, 0x28(%rax)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movl $0x0, 0x28(%rax)
movq 0x38(%rsp), %rdi
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rsi
callq 0x6e40
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x20(%rax), %rax
movq %rax, 0x28(%rsp)
movq 0x28(%rsp), %rcx
movb $0x1, %al
cmpq $0x0, 0x18(%rcx)
movb %al, 0xe(%rsp)
je 0x6aea
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
cmpl $0x1, 0x28(%rax)
sete %al
movb %al, 0xe(%rsp)
movb 0xe(%rsp), %al
andb $0x1, %al
movb %al, 0x13(%rsp)
movq 0x28(%rsp), %rcx
movb $0x1, %al
cmpq $0x0, 0x20(%rcx)
movb %al, 0xd(%rsp)
je 0x6b1a
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rax
cmpl $0x1, 0x28(%rax)
sete %al
movb %al, 0xd(%rsp)
movb 0xd(%rsp), %al
andb $0x1, %al
movb %al, 0x12(%rsp)
testb $0x1, 0x13(%rsp)
je 0x6b51
testb $0x1, 0x12(%rsp)
je 0x6b51
movq 0x28(%rsp), %rax
movl $0x0, 0x28(%rax)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x20(%rsp)
jmp 0x6bee
testb $0x1, 0x12(%rsp)
je 0x6b97
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
movl $0x1, 0x28(%rax)
movq 0x28(%rsp), %rax
movl $0x0, 0x28(%rax)
movq 0x38(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0x6f10
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x20(%rax), %rax
movq %rax, 0x28(%rsp)
jmp 0x6bec
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movl 0x28(%rax), %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0x28(%rax)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movl $0x1, 0x28(%rax)
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rax
movl $0x1, 0x28(%rax)
movq 0x38(%rsp), %rdi
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rsi
callq 0x6e40
movq 0x38(%rsp), %rax
movq 0x28(%rax), %rax
movq %rax, 0x20(%rsp)
jmp 0x6bee
jmp 0x6d7d
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x18(%rax), %rax
movq %rax, 0x28(%rsp)
movq 0x28(%rsp), %rax
cmpl $0x0, 0x28(%rax)
jne 0x6c51
movq 0x28(%rsp), %rax
movl $0x1, 0x28(%rax)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movl $0x0, 0x28(%rax)
movq 0x38(%rsp), %rdi
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rsi
callq 0x6f10
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x18(%rax), %rax
movq %rax, 0x28(%rsp)
movq 0x28(%rsp), %rcx
movb $0x1, %al
cmpq $0x0, 0x20(%rcx)
movb %al, 0xc(%rsp)
je 0x6c77
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rax
cmpl $0x1, 0x28(%rax)
sete %al
movb %al, 0xc(%rsp)
movb 0xc(%rsp), %al
andb $0x1, %al
movb %al, 0x11(%rsp)
movq 0x28(%rsp), %rcx
movb $0x1, %al
cmpq $0x0, 0x18(%rcx)
movb %al, 0xb(%rsp)
je 0x6ca7
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
cmpl $0x1, 0x28(%rax)
sete %al
movb %al, 0xb(%rsp)
movb 0xb(%rsp), %al
andb $0x1, %al
movb %al, 0x10(%rsp)
testb $0x1, 0x11(%rsp)
je 0x6cde
testb $0x1, 0x10(%rsp)
je 0x6cde
movq 0x28(%rsp), %rax
movl $0x0, 0x28(%rax)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x20(%rsp)
jmp 0x6d7b
testb $0x1, 0x10(%rsp)
je 0x6d24
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rax
movl $0x1, 0x28(%rax)
movq 0x28(%rsp), %rax
movl $0x0, 0x28(%rax)
movq 0x38(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0x6e40
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x18(%rax), %rax
movq %rax, 0x28(%rsp)
jmp 0x6d79
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movl 0x28(%rax), %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0x28(%rax)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movl $0x1, 0x28(%rax)
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
movl $0x1, 0x28(%rax)
movq 0x38(%rsp), %rdi
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rsi
callq 0x6f10
movq 0x38(%rsp), %rax
movq 0x28(%rax), %rax
movq %rax, 0x20(%rsp)
jmp 0x6d7b
jmp 0x6d7d
jmp 0x6a0d
cmpq $0x0, 0x20(%rsp)
je 0x6d96
movq 0x20(%rsp), %rax
movl $0x1, 0x28(%rax)
movl $0x0, 0x44(%rsp)
movl 0x44(%rsp), %eax
addq $0x48, %rsp
retq
nopw (%rax,%rax)