From: Michael D. Lowis Date: Sat, 31 Oct 2015 00:37:06 +0000 (-0400) Subject: Initial commit X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=ec74f0de75a6a1d9c62256625c77d6ffad3c17f8;p=proto%2Flibbk.git Initial commit --- diff --git a/.gitignore b/.gitignore index bbf313b..d58f660 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,8 @@ # Debug files *.dSYM/ +.ninja_deps .ninja_log +*.d +.ninja_deps +.ninja_log +tests/tests diff --git a/build.ninja b/build.ninja new file mode 100644 index 0000000..0c6cf85 --- /dev/null +++ b/build.ninja @@ -0,0 +1,43 @@ +############################################################################### +# Build Variables +############################################################################### +CC = gcc +DEPSUFFIX = .d +CPPFLAGS = -Isource/ +CFLAGS = -pg -g -O3 -Wall -Wextra --std=c99 --pedantic -DBK_DEBUG_TRACE +LD = gcc +LDFLAGS = -pg +AR = ar +ARFLAGS = rcs + +############################################################################### +# Build Rule Definitions +############################################################################### +rule cc + command = $CC -MMD -MF $out$DEPSUFFIX $CPPFLAGS $CFLAGS -c -o $out $in + depfile = $out$DEPSUFFIX + +rule ld + command = $LD $LDFLAGS -o $out $in + +rule ar + command = $AR $ARFLAGS $out $in + depfile = $out$DEPSUFFIX + +rule run + command = ./$in + +############################################################################### +# Build Targets +############################################################################### +# LibBK Static Library +build source/main.o: cc source/main.c +build source/alg.o: cc source/alg.c +build source/drc.o: cc source/drc.c +build libbk.a: ar source/main.o source/alg.o source/drc.o + +# Garbage Collection Test Application +build tests/main.o: cc tests/main.c +build tests/tests: ld tests/main.o libbk.a +build gctrace.out: run tests/tests + diff --git a/source/alg.c b/source/alg.c new file mode 100644 index 0000000..420fbdb --- /dev/null +++ b/source/alg.c @@ -0,0 +1,4 @@ +#include + +const GCAPI* GC_Algorithm = &DeferredRC; + diff --git a/source/bk.h b/source/bk.h new file mode 100644 index 0000000..c0547da --- /dev/null +++ b/source/bk.h @@ -0,0 +1,142 @@ +#ifndef BK_H +#define BK_H + +#include + +#ifdef BK_DEBUG_TRACE + #include +#else + /* Macros to log collector startup */ + #define TRACE_INIT_START() + #define TRACE_INIT_END() + + /* Macros to log collector shutdown */ + #define TRACE_DEINIT_START() + #define TRACE_DEINIT_END() + + /* Macros to log collection cycle */ + #define TRACE_COLLECT_START() + #define TRACE_COLLECT_END() + + /* Macros to log an allocation using the collector */ + #define TRACE_ALLOC_START(ptr,size) + #define TRACE_ALLOC_END(ptr,size) + + /* Macros to log an allocation using the collector */ + #define TRACE_DEALLOC_START(ptr) + #define TRACE_DEALLOC_END(ptr) + + /* Macros to log an reference increment using the collector */ + #define TRACE_ADDREF_START(ptr) + #define TRACE_ADDREF_END(ptr) + + /* Macros to log an reference decrement using the collector */ + #define TRACE_DELREF_START(ptr) + #define TRACE_DELREF_END(ptr) +#endif + +/* Destructor function pointer type. */ +typedef void (*dtor_t)(void*); + +/* Collector API definition structure */ +typedef struct { + void (*init)(void** stkbtm); + void (*deinit)(void); + void (*collect)(void); + void* (*alloc)(size_t sz, dtor_t dtor); + void (*dealloc)(void* ptr); + void (*addref)(void* ptr); + void (*delref)(void* ptr); +} GCAPI; + +/* Single-threaded naive reference counting algorithm */ +extern const GCAPI NaiveRC; + +/* Single-threaded deferred reference counting algorithm */ +extern const GCAPI DeferredRC; + +/* Atomic reference counting algorithm */ +extern const GCAPI AtomicRC; + +/* The currently selected GC algorithm */ +extern const GCAPI* GC_Algorithm; + +/* Initialize the garbage collector */ +static inline void gc_init(void** stkbtm) { + TRACE_INIT_START(); + GC_Algorithm->init(stkbtm); + TRACE_INIT_END(); +} + +/* Deinitialize the garbage collector */ +static inline void gc_deinit(void) { + TRACE_DEINIT_START(); + GC_Algorithm->deinit(); + TRACE_DEINIT_END(); +} + +/* Trigger a garbage collection cycle immediately */ +static inline void gc_collect(void) { + TRACE_COLLECT_START(); + GC_Algorithm->collect(); + TRACE_COLLECT_END(); +} + +/* Allocate a garbage collected object */ +static inline void* gc_alloc(size_t sz, dtor_t dtor) { + void* ptr; + TRACE_ALLOC_START((ptr = GC_Algorithm->alloc(sz, dtor)),sz); + TRACE_ALLOC_END(ptr,sz); + return ptr; +} + +/* Deallocate a garbage collected object */ +static inline void gc_dealloc(void* ptr) { + TRACE_DEALLOC_START(ptr); + GC_Algorithm->dealloc(ptr); + TRACE_DEALLOC_END(ptr); +} + +/* Increment the reference count for a garbage collected object */ +static inline void gc_addref(void* ptr) { + TRACE_ADDREF_START(ptr); + GC_Algorithm->addref(ptr); + TRACE_ADDREF_END(ptr); +} + +/* Decrement the reference count for a garbage colected object */ +static inline void gc_delref(void* ptr) { + TRACE_DELREF_START(ptr); + GC_Algorithm->delref(ptr); + TRACE_DELREF_END(ptr); +} + +/* Replace the value of a reference and adjust the reference counts accordingly */ +static inline void gc_swapref(void** var, void* val) { + void* oldref = *var; + gc_addref(val); + *var = val; + gc_delref(oldref); +} + +/* Allocate a new garbage collected object */ +#define alloc(obj,dtor) gc_alloc(obj,dtor) + +/* Increment the reference count for a garbage collected object */ +#define retain(obj) (gc_addref(obj), obj) + +/* Decrement the reference count for a garbage colected object */ +#define release(obj) (gc_delref(obj), (void*)0) + +/* Replace the value of a reference and adjust the reference counts accordingly */ +#define assign(var,val) gc_swapref((void**)&(var), val) + +/* + * Make sure we use the built-in main which initializes the collector and calls user_main + */ +#ifndef NO_MAIN_WRAPPER + #define main user_main +#endif +int user_main(int, char**); + +#endif diff --git a/source/bktrace.h b/source/bktrace.h new file mode 100644 index 0000000..fd36a65 --- /dev/null +++ b/source/bktrace.h @@ -0,0 +1,66 @@ +#ifndef BKTRACE_H +#define BKTRACE_H + +#include +#include +#include + +static void debugtrace(char* fmtstr, ...) { + FILE* file = fopen("gctrace.out", "a"); + va_list args; + va_start(args, fmtstr); + vfprintf(file, fmtstr, args); + va_end(args); + fclose(file); +} + +/* Macros to log collector startup */ +#define TRACE_INIT_START() \ + debugtrace("init_start, %ld, %d\n", clock(), CLOCKS_PER_SEC) + +#define TRACE_INIT_END() \ + debugtrace("init_end, %ld\n", clock()) + +/* Macros to log collector shutdown */ +#define TRACE_DEINIT_START() \ + debugtrace("deinit_start, %ld\n", clock()) + +#define TRACE_DEINIT_END() \ + debugtrace("deinit_end, %ld\n", clock()) + +/* Macros to log collection cycle */ +#define TRACE_COLLECT_START() \ + debugtrace("collect_start, %ld\n", clock()) + +#define TRACE_COLLECT_END() \ + debugtrace("collect_end, %ld\n", clock()) + +/* Macros to log an allocation using the collector */ +#define TRACE_ALLOC_START(ptr,size) \ + debugtrace("alloc_start, %ld, %p, %ld\n", clock(), ptr, size) + +#define TRACE_ALLOC_END(ptr,size) \ + debugtrace("alloc_end, %ld, %p, %ld\n", clock(), ptr, size) + +/* Macro to log an allocation using the collector */ +#define TRACE_DEALLOC_START(ptr) \ + debugtrace("dealloc_start, %ld, %p\n", clock(), ptr) + +#define TRACE_DEALLOC_END(ptr) \ + debugtrace("dealloc_end, %ld, %p\n", clock(), ptr) + +/* Macro to log an reference increment using the collector */ +#define TRACE_ADDREF_START(ptr) \ + debugtrace("addref_start, %ld, %p\n", clock(), ptr) + +#define TRACE_ADDREF_END(ptr) \ + debugtrace("addref_end, %ld, %p\n", clock(), ptr) + +/* Macro to log an reference decrement using the collector */ +#define TRACE_DELREF_START(ptr) \ + debugtrace("delref_start, %ld, %p\n", clock(), ptr) + +#define TRACE_DELREF_END(ptr) \ + debugtrace("delref_end, %ld, %p\n", clock(), ptr) + +#endif diff --git a/source/drc.c b/source/drc.c new file mode 100644 index 0000000..e3e6bc9 --- /dev/null +++ b/source/drc.c @@ -0,0 +1,302 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct obj_t { + uintptr_t refs; + dtor_t dtor; +} obj_t; + +typedef struct hash_entry_t { + obj_t* object; + unsigned int hash; + struct hash_entry_t* next; +} hash_entry_t; + +typedef struct { + size_t size; + size_t bkt_count; + hash_entry_t** buckets; +} hash_t; + +static void hash_set(hash_t* hash, hash_entry_t* entry); + +/*****************************************************************************/ + +#define NUM_PRIMES (sizeof(Primes)/sizeof(unsigned int)) + +static unsigned int Primes[] = { + 5, 13, 23, 53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, 24593, + 49157, 98317, 196613, 393241, 786433, 1572869, 3145739, 6291469, + 12582917, 25165843, 50331653, 100663319, 201326611, 402653189, + 805306457, 1610612741 +}; + +static unsigned int num_buckets(unsigned int idx) { + assert(idx < NUM_PRIMES); + return Primes[idx]; +} + +static void hash_init(hash_t* hash) +{ + hash->size = 0; + hash->bkt_count = 0; + hash->buckets = (hash_entry_t**)calloc(sizeof(hash_entry_t*), num_buckets(hash->bkt_count)); +} + +static void find_entry(hash_entry_t** parent, hash_entry_t** current, hash_entry_t* entry) +{ + while(*current != NULL) { + if (((*current)->hash == entry->hash) && + ((*current)->object == entry->object)) + break; + *parent = *current; + *current = (*current)->next; + } +} + +static void rehash(hash_t* hash) +{ + unsigned int oldcount, i; + hash_entry_t** oldbuckets; + hash_entry_t *node, *entry; + if ((hash->bkt_count+1) < NUM_PRIMES) { + oldcount = hash->bkt_count++; + oldbuckets = hash->buckets; + hash->buckets = (hash_entry_t**)calloc(sizeof(hash_entry_t*), num_buckets(hash->bkt_count)); + hash->size = 0; + /* Iterate over all of the old buckets */ + for (i = 0; i < num_buckets(oldcount); i++) { + node = oldbuckets[i]; + /* re-insert all entries in the bucket into the new bucket table */ + while (node != NULL) { + entry = node; + node = entry->next; + hash_set(hash, entry); + } + } + /* Free the old bucket table */ + free(oldbuckets); + } +} + +static uint64_t hash64(uint64_t key) +{ + key = (~key) + (key << 21); + key = key ^ (key >> 24); + key = (key + (key << 3)) + (key << 8); + key = key ^ (key >> 14); + key = (key + (key << 2)) + (key << 4); + key = key ^ (key >> 28); + key = key + (key << 31); + return key; +} + +static size_t hash_size(hash_t* hash) +{ + return hash->size; +} + +static void hash_set(hash_t* hash, hash_entry_t* entry) +{ + unsigned int index; + hash_entry_t *parent, *node, *deadite; + if (hash->size >= num_buckets(hash->bkt_count)) + rehash(hash); + entry->hash = hash64((uint64_t)(entry->object)); + index = (entry->hash % num_buckets(hash->bkt_count)); + parent = NULL; + node = hash->buckets[index]; + deadite = NULL; + find_entry(&parent, &node, entry); + if ((parent == NULL) && (node == NULL)) { + hash->buckets[index] = entry; + entry->next = NULL; + hash->size++; + } else if (node == NULL) { + parent->next = entry; + entry->next = NULL; + hash->size++; + } +} + +static hash_entry_t* hash_del(hash_t* hash, hash_entry_t* entry) +{ + unsigned int index; + hash_entry_t *parent, *node, *ret = NULL; + entry->hash = hash64((uint64_t)(entry->object)); + index = (entry->hash % num_buckets(hash->bkt_count)); + parent = NULL; + node = hash->buckets[index]; + find_entry(&parent, &node, entry); + if (node != NULL) { + ret = node; + node = node->next; + if (parent != NULL) + parent->next = node; + else + hash->buckets[index] = node; + hash->size--; + } + return ret; +} + +/*****************************************************************************/ + +static bool Shutdown; +static void** Stack_Bottom; +static hash_t Zero_Count_Table; +static hash_t Multi_Ref_Table; +static hash_t Working_Table; + +static void drc_mark_region(void** start, void** end) { + hash_entry_t lookup = {0, 0, 0}; + hash_entry_t* entry; + for (; start <= end; start++) { + lookup.object = *start; + entry = hash_del(&Working_Table, &lookup); + if (entry != NULL) { + hash_set(&Zero_Count_Table, entry); + } + } +} + +static void drc_mark_stack(void) { + void* stack_top = NULL; + /* Determine which way the stack grows and scan it for pointers */ + if (&stack_top < Stack_Bottom) { + drc_mark_region(&stack_top, Stack_Bottom); + } else { + drc_mark_region(Stack_Bottom, &stack_top); + } +} + +static void drc_mark(void) { + jmp_buf env; + volatile int noinline = 1; + /* Flush Registers to Stack */ + if (noinline) { + memset(&env, 0x55, sizeof(jmp_buf)); + (void)setjmp(env); + } + /* Avoid Inlining function call so that we scan the registers along with + * the stack */ + (noinline ? drc_mark_stack : NULL)(); +} + +static void drc_sweep_table(hash_t* table) { + unsigned int i; + /* Delete all the entries in the hash */ + for (i = 0; i < num_buckets(table->bkt_count); i++) { + hash_entry_t* node = table->buckets[i]; + table->buckets[i] = NULL; + while (node != NULL) { + hash_entry_t* deadite = node; + node = node->next; + obj_t* obj = ((obj_t*)(deadite->object)-1); + if (obj->dtor != NULL) + obj->dtor(deadite->object); + gc_dealloc(deadite); + } + } + free(table->buckets); +} + +static void drc_init(void** stack_bottom) +{ + Stack_Bottom = stack_bottom; + hash_init(&Zero_Count_Table); + hash_init(&Multi_Ref_Table); + Shutdown = false; +} + +static void drc_deinit(void) +{ + Shutdown = true; + drc_sweep_table(&Zero_Count_Table); + drc_sweep_table(&Multi_Ref_Table); +} + +static void drc_collect(void) { +#ifdef GC_DEBUG_MSGS + printf("BEFORE - ZCT: %ld MRT: %ld TOT: %ld\n", + hash_size(&Zero_Count_Table), + hash_size(&Multi_Ref_Table), + hash_size(&Zero_Count_Table) + hash_size(&Multi_Ref_Table)); +#endif + Working_Table = Zero_Count_Table; + hash_init(&Zero_Count_Table); + drc_mark(); + drc_sweep_table(&Working_Table); +#ifdef GC_DEBUG_MSGS + printf("AFTER - ZCT: %ld MRT: %ld TOT: %ld\n\n", + hash_size(&Zero_Count_Table), + hash_size(&Multi_Ref_Table), + hash_size(&Zero_Count_Table) + hash_size(&Multi_Ref_Table)); +#endif +} + +static void* drc_alloc(size_t size, dtor_t dtor) +{ + hash_entry_t* entry = (hash_entry_t*)malloc(sizeof(hash_entry_t) + sizeof(obj_t) + size); + obj_t* p_obj = (obj_t*)(entry+1); + void* p_data = (void*)(p_obj+1); + entry->object = p_data; + p_obj->refs = 0; + p_obj->dtor = dtor; + hash_set(&Zero_Count_Table, entry); + if (hash_size(&Zero_Count_Table) >= 500) { + gc_collect(); + } + return p_data; +} + +static void drc_addref(void* ptr) +{ + hash_entry_t lookup = {0, 0, 0}; + hash_entry_t* entry; + obj_t* obj = ((obj_t*)ptr-1); + if ((ptr != NULL) && !Shutdown) { + obj->refs++; + if (obj->refs == 1) { + lookup.object = ptr; + entry = hash_del(&Zero_Count_Table, &lookup); + assert(entry != NULL); + hash_set(&Multi_Ref_Table, entry); + } + } +} + +static void drc_delref(void* ptr) +{ + hash_entry_t lookup = {0, 0, 0}; + hash_entry_t* entry; + obj_t* obj = ((obj_t*)ptr-1); + if ((ptr != NULL) && !Shutdown) { + obj->refs--; + if (obj->refs == 0) { + lookup.object = ptr; + entry = hash_del(&Multi_Ref_Table, &lookup); + assert(entry != NULL); + hash_set(&Zero_Count_Table, entry); + } + } +} + +/*****************************************************************************/ + +const GCAPI DeferredRC = { + .init = drc_init, + .deinit = drc_deinit, + .collect = drc_collect, + .alloc = drc_alloc, + .dealloc = free, + .addref = drc_addref, + .delref = drc_delref +}; + diff --git a/source/main.c b/source/main.c new file mode 100644 index 0000000..dca7432 --- /dev/null +++ b/source/main.c @@ -0,0 +1,11 @@ +#define NO_MAIN_WRAPPER +#include +#include + +int main(int argc, char** argv) +{ + void* stack_bottom = NULL; + gc_init(&stack_bottom); + atexit(gc_deinit); + return user_main(argc, argv); +} diff --git a/tests/input.log b/tests/input.log new file mode 100644 index 0000000..5c85fa8 --- /dev/null +++ b/tests/input.log @@ -0,0 +1,1500 @@ +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts +10,Mal,Temple of the Jade Serpent +10,Wash,Temple of the Jade Serpent +10,Zoe,Temple of the Jade Serpent +10,Jayne,Temple of the Jade Serpent +10,Kaylee,Temple of the Jade Serpent +-3,Mal,Pistol +-3,Wash,Hawaiian Shirt +-8,Jayne,Grenade Launcher +-1,Kaylee,Wrench +10,Zoe,Shando-Pan Monastery +10,Wash,Shando-Pan Monastery +10,Mal,Shando-Pan Monastery +10,Jayne,Shando-Pan Monastery +10,Shepherd,Shando-Pan Monastery +-2,Wash,Cargo Shorts diff --git a/tests/main.c b/tests/main.c new file mode 100644 index 0000000..734f99e --- /dev/null +++ b/tests/main.c @@ -0,0 +1,130 @@ +#include +#include +#include +#include + +/****************************************************************************** + * GC Algorithm Setup + *****************************************************************************/ +const GCAPI* GC_Algorithm = &DeferredRC; + +/****************************************************************************** + * Utility Functions + *****************************************************************************/ +static char* strclone(char* str) { + char* newstr = (char*)alloc(strlen(str)+1, NULL); + strcpy(newstr, str); + return newstr; +} + +/****************************************************************************** + * Pairs and Lists + *****************************************************************************/ +typedef struct { + void* car; + void* cdr; +} Pair; + +static void pair_free(void* ptr) { + Pair* p = (Pair*)ptr; + release(p->car); + release(p->cdr); +} + +Pair* cons(void* a, void* b) { + Pair* pair = (Pair*)alloc(sizeof(Pair), pair_free); + pair->car = retain(a); + pair->cdr = retain(b); + return pair; +} + +static void* car(Pair* p) { return p->car; } +static void* cdr(Pair* p) { return p->cdr; } + +static Pair* reverse(Pair* p) { + Pair* newlist = NULL; + while (p != NULL) { + newlist = cons(car(p), newlist); + p = cdr(p); + } + return newlist; +} + +//static void foreach(Pair* list, void (*fn)(void*)) { +// while(list != NULL) { +// fn(car(list)); +// list = cdr(list); +// } +//} + +/****************************************************************************** + * Record Definition + *****************************************************************************/ +typedef struct { + int amount; + char* person; + char* thing; +} Record; + +static void record_free(void* ptr) { + Record* rec = (Record*)ptr; + assign(rec->person, NULL); + assign(rec->thing, NULL); +} + +Record* record(int amt, char* p, char* t) { + Record* rec = (Record*)alloc(sizeof(Record), record_free); + rec->amount = amt; + rec->person = retain(p); + rec->thing = retain(t); + return rec; +} + +Record* parse_record(char* line) { + char* amount = strtok(line, ","); + char* person = strtok(NULL, ","); + char* thing = strtok(NULL, ","); + thing[strlen(thing)-1] = '\0'; + return record(atoi(amount), strclone(person), strclone(thing)); +} + +/****************************************************************************** + * Record Definition + *****************************************************************************/ +/* + The main is a close analogue of this Ruby code: + + dkp_log = File.foreach("dkp.log").map { |line| + amount, person, thing = line.strip.split(",") + [ amount.to_i, person, thing ] + } + standings = dkp_log.group_by { |trans| trans[1] }.map { |person, history| + [ person, history.reduce(0) { |sum, trans| sum + trans[0] } ] + }.sort { |a, b| b[1] <=> a[1] } +*/ +#include + +//void printrec(void* ptr) { + //Record* rec = (Record*)ptr; + //printf("%d : %s : %s\n", rec->amount, rec->person, rec->thing); +//} + +int main(int argc, char** argv) { + const char* infile = (argc == 2 && argv[1]) ? argv[1] : "tests/input.log"; + /* Read the data in from the file */ + char linebuf[1024]; + FILE* data = fopen(infile, "r"); + Pair* entries = NULL; + bool discard = false; + while(fgets(linebuf, 1023, data)) { + Record* rec = parse_record(linebuf); + if (!discard) + entries = cons(rec, entries); + discard = !discard; + } + entries = reverse(entries); + //foreach(entries, printrec); + fclose(data); + /* */ + return 0; +}