// File: fgheng[P]keysound/src/cJSON.cc
// Function: cJSON_Duplicate
cJSON *cJSON_Duplicate(cJSON *item,int recurse)
{
	cJSON *newitem,*cptr,*nptr=0,*newchild;
	/* Bail on bad ptr */
	if (!item) return 0;
	/* Create new item */
	newitem=cJSON_New_Item();
	if (!newitem) return 0;
	/* Copy over all vars */
	newitem->type=item->type&(~cJSON_IsReference),newitem->valueint=item->valueint,newitem->valuedouble=item->valuedouble;
	if (item->valuestring)	{newitem->valuestring=cJSON_strdup(item->valuestring);	if (!newitem->valuestring)	{cJSON_Delete(newitem);return 0;}}
	if (item->string)		{newitem->string=cJSON_strdup(item->string);			if (!newitem->string)		{cJSON_Delete(newitem);return 0;}}
	/* If non-recursive, then we're done! */
	if (!recurse) return newitem;
	/* Walk the ->next chain for the child. */
	cptr=item->child;
	while (cptr)
	{
		newchild=cJSON_Duplicate(cptr,1);		/* Duplicate (with recurse) each item in the ->next chain */
		if (!newchild) {cJSON_Delete(newitem);return 0;}
		if (nptr)	{nptr->next=newchild,newchild->prev=nptr;nptr=newchild;}	/* If newitem->child already set, then crosswire ->prev and ->next and move on */
		else		{newitem->child=newchild;nptr=newchild;}					/* Set newitem->child and move to it */
		cptr=cptr->next;
	}
	return newitem;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movq $0x0, -0x30(%rbp)
cmpq $0x0, -0x10(%rbp)
jne 0xfb7b
movq $0x0, -0x8(%rbp)
jmp 0xfcfb
callq 0xe870
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0xfb98
movq $0x0, -0x8(%rbp)
jmp 0xfcfb
movq -0x10(%rbp), %rax
movl 0x18(%rax), %ecx
andl $0xfffffeff, %ecx       # imm = 0xFFFFFEFF
movq -0x20(%rbp), %rax
movl %ecx, 0x18(%rax)
movq -0x10(%rbp), %rax
movl 0x28(%rax), %ecx
movq -0x20(%rbp), %rax
movl %ecx, 0x28(%rax)
movq -0x10(%rbp), %rax
movsd 0x30(%rax), %xmm0
movq -0x20(%rbp), %rax
movsd %xmm0, 0x30(%rax)
movq -0x10(%rbp), %rax
cmpq $0x0, 0x20(%rax)
je 0xfc12
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0xf080
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x20(%rax)
jne 0xfc10
movq -0x20(%rbp), %rdi
callq 0xe6c0
movq $0x0, -0x8(%rbp)
jmp 0xfcfb
jmp 0xfc12
movq -0x10(%rbp), %rax
cmpq $0x0, 0x38(%rax)
je 0xfc58
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rdi
callq 0xf080
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x38(%rax)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x38(%rax)
jne 0xfc56
movq -0x20(%rbp), %rdi
callq 0xe6c0
movq $0x0, -0x8(%rbp)
jmp 0xfcfb
jmp 0xfc58
cmpl $0x0, -0x14(%rbp)
jne 0xfc6b
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xfcfb
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0xfcf3
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0xfb50
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x38(%rbp)
jne 0xfcaa
movq -0x20(%rbp), %rdi
callq 0xe6c0
movq $0x0, -0x8(%rbp)
jmp 0xfcfb
cmpq $0x0, -0x30(%rbp)
je 0xfcd2
movq -0x38(%rbp), %rcx
movq -0x30(%rbp), %rax
movq %rcx, (%rax)
movq -0x30(%rbp), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq %rax, -0x30(%rbp)
jmp 0xfce6
movq -0x38(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x38(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0xfc77
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)