Added non-preemptive pthreads support.
authorAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Mon, 26 Oct 2009 22:56:15 +0000 (15:56 -0700)
committerAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Mon, 26 Oct 2009 22:56:15 +0000 (15:56 -0700)
The pthreads wrapper builds on harts.  It generates libpthread.a,
which users must link against to run a subset of pthreads programs.
It's barely tested on SPARC and not at all on i386, but there's no
arch-specific code, so it may well work...

14 files changed:
kern/src/Makefrag
kern/src/kfs.c
kern/src/manager.c
kern/src/syscall.c
user/apps/parlib/Makefrag
user/apps/parlib/pthread/Makefrag [new file with mode: 0644]
user/apps/parlib/pthread/blackscholes.c [new file with mode: 0644]
user/apps/parlib/pthread/optionData.txt [new file with mode: 0644]
user/apps/parlib/pthread/pthread_test.c [new file with mode: 0644]
user/parlib/Makefrag
user/parlib/pthread/Makefrag [new file with mode: 0644]
user/parlib/pthread/include/pthread.h [new file with mode: 0644]
user/parlib/pthread/src/Makefrag [new file with mode: 0644]
user/parlib/pthread/src/pthread.c [new file with mode: 0644]

index 5177c42..cbd124f 100644 (file)
@@ -56,12 +56,14 @@ KERN_APPFILES := \
                  $(USER_APPS_ROSLIB_DIR)/hello \
                  $(USER_APPS_ROSLIB_DIR)/mhello \
                  $(USER_APPS_ROSLIB_DIR)/measurements \
+                 $(USER_APPS_PARLIB_PTHREAD_DIR)/pthread_test \
+                 $(USER_APPS_PARLIB_PTHREAD_DIR)/blackscholes \
                  $(USER_APPS_PARLIB_DIR)/draw_nanwan_standalone \
                  $(USER_APPS_PARLIB_DIR)/channel_test_client \
                  $(USER_APPS_PARLIB_DIR)/channel_test_server \
                  $(USER_APPS_PARLIB_DIR)/hello \
                  $(USER_APPS_PARLIB_DIR)/manycore_test \
-                 $(USER_APPS_PARLIB_DIR)/matrix
+                 $(USER_APPS_PARLIB_DIR)/matrix 
 #                 $(USER_APPS_PARLIB_DIR)/open_read
 
 KERN_LDFLAGS   := $(KERN_LDFLAGS) -L$(OBJDIR)/$(KERN_DIR) \
index 4c7b30b..a7394c0 100644 (file)
@@ -41,6 +41,8 @@ DECL_PROG(parlib_channel_test_server);
 DECL_PROG(parlib_hello);
 DECL_PROG(parlib_matrix);
 DECL_PROG(parlib_manycore_test);
+DECL_PROG(parlib_pthread_pthread_test);
+DECL_PROG(parlib_pthread_blackscholes);
 
 struct kfs_entry kfs[MAX_KFS_FILES] = {
        KFS_ENTRY(roslib_proctests)
@@ -56,6 +58,8 @@ struct kfs_entry kfs[MAX_KFS_FILES] = {
        KFS_ENTRY(parlib_hello)
        KFS_ENTRY(parlib_matrix)
        KFS_ENTRY(parlib_manycore_test)
+       KFS_ENTRY(parlib_pthread_pthread_test)
+       KFS_ENTRY(parlib_pthread_blackscholes)
 };
 
 ssize_t kfs_lookup_path(char* path)
index 83346e6..55f0072 100644 (file)
@@ -205,30 +205,36 @@ void manager_waterman()
        {
                case 0:
                        printk("got here\n");
-                       envs[0] = kfs_proc_create(kfs_lookup_path("parlib_draw_nanwan_standalone"));
-                       proc_set_state(envs[0], PROC_RUNNABLE_S);
-                       proc_run(envs[0]);
+                       envs[progress] = kfs_proc_create(kfs_lookup_path("parlib_draw_nanwan_standalone"));
+                       proc_set_state(envs[progress], PROC_RUNNABLE_S);
+                       proc_run(envs[progress]);
                        break;
 
                case 1:
-                       envs[1] = kfs_proc_create(kfs_lookup_path("parlib_manycore_test"));
-                       proc_set_state(envs[1], PROC_RUNNABLE_S);
-                       proc_run(envs[1]);
+                       envs[progress] = kfs_proc_create(kfs_lookup_path("parlib_manycore_test"));
+                       proc_set_state(envs[progress], PROC_RUNNABLE_S);
+                       proc_run(envs[progress]);
                        break;
 
                case 2:
-                       envs[2] = kfs_proc_create(kfs_lookup_path("parlib_draw_nanwan_standalone"));
-                       proc_set_state(envs[2], PROC_RUNNABLE_S);
-                       proc_run(envs[2]);
+                       envs[progress] = kfs_proc_create(kfs_lookup_path("parlib_draw_nanwan_standalone"));
+                       proc_set_state(envs[progress], PROC_RUNNABLE_S);
+                       proc_run(envs[progress]);
                        break;
 
                case 3:
-                       envs[3] = kfs_proc_create(kfs_lookup_path("parlib_draw_nanwan_standalone"));
-                       //envs[3] = kfs_proc_create(kfs_lookup_path("parlib_manycore_test"));
-                       proc_set_state(envs[3], PROC_RUNNABLE_S);
-                       proc_run(envs[3]);
+                       envs[progress] = kfs_proc_create(kfs_lookup_path("parlib_pthread_pthread_test"));
+                       proc_set_state(envs[progress], PROC_RUNNABLE_S);
+                       proc_run(envs[progress]);
+                       break;
+
+               case 4:
+                       envs[progress] = kfs_proc_create(kfs_lookup_path("parlib_matrix"));
+                       proc_set_state(envs[progress], PROC_RUNNABLE_S);
+                       proc_run(envs[progress]);
                        break;
        }
+
        schedule();
 
        panic("DON'T PANIC");
index 7019506..347fb07 100644 (file)
@@ -82,13 +82,15 @@ static ssize_t sys_serial_read(env_t* e, char *DANGEROUS _buf, size_t len)
 
 static ssize_t sys_run_binary(env_t* e, void *DANGEROUS binary_buf,
                               void*DANGEROUS arg, size_t len) {
-       uint8_t *CT(len) checked_binary_buf;
-       checked_binary_buf = user_mem_assert(e, binary_buf, len, PTE_USER_RO);
-       
        uint8_t* new_binary = kmalloc(len, 0);
        if(new_binary == NULL)
                return -ENOMEM;
-       memcpy(new_binary, checked_binary_buf, len);
+       if(memcpy_from_user(e, new_binary, binary_buf, len))
+       {
+               kfree(new_binary);
+               proc_destroy(e);
+               return 0;
+       }
 
        env_t* env = env_create(new_binary, len);
        kfree(new_binary);
index a101edd..29ce67d 100644 (file)
@@ -2,6 +2,7 @@ USER_APPS_PARLIB_DIR = $(USER_APPS_DIR)/parlib
 OBJDIRS += $(USER_APPS_PARLIB_DIR)
 
 USER_APPS_PARLIB_CFLAGS    := $(USER_CFLAGS)  \
+                              -I$(USER_PARLIB_PTHREAD_DIR)/include \
                               -I$(USER_PARLIB_NEWLIB_DIR)/include \
                               -I$(USER_PARLIB_DIR)/inc
 ifeq ($(COMPILER),IVY)
@@ -13,6 +14,7 @@ USER_APPS_PARLIB_LDFLAGS   := $(USER_LDFLAGS) -static \
                               -T $(USER_APPS_PARLIB_DIR)/apps_$(TARGET_ARCH).ld
 
 USER_APPS_PARLIB_LDDIRS    := -L$(OBJDIR)/$(USER_PARLIB_DIR) \
+                              -L$(OBJDIR)/$(USER_PARLIB_PTHREAD_DIR) \
                               -L$(USER_PARLIB_NEWLIB_DIR)/lib/$(TARGET_ARCH)
 
 USER_APPS_PARLIB_LDLIBS    := --start-group -lc -lm -lg -lparlib -livyparlib --end-group
@@ -30,10 +32,12 @@ USER_APPS_PARLIB_LDOBJS    := $(OBJDIR)/$(USER_PARLIB_ARCH_SRC_DIR)/entry.o \
 USER_APPS_PARLIB_LDDEPENDS := $(USER_APPS_PARLIB_LDOBJS) \
                               $(OBJDIR)/$(USER_PARLIB_DIR)/libparlib.a \
                               $(OBJDIR)/$(USER_PARLIB_DIR)/libivyparlib.a \
-                              $(OBJDIR)/$(USER_APPS_PARLIB_DIR)/%.o       
+                              $(OBJDIR)/$(USER_APPS_PARLIB_DIR)/%.o
 
 USER_APPS_PARLIB_GCC_LIB   := $(GCC_LIB)
 
+include $(USER_APPS_PARLIB_DIR)/pthread/Makefrag
+
 $(OBJDIR)/$(USER_APPS_PARLIB_DIR)/%.o: $(USER_APPS_PARLIB_DIR)/%.c $(PATCHFILE)
        @echo + cc [APPS PARLIB] $<
        @mkdir -p $(@D)
@@ -46,4 +50,3 @@ $(OBJDIR)/$(USER_APPS_PARLIB_DIR)/%: $(USER_APPS_PARLIB_LDDEPENDS)
                     $(USER_APPS_PARLIB_LDLIBS) $(USER_APPS_PARLIB_GCC_LIB)
        $(V)$(OBJDUMP) -S $@ > $@.asm
        $(V)$(NM) -n $@ > $@.sym
-
diff --git a/user/apps/parlib/pthread/Makefrag b/user/apps/parlib/pthread/Makefrag
new file mode 100644 (file)
index 0000000..9632ece
--- /dev/null
@@ -0,0 +1,18 @@
+USER_APPS_PARLIB_PTHREAD_DIR := $(USER_APPS_PARLIB_DIR)/pthread
+
+USER_APPS_PARLIB_PTHREAD_LDLIBS := $(USER_APPS_PARLIB_LDLIBS) -lpthread
+                             
+USER_APPS_PARLIB_PTHREAD_LDDEPENDS := $(OBJDIR)/$(USER_APPS_PARLIB_PTHREAD_DIR)/%.o \
+                                      $(OBJDIR)/$(USER_PARLIB_PTHREAD_DIR)/libpthread.a \
+                                      $(USER_APPS_PARLIB_LDOBJS) \
+                                      $(OBJDIR)/$(USER_PARLIB_DIR)/libparlib.a \
+                                      $(OBJDIR)/$(USER_PARLIB_DIR)/libivyparlib.a
+
+$(OBJDIR)/$(USER_APPS_PARLIB_PTHREAD_DIR)/%: $(USER_APPS_PARLIB_PTHREAD_LDDEPENDS)
+       @echo + ld [APPS PARLIB PTHREAD] $@
+       $(V)$(LD) -o $@ $(USER_APPS_PARLIB_LDFLAGS) $@.o \
+                    $(USER_APPS_PARLIB_LDOBJS) $(USER_APPS_PARLIB_LDDIRS) \
+                    $(USER_APPS_PARLIB_PTHREAD_LDLIBS) \
+                    $(USER_APPS_PARLIB_GCC_LIB)
+       $(V)$(OBJDUMP) -S $@ > $@.asm
+       $(V)$(NM) -n $@ > $@.sym
diff --git a/user/apps/parlib/pthread/blackscholes.c b/user/apps/parlib/pthread/blackscholes.c
new file mode 100644 (file)
index 0000000..09d3b8e
--- /dev/null
@@ -0,0 +1,537 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// Copyright (c) 2007 Intel Corp.
+
+// Black-Scholes
+// Analytical method for calculating European Options
+//
+// 
+// Reference Source: Options, Futures, and Other Derivatives, 3rd Edition, Prentice 
+// Hall, John C. Hull,
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#ifdef ENABLE_PARSEC_HOOKS
+#include <hooks.h>
+#endif
+
+// Multi-threaded pthreads header
+#ifdef ENABLE_THREADS
+#define MAX_THREADS 128
+// Add the following line so that icc 9.0 is compatible with pthread lib.
+#define __thread __threadp  
+
+#ifdef _XOPEN_SOURCE
+#undef _XOPEN_SOURCE
+#define _XOPEN_SOURCE 700
+#endif
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#ifndef __USE_XOPEN2K
+#define __USE_XOPEN2K
+#endif
+#ifndef __USE_UNIX98
+#define __USE_UNIX98
+#endif
+#include <pthread.h>
+#include <time.h>
+
+pthread_t _M4_threadsTable[MAX_THREADS];
+pthread_mutexattr_t _M4_normalMutexAttr;
+int _M4_numThreads = MAX_THREADS;
+
+#undef __thread
+pthread_barrier_t barrier;;
+#endif
+
+// Multi-threaded OpenMP header
+#ifdef ENABLE_OPENMP
+#include <omp.h>
+#endif
+
+// Multi-threaded header for Windows
+#ifdef WIN32
+#pragma warning(disable : 4305)
+#pragma warning(disable : 4244)
+#include <windows.h>
+#define MAX_THREADS 128
+#endif
+
+//Precision to use for calculations
+#define fptype float
+
+#define NUM_RUNS 100
+
+typedef struct OptionData_ {
+        fptype s;          // spot price
+        fptype strike;     // strike price
+        fptype r;          // risk-free interest rate
+        fptype divq;       // dividend rate
+        fptype v;          // volatility
+        fptype t;          // time to maturity or option expiration in years 
+                           //     (1yr = 1.0, 6mos = 0.5, 3mos = 0.25, ..., etc)  
+        const char *OptionType;  // Option type.  "P"=PUT, "C"=CALL
+        fptype divs;       // dividend vals (not used in this test)
+        fptype DGrefval;   // DerivaGem Reference Value
+} OptionData;
+
+//++  modified by xiongww
+
+OptionData data_init[] = {
+    #include "optionData.txt"
+};
+
+OptionData *data;
+fptype *prices;
+int numOptions;
+
+//--
+
+int    * otype;
+fptype * sptprice;
+fptype * strike;
+fptype * rate;
+fptype * volatility;
+fptype * otime;
+int numError = 0;
+int nThreads;
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+// Cumulative Normal Distribution Function
+// See Hull, Section 11.8, P.243-244
+#define inv_sqrt_2xPI 0.39894228040143270286
+
+fptype CNDF ( fptype InputX ) 
+{
+    int sign;
+
+    fptype OutputX;
+    fptype xInput;
+    fptype xNPrimeofX;
+    fptype expValues;
+    fptype xK2;
+    fptype xK2_2, xK2_3;
+    fptype xK2_4, xK2_5;
+    fptype xLocal, xLocal_1;
+    fptype xLocal_2, xLocal_3;
+
+    // Check for negative value of InputX
+    if (InputX < 0.0) {
+        InputX = -InputX;
+        sign = 1;
+    } else 
+        sign = 0;
+
+    xInput = InputX;
+    // Compute NPrimeX term common to both four & six decimal accuracy calcs
+    expValues = exp(-0.5f * InputX * InputX);
+    xNPrimeofX = expValues;
+    xNPrimeofX = xNPrimeofX * inv_sqrt_2xPI;
+
+    xK2 = 0.2316419 * xInput;
+    xK2 = 1.0 + xK2;
+    xK2 = 1.0 / xK2;
+    xK2_2 = xK2 * xK2;
+    xK2_3 = xK2_2 * xK2;
+    xK2_4 = xK2_3 * xK2;
+    xK2_5 = xK2_4 * xK2;
+    
+    xLocal_1 = xK2 * 0.319381530;
+    xLocal_2 = xK2_2 * (-0.356563782);
+    xLocal_3 = xK2_3 * 1.781477937;
+    xLocal_2 = xLocal_2 + xLocal_3;
+    xLocal_3 = xK2_4 * (-1.821255978);
+    xLocal_2 = xLocal_2 + xLocal_3;
+    xLocal_3 = xK2_5 * 1.330274429;
+    xLocal_2 = xLocal_2 + xLocal_3;
+
+    xLocal_1 = xLocal_2 + xLocal_1;
+    xLocal   = xLocal_1 * xNPrimeofX;
+    xLocal   = 1.0 - xLocal;
+
+    OutputX  = xLocal;
+    
+    if (sign) {
+        OutputX = 1.0 - OutputX;
+    }
+    
+    return OutputX;
+} 
+
+// For debugging
+void print_xmm(fptype in, char* s) {
+    printf("%s: %f\n", s, in);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////
+fptype BlkSchlsEqEuroNoDiv( fptype sptprice,
+                            fptype strike, fptype rate, fptype volatility,
+                            fptype time, int otype, float timet )    
+{
+    fptype OptionPrice;
+
+    // local private working variables for the calculation
+    fptype xStockPrice;
+    fptype xStrikePrice;
+    fptype xRiskFreeRate;
+    fptype xVolatility;
+    fptype xTime;
+    fptype xSqrtTime;
+
+    fptype logValues;
+    fptype xLogTerm;
+    fptype xD1; 
+    fptype xD2;
+    fptype xPowerTerm;
+    fptype xDen;
+    fptype d1;
+    fptype d2;
+    fptype FutureValueX;
+    fptype NofXd1;
+    fptype NofXd2;
+    fptype NegNofXd1;
+    fptype NegNofXd2;    
+    
+    xStockPrice = sptprice;
+    xStrikePrice = strike;
+    xRiskFreeRate = rate;
+    xVolatility = volatility;
+
+    xTime = time;
+    xSqrtTime = sqrt(xTime);
+
+    logValues = log( sptprice / strike );
+        
+    xLogTerm = logValues;
+        
+    
+    xPowerTerm = xVolatility * xVolatility;
+    xPowerTerm = xPowerTerm * 0.5;
+        
+    xD1 = xRiskFreeRate + xPowerTerm;
+    xD1 = xD1 * xTime;
+    xD1 = xD1 + xLogTerm;
+
+    xDen = xVolatility * xSqrtTime;
+    xD1 = xD1 / xDen;
+    xD2 = xD1 -  xDen;
+
+    d1 = xD1;
+    d2 = xD2;
+    
+    NofXd1 = CNDF( d1 );
+    NofXd2 = CNDF( d2 );
+
+    FutureValueX = strike * ( exp( -(rate)*(time) ) );        
+    if (otype == 0) {            
+        OptionPrice = (sptprice * NofXd1) - (FutureValueX * NofXd2);
+    } else { 
+        NegNofXd1 = (1.0 - NofXd1);
+        NegNofXd2 = (1.0 - NofXd2);
+        OptionPrice = (FutureValueX * NegNofXd2) - (sptprice * NegNofXd1);
+    }
+    
+    return OptionPrice;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////
+#ifdef WIN32
+DWORD WINAPI bs_thread(LPVOID tid_ptr){
+#else
+int bs_thread(void *tid_ptr) {
+#endif
+    int i, j;
+    fptype price;
+    fptype priceDelta;
+    int tid = *(int *)tid_ptr;
+    int start = tid * (numOptions / nThreads);
+    int end = start + (numOptions / nThreads);
+
+//printf("Thread %d at barrier.\n", tid);
+
+#ifdef ENABLE_THREADS
+    pthread_barrier_wait(&(barrier));
+#endif
+
+
+    for (j=0; j<NUM_RUNS; j++) {
+#ifdef ENABLE_OPENMP
+#pragma omp parallel for
+        for (i=0; i<numOptions; i++) {
+#else  //ENABLE_OPENMP
+        for (i=start; i<end; i++) {
+#endif //ENABLE_OPENMP
+            /* Calling main function to calculate option value based on 
+             * Black & Sholes's equation.
+             */
+//printf("Thread %d performing computation.( %d, %d ) \n", tid,j,i);
+
+            price = BlkSchlsEqEuroNoDiv( sptprice[i], strike[i],
+                                         rate[i], volatility[i], otime[i], 
+                                         otype[i], 0);
+            prices[i] = price;
+            
+#ifdef ERR_CHK   
+            priceDelta = data[i].DGrefval - price;
+            if( fabs(priceDelta) >= 1e-4 ){
+                printf("Error on %d. Computed=%.5f, Ref=%.5f, Delta=%.5f\n",
+                       i, price, data[i].DGrefval, priceDelta);
+                numError ++;
+            }
+#endif
+        }
+    }
+
+    return 0;
+}
+
+int main (int argc, char **argv)
+{
+    int i;
+    int loopnum;
+    fptype * buffer;
+    int * buffer2;
+    int initOptionNum;
+#ifdef PARSEC_VERSION
+#define __PARSEC_STRING(x) #x
+#define __PARSEC_XSTRING(x) __PARSEC_STRING(x)
+        printf("PARSEC Benchmark Suite Version "__PARSEC_XSTRING(PARSEC_VERSION)"\n");
+       fflush(NULL);
+#else
+        printf("PARSEC Benchmark Suite\n");
+       fflush(NULL);
+#endif //PARSEC_VERSION
+#ifdef ENABLE_PARSEC_HOOKS
+   __parsec_bench_begin(__parsec_blackscholes);
+#endif
+
+   if (argc != 3)
+        {
+                printf("Usage:\n\t%s <nthreads> <numOptions>\n", argv[0]);
+                exit(1);
+        }
+    nThreads = atoi(argv[1]);
+    numOptions = atoi(argv[2]);
+
+    if(nThreads > numOptions) {
+      printf("WARNING: Not enough work, reducing number of threads to match number of options.");
+      nThreads = numOptions;
+    }
+
+#if !defined(ENABLE_THREADS) && !defined(ENABLE_OPENMP)
+    if(nThreads != 1) {
+        printf("Error: <nthreads> must be 1 (serial version)\n");
+        exit(1);
+    }
+#endif
+
+    // alloc spaces for the option data
+    data = (OptionData*)malloc(numOptions*sizeof(OptionData));
+    prices = (fptype*)malloc(numOptions*sizeof(fptype));
+    // initialize the data array
+    initOptionNum =  ( (sizeof(data_init)) / sizeof(OptionData) );
+    for ( loopnum = 0; loopnum < numOptions; ++ loopnum )   
+    {
+       OptionData *temp = data_init + loopnum%initOptionNum;
+       data[loopnum].OptionType = (const char*)malloc(strlen(temp->OptionType)+1);
+        strcpy((char *)(data[loopnum].OptionType), temp->OptionType);
+       data[loopnum].s = temp->s;
+       data[loopnum].strike = temp->strike;
+       data[loopnum].r = temp->r;
+       data[loopnum].divq = temp->divq;
+       data[loopnum].v = temp->v;
+       data[loopnum].t = temp->t;
+       data[loopnum].divs = temp->divs;
+       data[loopnum].DGrefval = temp->DGrefval;
+    }
+#ifdef ENABLE_THREADS
+    
+    pthread_mutexattr_init( &_M4_normalMutexAttr);
+//    pthread_mutexattr_settype( &_M4_normalMutexAttr, PTHREAD_MUTEX_NORMAL);
+    _M4_numThreads = nThreads;
+    {
+        int _M4_i;
+        for ( _M4_i = 0; _M4_i < MAX_THREADS; _M4_i++) {
+            _M4_threadsTable[_M4_i] = pthread_self();
+        }
+    }
+;
+    pthread_barrier_init(&(barrier),NULL,_M4_numThreads);;
+#endif
+    printf("Num of Options: %d\n", numOptions);
+    printf("Num of Runs: %d\n", NUM_RUNS);
+
+#define PAD 256
+#define LINESIZE 64
+   
+    buffer = (fptype *) malloc(5 * numOptions * sizeof(fptype) + PAD);
+    sptprice = (fptype *) (((unsigned long)buffer + PAD) & ~(LINESIZE - 1));
+    strike = sptprice + numOptions;
+    rate = strike + numOptions;
+    volatility = rate + numOptions;
+    otime = volatility + numOptions;
+    
+    buffer2 = (int *) malloc(numOptions * sizeof(fptype) + PAD);
+    otype = (int *) (((unsigned long)buffer2 + PAD) & ~(LINESIZE - 1));
+    
+    for (i=0; i<numOptions; i++) {
+        otype[i]      = (data[i].OptionType[0] == 'P') ? 1 : 0;
+        sptprice[i]   = data[i].s;
+        strike[i]     = data[i].strike;
+        rate[i]       = data[i].r;
+        volatility[i] = data[i].v;    
+        otime[i]      = data[i].t;
+    }
+    
+    printf("Size of data: %d\n", numOptions * (sizeof(OptionData) + sizeof(int)));
+
+#ifdef ENABLE_PARSEC_HOOKS
+    __parsec_roi_begin();
+#endif
+#ifdef ENABLE_THREADS
+    int tids[nThreads];
+    for(i=0; i<nThreads-1; i++) {
+//printf("Creating thread %d of %d\n", i, nThreads);
+        tids[i]=i;
+        
+    {
+        int _M4_i;
+        printf("create with arg\n");
+        for ( _M4_i = 0; _M4_i < MAX_THREADS; _M4_i++) {
+            if ( _M4_threadsTable[_M4_i] == pthread_self())    break;
+        }
+                printf("tid=%d %d\n", _M4_i, _M4_threadsTable[_M4_i]);
+        pthread_create(&_M4_threadsTable[_M4_i],NULL,(void *(*)(void *))bs_thread,(void *)&tids[i]);
+    }
+;
+    }
+    tids[nThreads-1] = nThreads-1;
+    bs_thread(&tids[nThreads-1]);
+    
+    {
+        int _M4_i;
+        void *_M4_ret;
+        for ( _M4_i = 0; _M4_i < MAX_THREADS;_M4_i++) {
+            printf("tid=%d %d\n", _M4_i, _M4_threadsTable[_M4_i]);
+            if ( _M4_threadsTable[_M4_i] == pthread_self())    break;
+            pthread_join( _M4_threadsTable[_M4_i], &_M4_ret);
+        }
+    }
+;
+#else//ENABLE_THREADS
+#ifdef ENABLE_OPENMP
+    {
+        int tid=0;
+        omp_set_num_threads(nThreads);
+        bs_thread(&tid);
+    }
+#else //ENABLE_OPENMP
+#ifdef WIN32 
+    if (nThreads > 1)
+    {
+        HANDLE threads[MAX_THREADS];
+                int nums[MAX_THREADS];
+                for(i=0; i<nThreads; i++) {
+                        nums[i] = i;
+                        threads[i] = CreateThread(0, 0, bs_thread, &nums[i], 0, 0);
+                }
+                WaitForMultipleObjects(nThreads, threads, TRUE, INFINITE);
+    } else
+#endif
+    {
+        int tid=0;
+        bs_thread(&tid);
+    }
+#endif //ENABLE_OPENMP
+#endif //ENABLE_THREADS
+#ifdef ENABLE_PARSEC_HOOKS
+    __parsec_roi_end();
+#endif
+
+#ifdef ERR_CHK
+    printf("Num Errors: %d\n", numError);
+#endif
+    for (loopnum = 0; loopnum < numOptions; ++ loopnum)
+    {
+       free((void *)(data[loopnum].OptionType));
+    }
+    free(data);
+    free(prices);
+
+#ifdef ENABLE_PARSEC_HOOKS
+    __parsec_bench_end();
+#endif
+
+    return 0;
+}
+
diff --git a/user/apps/parlib/pthread/optionData.txt b/user/apps/parlib/pthread/optionData.txt
new file mode 100644 (file)
index 0000000..b713ce3
--- /dev/null
@@ -0,0 +1,1004 @@
+//    #include file of test data inpout params and DerivaGem control reference value
+//
+// S,     K,      r,        q,      vol,    T,     P/C,    Divs,        DG RefValue
+
+{42.00,   40.00,  0.1000,   0.00,   0.20,   0.50,   "C",   0.00,   4.759423036851750000},
+{42.00,   40.00,  0.1000,   0.00,   0.20,   0.50,   "P",   0.00,   0.808600016880314000},
+{100.00,   100.00,  0.0500,   0.00,   0.15,   1.00,   "P",   0.00,   3.714602051381290000},
+{100.00,   100.00,  0.0500,   0.00,   0.15,   1.00,   "C",   0.00,   8.591659601309890000},
+{60.00,   65.00,  0.0800,   0.00,   0.30,   0.25,   "C",   0.00,   2.133371966735750000},
+{100.00,   90.00,  0.1000,   0.00,   0.10,   0.10,   "C",   0.00,   10.895610714794000000},
+{100.00,   90.00,  0.1000,   0.00,   0.10,   0.50,   "C",   0.00,   14.421570828843300000},
+{100.00,   90.00,  0.1000,   0.00,   0.10,   1.00,   "C",   0.00,   18.630859120667500000},
+{100.00,   100.00,  0.1000,   0.00,   0.10,   0.10,   "C",   0.00,   1.814984118378420000},
+{100.00,   100.00,  0.1000,   0.00,   0.10,   0.50,   "C",   0.00,   5.850273604284980000},
+{100.00,   100.00,  0.1000,   0.00,   0.10,   1.00,   "C",   0.00,   10.308147243666800000},
+{100.00,   110.00,  0.1000,   0.00,   0.10,   0.10,   "C",   0.00,   0.003523074865584340},
+{100.00,   110.00,  0.1000,   0.00,   0.10,   0.50,   "C",   0.00,   1.140722843827410000},
+{100.00,   110.00,  0.1000,   0.00,   0.10,   1.00,   "C",   0.00,   4.216747020308850000},
+{100.00,   90.00,  0.1000,   0.00,   0.25,   0.10,   "C",   0.00,   11.135244618346700000},
+{100.00,   90.00,  0.1000,   0.00,   0.25,   0.50,   "C",   0.00,   16.092638844092300000},
+{100.00,   90.00,  0.1000,   0.00,   0.25,   1.00,   "C",   0.00,   21.163454658480100000},
+{100.00,   100.00,  0.1000,   0.00,   0.25,   0.10,   "C",   0.00,   3.659962660310000000},
+{100.00,   100.00,  0.1000,   0.00,   0.25,   0.50,   "C",   0.00,   9.582231441086730000},
+{100.00,   100.00,  0.1000,   0.00,   0.25,   1.00,   "C",   0.00,   14.975798441718900000},
+{100.00,   110.00,  0.1000,   0.00,   0.25,   0.10,   "C",   0.00,   0.589613262035413000},
+{100.00,   110.00,  0.1000,   0.00,   0.25,   0.50,   "C",   0.00,   5.123575416865320000},
+{100.00,   110.00,  0.1000,   0.00,   0.25,   1.00,   "C",   0.00,   10.160055944516600000},
+{100.00,   90.00,  0.1000,   0.00,   0.50,   0.10,   "C",   0.00,   12.919509619564700000},
+{100.00,   90.00,  0.1000,   0.00,   0.50,   0.50,   "C",   0.00,   21.438280655724400000},
+{100.00,   90.00,  0.1000,   0.00,   0.50,   1.00,   "C",   0.00,   28.643647264488200000},
+{100.00,   100.00,  0.1000,   0.00,   0.50,   0.10,   "C",   0.00,   6.779936664291260000},
+{100.00,   100.00,  0.1000,   0.00,   0.50,   0.50,   "C",   0.00,   16.263193147074300000},
+{100.00,   100.00,  0.1000,   0.00,   0.50,   1.00,   "C",   0.00,   23.926745214162700000},
+{100.00,   110.00,  0.1000,   0.00,   0.50,   0.10,   "C",   0.00,   3.061909566605540000},
+{100.00,   110.00,  0.1000,   0.00,   0.50,   0.50,   "C",   0.00,   12.155688815568700000},
+{100.00,   110.00,  0.1000,   0.00,   0.50,   1.00,   "C",   0.00,   19.929858372066300000},
+{100.00,   90.00,  0.1000,   0.00,   0.10,   0.10,   "P",   0.00,   0.000095752219082624},
+{100.00,   90.00,  0.1000,   0.00,   0.10,   0.50,   "P",   0.00,   0.032219033907538300},
+{100.00,   90.00,  0.1000,   0.00,   0.10,   1.00,   "P",   0.00,   0.066226743903883000},
+{100.00,   100.00,  0.1000,   0.00,   0.10,   0.10,   "P",   0.00,   0.819967493295226000},
+{100.00,   100.00,  0.1000,   0.00,   0.10,   0.50,   "P",   0.00,   0.973216054356396000},
+{100.00,   100.00,  0.1000,   0.00,   0.10,   1.00,   "P",   0.00,   0.791889047262800000},
+{100.00,   110.00,  0.1000,   0.00,   0.10,   0.10,   "P",   0.00,   8.909004787274070000},
+{100.00,   110.00,  0.1000,   0.00,   0.10,   0.50,   "P",   0.00,   5.775959538905960000},
+{100.00,   110.00,  0.1000,   0.00,   0.10,   1.00,   "P",   0.00,   3.748863004264400000},
+{100.00,   90.00,  0.1000,   0.00,   0.25,   0.10,   "P",   0.00,   0.239729655771796000},
+{100.00,   90.00,  0.1000,   0.00,   0.25,   0.50,   "P",   0.00,   1.703287049156570000},
+{100.00,   90.00,  0.1000,   0.00,   0.25,   1.00,   "P",   0.00,   2.598822281716470000},
+{100.00,   100.00,  0.1000,   0.00,   0.25,   0.10,   "P",   0.00,   2.664946035226810000},
+{100.00,   100.00,  0.1000,   0.00,   0.25,   0.50,   "P",   0.00,   4.705173891158130000},
+{100.00,   100.00,  0.1000,   0.00,   0.25,   1.00,   "P",   0.00,   5.459540245314840000},
+{100.00,   110.00,  0.1000,   0.00,   0.25,   0.10,   "P",   0.00,   9.495094974443900000},
+{100.00,   110.00,  0.1000,   0.00,   0.25,   0.50,   "P",   0.00,   9.758812111943870000},
+{100.00,   110.00,  0.1000,   0.00,   0.25,   1.00,   "P",   0.00,   9.692171928472170000},
+{100.00,   90.00,  0.1000,   0.00,   0.50,   0.10,   "P",   0.00,   2.023994656989830000},
+{100.00,   90.00,  0.1000,   0.00,   0.50,   0.50,   "P",   0.00,   7.048928860788620000},
+{100.00,   90.00,  0.1000,   0.00,   0.50,   1.00,   "P",   0.00,   10.079014887724600000},
+{100.00,   100.00,  0.1000,   0.00,   0.50,   0.10,   "P",   0.00,   5.784920039208060000},
+{100.00,   100.00,  0.1000,   0.00,   0.50,   0.50,   "P",   0.00,   11.386135597145700000},
+{100.00,   100.00,  0.1000,   0.00,   0.50,   1.00,   "P",   0.00,   14.410487017758700000},
+{100.00,   110.00,  0.1000,   0.00,   0.50,   0.10,   "P",   0.00,   11.967391279014000000},
+{100.00,   110.00,  0.1000,   0.00,   0.50,   0.50,   "P",   0.00,   16.790925510647200000},
+{100.00,   110.00,  0.1000,   0.00,   0.50,   1.00,   "P",   0.00,   19.461974356021900000},
+{50.00,   41.25,  0.1000,   0.00,   0.10,   0.10,   "C",   0.00,   9.160444357863210000},
+{50.00,   41.25,  0.1000,   0.00,   0.10,   0.50,   "C",   0.00,   10.762029464848100000},
+{50.00,   41.25,  0.1000,   0.00,   0.10,   1.00,   "C",   0.00,   12.677609097740100000},
+{50.00,   50.00,  0.1000,   0.00,   0.10,   0.10,   "C",   0.00,   0.907492059189209000},
+{50.00,   50.00,  0.1000,   0.00,   0.10,   0.50,   "C",   0.00,   2.925136802142490000},
+{50.00,   50.00,  0.1000,   0.00,   0.10,   1.00,   "C",   0.00,   5.154073621833420000},
+{50.00,   60.75,  0.1000,   0.00,   0.10,   0.10,   "C",   0.00,   0.000000000717454849},
+{50.00,   60.75,  0.1000,   0.00,   0.10,   0.50,   "C",   0.00,   0.028414779953288100},
+{50.00,   60.75,  0.1000,   0.00,   0.10,   1.00,   "C",   0.00,   0.481908128709845000},
+{50.00,   41.25,  0.1000,   0.00,   0.25,   0.10,   "C",   0.00,   9.166378741739160000},
+{50.00,   41.25,  0.1000,   0.00,   0.25,   0.50,   "C",   0.00,   11.066856943917300000},
+{50.00,   41.25,  0.1000,   0.00,   0.25,   1.00,   "C",   0.00,   13.316909764810900000},
+{50.00,   50.00,  0.1000,   0.00,   0.25,   0.10,   "C",   0.00,   1.829981330155000000},
+{50.00,   50.00,  0.1000,   0.00,   0.25,   0.50,   "C",   0.00,   4.791115720543370000},
+{50.00,   50.00,  0.1000,   0.00,   0.25,   1.00,   "C",   0.00,   7.487899220859440000},
+{50.00,   60.75,  0.1000,   0.00,   0.25,   0.10,   "C",   0.00,   0.014232371738726200},
+{50.00,   60.75,  0.1000,   0.00,   0.25,   0.50,   "C",   0.00,   1.102318710852480000},
+{50.00,   60.75,  0.1000,   0.00,   0.25,   1.00,   "C",   0.00,   3.104764376468200000},
+{50.00,   41.25,  0.1000,   0.00,   0.50,   0.10,   "C",   0.00,   9.499149830045080000},
+{50.00,   41.25,  0.1000,   0.00,   0.50,   0.50,   "C",   0.00,   13.034624930353100000},
+{50.00,   41.25,  0.1000,   0.00,   0.50,   1.00,   "C",   0.00,   16.348279176395100000},
+{50.00,   50.00,  0.1000,   0.00,   0.50,   0.10,   "C",   0.00,   3.389968332145630000},
+{50.00,   50.00,  0.1000,   0.00,   0.50,   0.50,   "C",   0.00,   8.131596573537150000},
+{50.00,   50.00,  0.1000,   0.00,   0.50,   1.00,   "C",   0.00,   11.963372607081400000},
+{50.00,   60.75,  0.1000,   0.00,   0.50,   0.10,   "C",   0.00,   0.517721140543361000},
+{50.00,   60.75,  0.1000,   0.00,   0.50,   0.50,   "C",   0.00,   4.285755504631100000},
+{50.00,   60.75,  0.1000,   0.00,   0.50,   1.00,   "C",   0.00,   8.058110917563740000},
+{50.00,   41.25,  0.1000,   0.00,   0.10,   0.10,   "P",   0.00,   0.000000000016396475},
+{50.00,   41.25,  0.1000,   0.00,   0.10,   0.50,   "P",   0.00,   0.000243225502595658},
+{50.00,   41.25,  0.1000,   0.00,   0.10,   1.00,   "P",   0.00,   0.002152591723420370},
+{50.00,   50.00,  0.1000,   0.00,   0.10,   0.10,   "P",   0.00,   0.409983746647613000},
+{50.00,   50.00,  0.1000,   0.00,   0.10,   0.50,   "P",   0.00,   0.486608027178198000},
+{50.00,   50.00,  0.1000,   0.00,   0.10,   1.00,   "P",   0.00,   0.395944523631400000},
+{50.00,   60.75,  0.1000,   0.00,   0.10,   0.10,   "P",   0.00,   10.145527400979400000},
+{50.00,   60.75,  0.1000,   0.00,   0.10,   0.50,   "P",   0.00,   7.815602318371660000},
+{50.00,   60.75,  0.1000,   0.00,   0.10,   1.00,   "P",   0.00,   5.450781274394380000},
+{50.00,   41.25,  0.1000,   0.00,   0.25,   0.10,   "P",   0.00,   0.005934383892338090},
+{50.00,   41.25,  0.1000,   0.00,   0.25,   0.50,   "P",   0.00,   0.305070704571745000},
+{50.00,   41.25,  0.1000,   0.00,   0.25,   1.00,   "P",   0.00,   0.641453258794187000},
+{50.00,   50.00,  0.1000,   0.00,   0.25,   0.10,   "P",   0.00,   1.332473017613400000},
+{50.00,   50.00,  0.1000,   0.00,   0.25,   0.50,   "P",   0.00,   2.352586945579070000},
+{50.00,   50.00,  0.1000,   0.00,   0.25,   1.00,   "P",   0.00,   2.729770122657420000},
+{50.00,   60.75,  0.1000,   0.00,   0.25,   0.10,   "P",   0.00,   10.159759772000700000},
+{50.00,   60.75,  0.1000,   0.00,   0.25,   0.50,   "P",   0.00,   8.889506249270860000},
+{50.00,   60.75,  0.1000,   0.00,   0.25,   1.00,   "P",   0.00,   8.073637522152740000},
+{50.00,   41.25,  0.1000,   0.00,   0.50,   0.10,   "P",   0.00,   0.338705472198261000},
+{50.00,   41.25,  0.1000,   0.00,   0.50,   0.50,   "P",   0.00,   2.272838691007510000},
+{50.00,   41.25,  0.1000,   0.00,   0.50,   1.00,   "P",   0.00,   3.672822670378400000},
+{50.00,   50.00,  0.1000,   0.00,   0.50,   0.10,   "P",   0.00,   2.892460019604030000},
+{50.00,   50.00,  0.1000,   0.00,   0.50,   0.50,   "P",   0.00,   5.693067798572860000},
+{50.00,   50.00,  0.1000,   0.00,   0.50,   1.00,   "P",   0.00,   7.205243508879350000},
+{50.00,   60.75,  0.1000,   0.00,   0.50,   0.10,   "P",   0.00,   10.663248540805300000},
+{50.00,   60.75,  0.1000,   0.00,   0.50,   0.50,   "P",   0.00,   12.072943043049500000},
+{50.00,   60.75,  0.1000,   0.00,   0.50,   1.00,   "P",   0.00,   13.026984063248300000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.10,   "C",   0.00,   10.247401000886400000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.50,   "C",   0.00,   11.355496680087600000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   1.00,   "C",   0.00,   12.841685844358700000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.10,   "C",   0.00,   1.401851512188630000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.50,   "C",   0.00,   3.536661968725870000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   1.00,   "C",   0.00,   5.437616879373150000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.10,   "C",   0.00,   0.001633213370202900},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.50,   "C",   0.00,   0.454070380213948000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   1.00,   "C",   0.00,   1.532588879532600000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.10,   "C",   0.00,   10.541889432392700000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.50,   "C",   0.00,   13.710780949068900000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   1.00,   "C",   0.00,   16.827677195009300000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.10,   "C",   0.00,   3.287983325881400000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.50,   "C",   0.00,   7.698994752653710000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   1.00,   "C",   0.00,   11.227983057006400000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.10,   "C",   0.00,   0.492789615196492000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.50,   "C",   0.00,   3.858921644731480000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   1.00,   "C",   0.00,   7.162832542185690000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.10,   "C",   0.00,   12.443070129340600000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.50,   "C",   0.00,   19.594067641915700000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   1.00,   "C",   0.00,   25.369048485340600000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.10,   "C",   0.00,   6.430883891711170000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.50,   "C",   0.00,   14.629031944250100000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   1.00,   "C",   0.00,   20.858610524946800000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.10,   "C",   0.00,   2.855401894418240000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.50,   "C",   0.00,   10.762095702746800000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   1.00,   "C",   0.00,   17.109364250968300000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.10,   "P",   0.00,   0.000241001647596191},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.50,   "P",   0.00,   0.126465632121558000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   1.00,   "P",   0.00,   0.400407274169526000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.10,   "P",   0.00,   1.127229290812220000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.50,   "P",   0.00,   2.171071915430270000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   1.00,   "P",   0.00,   2.725085134718540000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.10,   "P",   0.00,   9.699548769856150000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.50,   "P",   0.00,   8.951921321588780000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   1.00,   "P",   0.00,   8.548803960412530000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.10,   "P",   0.00,   0.294729433153974000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.50,   "P",   0.00,   2.481749901102830000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   1.00,   "P",   0.00,   4.386398624820130000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.10,   "P",   0.00,   3.013361104504980000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.50,   "P",   0.00,   6.333404699358100000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   1.00,   "P",   0.00,   8.515451312351790000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.10,   "P",   0.00,   10.190705171682400000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.50,   "P",   0.00,   12.356772586106300000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   1.00,   "P",   0.00,   14.179047623065600000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.10,   "P",   0.00,   2.195910130101800000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.50,   "P",   0.00,   8.365036593949600000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   1.00,   "P",   0.00,   12.927769915151500000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.10,   "P",   0.00,   6.156261670334750000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.50,   "P",   0.00,   13.263441890954500000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   1.00,   "P",   0.00,   18.146078780292200000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.10,   "P",   0.00,   12.553317450904200000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.50,   "P",   0.00,   19.259946644121600000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   1.00,   "P",   0.00,   24.125579331848300000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.10,   "C",   0.00,   8.863281666392300000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.50,   "C",   0.00,   9.314944657044040000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   1.00,   "C",   0.00,   9.890867970305360000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.10,   "C",   0.00,   0.700925756094317000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.50,   "C",   0.00,   1.768330984362940000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   1.00,   "C",   0.00,   2.718808439686570000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.10,   "C",   0.00,   0.000000000170861147},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.50,   "C",   0.00,   0.006433878180657690},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   1.00,   "C",   0.00,   0.106190314866700000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.10,   "C",   0.00,   8.871203986520360000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.50,   "C",   0.00,   9.791475497647290000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   1.00,   "C",   0.00,   11.030984382704700000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.10,   "C",   0.00,   1.643991662940700000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.50,   "C",   0.00,   3.849497376326850000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   1.00,   "C",   0.00,   5.613991528503190000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.10,   "C",   0.00,   0.010849363947345100},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.50,   "C",   0.00,   0.768274495718033000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   1.00,   "C",   0.00,   2.036957925438520000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.10,   "C",   0.00,   9.237479294160510000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.50,   "C",   0.00,   12.055228107416700000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   1.00,   "C",   0.00,   14.655915985561400000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.10,   "C",   0.00,   3.215441945855580000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.50,   "C",   0.00,   7.314515972125060000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   1.00,   "C",   0.00,   10.429305262473400000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.10,   "C",   0.00,   0.473089228156817000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.50,   "C",   0.00,   3.727049105818880000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   1.00,   "C",   0.00,   6.800854032435260000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.10,   "P",   0.00,   0.000000000074528552},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.50,   "P",   0.00,   0.001638760059608080},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   1.00,   "P",   0.00,   0.021948625635337300},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.10,   "P",   0.00,   0.563614645406109000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.50,   "P",   0.00,   1.085535957715130000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   1.00,   "P",   0.00,   1.362542567359270000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.10,   "P",   0.00,   10.583167000684700000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.50,   "P",   0.00,   9.926837920803580000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   1.00,   "P",   0.00,   9.208327279989030000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.10,   "P",   0.00,   0.007922320202584000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.50,   "P",   0.00,   0.478169600662851000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   1.00,   "P",   0.00,   1.162065038034680000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.10,   "P",   0.00,   1.506680552252490000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.50,   "P",   0.00,   3.166702349679050000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   1.00,   "P",   0.00,   4.257725656175890000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.10,   "P",   0.00,   10.594016364461200000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.50,   "P",   0.00,   10.688678538341000000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   1.00,   "P",   0.00,   11.139094890560900000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.10,   "P",   0.00,   0.374197627842735000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.50,   "P",   0.00,   2.741922210432270000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   1.00,   "P",   0.00,   4.786996640891410000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.10,   "P",   0.00,   3.078130835167380000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.50,   "P",   0.00,   6.631720945477260000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   1.00,   "P",   0.00,   9.073039390146110000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.10,   "P",   0.00,   11.056256228670600000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.50,   "P",   0.00,   13.647453148441800000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   1.00,   "P",   0.00,   15.902990997557600000},
+{100.00,   90.00,  0.0500,   0.00,   0.10,   0.10,   "C",   0.00,   10.449058766801200000},
+{100.00,   90.00,  0.0500,   0.00,   0.10,   0.50,   "C",   0.00,   12.306754042912400000},
+{100.00,   90.00,  0.0500,   0.00,   0.10,   1.00,   "C",   0.00,   14.628840237721800000},
+{100.00,   100.00,  0.0500,   0.00,   0.10,   0.10,   "C",   0.00,   1.523436713687610000},
+{100.00,   100.00,  0.0500,   0.00,   0.10,   0.50,   "C",   0.00,   4.192271110733870000},
+{100.00,   100.00,  0.0500,   0.00,   0.10,   1.00,   "C",   0.00,   6.804962968028710000},
+{100.00,   110.00,  0.0500,   0.00,   0.10,   0.10,   "C",   0.00,   0.002083505050676660},
+{100.00,   110.00,  0.0500,   0.00,   0.10,   0.50,   "C",   0.00,   0.616571484986525000},
+{100.00,   110.00,  0.0500,   0.00,   0.10,   1.00,   "C",   0.00,   2.173950441155820000},
+{100.00,   90.00,  0.0500,   0.00,   0.25,   0.10,   "C",   0.00,   10.725497846854800000},
+{100.00,   90.00,  0.0500,   0.00,   0.25,   0.50,   "C",   0.00,   14.437116290052900000},
+{100.00,   90.00,  0.0500,   0.00,   0.25,   1.00,   "C",   0.00,   18.140770068154800000},
+{100.00,   100.00,  0.0500,   0.00,   0.25,   0.10,   "C",   0.00,   3.400893835697680000},
+{100.00,   100.00,  0.0500,   0.00,   0.25,   0.50,   "C",   0.00,   8.260004605682270000},
+{100.00,   100.00,  0.0500,   0.00,   0.25,   1.00,   "C",   0.00,   12.335986235067200000},
+{100.00,   110.00,  0.0500,   0.00,   0.25,   0.10,   "C",   0.00,   0.521347622182002000},
+{100.00,   110.00,  0.0500,   0.00,   0.25,   0.50,   "C",   0.00,   4.225788960901320000},
+{100.00,   110.00,  0.0500,   0.00,   0.25,   1.00,   "C",   0.00,   8.026371324891460000},
+{100.00,   90.00,  0.0500,   0.00,   0.50,   0.10,   "C",   0.00,   12.590255331551100000},
+{100.00,   90.00,  0.0500,   0.00,   0.50,   0.50,   "C",   0.00,   20.159976068200700000},
+{100.00,   90.00,  0.0500,   0.00,   0.50,   1.00,   "C",   0.00,   26.372713127990200000},
+{100.00,   100.00,  0.0500,   0.00,   0.50,   0.10,   "C",   0.00,   6.538072233170310000},
+{100.00,   100.00,  0.0500,   0.00,   0.50,   0.50,   "C",   0.00,   15.127170180011800000},
+{100.00,   100.00,  0.0500,   0.00,   0.50,   1.00,   "C",   0.00,   21.792596179591700000},
+{100.00,   110.00,  0.0500,   0.00,   0.50,   0.10,   "C",   0.00,   2.918389335831480000},
+{100.00,   110.00,  0.0500,   0.00,   0.50,   0.50,   "C",   0.00,   11.184108264097900000},
+{100.00,   110.00,  0.0500,   0.00,   0.50,   1.00,   "C",   0.00,   17.962314921602000000},
+{100.00,   90.00,  0.0500,   0.00,   0.10,   0.10,   "P",   0.00,   0.000181894142655793},
+{100.00,   90.00,  0.0500,   0.00,   0.10,   0.50,   "P",   0.00,   0.084646125462351500},
+{100.00,   90.00,  0.0500,   0.00,   0.10,   1.00,   "P",   0.00,   0.239488442786030000},
+{100.00,   100.00,  0.0500,   0.00,   0.10,   0.10,   "P",   0.00,   1.024684632955850000},
+{100.00,   100.00,  0.0500,   0.00,   0.10,   0.50,   "P",   0.00,   1.723262313567130000},
+{100.00,   100.00,  0.0500,   0.00,   0.10,   1.00,   "P",   0.00,   1.927905418100120000},
+{100.00,   110.00,  0.0500,   0.00,   0.10,   0.10,   "P",   0.00,   9.453456216245730000},
+{100.00,   110.00,  0.0500,   0.00,   0.10,   0.50,   "P",   0.00,   7.900661808103120000},
+{100.00,   110.00,  0.0500,   0.00,   0.10,   1.00,   "P",   0.00,   6.809187136234370000},
+{100.00,   90.00,  0.0500,   0.00,   0.25,   0.10,   "P",   0.00,   0.276620974196225000},
+{100.00,   90.00,  0.0500,   0.00,   0.25,   0.50,   "P",   0.00,   2.215008372602800000},
+{100.00,   90.00,  0.0500,   0.00,   0.25,   1.00,   "P",   0.00,   3.751418273219090000},
+{100.00,   100.00,  0.0500,   0.00,   0.25,   0.10,   "P",   0.00,   2.902141754965910000},
+{100.00,   100.00,  0.0500,   0.00,   0.25,   0.50,   "P",   0.00,   5.790995808515530000},
+{100.00,   100.00,  0.0500,   0.00,   0.25,   1.00,   "P",   0.00,   7.458928685138570000},
+{100.00,   110.00,  0.0500,   0.00,   0.25,   0.10,   "P",   0.00,   9.972720333377050000},
+{100.00,   110.00,  0.0500,   0.00,   0.25,   0.50,   "P",   0.00,   11.509879284017900000},
+{100.00,   110.00,  0.0500,   0.00,   0.25,   1.00,   "P",   0.00,   12.661608019970000000},
+{100.00,   90.00,  0.0500,   0.00,   0.50,   0.10,   "P",   0.00,   2.141378458892470000},
+{100.00,   90.00,  0.0500,   0.00,   0.50,   0.50,   "P",   0.00,   7.937868150750600000},
+{100.00,   90.00,  0.0500,   0.00,   0.50,   1.00,   "P",   0.00,   11.983361333054400000},
+{100.00,   100.00,  0.0500,   0.00,   0.50,   0.10,   "P",   0.00,   6.039320152438550000},
+{100.00,   100.00,  0.0500,   0.00,   0.50,   0.50,   "P",   0.00,   12.658161382845000000},
+{100.00,   100.00,  0.0500,   0.00,   0.50,   1.00,   "P",   0.00,   16.915538629663100000},
+{100.00,   110.00,  0.0500,   0.00,   0.50,   0.10,   "P",   0.00,   12.369762047026500000},
+{100.00,   110.00,  0.0500,   0.00,   0.50,   0.50,   "P",   0.00,   18.468198587214500000},
+{100.00,   110.00,  0.0500,   0.00,   0.50,   1.00,   "P",   0.00,   22.597551616680500000},
+{50.00,   41.25,  0.0500,   0.00,   0.10,   0.10,   "C",   0.00,   8.955735233348690000},
+{50.00,   41.25,  0.0500,   0.00,   0.10,   0.50,   "C",   0.00,   9.769395612888870000},
+{50.00,   41.25,  0.0500,   0.00,   0.10,   1.00,   "C",   0.00,   10.772989650176100000},
+{50.00,   50.00,  0.0500,   0.00,   0.10,   0.10,   "C",   0.00,   0.761718356843806000},
+{50.00,   50.00,  0.0500,   0.00,   0.10,   0.50,   "C",   0.00,   2.096135555366940000},
+{50.00,   50.00,  0.0500,   0.00,   0.10,   1.00,   "C",   0.00,   3.402481484014360000},
+{50.00,   60.75,  0.0500,   0.00,   0.10,   0.10,   "C",   0.00,   0.000000000268144541},
+{50.00,   60.75,  0.0500,   0.00,   0.10,   0.50,   "C",   0.00,   0.010446869804788600},
+{50.00,   60.75,  0.0500,   0.00,   0.10,   1.00,   "C",   0.00,   0.177236149710853000},
+{50.00,   41.25,  0.0500,   0.00,   0.25,   0.10,   "C",   0.00,   8.962983694922850000},
+{50.00,   41.25,  0.0500,   0.00,   0.25,   0.50,   "C",   0.00,   10.185792986779500000},
+{50.00,   41.25,  0.0500,   0.00,   0.25,   1.00,   "C",   0.00,   11.734445815449900000},
+{50.00,   50.00,  0.0500,   0.00,   0.25,   0.10,   "C",   0.00,   1.700446917848840000},
+{50.00,   50.00,  0.0500,   0.00,   0.25,   0.50,   "C",   0.00,   4.130002302841130000},
+{50.00,   50.00,  0.0500,   0.00,   0.25,   1.00,   "C",   0.00,   6.167993117533580000},
+{50.00,   60.75,  0.0500,   0.00,   0.25,   0.10,   "C",   0.00,   0.011811829287480400},
+{50.00,   60.75,  0.0500,   0.00,   0.25,   0.50,   "C",   0.00,   0.862122715911549000},
+{50.00,   60.75,  0.0500,   0.00,   0.25,   1.00,   "C",   0.00,   2.335403007584940000},
+{50.00,   41.25,  0.0500,   0.00,   0.50,   0.10,   "C",   0.00,   9.318598550815250000},
+{50.00,   41.25,  0.0500,   0.00,   0.50,   0.50,   "C",   0.00,   12.357234669808300000},
+{50.00,   41.25,  0.0500,   0.00,   0.50,   1.00,   "C",   0.00,   15.177352941362300000},
+{50.00,   50.00,  0.0500,   0.00,   0.50,   0.10,   "C",   0.00,   3.269036116585160000},
+{50.00,   50.00,  0.0500,   0.00,   0.50,   0.50,   "C",   0.00,   7.563585090005880000},
+{50.00,   50.00,  0.0500,   0.00,   0.50,   1.00,   "C",   0.00,   10.896298089795900000},
+{50.00,   60.75,  0.0500,   0.00,   0.50,   0.10,   "C",   0.00,   0.486593922457358000},
+{50.00,   60.75,  0.0500,   0.00,   0.50,   0.50,   "C",   0.00,   3.894991411685940000},
+{50.00,   60.75,  0.0500,   0.00,   0.50,   1.00,   "C",   0.00,   7.178308554843690000},
+{50.00,   41.25,  0.0500,   0.00,   0.10,   0.10,   "P",   0.00,   0.000000000046837154},
+{50.00,   41.25,  0.0500,   0.00,   0.10,   0.50,   "P",   0.00,   0.000929484057595751},
+{50.00,   41.25,  0.0500,   0.00,   0.10,   1.00,   "P",   0.00,   0.011203410830535000},
+{50.00,   50.00,  0.0500,   0.00,   0.10,   0.10,   "P",   0.00,   0.512342316477927000},
+{50.00,   50.00,  0.0500,   0.00,   0.10,   0.50,   "P",   0.00,   0.861631156783567000},
+{50.00,   50.00,  0.0500,   0.00,   0.10,   1.00,   "P",   0.00,   0.963952709050059000},
+{50.00,   60.75,  0.0500,   0.00,   0.10,   0.10,   "P",   0.00,   10.447008111223600000},
+{50.00,   60.75,  0.0500,   0.00,   0.10,   0.50,   "P",   0.00,   9.260524025526000000},
+{50.00,   60.75,  0.0500,   0.00,   0.10,   1.00,   "P",   0.00,   7.964423688129230000},
+{50.00,   41.25,  0.0500,   0.00,   0.25,   0.10,   "P",   0.00,   0.007248461621002290},
+{50.00,   41.25,  0.0500,   0.00,   0.25,   0.50,   "P",   0.00,   0.417326857948239000},
+{50.00,   41.25,  0.0500,   0.00,   0.25,   1.00,   "P",   0.00,   0.972659576104396000},
+{50.00,   50.00,  0.0500,   0.00,   0.25,   0.10,   "P",   0.00,   1.451070877482950000},
+{50.00,   50.00,  0.0500,   0.00,   0.25,   0.50,   "P",   0.00,   2.895497904257770000},
+{50.00,   50.00,  0.0500,   0.00,   0.25,   1.00,   "P",   0.00,   3.729464342569280000},
+{50.00,   60.75,  0.0500,   0.00,   0.25,   0.10,   "P",   0.00,   10.458819940242900000},
+{50.00,   60.75,  0.0500,   0.00,   0.25,   0.50,   "P",   0.00,   10.112199871632800000},
+{50.00,   60.75,  0.0500,   0.00,   0.25,   1.00,   "P",   0.00,   10.122590546003300000},
+{50.00,   41.25,  0.0500,   0.00,   0.50,   0.10,   "P",   0.00,   0.362863317513402000},
+{50.00,   41.25,  0.0500,   0.00,   0.50,   0.50,   "P",   0.00,   2.588768540977020000},
+{50.00,   41.25,  0.0500,   0.00,   0.50,   1.00,   "P",   0.00,   4.415566702016710000},
+{50.00,   50.00,  0.0500,   0.00,   0.50,   0.10,   "P",   0.00,   3.019660076219270000},
+{50.00,   50.00,  0.0500,   0.00,   0.50,   0.50,   "P",   0.00,   6.329080691422510000},
+{50.00,   50.00,  0.0500,   0.00,   0.50,   1.00,   "P",   0.00,   8.457769314831570000},
+{50.00,   60.75,  0.0500,   0.00,   0.50,   0.10,   "P",   0.00,   10.933602033412800000},
+{50.00,   60.75,  0.0500,   0.00,   0.50,   0.50,   "P",   0.00,   13.145068567407200000},
+{50.00,   60.75,  0.0500,   0.00,   0.50,   1.00,   "P",   0.00,   14.965496093262100000},
+{100.00,   90.00,  0.0725,   0.00,   0.10,   0.10,   "C",   0.00,   10.650277050805100000},
+{100.00,   90.00,  0.0725,   0.00,   0.10,   0.50,   "C",   0.00,   13.259583405256500000},
+{100.00,   90.00,  0.0725,   0.00,   0.10,   1.00,   "C",   0.00,   16.431763683443700000},
+{100.00,   100.00,  0.0725,   0.00,   0.10,   0.10,   "C",   0.00,   1.651032126473450000},
+{100.00,   100.00,  0.0725,   0.00,   0.10,   0.50,   "C",   0.00,   4.906253570587790000},
+{100.00,   100.00,  0.0725,   0.00,   0.10,   1.00,   "C",   0.00,   8.313008388939790000},
+{100.00,   110.00,  0.0725,   0.00,   0.10,   0.10,   "C",   0.00,   0.002646197663476990},
+{100.00,   110.00,  0.0725,   0.00,   0.10,   0.50,   "C",   0.00,   0.822087720719597000},
+{100.00,   110.00,  0.0725,   0.00,   0.10,   1.00,   "C",   0.00,   2.984536842326120000},
+{100.00,   90.00,  0.0725,   0.00,   0.25,   0.10,   "C",   0.00,   10.909604363485600000},
+{100.00,   90.00,  0.0725,   0.00,   0.25,   0.50,   "C",   0.00,   15.175519060709600000},
+{100.00,   90.00,  0.0725,   0.00,   0.25,   1.00,   "C",   0.00,   19.485080840813400000},
+{100.00,   100.00,  0.0725,   0.00,   0.25,   0.10,   "C",   0.00,   3.516086538379690000},
+{100.00,   100.00,  0.0725,   0.00,   0.25,   0.50,   "C",   0.00,   8.842399982947430000},
+{100.00,   100.00,  0.0725,   0.00,   0.25,   1.00,   "C",   0.00,   13.495077753475700000},
+{100.00,   110.00,  0.0725,   0.00,   0.25,   0.10,   "C",   0.00,   0.551230670113858000},
+{100.00,   110.00,  0.0725,   0.00,   0.25,   0.50,   "C",   0.00,   4.615616936834760000},
+{100.00,   110.00,  0.0725,   0.00,   0.25,   1.00,   "C",   0.00,   8.950419705313610000},
+{100.00,   90.00,  0.0725,   0.00,   0.50,   0.10,   "C",   0.00,   12.738053154952400000},
+{100.00,   90.00,  0.0725,   0.00,   0.50,   0.50,   "C",   0.00,   20.731790057083300000},
+{100.00,   90.00,  0.0725,   0.00,   0.50,   1.00,   "C",   0.00,   27.388177501336400000},
+{100.00,   100.00,  0.0725,   0.00,   0.50,   0.10,   "C",   0.00,   6.646286959643460000},
+{100.00,   100.00,  0.0725,   0.00,   0.50,   0.50,   "C",   0.00,   15.633506954311800000},
+{100.00,   100.00,  0.0725,   0.00,   0.50,   1.00,   "C",   0.00,   22.743364795607100000},
+{100.00,   110.00,  0.0725,   0.00,   0.50,   0.10,   "C",   0.00,   2.982365532654810000},
+{100.00,   110.00,  0.0725,   0.00,   0.50,   0.50,   "C",   0.00,   11.615595844329000000},
+{100.00,   110.00,  0.0725,   0.00,   0.50,   1.00,   "C",   0.00,   18.835720450407000000},
+{100.00,   90.00,  0.0725,   0.00,   0.10,   0.10,   "P",   0.00,   0.000136657478829508},
+{100.00,   90.00,  0.0725,   0.00,   0.10,   0.50,   "P",   0.00,   0.055508124958985000},
+{100.00,   90.00,  0.0725,   0.00,   0.10,   1.00,   "P",   0.00,   0.137680882868775000},
+{100.00,   100.00,  0.0725,   0.00,   0.10,   0.10,   "P",   0.00,   0.928653911666424000},
+{100.00,   100.00,  0.0725,   0.00,   0.10,   0.50,   "P",   0.00,   1.346169925812750000},
+{100.00,   100.00,  0.0725,   0.00,   0.10,   1.00,   "P",   0.00,   1.319583054967650000},
+{100.00,   110.00,  0.0725,   0.00,   0.10,   0.10,   "P",   0.00,   9.208030161375750000},
+{100.00,   110.00,  0.0725,   0.00,   0.10,   0.50,   "P",   0.00,   6.905995711467040000},
+{100.00,   110.00,  0.0725,   0.00,   0.10,   1.00,   "P",   0.00,   5.291768974956740000},
+{100.00,   90.00,  0.0725,   0.00,   0.25,   0.10,   "P",   0.00,   0.259463970159300000},
+{100.00,   90.00,  0.0725,   0.00,   0.25,   0.50,   "P",   0.00,   1.971443780412030000},
+{100.00,   90.00,  0.0725,   0.00,   0.25,   1.00,   "P",   0.00,   3.190998040238420000},
+{100.00,   100.00,  0.0725,   0.00,   0.25,   0.10,   "P",   0.00,   2.793708323572660000},
+{100.00,   100.00,  0.0725,   0.00,   0.25,   0.50,   "P",   0.00,   5.282316338172380000},
+{100.00,   100.00,  0.0725,   0.00,   0.25,   1.00,   "P",   0.00,   6.501652419503520000},
+{100.00,   110.00,  0.0725,   0.00,   0.25,   0.10,   "P",   0.00,   9.756614633826140000},
+{100.00,   110.00,  0.0725,   0.00,   0.25,   0.50,   "P",   0.00,   10.699524927582200000},
+{100.00,   110.00,  0.0725,   0.00,   0.25,   1.00,   "P",   0.00,   11.257651837944200000},
+{100.00,   90.00,  0.0725,   0.00,   0.50,   0.10,   "P",   0.00,   2.087912761626100000},
+{100.00,   90.00,  0.0725,   0.00,   0.50,   0.50,   "P",   0.00,   7.527714776785730000},
+{100.00,   90.00,  0.0725,   0.00,   0.50,   1.00,   "P",   0.00,   11.094094700761500000},
+{100.00,   100.00,  0.0725,   0.00,   0.50,   0.10,   "P",   0.00,   5.923908744836440000},
+{100.00,   100.00,  0.0725,   0.00,   0.50,   0.50,   "P",   0.00,   12.073423309536700000},
+{100.00,   100.00,  0.0725,   0.00,   0.50,   1.00,   "P",   0.00,   15.749939461634900000},
+{100.00,   110.00,  0.0725,   0.00,   0.50,   0.10,   "P",   0.00,   12.187749496367100000},
+{100.00,   110.00,  0.0725,   0.00,   0.50,   0.50,   "P",   0.00,   17.699503835076500000},
+{100.00,   110.00,  0.0725,   0.00,   0.50,   1.00,   "P",   0.00,   21.142952583037700000},
+{50.00,   41.25,  0.0725,   0.00,   0.10,   0.10,   "C",   0.00,   9.047981013637180000},
+{50.00,   41.25,  0.0725,   0.00,   0.10,   0.50,   "C",   0.00,   10.219050011000600000},
+{50.00,   41.25,  0.0725,   0.00,   0.10,   1.00,   "C",   0.00,   11.640265602712700000},
+{50.00,   50.00,  0.0725,   0.00,   0.10,   0.10,   "C",   0.00,   0.825516063236724000},
+{50.00,   50.00,  0.0725,   0.00,   0.10,   0.50,   "C",   0.00,   2.453126785293900000},
+{50.00,   50.00,  0.0725,   0.00,   0.10,   1.00,   "C",   0.00,   4.156504194469900000},
+{50.00,   60.75,  0.0725,   0.00,   0.10,   0.10,   "C",   0.00,   0.000000000418787169},
+{50.00,   60.75,  0.0725,   0.00,   0.10,   0.50,   "C",   0.00,   0.016602183429001500},
+{50.00,   60.75,  0.0725,   0.00,   0.10,   1.00,   "C",   0.00,   0.284483121731959000},
+{50.00,   41.25,  0.0725,   0.00,   0.25,   0.10,   "C",   0.00,   9.054608341813460000},
+{50.00,   41.25,  0.0725,   0.00,   0.25,   0.50,   "C",   0.00,   10.581658197115100000},
+{50.00,   41.25,  0.0725,   0.00,   0.25,   1.00,   "C",   0.00,   12.444199535517000000},
+{50.00,   50.00,  0.0725,   0.00,   0.25,   0.10,   "C",   0.00,   1.758043269189840000},
+{50.00,   50.00,  0.0725,   0.00,   0.25,   0.50,   "C",   0.00,   4.421199991473710000},
+{50.00,   50.00,  0.0725,   0.00,   0.25,   1.00,   "C",   0.00,   6.747538876737840000},
+{50.00,   60.75,  0.0725,   0.00,   0.25,   0.10,   "C",   0.00,   0.012850834682157100},
+{50.00,   60.75,  0.0725,   0.00,   0.25,   0.50,   "C",   0.00,   0.964632352153436000},
+{50.00,   60.75,  0.0725,   0.00,   0.25,   1.00,   "C",   0.00,   2.663220686150450000},
+{50.00,   41.25,  0.0725,   0.00,   0.50,   0.10,   "C",   0.00,   9.399799864285060000},
+{50.00,   41.25,  0.0725,   0.00,   0.50,   0.50,   "C",   0.00,   12.661052853996300000},
+{50.00,   41.25,  0.0725,   0.00,   0.50,   1.00,   "C",   0.00,   15.702432182518300000},
+{50.00,   50.00,  0.0725,   0.00,   0.50,   0.10,   "C",   0.00,   3.323143479821730000},
+{50.00,   50.00,  0.0725,   0.00,   0.50,   0.50,   "C",   0.00,   7.816753477155890000},
+{50.00,   50.00,  0.0725,   0.00,   0.50,   1.00,   "C",   0.00,   11.371682397803500000},
+{50.00,   60.75,  0.0725,   0.00,   0.50,   0.10,   "C",   0.00,   0.500408614730964000},
+{50.00,   60.75,  0.0725,   0.00,   0.50,   0.50,   "C",   0.00,   4.067835234635260000},
+{50.00,   60.75,  0.0725,   0.00,   0.50,   1.00,   "C",   0.00,   7.567318237821570000},
+{50.00,   41.25,  0.0725,   0.00,   0.10,   0.10,   "P",   0.00,   0.000000000029292149},
+{50.00,   41.25,  0.0725,   0.00,   0.10,   0.50,   "P",   0.00,   0.000515507530913631},
+{50.00,   41.25,  0.0725,   0.00,   0.10,   1.00,   "P",   0.00,   0.005477652449141430},
+{50.00,   50.00,  0.0725,   0.00,   0.10,   0.10,   "P",   0.00,   0.464326955833212000},
+{50.00,   50.00,  0.0725,   0.00,   0.10,   0.50,   "P",   0.00,   0.673084962906374000},
+{50.00,   50.00,  0.0725,   0.00,   0.10,   1.00,   "P",   0.00,   0.659791527483823000},
+{50.00,   60.75,  0.0725,   0.00,   0.10,   0.10,   "P",   0.00,   10.311155234923500000},
+{50.00,   60.75,  0.0725,   0.00,   0.10,   0.50,   "P",   0.00,   8.603851369228160000},
+{50.00,   60.75,  0.0725,   0.00,   0.10,   1.00,   "P",   0.00,   6.785977231343880000},
+{50.00,   41.25,  0.0725,   0.00,   0.25,   0.10,   "P",   0.00,   0.006627328205560570},
+{50.00,   41.25,  0.0725,   0.00,   0.25,   0.50,   "P",   0.00,   0.363123693645393000},
+{50.00,   41.25,  0.0725,   0.00,   0.25,   1.00,   "P",   0.00,   0.809411585253518000},
+{50.00,   50.00,  0.0725,   0.00,   0.25,   0.10,   "P",   0.00,   1.396854161786330000},
+{50.00,   50.00,  0.0725,   0.00,   0.25,   0.50,   "P",   0.00,   2.641158169086190000},
+{50.00,   50.00,  0.0725,   0.00,   0.25,   1.00,   "P",   0.00,   3.250826209751760000},
+{50.00,   60.75,  0.0725,   0.00,   0.25,   0.10,   "P",   0.00,   10.324006069186900000},
+{50.00,   60.75,  0.0725,   0.00,   0.25,   0.50,   "P",   0.00,   9.551881537952600000},
+{50.00,   60.75,  0.0725,   0.00,   0.25,   1.00,   "P",   0.00,   9.164714795762360000},
+{50.00,   41.25,  0.0725,   0.00,   0.50,   0.10,   "P",   0.00,   0.351818850677170000},
+{50.00,   41.25,  0.0725,   0.00,   0.50,   0.50,   "P",   0.00,   2.442518350526630000},
+{50.00,   41.25,  0.0725,   0.00,   0.50,   1.00,   "P",   0.00,   4.067644232254740000},
+{50.00,   50.00,  0.0725,   0.00,   0.50,   0.10,   "P",   0.00,   2.961954372418220000},
+{50.00,   50.00,  0.0725,   0.00,   0.50,   0.50,   "P",   0.00,   6.036711654768370000},
+{50.00,   50.00,  0.0725,   0.00,   0.50,   1.00,   "P",   0.00,   7.874969730817450000},
+{50.00,   60.75,  0.0725,   0.00,   0.50,   0.10,   "P",   0.00,   10.811563849235700000},
+{50.00,   60.75,  0.0725,   0.00,   0.50,   0.50,   "P",   0.00,   12.655084420434400000},
+{50.00,   60.75,  0.0725,   0.00,   0.50,   1.00,   "P",   0.00,   14.068812347433500000},
+{100.00,   90.00,  0.0825,   0.00,   0.10,   0.10,   "C",   0.00,   10.739565764427600000},
+{100.00,   90.00,  0.0825,   0.00,   0.10,   0.50,   "C",   0.00,   13.682682955061700000},
+{100.00,   90.00,  0.0825,   0.00,   0.10,   1.00,   "C",   0.00,   17.233234434950200000},
+{100.00,   100.00,  0.0825,   0.00,   0.10,   0.10,   "C",   0.00,   1.709643173779020000},
+{100.00,   100.00,  0.0825,   0.00,   0.10,   0.50,   "C",   0.00,   5.240956408279040000},
+{100.00,   100.00,  0.0825,   0.00,   0.10,   1.00,   "C",   0.00,   9.021567470247120000},
+{100.00,   110.00,  0.0825,   0.00,   0.10,   0.10,   "C",   0.00,   0.002938681227336320},
+{100.00,   110.00,  0.0825,   0.00,   0.10,   0.50,   "C",   0.00,   0.928877789383869000},
+{100.00,   110.00,  0.0825,   0.00,   0.10,   1.00,   "C",   0.00,   3.401688909911660000},
+{100.00,   90.00,  0.0825,   0.00,   0.25,   0.10,   "C",   0.00,   10.991579413464500000},
+{100.00,   90.00,  0.0825,   0.00,   0.25,   0.50,   "C",   0.00,   15.507256193857400000},
+{100.00,   90.00,  0.0825,   0.00,   0.25,   1.00,   "C",   0.00,   20.091308227254800000},
+{100.00,   100.00,  0.0825,   0.00,   0.25,   0.10,   "C",   0.00,   3.568013775180880000},
+{100.00,   100.00,  0.0825,   0.00,   0.25,   0.50,   "C",   0.00,   9.107927694355590000},
+{100.00,   100.00,  0.0825,   0.00,   0.25,   1.00,   "C",   0.00,   14.025694755963400000},
+{100.00,   110.00,  0.0825,   0.00,   0.25,   0.10,   "C",   0.00,   0.564947997341128000},
+{100.00,   110.00,  0.0825,   0.00,   0.25,   0.50,   "C",   0.00,   4.796306777823870000},
+{100.00,   110.00,  0.0825,   0.00,   0.25,   1.00,   "C",   0.00,   9.380215666129900000},
+{100.00,   90.00,  0.0825,   0.00,   0.50,   0.10,   "C",   0.00,   12.803934625179900000},
+{100.00,   90.00,  0.0825,   0.00,   0.50,   0.50,   "C",   0.00,   20.987751407192000000},
+{100.00,   90.00,  0.0825,   0.00,   0.50,   1.00,   "C",   0.00,   27.842982610886100000},
+{100.00,   100.00,  0.0825,   0.00,   0.50,   0.10,   "C",   0.00,   6.694710681788890000},
+{100.00,   100.00,  0.0825,   0.00,   0.50,   0.50,   "C",   0.00,   15.861123252603300000},
+{100.00,   100.00,  0.0825,   0.00,   0.50,   1.00,   "C",   0.00,   23.171055823977000000},
+{100.00,   110.00,  0.0825,   0.00,   0.50,   0.10,   "C",   0.00,   3.011118247238870000},
+{100.00,   110.00,  0.0825,   0.00,   0.50,   0.50,   "C",   0.00,   11.810384819288500000},
+{100.00,   110.00,  0.0825,   0.00,   0.50,   1.00,   "C",   0.00,   19.230265826002600000},
+{100.00,   90.00,  0.0825,   0.00,   0.10,   0.10,   "P",   0.00,   0.000120171536473068},
+{100.00,   90.00,  0.0825,   0.00,   0.10,   0.50,   "P",   0.00,   0.045711194234222000},
+{100.00,   90.00,  0.0825,   0.00,   0.10,   1.00,   "P",   0.00,   0.106263842062639000},
+{100.00,   100.00,  0.0825,   0.00,   0.10,   0.10,   "P",   0.00,   0.888036959455578000},
+{100.00,   100.00,  0.0825,   0.00,   0.10,   0.50,   "P",   0.00,   1.199876674026320000},
+{100.00,   100.00,  0.0825,   0.00,   0.10,   1.00,   "P",   0.00,   1.102711255927580000},
+{100.00,   110.00,  0.0825,   0.00,   0.10,   0.10,   "P",   0.00,   9.099171845471530000},
+{100.00,   110.00,  0.0825,   0.00,   0.10,   0.50,   "P",   0.00,   6.483690081705880000},
+{100.00,   110.00,  0.0825,   0.00,   0.10,   1.00,   "P",   0.00,   4.690947074160150000},
+{100.00,   90.00,  0.0825,   0.00,   0.25,   0.10,   "P",   0.00,   0.252133820573404000},
+{100.00,   90.00,  0.0825,   0.00,   0.25,   0.50,   "P",   0.00,   1.870284433029970000},
+{100.00,   90.00,  0.0825,   0.00,   0.25,   1.00,   "P",   0.00,   2.964337634367170000},
+{100.00,   100.00,  0.0825,   0.00,   0.25,   0.10,   "P",   0.00,   2.746407560857420000},
+{100.00,   100.00,  0.0825,   0.00,   0.25,   0.50,   "P",   0.00,   5.066847960102870000},
+{100.00,   100.00,  0.0825,   0.00,   0.25,   1.00,   "P",   0.00,   6.106838541643810000},
+{100.00,   110.00,  0.0825,   0.00,   0.25,   0.10,   "P",   0.00,   9.661181161585320000},
+{100.00,   110.00,  0.0825,   0.00,   0.25,   0.50,   "P",   0.00,   10.351119070145900000},
+{100.00,   110.00,  0.0825,   0.00,   0.25,   1.00,   "P",   0.00,   10.669473830378400000},
+{100.00,   90.00,  0.0825,   0.00,   0.50,   0.10,   "P",   0.00,   2.064489032288790000},
+{100.00,   90.00,  0.0825,   0.00,   0.50,   0.50,   "P",   0.00,   7.350779646364550000},
+{100.00,   90.00,  0.0825,   0.00,   0.50,   1.00,   "P",   0.00,   10.716012017998500000},
+{100.00,   100.00,  0.0825,   0.00,   0.50,   0.10,   "P",   0.00,   5.873104467465440000},
+{100.00,   100.00,  0.0825,   0.00,   0.50,   0.50,   "P",   0.00,   11.820043518350600000},
+{100.00,   100.00,  0.0825,   0.00,   0.50,   1.00,   "P",   0.00,   15.252199609657500000},
+{100.00,   110.00,  0.0825,   0.00,   0.50,   0.10,   "P",   0.00,   12.107351411483100000},
+{100.00,   110.00,  0.0825,   0.00,   0.50,   0.50,   "P",   0.00,   17.365197111610500000},
+{100.00,   110.00,  0.0825,   0.00,   0.50,   1.00,   "P",   0.00,   20.519523990251100000},
+{50.00,   41.25,  0.0825,   0.00,   0.10,   0.10,   "C",   0.00,   9.088912563432170000},
+{50.00,   41.25,  0.0825,   0.00,   0.10,   0.50,   "C",   0.00,   10.417339221247600000},
+{50.00,   41.25,  0.0825,   0.00,   0.10,   1.00,   "C",   0.00,   12.020458260573200000},
+{50.00,   50.00,  0.0825,   0.00,   0.10,   0.10,   "C",   0.00,   0.854821586889512000},
+{50.00,   50.00,  0.0825,   0.00,   0.10,   0.50,   "C",   0.00,   2.620478204139520000},
+{50.00,   50.00,  0.0825,   0.00,   0.10,   1.00,   "C",   0.00,   4.510783735123560000},
+{50.00,   60.75,  0.0825,   0.00,   0.10,   0.10,   "C",   0.00,   0.000000000509770462},
+{50.00,   60.75,  0.0825,   0.00,   0.10,   0.50,   "C",   0.00,   0.020258714482434300},
+{50.00,   60.75,  0.0825,   0.00,   0.10,   1.00,   "C",   0.00,   0.346802700406624000},
+{50.00,   41.25,  0.0825,   0.00,   0.25,   0.10,   "C",   0.00,   9.095279779656780000},
+{50.00,   41.25,  0.0825,   0.00,   0.25,   0.50,   "C",   0.00,   10.757961410313800000},
+{50.00,   41.25,  0.0825,   0.00,   0.25,   1.00,   "C",   0.00,   12.761066081739600000},
+{50.00,   50.00,  0.0825,   0.00,   0.25,   0.10,   "C",   0.00,   1.784006887590440000},
+{50.00,   50.00,  0.0825,   0.00,   0.25,   0.50,   "C",   0.00,   4.553963847177790000},
+{50.00,   50.00,  0.0825,   0.00,   0.25,   1.00,   "C",   0.00,   7.012847377981680000},
+{50.00,   60.75,  0.0825,   0.00,   0.25,   0.10,   "C",   0.00,   0.013338549021010600},
+{50.00,   60.75,  0.0825,   0.00,   0.25,   0.50,   "C",   0.00,   1.013087068903510000},
+{50.00,   60.75,  0.0825,   0.00,   0.25,   1.00,   "C",   0.00,   2.818536762927260000},
+{50.00,   41.25,  0.0825,   0.00,   0.50,   0.10,   "C",   0.00,   9.435914325176720000},
+{50.00,   41.25,  0.0825,   0.00,   0.50,   0.50,   "C",   0.00,   12.796624953351600000},
+{50.00,   41.25,  0.0825,   0.00,   0.50,   1.00,   "C",   0.00,   15.936815099823400000},
+{50.00,   50.00,  0.0825,   0.00,   0.50,   0.10,   "C",   0.00,   3.347355340894440000},
+{50.00,   50.00,  0.0825,   0.00,   0.50,   0.50,   "C",   0.00,   7.930561626301670000},
+{50.00,   50.00,  0.0825,   0.00,   0.50,   1.00,   "C",   0.00,   11.585527911988500000},
+{50.00,   60.75,  0.0825,   0.00,   0.50,   0.10,   "C",   0.00,   0.506649223493164000},
+{50.00,   60.75,  0.0825,   0.00,   0.50,   0.50,   "C",   0.00,   4.146230216819100000},
+{50.00,   60.75,  0.0825,   0.00,   0.50,   1.00,   "C",   0.00,   7.743859322998950000},
+{50.00,   41.25,  0.0825,   0.00,   0.10,   0.10,   "P",   0.00,   0.000000000023739918},
+{50.00,   41.25,  0.0825,   0.00,   0.10,   0.50,   "P",   0.00,   0.000393830868315673},
+{50.00,   41.25,  0.0825,   0.00,   0.10,   1.00,   "P",   0.00,   0.003930072166366200},
+{50.00,   50.00,  0.0825,   0.00,   0.10,   0.10,   "P",   0.00,   0.444018479727789000},
+{50.00,   50.00,  0.0825,   0.00,   0.10,   0.50,   "P",   0.00,   0.599938337013158000},
+{50.00,   50.00,  0.0825,   0.00,   0.10,   1.00,   "P",   0.00,   0.551355627963788000},
+{50.00,   60.75,  0.0825,   0.00,   0.10,   0.10,   "P",   0.00,   10.250874225308300000},
+{50.00,   60.75,  0.0825,   0.00,   0.10,   0.50,   "P",   0.00,   8.315302775923910000},
+{50.00,   60.75,  0.0825,   0.00,   0.10,   1.00,   "P",   0.00,   6.286097550207500000},
+{50.00,   41.25,  0.0825,   0.00,   0.25,   0.10,   "P",   0.00,   0.006367216248349180},
+{50.00,   41.25,  0.0825,   0.00,   0.25,   0.50,   "P",   0.00,   0.341016019934537000},
+{50.00,   41.25,  0.0825,   0.00,   0.25,   1.00,   "P",   0.00,   0.744537893332813000},
+{50.00,   50.00,  0.0825,   0.00,   0.25,   0.10,   "P",   0.00,   1.373203780428710000},
+{50.00,   50.00,  0.0825,   0.00,   0.25,   0.50,   "P",   0.00,   2.533423980051440000},
+{50.00,   50.00,  0.0825,   0.00,   0.25,   1.00,   "P",   0.00,   3.053419270821910000},
+{50.00,   60.75,  0.0825,   0.00,   0.25,   0.10,   "P",   0.00,   10.264212773819500000},
+{50.00,   60.75,  0.0825,   0.00,   0.25,   0.50,   "P",   0.00,   9.308131130344990000},
+{50.00,   60.75,  0.0825,   0.00,   0.25,   1.00,   "P",   0.00,   8.757831612728140000},
+{50.00,   41.25,  0.0825,   0.00,   0.50,   0.10,   "P",   0.00,   0.347001761768287000},
+{50.00,   41.25,  0.0825,   0.00,   0.50,   0.50,   "P",   0.00,   2.379679562972370000},
+{50.00,   41.25,  0.0825,   0.00,   0.50,   1.00,   "P",   0.00,   3.920286911416630000},
+{50.00,   50.00,  0.0825,   0.00,   0.50,   0.10,   "P",   0.00,   2.936552233732720000},
+{50.00,   50.00,  0.0825,   0.00,   0.50,   0.50,   "P",   0.00,   5.910021759175310000},
+{50.00,   50.00,  0.0825,   0.00,   0.50,   1.00,   "P",   0.00,   7.626099804828730000},
+{50.00,   60.75,  0.0825,   0.00,   0.50,   0.10,   "P",   0.00,   10.757523448291700000},
+{50.00,   60.75,  0.0825,   0.00,   0.50,   0.50,   "P",   0.00,   12.441274278260600000},
+{50.00,   60.75,  0.0825,   0.00,   0.50,   1.00,   "P",   0.00,   13.683154172799800000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.05,   "C",   0.00,   10.123665331672000000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.15,   "C",   0.00,   10.373032852188900000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.25,   "C",   0.00,   10.636947537285500000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.35,   "C",   0.00,   10.917165299126100000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.40,   "C",   0.00,   11.061557599916400000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.75,   "C",   0.00,   12.101053829939600000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.05,   "C",   0.00,   0.961818366406236000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.15,   "C",   0.00,   1.756378640433290000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.25,   "C",   0.00,   2.348994210822140000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.35,   "C",   0.00,   2.858468103310000000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.40,   "C",   0.00,   3.093733002160350000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.75,   "C",   0.00,   4.535722066606680000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.05,   "C",   0.00,   0.000006723584199279},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.15,   "C",   0.00,   0.012638573288007100},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.25,   "C",   0.00,   0.080669824623617900},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.35,   "C",   0.00,   0.203313366122133000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.40,   "C",   0.00,   0.279741513989867000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.75,   "C",   0.00,   0.966244057205561000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.05,   "C",   0.00,   10.180826153638800000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.15,   "C",   0.00,   10.961715417709400000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   11.806688555076800000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.35,   "C",   0.00,   12.605623650271500000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.40,   "C",   0.00,   12.985712061767300000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.75,   "C",   0.00,   15.357169521085200000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.05,   "C",   0.00,   2.297712420609210000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.15,   "C",   0.00,   4.062608172250370000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   5.316534629514670000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.35,   "C",   0.00,   6.358166104399040000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.40,   "C",   0.00,   6.828913330585190000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.75,   "C",   0.00,   9.591743416200030000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.05,   "C",   0.00,   0.112351670775873000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.15,   "C",   0.00,   0.941524462753784000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   1.841160573457080000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.35,   "C",   0.00,   2.688576689404750000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.40,   "C",   0.00,   3.091204880502100000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.75,   "C",   0.00,   5.602711897085350000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.05,   "C",   0.00,   11.084709241234900000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.15,   "C",   0.00,   13.632481055133100000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.25,   "C",   0.00,   15.655476595132900000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.35,   "C",   0.00,   17.372974698382700000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.40,   "C",   0.00,   18.152722902532300000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.75,   "C",   0.00,   22.710977121510300000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.05,   "C",   0.00,   4.523973730175930000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.15,   "C",   0.00,   7.905126847046370000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.25,   "C",   0.00,   10.259870456479600000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.35,   "C",   0.00,   12.186764904701600000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.40,   "C",   0.00,   13.049054347704600000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.75,   "C",   0.00,   18.005360351008900000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.05,   "C",   0.00,   1.310314250402410000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.15,   "C",   0.00,   4.184313321977850000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.25,   "C",   0.00,   6.424957663250310000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.35,   "C",   0.00,   8.318451201213970000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.40,   "C",   0.00,   9.176764345625750000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.75,   "C",   0.00,   14.187966555535700000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.05,   "P",   0.00,   0.000000370816316441},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.15,   "P",   0.00,   0.002547503556924290},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.25,   "P",   0.00,   0.020319624509017900},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.35,   "P",   0.00,   0.055070784382573900},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.40,   "P",   0.00,   0.076982689699630000},
+{100.00,   90.00,  0.0275,   0.00,   0.10,   0.75,   "P",   0.00,   0.263815478639822000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.05,   "P",   0.00,   0.824412854344306000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.15,   "P",   0.00,   1.344728253064450000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.25,   "P",   0.00,   1.663852085514990000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.35,   "P",   0.00,   1.900585309150540000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.40,   "P",   0.00,   1.999760879697220000},
+{100.00,   100.00,  0.0275,   0.00,   0.10,   0.75,   "P",   0.00,   2.494346120718070000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.05,   "P",   0.00,   9.848860660316070000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.15,   "P",   0.00,   9.559823147182290000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.25,   "P",   0.00,   9.327013486785750000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.35,   "P",   0.00,   9.149642292546710000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.40,   "P",   0.00,   9.076372179280420000},
+{100.00,   110.00,  0.0275,   0.00,   0.10,   0.75,   "P",   0.00,   8.720730516728090000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.05,   "P",   0.00,   0.057161192783076400},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.15,   "P",   0.00,   0.591230069077490000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   1.190060642300400000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.35,   "P",   0.00,   1.743529135528020000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.40,   "P",   0.00,   2.001137151550470000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.75,   "P",   0.00,   3.519931169785430000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.05,   "P",   0.00,   2.160306908547280000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.15,   "P",   0.00,   3.650957784881540000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   4.631392504207520000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.35,   "P",   0.00,   5.400283310239590000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.40,   "P",   0.00,   5.734941208122060000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.75,   "P",   0.00,   7.550367470311420000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.05,   "P",   0.00,   9.961205607507750000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.15,   "P",   0.00,   10.488709036648100000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   11.087504235619200000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.35,   "P",   0.00,   11.634905615829300000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.40,   "P",   0.00,   11.887835545792700000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.75,   "P",   0.00,   13.357198356607900000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.05,   "P",   0.00,   0.961044280379137000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.15,   "P",   0.00,   3.261995706501170000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.25,   "P",   0.00,   5.038848682356440000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.35,   "P",   0.00,   6.510880183639170000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.40,   "P",   0.00,   7.168147992315500000},
+{100.00,   90.00,  0.0275,   0.00,   0.50,   0.75,   "P",   0.00,   10.873738770210500000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.05,   "P",   0.00,   4.386568218113990000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.15,   "P",   0.00,   7.493476459677530000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.25,   "P",   0.00,   9.574728331172470000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.35,   "P",   0.00,   11.228882110542100000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.40,   "P",   0.00,   11.955082225241500000},
+{100.00,   100.00,  0.0275,   0.00,   0.50,   0.75,   "P",   0.00,   15.963984405120300000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.05,   "P",   0.00,   11.159168187134300000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.15,   "P",   0.00,   13.731497895872100000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.25,   "P",   0.00,   15.671301325412400000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.35,   "P",   0.00,   17.264780127638500000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.40,   "P",   0.00,   17.973395010916300000},
+{100.00,   110.00,  0.0275,   0.00,   0.50,   0.75,   "P",   0.00,   21.942453015058200000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.05,   "C",   0.00,   8.806679773725550000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.15,   "C",   0.00,   8.919805847440340000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.25,   "C",   0.00,   9.032638359465810000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.35,   "C",   0.00,   9.145345404131990000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.40,   "C",   0.00,   9.201762221631910000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.75,   "C",   0.00,   9.600898793029730000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.05,   "C",   0.00,   0.480909183203118000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.15,   "C",   0.00,   0.878189320216645000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.25,   "C",   0.00,   1.174497105411070000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.35,   "C",   0.00,   1.429234051655000000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.40,   "C",   0.00,   1.546866501080180000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.75,   "C",   0.00,   2.267861033303340000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.05,   "C",   0.00,   0.000000000000000000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.15,   "C",   0.00,   0.000000171615412703},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.25,   "C",   0.00,   0.000055860184325600},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.35,   "C",   0.00,   0.000779365099622839},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.40,   "C",   0.00,   0.001842470055799290},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.75,   "C",   0.00,   0.038961694259698300},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.05,   "C",   0.00,   8.806849354517480000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.15,   "C",   0.00,   8.954197588651610000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   9.165798615967480000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.35,   "C",   0.00,   9.408822105130160000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.40,   "C",   0.00,   9.535303750088810000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.75,   "C",   0.00,   10.425117157574200000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.05,   "C",   0.00,   1.148856210304600000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.15,   "C",   0.00,   2.031304086125190000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   2.658267314757330000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.35,   "C",   0.00,   3.179083052199520000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.40,   "C",   0.00,   3.414456665292590000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.75,   "C",   0.00,   4.795871708100020000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.05,   "C",   0.00,   0.000211358987727573},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.15,   "C",   0.00,   0.049106845262957000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   0.199576273789990000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.35,   "C",   0.00,   0.408212274950217000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.40,   "C",   0.00,   0.524134867759744000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.75,   "C",   0.00,   1.404244627370240000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.05,   "C",   0.00,   8.892181952988650000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.15,   "C",   0.00,   9.628643279189300000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.25,   "C",   0.00,   10.393689811168400000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.35,   "C",   0.00,   11.099336802885700000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.40,   "C",   0.00,   11.430472829888300000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.75,   "C",   0.00,   13.444734990729800000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.05,   "C",   0.00,   2.261986865087960000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.15,   "C",   0.00,   3.952563423523180000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.25,   "C",   0.00,   5.129935228239810000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.35,   "C",   0.00,   6.093382452350780000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.40,   "C",   0.00,   6.524527173852300000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.75,   "C",   0.00,   9.002680175504460000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.05,   "C",   0.00,   0.104628872651218000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.15,   "C",   0.00,   0.911420373042769000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.25,   "C",   0.00,   1.788383179217750000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.35,   "C",   0.00,   2.607959513092190000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.40,   "C",   0.00,   2.994691865020780000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.75,   "C",   0.00,   5.365218152828680000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.05,   "P",   0.00,   0.000000000000000000},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.15,   "P",   0.00,   0.000000062650696723},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.25,   "P",   0.00,   0.000017232776604701},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.35,   "P",   0.00,   0.000218751541208349},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.40,   "P",   0.00,   0.000498721115871775},
+{50.00,   41.25,  0.0275,   0.00,   0.10,   0.75,   "P",   0.00,   0.008831215350675280},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.05,   "P",   0.00,   0.412206427172153000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.15,   "P",   0.00,   0.672364126532227000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.25,   "P",   0.00,   0.831926042757495000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.35,   "P",   0.00,   0.950292654575268000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.40,   "P",   0.00,   0.999880439848609000},
+{50.00,   50.00,  0.0275,   0.00,   0.10,   0.75,   "P",   0.00,   1.247173060359030000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.05,   "P",   0.00,   10.666526151422400000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.15,   "P",   0.00,   10.499922561288800000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.25,   "P",   0.00,   10.333832019060200000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.35,   "P",   0.00,   10.168865567647700000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.40,   "P",   0.00,   10.087254405659400000},
+{50.00,   60.75,  0.0275,   0.00,   0.10,   0.75,   "P",   0.00,   9.548825807132360000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.05,   "P",   0.00,   0.000169580791934694},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.15,   "P",   0.00,   0.034391803861966800},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   0.133177489278275000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.35,   "P",   0.00,   0.263695452539379000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.40,   "P",   0.00,   0.334040249572767000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.75,   "P",   0.00,   0.833049579895138000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.05,   "P",   0.00,   1.080153454273640000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.15,   "P",   0.00,   1.825478892440770000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   2.315696252103760000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.35,   "P",   0.00,   2.700141655119790000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.40,   "P",   0.00,   2.867470604061030000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.75,   "P",   0.00,   3.775183735155710000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.05,   "P",   0.00,   10.666737510410100000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.15,   "P",   0.00,   10.549029234936400000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   10.533352432665900000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.35,   "P",   0.00,   10.576298477498300000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.40,   "P",   0.00,   10.609546803363400000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.75,   "P",   0.00,   10.914108740242900000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.05,   "P",   0.00,   0.085502179263094900},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.15,   "P",   0.00,   0.708837494399656000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.25,   "P",   0.00,   1.361068684479170000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.35,   "P",   0.00,   1.954210150294910000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.40,   "P",   0.00,   2.229209329372280000},
+{50.00,   41.25,  0.0275,   0.00,   0.50,   0.75,   "P",   0.00,   3.852667413050720000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.05,   "P",   0.00,   2.193284109057000000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.15,   "P",   0.00,   3.746738229838770000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.25,   "P",   0.00,   4.787364165586240000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.35,   "P",   0.00,   5.614441055271050000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.40,   "P",   0.00,   5.977541112620740000},
+{50.00,   50.00,  0.0275,   0.00,   0.50,   0.75,   "P",   0.00,   7.981992202560150000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.05,   "P",   0.00,   10.771155024073600000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.15,   "P",   0.00,   11.411342762716200000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.25,   "P",   0.00,   12.122159338093700000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.35,   "P",   0.00,   12.776045715640300000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.40,   "P",   0.00,   13.080103800624400000},
+{50.00,   60.75,  0.0275,   0.00,   0.50,   0.75,   "P",   0.00,   14.875082265701300000},
+{100.00,   90.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   10.123664960855700000},
+{100.00,   90.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   10.433739898891000000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   11.806688555076800000},
+{100.00,   90.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   14.395707640825200000},
+{100.00,   90.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   17.061100221173400000},
+{100.00,   90.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   27.276574478179500000},
+{100.00,   100.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.517790662421029000},
+{100.00,   100.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   2.524199969313780000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   5.316534629514670000},
+{100.00,   100.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   8.694162162838850000},
+{100.00,   100.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   11.809330726608000000},
+{100.00,   100.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   22.972890772584900000},
+{100.00,   110.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.000000000000000003},
+{100.00,   110.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   0.151725311664208000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   1.841160573457080000},
+{100.00,   110.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   4.865673300084870000},
+{100.00,   110.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   7.926036867545800000},
+{100.00,   110.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   19.343153241896800000},
+{100.00,   90.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   10.123664960855700000},
+{100.00,   90.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   10.433739898891000000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   11.806688555076800000},
+{100.00,   90.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   14.395707640825200000},
+{100.00,   90.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   17.061100221173400000},
+{100.00,   90.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   27.276574478179500000},
+{100.00,   100.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.517790662421029000},
+{100.00,   100.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   2.524199969313780000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   5.316534629514670000},
+{100.00,   100.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   8.694162162838850000},
+{100.00,   100.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   11.809330726608000000},
+{100.00,   100.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   22.972890772584900000},
+{100.00,   110.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.000000000000000003},
+{100.00,   110.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   0.151725311664208000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   1.841160573457080000},
+{100.00,   110.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   4.865673300084870000},
+{100.00,   110.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   7.926036867545800000},
+{100.00,   110.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   19.343153241896800000},
+{100.00,   90.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   10.123664960855700000},
+{100.00,   90.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   10.433739898891000000},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   11.806688555076800000},
+{100.00,   90.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   14.395707640825200000},
+{100.00,   90.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   17.061100221173400000},
+{100.00,   90.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   27.276574478179500000},
+{100.00,   100.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.517790662421029000},
+{100.00,   100.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   2.524199969313780000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   5.316534629514670000},
+{100.00,   100.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   8.694162162838850000},
+{100.00,   100.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   11.809330726608000000},
+{100.00,   100.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   22.972890772584900000},
+{100.00,   110.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.000000000000000003},
+{100.00,   110.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   0.151725311664208000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   1.841160573457080000},
+{100.00,   110.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   4.865673300084870000},
+{100.00,   110.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   7.926036867545800000},
+{100.00,   110.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   19.343153241896800000},
+{100.00,   90.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.000000000000000000},
+{100.00,   90.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   0.063254550259028900},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   1.190060642300400000},
+{100.00,   90.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   3.533613126081700000},
+{100.00,   90.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   6.076525310956530000},
+{100.00,   90.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   15.439336126879800000},
+{100.00,   100.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.380385150359093000},
+{100.00,   100.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   2.112549581944940000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   4.631392504207520000},
+{100.00,   100.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   7.736279368679390000},
+{100.00,   100.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   10.715358604144900000},
+{100.00,   100.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   20.931514826696300000},
+{100.00,   110.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   9.848853936731870000},
+{100.00,   110.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   9.698909885558490000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   11.087504235619200000},
+{100.00,   110.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   13.812002226509500000},
+{100.00,   110.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   16.722667532836400000},
+{100.00,   110.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   27.097639701419300000},
+{100.00,   90.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.000000000000000000},
+{100.00,   90.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   0.063254550259028900},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   1.190060642300400000},
+{100.00,   90.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   3.533613126081700000},
+{100.00,   90.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   6.076525310956530000},
+{100.00,   90.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   15.439336126879800000},
+{100.00,   100.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.380385150359093000},
+{100.00,   100.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   2.112549581944940000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   4.631392504207520000},
+{100.00,   100.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   7.736279368679390000},
+{100.00,   100.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   10.715358604144900000},
+{100.00,   100.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   20.931514826696300000},
+{100.00,   110.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   9.848853936731870000},
+{100.00,   110.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   9.698909885558490000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   11.087504235619200000},
+{100.00,   110.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   13.812002226509500000},
+{100.00,   110.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   16.722667532836400000},
+{100.00,   110.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   27.097639701419300000},
+{100.00,   90.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.000000000000000000},
+{100.00,   90.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   0.063254550259028900},
+{100.00,   90.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   1.190060642300400000},
+{100.00,   90.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   3.533613126081700000},
+{100.00,   90.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   6.076525310956530000},
+{100.00,   90.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   15.439336126879800000},
+{100.00,   100.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.380385150359093000},
+{100.00,   100.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   2.112549581944940000},
+{100.00,   100.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   4.631392504207520000},
+{100.00,   100.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   7.736279368679390000},
+{100.00,   100.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   10.715358604144900000},
+{100.00,   100.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   20.931514826696300000},
+{100.00,   110.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   9.848853936731870000},
+{100.00,   110.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   9.698909885558490000},
+{100.00,   110.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   11.087504235619200000},
+{100.00,   110.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   13.812002226509500000},
+{100.00,   110.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   16.722667532836400000},
+{100.00,   110.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   27.097639701419300000},
+{50.00,   41.25,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   8.806679773725550000},
+{50.00,   41.25,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   8.920049748791770000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   9.165798615967480000},
+{50.00,   41.25,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   9.959094645483170000},
+{50.00,   41.25,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   10.982693660754800000},
+{50.00,   41.25,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   15.502116628943400000},
+{50.00,   50.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.258895331210514000},
+{50.00,   50.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   1.262099984656890000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   2.658267314757330000},
+{50.00,   50.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   4.347081081419420000},
+{50.00,   50.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   5.904665363304020000},
+{50.00,   50.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   11.486445386292500000},
+{50.00,   60.75,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.000000000000000000},
+{50.00,   60.75,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   0.000436135893052522},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   0.199576273789990000},
+{50.00,   60.75,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   1.149382650832590000},
+{50.00,   60.75,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   2.427873749477470000},
+{50.00,   60.75,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   7.940172715926700000},
+{50.00,   41.25,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   8.806679773725550000},
+{50.00,   41.25,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   8.920049748791770000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   9.165798615967480000},
+{50.00,   41.25,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   9.959094645483170000},
+{50.00,   41.25,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   10.982693660754800000},
+{50.00,   41.25,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   15.502116628943400000},
+{50.00,   50.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.258895331210514000},
+{50.00,   50.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   1.262099984656890000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   2.658267314757330000},
+{50.00,   50.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   4.347081081419420000},
+{50.00,   50.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   5.904665363304020000},
+{50.00,   50.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   11.486445386292500000},
+{50.00,   60.75,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.000000000000000000},
+{50.00,   60.75,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   0.000436135893052522},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   0.199576273789990000},
+{50.00,   60.75,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   1.149382650832590000},
+{50.00,   60.75,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   2.427873749477470000},
+{50.00,   60.75,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   7.940172715926700000},
+{50.00,   41.25,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   8.806679773725550000},
+{50.00,   41.25,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   8.920049748791770000},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   9.165798615967480000},
+{50.00,   41.25,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   9.959094645483170000},
+{50.00,   41.25,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   10.982693660754800000},
+{50.00,   41.25,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   15.502116628943400000},
+{50.00,   50.00,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.258895331210514000},
+{50.00,   50.00,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   1.262099984656890000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   2.658267314757330000},
+{50.00,   50.00,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   4.347081081419420000},
+{50.00,   50.00,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   5.904665363304020000},
+{50.00,   50.00,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   11.486445386292500000},
+{50.00,   60.75,  0.0275,   0.00,   0.05,   0.05,   "C",   0.00,   0.000000000000000000},
+{50.00,   60.75,  0.0275,   0.00,   0.15,   0.15,   "C",   0.00,   0.000436135893052522},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.25,   "C",   0.00,   0.199576273789990000},
+{50.00,   60.75,  0.0275,   0.00,   0.35,   0.35,   "C",   0.00,   1.149382650832590000},
+{50.00,   60.75,  0.0275,   0.00,   0.45,   0.40,   "C",   0.00,   2.427873749477470000},
+{50.00,   60.75,  0.0275,   0.00,   0.65,   0.75,   "C",   0.00,   7.940172715926700000},
+{50.00,   41.25,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.000000000000000000},
+{50.00,   41.25,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   0.000243964002132480},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   0.133177489278275000},
+{50.00,   41.25,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   0.813967992892385000},
+{50.00,   41.25,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   1.781430160238800000},
+{50.00,   41.25,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   5.910049051264370000},
+{50.00,   50.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.190192575179547000},
+{50.00,   50.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   1.056274790972470000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   2.315696252103760000},
+{50.00,   50.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   3.868139684339690000},
+{50.00,   50.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   5.357679302072460000},
+{50.00,   50.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   10.465757413348100000},
+{50.00,   60.75,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   10.666526151422400000},
+{50.00,   60.75,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   10.500358525566500000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   10.533352432665900000},
+{50.00,   60.75,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   11.317468853380700000},
+{50.00,   60.75,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   12.513285685081100000},
+{50.00,   60.75,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   17.450036828799400000},
+{50.00,   41.25,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.000000000000000000},
+{50.00,   41.25,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   0.000243964002132480},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   0.133177489278275000},
+{50.00,   41.25,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   0.813967992892385000},
+{50.00,   41.25,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   1.781430160238800000},
+{50.00,   41.25,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   5.910049051264370000},
+{50.00,   50.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.190192575179547000},
+{50.00,   50.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   1.056274790972470000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   2.315696252103760000},
+{50.00,   50.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   3.868139684339690000},
+{50.00,   50.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   5.357679302072460000},
+{50.00,   50.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   10.465757413348100000},
+{50.00,   60.75,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   10.666526151422400000},
+{50.00,   60.75,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   10.500358525566500000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   10.533352432665900000},
+{50.00,   60.75,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   11.317468853380700000},
+{50.00,   60.75,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   12.513285685081100000},
+{50.00,   60.75,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   17.450036828799400000},
+{50.00,   41.25,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.000000000000000000},
+{50.00,   41.25,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   0.000243964002132480},
+{50.00,   41.25,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   0.133177489278275000},
+{50.00,   41.25,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   0.813967992892385000},
+{50.00,   41.25,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   1.781430160238800000},
+{50.00,   41.25,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   5.910049051264370000},
+{50.00,   50.00,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   0.190192575179547000},
+{50.00,   50.00,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   1.056274790972470000},
+{50.00,   50.00,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   2.315696252103760000},
+{50.00,   50.00,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   3.868139684339690000},
+{50.00,   50.00,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   5.357679302072460000},
+{50.00,   50.00,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   10.465757413348100000},
+{50.00,   60.75,  0.0275,   0.00,   0.05,   0.05,   "P",   0.00,   10.666526151422400000},
+{50.00,   60.75,  0.0275,   0.00,   0.15,   0.15,   "P",   0.00,   10.500358525566500000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   10.533352432665900000},
+{50.00,   60.75,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   11.317468853380700000},
+{50.00,   60.75,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   12.513285685081100000},
+{50.00,   60.75,  0.0275,   0.00,   0.65,   0.75,   "P",   0.00,   17.450036828799400000},
+{50.00,   60.75,  0.0275,   0.00,   0.25,   0.25,   "P",   0.00,   10.533352432665900000},
+{50.00,   60.75,  0.0275,   0.00,   0.35,   0.35,   "P",   0.00,   11.317468853380700000},
+{50.00,   60.75,  0.0275,   0.00,   0.45,   0.40,   "P",   0.00,   12.513285685081100000},
+{100.00,   110.00,  0.1000,   0.00,   0.25,   0.50,   "C",   0.00,   5.123575416865320000},
+{100.00,   110.00,  0.1000,   0.00,   0.25,   1.00,   "C",   0.00,   10.160055944516600000},
+{100.00,   90.00,  0.1000,   0.00,   0.50,   0.10,   "C",   0.00,   12.919509619564700000},
+{100.00,   90.00,  0.1000,   0.00,   0.50,   0.50,   "C",   0.00,   21.438280655724400000},
+{100.00,   90.00,  0.1000,   0.00,   0.50,   1.00,   "C",   0.00,   28.643647264488200000},
+{100.00,   100.00,  0.1000,   0.00,   0.50,   0.10,   "C",   0.00,   6.779936664291260000},
+{100.00,   100.00,  0.1000,   0.00,   0.50,   0.50,   "C",   0.00,   16.263193147074300000},
+{100.00,   100.00,  0.1000,   0.00,   0.50,   1.00,   "C",   0.00,   23.926745214162700000},
+{100.00,   110.00,  0.1000,   0.00,   0.50,   0.10,   "C",   0.00,   3.061909566605540000},
+{100.00,   110.00,  0.1000,   0.00,   0.50,   0.50,   "C",   0.00,   12.155688815568700000},
+{100.00,   110.00,  0.1000,   0.00,   0.50,   1.00,   "C",   0.00,   19.929858372066300000},
+{100.00,   90.00,  0.1000,   0.00,   0.10,   0.10,   "P",   0.00,   0.000095752219082624},
+{100.00,   90.00,  0.1000,   0.00,   0.10,   0.50,   "P",   0.00,   0.032219033907538300},
+{100.00,   90.00,  0.1000,   0.00,   0.10,   1.00,   "P",   0.00,   0.066226743903883000},
+{100.00,   100.00,  0.1000,   0.00,   0.10,   0.10,   "P",   0.00,   0.819967493295226000},
+{100.00,   100.00,  0.1000,   0.00,   0.10,   0.50,   "P",   0.00,   0.973216054356396000},
+{100.00,   100.00,  0.1000,   0.00,   0.10,   1.00,   "P",   0.00,   0.791889047262800000},
+{100.00,   110.00,  0.1000,   0.00,   0.10,   0.10,   "P",   0.00,   8.909004787274070000},
+{100.00,   110.00,  0.1000,   0.00,   0.10,   0.50,   "P",   0.00,   5.775959538905960000},
+{100.00,   110.00,  0.1000,   0.00,   0.10,   1.00,   "P",   0.00,   3.748863004264400000},
diff --git a/user/apps/parlib/pthread/pthread_test.c b/user/apps/parlib/pthread/pthread_test.c
new file mode 100644 (file)
index 0000000..d474931
--- /dev/null
@@ -0,0 +1,33 @@
+#include <stdlib.h>
+#include <assert.h>
+#include <pthread.h>
+#include <hart.h>
+#include <stdio.h>
+
+void* func(void* arg)
+{
+       int id = (int)arg;
+
+       printf("Hello from pthread %d!\n",id);
+
+       return arg;
+}
+
+int main()
+{
+       int i;
+       pthread_t* t = (pthread_t*)malloc(sizeof(pthread_t)*(hart_max_harts()-1));
+
+       for(i = 0; i < hart_max_harts()-1; i++)
+               pthread_create(&t[i],NULL,&func,(void*)(i+1));
+
+       for(i = 0; i < hart_max_harts()-1; i++)
+       {
+               void* x = 0;
+               pthread_join(t[i],&x);
+               assert((long)x == i+1);
+       }
+
+       printf("Pthreads joined!  Bye...\n");
+       return 0;
+}
index 7258923..e58e749 100644 (file)
@@ -3,9 +3,11 @@ USER_PARLIB_INCLUDE_DIR  := $(USER_PARLIB_DIR)/inc
 \r
 # This is defined here for use by the parlib library\r
 USER_PARLIB_NEWLIB_DIR := $(USER_PARLIB_DIR)/newlib\r
+USER_PARLIB_PTHREAD_DIR := $(USER_PARLIB_DIR)/pthread\r
 \r
 include $(USER_PARLIB_DIR)/src/$(TARGET_ARCH)/Makefrag\r
 include $(USER_PARLIB_DIR)/src/Makefrag\r
 include $(USER_PARLIB_DIR)/ivy/Makefrag\r
+include $(USER_PARLIB_DIR)/pthread/Makefrag\r
 \r
 .PRECIOUS: $(OBJDIR)/$(USER_PARLIB_DIR)/%.o \r
diff --git a/user/parlib/pthread/Makefrag b/user/parlib/pthread/Makefrag
new file mode 100644 (file)
index 0000000..1c48a9d
--- /dev/null
@@ -0,0 +1,27 @@
+USER_PARLIB_PTHREAD_INCLUDE_DIR  := $(USER_PARLIB_PTHREAD_DIR)/include\r
+USER_PARLIB_PTHREAD_SRC_DIR  := $(USER_PARLIB_PTHREAD_DIR)/src\r
+\r
+OBJDIRS += $(USER_PARLIB_PTHREAD_DIR)\r
+\r
+include $(USER_PARLIB_PTHREAD_DIR)/src/Makefrag\r
+\r
+USER_PARLIB_PTHREAD_SRCFILES := $(USER_PARLIB_PTHREAD_SRC_SRCFILES)\r
+\r
+USER_PARLIB_PTHREAD_OBJFILES := $(patsubst $(USER_PARLIB_PTHREAD_DIR)/%.c, \\r
+                            $(OBJDIR)/$(USER_PARLIB_PTHREAD_DIR)/%.o, \\r
+                            $(USER_PARLIB_PTHREAD_SRCFILES))\r
+USER_PARLIB_PTHREAD_OBJFILES := $(patsubst $(USER_PARLIB_PTHREAD_DIR)/%.S, \\r
+                            $(OBJDIR)/$(USER_PARLIB_PTHREAD_DIR)/%.o, \\r
+                            $(USER_PARLIB_PTHREAD_OBJFILES))\r
+\r
+USER_PARLIB_PTHREAD_SRC_CFLAGS := -I$(USER_PARLIB_PTHREAD_INCLUDE_DIR) $(USER_PARLIB_SRC_CFLAGS)\r
+\r
+$(OBJDIR)/$(USER_PARLIB_PTHREAD_DIR)/%.o: $(USER_PARLIB_PTHREAD_DIR)/%.c\r
+       @echo + cc [PARLIB] $<\r
+       @mkdir -p $(@D)\r
+       $(V)$(CC) $(USER_PARLIB_PTHREAD_SRC_CFLAGS) -c -o $@ $<\r
+\r
+$(OBJDIR)/$(USER_PARLIB_PTHREAD_DIR)/libpthread.a: $(USER_PARLIB_PTHREAD_OBJFILES)\r
+       @echo + ar [PARLIB] $@\r
+       @mkdir -p $(@D)\r
+       $(V)$(AR) r $@ $(USER_PARLIB_PTHREAD_OBJFILES) 2>/dev/null\r
diff --git a/user/parlib/pthread/include/pthread.h b/user/parlib/pthread/include/pthread.h
new file mode 100644 (file)
index 0000000..59216d8
--- /dev/null
@@ -0,0 +1,117 @@
+#ifndef _PTHREAD_H
+#define _PTHREAD_H
+
+#include <hart.h>
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+struct pthread_wqt
+{
+  void* (*start_routine)(void*);
+  void* arg;
+  int finished;
+  int detached;
+  struct pthread_wqt* next;
+};
+
+typedef struct
+{
+  int* local_sense;
+  volatile int sense;
+  int count;
+  int nprocs;
+  hart_lock_t lock;
+} pthread_barrier_t;
+
+typedef struct
+{
+  int type;
+} pthread_mutexattr_t;
+
+typedef struct
+{
+  const pthread_mutexattr_t* attr;
+  size_t lock;
+} pthread_mutex_t;
+
+typedef struct
+{
+  int pshared;
+} pthread_condattr_t;
+
+typedef struct
+{
+  const pthread_condattr_t* attr;
+  int waiters[HART_MAX_MAX_HARTS];
+} pthread_cond_t;
+
+typedef struct pthread_wqt work_queue_t;
+typedef work_queue_t* pthread_t;
+typedef int pthread_attr_t;
+typedef int pthread_barrierattr_t;
+typedef size_t pthread_once_t;
+typedef void** pthread_key_t;
+
+#define PTHREAD_ONCE_INIT 0
+#define PTHREAD_BARRIER_SERIAL_THREAD 12345
+#define PTHREAD_MUTEX_INITIALIZER {0}
+#define PTHREAD_MUTEX_NORMAL 0
+#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL
+#define PTHREAD_COND_INITIALIZER {0}
+#define PTHREAD_PROCESS_PRIVATE 0
+
+int pthread_attr_init(pthread_attr_t *);
+int pthread_attr_destroy(pthread_attr_t *);
+int pthread_create(pthread_t *, const pthread_attr_t *,
+                   void *(*)(void *), void *);
+int pthread_join(pthread_t, void **);
+
+int pthread_mutex_destroy(pthread_mutex_t *);
+int pthread_mutex_init(pthread_mutex_t *, const pthread_mutexattr_t *);
+int pthread_mutex_lock(pthread_mutex_t *);
+int pthread_mutex_trylock(pthread_mutex_t *);
+int pthread_mutex_unlock(pthread_mutex_t *);
+int pthread_mutex_destroy(pthread_mutex_t *);
+
+int pthread_mutexattr_init(pthread_mutexattr_t *);
+int pthread_mutexattr_destroy(pthread_mutexattr_t *);
+int pthread_mutexattr_gettype(const pthread_mutexattr_t *, int *);
+int pthread_mutexattr_settype(pthread_mutexattr_t *, int);
+
+int pthread_cond_init(pthread_cond_t *, const pthread_condattr_t *);
+int pthread_cond_destroy(pthread_cond_t *);
+int pthread_cond_broadcast(pthread_cond_t *);
+int pthread_cond_signal(pthread_cond_t *);
+int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
+
+int pthread_condattr_init(pthread_condattr_t *);
+int pthread_condattr_destroy(pthread_condattr_t *);
+int pthread_condattr_setpshared(pthread_condattr_t *, int);
+int pthread_condattr_getpshared(pthread_condattr_t *, int *);
+
+#define pthread_rwlock_t pthread_mutex_t
+#define pthread_rwlockattr_t pthread_mutexattr_t
+#define pthread_rwlock_destroy pthread_mutex_destroy
+#define pthread_rwlock_init pthread_mutex_init
+#define pthread_rwlock_unlock pthread_mutex_unlock
+#define pthread_rwlock_rdlock pthread_mutex_lock
+#define pthread_rwlock_wrlock pthread_mutex_lock
+#define pthread_rwlock_tryrdlock pthread_mutex_trylock
+#define pthread_rwlock_trywrlock pthread_mutex_trylock
+
+pthread_t pthread_self();
+int pthread_equal(pthread_t t1, pthread_t t2);
+void pthread_exit(void* ret);
+int pthread_once(pthread_once_t* once_control, void (*init_routine)(void));
+
+int pthread_barrier_init(pthread_barrier_t* b, const pthread_barrierattr_t* a, int count);
+int pthread_barrier_wait(pthread_barrier_t* b);
+int pthread_barrier_destroy(pthread_barrier_t* b);
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif
diff --git a/user/parlib/pthread/src/Makefrag b/user/parlib/pthread/src/Makefrag
new file mode 100644 (file)
index 0000000..ddb2bfc
--- /dev/null
@@ -0,0 +1,12 @@
+# Makefile fragment for ROS kernel.
+# This is NOT a complete makefile;
+# you must run GNU make in the top-level directory
+# where the GNUmakefile is located.
+#
+
+# We also snatch the use of a couple handy source files
+# from the lib directory, to avoid gratuitous code duplication.
+
+USER_PARLIB_PTHREAD_SRC_SRCFILES := $(USER_PARLIB_PTHREAD_SRC_DIR)/pthread.c
+
+OBJDIRS += $(USER_PARLIB_PTHREAD_SRC_DIR)
diff --git a/user/parlib/pthread/src/pthread.c b/user/parlib/pthread/src/pthread.c
new file mode 100644 (file)
index 0000000..7fb1253
--- /dev/null
@@ -0,0 +1,289 @@
+#include <pthread.h>
+#include <hart.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+int threads_left = 1;
+hart_lock_t work_queue_lock = HART_LOCK_INIT;
+pthread_t work_queue_head = 0;
+pthread_t work_queue_tail = 0;
+pthread_once_t init_once = PTHREAD_ONCE_INIT;
+pthread_t active_threads[HART_MAX_MAX_HARTS] = {0};
+
+void queue_insert(pthread_t* head, pthread_t* tail, pthread_t node)
+{
+  node->next = 0;
+  if(*head == 0)
+    *head = node;
+  else
+    (*tail)->next = node;
+  *tail = node;
+}
+
+pthread_t queue_remove(pthread_t* head, pthread_t* tail)
+{
+  pthread_t node = *head;
+  *head = (*head)->next;
+  if(*head == 0)
+    *tail = 0;
+  node->next = 0;
+  return node;
+}
+
+void hart_entry()
+{
+  hart_lock_lock(&work_queue_lock);
+  pthread_t node = queue_remove(&work_queue_head,&work_queue_tail);
+  hart_lock_unlock(&work_queue_lock);
+
+  active_threads[hart_self()] = node;
+
+  pthread_exit(node->start_routine(node->arg));
+}
+
+void _pthread_init()
+{
+  // if we allocated active_threads dynamically, we'd do so here
+}
+
+int pthread_attr_init(pthread_attr_t *a)
+{
+  return 0;
+}
+
+int pthread_attr_destroy(pthread_attr_t *a)
+{
+  return 0;
+}
+
+int pthread_create(pthread_t* thread, const pthread_attr_t* attr,
+                   void *(*start_routine)(void *), void* arg)
+{
+  pthread_once(&init_once,&_pthread_init);
+
+  *thread = (pthread_t)malloc(sizeof(work_queue_t));
+  (*thread)->start_routine = start_routine;
+  (*thread)->arg = arg;
+  (*thread)->next = 0;
+  (*thread)->finished = 0;
+  (*thread)->detached = 0;
+
+  hart_lock_lock(&work_queue_lock);
+  threads_left++;
+  queue_insert(&work_queue_head,&work_queue_tail,*thread);
+  hart_lock_unlock(&work_queue_lock);
+
+  // don't return until we get a hart
+  while(hart_request(1));
+  return 0;
+}
+
+int pthread_join(pthread_t t, void** arg)
+{
+  volatile pthread_t thread = t;
+  while(!thread->finished);
+  if(arg) *arg = thread->arg;
+  free(thread);
+  return 0;
+}
+
+int pthread_mutexattr_init(pthread_mutexattr_t* attr)
+{
+  attr->type = PTHREAD_MUTEX_DEFAULT;
+  return 0;
+}
+
+int pthread_mutexattr_destroy(pthread_mutexattr_t* attr)
+{
+  return 0;
+}
+
+int pthread_mutexattr_gettype(const pthread_mutexattr_t* attr, int* type)
+{
+  *type = attr ? attr->type : PTHREAD_MUTEX_DEFAULT;
+  return 0;
+}
+
+int pthread_mutexattr_settype(pthread_mutexattr_t* attr, int type)
+{
+  if(type != PTHREAD_MUTEX_NORMAL)
+    return -EINVAL;
+  attr->type = type;
+  return 0;
+}
+
+int pthread_mutex_init(pthread_mutex_t* m, const pthread_mutexattr_t* attr)
+{
+  m->attr = attr;
+  m->lock = 0;
+  return 0;
+}
+
+int pthread_mutex_lock(pthread_mutex_t* m)
+{
+  while(pthread_mutex_trylock(m))
+    while((volatile size_t*)m->lock);
+  return 0;
+}
+
+int pthread_mutex_trylock(pthread_mutex_t* m)
+{
+  return hart_swap(&m->lock,1) == 0 ? 0 : -EBUSY;
+}
+
+int pthread_mutex_unlock(pthread_mutex_t* m)
+{
+  m->lock = 0;
+  return 0;
+}
+
+int pthread_mutex_destroy(pthread_mutex_t* m)
+{
+  return 0;
+}
+
+int pthread_cond_init(pthread_cond_t *c, const pthread_condattr_t *a)
+{
+  c->attr = a;
+  memset(c->waiters,0,sizeof(c->waiters));
+  return 0;
+}
+
+int pthread_cond_destroy(pthread_cond_t *c)
+{
+  return 0;
+}
+
+int pthread_cond_broadcast(pthread_cond_t *c)
+{
+  memset(c->waiters,0,sizeof(c->waiters));
+  return 0;
+}
+
+int pthread_cond_signal(pthread_cond_t *c)
+{
+  int i;
+  for(i = 0; i < hart_max_harts(); i++)
+  {
+    if(c->waiters[i])
+    {
+      c->waiters[i] = 0;
+      break;
+    }
+  }
+  return 0;
+}
+
+int pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m)
+{
+  c->waiters[hart_self()] = 1;
+  pthread_mutex_unlock(m);
+
+  volatile int* poll = &c->waiters[hart_self()];
+  while(*poll);
+
+  pthread_mutex_lock(m);
+
+  return 0;
+}
+
+int pthread_condattr_init(pthread_condattr_t *a)
+{
+  a = PTHREAD_PROCESS_PRIVATE;
+  return 0;
+}
+
+int pthread_condattr_destroy(pthread_condattr_t *a)
+{
+  return 0;
+}
+
+int pthread_condattr_setpshared(pthread_condattr_t *a, int s)
+{
+  a->pshared = s;
+  return 0;
+}
+
+int pthread_condattr_getpshared(pthread_condattr_t *a, int *s)
+{
+  *s = a->pshared;
+  return 0;
+}
+
+pthread_t pthread_self()
+{
+  return active_threads[hart_self()];
+}
+
+int pthread_equal(pthread_t t1, pthread_t t2)
+{
+  return t1 == t2;
+}
+
+void pthread_exit(void* ret)
+{
+  pthread_once(&init_once,&_pthread_init);
+
+  pthread_t t = pthread_self();
+
+  hart_lock_lock(&work_queue_lock);
+  threads_left--;
+  if(threads_left == 0)
+    exit(0);
+  hart_lock_unlock(&work_queue_lock);
+
+  if(t)
+  {
+    t->arg = ret;
+    t->finished = 1;
+    if(t->detached)
+      free(t);
+  }
+
+  hart_yield();
+}
+
+int pthread_once(pthread_once_t* once_control, void (*init_routine)(void))
+{
+  if(hart_swap(once_control,1) == 0)
+    init_routine();
+  return 0;
+}
+
+int pthread_barrier_init(pthread_barrier_t* b, const pthread_barrierattr_t* a, int count)
+{
+  b->local_sense = (int*)calloc(32*sizeof(int),count);
+  b->sense = 0;
+  b->nprocs = b->count = count;
+  hart_lock_init(&b->lock);
+  return 0;
+}
+
+int pthread_barrier_wait(pthread_barrier_t* b)
+{
+  int id = hart_self();
+  int ls = b->local_sense[32*id] = 1 - b->local_sense[32*id];
+
+  hart_lock_lock(&b->lock);
+  int count = --b->count;
+  hart_lock_unlock(&b->lock);
+
+  if(count == 0)
+  {
+    b->count = b->nprocs;
+    b->sense = ls;
+    return PTHREAD_BARRIER_SERIAL_THREAD;
+  }
+  else
+  {
+    while(b->sense != ls);
+    return 0;
+  }
+}
+
+int pthread_barrier_destroy(pthread_barrier_t* b)
+{
+  free(b->local_sense);
+  return 0;
+}