Commit 274a4464 authored by chaitanyavarma's avatar chaitanyavarma

Initial Commit

parents
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
#
# Students' Makefile for the Malloc Lab
#
TEAM = TIGERS
VERSION = 1
CC = gcc
CFLAGS = -Wall -O2 -m32
OBJS = mdriver.o mm.o memlib.o fsecs.o fcyc.o clock.o ftimer.o
OBJS1 = mdriver.o mm1.o memlib.o fsecs.o fcyc.o clock.o ftimer.o
OBJS2 = mdriver.o mm2.o memlib.o fsecs.o fcyc.o clock.o ftimer.o
mdriver: $(OBJS) $(OBJS1) $(OBJS2)
$(CC) $(CFLAGS) -o mdriver $(OBJS)
$(CC) $(CFLAGS) -o mdriver1 $(OBJS1)
$(CC) $(CFLAGS) -o mdriver2 $(OBJS2)
mdriver.o: mdriver.c fsecs.h fcyc.h clock.h memlib.h config.h mm.h
memlib.o: memlib.c memlib.h
mm.o: mm.c mm.h memlib.h
mm1.o: mm1.c mm.h memlib.h
mm2.o: mm2.c mm.h memlib.h
fsecs.o: fsecs.c fsecs.h config.h
fcyc.o: fcyc.c fcyc.h
ftimer.o: ftimer.c ftimer.h config.h
clock.o: clock.c clock.h
clean:
rm -f *~ *.o mdriver
rm -f *~ *.o mdriver1
rm -f *~ *.o mdriver2
#####################################################################
# CS:APP Malloc Lab
# Handout files for students
#
# Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved.
# May not be used, modified, or copied without permission.
#
######################################################################
***********
Main Files:
***********
mdriver.c
The malloc driver that tests your mm.c file
short{1,2}-bal.rep
Two tiny tracefiles to help you get started.
Makefile
Builds the driver
**********************************
Other support files for the driver
**********************************
config.h Configures the malloc lab driver
fsecs.{c,h} Wrapper function for the different timer packages
clock.{c,h} Routines for accessing the Pentium and Alpha cycle counters
fcyc.{c,h} Timer functions based on cycle counters
ftimer.{c,h} Timer functions based on interval timers and gettimeofday()
memlib.{c,h} Models the heap and sbrk function
*******************************
Building and running the driver
*******************************
To build the driver, type "make" to the shell.
To run the driver on a tiny test trace: (for the naive implementation)
shell> ./mdriver -V -f traces/short1-bal.rep
To run the driver on a tiny test trace: (for the mm1.c)
shell> ./mdriver1 -V -f traces/short1-bal.rep
To run the driver on a tiny test trace: (for the mm2.c)
shell> ./mdriver2 -V -f traces/short1-bal.rep
The -V option prints out helpful tracing and summary information.
To get a list of the driver flags:
shell> ./mdriver -h
/*
* clock.c - Routines for using the cycle counters on x86,
* Alpha, and Sparc boxes.
*
* Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved.
* May not be used, modified, or copied without permission.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/times.h>
#include "clock.h"
/*******************************************************
* Machine dependent functions
*
* Note: the constants __i386__ and __alpha
* are set by GCC when it calls the C preprocessor
* You can verify this for yourself using gcc -v.
*******************************************************/
#if defined(__i386__)
/*******************************************************
* Pentium versions of start_counter() and get_counter()
*******************************************************/
/* $begin x86cyclecounter */
/* Initialize the cycle counter */
static unsigned cyc_hi = 0;
static unsigned cyc_lo = 0;
/* Set *hi and *lo to the high and low order bits of the cycle counter.
Implementation requires assembly code to use the rdtsc instruction. */
void access_counter(unsigned *hi, unsigned *lo)
{
asm("rdtsc; movl %%edx,%0; movl %%eax,%1" /* Read cycle counter */
: "=r" (*hi), "=r" (*lo) /* and move results to */
: /* No input */ /* the two outputs */
: "%edx", "%eax");
}
/* Record the current value of the cycle counter. */
void start_counter()
{
access_counter(&cyc_hi, &cyc_lo);
}
/* Return the number of cycles since the last call to start_counter. */
double get_counter()
{
unsigned ncyc_hi, ncyc_lo;
unsigned hi, lo, borrow;
double result;
/* Get cycle counter */
access_counter(&ncyc_hi, &ncyc_lo);
/* Do double precision subtraction */
lo = ncyc_lo - cyc_lo;
borrow = lo > ncyc_lo;
hi = ncyc_hi - cyc_hi - borrow;
result = (double) hi * (1 << 30) * 4 + lo;
if (result < 0) {
fprintf(stderr, "Error: counter returns neg value: %.0f\n", result);
}
return result;
}
/* $end x86cyclecounter */
#elif defined(__alpha)
/****************************************************
* Alpha versions of start_counter() and get_counter()
***************************************************/
/* Initialize the cycle counter */
static unsigned cyc_hi = 0;
static unsigned cyc_lo = 0;
/* Use Alpha cycle timer to compute cycles. Then use
measured clock speed to compute seconds
*/
/*
* counterRoutine is an array of Alpha instructions to access
* the Alpha's processor cycle counter. It uses the rpcc
* instruction to access the counter. This 64 bit register is
* divided into two parts. The lower 32 bits are the cycles
* used by the current process. The upper 32 bits are wall
* clock cycles. These instructions read the counter, and
* convert the lower 32 bits into an unsigned int - this is the
* user space counter value.
* NOTE: The counter has a very limited time span. With a
* 450MhZ clock the counter can time things for about 9
* seconds. */
static unsigned int counterRoutine[] =
{
0x601fc000u,
0x401f0000u,
0x6bfa8001u
};
/* Cast the above instructions into a function. */
static unsigned int (*counter)(void)= (void *)counterRoutine;
void start_counter()
{
/* Get cycle counter */
cyc_hi = 0;
cyc_lo = counter();
}
double get_counter()
{
unsigned ncyc_hi, ncyc_lo;
unsigned hi, lo, borrow;
double result;
ncyc_lo = counter();
ncyc_hi = 0;
lo = ncyc_lo - cyc_lo;
borrow = lo > ncyc_lo;
hi = ncyc_hi - cyc_hi - borrow;
result = (double) hi * (1 << 30) * 4 + lo;
if (result < 0) {
fprintf(stderr, "Error: Cycle counter returning negative value: %.0f\n", result);
}
return result;
}
#else
/****************************************************************
* All the other platforms for which we haven't implemented cycle
* counter routines. Newer models of sparcs (v8plus) have cycle
* counters that can be accessed from user programs, but since there
* are still many sparc boxes out there that don't support this, we
* haven't provided a Sparc version here.
***************************************************************/
void start_counter()
{
printf("ERROR: You are trying to use a start_counter routine in clock.c\n");
printf("that has not been implemented yet on this platform.\n");
printf("Please choose another timing package in config.h.\n");
exit(1);
}
double get_counter()
{
printf("ERROR: You are trying to use a get_counter routine in clock.c\n");
printf("that has not been implemented yet on this platform.\n");
printf("Please choose another timing package in config.h.\n");
exit(1);
}
#endif
/*******************************
* Machine-independent functions
******************************/
double ovhd()
{
/* Do it twice to eliminate cache effects */
int i;
double result;
for (i = 0; i < 2; i++) {
start_counter();
result = get_counter();
}
return result;
}
/* $begin mhz */
/* Estimate the clock rate by measuring the cycles that elapse */
/* while sleeping for sleeptime seconds */
double mhz_full(int verbose, int sleeptime)
{
double rate;
start_counter();
sleep(sleeptime);
rate = get_counter() / (1e6*sleeptime);
if (verbose)
printf("Processor clock rate ~= %.1f MHz\n", rate);
return rate;
}
/* $end mhz */
/* Version using a default sleeptime */
double mhz(int verbose)
{
return mhz_full(verbose, 2);
}
/** Special counters that compensate for timer interrupt overhead */
static double cyc_per_tick = 0.0;
#define NEVENT 100
#define THRESHOLD 1000
#define RECORDTHRESH 3000
/* Attempt to see how much time is used by timer interrupt */
static void callibrate(int verbose)
{
double oldt;
struct tms t;
clock_t oldc;
int e = 0;
times(&t);
oldc = t.tms_utime;
start_counter();
oldt = get_counter();
while (e <NEVENT) {
double newt = get_counter();
if (newt-oldt >= THRESHOLD) {
clock_t newc;
times(&t);
newc = t.tms_utime;
if (newc > oldc) {
double cpt = (newt-oldt)/(newc-oldc);
if ((cyc_per_tick == 0.0 || cyc_per_tick > cpt) && cpt > RECORDTHRESH)
cyc_per_tick = cpt;
/*
if (verbose)
printf("Saw event lasting %.0f cycles and %d ticks. Ratio = %f\n",
newt-oldt, (int) (newc-oldc), cpt);
*/
e++;
oldc = newc;
}
oldt = newt;
}
}
if (verbose)
printf("Setting cyc_per_tick to %f\n", cyc_per_tick);
}
static clock_t start_tick = 0;
void start_comp_counter()
{
struct tms t;
if (cyc_per_tick == 0.0)
callibrate(0);
times(&t);
start_tick = t.tms_utime;
start_counter();
}
double get_comp_counter()
{
double time = get_counter();
double ctime;
struct tms t;
clock_t ticks;
times(&t);
ticks = t.tms_utime - start_tick;
ctime = time - ticks*cyc_per_tick;
/*
printf("Measured %.0f cycles. Ticks = %d. Corrected %.0f cycles\n",
time, (int) ticks, ctime);
*/
return ctime;
}
/* Routines for using cycle counter */
/* Start the counter */
void start_counter();
/* Get # cycles since counter started */
double get_counter();
/* Measure overhead for counter */
double ovhd();
/* Determine clock rate of processor (using a default sleeptime) */
double mhz(int verbose);
/* Determine clock rate of processor, having more control over accuracy */
double mhz_full(int verbose, int sleeptime);
/** Special counters that compensate for timer interrupt overhead */
void start_comp_counter();
double get_comp_counter();
File added
#ifndef __CONFIG_H_
#define __CONFIG_H_
/*
* config.h - malloc lab configuration file
*
* Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved.
* May not be used, modified, or copied without permission.
*/
/*
* This is the default path where the driver will look for the
* default tracefiles. You can override it at runtime with the -t flag.
*/
#define TRACEDIR "/afs/cs/project/ics2/im/labs/malloclab/traces/"
/*
* This is the list of default tracefiles in TRACEDIR that the driver
* will use for testing. Modify this if you want to add or delete
* traces from the driver's test suite. For example, if you don't want
* your students to implement realloc, you can delete the last two
* traces.
*/
#define DEFAULT_TRACEFILES \
"amptjp-bal.rep",\
"cccp-bal.rep",\
"cp-decl-bal.rep",\
"expr-bal.rep",\
"coalescing-bal.rep",\
"random-bal.rep",\
"random2-bal.rep",\
"binary-bal.rep",\
"binary2-bal.rep",\
"realloc-bal.rep",\
"realloc2-bal.rep"
/*
* This constant gives the estimated performance of the libc malloc
* package using our traces on some reference system, typically the
* same kind of system the students use. Its purpose is to cap the
* contribution of throughput to the performance index. Once the
* students surpass the AVG_LIBC_THRUPUT, they get no further benefit
* to their score. This deters students from building extremely fast,
* but extremely stupid malloc packages.
*/
#define AVG_LIBC_THRUPUT 600E3 /* 600 Kops/sec */
/*
* This constant determines the contributions of space utilization
* (UTIL_WEIGHT) and throughput (1 - UTIL_WEIGHT) to the performance
* index.
*/
#define UTIL_WEIGHT .60
/*
* Alignment requirement in bytes (either 4 or 8)
*/
#define ALIGNMENT 8
/*
* Maximum heap size in bytes
*/
#define MAX_HEAP (20*(1<<20)) /* 20 MB */
/*****************************************************************************
* Set exactly one of these USE_xxx constants to "1" to select a timing method
*****************************************************************************/
#define USE_FCYC 0 /* cycle counter w/K-best scheme (x86 & Alpha only) */
#define USE_ITIMER 0 /* interval timer (any Unix box) */
#define USE_GETTOD 1 /* gettimeofday (any Unix box) */
#endif /* __CONFIG_H */
/*
* fcyc.c - Estimate the time (in CPU cycles) used by a function f
*
* Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved.
* May not be used, modified, or copied without permission.
*
* Uses the cycle timer routines in clock.c to estimate the
* the time in CPU cycles for a function f.
*/
#include <stdlib.h>
#include <sys/times.h>
#include <stdio.h>
#include "fcyc.h"
#include "clock.h"
/* Default values */
#define K 3 /* Value of K in K-best scheme */
#define MAXSAMPLES 20 /* Give up after MAXSAMPLES */
#define EPSILON 0.01 /* K samples should be EPSILON of each other*/
#define COMPENSATE 0 /* 1-> try to compensate for clock ticks */
#define CLEAR_CACHE 0 /* Clear cache before running test function */
#define CACHE_BYTES (1<<19) /* Max cache size in bytes */
#define CACHE_BLOCK 32 /* Cache block size in bytes */
static int kbest = K;
static int maxsamples = MAXSAMPLES;
static double epsilon = EPSILON;
static int compensate = COMPENSATE;
static int clear_cache = CLEAR_CACHE;
static int cache_bytes = CACHE_BYTES;
static int cache_block = CACHE_BLOCK;
static int *cache_buf = NULL;
static double *values = NULL;
static int samplecount = 0;
/* for debugging only */
#define KEEP_VALS 0
#define KEEP_SAMPLES 0
#if KEEP_SAMPLES
static double *samples = NULL;
#endif
/*
* init_sampler - Start new sampling process
*/
static void init_sampler()
{
if (values)
free(values);
values = calloc(kbest, sizeof(double));
#if KEEP_SAMPLES
if (samples)
free(samples);
/* Allocate extra for wraparound analysis */
samples = calloc(maxsamples+kbest, sizeof(double));
#endif
samplecount = 0;
}
/*
* add_sample - Add new sample
*/
static void add_sample(double val)
{
int pos = 0;
if (samplecount < kbest) {
pos = samplecount;
values[pos] = val;
} else if (val < values[kbest-1]) {
pos = kbest-1;
values[pos] = val;
}
#if KEEP_SAMPLES
samples[samplecount] = val;
#endif
samplecount++;
/* Insertion sort */
while (pos > 0 && values[pos-1] > values[pos]) {
double temp = values[pos-1];
values[pos-1] = values[pos];
values[pos] = temp;
pos--;
}
}
/*
* has_converged- Have kbest minimum measurements converged within epsilon?
*/
static int has_converged()
{
return
(samplecount >= kbest) &&
((1 + epsilon)*values[0] >= values[kbest-1]);
}
/*
* clear - Code to clear cache
*/
static volatile int sink = 0;
static void clear()
{
int x = sink;
int *cptr, *cend;
int incr = cache_block/sizeof(int);
if (!cache_buf) {
cache_buf = malloc(cache_bytes);
if (!cache_buf) {
fprintf(stderr, "Fatal error. Malloc returned null when trying to clear cache\n");
exit(1);
}
}
cptr = (int *) cache_buf;
cend = cptr + cache_bytes/sizeof(int);
while (cptr < cend) {
x += *cptr;
cptr += incr;
}
sink = x;
}
/*
* fcyc - Use K-best scheme to estimate the running time of function f
*/
double fcyc(test_funct f, void *argp)
{
double result;
init_sampler();
if (compensate) {
do {
double cyc;
if (clear_cache)
clear();
start_comp_counter();
f(argp);
cyc = get_comp_counter();
add_sample(cyc);
} while (!has_converged() && samplecount < maxsamples);
} else {
do {
double cyc;
if (clear_cache)
clear();
start_counter();
f(argp);
cyc = get_counter();
add_sample(cyc);
} while (!has_converged() && samplecount < maxsamples);
}
#ifdef DEBUG
{
int i;
printf(" %d smallest values: [", kbest);
for (i = 0; i < kbest; i++)
printf("%.0f%s", values[i], i==kbest-1 ? "]\n" : ", ");
}
#endif
result = values[0];
#if !KEEP_VALS
free(values);
values = NULL;
#endif
return result;
}
/*************************************************************
* Set the various parameters used by the measurement routines
************************************************************/
/*
* set_fcyc_clear_cache - When set, will run code to clear cache
* before each measurement.
* Default = 0
*/
void set_fcyc_clear_cache(int clear)
{
clear_cache = clear;
}
/*
* set_fcyc_cache_size - Set size of cache to use when clearing cache
* Default = 1<<19 (512KB)
*/
void set_fcyc_cache_size(int bytes)
{
if (bytes != cache_bytes) {
cache_bytes = bytes;
if (cache_buf) {
free(cache_buf);
cache_buf = NULL;
}
}
}
/*
* set_fcyc_cache_block - Set size of cache block
* Default = 32
*/
void set_fcyc_cache_block(int bytes) {
cache_block = bytes;
}
/*
* set_fcyc_compensate- When set, will attempt to compensate for
* timer interrupt overhead
* Default = 0
*/
void set_fcyc_compensate(int compensate_arg)
{
compensate = compensate_arg;
}
/*
* set_fcyc_k - Value of K in K-best measurement scheme
* Default = 3
*/
void set_fcyc_k(int k)
{
kbest = k;
}
/*
* set_fcyc_maxsamples - Maximum number of samples attempting to find
* K-best within some tolerance.
* When exceeded, just return best sample found.
* Default = 20
*/
void set_fcyc_maxsamples(int maxsamples_arg)
{
maxsamples = maxsamples_arg;
}
/*
* set_fcyc_epsilon - Tolerance required for K-best
* Default = 0.01
*/
void set_fcyc_epsilon(double epsilon_arg)
{
epsilon = epsilon_arg;
}
/*
* fcyc.h - prototypes for the routines in fcyc.c that estimate the
* time in CPU cycles used by a test function f
*
* Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved.
* May not be used, modified, or copied without permission.
*
*/
/* The test function takes a generic pointer as input */
typedef void (*test_funct)(void *);
/* Compute number of cycles used by test function f */
double fcyc(test_funct f, void* argp);
/*********************************************************
* Set the various parameters used by measurement routines
*********************************************************/
/*
* set_fcyc_clear_cache - When set, will run code to clear cache
* before each measurement.
* Default = 0
*/
void set_fcyc_clear_cache(int clear);
/*
* set_fcyc_cache_size - Set size of cache to use when clearing cache
* Default = 1<<19 (512KB)
*/
void set_fcyc_cache_size(int bytes);
/*
* set_fcyc_cache_block - Set size of cache block
* Default = 32
*/
void set_fcyc_cache_block(int bytes);
/*
* set_fcyc_compensate- When set, will attempt to compensate for
* timer interrupt overhead
* Default = 0
*/
void set_fcyc_compensate(int compensate_arg);
/*
* set_fcyc_k - Value of K in K-best measurement scheme
* Default = 3
*/
void set_fcyc_k(int k);
/*
* set_fcyc_maxsamples - Maximum number of samples attempting to find
* K-best within some tolerance.
* When exceeded, just return best sample found.
* Default = 20
*/
void set_fcyc_maxsamples(int maxsamples_arg);
/*
* set_fcyc_epsilon - Tolerance required for K-best
* Default = 0.01
*/
void set_fcyc_epsilon(double epsilon_arg);
File added
/****************************
* High-level timing wrappers
****************************/
#include <stdio.h>
#include "fsecs.h"
#include "fcyc.h"
#include "clock.h"
#include "ftimer.h"
#include "config.h"
static double Mhz; /* estimated CPU clock frequency */
extern int verbose; /* -v option in mdriver.c */
/*
* init_fsecs - initialize the timing package
*/
void init_fsecs(void)
{
Mhz = 0; /* keep gcc -Wall happy */
#if USE_FCYC
if (verbose)
printf("Measuring performance with a cycle counter.\n");
/* set key parameters for the fcyc package */
set_fcyc_maxsamples(20);
set_fcyc_clear_cache(1);
set_fcyc_compensate(1);
set_fcyc_epsilon(0.01);
set_fcyc_k(3);
Mhz = mhz(verbose > 0);
#elif USE_ITIMER
if (verbose)
printf("Measuring performance with the interval timer.\n");
#elif USE_GETTOD
if (verbose)
printf("Measuring performance with gettimeofday().\n");
#endif
}
/*
* fsecs - Return the running time of a function f (in seconds)
*/
double fsecs(fsecs_test_funct f, void *argp)
{
#if USE_FCYC
double cycles = fcyc(f, argp);
return cycles/(Mhz*1e6);
#elif USE_ITIMER
return ftimer_itimer(f, argp, 10);
#elif USE_GETTOD
return ftimer_gettod(f, argp, 10);
#endif
}
typedef void (*fsecs_test_funct)(void *);
void init_fsecs(void);
double fsecs(fsecs_test_funct f, void *argp);
File added
/*
* ftimer.c - Estimate the time (in seconds) used by a function f
*
* Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved.
* May not be used, modified, or copied without permission.
*
* Function timers that estimate the running time (in seconds) of a function f.
* ftimer_itimer: version that uses the interval timer
* ftimer_gettod: version that uses gettimeofday
*/
#include <stdio.h>
#include <sys/time.h>
#include "ftimer.h"
/* function prototypes */
static void init_etime(void);
static double get_etime(void);
/*
* ftimer_itimer - Use the interval timer to estimate the running time
* of f(argp). Return the average of n runs.
*/
double ftimer_itimer(ftimer_test_funct f, void *argp, int n)
{
double start, tmeas;
int i;
init_etime();
start = get_etime();
for (i = 0; i < n; i++)
f(argp);
tmeas = get_etime() - start;
return tmeas / n;
}
/*
* ftimer_gettod - Use gettimeofday to estimate the running time of
* f(argp). Return the average of n runs.
*/
double ftimer_gettod(ftimer_test_funct f, void *argp, int n)
{
int i;
struct timeval stv, etv;
double diff;
gettimeofday(&stv, NULL);
for (i = 0; i < n; i++)
f(argp);
gettimeofday(&etv,NULL);
diff = 1E3*(etv.tv_sec - stv.tv_sec) + 1E-3*(etv.tv_usec-stv.tv_usec);
diff /= n;
return (1E-3*diff);
}
/*
* Routines for manipulating the Unix interval timer
*/
/* The initial value of the interval timer */
#define MAX_ETIME 86400
/* static variables that hold the initial value of the interval timer */
static struct itimerval first_u; /* user time */
static struct itimerval first_r; /* real time */
static struct itimerval first_p; /* prof time*/
/* init the timer */
static void init_etime(void)
{
first_u.it_interval.tv_sec = 0;
first_u.it_interval.tv_usec = 0;
first_u.it_value.tv_sec = MAX_ETIME;
first_u.it_value.tv_usec = 0;
setitimer(ITIMER_VIRTUAL, &first_u, NULL);
first_r.it_interval.tv_sec = 0;
first_r.it_interval.tv_usec = 0;
first_r.it_value.tv_sec = MAX_ETIME;
first_r.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &first_r, NULL);
first_p.it_interval.tv_sec = 0;
first_p.it_interval.tv_usec = 0;
first_p.it_value.tv_sec = MAX_ETIME;
first_p.it_value.tv_usec = 0;
setitimer(ITIMER_PROF, &first_p, NULL);
}
/* return elapsed real seconds since call to init_etime */
static double get_etime(void) {
struct itimerval v_curr;
struct itimerval r_curr;
struct itimerval p_curr;
getitimer(ITIMER_VIRTUAL, &v_curr);
getitimer(ITIMER_REAL,&r_curr);
getitimer(ITIMER_PROF,&p_curr);
return (double) ((first_p.it_value.tv_sec - r_curr.it_value.tv_sec) +
(first_p.it_value.tv_usec - r_curr.it_value.tv_usec)*1e-6);
}
/*
* Function timers
*/
typedef void (*ftimer_test_funct)(void *);
/* Estimate the running time of f(argp) using the Unix interval timer.
Return the average of n runs */
double ftimer_itimer(ftimer_test_funct f, void *argp, int n);
/* Estimate the running time of f(argp) using gettimeofday
Return the average of n runs */
double ftimer_gettod(ftimer_test_funct f, void *argp, int n);
File added
File added
/*
* mdriver.c - CS:APP Malloc Lab Driver
*
* Uses a collection of trace files to tests a malloc/free/realloc
* implementation in mm.c.
*
* Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved.
* May not be used, modified, or copied without permission.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <assert.h>
#include <float.h>
#include <time.h>
#include "mm.h"
#include "memlib.h"
#include "fsecs.h"
#include "config.h"
/**********************
* Constants and macros
**********************/
/* Misc */
#define MAXLINE 1024 /* max string size */
#define HDRLINES 4 /* number of header lines in a trace file */
#define LINENUM(i) (i+5) /* cnvt trace request nums to linenums (origin 1) */
/* Returns true if p is ALIGNMENT-byte aligned */
#define IS_ALIGNED(p) ((((unsigned int)(p)) % ALIGNMENT) == 0)
/******************************
* The key compound data types
*****************************/
/* Records the extent of each block's payload */
typedef struct range_t {
char *lo; /* low payload address */
char *hi; /* high payload address */
struct range_t *next; /* next list element */
} range_t;
/* Characterizes a single trace operation (allocator request) */
typedef struct {
enum {ALLOC, FREE, REALLOC} type; /* type of request */
int index; /* index for free() to use later */
int size; /* byte size of alloc/realloc request */
} traceop_t;
/* Holds the information for one trace file*/
typedef struct {
int sugg_heapsize; /* suggested heap size (unused) */
int num_ids; /* number of alloc/realloc ids */
int num_ops; /* number of distinct requests */
int weight; /* weight for this trace (unused) */
traceop_t *ops; /* array of requests */
char **blocks; /* array of ptrs returned by malloc/realloc... */
size_t *block_sizes; /* ... and a corresponding array of payload sizes */
} trace_t;
/*
* Holds the params to the xxx_speed functions, which are timed by fcyc.
* This struct is necessary because fcyc accepts only a pointer array
* as input.
*/
typedef struct {
trace_t *trace;
range_t *ranges;
} speed_t;
/* Summarizes the important stats for some malloc function on some trace */
typedef struct {
/* defined for both libc malloc and student malloc package (mm.c) */
double ops; /* number of ops (malloc/free/realloc) in the trace */
int valid; /* was the trace processed correctly by the allocator? */
double secs; /* number of secs needed to run the trace */
/* defined only for the student malloc package */
double util; /* space utilization for this trace (always 0 for libc) */
/* Note: secs and util are only defined if valid is true */
} stats_t;
/********************
* Global variables
*******************/
int verbose = 0; /* global flag for verbose output */
static int errors = 0; /* number of errs found when running student malloc */
char msg[MAXLINE]; /* for whenever we need to compose an error message */
/* Directory where default tracefiles are found */
static char tracedir[MAXLINE] = TRACEDIR;
/* The filenames of the default tracefiles */
static char *default_tracefiles[] = {
DEFAULT_TRACEFILES, NULL
};
/*********************
* Function prototypes
*********************/
/* these functions manipulate range lists */
static int add_range(range_t **ranges, char *lo, int size,
int tracenum, int opnum);
static void remove_range(range_t **ranges, char *lo);
static void clear_ranges(range_t **ranges);
/* These functions read, allocate, and free storage for traces */
static trace_t *read_trace(char *tracedir, char *filename);
static void free_trace(trace_t *trace);
/* Routines for evaluating the correctness and speed of libc malloc */
static int eval_libc_valid(trace_t *trace, int tracenum);
static void eval_libc_speed(void *ptr);
/* Routines for evaluating correctnes, space utilization, and speed
of the student's malloc package in mm.c */
static int eval_mm_valid(trace_t *trace, int tracenum, range_t **ranges);
static double eval_mm_util(trace_t *trace, int tracenum, range_t **ranges);
static void eval_mm_speed(void *ptr);
/* Various helper routines */
static void printresults(int n, stats_t *stats);
static void usage(void);
static void unix_error(char *msg);
static void malloc_error(int tracenum, int opnum, char *msg);
static void app_error(char *msg);
/**************
* Main routine
**************/
int main(int argc, char **argv)
{
int i;
char c;
char **tracefiles = NULL; /* null-terminated array of trace file names */
int num_tracefiles = 0; /* the number of traces in that array */
trace_t *trace = NULL; /* stores a single trace file in memory */
range_t *ranges = NULL; /* keeps track of block extents for one trace */
stats_t *libc_stats = NULL;/* libc stats for each trace */
stats_t *mm_stats = NULL; /* mm (i.e. student) stats for each trace */
speed_t speed_params; /* input parameters to the xx_speed routines */
int team_check = 1; /* If set, check team structure (reset by -a) */
int run_libc = 0; /* If set, run libc malloc (set by -l) */
int autograder = 0; /* If set, emit summary info for autograder (-g) */
/* temporaries used to compute the performance index */
double secs, ops, util, avg_mm_util, avg_mm_throughput, p1, p2, perfindex;
int numcorrect;
/*
* Read and interpret the command line arguments
*/
while ((c = getopt(argc, argv, "f:t:hvVgal")) != EOF) {
switch (c) {
case 'g': /* Generate summary info for the autograder */
autograder = 1;
break;
case 'f': /* Use one specific trace file only (relative to curr dir) */
num_tracefiles = 1;
if ((tracefiles = realloc(tracefiles, 2*sizeof(char *))) == NULL)
unix_error("ERROR: realloc failed in main");
strcpy(tracedir, "./");
tracefiles[0] = strdup(optarg);
tracefiles[1] = NULL;
break;
case 't': /* Directory where the traces are located */
if (num_tracefiles == 1) /* ignore if -f already encountered */
break;
strcpy(tracedir, optarg);
if (tracedir[strlen(tracedir)-1] != '/')
strcat(tracedir, "/"); /* path always ends with "/" */
break;
case 'a': /* Don't check team structure */
team_check = 0;
break;
case 'l': /* Run libc malloc */
run_libc = 1;
break;
case 'v': /* Print per-trace performance breakdown */
verbose = 1;
break;
case 'V': /* Be more verbose than -v */
verbose = 2;
break;
case 'h': /* Print this message */
usage();
exit(0);
default:
usage();
exit(1);
}
}
/*
* Check and print team info
*/
if (team_check) {
/* Students must fill in their team information */
if (!strcmp(team.teamname, "")) {
printf("ERROR: Please provide the information about your team in mm.c.\n");
exit(1);
} else
printf("Team Name:%s\n", team.teamname);
if ((*team.name1 == '\0') || (*team.id1 == '\0')) {
printf("ERROR. You must fill in all team member 1 fields!\n");
exit(1);
}
else
printf("Member 1 :%s:%s\n", team.name1, team.id1);
if (((*team.name2 != '\0') && (*team.id2 == '\0')) ||
((*team.name2 == '\0') && (*team.id2 != '\0'))) {
printf("ERROR. You must fill in all or none of the team member 2 ID fields!\n");
exit(1);
}
else if (*team.name2 != '\0')
printf("Member 2 :%s:%s\n", team.name2, team.id2);
}
/*
* If no -f command line arg, then use the entire set of tracefiles
* defined in default_traces[]
*/
if (tracefiles == NULL) {
tracefiles = default_tracefiles;
num_tracefiles = sizeof(default_tracefiles) / sizeof(char *) - 1;
printf("Using default tracefiles in %s\n", tracedir);
}
/* Initialize the timing package */
init_fsecs();
/*
* Optionally run and evaluate the libc malloc package
*/
if (run_libc) {
if (verbose > 1)
printf("\nTesting libc malloc\n");
/* Allocate libc stats array, with one stats_t struct per tracefile */
libc_stats = (stats_t *)calloc(num_tracefiles, sizeof(stats_t));
if (libc_stats == NULL)
unix_error("libc_stats calloc in main failed");
/* Evaluate the libc malloc package using the K-best scheme */
for (i=0; i < num_tracefiles; i++) {
trace = read_trace(tracedir, tracefiles[i]);
libc_stats[i].ops = trace->num_ops;
if (verbose > 1)
printf("Checking libc malloc for correctness, ");
libc_stats[i].valid = eval_libc_valid(trace, i);
if (libc_stats[i].valid) {
speed_params.trace = trace;
if (verbose > 1)
printf("and performance.\n");
libc_stats[i].secs = fsecs(eval_libc_speed, &speed_params);
}
free_trace(trace);
}
/* Display the libc results in a compact table */
if (verbose) {
printf("\nResults for libc malloc:\n");
printresults(num_tracefiles, libc_stats);
}
}
/*
* Always run and evaluate the student's mm package
*/
if (verbose > 1)
printf("\nTesting mm malloc\n");
/* Allocate the mm stats array, with one stats_t struct per tracefile */
mm_stats = (stats_t *)calloc(num_tracefiles, sizeof(stats_t));
if (mm_stats == NULL)
unix_error("mm_stats calloc in main failed");
/* Initialize the simulated memory system in memlib.c */
mem_init();
/* Evaluate student's mm malloc package using the K-best scheme */
for (i=0; i < num_tracefiles; i++) {
trace = read_trace(tracedir, tracefiles[i]);
mm_stats[i].ops = trace->num_ops;
if (verbose > 1)
printf("Checking mm_malloc for correctness, ");
mm_stats[i].valid = eval_mm_valid(trace, i, &ranges);
if (mm_stats[i].valid) {
if (verbose > 1)
printf("efficiency, ");
mm_stats[i].util = eval_mm_util(trace, i, &ranges);
speed_params.trace = trace;
speed_params.ranges = ranges;
if (verbose > 1)
printf("and performance.\n");
mm_stats[i].secs = fsecs(eval_mm_speed, &speed_params);
}
free_trace(trace);
}
/* Display the mm results in a compact table */
if (verbose) {
printf("\nResults for mm malloc:\n");
printresults(num_tracefiles, mm_stats);
printf("\n");
}
/*
* Accumulate the aggregate statistics for the student's mm package
*/
secs = 0;
ops = 0;
util = 0;
numcorrect = 0;
for (i=0; i < num_tracefiles; i++) {
secs += mm_stats[i].secs;
ops += mm_stats[i].ops;
util += mm_stats[i].util;
if (mm_stats[i].valid)
numcorrect++;
}
avg_mm_util = util/num_tracefiles;
/*
* Compute and print the performance index
*/
if (errors == 0) {
avg_mm_throughput = ops/secs;
p1 = UTIL_WEIGHT * avg_mm_util;
if (avg_mm_throughput > AVG_LIBC_THRUPUT) {
p2 = (double)(1.0 - UTIL_WEIGHT);
}
else {
p2 = ((double) (1.0 - UTIL_WEIGHT)) *
(avg_mm_throughput/AVG_LIBC_THRUPUT);
}
perfindex = (p1 + p2)*100.0;
printf("Perf index = %.0f (util) + %.0f (thru) = %.0f/100\n",
p1*100,
p2*100,
perfindex);
}
else { /* There were errors */
perfindex = 0.0;
printf("Terminated with %d errors\n", errors);
}
if (autograder) {
printf("correct:%d\n", numcorrect);
printf("perfidx:%.0f\n", perfindex);
}
exit(0);
}
/*****************************************************************
* The following routines manipulate the range list, which keeps
* track of the extent of every allocated block payload. We use the
* range list to detect any overlapping allocated blocks.
****************************************************************/
/*
* add_range - As directed by request opnum in trace tracenum,
* we've just called the student's mm_malloc to allocate a block of
* size bytes at addr lo. After checking the block for correctness,
* we create a range struct for this block and add it to the range list.
*/
static int add_range(range_t **ranges, char *lo, int size,
int tracenum, int opnum)
{
char *hi = lo + size - 1;
range_t *p;
char msg[MAXLINE];
assert(size > 0);
/* Payload addresses must be ALIGNMENT-byte aligned */
if (!IS_ALIGNED(lo)) {
sprintf(msg, "Payload address (%p) not aligned to %d bytes",
lo, ALIGNMENT);
malloc_error(tracenum, opnum, msg);
return 0;
}
/* The payload must lie within the extent of the heap */
if ((lo < (char *)mem_heap_lo()) || (lo > (char *)mem_heap_hi()) ||
(hi < (char *)mem_heap_lo()) || (hi > (char *)mem_heap_hi())) {
sprintf(msg, "Payload (%p:%p) lies outside heap (%p:%p)",
lo, hi, mem_heap_lo(), mem_heap_hi());
malloc_error(tracenum, opnum, msg);
return 0;
}
/* The payload must not overlap any other payloads */
for (p = *ranges; p != NULL; p = p->next) {
if ((lo >= p->lo && lo <= p-> hi) ||
(hi >= p->lo && hi <= p->hi)) {
sprintf(msg, "Payload (%p:%p) overlaps another payload (%p:%p)\n",
lo, hi, p->lo, p->hi);
malloc_error(tracenum, opnum, msg);
return 0;
}
}
/*
* Everything looks OK, so remember the extent of this block
* by creating a range struct and adding it the range list.
*/
if ((p = (range_t *)malloc(sizeof(range_t))) == NULL)
unix_error("malloc error in add_range");
p->next = *ranges;
p->lo = lo;
p->hi = hi;
*ranges = p;
return 1;
}
/*
* remove_range - Free the range record of block whose payload starts at lo
*/
static void remove_range(range_t **ranges, char *lo)
{
range_t *p;
range_t **prevpp = ranges;
int size;
for (p = *ranges; p != NULL; p = p->next) {
if (p->lo == lo) {
*prevpp = p->next;
size = p->hi - p->lo + 1;
free(p);
break;
}
prevpp = &(p->next);
}
}
/*
* clear_ranges - free all of the range records for a trace
*/
static void clear_ranges(range_t **ranges)
{
range_t *p;
range_t *pnext;
for (p = *ranges; p != NULL; p = pnext) {
pnext = p->next;
free(p);
}
*ranges = NULL;
}
/**********************************************
* The following routines manipulate tracefiles
*********************************************/
/*
* read_trace - read a trace file and store it in memory
*/
static trace_t *read_trace(char *tracedir, char *filename)
{
FILE *tracefile;
trace_t *trace;
char type[MAXLINE];
char path[MAXLINE];
unsigned index, size;
unsigned max_index = 0;
unsigned op_index;
if (verbose > 1)
printf("Reading tracefile: %s\n", filename);
/* Allocate the trace record */
if ((trace = (trace_t *) malloc(sizeof(trace_t))) == NULL)
unix_error("malloc 1 failed in read_trance");
/* Read the trace file header */
strcpy(path, tracedir);
strcat(path, filename);
if ((tracefile = fopen(path, "r")) == NULL) {
sprintf(msg, "Could not open %s in read_trace", path);
unix_error(msg);
}
fscanf(tracefile, "%d", &(trace->sugg_heapsize)); /* not used */
fscanf(tracefile, "%d", &(trace->num_ids));
fscanf(tracefile, "%d", &(trace->num_ops));
fscanf(tracefile, "%d", &(trace->weight)); /* not used */
/* We'll store each request line in the trace in this array */
if ((trace->ops =
(traceop_t *)malloc(trace->num_ops * sizeof(traceop_t))) == NULL)
unix_error("malloc 2 failed in read_trace");
/* We'll keep an array of pointers to the allocated blocks here... */
if ((trace->blocks =
(char **)malloc(trace->num_ids * sizeof(char *))) == NULL)
unix_error("malloc 3 failed in read_trace");
/* ... along with the corresponding byte sizes of each block */
if ((trace->block_sizes =
(size_t *)malloc(trace->num_ids * sizeof(size_t))) == NULL)
unix_error("malloc 4 failed in read_trace");
/* read every request line in the trace file */
index = 0;
op_index = 0;
while (fscanf(tracefile, "%s", type) != EOF) {
switch(type[0]) {
case 'a':
fscanf(tracefile, "%u %u", &index, &size);
trace->ops[op_index].type = ALLOC;
trace->ops[op_index].index = index;
trace->ops[op_index].size = size;
max_index = (index > max_index) ? index : max_index;
break;
case 'r':
fscanf(tracefile, "%u %u", &index, &size);
trace->ops[op_index].type = REALLOC;
trace->ops[op_index].index = index;
trace->ops[op_index].size = size;
max_index = (index > max_index) ? index : max_index;
break;
case 'f':
fscanf(tracefile, "%ud", &index);
trace->ops[op_index].type = FREE;
trace->ops[op_index].index = index;
break;
default:
printf("Bogus type character (%c) in tracefile %s\n",
type[0], path);
exit(1);
}
op_index++;
}
fclose(tracefile);
assert(max_index == trace->num_ids - 1);
assert(trace->num_ops == op_index);
return trace;
}
/*
* free_trace - Free the trace record and the three arrays it points
* to, all of which were allocated in read_trace().
*/
void free_trace(trace_t *trace)
{
free(trace->ops); /* free the three arrays... */
free(trace->blocks);
free(trace->block_sizes);
free(trace); /* and the trace record itself... */
}
/**********************************************************************
* The following functions evaluate the correctness, space utilization,
* and throughput of the libc and mm malloc packages.
**********************************************************************/
/*
* eval_mm_valid - Check the mm malloc package for correctness
*/
static int eval_mm_valid(trace_t *trace, int tracenum, range_t **ranges)
{
int i, j;
int index;
int size;
int oldsize;
char *newp;
char *oldp;
char *p;
/* Reset the heap and free any records in the range list */
mem_reset_brk();
clear_ranges(ranges);
/* Call the mm package's init function */
if (mm_init() < 0) {
malloc_error(tracenum, 0, "mm_init failed.");
return 0;
}
/* Interpret each operation in the trace in order */
for (i = 0; i < trace->num_ops; i++) {
index = trace->ops[i].index;
size = trace->ops[i].size;
switch (trace->ops[i].type) {
case ALLOC: /* mm_malloc */
/* Call the student's malloc */
if ((p = mm_malloc(size)) == NULL) {
malloc_error(tracenum, i, "mm_malloc failed.");
return 0;
}
/*
* Test the range of the new block for correctness and add it
* to the range list if OK. The block must be be aligned properly,
* and must not overlap any currently allocated block.
*/
if (add_range(ranges, p, size, tracenum, i) == 0)
return 0;
/* ADDED: cgw
* fill range with low byte of index. This will be used later
* if we realloc the block and wish to make sure that the old
* data was copied to the new block
*/
memset(p, index & 0xFF, size);
/* Remember region */
trace->blocks[index] = p;
trace->block_sizes[index] = size;
break;
case REALLOC: /* mm_realloc */
/* Call the student's realloc */
oldp = trace->blocks[index];
if ((newp = mm_realloc(oldp, size)) == NULL) {
malloc_error(tracenum, i, "mm_realloc failed.");
return 0;
}
/* Remove the old region from the range list */
remove_range(ranges, oldp);
/* Check new block for correctness and add it to range list */
if (add_range(ranges, newp, size, tracenum, i) == 0)
return 0;
/* ADDED: cgw
* Make sure that the new block contains the data from the old
* block and then fill in the new block with the low order byte
* of the new index
*/
oldsize = trace->block_sizes[index];
if (size < oldsize) oldsize = size;
for (j = 0; j < oldsize; j++) {
if (newp[j] != (index & 0xFF)) {
malloc_error(tracenum, i, "mm_realloc did not preserve the "
"data from old block");
return 0;
}
}
memset(newp, index & 0xFF, size);
/* Remember region */
trace->blocks[index] = newp;
trace->block_sizes[index] = size;
break;
case FREE: /* mm_free */
/* Remove region from list and call student's free function */
p = trace->blocks[index];
remove_range(ranges, p);
mm_free(p);
break;
default:
app_error("Nonexistent request type in eval_mm_valid");
}
}
/* As far as we know, this is a valid malloc package */
return 1;
}
/*
* eval_mm_util - Evaluate the space utilization of the student's package
* The idea is to remember the high water mark "hwm" of the heap for
* an optimal allocator, i.e., no gaps and no internal fragmentation.
* Utilization is the ratio hwm/heapsize, where heapsize is the
* size of the heap in bytes after running the student's malloc
* package on the trace. Note that our implementation of mem_sbrk()
* doesn't allow the students to decrement the brk pointer, so brk
* is always the high water mark of the heap.
*
*/
static double eval_mm_util(trace_t *trace, int tracenum, range_t **ranges)
{
int i;
int index;
int size, newsize, oldsize;
int max_total_size = 0;
int total_size = 0;
char *p;
char *newp, *oldp;
/* initialize the heap and the mm malloc package */
mem_reset_brk();
if (mm_init() < 0)
app_error("mm_init failed in eval_mm_util");
for (i = 0; i < trace->num_ops; i++) {
switch (trace->ops[i].type) {
case ALLOC: /* mm_alloc */
index = trace->ops[i].index;
size = trace->ops[i].size;
if ((p = mm_malloc(size)) == NULL)
app_error("mm_malloc failed in eval_mm_util");
/* Remember region and size */
trace->blocks[index] = p;
trace->block_sizes[index] = size;
/* Keep track of current total size
* of all allocated blocks */
total_size += size;
/* Update statistics */
max_total_size = (total_size > max_total_size) ?
total_size : max_total_size;
break;
case REALLOC: /* mm_realloc */
index = trace->ops[i].index;
newsize = trace->ops[i].size;
oldsize = trace->block_sizes[index];
oldp = trace->blocks[index];
if ((newp = mm_realloc(oldp,newsize)) == NULL)
app_error("mm_realloc failed in eval_mm_util");
/* Remember region and size */
trace->blocks[index] = newp;
trace->block_sizes[index] = newsize;
/* Keep track of current total size
* of all allocated blocks */
total_size += (newsize - oldsize);
/* Update statistics */
max_total_size = (total_size > max_total_size) ?
total_size : max_total_size;
break;
case FREE: /* mm_free */
index = trace->ops[i].index;
size = trace->block_sizes[index];
p = trace->blocks[index];
mm_free(p);
/* Keep track of current total size
* of all allocated blocks */
total_size -= size;
break;
default:
app_error("Nonexistent request type in eval_mm_util");
}
}
return ((double)max_total_size / (double)mem_heapsize());
}
/*
* eval_mm_speed - This is the function that is used by fcyc()
* to measure the running time of the mm malloc package.
*/
static void eval_mm_speed(void *ptr)
{
int i, index, size, newsize;
char *p, *newp, *oldp, *block;
trace_t *trace = ((speed_t *)ptr)->trace;
/* Reset the heap and initialize the mm package */
mem_reset_brk();
if (mm_init() < 0)
app_error("mm_init failed in eval_mm_speed");
/* Interpret each trace request */
for (i = 0; i < trace->num_ops; i++)
switch (trace->ops[i].type) {
case ALLOC: /* mm_malloc */
index = trace->ops[i].index;
size = trace->ops[i].size;
if ((p = mm_malloc(size)) == NULL)
app_error("mm_malloc error in eval_mm_speed");
trace->blocks[index] = p;
break;
case REALLOC: /* mm_realloc */
index = trace->ops[i].index;
newsize = trace->ops[i].size;
oldp = trace->blocks[index];
if ((newp = mm_realloc(oldp,newsize)) == NULL)
app_error("mm_realloc error in eval_mm_speed");
trace->blocks[index] = newp;
break;
case FREE: /* mm_free */
index = trace->ops[i].index;
block = trace->blocks[index];
mm_free(block);
break;
default:
app_error("Nonexistent request type in eval_mm_valid");
}
}
/*
* eval_libc_valid - We run this function to make sure that the
* libc malloc can run to completion on the set of traces.
* We'll be conservative and terminate if any libc malloc call fails.
*
*/
static int eval_libc_valid(trace_t *trace, int tracenum)
{
int i, newsize;
char *p, *newp, *oldp;
for (i = 0; i < trace->num_ops; i++) {
switch (trace->ops[i].type) {
case ALLOC: /* malloc */
if ((p = malloc(trace->ops[i].size)) == NULL) {
malloc_error(tracenum, i, "libc malloc failed");
unix_error("System message");
}
trace->blocks[trace->ops[i].index] = p;
break;
case REALLOC: /* realloc */
newsize = trace->ops[i].size;
oldp = trace->blocks[trace->ops[i].index];
if ((newp = realloc(oldp, newsize)) == NULL) {
malloc_error(tracenum, i, "libc realloc failed");
unix_error("System message");
}
trace->blocks[trace->ops[i].index] = newp;
break;
case FREE: /* free */
free(trace->blocks[trace->ops[i].index]);
break;
default:
app_error("invalid operation type in eval_libc_valid");
}
}
return 1;
}
/*
* eval_libc_speed - This is the function that is used by fcyc() to
* measure the running time of the libc malloc package on the set
* of traces.
*/
static void eval_libc_speed(void *ptr)
{
int i;
int index, size, newsize;
char *p, *newp, *oldp, *block;
trace_t *trace = ((speed_t *)ptr)->trace;
for (i = 0; i < trace->num_ops; i++) {
switch (trace->ops[i].type) {
case ALLOC: /* malloc */
index = trace->ops[i].index;
size = trace->ops[i].size;
if ((p = malloc(size)) == NULL)
unix_error("malloc failed in eval_libc_speed");
trace->blocks[index] = p;
break;
case REALLOC: /* realloc */
index = trace->ops[i].index;
newsize = trace->ops[i].size;
oldp = trace->blocks[index];
if ((newp = realloc(oldp, newsize)) == NULL)
unix_error("realloc failed in eval_libc_speed\n");
trace->blocks[index] = newp;
break;
case FREE: /* free */
index = trace->ops[i].index;
block = trace->blocks[index];
free(block);
break;
}
}
}
/*************************************
* Some miscellaneous helper routines
************************************/
/*
* printresults - prints a performance summary for some malloc package
*/
static void printresults(int n, stats_t *stats)
{
int i;
double secs = 0;
double ops = 0;
double util = 0;
/* Print the individual results for each trace */
printf("%5s%7s %5s%8s%10s\t%6s\n",
"trace", " valid", "util", "ops", "secs", "Kops");
for (i=0; i < n; i++) {
if (stats[i].valid) {
printf("%2d%10s%5.0f%%%8.0f%10.6f\t%6.0f\n",
i,
"yes",
stats[i].util*100.0,
stats[i].ops,
stats[i].secs,
(stats[i].ops/1e3)/stats[i].secs);
secs += stats[i].secs;
ops += stats[i].ops;
util += stats[i].util;
}
else {
printf("%2d%10s%6s%8s%10s\t%6s\n",
i,
"no",
"-",
"-",
"-",
"-");
}
}
/* Print the aggregate results for the set of traces */
if (errors == 0) {
printf("%12s%5.0f%%%8.0f%10.6f\t%6.0f\n",
"Total ",
(util/n)*100.0,
ops,
secs,
(ops/1e3)/secs);
}
else {
printf("%12s%6s%8s%10s\t%6s\n",
"Total ",
"-",
"-",
"-",
"-");
}
}
/*
* app_error - Report an arbitrary application error
*/
void app_error(char *msg)
{
printf("%s\n", msg);
exit(1);
}
/*
* unix_error - Report a Unix-style error
*/
void unix_error(char *msg)
{
printf("%s: %s\n", msg, strerror(errno));
exit(1);
}
/*
* malloc_error - Report an error returned by the mm_malloc package
*/
void malloc_error(int tracenum, int opnum, char *msg)
{
errors++;
printf("ERROR [trace %d, line %d]: %s\n", tracenum, LINENUM(opnum), msg);
}
/*
* usage - Explain the command line arguments
*/
static void usage(void)
{
fprintf(stderr, "Usage: mdriver [-hvVal] [-f <file>] [-t <dir>]\n");
fprintf(stderr, "Options\n");
fprintf(stderr, "\t-a Don't check the team structure.\n");
fprintf(stderr, "\t-f <file> Use <file> as the trace file.\n");
fprintf(stderr, "\t-g Generate summary info for autograder.\n");
fprintf(stderr, "\t-h Print this message.\n");
fprintf(stderr, "\t-l Run libc malloc as well.\n");
fprintf(stderr, "\t-t <dir> Directory to find default traces.\n");
fprintf(stderr, "\t-v Print per-trace performance breakdowns.\n");
fprintf(stderr, "\t-V Print additional debug info.\n");
}
File added
File added
File added
/*
* memlib.c - a module that simulates the memory system. Needed because it
* allows us to interleave calls from the student's malloc package
* with the system's malloc package in libc.
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <sys/mman.h>
#include <string.h>
#include <errno.h>
#include "memlib.h"
#include "config.h"
/* private variables */
static char *mem_start_brk; /* points to first byte of heap */
static char *mem_brk; /* points to last byte of heap */
static char *mem_max_addr; /* largest legal heap address */
/*
* mem_init - initialize the memory system model
*/
void mem_init(void)
{
/* allocate the storage we will use to model the available VM */
if ((mem_start_brk = (char *)malloc(MAX_HEAP)) == NULL) {
fprintf(stderr, "mem_init_vm: malloc error\n");
exit(1);
}
mem_max_addr = mem_start_brk + MAX_HEAP; /* max legal heap address */
mem_brk = mem_start_brk; /* heap is empty initially */
}
/*
* mem_deinit - free the storage used by the memory system model
*/
void mem_deinit(void)
{
free(mem_start_brk);
}
/*
* mem_reset_brk - reset the simulated brk pointer to make an empty heap
*/
void mem_reset_brk()
{
mem_brk = mem_start_brk;
}
/*
* mem_sbrk - simple model of the sbrk function. Extends the heap
* by incr bytes and returns the start address of the new area. In
* this model, the heap cannot be shrunk.
*/
void *mem_sbrk(int incr)
{
char *old_brk = mem_brk;
if ( (incr < 0) || ((mem_brk + incr) > mem_max_addr)) {
errno = ENOMEM;
fprintf(stderr, "ERROR: mem_sbrk failed. Ran out of memory...\n");
return (void *)-1;
}
mem_brk += incr;
return (void *)old_brk;
}
/*
* mem_heap_lo - return address of the first heap byte
*/
void *mem_heap_lo()
{
return (void *)mem_start_brk;
}
/*
* mem_heap_hi - return address of last heap byte
*/
void *mem_heap_hi()
{
return (void *)(mem_brk - 1);
}
/*
* mem_heapsize() - returns the heap size in bytes
*/
size_t mem_heapsize()
{
return (size_t)(mem_brk - mem_start_brk);
}
/*
* mem_pagesize() - returns the page size of the system
*/
size_t mem_pagesize()
{
return (size_t)getpagesize();
}
#include <unistd.h>
void mem_init(void);
void mem_deinit(void);
void *mem_sbrk(int incr);
void mem_reset_brk(void);
void *mem_heap_lo(void);
void *mem_heap_hi(void);
size_t mem_heapsize(void);
size_t mem_pagesize(void);
File added
File added
/*
* mm-naive.c - The fastest, least memory-efficient malloc package.
*
* In this naive approach, a block is allocated by simply incrementing
* the brk pointer. A block is pure payload. There are no headers or
* footers. Blocks are never coalesced or reused. Realloc is
* implemented directly using mm_malloc and mm_free.
*
* NOTE TO STUDENTS: Replace this header comment with your own header
* comment that gives a high level description of your solution.
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include "mm.h"
#include "memlib.h"
#include "config.h"
/*********************************************************
* NOTE TO STUDENTS: Before you do anything else, please
* provide your team information in the following struct.
********************************************************/
team_t team = {
/* Team name */
"team name",
/* First member's full name */
"member 1",
/* First member's email address */
"member_1@cse.iitb.ac.in",
/* Second member's full name (leave blank if none) */
"member 2",
/* Second member's email address (leave blank if none) */
"member_2@cse.iitb.ac.in"
};
/* single word (4) or double word (8) alignment */
#define ALIGNMENT 8
/* rounds up to the nearest multiple of ALIGNMENT */
#define ALIGN(size) (((size) + (ALIGNMENT-1)) & ~0x7)
#define SIZE_T_SIZE (ALIGN(sizeof(size_t)))
/*
* mm_init - initialize the malloc package.
*/
void *init_mem_sbrk_break = NULL;
free_node_t *head=NULL;
free_node_t init_free_node(void)
{
free_node_t freenode;
freenode.next_node=NULL;
freenode.prev_node=NULL;
return freenode;
}
int mm_init(void)
{
if(init_mem_sbrk_break==NULL)
{
mem_init();
}
mem_reset_brk();
init_mem_sbrk_break=mem_heap_lo();
head=(free_node_t *)init_mem_sbrk_break;
block_meta_data_t *metadata=(block_meta_data_t *)(head+1);
metadata->is_free=MM_TRUE;
metadata->block_size=MAX_HEAP-sizeof(block_meta_data_t);
metadata->free_node=init_free_node();
metadata->next_block=NULL;
metadata->prev_block=NULL;
metadata->offset=0;
head=&(metadata->free_node);
//This function is called every time before each test run of the trace.
//It should reset the entire state of your malloc or the consecutive trace runs will give wrong answer.
/*
* This function should initialize and reset any data structures used to represent the starting state(empty heap)
*
* This function will be called multiple time in the driver code "mdriver.c"
*/
return 0; //Returns 0 on successfull initialization.
}
//---------------------------------------------------------------------------------------------------------------
/*
* mm_malloc - Allocate a block by incrementing the brk pointer.
* Always allocate a block whose size is a multiple of the alignment.
*/
void *mm_malloc(size_t size)
{
/*
* This function should keep track of the allocated memory blocks.
* The block allocation should minimize the number of holes (chucks of unusable memory) in the heap memory.
* The previously freed memory blocks should be reused.
* If no appropriate free block is available then the increase the heap size using 'mem_sbrk(size)'.
* Try to keep the heap size as small as possible.
*/
if(size <= 0){ // Invalid request size
return NULL;
}
size = ((size+7)/8)*8; //size alligned to 8 bytes
return mem_sbrk(size); //mem_sbrk() is wrapper function for the sbrk() system call.
//Please use mem_sbrk() instead of sbrk() otherwise the evaluation results
//may give wrong results
}
void mm_free(void *ptr)
{
/*
* Searches the previously allocated node for memory block with base address ptr.
*
* It should also perform coalesceing on both ends i.e. if the consecutive memory blocks are
* free(not allocated) then they should be combined into a single block.
*
* It should also keep track of all the free memory blocks.
* If the freed block is at the end of the heap then you can also decrease the heap size
* using 'mem_sbrk(-size)'.
*/
}
/*
* mm_realloc - Implemented simply in terms of mm_malloc and mm_free
*/
void *mm_realloc(void *ptr, size_t size)
{
size = ((size+7)/8)*8; //8-byte alignement
if(ptr == NULL){ //memory was not previously allocated
return mm_malloc(size);
}
if(size == 0){ //new size is zero
mm_free(ptr);
return NULL;
}
/*
* This function should also copy the content of the previous memory block into the new block.
* You can use 'memcpy()' for this purpose.
*
* The data structures corresponding to free memory blocks and allocated memory
* blocks should also be updated.
*/
mm_free(ptr);
return mem_sbrk(size);
}
#include <stdio.h>
#include<stdint.h>
extern int mm_init (void);
extern void *mm_malloc (size_t size);
extern void mm_free (void *ptr);
extern void *mm_realloc(void *ptr, size_t size);
/*
* Students work in teams of one or two. Teams enter their team name,
* personal names and login IDs in a struct of this
* type in their bits.c file.
*/
typedef struct {
char *teamname; /* ID1+ID2 or ID1 */
char *name1; /* full name of first member */
char *id1; /* login ID of first member */
char *name2; /* full name of second member (if any) */
char *id2; /* login ID of second member */
} team_t;
extern team_t team;
File added
File added
/*
* mm-naive.c - The fastest, least memory-efficient malloc package.
*
* In this naive approach, a block is allocated by simply incrementing
* the brk pointer. A block is pure payload. There are no headers or
* footers. Blocks are never coalesced or reused. Realloc is
* implemented directly using mm_malloc and mm_free.
*
* NOTE TO STUDENTS: Replace this header comment with your own header
* comment that gives a high level description of your solution.
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include "mm.h"
#include "memlib.h"
#include "config.h"
/*********************************************************
* NOTE TO STUDENTS: Before you do anything else, please
* provide your team information in the following struct.
********************************************************/
team_t team = {
/* Team name */
"team name",
/* First member's full name */
"member 1",
/* First member's email address */
"member_1@cse.iitb.ac.in",
/* Second member's full name (leave blank if none) */
"member 2",
/* Second member's email address (leave blank if none) */
"member_2@cse.iitb.ac.in"
};
typedef struct free_node_
{
struct free_node_ *prev_node;
struct free_node_ *next_node;
}free_node_t;
typedef enum
{
MM_FALSE,
MM_TRUE
} vm_bool_t;
typedef struct block_meta_data_
{
vm_bool_t is_free;
uint32_t block_size;
struct block_meta_data_ *prev_block;
struct block_meta_data_ *next_block;
free_node_t free_node;
} block_meta_data_t;
typedef struct block_end_meta_data_
{
uint32_t block_size;
} block_end_meta_data_t;
#define NEXT_META_BLOCK(block_meta_data_ptr) \
(block_meta_data_ptr->next_block)
#define NEXT_META_BLOCK_BY_SIZE(block_meta_data_ptr) \
(block_meta_data_t *)((char *)(block_meta_data_ptr+1) \
+ block_meta_data_ptr->block_size \
+sizeof(block_end_meta_data_t))
#define PREV_META_BLOCK(block_meta_data_ptr) \
(block_meta_data_ptr->prev_block)
#define mm_bind_blocks_for_allocation(allocated_meta_block,free_meta_block) \
free_meta_block->prev_block=allocated_meta_block; \
free_meta_block->next_block=allocated_meta_block->next_block; \
allocated_meta_block->next_block=free_meta_block; \
if(free_meta_block->next_block) \
free_meta_block->next_block->prev_block=free_meta_block
#define offsetof(struct_name,field_name) \
(unsigned int)&((struct_name *)0)->field_name
#define meta_data_block_addr(free_node_addr) \
(block_meta_data_t *) ((char *)(free_node_addr)-offsetof(block_meta_data_t,free_node))
#define end_meta_data_addr(meta_data_addr) \
(block_end_meta_data_t *)((char *)(meta_data_addr+1) \
+meta_data_addr->block_size)
#define start_meta_data_addr(end_meta_data_addr) \
(block_meta_data_t *)((char *)(end_meta_data_addr) \
-end_meta_data_addr->block_size \
-sizeof(block_meta_data_t))
/* single word (4) or double word (8) alignment */
#define ALIGNMENT 8
/* rounds up to the nearest multiple of ALIGNMENT */
#define ALIGN(size) (((size) + (ALIGNMENT-1)) & ~0x7)
#define SIZE_T_SIZE (ALIGN(sizeof(size_t)))
/*
* mm_init - initialize the malloc package.
*/
void *init_mem_sbrk_break = NULL;
free_node_t **head=NULL;
free_node_t init_free_node(void)
{
free_node_t freenode;
freenode.next_node=NULL;
freenode.prev_node=NULL;
return freenode;
}
void insert_node_in_freelist(free_node_t **head,block_meta_data_t *new_metadata_block)
{
free_node_t *prev_node=NULL;
free_node_t *next_node=NULL;
free_node_t *temp=*head;
int count=0;
int flag=0;
while(temp!=NULL)
{
block_meta_data_t *meta_data=meta_data_block_addr(temp);
if(new_metadata_block->block_size>=meta_data->block_size)
{
if(temp->next_node!=NULL)
{
temp=temp->next_node;
}
else
{
temp->next_node=&(new_metadata_block->free_node);
new_metadata_block->free_node.prev_node=temp;
flag=1;
break;
}
}
else
{
prev_node=temp->prev_node;
next_node=temp;
break;
}
}
if(flag==0)
{
if(temp==*head)
{
*head=&(new_metadata_block->free_node);
}
new_metadata_block->free_node.next_node=next_node;
new_metadata_block->free_node.prev_node=prev_node;
}
}
block_meta_data_t *get_node_from_freelist(free_node_t **head,uint32_t reqsize)
{
free_node_t *temp=*head;
block_meta_data_t *meta_data=NULL;
while(temp!=NULL)
{
meta_data=meta_data_block_addr(temp);
if(meta_data->block_size<reqsize)
{
temp=temp->next_node;
}
else
{
return meta_data;
}
}
return NULL;
}
void merge_free_blocks(block_meta_data_t *first,block_meta_data_t *second)
{
assert(first->is_free==MM_TRUE&&second->is_free==MM_TRUE);
first->block_size+=sizeof(block_meta_data_t) + second->block_size+sizeof(block_end_meta_data_t);
first->next_block=second->next_block;
if(second->next_block!=NULL)
{
second->next_block->prev_block=first;
}
}
void remove_block_from_free_list(free_node_t **head,free_node_t *del_node)
{
if(del_node==*head)
{
if(del_node->next_node!=NULL)
{
del_node->next_node->prev_node=NULL;
}
*head=del_node->next_node;
}
else
{
//printf("Came here\n");
free_node_t *temp=*head;
while(temp->next_node!=del_node)
{
temp=temp->next_node;
}
temp->next_node=del_node->next_node;
if(del_node->next_node!=NULL)
{
del_node->next_node->prev_node=temp;
}
}
del_node->prev_node=NULL;
del_node->next_node=NULL;
}
int get_internal_fragmented_size(block_meta_data_t *block1,block_meta_data_t *block2)
{
block_meta_data_t *next_meta_block_by_size=NEXT_META_BLOCK_BY_SIZE(block1);
return (int)((char *)block2-(char *)next_meta_block_by_size);
}
int mm_init(void)
{
if(init_mem_sbrk_break==NULL)
{
mem_init();
}
mem_reset_brk();
init_mem_sbrk_break=mem_sbrk(mem_pagesize());
if(*(int *)init_mem_sbrk_break==-1)
{
return -1;
}
head=(free_node_t **)init_mem_sbrk_break;
block_meta_data_t *metadata=(block_meta_data_t *)(head+1);
metadata->is_free=MM_TRUE;
metadata->block_size=mem_pagesize()-sizeof(block_meta_data_t)-sizeof(block_end_meta_data_t)-sizeof(head);
metadata->free_node=init_free_node();
metadata->next_block=NULL;
metadata->prev_block=NULL;
*head=&(metadata->free_node);
block_end_meta_data_t *end_meta_data=end_meta_data_addr(metadata);
end_meta_data->block_size=metadata->block_size;
//This function is called every time before each test run of the trace.
//It should reset the entire state of your malloc or the consecutive trace runs will give wrong answer.
/*
* This function should initialize and reset any data structures used to represent the starting state(empty heap)
*
* This function will be called multiple time in the driver code "mdriver.c"
*/
return 0; //Returns 0 on successfull initialization.
}
//---------------------------------------------------------------------------------------------------------------
/*
* mm_malloc - Allocate a block by incrementing the brk pointer.
* Always allocate a block whose size is a multiple of the alignment.
*/
void *mm_malloc(size_t size)
{
/*
* This function should keep track of the allocated memory blocks.
* The block allocation should minimize the number of holes (chucks of unusable memory) in the heap memory.
* The previously freed memory blocks should be reused.
* If no appropriate free block is available then the increase the heap size using 'mem_sbrk(size)'.
* Try to keep the heap size as small as possible.
*/
if(size <= 0){ // Invalid request size
return NULL;
}
size = ((size+7)/8)*8; //size alligned to 8 bytes
block_meta_data_t *free_metadata_block=get_node_from_freelist(head,size);
//If No free block available then we will request new pages by calling mem_sbrk()
if(free_metadata_block==NULL)
{
size_t sys_page_size=mem_pagesize();
int no_of_pages_req=((size+sizeof(block_end_meta_data_t)+sizeof(block_meta_data_t)+sys_page_size-1)/sys_page_size);
size_t extra_size_req=(int)no_of_pages_req*sys_page_size;
void *brk= mem_sbrk(extra_size_req);
if(*(int *)brk==-1)
{
return NULL;
}
block_end_meta_data_t *prev_end_meta_data=NULL;
prev_end_meta_data=(block_end_meta_data_t *)((char *)brk-sizeof(block_end_meta_data_t));
block_meta_data_t *prev_start_meta_data=NULL;
prev_start_meta_data=start_meta_data_addr(prev_end_meta_data);
block_meta_data_t *next_meta_data_block=(block_meta_data_t *)brk;
next_meta_data_block->is_free=MM_FALSE;
next_meta_data_block->block_size=size;
next_meta_data_block->free_node=init_free_node();
next_meta_data_block->prev_block=prev_start_meta_data;
prev_start_meta_data->next_block=next_meta_data_block;
next_meta_data_block->next_block=NULL;
block_end_meta_data_t *next_end_meta_data_block=end_meta_data_addr(next_meta_data_block);
next_end_meta_data_block->block_size=next_meta_data_block->block_size;
block_meta_data_t *new_free_meta_block=NEXT_META_BLOCK_BY_SIZE(next_meta_data_block);
new_free_meta_block->is_free=MM_TRUE;
new_free_meta_block->block_size=(uint32_t)(extra_size_req-size-(2*sizeof(block_meta_data_t))-(2*sizeof(block_end_meta_data_t)));
new_free_meta_block->free_node=init_free_node();
new_free_meta_block->prev_block=NULL;
block_end_meta_data_t *new_end_free_meta_block=end_meta_data_addr(new_free_meta_block);
new_end_free_meta_block->block_size=new_free_meta_block->block_size;
insert_node_in_freelist(head,new_free_meta_block);
mm_bind_blocks_for_allocation(next_meta_data_block,new_free_meta_block);
return (void *)(next_meta_data_block+1);
}
assert(free_metadata_block->is_free==MM_TRUE);
printf("Free Data block size=%d\n",(int)free_metadata_block->block_size);
uint32_t remaining_size=free_metadata_block->block_size-size;
free_metadata_block->is_free=MM_FALSE;
free_metadata_block->block_size=size;
block_end_meta_data_t *end_meta_data=end_meta_data_addr(free_metadata_block);
end_meta_data->block_size=size;
remove_block_from_free_list(head,&free_metadata_block->free_node);
//Here we will created new block by splitting previous block
if(sizeof(block_meta_data_t)+sizeof(block_end_meta_data_t)<remaining_size){
block_meta_data_t *next_meta_block=NULL;
block_end_meta_data_t *next_end_meta_block=NULL;
next_meta_block=NEXT_META_BLOCK_BY_SIZE(free_metadata_block);
next_meta_block->is_free=MM_TRUE;
next_meta_block->block_size=remaining_size-sizeof(block_meta_data_t)-sizeof(block_end_meta_data_t);
next_meta_block->free_node=init_free_node();
next_end_meta_block=end_meta_data_addr(next_meta_block);
next_end_meta_block->block_size=next_meta_block->block_size;
insert_node_in_freelist(head,next_meta_block);
mm_bind_blocks_for_allocation(free_metadata_block,next_meta_block);
}
return (void *)(free_metadata_block+1);
//mem_sbrk() is wrapper function for the sbrk() system call.
//Please use mem_sbrk() instead of sbrk() otherwise the evaluation results
//may give wrong results
}
void mm_free(void *ptr)
{
/*
* Searches the previously allocated node for memory block with base address ptr.
*
* It should also perform coalesceing on both ends i.e. if the consecutive memory blocks are
* free(not allocated) then they should be combined into a single block.
*
* It should also keep track of all the free memory blocks.
* If the freed block is at the end of the heap then you can also decrease the heap size
* using 'mem_sbrk(-size)'.
*/
block_meta_data_t *meta_data_block=(block_meta_data_t *)((char *)ptr-sizeof(block_meta_data_t));
assert(meta_data_block->is_free==MM_FALSE);
meta_data_block->is_free=MM_TRUE;
block_meta_data_t *prev_meta_data_block=meta_data_block->prev_block;
block_meta_data_t *next_meta_data_block=meta_data_block->next_block;
block_meta_data_t *merged_meta_data_block=NULL;
block_end_meta_data_t *merged_end_meta_data_block=NULL;
if(next_meta_data_block!=NULL)
{
meta_data_block->block_size+= get_internal_fragmented_size(meta_data_block,next_meta_data_block);
}
//If block being free is upper most block
else
{
int fragmented_size=(int)((char *)mem_heap_hi()+1-((char *)end_meta_data_addr(meta_data_block)+sizeof(block_end_meta_data_t)));
meta_data_block->block_size+=fragmented_size;
}
merged_meta_data_block=meta_data_block;
if(next_meta_data_block!=NULL&&next_meta_data_block->is_free==MM_TRUE)
{
remove_block_from_free_list(head,&next_meta_data_block->free_node);
merge_free_blocks(meta_data_block,next_meta_data_block);
merged_meta_data_block=meta_data_block;
}
if(prev_meta_data_block!=NULL&&prev_meta_data_block->is_free==MM_TRUE)
{
remove_block_from_free_list(head,&prev_meta_data_block->free_node);
merge_free_blocks(prev_meta_data_block,meta_data_block);
merged_meta_data_block=prev_meta_data_block;
}
merged_end_meta_data_block=(block_end_meta_data_t *)(end_meta_data_addr(merged_meta_data_block));
merged_end_meta_data_block->block_size=merged_meta_data_block->block_size;
insert_node_in_freelist(head,merged_meta_data_block);
}
/*
* mm_realloc - Implemented simply in terms of mm_malloc and mm_free
*/
void *mm_realloc(void *ptr, size_t size)
{
size = ((size+7)/8)*8; //8-byte alignement
if(ptr == NULL){ //memory was not previously allocated
return mm_malloc(size);
}
if(size == 0){ //new size is zero
mm_free(ptr);
return NULL;
}
/*
* This function should also copy the content of the previous memory block into the new block.
* You can use 'memcpy()' for this purpose.
*
* The data structures corresponding to free memory blocks and allocated memory
* blocks should also be updated.
*/
mm_free(ptr);
return mem_sbrk(size);
}
int main(int argc,char *argv[])
{
mm_init();
void *p1=mm_malloc(40);
void *p2=mm_malloc(40);
void *p3=mm_malloc(40);
mm_free(p1);
mm_free(p3);
mm_free(p2);
mm_malloc(60);
//mm_malloc(3962);
return 0;
}
File added
/*
* mm-naive.c - The fastest, least memory-efficient malloc package.
*
* In this naive approach, a block is allocated by simply incrementing
* the brk pointer. A block is pure payload. There are no headers or
* footers. Blocks are never coalesced or reused. Realloc is
* implemented directly using mm_malloc and mm_free.
*
* NOTE TO STUDENTS: Replace this header comment with your own header
* comment that gives a high level description of your solution.
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include "mm.h"
#include "memlib.h"
/*********************************************************
* NOTE TO STUDENTS: Before you do anything else, please
* provide your team information in the following struct.
********************************************************/
team_t team = {
/* Team name */
"team name",
/* First member's full name */
"member 1",
/* First member's email address */
"member_1@cse.iitb.ac.in",
/* Second member's full name (leave blank if none) */
"member 2",
/* Second member's email address (leave blank if none) */
"member_2@cse.iitb.ac.in"
};
/* single word (4) or double word (8) alignment */
#define ALIGNMENT 8
/* rounds up to the nearest multiple of ALIGNMENT */
#define ALIGN(size) (((size) + (ALIGNMENT-1)) & ~0x7)
#define SIZE_T_SIZE (ALIGN(sizeof(size_t)))
/*
* mm_init - initialize the malloc package.
*/
void *init_mem_sbrk_break = NULL;
int mm_init(void)
{
//This function is called every time before each test run of the trace.
//It should reset the entire state of your malloc or the consecutive trace runs will give wrong answer.
/*
* This function should initialize and reset any data structures used to represent the starting state(empty heap)
*
* This function will be called multiple time in the driver code "mdriver.c"
*/
return 0; //Returns 0 on successfull initialization.
}
//---------------------------------------------------------------------------------------------------------------
/*
* mm_malloc - Allocate a block by incrementing the brk pointer.
* Always allocate a block whose size is a multiple of the alignment.
*/
void *mm_malloc(size_t size)
{
/*
* This function should keep track of the allocated memory blocks.
* The block allocation should minimize the number of holes (chucks of unusable memory) in the heap memory.
* The previously freed memory blocks should be reused.
* If no appropriate free block is available then the increase the heap size using 'mem_sbrk(size)'.
* Try to keep the heap size as small as possible.
*/
if(size <= 0){ // Invalid request size
return NULL;
}
size = ((size+7)/8)*8; //size alligned to 8 bytes
return mem_sbrk(size); //mem_sbrk() is wrapper function for the sbrk() system call.
//Please use mem_sbrk() instead of sbrk() otherwise the evaluation results
//may give wrong results
}
void mm_free(void *ptr)
{
/*
* Searches the previously allocated node for memory block with base address ptr.
*
* It should also perform coalesceing on both ends i.e. if the consecutive memory blocks are
* free(not allocated) then they should be combined into a single block.
*
* It should also keep track of all the free memory blocks.
* If the freed block is at the end of the heap then you can also decrease the heap size
* using 'mem_sbrk(-size)'.
*/
}
/*
* mm_realloc - Implemented simply in terms of mm_malloc and mm_free
*/
void *mm_realloc(void *ptr, size_t size)
{
size = ((size+7)/8)*8; //8-byte alignement
if(ptr == NULL){ //memory was not previously allocated
return mm_malloc(size);
}
if(size == 0){ //new size is zero
mm_free(ptr);
return NULL;
}
/*
* This function should also copy the content of the previous memory block into the new block.
* You can use 'memcpy()' for this purpose.
*
* The data structures corresponding to free memory blocks and allocated memory
* blocks should also be updated.
*/
mm_free(ptr);
return mem_sbrk(size);
}
File added
#include<stdio.h>
#include "mm.h"
This source diff could not be displayed because it is too large. You can view the blob instead.
4000000
3324
6648
1
a 0 2040
a 1 2040
a 2 48
a 3 4072
a 4 4072
a 5 4072
a 6 4072
a 7 4072
a 8 4072
a 9 1008
a 10 504
a 11 1008
a 12 42
a 13 4072
a 14 72
a 15 4072
a 16 4072
a 17 4072
a 18 4072
a 19 4072
a 20 4072
a 21 4072
a 22 4072
a 23 4072
a 24 40
a 25 40
a 26 40
a 27 40
a 28 40
a 29 40
a 30 40
a 31 40
a 32 40
a 33 4072
a 34 456
a 35 456
a 36 456
a 37 456
a 38 456
a 39 456
a 40 456
a 41 456
a 42 456
a 43 456
a 44 456
a 45 456
a 46 456
a 47 456
a 48 456
a 49 456
a 50 456
a 51 456
a 52 456
a 53 456
a 54 456
a 55 456
a 56 456
a 57 456
a 58 456
a 59 456
a 60 456
a 61 456
a 62 456
a 63 456
a 64 456
a 65 456
a 66 456
a 67 456
a 68 456
a 69 456
a 70 456
a 71 456
a 72 456
a 73 456
a 74 9
a 75 10
a 76 9
a 77 9
a 78 4072
a 79 9
a 80 9
a 81 9
a 82 9
a 83 9
a 84 10
a 85 9
a 86 9
a 87 9
a 88 9
a 89 9
a 90 9
a 91 9
a 92 10
a 93 9
a 94 9
a 95 9
a 96 9
a 97 9
a 98 9
a 99 9
a 100 10
a 101 9
a 102 9
a 103 10
a 104 11
a 105 10
a 106 10
a 107 12
a 108 13
a 109 12
a 110 12
a 111 13
a 112 14
a 113 13
a 114 13
a 115 9
a 116 10
a 117 9
a 118 9
a 119 10
a 120 11
a 121 10
a 122 10
a 123 9
a 124 9
a 125 9
a 126 9
a 127 12
a 128 12
a 129 12
a 130 12
a 131 9
a 132 10
a 133 9
a 134 9
a 135 9
a 136 10
a 137 9
a 138 9
a 139 9
a 140 10
a 141 9
a 142 9
a 143 10
a 144 11
a 145 10
a 146 10
a 147 10
a 148 11
a 149 10
a 150 10
a 151 10
a 152 11
a 153 10
a 154 10
a 155 9
a 156 10
a 157 9
a 158 9
a 159 9
a 160 9
a 161 9
a 162 9
a 163 9
a 164 10
a 165 9
a 166 9
a 167 9
a 168 9
a 169 9
a 170 9
a 171 10
a 172 11
a 173 10
a 174 10
a 175 10
a 176 11
a 177 10
a 178 10
a 179 9
a 180 10
a 181 9
a 182 9
a 183 9
a 184 9
a 185 9
a 186 9
a 187 14
a 188 15
a 189 14
a 190 14
a 191 9
a 192 10
a 193 9
a 194 9
a 195 9
a 196 10
a 197 9
a 198 9
a 199 10
a 200 11
a 201 10
a 202 10
a 203 9
a 204 9
a 205 9
a 206 9
a 207 4072
a 208 4072
f 208
a 209 4072
a 210 4072
a 211 4072
a 212 4072
a 213 4072
a 214 4072
a 215 4072
a 216 4072
a 217 4072
a 218 15
a 219 10
a 220 48
a 221 24
a 222 8208
a 223 8208
a 224 80
a 225 4072
a 226 4072
a 227 72
a 228 4072
a 229 4072
a 230 4072
a 231 4072
a 232 4072
a 233 4072
a 234 4072
a 235 4072
a 236 4072
a 237 4072
a 238 4072
a 239 4072
a 240 4072
a 241 4072
a 242 4072
a 243 4072
a 244 4072
a 245 4072
a 246 4072
a 247 4072
a 248 4072
a 249 4072
a 250 4072
a 251 4072
a 252 4072
a 253 4072
a 254 4072
a 255 4072
a 256 4072
a 257 4072
a 258 4072
a 259 4072
a 260 4072
a 261 4072
a 262 4072
a 263 4072
a 264 4072
a 265 4072
a 266 4072
a 267 4072
a 268 4072
a 269 4072
a 270 4072
a 271 4072
a 272 4072
a 273 4072
a 274 4072
a 275 4072
a 276 4072
a 277 4072
a 278 4072
a 279 4072
a 280 4072
a 281 4072
a 282 4072
a 283 4072
a 284 4072
a 285 4072
a 286 4072
a 287 4072
a 288 4072
a 289 4072
a 290 4072
a 291 4072
a 292 4072
a 293 4072
a 294 4072
a 295 4072
a 296 4072
a 297 4072
a 298 4072
a 299 4072
a 300 4072
a 301 4072
a 302 4072
a 303 4072
a 304 4072
a 305 4072
a 306 4072
a 307 4072
a 308 4072
a 309 4072
a 310 4072
a 311 4072
a 312 4072
a 313 4072
a 314 4072
a 315 4072
a 316 4072
a 317 4072
a 318 4072
a 319 4072
a 320 4072
a 321 4072
a 322 4072
a 323 4072
a 324 4072
a 325 4072
a 326 4072
a 327 4072
a 328 4072
a 329 4072
a 330 4072
a 331 4072
a 332 4072
a 333 4072
a 334 4072
a 335 4072
a 336 4072
a 337 4072
a 338 4072
a 339 4072
a 340 4072
a 341 4072
a 342 4072
a 343 4072
a 344 4072
a 345 4072
a 346 4072
a 347 4072
a 348 4072
a 349 4072
a 350 4072
a 351 4072
a 352 4072
a 353 4072
a 354 4072
a 355 4072
a 356 4072
a 357 4072
a 358 4072
a 359 4072
a 360 4072
a 361 4072
a 362 4072
a 363 4072
a 364 4072
a 365 4072
a 366 4072
a 367 4072
a 368 4072
a 369 4072
a 370 4072
a 371 4072
a 372 4072
a 373 4072
a 374 4072
a 375 4072
a 376 4072
a 377 4072
a 378 4072
a 379 4072
a 380 4072
a 381 4072
a 382 4072
a 383 4072
a 384 4072
a 385 4072
a 386 4072
a 387 4072
a 388 4072
a 389 4072
a 390 4072
a 391 4072
a 392 4072
a 393 4072
a 394 4072
a 395 4072
a 396 4072
a 397 4072
a 398 4072
a 399 4072
a 400 4072
a 401 4072
a 402 4072
a 403 4072
a 404 4072
a 405 4072
a 406 4072
a 407 4072
a 408 4072
a 409 4072
a 410 4072
a 411 4072
a 412 4072
a 413 4072
a 414 4072
a 415 4072
a 416 4072
a 417 4072
a 418 4072
a 419 4072
a 420 4072
a 421 4072
a 422 4072
a 423 4072
a 424 4072
a 425 4072
a 426 4072
a 427 4072
a 428 4072
a 429 4072
a 430 4072
a 431 4072
a 432 4072
a 433 4072
a 434 4072
a 435 4072
a 436 4072
a 437 4072
a 438 4072
a 439 4072
a 440 4072
a 441 4072
a 442 4072
a 443 4072
a 444 4072
a 445 4072
a 446 4072
a 447 4072
a 448 72
a 449 160
f 448
a 450 4072
a 451 72
a 452 4072
a 453 4072
f 453
f 452
a 454 4072
a 455 72
a 456 160
f 455
a 457 4072
a 458 72
a 459 4072
a 460 4072
a 461 4072
f 461
f 459
f 460
f 457
a 462 4072
a 463 4072
a 464 4072
a 465 4072
a 466 4072
a 467 4072
a 468 4072
a 469 4072
a 470 4072
f 470
f 469
f 468
f 467
f 466
a 471 4072
a 472 4072
a 473 72
a 474 160
f 473
a 475 4072
a 476 72
a 477 72
a 478 4072
a 479 4072
a 480 4072
f 479
f 471
f 478
f 475
f 472
a 481 4072
a 482 4072
a 483 4072
f 483
a 484 4072
a 485 4072
a 486 4072
f 485
f 486
a 487 4072
a 488 4072
a 489 4072
f 489
a 490 4072
a 491 4072
f 491
a 492 4072
a 493 4072
f 492
f 493
a 494 4072
a 495 4072
a 496 4072
f 496
f 495
a 497 4072
a 498 4072
a 499 4072
a 500 4072
f 500
a 501 4072
a 502 4072
f 502
a 503 4072
a 504 72
a 505 160
f 504
a 506 4072
a 507 4072
a 508 4072
a 509 4072
f 509
f 508
f 507
f 506
a 510 4072
a 511 4072
a 512 4072
f 511
f 512
a 513 4072
a 514 4072
a 515 72
a 516 160
f 515
a 517 72
a 518 160
f 517
a 519 4072
a 520 72
a 521 160
f 520
a 522 4072
a 523 72
a 524 160
f 523
a 525 4072
a 526 72
a 527 160
f 526
a 528 4072
a 529 72
a 530 160
f 529
a 531 4072
a 532 4072
a 533 4072
a 534 4072
a 535 4072
a 536 4072
a 537 4072
a 538 4072
a 539 4072
a 540 4072
a 541 4072
a 542 4072
a 543 4072
a 544 72
a 545 160
f 544
a 546 4072
a 547 4072
a 548 4072
a 549 4072
a 550 4072
f 549
a 551 4072
a 552 4072
f 551
a 553 4072
a 554 4072
a 555 4072
a 556 4072
a 557 4072
a 558 4072
a 559 4072
a 560 4072
a 561 4072
a 562 4072
a 563 4072
a 564 4072
a 565 4072
f 564
f 563
f 562
f 561
f 557
f 548
f 539
f 536
f 525
f 560
f 559
f 558
f 556
f 555
f 554
f 553
f 552
f 550
f 546
f 543
f 542
f 541
f 540
f 538
f 537
f 535
f 534
f 533
f 532
f 531
f 528
f 522
f 519
a 566 4072
a 567 4072
a 568 4072
a 569 4072
a 570 4072
f 570
f 569
f 568
a 571 4072
a 572 4072
f 571
f 572
a 573 4072
a 574 4072
a 575 4072
f 575
f 574
a 576 4072
a 577 4072
f 577
a 578 4072
a 579 4072
a 580 4072
a 581 4072
f 579
f 581
f 580
a 582 4072
a 583 4072
a 584 72
a 585 160
f 584
a 586 72
a 587 160
f 586
a 588 4072
a 589 4072
a 590 4072
a 591 4072
a 592 4072
a 593 4072
a 594 4072
a 595 4072
a 596 4072
f 596
f 589
f 595
f 594
f 593
f 592
f 591
f 590
f 588
a 597 4072
a 598 72
a 599 160
f 598
a 600 72
a 601 160
f 600
a 602 4072
a 603 72
a 604 160
f 603
a 605 4072
a 606 4072
a 607 4072
a 608 4072
a 609 4072
a 610 4072
a 611 4072
a 612 4072
a 613 4072
a 614 4072
a 615 4072
a 616 4072
a 617 4072
f 615
a 618 4072
a 619 4072
a 620 4072
a 621 4072
a 622 4072
a 623 4072
a 624 4072
a 625 4072
a 626 4072
a 627 4072
a 628 4072
a 629 4072
a 630 4072
a 631 4072
a 632 4072
a 633 4072
a 634 4072
a 635 4072
a 636 4072
a 637 4072
a 638 4072
a 639 4072
a 640 4072
a 641 4072
f 639
f 638
f 637
f 634
f 626
f 620
f 617
f 609
f 636
f 635
f 633
f 632
f 631
f 630
f 629
f 628
f 627
f 625
f 624
f 623
f 622
f 621
f 619
f 618
f 616
f 614
f 613
f 612
f 611
f 610
f 608
f 607
f 606
f 605
a 642 4072
a 643 4072
a 644 4072
a 645 4072
f 645
f 642
f 644
f 643
a 646 4072
a 647 4072
a 648 4072
a 649 4072
a 650 4072
a 651 4072
a 652 4072
a 653 4072
a 654 4072
a 655 4072
f 655
f 649
f 654
f 653
f 652
f 651
f 650
f 648
a 656 4072
a 657 4072
a 658 72
a 659 160
f 658
a 660 4072
a 661 72
a 662 160
f 661
a 663 72
a 664 160
f 663
a 665 4072
a 666 72
a 667 160
f 666
a 668 72
a 669 160
f 668
a 670 4072
a 671 4072
a 672 4072
a 673 4072
a 674 4072
a 675 4072
a 676 4072
a 677 4072
a 678 4072
a 679 4072
a 680 4072
a 681 4072
f 680
f 679
f 678
f 671
f 677
f 676
f 675
f 674
f 673
f 672
f 670
f 665
f 660
a 682 4072
a 683 4072
a 684 72
a 685 160
f 684
a 686 4072
a 687 72
a 688 160
f 687
a 689 4072
a 690 4072
a 691 4072
a 692 4072
f 692
f 691
f 682
f 690
f 689
f 686
f 683
a 693 4072
a 694 4072
a 695 4072
a 696 72
a 697 160
f 696
a 698 4072
a 699 72
a 700 160
f 699
a 701 4072
a 702 4072
f 702
f 701
f 698
a 703 4072
a 704 4072
a 705 72
a 706 160
f 705
a 707 4072
a 708 72
a 709 160
f 708
a 710 4072
a 711 4072
f 711
f 710
f 707
f 704
a 712 4072
a 713 4072
a 714 4072
a 715 4072
a 716 4072
a 717 4072
a 718 4072
a 719 4072
f 718
f 712
f 717
f 716
f 715
f 714
f 713
a 720 4072
a 721 4072
a 722 4072
a 723 4072
a 724 4072
a 725 4072
a 726 4072
a 727 4072
a 728 72
a 729 4072
a 730 4072
a 731 4072
a 732 4072
a 733 4072
f 730
a 734 4072
a 735 4072
a 736 4072
a 737 4072
f 736
a 738 4072
a 739 4072
a 740 4072
a 741 4072
a 742 4072
a 743 4072
f 742
a 744 4072
a 745 4072
a 746 4072
a 747 4072
a 748 4072
f 747
f 746
f 745
f 738
f 734
f 724
f 744
f 743
f 741
f 740
f 739
f 737
f 735
f 733
f 732
f 731
f 729
f 727
f 726
f 725
f 723
f 722
a 749 72
a 750 160
f 749
a 751 4072
a 752 4072
a 753 4072
f 753
f 752
a 754 4072
a 755 72
a 756 160
f 755
a 757 4072
a 758 4072
a 759 4072
a 760 4072
a 761 4072
f 760
f 754
f 759
f 758
f 757
a 762 4072
a 763 4072
a 764 72
a 765 160
f 764
a 766 72
a 767 160
f 766
a 768 72
a 769 160
f 768
a 770 4072
a 771 4072
a 772 72
a 773 160
f 772
a 774 4072
a 775 4072
a 776 4072
a 777 4072
a 778 4072
a 779 4072
a 780 4072
a 781 4072
a 782 4072
a 783 4072
f 782
f 781
f 780
f 771
f 779
f 778
f 777
f 776
f 775
f 774
f 770
f 763
a 784 4072
a 785 4072
a 786 72
a 787 160
f 786
a 788 72
a 789 160
f 788
a 790 4072
a 791 72
a 792 160
f 791
a 793 4072
a 794 4072
a 795 4072
a 796 4072
a 797 4072
f 795
a 798 4072
a 799 4072
a 800 4072
f 799
a 801 4072
a 802 4072
a 803 4072
a 804 4072
a 805 4072
a 806 4072
a 807 4072
a 808 4072
a 809 4072
a 810 4072
a 811 72
a 812 160
f 811
a 813 72
a 814 160
f 813
a 815 72
a 816 160
f 815
a 817 4072
a 818 4072
a 819 4072
a 820 4072
a 821 4072
a 822 72
a 823 160
a 824 4072
f 822
a 825 72
a 826 160
f 825
a 827 4072
a 828 4072
a 829 4072
a 830 4072
a 831 4072
a 832 4072
f 827
a 833 4072
f 819
a 834 72
a 835 160
f 834
a 836 4072
a 837 4072
a 838 4072
a 839 72
a 840 160
f 839
a 841 72
a 842 160
f 841
a 843 4072
a 844 4072
a 845 5476
a 846 4072
f 836
a 847 72
a 848 160
a 849 4072
f 847
a 850 4072
a 851 4072
a 852 4072
a 853 4072
a 854 4072
a 855 4072
a 856 4072
f 852
a 857 4072
a 858 4072
f 857
a 859 4072
f 859
a 860 4072
a 861 4072
f 808
a 862 4072
a 863 72
a 864 160
f 863
a 865 72
a 866 160
f 865
a 867 4072
a 868 4072
a 869 72
a 870 160
f 869
a 871 4072
a 872 4072
a 873 4072
a 874 4072
f 874
a 875 4072
f 875
a 876 4072
a 877 4072
a 878 4072
f 878
a 879 4072
a 880 4072
a 881 4072
f 881
a 882 4072
a 883 72
a 884 160
f 883
a 885 4072
a 886 4072
a 887 4072
a 888 4072
a 889 4072
a 890 4072
a 891 4072
f 890
a 892 4072
a 893 4072
a 894 4072
f 893
a 895 4072
a 896 4072
a 897 10852
a 898 4072
a 899 4072
f 898
a 900 4072
a 901 4072
a 902 4072
a 903 4072
a 904 4072
a 905 4072
a 906 4072
a 907 72
a 908 160
f 907
a 909 72
a 910 160
f 909
a 911 4072
a 912 4072
a 913 4072
a 914 4072
a 915 4072
a 916 4072
f 913
a 917 4072
a 918 72
a 919 160
f 918
a 920 4072
a 921 4072
a 922 4072
a 923 4072
a 924 4072
a 925 4072
a 926 4072
a 927 4072
a 928 4072
a 929 4072
a 930 4072
a 931 4072
a 932 4072
a 933 4072
a 934 4072
a 935 4072
f 932
f 931
f 930
f 929
f 928
f 927
f 926
f 925
f 924
f 923
f 914
f 906
f 899
f 897
f 896
f 885
f 872
f 860
f 849
f 845
f 838
f 820
f 805
f 803
f 794
f 922
f 921
f 920
f 916
f 915
f 912
f 911
f 905
f 904
f 903
f 902
f 901
f 900
f 895
f 894
f 892
f 891
f 889
f 888
f 887
f 886
f 882
f 880
f 879
f 877
f 876
f 873
f 871
f 868
f 867
f 862
f 861
f 858
f 856
f 855
f 854
f 853
f 851
f 850
f 846
f 844
f 843
f 837
f 833
f 832
f 831
f 830
f 828
f 824
f 821
f 818
f 817
f 810
f 809
f 807
f 806
f 804
f 802
f 801
f 800
f 798
f 797
f 796
f 793
f 790
f 785
a 936 4072
a 937 4072
a 938 4072
a 939 4072
a 940 4072
a 941 4072
f 941
f 936
f 940
f 939
f 938
f 937
a 942 4072
a 943 4072
a 944 4072
a 945 72
a 946 160
f 945
a 947 72
a 948 160
f 947
a 949 4072
a 950 4072
a 951 4072
a 952 4072
a 953 4072
a 954 4072
a 955 4072
a 956 4072
a 957 4072
a 958 4072
a 959 4072
a 960 4072
a 961 4072
f 956
a 962 4072
a 963 4072
a 964 72
a 965 160
f 964
a 966 4072
a 967 4072
f 967
a 968 72
a 969 160
f 968
a 970 4072
a 971 4072
a 972 4072
f 970
a 973 4072
f 973
a 974 4072
a 975 4072
f 975
a 976 4072
a 977 4072
f 977
a 978 4072
a 979 4072
a 980 4072
a 981 4072
a 982 4072
a 983 4072
f 982
a 984 4072
a 985 4072
f 984
f 979
a 986 4072
a 987 4072
a 988 4072
a 989 4072
a 990 5476
a 991 4072
a 992 4072
a 993 4072
a 994 4072
a 995 4072
a 996 4072
a 997 4072
a 998 4072
f 997
a 999 4072
a 1000 4072
f 999
a 1001 72
a 1002 160
f 1001
a 1003 72
a 1004 160
a 1005 4072
f 1003
a 1006 4072
a 1007 4072
a 1008 4072
a 1009 4072
a 1010 72
a 1011 4072
a 1012 4072
a 1013 4072
a 1014 4072
a 1015 4072
a 1016 4072
a 1017 4072
f 1016
a 1018 4072
a 1019 4072
a 1020 4072
a 1021 72
a 1022 160
f 1021
a 1023 4072
a 1024 4072
a 1025 72
a 1026 160
f 1025
a 1027 4072
a 1028 4072
f 1027
a 1029 4072
f 1029
a 1030 4072
a 1031 4072
f 1031
a 1032 4072
f 1032
a 1033 4072
a 1034 4072
a 1035 4072
f 1035
f 1019
f 1008
a 1036 4072
a 1037 4072
a 1038 4072
a 1039 4072
a 1040 4072
a 1041 10852
a 1042 4072
f 1037
a 1043 4072
a 1044 4072
a 1045 4072
a 1046 4072
a 1047 4072
a 1048 4072
a 1049 4072
a 1050 4072
a 1051 4072
a 1052 4072
a 1053 4072
a 1054 4072
a 1055 4072
a 1056 4072
f 1054
f 1053
f 1052
f 1051
f 1050
f 1049
f 1048
f 1047
f 1046
f 1042
f 1041
f 1036
f 1015
f 1005
f 992
f 990
f 989
f 978
f 963
f 959
f 951
f 1045
f 1044
f 1043
f 1040
f 1039
f 1038
f 1034
f 1030
f 1028
f 1024
f 1023
f 1020
f 1018
f 1017
f 1014
f 1013
f 1012
f 1011
f 1009
f 1007
f 1006
f 1000
f 998
f 996
f 995
f 994
f 993
f 991
f 988
f 987
f 986
f 985
f 983
f 981
f 980
f 976
f 974
f 972
f 971
f 966
f 962
f 961
f 960
f 958
f 957
f 955
f 954
f 953
f 952
f 950
f 949
a 1057 4072
a 1058 72
a 1059 160
f 1058
a 1060 4072
a 1061 72
a 1062 160
f 1061
a 1063 4072
a 1064 72
a 1065 160
f 1064
a 1066 72
a 1067 160
f 1066
a 1068 4072
a 1069 4072
a 1070 4072
a 1071 4072
a 1072 4072
f 1071
f 1070
f 1069
f 1068
f 1063
f 1060
a 1073 4072
a 1074 72
a 1075 160
f 1074
a 1076 4072
f 1073
f 1076
a 1077 4072
a 1078 4072
a 1079 72
a 1080 160
f 1079
a 1081 72
a 1082 160
f 1081
a 1083 4072
a 1084 4072
a 1085 4072
a 1086 4072
a 1087 4072
f 1087
f 1084
f 1086
f 1085
f 1083
f 1078
a 1088 4072
a 1089 4072
a 1090 4072
a 1091 4072
a 1092 4072
f 1092
f 1091
a 1093 4072
a 1094 72
a 1095 160
f 1094
a 1096 72
a 1097 160
f 1096
a 1098 4072
a 1099 4072
a 1100 4072
a 1101 4072
a 1102 4072
a 1103 4072
a 1104 4072
a 1105 4072
a 1106 4072
f 1106
a 1107 4072
a 1108 4072
a 1109 4072
a 1110 4072
a 1111 4072
a 1112 4072
f 1108
a 1113 4072
a 1114 4072
a 1115 4072
a 1116 72
a 1117 160
f 1116
a 1118 4072
a 1119 4072
a 1120 4072
a 1121 4072
f 1118
a 1122 4072
a 1123 4072
a 1124 72
a 1125 160
f 1124
a 1126 4072
a 1127 4072
a 1128 4072
a 1129 4072
a 1130 4072
a 1131 4072
a 1132 4072
a 1133 4072
a 1134 4072
f 1134
f 1133
f 1132
f 1131
f 1123
f 1113
f 1109
f 1103
f 1093
f 1130
f 1129
f 1128
f 1126
f 1122
f 1121
f 1120
f 1119
f 1115
f 1114
f 1112
f 1111
f 1110
f 1107
f 1105
f 1104
f 1102
f 1101
f 1100
f 1099
f 1098
a 1135 4072
a 1136 4072
a 1137 72
a 1138 160
f 1137
a 1139 4072
a 1140 4072
a 1141 4072
a 1142 4072
a 1143 4072
a 1144 4072
a 1145 4072
f 1145
f 1141
f 1144
f 1143
f 1142
f 1140
f 1139
a 1146 4072
a 1147 4072
a 1148 4072
a 1149 4072
a 1150 4072
a 1151 4072
a 1152 4072
a 1153 4072
a 1154 4072
f 1151
f 1150
a 1155 4072
a 1156 4072
a 1157 4072
a 1158 4072
a 1159 4072
f 1156
a 1160 4072
a 1161 4072
f 1161
a 1162 4072
f 1162
f 1158
f 1160
f 1159
f 1157
f 1155
f 1154
f 1153
f 1152
f 1149
f 1148
a 1163 4072
a 1164 4072
a 1165 72
a 1166 160
f 1165
a 1167 4072
a 1168 4072
a 1169 4072
a 1170 4072
a 1171 4072
a 1172 4072
a 1173 4072
a 1174 4072
a 1175 4072
f 1174
f 1171
f 1163
f 1173
f 1172
f 1170
f 1169
f 1168
f 1167
f 1164
a 1176 4072
a 1177 4072
a 1178 72
a 1179 160
f 1178
a 1180 4072
a 1181 4072
a 1182 4072
a 1183 4072
a 1184 4072
f 1184
f 1181
f 1183
f 1182
f 1180
a 1185 4072
a 1186 72
a 1187 160
f 1186
a 1188 4072
a 1189 4072
a 1190 4072
a 1191 4072
a 1192 4072
a 1193 4072
a 1194 72
a 1195 160
f 1194
a 1196 72
a 1197 160
f 1196
a 1198 72
a 1199 160
f 1198
a 1200 4072
a 1201 4072
a 1202 4072
a 1203 4072
a 1204 4072
a 1205 4072
a 1206 4072
a 1207 4072
f 1207
a 1208 4072
a 1209 4072
a 1210 4072
f 1203
a 1211 4072
a 1212 4072
a 1213 4072
a 1214 4072
f 1214
f 1213
f 1212
f 1210
f 1204
f 1190
f 1211
f 1209
f 1208
f 1206
f 1205
f 1202
f 1200
f 1193
f 1192
f 1191
f 1189
f 1188
a 1215 4072
a 1216 4072
a 1217 72
a 1218 160
f 1217
a 1219 4072
a 1220 72
a 1221 160
f 1220
a 1222 4072
a 1223 4072
a 1224 4072
f 1224
f 1223
f 1222
f 1219
a 1225 4072
a 1226 4072
f 1225
f 1226
a 1227 4072
a 1228 4072
a 1229 4072
a 1230 4072
f 1229
f 1228
a 1231 4072
a 1232 4072
a 1233 4072
f 1233
a 1234 4072
a 1235 4072
a 1236 4072
a 1237 4072
a 1238 4072
a 1239 72
a 1240 160
f 1239
a 1241 4072
a 1242 4072
a 1243 4072
f 1242
a 1244 4072
a 1245 4072
a 1246 72
a 1247 160
f 1246
a 1248 4072
a 1249 72
a 1250 160
f 1249
a 1251 4072
a 1252 72
a 1253 4072
a 1254 4072
f 1253
a 1255 4072
a 1256 4072
a 1257 72
a 1258 4072
a 1259 72
a 1260 4072
a 1261 4072
f 1256
a 1262 4072
a 1263 4072
a 1264 258
f 1244
a 1265 4072
a 1266 4072
a 1267 4072
a 1268 4072
f 1267
f 1266
f 1262
f 1255
f 1237
f 1265
f 1263
f 1261
f 1258
f 1254
f 1251
f 1248
f 1245
f 1243
f 1241
f 1238
f 1236
f 1235
a 1269 4072
a 1270 4072
f 1270
a 1271 4072
a 1272 4072
a 1273 4072
a 1274 4072
a 1275 4072
f 1275
f 1272
f 1274
f 1273
a 1276 4072
a 1277 4072
a 1278 72
a 1279 160
f 1278
a 1280 4072
a 1281 72
a 1282 160
f 1281
a 1283 4072
a 1284 4072
a 1285 4072
a 1286 4072
f 1286
f 1284
f 1285
f 1283
f 1280
a 1287 4072
a 1288 72
a 1289 160
f 1288
a 1290 72
a 1291 160
f 1290
a 1292 4072
a 1293 4072
a 1294 4072
a 1295 4072
a 1296 4072
a 1297 4072
a 1298 4072
a 1299 4072
a 1300 4072
a 1301 4072
a 1302 4072
a 1303 4072
a 1304 4072
a 1305 4072
a 1306 4072
a 1307 4072
a 1308 4072
f 1307
f 1306
f 1305
f 1302
f 1295
f 1304
f 1303
f 1301
f 1300
f 1299
f 1298
f 1297
f 1296
f 1294
f 1293
f 1292
a 1309 4072
a 1310 4072
a 1311 4072
a 1312 4072
a 1313 4072
f 1310
a 1314 4072
f 1314
f 1309
f 1313
f 1312
f 1311
a 1315 4072
a 1316 4072
a 1317 4072
a 1318 72
a 1319 160
f 1318
a 1320 4072
a 1321 72
a 1322 160
a 1323 4072
f 1321
a 1324 4072
a 1325 4072
a 1326 4072
f 1326
f 1323
f 1325
f 1324
f 1320
f 1317
a 1327 4072
a 1328 4072
a 1329 4072
a 1330 4072
a 1331 4072
a 1332 4072
a 1333 4072
a 1334 4072
a 1335 72
a 1336 160
f 1335
a 1337 4072
a 1338 4072
a 1339 4072
a 1340 4072
f 1339
f 1332
f 1338
f 1337
f 1334
f 1333
f 1331
f 1330
f 1329
a 1341 4072
a 1342 4072
a 1343 4072
a 1344 4072
f 1344
f 1341
f 1343
f 1342
a 1345 4072
a 1346 4072
a 1347 4072
f 1347
f 1346
a 1348 4072
a 1349 4072
a 1350 4072
a 1351 72
a 1352 160
f 1351
a 1353 72
a 1354 160
f 1353
a 1355 4072
a 1356 4072
a 1357 4072
a 1358 4072
a 1359 4072
a 1360 4072
a 1361 4072
a 1362 4072
a 1363 4072
a 1364 4072
a 1365 4072
a 1366 4072
a 1367 4072
f 1367
f 1366
f 1364
f 1356
f 1365
f 1363
f 1362
f 1361
f 1360
f 1359
f 1358
f 1357
f 1355
f 1350
a 1368 4072
a 1369 4072
a 1370 4072
a 1371 72
a 1372 160
f 1371
a 1373 4072
a 1374 72
a 1375 160
f 1374
a 1376 4072
a 1377 4072
a 1378 4072
f 1378
f 1377
f 1376
f 1373
a 1379 4072
f 1379
a 1380 4072
a 1381 4072
a 1382 4072
a 1383 4072
a 1384 4072
a 1385 4072
a 1386 4072
a 1387 4072
a 1388 4072
a 1389 4072
a 1390 4072
a 1391 4072
a 1392 4072
a 1393 4072
a 1394 4072
a 1395 4072
a 1396 4072
a 1397 4072
a 1398 4072
a 1399 4072
a 1400 4072
a 1401 4072
a 1402 4072
a 1403 4072
a 1404 4072
a 1405 4072
a 1406 4072
a 1407 4072
a 1408 4072
a 1409 4072
a 1410 4072
a 1411 4072
a 1412 4072
a 1413 4072
a 1414 4072
a 1415 4072
a 1416 4072
a 1417 4072
a 1418 4072
a 1419 4072
a 1420 4072
a 1421 4072
a 1422 4072
a 1423 4072
a 1424 5476
a 1425 4072
a 1426 4072
a 1427 4072
a 1428 4072
a 1429 4072
a 1430 4072
a 1431 4072
a 1432 4072
a 1433 4072
a 1434 4072
a 1435 4072
a 1436 4072
a 1437 4072
a 1438 4072
a 1439 4072
a 1440 4072
a 1441 4072
a 1442 4072
a 1443 4072
a 1444 4072
a 1445 4072
a 1446 4072
a 1447 4072
a 1448 4072
a 1449 4072
a 1450 4072
a 1451 4072
a 1452 4072
a 1453 4072
a 1454 4072
a 1455 4072
a 1456 4072
a 1457 4072
a 1458 4072
a 1459 4072
a 1460 4072
a 1461 4072
a 1462 4072
a 1463 4072
a 1464 4072
a 1465 4072
a 1466 4072
a 1467 4072
a 1468 4072
a 1469 4072
a 1470 4072
a 1471 4072
a 1472 4072
a 1473 4072
a 1474 4072
a 1475 4072
a 1476 4072
a 1477 4072
a 1478 4072
a 1479 4072
a 1480 4072
a 1481 4072
a 1482 4072
a 1483 4072
a 1484 4072
a 1485 4072
a 1486 4072
a 1487 4072
a 1488 4072
a 1489 4072
a 1490 4072
a 1491 4072
a 1492 4072
a 1493 4072
a 1494 4072
a 1495 10852
a 1496 4072
a 1497 4072
a 1498 4072
a 1499 4072
a 1500 4072
a 1501 4072
a 1502 4072
a 1503 4072
a 1504 4072
a 1505 4072
a 1506 4072
a 1507 4072
a 1508 4072
a 1509 4072
a 1510 4072
a 1511 4072
a 1512 4072
a 1513 72
a 1514 160
f 1513
a 1515 72
a 1516 160
f 1515
a 1517 4072
a 1518 4072
a 1519 4072
a 1520 72
a 1521 160
f 1520
a 1522 72
a 1523 160
f 1522
a 1524 4072
a 1525 4072
a 1526 72
a 1527 160
f 1526
a 1528 72
a 1529 160
f 1528
a 1530 4072
a 1531 4072
a 1532 4072
a 1533 4072
a 1534 4072
a 1535 4072
a 1536 4072
a 1537 4072
a 1538 4072
a 1539 4072
a 1540 4072
a 1541 4072
a 1542 4072
a 1543 4072
a 1544 4072
a 1545 4072
a 1546 4072
a 1547 4072
f 1545
f 1544
f 1543
f 1542
f 1541
f 1540
f 1539
f 1538
f 1537
f 1532
f 1518
f 1504
f 1496
f 1495
f 1494
f 1487
f 1479
f 1470
f 1464
f 1457
f 1452
f 1445
f 1439
f 1432
f 1425
f 1424
f 1420
f 1413
f 1406
f 1399
f 1397
f 1392
f 1383
f 1536
f 1535
f 1534
f 1533
f 1531
f 1530
f 1525
f 1524
f 1519
f 1517
f 1512
f 1511
f 1510
f 1508
f 1507
f 1506
f 1505
f 1503
f 1502
f 1501
f 1500
f 1499
f 1498
f 1497
f 1493
f 1492
f 1491
f 1490
f 1489
f 1488
f 1486
f 1485
f 1484
f 1483
f 1482
f 1481
f 1480
f 1478
f 1477
f 1476
f 1475
f 1474
f 1473
f 1472
f 1471
f 1469
f 1468
f 1467
f 1466
f 1465
f 1463
f 1462
f 1461
f 1460
f 1459
f 1458
f 1456
f 1455
f 1454
f 1453
f 1451
f 1450
f 1449
f 1448
f 1447
f 1446
f 1444
f 1443
f 1442
f 1441
f 1440
f 1438
f 1437
f 1436
f 1435
f 1434
f 1433
f 1431
f 1430
f 1429
f 1428
f 1427
f 1426
f 1423
f 1422
f 1421
f 1419
f 1418
f 1417
f 1416
f 1415
f 1414
f 1412
f 1411
f 1410
f 1409
f 1408
f 1407
f 1405
f 1404
f 1403
f 1402
f 1401
f 1400
f 1398
f 1396
f 1395
f 1394
f 1393
f 1391
f 1390
f 1389
f 1388
f 1387
f 1386
f 1385
f 1382
f 1381
a 1548 4072
a 1549 4072
a 1550 72
a 1551 160
f 1550
a 1552 4072
a 1553 4072
a 1554 4072
a 1555 4072
a 1556 4072
a 1557 4072
f 1557
f 1555
f 1556
f 1554
f 1552
f 1549
a 1558 4072
a 1559 4072
a 1560 72
a 1561 160
f 1560
a 1562 72
a 1563 160
f 1562
a 1564 72
a 1565 160
f 1564
a 1566 72
a 1567 160
f 1566
a 1568 4072
a 1569 72
a 1570 160
f 1569
a 1571 72
a 1572 160
f 1571
a 1573 4072
a 1574 4072
a 1575 4072
a 1576 4072
a 1577 4072
a 1578 4072
a 1579 4072
a 1580 4072
a 1581 4072
a 1582 4072
a 1583 4072
a 1584 4072
a 1585 72
a 1586 160
a 1587 4072
f 1585
a 1588 4072
a 1589 4072
a 1590 4072
a 1591 4072
a 1592 4072
a 1593 4072
a 1594 4072
f 1582
f 1580
a 1595 4072
a 1596 4072
f 1596
f 1595
f 1590
f 1584
f 1574
f 1594
f 1592
f 1591
f 1589
f 1588
f 1587
f 1583
f 1581
f 1579
f 1578
f 1577
f 1576
f 1575
f 1573
f 1568
f 1559
a 1597 4072
a 1598 4072
a 1599 4072
a 1600 4072
f 1599
f 1600
a 1601 72
a 1602 160
f 1601
a 1603 4072
a 1604 4072
a 1605 72
a 1606 160
f 1605
a 1607 4072
a 1608 4072
a 1609 4072
a 1610 4072
a 1611 72
a 1612 160
f 1611
a 1613 4072
a 1614 4072
a 1615 4072
f 1613
a 1616 4072
a 1617 4072
a 1618 4072
f 1616
a 1619 4072
a 1620 4072
a 1621 4072
a 1622 72
a 1623 160
f 1622
a 1624 4072
a 1625 4072
a 1626 4072
a 1627 4072
a 1628 4072
a 1629 4072
a 1630 4072
a 1631 4072
a 1632 4072
a 1633 4072
a 1634 4072
a 1635 4072
a 1636 4072
a 1637 4072
a 1638 4072
a 1639 4072
a 1640 4072
f 1639
a 1641 4072
a 1642 4072
f 1641
a 1643 4072
a 1644 4072
f 1643
a 1645 4072
f 1645
a 1646 4072
f 1646
a 1647 4072
a 1648 4072
a 1649 4072
a 1650 5476
a 1651 4072
f 1647
a 1652 4072
a 1653 72
a 1654 160
f 1653
a 1655 4072
a 1656 4072
a 1657 4072
a 1658 72
a 1659 160
f 1658
a 1660 4072
a 1661 4072
a 1662 4072
a 1663 4072
a 1664 4072
a 1665 4072
a 1666 4072
a 1667 4072
f 1664
a 1668 4072
a 1669 4072
a 1670 4072
a 1671 4072
a 1672 4072
a 1673 4072
a 1674 4072
f 1672
f 1671
f 1670
f 1669
f 1668
f 1662
f 1652
f 1650
f 1649
f 1636
f 1628
f 1625
f 1620
f 1607
f 1667
f 1666
f 1665
f 1663
f 1661
f 1660
f 1657
f 1656
f 1655
f 1651
f 1648
f 1644
f 1642
f 1640
f 1638
f 1637
f 1635
f 1634
f 1633
f 1632
f 1631
f 1630
f 1629
f 1627
f 1626
f 1624
f 1621
f 1619
f 1617
f 1615
f 1614
f 1610
f 1609
f 1608
f 1604
a 1675 4072
a 1676 4072
a 1677 72
a 1678 160
f 1677
a 1679 72
a 1680 160
f 1679
a 1681 4072
a 1682 4072
a 1683 4072
a 1684 4072
a 1685 4072
a 1686 4072
a 1687 4072
a 1688 4072
a 1689 4072
a 1690 4072
a 1691 4072
a 1692 4072
a 1693 4072
f 1693
f 1692
f 1685
f 1691
f 1690
f 1689
f 1688
f 1687
f 1686
f 1684
f 1683
f 1681
f 1676
a 1694 4072
a 1695 4072
a 1696 72
a 1697 160
f 1696
a 1698 4072
a 1699 4072
a 1700 4072
a 1701 4072
a 1702 4072
a 1703 4072
a 1704 4072
a 1705 4072
a 1706 4072
a 1707 4072
a 1708 4072
a 1709 4072
a 1710 4072
a 1711 4072
a 1712 4072
f 1706
a 1713 4072
a 1714 4072
a 1715 4072
a 1716 4072
f 1715
a 1717 4072
a 1718 4072
a 1719 4072
a 1720 4072
a 1721 4072
f 1721
a 1722 4072
a 1723 4072
f 1722
a 1724 4072
a 1725 4072
a 1726 4072
f 1726
a 1727 4072
a 1728 4072
f 1727
a 1729 4072
a 1730 4072
a 1731 4072
a 1732 4072
a 1733 4072
a 1734 5476
a 1735 4072
a 1736 4072
a 1737 4072
f 1737
a 1738 4072
a 1739 4072
a 1740 4072
a 1741 4072
a 1742 4072
a 1743 4072
a 1744 4072
a 1745 4072
a 1746 4072
a 1747 4072
a 1748 4072
a 1749 4072
a 1750 4072
a 1751 4072
a 1752 4072
a 1753 4072
f 1751
f 1750
f 1749
f 1748
f 1747
f 1746
f 1742
f 1735
f 1734
f 1733
f 1724
f 1714
f 1708
f 1703
f 1695
f 1745
f 1744
f 1743
f 1741
f 1740
f 1739
f 1738
f 1736
f 1732
f 1731
f 1730
f 1729
f 1728
f 1725
f 1723
f 1720
f 1719
f 1718
f 1717
f 1716
f 1713
f 1712
f 1711
f 1709
f 1707
f 1705
f 1704
f 1702
f 1701
f 1700
f 1699
f 1698
a 1754 4072
a 1755 72
a 1756 160
f 1755
a 1757 4072
a 1758 72
a 1759 160
f 1758
a 1760 72
a 1761 160
f 1760
a 1762 72
a 1763 160
f 1762
a 1764 4072
a 1765 4072
a 1766 4072
a 1767 4072
a 1768 4072
a 1769 4072
f 1769
a 1770 4072
a 1771 4072
a 1772 4072
a 1773 4072
a 1774 4072
a 1775 4072
a 1776 4072
a 1777 4072
a 1778 4072
a 1779 4072
f 1774
a 1780 4072
a 1781 4072
a 1782 4072
a 1783 4072
a 1784 4072
a 1785 4072
a 1786 4072
f 1785
a 1787 4072
a 1788 4072
a 1789 4072
a 1790 72
a 1791 160
f 1790
a 1792 4072
f 1788
a 1793 4072
a 1794 4072
f 1793
a 1795 4072
a 1796 4072
a 1797 72
a 1798 160
f 1797
a 1799 4072
a 1800 4072
a 1801 4072
f 1801
a 1802 4072
a 1803 5476
a 1804 4072
a 1805 4072
a 1806 4072
f 1805
a 1807 4072
a 1808 4072
f 1807
a 1809 4072
a 1810 4072
a 1811 4072
a 1812 72
a 1813 160
f 1812
a 1814 4072
f 1809
a 1815 4072
a 1816 4072
a 1817 4072
f 1815
f 1795
a 1818 4072
a 1819 72
a 1820 160
f 1819
a 1821 4072
a 1822 4072
a 1823 72
a 1824 160
f 1823
a 1825 4072
a 1826 72
a 1827 160
f 1826
a 1828 4072
a 1829 4072
a 1830 4072
a 1831 4072
a 1832 4072
a 1833 4072
a 1834 4072
a 1835 4072
a 1836 4072
f 1832
a 1837 4072
a 1838 4072
a 1839 4072
f 1837
a 1840 4072
a 1841 4072
a 1842 72
a 1843 160
a 1844 4072
f 1842
a 1845 4072
a 1846 4072
a 1847 4072
f 1840
a 1848 4072
a 1849 4072
a 1850 4072
a 1851 72
a 1852 160
f 1851
a 1853 72
a 1854 160
a 1855 4072
f 1853
a 1856 4072
a 1857 4072
a 1858 4072
f 1858
a 1859 4072
f 1859
a 1860 4072
a 1861 4072
a 1862 4072
a 1863 10852
a 1864 4072
a 1865 4072
f 1861
a 1866 4072
a 1867 4072
f 1866
a 1868 4072
a 1869 4072
a 1870 4072
a 1871 4072
a 1872 4072
a 1873 4072
a 1874 4072
f 1874
a 1875 4072
a 1876 4072
f 1875
a 1877 4072
a 1878 4072
a 1879 4072
f 1877
a 1880 4072
f 1871
a 1881 4072
a 1882 4072
a 1883 4072
a 1884 4072
f 1882
f 1868
a 1885 4072
a 1886 4072
f 1886
a 1887 4072
a 1888 4072
f 1887
a 1889 4072
a 1890 4072
a 1891 72
a 1892 160
f 1891
a 1893 4072
a 1894 72
a 1895 160
f 1894
a 1896 72
a 1897 160
a 1898 4072
f 1896
a 1899 72
a 1900 160
f 1899
a 1901 4072
a 1902 4072
a 1903 72
a 1904 160
f 1903
a 1905 4072
a 1906 4072
a 1907 4072
a 1908 4072
a 1909 4072
a 1910 4072
f 1890
a 1911 4072
a 1912 4072
a 1913 4072
a 1914 4072
a 1915 4072
a 1916 4072
a 1917 4072
a 1918 4072
a 1919 4072
a 1920 4072
a 1921 4072
a 1922 4072
a 1923 4072
f 1917
a 1924 72
a 1925 160
f 1924
a 1926 4072
a 1927 4072
a 1928 4072
f 1926
f 1911
a 1929 4072
f 1848
a 1930 4072
a 1931 4072
a 1932 4548
a 1933 4072
a 1934 4072
a 1935 4548
a 1936 4548
a 1937 4548
a 1938 4072
a 1939 4072
a 1940 4072
a 1941 4072
a 1942 4072
a 1943 4072
a 1944 4072
a 1945 4072
a 1946 4072
a 1947 4072
f 1943
f 1942
f 1941
f 1940
f 1939
f 1938
f 1937
f 1936
f 1935
f 1934
f 1933
f 1932
f 1931
f 1930
f 1921
f 1910
f 1893
f 1880
f 1864
f 1863
f 1860
f 1838
f 1825
f 1804
f 1803
f 1802
f 1787
f 1777
f 1773
f 1765
f 1929
f 1928
f 1927
f 1923
f 1922
f 1920
f 1919
f 1918
f 1916
f 1915
f 1914
f 1913
f 1912
f 1909
f 1908
f 1907
f 1906
f 1905
f 1901
f 1898
f 1889
f 1888
f 1885
f 1884
f 1883
f 1881
f 1879
f 1878
f 1876
f 1873
f 1872
f 1870
f 1869
f 1867
f 1865
f 1862
f 1857
f 1856
f 1855
f 1850
f 1849
f 1847
f 1846
f 1845
f 1841
f 1839
f 1836
f 1835
f 1834
f 1833
f 1831
f 1830
f 1829
f 1828
f 1822
f 1821
f 1818
f 1817
f 1816
f 1814
f 1811
f 1810
f 1808
f 1806
f 1800
f 1799
f 1796
f 1794
f 1792
f 1789
f 1786
f 1784
f 1783
f 1782
f 1780
f 1779
f 1778
f 1776
f 1775
f 1772
f 1771
f 1770
f 1768
f 1767
f 1766
f 1764
f 1757
a 1948 4072
a 1949 72
a 1950 160
f 1949
a 1951 4072
a 1952 4072
a 1953 4072
a 1954 4072
a 1955 4072
a 1956 4072
a 1957 4072
a 1958 4072
a 1959 4072
a 1960 4072
f 1960
f 1956
f 1959
f 1958
f 1957
f 1955
f 1953
f 1952
f 1951
a 1961 4072
a 1962 4072
a 1963 72
a 1964 160
f 1963
a 1965 72
a 1966 160
f 1965
a 1967 4072
a 1968 72
a 1969 160
f 1968
a 1970 4072
a 1971 4072
a 1972 4072
a 1973 4072
a 1974 4072
a 1975 4072
a 1976 4072
f 1975
f 1973
f 1962
f 1974
f 1972
f 1971
f 1970
f 1967
f 1961
a 1977 4072
a 1978 4072
a 1979 4072
a 1980 4072
f 1980
f 1979
a 1981 4072
a 1982 4072
a 1983 4072
a 1984 72
a 1985 160
f 1984
a 1986 4072
a 1987 4072
a 1988 4072
a 1989 4072
a 1990 4072
a 1991 4072
a 1992 72
a 1993 160
f 1992
a 1994 4072
a 1995 4072
a 1996 4072
a 1997 4072
a 1998 4072
a 1999 4072
a 2000 4072
a 2001 4072
a 2002 4072
a 2003 4072
a 2004 4072
a 2005 4072
a 2006 4072
a 2007 4072
a 2008 4072
a 2009 4072
a 2010 4072
a 2011 72
a 2012 160
f 2011
a 2013 4072
a 2014 72
a 2015 160
f 2014
a 2016 72
a 2017 160
f 2016
a 2018 4072
a 2019 4072
a 2020 4072
a 2021 4072
a 2022 4072
f 2021
a 2023 4072
f 2023
a 2024 4072
a 2025 4072
a 2026 4072
f 2024
a 2027 4072
a 2028 72
a 2029 160
f 2028
a 2030 4072
a 2031 72
a 2032 160
f 2031
a 2033 4072
a 2034 4072
a 2035 4072
a 2036 5476
f 2027
a 2037 4072
a 2038 4072
a 2039 4072
a 2040 4072
a 2041 4072
f 2039
a 2042 4072
a 2043 4072
a 2044 4072
a 2045 4072
a 2046 4072
a 2047 4072
a 2048 4072
a 2049 4072
a 2050 4072
f 2048
f 2047
f 2046
f 2045
f 2044
f 2043
f 2042
f 2038
f 2036
f 2034
f 2019
f 2006
f 2000
f 1996
f 1987
f 2041
f 2040
f 2037
f 2035
f 2033
f 2030
f 2026
f 2025
f 2022
f 2020
f 2018
f 2013
f 2010
f 2009
f 2008
f 2007
f 2005
f 2004
f 2003
f 2002
f 2001
f 1999
f 1998
f 1997
f 1995
f 1994
f 1991
f 1990
f 1989
f 1988
f 1986
f 1983
a 2051 4072
a 2052 4072
a 2053 4072
a 2054 72
a 2055 160
f 2054
a 2056 4072
a 2057 4072
a 2058 72
a 2059 160
f 2058
a 2060 4072
a 2061 72
a 2062 160
a 2063 4072
f 2061
a 2064 72
a 2065 160
f 2064
a 2066 4072
a 2067 4072
a 2068 4072
f 2066
a 2069 4072
a 2070 4072
a 2071 4072
a 2072 4072
f 2071
a 2073 4072
a 2074 4072
a 2075 4072
a 2076 4072
a 2077 4072
a 2078 4072
a 2079 4072
a 2080 4072
a 2081 4072
a 2082 4072
a 2083 4072
a 2084 4072
f 2083
f 2082
f 2081
f 2079
f 2074
f 2070
f 2056
f 2080
f 2078
f 2077
f 2076
f 2075
f 2073
f 2072
f 2069
f 2068
f 2067
f 2063
f 2060
f 2057
f 2053
a 2085 4072
a 2086 4072
a 2087 4072
a 2088 72
a 2089 160
f 2088
a 2090 72
a 2091 160
f 2090
a 2092 72
a 2093 160
f 2092
a 2094 72
a 2095 160
f 2094
a 2096 4072
a 2097 72
a 2098 160
f 2097
a 2099 4072
a 2100 72
a 2101 160
f 2100
a 2102 72
a 2103 160
f 2102
a 2104 72
a 2105 160
f 2104
a 2106 72
a 2107 160
f 2106
a 2108 72
a 2109 160
f 2108
a 2110 72
a 2111 160
f 2110
a 2112 72
a 2113 160
f 2112
a 2114 72
a 2115 160
f 2114
a 2116 4072
a 2117 72
a 2118 160
f 2117
a 2119 72
a 2120 160
f 2119
a 2121 72
a 2122 160
f 2121
a 2123 72
a 2124 160
f 2123
a 2125 72
a 2126 160
f 2125
a 2127 72
a 2128 160
f 2127
a 2129 72
a 2130 160
f 2129
a 2131 4072
a 2132 4072
a 2133 4072
a 2134 72
a 2135 160
f 2134
a 2136 72
a 2137 160
f 2136
a 2138 4072
a 2139 4072
a 2140 4072
a 2141 4072
a 2142 4072
a 2143 4072
a 2144 4072
f 2142
a 2145 4072
a 2146 4072
a 2147 4072
a 2148 4072
a 2149 4072
a 2150 4072
a 2151 4072
a 2152 4072
a 2153 4072
a 2154 4072
f 2145
f 2140
a 2155 72
a 2156 160
f 2155
a 2157 4072
a 2158 72
a 2159 160
f 2158
a 2160 4072
a 2161 4072
a 2162 4072
a 2163 72
a 2164 160
f 2163
a 2165 72
a 2166 160
f 2165
a 2167 4072
a 2168 4072
a 2169 4072
a 2170 4072
a 2171 4072
a 2172 4072
a 2173 4072
a 2174 4072
a 2175 4072
a 2176 4072
a 2177 72
a 2178 160
f 2177
a 2179 4072
a 2180 4072
a 2181 4072
a 2182 4072
a 2183 5476
a 2184 4072
a 2185 4072
a 2186 4072
a 2187 4072
a 2188 4072
a 2189 4072
f 2188
a 2190 4072
a 2191 4072
a 2192 4072
a 2193 4072
a 2194 4072
a 2195 72
a 2196 160
f 2195
a 2197 4072
a 2198 4072
a 2199 4072
a 2200 4072
a 2201 4072
a 2202 4072
a 2203 4072
f 2202
a 2204 4072
f 2204
a 2205 4072
a 2206 4072
a 2207 4072
a 2208 4072
a 2209 4072
f 2205
a 2210 4072
a 2211 72
a 2212 160
f 2211
a 2213 4072
a 2214 4072
a 2215 4072
a 2216 4072
a 2217 4072
a 2218 4072
a 2219 4072
a 2220 4072
a 2221 4072
a 2222 4072
f 2220
a 2223 4072
a 2224 4072
a 2225 72
a 2226 160
f 2225
a 2227 4072
a 2228 4072
a 2229 4072
a 2230 4072
a 2231 4072
a 2232 4072
a 2233 10852
a 2234 4072
a 2235 4072
a 2236 4072
a 2237 4072
a 2238 4072
a 2239 4072
a 2240 4072
a 2241 4072
a 2242 4072
a 2243 4072
f 2238
a 2244 4072
a 2245 4072
a 2246 4072
a 2247 4072
a 2248 4072
a 2249 4072
a 2250 4072
a 2251 4072
a 2252 4072
a 2253 4072
a 2254 4072
a 2255 4072
a 2256 4072
a 2257 4072
a 2258 4072
a 2259 72
a 2260 160
f 2259
a 2261 4072
a 2262 4072
a 2263 4072
a 2264 72
a 2265 160
f 2264
a 2266 72
a 2267 160
a 2268 4072
f 2266
a 2269 4072
a 2270 4072
a 2271 4072
a 2272 4072
a 2273 4072
a 2274 4072
a 2275 4072
a 2276 4072
a 2277 4072
a 2278 4072
a 2279 4072
f 2279
a 2280 72
a 2281 160
f 2280
a 2282 4072
a 2283 4072
a 2284 72
a 2285 160
f 2284
a 2286 4072
a 2287 72
a 2288 160
f 2287
a 2289 4072
a 2290 4072
a 2291 4072
f 2290
a 2292 72
a 2293 160
f 2292
a 2294 4072
a 2295 4072
f 2294
a 2296 4072
a 2297 4072
a 2298 4072
a 2299 4072
a 2300 4072
a 2301 4072
f 2300
f 2296
a 2302 4072
a 2303 4072
f 2302
a 2304 4072
a 2305 4072
a 2306 4072
a 2307 4072
a 2308 4072
f 2304
a 2309 4072
a 2310 4072
a 2311 4072
a 2312 4072
f 2312
a 2313 4072
a 2314 4072
a 2315 4072
a 2316 4072
f 2313
a 2317 4072
f 2317
a 2318 4072
a 2319 4072
f 2319
a 2320 4072
a 2321 4072
a 2322 4072
a 2323 4072
f 2320
a 2324 4072
f 2324
a 2325 4072
a 2326 4072
a 2327 4072
f 2327
a 2328 4072
a 2329 4072
a 2330 4072
a 2331 4072
f 2328
a 2332 4072
f 2332
a 2333 4072
a 2334 4072
a 2335 4072
f 2333
a 2336 4072
f 2336
a 2337 4072
a 2338 4072
f 2338
a 2339 4072
f 2339
a 2340 4072
a 2341 4072
f 2340
a 2342 4072
a 2343 4072
a 2344 21604
a 2345 4072
f 2342
a 2346 4072
a 2347 72
a 2348 160
f 2347
a 2349 72
a 2350 160
f 2349
a 2351 4072
a 2352 4072
f 2352
a 2353 4072
f 2353
a 2354 4072
a 2355 4072
f 2354
a 2356 4072
a 2357 4072
a 2358 4072
a 2359 4072
f 2357
a 2360 4072
a 2361 72
a 2362 160
f 2361
a 2363 4072
a 2364 72
a 2365 160
f 2364
a 2366 4072
a 2367 4072
a 2368 4072
f 2360
a 2369 4072
a 2370 4072
a 2371 4072
f 2369
a 2372 4072
f 2372
a 2373 4072
a 2374 4072
a 2375 4072
a 2376 4072
f 2373
a 2377 4072
a 2378 72
a 2379 160
f 2378
a 2380 4072
a 2381 4072
a 2382 4072
a 2383 4072
a 2384 4072
f 2380
a 2385 4072
f 2385
a 2386 4072
a 2387 4072
f 2387
a 2388 72
a 2389 160
f 2388
a 2390 4072
a 2391 4072
f 2390
a 2392 4072
a 2393 4072
f 2392
a 2394 4072
f 2394
a 2395 4072
a 2396 4072
a 2397 4072
a 2398 4072
a 2399 4072
a 2400 4072
a 2401 4072
a 2402 4072
a 2403 4072
a 2404 4072
a 2405 4072
a 2406 4072
a 2407 4072
f 2407
a 2408 4072
a 2409 4072
f 2408
a 2410 4072
f 2410
a 2411 4072
a 2412 4072
f 2411
a 2413 4072
a 2414 4072
a 2415 4072
a 2416 4072
a 2417 4072
a 2418 4072
a 2419 4072
a 2420 4072
a 2421 4072
a 2422 4072
a 2423 4072
f 2396
a 2424 4072
a 2425 4072
a 2426 4072
a 2427 4072
f 2425
a 2428 4072
f 2428
a 2429 4072
a 2430 4072
f 2430
a 2431 4072
a 2432 4072
f 2432
a 2433 4072
a 2434 4072
a 2435 4072
a 2436 4072
a 2437 4072
f 2436
a 2438 4072
a 2439 4072
a 2440 4072
a 2441 4072
a 2442 4072
f 2440
a 2443 4072
a 2444 4072
a 2445 4072
a 2446 4072
a 2447 4072
a 2448 4072
a 2449 4072
a 2450 4072
f 2449
a 2451 72
a 2452 160
f 2451
a 2453 4072
a 2454 4072
f 2454
a 2455 4072
a 2456 4072
a 2457 4072
a 2458 4072
f 2456
a 2459 4072
a 2460 72
a 2461 160
f 2460
a 2462 4072
a 2463 4072
f 2462
a 2464 4072
f 2464
a 2465 4072
a 2466 4072
f 2465
a 2467 4072
f 2467
a 2468 4072
f 2468
a 2469 4072
a 2470 4072
f 2469
a 2471 4072
a 2472 4072
a 2473 4072
f 2471
a 2474 4072
a 2475 4072
f 2474
a 2476 4072
a 2477 4072
a 2478 4072
f 2476
a 2479 4072
f 2479
a 2480 4072
a 2481 4072
f 2480
a 2482 4072
a 2483 4072
a 2484 4072
a 2485 4072
a 2486 4072
f 2482
a 2487 4072
a 2488 4072
a 2489 4072
a 2490 72
a 2491 160
f 2490
a 2492 4072
a 2493 4072
a 2494 4072
a 2495 4072
a 2496 4072
a 2497 4072
a 2498 4072
a 2499 4072
a 2500 4072
a 2501 4072
a 2502 4072
a 2503 4072
a 2504 4072
a 2505 4072
f 2504
a 2506 4072
a 2507 4072
a 2508 4072
a 2509 4072
a 2510 4072
a 2511 4072
a 2512 4072
a 2513 4072
a 2514 4072
a 2515 4072
a 2516 4072
a 2517 4072
a 2518 4072
a 2519 4072
f 2506
a 2520 4072
a 2521 72
a 2522 160
f 2521
a 2523 72
a 2524 160
f 2523
a 2525 4072
a 2526 4072
a 2527 4072
a 2528 4072
a 2529 4072
a 2530 4072
a 2531 4072
a 2532 4072
a 2533 4072
a 2534 4072
f 2531
f 2529
a 2535 4072
a 2536 4072
a 2537 4072
a 2538 4072
a 2539 72
a 2540 160
f 2539
a 2541 4072
a 2542 4072
a 2543 4072
f 2543
a 2544 4072
a 2545 4072
a 2546 4072
f 2544
a 2547 72
a 2548 160
f 2547
a 2549 4072
a 2550 4072
a 2551 4072
a 2552 4072
a 2553 4072
a 2554 4072
a 2555 4072
a 2556 4072
a 2557 4072
a 2558 4072
a 2559 4072
a 2560 4072
f 2488
a 2561 4072
a 2562 4072
f 2561
a 2563 4072
a 2564 4072
a 2565 4072
a 2566 5316
a 2567 10532
a 2568 5316
a 2569 5316
a 2570 4072
a 2571 10532
a 2572 10532
a 2573 10532
a 2574 4072
a 2575 4072
a 2576 4072
a 2577 4072
a 2578 4072
a 2579 4072
a 2580 4072
a 2581 4072
a 2582 4072
a 2583 4072
a 2584 4072
a 2585 4072
a 2586 4072
a 2587 4072
a 2588 4072
a 2589 4072
a 2590 4072
a 2591 4072
a 2592 4072
a 2593 4072
a 2594 4072
a 2595 4072
a 2596 4072
a 2597 4072
a 2598 4072
a 2599 4072
a 2600 4072
a 2601 4072
a 2602 4072
a 2603 4072
a 2604 4072
a 2605 4072
a 2606 4072
a 2607 4072
a 2608 4072
a 2609 4072
a 2610 4072
a 2611 4072
f 2596
f 2595
f 2594
f 2593
f 2592
f 2591
f 2590
f 2589
f 2588
f 2587
f 2586
f 2585
f 2584
f 2583
f 2582
f 2581
f 2580
f 2579
f 2578
f 2577
f 2576
f 2575
f 2574
f 2573
f 2572
f 2571
f 2570
f 2569
f 2568
f 2567
f 2566
f 2565
f 2564
f 2563
f 2554
f 2536
f 2525
f 2512
f 2501
f 2493
f 2478
f 2458
f 2444
f 2433
f 2423
f 2416
f 2405
f 2398
f 2382
f 2367
f 2346
f 2344
f 2343
f 2329
f 2310
f 2299
f 2283
f 2271
f 2257
f 2246
f 2234
f 2233
f 2229
f 2218
f 2206
f 2194
f 2184
f 2183
f 2180
f 2171
f 2160
f 2150
f 2148
f 2139
f 2096
f 2562
f 2560
f 2559
f 2558
f 2557
f 2556
f 2555
f 2553
f 2552
f 2550
f 2549
f 2546
f 2545
f 2542
f 2541
f 2538
f 2537
f 2535
f 2534
f 2533
f 2532
f 2530
f 2528
f 2527
f 2526
f 2520
f 2519
f 2518
f 2517
f 2516
f 2515
f 2514
f 2513
f 2511
f 2510
f 2509
f 2508
f 2507
f 2505
f 2503
f 2502
f 2500
f 2499
f 2498
f 2497
f 2496
f 2495
f 2494
f 2492
f 2489
f 2487
f 2486
f 2485
f 2484
f 2483
f 2481
f 2477
f 2475
f 2473
f 2472
f 2470
f 2466
f 2463
f 2459
f 2457
f 2455
f 2453
f 2450
f 2448
f 2447
f 2446
f 2445
f 2443
f 2442
f 2441
f 2439
f 2438
f 2437
f 2434
f 2431
f 2429
f 2427
f 2426
f 2424
f 2422
f 2421
f 2420
f 2419
f 2418
f 2417
f 2415
f 2414
f 2413
f 2412
f 2409
f 2406
f 2404
f 2403
f 2402
f 2401
f 2400
f 2399
f 2397
f 2395
f 2393
f 2391
f 2386
f 2384
f 2383
f 2381
f 2377
f 2376
f 2375
f 2374
f 2371
f 2370
f 2368
f 2366
f 2363
f 2359
f 2358
f 2356
f 2355
f 2351
f 2345
f 2341
f 2337
f 2335
f 2334
f 2331
f 2330
f 2326
f 2323
f 2322
f 2321
f 2318
f 2316
f 2315
f 2314
f 2311
f 2309
f 2308
f 2307
f 2306
f 2305
f 2303
f 2301
f 2298
f 2297
f 2295
f 2291
f 2289
f 2286
f 2282
f 2278
f 2277
f 2276
f 2275
f 2274
f 2273
f 2272
f 2270
f 2269
f 2268
f 2263
f 2262
f 2261
f 2258
f 2256
f 2255
f 2254
f 2253
f 2251
f 2250
f 2249
f 2248
f 2247
f 2245
f 2244
f 2243
f 2242
f 2241
f 2240
f 2239
f 2237
f 2236
f 2235
f 2232
f 2231
f 2230
f 2228
f 2227
f 2224
f 2223
f 2222
f 2221
f 2219
f 2217
f 2216
f 2215
f 2214
f 2213
f 2210
f 2209
f 2208
f 2207
f 2203
f 2201
f 2199
f 2198
f 2197
f 2193
f 2192
f 2191
f 2190
f 2189
f 2187
f 2186
f 2185
f 2182
f 2181
f 2179
f 2176
f 2175
f 2174
f 2173
f 2172
f 2170
f 2169
f 2168
f 2167
f 2162
f 2161
f 2157
f 2154
f 2153
f 2152
f 2151
f 2149
f 2147
f 2146
f 2144
f 2143
f 2141
f 2138
f 2132
f 2131
f 2116
f 2099
f 2087
a 2612 4072
a 2613 4072
a 2614 4072
a 2615 4072
f 2615
f 2614
f 2613
a 2616 4072
a 2617 4072
a 2618 4072
a 2619 4072
a 2620 4072
a 2621 4072
f 2621
f 2617
f 2620
f 2619
f 2618
a 2622 4072
a 2623 4072
a 2624 72
a 2625 160
f 2624
a 2626 4072
a 2627 4072
a 2628 4072
f 2628
f 2627
f 2626
a 2629 4072
a 2630 4072
a 2631 72
a 2632 160
f 2631
a 2633 72
a 2634 160
f 2633
a 2635 4072
a 2636 4072
a 2637 72
a 2638 160
f 2637
a 2639 72
a 2640 160
f 2639
a 2641 72
a 2642 160
f 2641
a 2643 72
a 2644 160
f 2643
a 2645 72
a 2646 160
f 2645
a 2647 4072
a 2648 72
a 2649 160
f 2648
a 2650 72
a 2651 160
a 2652 4072
f 2650
a 2653 72
a 2654 160
f 2653
a 2655 4072
a 2656 4072
a 2657 4072
a 2658 4072
a 2659 4072
a 2660 4072
f 2659
a 2661 4072
a 2662 4072
a 2663 4072
a 2664 4072
a 2665 4072
f 2661
a 2666 4072
a 2667 4072
a 2668 4072
a 2669 4072
a 2670 4072
a 2671 4072
a 2672 4072
a 2673 4072
a 2674 4072
f 2672
a 2675 4072
a 2676 4072
a 2677 4072
a 2678 4072
a 2679 4072
a 2680 4072
a 2681 4072
a 2682 4072
a 2683 4072
a 2684 4072
f 2683
f 2682
f 2681
f 2680
f 2670
f 2667
f 2663
f 2652
f 2679
f 2678
f 2677
f 2676
f 2674
f 2673
f 2671
f 2669
f 2668
f 2666
f 2665
f 2664
f 2662
f 2660
f 2658
f 2657
f 2656
f 2655
f 2647
f 2636
f 2635
a 2685 4072
a 2686 72
a 2687 160
f 2686
a 2688 4072
a 2689 72
a 2690 160
f 2689
a 2691 4072
a 2692 4072
a 2693 4072
a 2694 4072
a 2695 4072
a 2696 4072
a 2697 4072
a 2698 4072
a 2699 4072
a 2700 4072
a 2701 4072
f 2693
a 2702 4072
a 2703 4072
a 2704 4072
f 2703
f 2702
f 2699
f 2697
f 2685
f 2701
f 2700
f 2698
f 2696
f 2695
f 2694
f 2692
f 2691
f 2688
a 2705 4072
a 2706 4072
a 2707 72
a 2708 160
f 2707
a 2709 4072
a 2710 4072
a 2711 4072
a 2712 4072
a 2713 4072
a 2714 4072
a 2715 4072
a 2716 4072
a 2717 4072
a 2718 4072
a 2719 4072
a 2720 4072
f 2720
a 2721 4072
a 2722 4072
f 2721
f 2718
f 2710
f 2719
f 2717
f 2716
f 2715
f 2714
f 2713
f 2712
f 2711
f 2709
f 2706
a 2723 72
a 2724 160
f 2723
a 2725 4072
a 2726 4072
a 2727 4072
a 2728 4072
a 2729 4072
a 2730 4072
a 2731 4072
a 2732 4072
a 2733 4072
f 2733
f 2730
f 2732
f 2731
f 2729
f 2728
f 2727
a 2734 4072
a 2735 4072
a 2736 72
a 2737 160
f 2736
a 2738 4072
a 2739 72
a 2740 160
f 2739
a 2741 4072
a 2742 4072
a 2743 4072
a 2744 4072
a 2745 4072
a 2746 4072
a 2747 4072
a 2748 4072
a 2749 4072
a 2750 4072
a 2751 4072
a 2752 4072
a 2753 72
a 2754 160
f 2753
a 2755 4072
a 2756 4072
a 2757 4072
a 2758 4072
a 2759 4072
a 2760 4072
a 2761 4072
a 2762 4072
a 2763 72
a 2764 160
f 2763
a 2765 72
a 2766 160
f 2765
a 2767 4072
a 2768 4072
a 2769 4072
a 2770 4072
a 2771 4072
a 2772 4072
a 2773 72
a 2774 160
f 2773
a 2775 4072
a 2776 72
a 2777 160
f 2776
a 2778 4072
a 2779 72
a 2780 160
f 2779
a 2781 4072
a 2782 72
a 2783 160
f 2782
a 2784 4072
a 2785 4072
a 2786 5476
a 2787 4072
a 2788 4072
a 2789 4072
a 2790 4072
a 2791 4072
a 2792 4072
f 2791
a 2793 4072
a 2794 4072
a 2795 4072
a 2796 4072
a 2797 4072
a 2798 4072
a 2799 4072
a 2800 4072
a 2801 4072
a 2802 4072
a 2803 4072
a 2804 4072
a 2805 4072
a 2806 4072
a 2807 4072
a 2808 4072
a 2809 4072
a 2810 4072
a 2811 4072
a 2812 4072
a 2813 4072
a 2814 4072
f 2812
f 2811
f 2810
f 2809
f 2808
f 2807
f 2806
f 2805
f 2797
f 2787
f 2786
f 2785
f 2770
f 2756
f 2752
f 2745
f 2735
f 2804
f 2803
f 2802
f 2801
f 2800
f 2799
f 2798
f 2796
f 2795
f 2794
f 2793
f 2792
f 2790
f 2789
f 2788
f 2784
f 2781
f 2778
f 2775
f 2772
f 2771
f 2768
f 2767
f 2762
f 2761
f 2760
f 2759
f 2758
f 2757
f 2755
f 2751
f 2750
f 2749
f 2748
f 2747
f 2746
f 2744
f 2743
f 2742
f 2741
f 2738
a 2815 4072
a 2816 72
a 2817 160
f 2816
a 2818 72
a 2819 160
a 2820 4072
f 2818
a 2821 4072
a 2822 4072
a 2823 4072
a 2824 4072
a 2825 4072
f 2825
f 2822
f 2824
f 2823
f 2821
f 2820
a 2826 4072
a 2827 4072
a 2828 4072
a 2829 72
a 2830 160
f 2829
a 2831 72
a 2832 160
f 2831
a 2833 72
a 2834 160
f 2833
a 2835 4072
a 2836 4072
a 2837 4072
a 2838 4072
a 2839 4072
a 2840 4072
a 2841 4072
f 2841
f 2838
f 2840
f 2839
f 2837
f 2836
f 2835
f 2828
a 2842 4072
a 2843 4072
a 2844 4072
a 2845 72
a 2846 160
f 2845
a 2847 4072
a 2848 4072
a 2849 4072
a 2850 4072
a 2851 4072
f 2851
a 2852 4072
a 2853 4072
a 2854 4072
a 2855 4072
a 2856 4072
a 2857 4072
a 2858 4072
a 2859 4072
a 2860 4072
a 2861 4072
a 2862 4072
f 2862
f 2861
f 2860
f 2857
f 2853
f 2843
f 2859
f 2858
f 2856
f 2855
f 2854
f 2852
f 2850
f 2849
f 2848
f 2847
a 2863 4072
a 2864 72
a 2865 160
f 2864
a 2866 72
a 2867 160
f 2866
a 2868 4072
a 2869 4072
a 2870 4072
a 2871 4072
a 2872 72
a 2873 160
f 2872
a 2874 4072
a 2875 4072
a 2876 4072
f 2875
f 2870
f 2874
f 2871
f 2869
f 2868
a 2877 4072
a 2878 4072
a 2879 72
a 2880 160
f 2879
a 2881 72
a 2882 160
f 2881
a 2883 4072
a 2884 4072
a 2885 4072
a 2886 4072
a 2887 4072
a 2888 4072
a 2889 4072
a 2890 4072
a 2891 4072
f 2891
a 2892 4072
a 2893 4072
a 2894 4072
a 2895 4072
a 2896 4072
a 2897 4072
a 2898 4072
a 2899 4072
a 2900 4072
a 2901 4072
a 2902 4072
a 2903 4072
a 2904 4072
a 2905 4072
a 2906 4072
a 2907 4072
a 2908 4072
a 2909 4072
a 2910 4072
a 2911 4072
a 2912 4072
a 2913 5476
a 2914 4072
a 2915 4072
a 2916 4072
a 2917 4072
a 2918 4072
a 2919 4072
a 2920 4072
a 2921 4072
f 2921
a 2922 4072
f 2922
a 2923 4072
a 2924 4072
f 2923
a 2925 4072
f 2925
a 2926 4072
a 2927 4072
f 2926
a 2928 4072
a 2929 4072
a 2930 4072
a 2931 4072
a 2932 4072
a 2933 4072
a 2934 4072
a 2935 4072
a 2936 4072
a 2937 4072
a 2938 72
a 2939 160
f 2938
a 2940 4072
a 2941 4072
a 2942 4072
a 2943 4072
a 2944 4072
a 2945 4072
a 2946 4072
a 2947 4072
f 2947
a 2948 4072
a 2949 4072
a 2950 10852
a 2951 4072
a 2952 4072
a 2953 4072
a 2954 4072
a 2955 4072
a 2956 4072
a 2957 4072
a 2958 4072
a 2959 4072
a 2960 4072
a 2961 4072
a 2962 4072
a 2963 4072
a 2964 4072
a 2965 4072
a 2966 4072
f 2964
f 2963
f 2962
f 2961
f 2960
f 2959
f 2958
f 2957
f 2956
f 2955
f 2951
f 2950
f 2949
f 2936
f 2928
f 2914
f 2913
f 2911
f 2904
f 2896
f 2892
f 2886
f 2954
f 2953
f 2952
f 2948
f 2946
f 2945
f 2944
f 2943
f 2942
f 2941
f 2940
f 2937
f 2935
f 2934
f 2933
f 2932
f 2931
f 2930
f 2929
f 2927
f 2924
f 2920
f 2919
f 2918
f 2917
f 2916
f 2915
f 2912
f 2910
f 2909
f 2908
f 2907
f 2906
f 2905
f 2903
f 2901
f 2900
f 2899
f 2898
f 2897
f 2895
f 2894
f 2893
f 2890
f 2889
f 2888
f 2887
f 2885
f 2884
f 2883
f 2878
a 2967 4072
a 2968 4072
a 2969 72
a 2970 160
f 2969
a 2971 72
a 2972 160
f 2971
a 2973 72
a 2974 160
f 2973
a 2975 4072
a 2976 72
a 2977 160
f 2976
a 2978 72
a 2979 160
f 2978
a 2980 4072
a 2981 4072
a 2982 4072
a 2983 4072
a 2984 72
a 2985 160
f 2984
a 2986 4072
a 2987 4072
a 2988 4072
a 2989 4072
a 2990 4072
a 2991 4072
a 2992 4072
a 2993 4072
a 2994 4072
a 2995 4072
a 2996 4072
a 2997 4072
a 2998 4072
a 2999 4072
a 3000 4072
a 3001 4072
f 3000
f 2999
f 2998
f 2994
f 2987
f 2967
f 2997
f 2996
f 2995
f 2993
f 2992
f 2991
f 2990
f 2989
f 2988
f 2986
f 2983
f 2982
f 2981
f 2980
f 2968
a 3002 4072
a 3003 4072
a 3004 72
a 3005 160
f 3004
a 3006 4072
a 3007 4072
a 3008 4072
a 3009 4072
a 3010 4072
a 3011 4072
a 3012 4072
f 3011
f 3007
f 3010
f 3009
f 3008
f 3006
a 3013 4072
a 3014 72
a 3015 160
f 3014
a 3016 4072
a 3017 72
a 3018 160
f 3017
a 3019 4072
a 3020 72
a 3021 160
f 3020
a 3022 72
a 3023 160
f 3022
a 3024 4072
a 3025 72
a 3026 160
f 3025
a 3027 4072
a 3028 4072
a 3029 72
a 3030 160
f 3029
a 3031 4072
a 3032 4072
a 3033 4072
a 3034 4072
a 3035 4072
a 3036 4072
a 3037 4072
a 3038 4072
f 3037
f 3034
a 3039 4072
a 3040 4072
a 3041 4072
a 3042 4072
a 3043 4072
a 3044 4072
f 3044
f 3043
f 3041
f 3036
f 3028
f 3042
f 3040
f 3039
f 3038
f 3035
f 3033
f 3032
f 3031
f 3027
f 3024
f 3019
f 3016
a 3045 4072
a 3046 4072
a 3047 72
a 3048 160
f 3047
a 3049 4072
a 3050 72
a 3051 160
f 3050
a 3052 72
a 3053 160
f 3052
a 3054 72
a 3055 160
f 3054
a 3056 4072
a 3057 72
a 3058 160
f 3057
a 3059 4072
a 3060 4072
a 3061 4072
a 3062 72
a 3063 160
f 3062
a 3064 72
a 3065 160
f 3064
a 3066 72
a 3067 160
a 3068 4072
f 3066
a 3069 4072
a 3070 72
a 3071 160
f 3070
a 3072 4072
a 3073 72
a 3074 160
f 3073
a 3075 4072
a 3076 4072
a 3077 4072
a 3078 4072
a 3079 4072
a 3080 4072
a 3081 4072
a 3082 4072
a 3083 4072
a 3084 4072
a 3085 72
a 3086 160
f 3085
a 3087 4072
a 3088 4072
a 3089 4072
a 3090 72
a 3091 160
f 3090
a 3092 4072
a 3093 4072
f 3089
a 3094 4072
a 3095 4072
a 3096 4072
a 3097 4072
a 3098 4072
a 3099 4072
a 3100 4072
a 3101 4072
a 3102 4072
a 3103 72
a 3104 160
f 3103
a 3105 4072
a 3106 4072
a 3107 4072
a 3108 4072
a 3109 5476
a 3110 4072
a 3111 4072
a 3112 4072
a 3113 72
a 3114 160
f 3113
a 3115 4072
a 3116 4072
a 3117 4072
a 3118 4072
a 3119 72
a 3120 160
f 3119
a 3121 4072
a 3122 4072
a 3123 4072
a 3124 4072
a 3125 4072
a 3126 4072
a 3127 4072
a 3128 4072
a 3129 4072
a 3130 4072
a 3131 4072
a 3132 4072
a 3133 4072
a 3134 4072
a 3135 4072
a 3136 4072
a 3137 4072
a 3138 4072
a 3139 4072
a 3140 4072
a 3141 4072
a 3142 4072
a 3143 4072
a 3144 4072
a 3145 4072
f 3143
a 3146 4072
a 3147 4072
a 3148 4072
a 3149 4072
a 3150 4072
a 3151 4072
a 3152 4072
a 3153 4072
a 3154 4072
a 3155 4072
a 3156 4072
a 3157 4072
a 3158 4072
a 3159 4072
f 3159
a 3160 4072
a 3161 72
a 3162 160
f 3161
a 3163 72
a 3164 160
f 3163
a 3165 4072
a 3166 4072
a 3167 10852
a 3168 4072
a 3169 4072
a 3170 4072
a 3171 4072
a 3172 4072
a 3173 4072
a 3174 4072
a 3175 4072
a 3176 4072
a 3177 4072
a 3178 4072
a 3179 4072
a 3180 4072
a 3181 4072
a 3182 4072
a 3183 4072
a 3184 4072
a 3185 4072
a 3186 4072
a 3187 4072
a 3188 4072
f 3185
f 3184
f 3183
f 3182
f 3181
f 3180
f 3179
f 3178
f 3177
f 3176
f 3168
f 3167
f 3166
f 3153
f 3144
f 3136
f 3128
f 3122
f 3110
f 3109
f 3102
f 3095
f 3082
f 3079
f 3068
f 3046
f 3175
f 3174
f 3173
f 3172
f 3171
f 3170
f 3169
f 3165
f 3160
f 3158
f 3157
f 3156
f 3155
f 3152
f 3151
f 3150
f 3149
f 3148
f 3147
f 3146
f 3145
f 3142
f 3141
f 3140
f 3139
f 3138
f 3137
f 3135
f 3134
f 3133
f 3132
f 3131
f 3129
f 3127
f 3126
f 3125
f 3124
f 3123
f 3121
f 3118
f 3117
f 3116
f 3115
f 3112
f 3111
f 3108
f 3107
f 3106
f 3105
f 3101
f 3100
f 3099
f 3098
f 3097
f 3096
f 3094
f 3093
f 3092
f 3088
f 3087
f 3084
f 3083
f 3081
f 3080
f 3078
f 3077
f 3076
f 3075
f 3072
f 3069
f 3061
f 3060
f 3059
f 3056
f 3049
a 3189 4072
a 3190 4072
a 3191 72
a 3192 160
f 3191
a 3193 4072
a 3194 4072
a 3195 4072
a 3196 4072
a 3197 4072
f 3197
a 3198 4072
a 3199 4072
a 3200 4072
a 3201 4072
a 3202 4072
a 3203 4072
a 3204 4072
a 3205 4072
f 3204
f 3203
f 3194
f 3202
f 3201
f 3200
f 3199
f 3198
f 3196
f 3195
f 3193
f 3190
a 3206 4072
a 3207 4072
a 3208 72
a 3209 160
f 3208
a 3210 72
a 3211 160
f 3210
a 3212 4072
a 3213 4072
a 3214 4072
a 3215 4072
a 3216 4072
a 3217 4072
a 3218 4072
a 3219 4072
a 3220 4072
f 3220
f 3214
f 3219
f 3218
f 3217
f 3216
f 3215
f 3213
f 3212
a 3221 4072
a 3222 4072
a 3223 4072
a 3224 4072
a 3225 4072
a 3226 4072
f 3225
a 3227 72
a 3228 160
f 3227
a 3229 4072
a 3230 4072
f 3229
a 3231 4072
a 3232 4072
a 3233 4072
a 3234 4072
f 3233
a 3235 4072
a 3236 4072
f 3235
a 3237 4072
a 3238 4072
f 3238
f 3234
f 3222
f 3237
f 3236
f 3232
f 3231
f 3230
f 3226
f 3224
f 3223
a 3239 4072
a 3240 4072
a 3241 72
a 3242 160
f 3241
a 3243 4072
a 3244 72
a 3245 160
f 3244
a 3246 72
a 3247 160
f 3246
a 3248 72
a 3249 160
f 3248
a 3250 4072
a 3251 4072
a 3252 4072
a 3253 4072
a 3254 4072
a 3255 4072
a 3256 4072
a 3257 4072
a 3258 4072
a 3259 4072
f 3259
f 3258
f 3250
f 3257
f 3256
f 3255
f 3254
f 3253
f 3252
f 3251
f 3243
a 3260 4072
a 3261 4072
a 3262 4072
a 3263 4072
a 3264 72
a 3265 160
f 3264
a 3266 4072
a 3267 4072
a 3268 4072
a 3269 4072
a 3270 4072
a 3271 4072
f 3271
f 3270
f 3269
f 3268
f 3267
f 3266
f 3262
f 3261
a 3272 4072
a 3273 4072
a 3274 4072
a 3275 4072
a 3276 4072
f 3273
f 3276
f 3275
f 3274
a 3277 4072
a 3278 4072
a 3279 4072
a 3280 72
a 3281 160
a 3282 4072
f 3280
a 3283 72
a 3284 160
f 3283
a 3285 72
a 3286 160
f 3285
a 3287 72
a 3288 160
f 3287
a 3289 4072
a 3290 72
a 3291 160
f 3290
a 3292 4072
a 3293 4072
a 3294 4072
a 3295 4072
f 3295
f 3289
f 3294
f 3292
f 3282
f 3279
a 3296 4072
a 3297 72
a 3298 160
f 3297
a 3299 4072
a 3300 4072
a 3301 4072
a 3302 4072
a 3303 4072
f 3301
f 3303
f 3302
f 3300
f 3299
a 3304 4072
a 3305 4072
a 3306 72
a 3307 160
f 3306
a 3308 72
a 3309 160
f 3308
a 3310 4072
a 3311 72
a 3312 160
f 3311
a 3313 4072
a 3314 4072
a 3315 4072
f 3315
f 3305
f 3314
f 3313
f 3310
a 3316 4072
a 3317 4072
a 3318 72
a 3319 160
f 3318
a 3320 4072
a 3321 4072
a 3322 4072
a 3323 4072
f 3323
f 3321
f 3322
f 3320
f 3317
f 222
f 223
f 0
f 1
f 10
f 100
f 1002
f 1004
f 101
f 1010
f 102
f 1022
f 1026
f 103
f 1033
f 104
f 105
f 1055
f 1056
f 1057
f 1059
f 106
f 1062
f 1065
f 1067
f 107
f 1072
f 1075
f 1077
f 108
f 1080
f 1082
f 1088
f 1089
f 109
f 1090
f 1095
f 1097
f 11
f 110
f 111
f 1117
f 112
f 1125
f 1127
f 113
f 1135
f 1136
f 1138
f 114
f 1146
f 1147
f 115
f 116
f 1166
f 117
f 1175
f 1176
f 1177
f 1179
f 118
f 1185
f 1187
f 119
f 1195
f 1197
f 1199
f 12
f 120
f 1201
f 121
f 1215
f 1216
f 1218
f 122
f 1221
f 1227
f 123
f 1230
f 1231
f 1232
f 1234
f 124
f 1240
f 1247
f 125
f 1250
f 1252
f 1257
f 1259
f 126
f 1260
f 1264
f 1268
f 1269
f 127
f 1271
f 1276
f 1277
f 1279
f 128
f 1282
f 1287
f 1289
f 129
f 1291
f 13
f 130
f 1308
f 131
f 1315
f 1316
f 1319
f 132
f 1322
f 1327
f 1328
f 133
f 1336
f 134
f 1340
f 1345
f 1348
f 1349
f 135
f 1352
f 1354
f 136
f 1368
f 1369
f 137
f 1370
f 1372
f 1375
f 138
f 1380
f 1384
f 139
f 14
f 140
f 141
f 142
f 143
f 144
f 145
f 146
f 147
f 148
f 149
f 15
f 150
f 1509
f 151
f 1514
f 1516
f 152
f 1521
f 1523
f 1527
f 1529
f 153
f 154
f 1546
f 1547
f 1548
f 155
f 1551
f 1553
f 1558
f 156
f 1561
f 1563
f 1565
f 1567
f 157
f 1570
f 1572
f 158
f 1586
f 159
f 1593
f 1597
f 1598
f 16
f 160
f 1602
f 1603
f 1606
f 161
f 1612
f 1618
f 162
f 1623
f 163
f 164
f 165
f 1654
f 1659
f 166
f 167
f 1673
f 1674
f 1675
f 1678
f 168
f 1680
f 1682
f 169
f 1694
f 1697
f 17
f 170
f 171
f 1710
f 172
f 173
f 174
f 175
f 1752
f 1753
f 1754
f 1756
f 1759
f 176
f 1761
f 1763
f 177
f 178
f 1781
f 179
f 1791
f 1798
f 18
f 180
f 181
f 1813
f 182
f 1820
f 1824
f 1827
f 183
f 184
f 1843
f 1844
f 185
f 1852
f 1854
f 186
f 187
f 188
f 189
f 1892
f 1895
f 1897
f 19
f 190
f 1900
f 1902
f 1904
f 191
f 192
f 1925
f 193
f 194
f 1944
f 1945
f 1946
f 1947
f 1948
f 195
f 1950
f 1954
f 196
f 1964
f 1966
f 1969
f 197
f 1976
f 1977
f 1978
f 198
f 1981
f 1982
f 1985
f 199
f 1993
f 2
f 20
f 200
f 201
f 2012
f 2015
f 2017
f 202
f 2029
f 203
f 2032
f 204
f 2049
f 205
f 2050
f 2051
f 2052
f 2055
f 2059
f 206
f 2062
f 2065
f 207
f 2084
f 2085
f 2086
f 2089
f 209
f 2091
f 2093
f 2095
f 2098
f 21
f 210
f 2101
f 2103
f 2105
f 2107
f 2109
f 211
f 2111
f 2113
f 2115
f 2118
f 212
f 2120
f 2122
f 2124
f 2126
f 2128
f 213
f 2130
f 2133
f 2135
f 2137
f 214
f 215
f 2156
f 2159
f 216
f 2164
f 2166
f 217
f 2178
f 218
f 219
f 2196
f 22
f 220
f 2200
f 221
f 2212
f 2226
f 224
f 225
f 2252
f 226
f 2260
f 2265
f 2267
f 227
f 228
f 2281
f 2285
f 2288
f 229
f 2293
f 23
f 230
f 231
f 232
f 2325
f 233
f 234
f 2348
f 235
f 2350
f 236
f 2362
f 2365
f 237
f 2379
f 238
f 2389
f 239
f 24
f 240
f 241
f 242
f 243
f 2435
f 244
f 245
f 2452
f 246
f 2461
f 247
f 248
f 249
f 2491
f 25
f 250
f 251
f 252
f 2522
f 2524
f 253
f 254
f 2540
f 2548
f 255
f 2551
f 256
f 257
f 258
f 259
f 2597
f 2598
f 2599
f 26
f 260
f 2600
f 2601
f 2602
f 2603
f 2604
f 2605
f 2606
f 2607
f 2608
f 2609
f 261
f 2610
f 2611
f 2612
f 2616
f 262
f 2622
f 2623
f 2625
f 2629
f 263
f 2630
f 2632
f 2634
f 2638
f 264
f 2640
f 2642
f 2644
f 2646
f 2649
f 265
f 2651
f 2654
f 266
f 267
f 2675
f 268
f 2684
f 2687
f 269
f 2690
f 27
f 270
f 2704
f 2705
f 2708
f 271
f 272
f 2722
f 2724
f 2725
f 2726
f 273
f 2734
f 2737
f 274
f 2740
f 275
f 2754
f 276
f 2764
f 2766
f 2769
f 277
f 2774
f 2777
f 278
f 2780
f 2783
f 279
f 28
f 280
f 281
f 2813
f 2814
f 2815
f 2817
f 2819
f 282
f 2826
f 2827
f 283
f 2830
f 2832
f 2834
f 284
f 2842
f 2844
f 2846
f 285
f 286
f 2863
f 2865
f 2867
f 287
f 2873
f 2876
f 2877
f 288
f 2880
f 2882
f 289
f 29
f 290
f 2902
f 291
f 292
f 293
f 2939
f 294
f 295
f 296
f 2965
f 2966
f 297
f 2970
f 2972
f 2974
f 2975
f 2977
f 2979
f 298
f 2985
f 299
f 3
f 30
f 300
f 3001
f 3002
f 3003
f 3005
f 301
f 3012
f 3013
f 3015
f 3018
f 302
f 3021
f 3023
f 3026
f 303
f 3030
f 304
f 3045
f 3048
f 305
f 3051
f 3053
f 3055
f 3058
f 306
f 3063
f 3065
f 3067
f 307
f 3071
f 3074
f 308
f 3086
f 309
f 3091
f 31
f 310
f 3104
f 311
f 3114
f 312
f 3120
f 313
f 3130
f 314
f 315
f 3154
f 316
f 3162
f 3164
f 317
f 318
f 3186
f 3187
f 3188
f 3189
f 319
f 3192
f 32
f 320
f 3205
f 3206
f 3207
f 3209
f 321
f 3211
f 322
f 3221
f 3228
f 323
f 3239
f 324
f 3240
f 3242
f 3245
f 3247
f 3249
f 325
f 326
f 3260
f 3263
f 3265
f 327
f 3272
f 3277
f 3278
f 328
f 3281
f 3284
f 3286
f 3288
f 329
f 3291
f 3293
f 3296
f 3298
f 33
f 330
f 3304
f 3307
f 3309
f 331
f 3312
f 3316
f 3319
f 332
f 333
f 334
f 335
f 336
f 337
f 338
f 339
f 34
f 340
f 341
f 342
f 343
f 344
f 345
f 346
f 347
f 348
f 349
f 35
f 350
f 351
f 352
f 353
f 354
f 355
f 356
f 357
f 358
f 359
f 36
f 360
f 361
f 362
f 363
f 364
f 365
f 366
f 367
f 368
f 369
f 37
f 370
f 371
f 372
f 373
f 374
f 375
f 376
f 377
f 378
f 379
f 38
f 380
f 381
f 382
f 383
f 384
f 385
f 386
f 387
f 388
f 389
f 39
f 390
f 391
f 392
f 393
f 394
f 395
f 396
f 397
f 398
f 399
f 4
f 40
f 400
f 401
f 402
f 403
f 404
f 405
f 406
f 407
f 408
f 409
f 41
f 410
f 411
f 412
f 413
f 414
f 415
f 416
f 417
f 418
f 419
f 42
f 420
f 421
f 422
f 423
f 424
f 425
f 426
f 427
f 428
f 429
f 43
f 430
f 431
f 432
f 433
f 434
f 435
f 436
f 437
f 438
f 439
f 44
f 440
f 441
f 442
f 443
f 444
f 445
f 446
f 447
f 449
f 45
f 450
f 451
f 454
f 456
f 458
f 46
f 462
f 463
f 464
f 465
f 47
f 474
f 476
f 477
f 48
f 480
f 481
f 482
f 484
f 487
f 488
f 49
f 490
f 494
f 497
f 498
f 499
f 5
f 50
f 501
f 503
f 505
f 51
f 510
f 513
f 514
f 516
f 518
f 52
f 521
f 524
f 527
f 53
f 530
f 54
f 545
f 547
f 55
f 56
f 565
f 566
f 567
f 57
f 573
f 576
f 578
f 58
f 582
f 583
f 585
f 587
f 59
f 597
f 599
f 6
f 60
f 601
f 602
f 604
f 61
f 62
f 63
f 64
f 640
f 641
f 646
f 647
f 65
f 656
f 657
f 659
f 66
f 662
f 664
f 667
f 669
f 67
f 68
f 681
f 685
f 688
f 69
f 693
f 694
f 695
f 697
f 7
f 70
f 700
f 703
f 706
f 709
f 71
f 719
f 72
f 720
f 721
f 728
f 73
f 74
f 748
f 75
f 750
f 751
f 756
f 76
f 761
f 762
f 765
f 767
f 769
f 77
f 773
f 78
f 783
f 784
f 787
f 789
f 79
f 792
f 8
f 80
f 81
f 812
f 814
f 816
f 82
f 823
f 826
f 829
f 83
f 835
f 84
f 840
f 842
f 848
f 85
f 86
f 864
f 866
f 87
f 870
f 88
f 884
f 89
f 9
f 90
f 908
f 91
f 910
f 917
f 919
f 92
f 93
f 933
f 934
f 935
f 94
f 942
f 943
f 944
f 946
f 948
f 95
f 96
f 965
f 969
f 97
f 98
f 99
39302708
2400
4800
1
a 0 5867
a 1 12410
a 2 8123
a 3 29100
a 4 11116
a 5 18574
a 6 28227
a 7 14108
a 8 23820
a 9 14512
a 10 3578
a 11 28865
a 12 475
a 13 4879
a 14 12188
a 15 7218
a 16 30202
a 17 10474
a 18 2772
a 19 21009
a 20 18251
a 21 5975
a 22 3392
a 23 12337
a 24 10225
a 25 13119
a 26 14317
a 27 3385
a 28 26876
a 29 12728
a 30 11089
a 31 9691
a 32 20364
a 33 20524
a 34 8943
a 35 5989
a 36 14546
a 37 25513
a 38 17398
a 39 21307
a 40 31451
a 41 27039
a 42 23801
a 43 12722
a 44 21058
a 45 19228
a 46 6708
a 47 10798
a 48 29072
a 49 29602
a 50 19694
a 51 11508
a 52 29617
a 53 24290
a 54 23384
a 55 28312
a 56 13635
a 57 28266
a 58 8301
a 59 7116
a 60 27182
a 61 20040
a 62 10753
a 63 12354
a 64 1893
a 65 11164
a 66 4817
a 67 18179
a 68 14822
a 69 624
a 70 31627
a 71 31603
a 72 14634
a 73 12993
a 74 26948
a 75 22358
a 76 11875
a 77 17373
a 78 29216
a 79 9321
a 80 29754
a 81 18185
a 82 32392
a 83 2801
a 84 29252
a 85 28389
a 86 29561
a 87 1818
f 20
f 39
a 88 18861
a 89 23181
a 90 2228
a 91 29678
a 92 14007
a 93 28107
a 94 26060
a 95 3475
a 96 10102
a 97 10605
a 98 26330
a 99 10352
f 75
f 54
a 100 20390
a 101 24435
a 102 14894
a 103 19605
a 104 23269
a 105 18759
f 13
a 106 15372
a 107 31721
a 108 31268
f 36
a 109 26027
a 110 15670
a 111 1831
a 112 436
a 113 12183
a 114 26856
a 115 19533
a 116 18245
a 117 3654
a 118 3163
a 119 28380
a 120 14736
a 121 3009
a 122 5244
a 123 9502
a 124 24109
a 125 9785
a 126 2076
a 127 32718
a 128 187
a 129 20379
a 130 26829
f 116
a 131 30023
a 132 29892
a 133 1601
f 33
a 134 10408
a 135 25684
a 136 4359
a 137 25453
a 138 28459
a 139 21488
a 140 32548
f 98
a 141 3190
a 142 15458
a 143 23982
a 144 2314
a 145 18570
a 146 5072
a 147 21375
f 31
a 148 10843
a 149 32415
a 150 19758
a 151 17389
a 152 30203
a 153 22443
a 154 18477
a 155 10552
a 156 16355
a 157 31973
a 158 13086
a 159 18581
a 160 17259
a 161 22132
a 162 32442
a 163 31473
a 164 2993
a 165 31987
a 166 14519
a 167 17530
a 168 15484
a 169 20884
a 170 21202
a 171 29563
f 148
a 172 20327
a 173 31087
a 174 9888
a 175 31387
a 176 9487
a 177 32543
a 178 6848
a 179 20875
a 180 12769
f 30
a 181 6666
f 18
f 34
a 182 4657
a 183 24251
a 184 32716
a 185 26317
a 186 25033
a 187 31732
a 188 29403
a 189 5222
a 190 25591
a 191 6068
a 192 22710
a 193 11279
a 194 23430
a 195 16711
a 196 30504
a 197 26165
a 198 14560
f 113
a 199 8852
a 200 25210
f 130
a 201 6104
a 202 18857
a 203 18410
a 204 648
a 205 19757
a 206 619
f 102
a 207 11440
a 208 24415
a 209 26183
a 210 2240
a 211 22247
a 212 10426
a 213 2409
a 214 8134
a 215 28672
f 206
a 216 11593
a 217 26213
a 218 2120
a 219 1765
f 120
a 220 10290
a 221 768
a 222 4983
a 223 5686
a 224 24321
a 225 10314
a 226 21995
a 227 5557
f 165
a 228 32066
a 229 23503
a 230 30407
a 231 25639
f 140
f 192
a 232 4959
a 233 18475
a 234 7029
a 235 1575
a 236 3423
a 237 19037
a 238 23990
a 239 12326
a 240 13781
a 241 23270
a 242 31393
a 243 26845
a 244 20116
a 245 21291
a 246 1030
a 247 27447
a 248 575
a 249 6848
a 250 4485
a 251 8704
a 252 18442
a 253 4497
a 254 21841
a 255 19959
a 256 2210
a 257 12604
a 258 9731
a 259 15064
a 260 13564
a 261 16813
a 262 12288
a 263 1887
a 264 1038
a 265 23792
a 266 32318
a 267 19822
a 268 29750
a 269 8420
a 270 9313
a 271 7294
a 272 8850
a 273 14472
a 274 18372
f 216
a 275 23399
a 276 17086
a 277 667
a 278 26330
a 279 32137
a 280 23200
a 281 4634
a 282 7838
a 283 26773
a 284 2299
f 28
a 285 8945
a 286 13774
a 287 11696
a 288 7453
f 23
a 289 4147
a 290 18759
a 291 31906
f 169
f 193
a 292 15941
a 293 20841
a 294 4459
a 295 14399
f 42
a 296 6605
a 297 21520
a 298 5619
a 299 16007
a 300 5999
a 301 397
a 302 21802
a 303 3792
a 304 26224
a 305 24220
a 306 29021
a 307 12181
a 308 22895
a 309 10150
a 310 2185
a 311 20803
a 312 10139
a 313 14322
a 314 20187
a 315 8920
f 82
f 103
a 316 16895
a 317 997
a 318 5634
a 319 27022
a 320 23781
a 321 14125
a 322 19737
a 323 26871
a 324 1168
a 325 7765
a 326 1281
f 252
a 327 21080
a 328 10401
a 329 19092
a 330 10895
a 331 18318
a 332 23220
a 333 14894
a 334 21800
a 335 20640
a 336 22021
a 337 17963
f 118
a 338 6205
a 339 13930
a 340 7062
a 341 28452
a 342 11988
a 343 24001
f 7
a 344 32577
a 345 2275
a 346 18707
a 347 988
a 348 14044
a 349 25474
a 350 18048
a 351 30784
a 352 1939
a 353 14029
a 354 16327
a 355 27858
a 356 19419
a 357 20994
a 358 3629
a 359 3825
a 360 9257
a 361 22723
a 362 21693
a 363 25648
a 364 26276
a 365 6741
a 366 8634
a 367 15148
a 368 26911
f 48
a 369 26642
a 370 14609
a 371 14400
a 372 12580
a 373 5023
a 374 16521
a 375 997
a 376 16027
a 377 9983
a 378 23442
a 379 31766
a 380 7957
a 381 13335
f 47
f 137
a 382 8338
a 383 27784
a 384 17575
a 385 9433
a 386 2063
a 387 5606
f 303
f 106
a 388 18496
a 389 24904
a 390 29858
f 270
a 391 8126
a 392 769
a 393 28337
a 394 24833
a 395 4715
a 396 17665
a 397 24686
f 351
a 398 8450
a 399 5950
a 400 19647
a 401 13245
a 402 28457
a 403 24744
a 404 30173
a 405 26274
a 406 20371
f 246
a 407 14082
a 408 32331
a 409 3754
a 410 29306
a 411 24671
a 412 10070
a 413 13463
a 414 24046
a 415 27467
a 416 11973
a 417 13104
a 418 25382
f 87
a 419 14522
a 420 32767
a 421 31187
a 422 32174
f 331
f 134
f 178
a 423 30225
f 379
a 424 5272
a 425 29027
a 426 10584
a 427 15314
a 428 5979
f 413
a 429 28524
a 430 20691
a 431 14717
a 432 14233
a 433 22108
a 434 32190
a 435 11980
a 436 30883
a 437 12924
a 438 20887
f 61
a 439 29266
a 440 6567
a 441 11245
a 442 9389
a 443 9589
a 444 11613
a 445 25218
a 446 28389
a 447 32294
a 448 16750
a 449 14146
a 450 18747
a 451 15184
a 452 14350
a 453 26664
a 454 29712
a 455 30344
a 456 2450
a 457 22624
a 458 9568
f 199
a 459 21324
a 460 10300
a 461 3317
a 462 5165
f 146
a 463 6974
a 464 16655
a 465 4767
a 466 24504
f 403
a 467 10829
a 468 9539
a 469 13452
a 470 18180
a 471 15077
a 472 2134
f 425
f 422
f 183
f 69
f 410
f 2
a 473 4179
a 474 5934
a 475 28665
a 476 30317
a 477 5197
a 478 3872
a 479 634
a 480 26947
f 212
a 481 25101
a 482 30845
f 0
a 483 17475
a 484 11045
f 40
a 485 13875
f 289
a 486 15947
a 487 22849
a 488 28322
f 191
f 307
a 489 3023
f 266
a 490 28924
a 491 26456
a 492 5850
f 229
a 493 26632
a 494 24366
f 321
a 495 12243
a 496 31405
a 497 26862
a 498 7663
a 499 7335
a 500 22721
a 501 28681
f 496
f 421
a 502 4263
a 503 28177
a 504 19055
a 505 2372
a 506 30474
f 271
a 507 14580
a 508 8248
a 509 31819
a 510 22736
a 511 29952
a 512 30397
f 245
a 513 26770
a 514 26272
a 515 3688
a 516 19271
a 517 16969
f 110
a 518 17277
a 519 30343
f 393
a 520 23017
f 109
a 521 17163
a 522 2426
a 523 26824
a 524 23871
a 525 10280
a 526 391
a 527 13920
a 528 3112
a 529 20515
a 530 11253
a 531 3856
f 233
f 488
a 532 8231
a 533 6475
a 534 13254
a 535 7270
a 536 10005
a 537 22232
f 9
a 538 18872
a 539 18134
a 540 3149
a 541 21527
a 542 5731
a 543 23001
f 15
a 544 13165
a 545 23760
a 546 22756
a 547 8431
a 548 19928
f 198
f 506
a 549 3767
a 550 24247
a 551 16393
a 552 2769
a 553 9153
a 554 310
a 555 26121
a 556 28919
a 557 17666
a 558 20340
a 559 18473
a 560 4573
f 346
a 561 16064
a 562 2902
a 563 19676
a 564 25040
f 443
a 565 22933
a 566 19629
f 176
a 567 12571
f 112
a 568 32145
a 569 17205
a 570 21507
a 571 15094
f 84
a 572 1537
f 194
a 573 28796
a 574 4798
f 327
a 575 290
a 576 22967
a 577 30526
a 578 25237
a 579 11270
a 580 16928
a 581 2503
f 257
a 582 8394
f 73
a 583 9860
a 584 15469
f 550
a 585 24966
a 586 27073
a 587 31455
a 588 15936
a 589 26265
a 590 26923
a 591 25444
a 592 32199
a 593 17581
a 594 30049
a 595 10842
a 596 12600
f 363
a 597 11100
a 598 28619
f 573
a 599 9731
f 500
a 600 26869
a 601 23143
a 602 22380
a 603 29589
a 604 25316
a 605 32224
a 606 10219
a 607 26622
a 608 12049
a 609 4288
a 610 2581
a 611 18935
a 612 29278
a 613 3660
a 614 8354
a 615 11259
a 616 27218
a 617 7667
a 618 13445
a 619 13479
a 620 15794
a 621 3566
a 622 24793
a 623 12937
a 624 15108
a 625 30060
f 217
a 626 19307
a 627 20535
a 628 3396
f 243
a 629 3859
a 630 14656
a 631 1017
a 632 30259
f 613
a 633 695
f 462
a 634 26127
a 635 607
a 636 23973
a 637 9515
f 498
a 638 19539
a 639 30254
a 640 189
f 108
f 225
a 641 3365
a 642 21597
a 643 25802
a 644 20308
f 45
a 645 23723
a 646 6684
a 647 25186
f 370
a 648 18425
a 649 18745
a 650 18923
a 651 11035
a 652 25714
f 261
a 653 17963
f 215
a 654 32528
a 655 20517
a 656 21453
a 657 25302
f 201
a 658 3478
a 659 19297
a 660 18710
a 661 22640
a 662 19190
a 663 28632
f 374
a 664 11454
a 665 13702
a 666 3337
a 667 30571
a 668 27526
a 669 22831
a 670 24176
f 63
a 671 22559
a 672 17163
f 629
a 673 30237
f 136
a 674 30471
f 634
f 562
a 675 105
f 111
a 676 9811
a 677 19552
a 678 6997
f 56
a 679 5842
a 680 10902
f 468
a 681 17213
a 682 5885
f 260
a 683 3470
a 684 11994
a 685 7750
a 686 26049
a 687 18217
a 688 23028
f 487
a 689 26702
a 690 6161
a 691 8547
a 692 24402
f 583
a 693 21562
f 190
a 694 31031
a 695 997
a 696 10662
f 454
f 602
a 697 6309
a 698 5470
f 650
f 57
a 699 16570
a 700 19524
f 26
a 701 3219
a 702 28420
a 703 13691
a 704 4880
a 705 1713
a 706 28877
a 707 10556
a 708 25033
f 230
a 709 30219
a 710 133
f 427
a 711 26939
f 709
a 712 9594
a 713 32052
f 672
f 540
a 714 20880
a 715 25778
a 716 1447
a 717 11058
f 71
a 718 20908
f 618
a 719 4028
f 319
a 720 20963
f 203
a 721 1668
a 722 26340
a 723 10570
a 724 28658
a 725 1678
a 726 26045
a 727 13765
f 344
a 728 3379
a 729 14383
a 730 7003
f 150
a 731 24124
a 732 5258
a 733 4158
f 132
f 698
a 734 18895
a 735 1082
a 736 23272
a 737 26433
a 738 18578
f 702
a 739 18253
f 581
f 89
a 740 5198
a 741 5625
f 627
f 512
f 715
a 742 32337
a 743 4243
a 744 6382
a 745 23478
a 746 13028
f 733
a 747 18646
a 748 15784
f 62
a 749 21120
f 375
a 750 14939
f 438
f 727
a 751 18573
a 752 24597
a 753 4004
a 754 8240
a 755 26888
a 756 10383
a 757 16807
f 367
f 384
a 758 18764
a 759 2283
a 760 31494
a 761 8417
a 762 15485
f 189
a 763 10832
f 520
f 88
a 764 29399
f 93
a 765 23097
a 766 31936
f 356
f 397
a 767 14388
a 768 22638
a 769 23030
f 335
f 768
a 770 13031
a 771 5609
a 772 3631
a 773 26409
f 343
f 665
a 774 31393
f 720
f 85
f 503
a 775 2950
a 776 29584
a 777 6490
a 778 26830
a 779 19624
a 780 29162
a 781 7568
f 721
a 782 4243
a 783 27808
a 784 31000
f 160
a 785 25620
a 786 9461
a 787 14156
a 788 22319
a 789 21806
a 790 11204
f 695
f 239
a 791 19850
f 41
a 792 27825
a 793 6901
f 277
a 794 7127
f 167
a 795 30403
a 796 28399
a 797 29986
a 798 7597
a 799 3889
a 800 18048
a 801 6081
a 802 24078
a 803 32705
a 804 15742
a 805 14042
f 46
a 806 29683
a 807 32170
a 808 26160
a 809 27088
f 494
a 810 32086
f 790
a 811 23667
a 812 30819
a 813 21812
a 814 23367
a 815 17830
a 816 21509
f 322
a 817 32685
f 742
f 758
a 818 26712
f 765
a 819 25071
f 358
a 820 26513
a 821 5625
a 822 19129
f 269
f 464
f 801
a 823 11270
a 824 5850
a 825 17782
a 826 31989
a 827 15953
a 828 25543
a 829 22538
a 830 3720
a 831 14715
a 832 26804
a 833 7632
a 834 9344
a 835 8072
f 681
a 836 6300
f 369
a 837 28818
a 838 14131
a 839 31023
a 840 18989
a 841 7545
a 842 29924
f 376
a 843 20967
a 844 12580
a 845 9691
f 558
a 846 29461
a 847 23237
a 848 24450
a 849 6003
f 166
a 850 19816
a 851 6346
a 852 2813
f 638
a 853 32350
a 854 28293
f 35
a 855 15591
a 856 8401
a 857 21022
a 858 13633
a 859 10923
a 860 29685
a 861 26344
f 457
f 514
a 862 19
a 863 7917
f 518
a 864 14748
a 865 11147
f 325
a 866 26098
a 867 9497
a 868 21321
f 264
a 869 25253
a 870 9231
f 459
f 200
a 871 29967
f 408
f 310
a 872 31315
f 441
a 873 1407
f 392
a 874 25312
a 875 31826
f 152
f 365
a 876 28672
a 877 3129
a 878 7216
a 879 7153
a 880 31034
f 735
a 881 1997
a 882 19297
a 883 23840
a 884 19085
a 885 9972
f 211
f 641
a 886 28125
f 850
a 887 27974
a 888 28339
a 889 8624
f 432
a 890 13290
a 891 12015
a 892 14486
a 893 23418
f 386
a 894 29462
f 442
f 521
a 895 134
a 896 31614
a 897 12552
a 898 18138
a 899 24340
f 549
a 900 7727
a 901 31553
a 902 16331
a 903 12223
f 80
a 904 24118
a 905 22639
a 906 13528
f 182
a 907 23911
a 908 16572
a 909 19060
a 910 16097
a 911 2489
a 912 10206
a 913 21311
f 876
a 914 6261
a 915 13688
f 729
a 916 17407
f 359
a 917 22497
f 324
a 918 8168
a 919 28609
a 920 15876
f 555
a 921 202
a 922 24647
a 923 30388
a 924 27330
a 925 22196
a 926 30737
a 927 13946
a 928 27540
a 929 28168
a 930 5748
f 124
a 931 10497
a 932 12528
a 933 15860
a 934 22165
a 935 15969
a 936 26641
f 516
a 937 22354
f 249
a 938 29733
a 939 23164
a 940 17853
f 617
a 941 9672
f 718
a 942 32368
a 943 6554
a 944 6047
a 945 29094
a 946 6923
a 947 26115
a 948 20732
a 949 29344
a 950 31956
a 951 31209
f 559
a 952 21709
f 505
a 953 17733
f 495
f 920
a 954 3772
f 341
f 566
a 955 27007
a 956 18294
a 957 23205
a 958 28022
a 959 19136
a 960 22471
f 502
a 961 367
a 962 6983
a 963 32241
a 964 24241
f 96
a 965 12730
a 966 27486
a 967 2164
a 968 17698
f 588
f 361
f 79
f 329
a 969 29510
f 318
a 970 15889
a 971 8780
a 972 28980
f 822
a 973 11441
a 974 28323
a 975 5836
a 976 6446
f 955
f 748
a 977 12267
a 978 24971
a 979 28024
a 980 22761
a 981 29773
f 278
a 982 11497
a 983 3641
f 977
f 851
f 17
a 984 825
f 666
a 985 3083
a 986 19489
a 987 720
a 988 28161
f 854
a 989 27876
a 990 31834
a 991 12329
a 992 22253
a 993 10555
a 994 1579
f 572
a 995 28574
a 996 29995
a 997 1921
a 998 13869
f 873
a 999 28680
a 1000 136
a 1001 13207
f 594
a 1002 12922
f 647
a 1003 1847
a 1004 22729
a 1005 17815
f 658
a 1006 10157
a 1007 16280
a 1008 25399
a 1009 24640
f 256
a 1010 24733
a 1011 1660
f 21
a 1012 3380
f 871
f 992
f 301
a 1013 20585
a 1014 17952
a 1015 4735
a 1016 14255
f 740
a 1017 22384
a 1018 16294
a 1019 16025
a 1020 30961
a 1021 8562
a 1022 5036
f 447
a 1023 21994
a 1024 25479
a 1025 29441
a 1026 19402
f 911
f 133
f 476
a 1027 16907
a 1028 9779
f 724
f 547
a 1029 14642
f 128
a 1030 28913
f 637
f 809
a 1031 26217
f 987
a 1032 22684
f 694
f 855
f 504
a 1033 7257
a 1034 6393
a 1035 3587
f 771
a 1036 25547
a 1037 17909
f 569
f 797
f 64
a 1038 30886
a 1039 24359
f 570
f 492
f 406
a 1040 22109
f 235
f 954
f 362
f 213
f 554
f 642
f 1002
a 1041 6873
a 1042 14322
f 448
f 433
a 1043 28028
a 1044 20512
a 1045 25643
f 466
a 1046 30773
a 1047 29396
f 12
a 1048 25974
f 893
f 942
f 423
a 1049 19980
a 1050 25398
a 1051 23110
a 1052 4481
a 1053 20011
a 1054 8681
f 434
f 272
a 1055 22450
a 1056 6396
a 1057 7394
a 1058 9388
f 472
f 551
f 986
a 1059 27560
a 1060 15307
a 1061 24894
f 283
a 1062 13017
f 823
f 655
f 764
a 1063 11607
a 1064 1750
a 1065 21884
f 761
a 1066 31879
f 377
a 1067 28961
a 1068 5084
a 1069 20991
a 1070 30844
a 1071 9170
a 1072 954
a 1073 20259
a 1074 15750
f 471
f 426
a 1075 11025
a 1076 1551
f 632
a 1077 16960
a 1078 26433
a 1079 4361
f 783
a 1080 32202
a 1081 23058
a 1082 21087
a 1083 10809
a 1084 15748
a 1085 9900
f 1005
a 1086 19793
a 1087 2617
f 774
a 1088 21335
f 440
f 623
a 1089 26373
a 1090 29621
a 1091 14834
a 1092 22189
a 1093 2725
f 775
a 1094 6700
a 1095 1200
f 980
a 1096 14880
f 196
a 1097 21102
f 682
f 435
a 1098 32161
a 1099 22630
f 485
a 1100 10269
a 1101 17619
f 899
a 1102 13680
f 599
a 1103 29171
f 644
f 604
a 1104 13787
a 1105 25983
f 645
a 1106 3944
a 1107 8932
f 1025
a 1108 4438
f 922
a 1109 5914
f 253
a 1110 29898
a 1111 16537
a 1112 15230
f 800
a 1113 26925
a 1114 28597
a 1115 17358
a 1116 10198
a 1117 184
a 1118 27294
a 1119 9296
f 467
a 1120 29059
f 970
a 1121 5522
a 1122 21294
a 1123 23186
a 1124 30554
a 1125 14717
f 757
a 1126 1174
a 1127 1192
a 1128 957
a 1129 14892
a 1130 6891
a 1131 1364
f 227
f 579
a 1132 23261
f 288
f 463
f 483
a 1133 24857
a 1134 17152
f 654
f 1075
f 482
a 1135 29497
a 1136 15417
f 1053
a 1137 12666
a 1138 27644
f 101
a 1139 9991
a 1140 14468
f 649
f 184
f 848
a 1141 26040
f 22
a 1142 14172
a 1143 3865
a 1144 281
f 66
a 1145 3283
a 1146 8378
a 1147 15324
f 889
f 366
a 1148 9027
a 1149 297
a 1150 29237
a 1151 17527
a 1152 31244
f 574
a 1153 25386
a 1154 2121
a 1155 2305
a 1156 4515
a 1157 27646
f 127
f 595
a 1158 5637
a 1159 25716
a 1160 30367
f 746
a 1161 20445
a 1162 12378
f 339
f 218
a 1163 13272
f 1032
a 1164 31171
f 845
f 651
a 1165 2609
f 525
a 1166 26215
f 59
f 772
f 1120
f 473
a 1167 8820
a 1168 14654
f 953
a 1169 29830
a 1170 4291
a 1171 20448
f 210
f 1069
f 815
a 1172 14130
f 589
a 1173 23789
a 1174 24729
f 378
f 306
a 1175 6445
f 700
a 1176 2415
f 571
a 1177 15139
f 972
a 1178 24637
a 1179 14772
a 1180 10233
f 592
f 755
a 1181 29008
a 1182 13278
f 962
a 1183 4838
a 1184 25173
f 1101
a 1185 9182
f 860
f 123
a 1186 7461
a 1187 8357
a 1188 27322
f 1055
f 832
f 528
a 1189 21514
f 981
a 1190 19960
f 1054
f 497
a 1191 28031
f 449
a 1192 14660
a 1193 7150
a 1194 27861
a 1195 28552
f 883
a 1196 6270
a 1197 17884
f 1114
f 32
f 275
a 1198 8585
f 707
f 841
a 1199 5100
a 1200 12986
f 86
f 792
a 1201 12594
a 1202 24478
a 1203 22657
f 328
a 1204 14670
a 1205 1322
a 1206 20948
f 1176
a 1207 11251
a 1208 10947
f 971
a 1209 28734
f 723
a 1210 26437
f 1183
a 1211 7844
f 706
f 302
f 430
a 1212 2931
f 29
f 998
f 784
a 1213 31974
f 428
a 1214 2298
f 265
a 1215 16421
a 1216 14428
f 14
f 1105
a 1217 22699
a 1218 24918
a 1219 21366
f 1206
a 1220 446
a 1221 2356
a 1222 27482
f 846
a 1223 23322
a 1224 18968
a 1225 5544
f 524
f 207
a 1226 32347
a 1227 7529
a 1228 7665
f 131
a 1229 18018
a 1230 23661
f 389
f 818
a 1231 14893
f 1094
a 1232 9444
a 1233 3814
f 1068
f 1156
f 908
f 891
a 1234 2706
a 1235 16271
a 1236 234
a 1237 1737
f 334
a 1238 7970
a 1239 29434
a 1240 27744
a 1241 28701
a 1242 11379
a 1243 503
a 1244 13031
f 1089
a 1245 6255
a 1246 17717
f 1058
a 1247 8217
f 1131
a 1248 28401
a 1249 29553
a 1250 4327
f 975
a 1251 17695
a 1252 17095
a 1253 29517
a 1254 24272
a 1255 26283
a 1256 13904
f 1012
f 1145
a 1257 3401
f 1122
f 1146
a 1258 13481
f 104
a 1259 31276
f 582
a 1260 27615
f 640
f 648
a 1261 15680
a 1262 27955
a 1263 26458
f 847
a 1264 22489
a 1265 3609
a 1266 1552
f 1253
f 1011
a 1267 27809
f 663
f 353
f 437
a 1268 30343
a 1269 18643
a 1270 16624
a 1271 29356
a 1272 11960
f 833
f 1008
f 1185
f 612
f 360
a 1273 26857
f 135
a 1274 31210
f 295
a 1275 16758
a 1276 48
a 1277 20520
a 1278 9660
a 1279 8599
a 1280 3194
a 1281 2925
a 1282 25054
a 1283 19099
a 1284 17522
a 1285 11626
a 1286 2963
f 187
a 1287 16480
a 1288 835
f 538
a 1289 5793
a 1290 23134
f 486
a 1291 19699
a 1292 24857
f 304
f 300
a 1293 13899
f 1098
f 142
a 1294 16004
f 1046
f 626
f 601
f 223
a 1295 19197
a 1296 14227
a 1297 19724
f 1109
f 1050
f 935
a 1298 441
f 1279
a 1299 6687
f 674
a 1300 25572
f 542
f 585
f 840
f 730
a 1301 10314
a 1302 13337
f 576
a 1303 3911
f 345
a 1304 9730
f 317
a 1305 13787
a 1306 22958
f 285
a 1307 26217
f 385
f 1196
f 1151
a 1308 14657
a 1309 16236
a 1310 32500
f 1139
f 856
f 677
a 1311 25205
a 1312 31783
f 1233
a 1313 16945
f 276
a 1314 14407
f 541
a 1315 3672
a 1316 20467
a 1317 8556
a 1318 5828
a 1319 13409
a 1320 2636
f 704
a 1321 13348
a 1322 1183
f 181
a 1323 3725
a 1324 30251
a 1325 15199
a 1326 21642
a 1327 11354
a 1328 28266
a 1329 7425
f 866
f 620
a 1330 10145
f 659
a 1331 17320
f 145
a 1332 6473
a 1333 2036
f 1125
a 1334 18553
a 1335 24648
f 751
a 1336 26453
a 1337 652
f 1335
a 1338 6287
f 947
a 1339 7962
a 1340 10763
a 1341 28830
f 515
f 1074
a 1342 26794
f 929
f 1236
f 1000
a 1343 8216
f 1199
f 1079
f 1215
a 1344 16824
a 1345 6429
f 964
f 948
f 1087
a 1346 16561
a 1347 22748
f 157
f 593
a 1348 29595
a 1349 7181
f 806
f 186
a 1350 1346
a 1351 15485
f 418
a 1352 1829
f 1064
f 882
f 1208
f 705
a 1353 649
f 481
a 1354 6464
a 1355 17724
a 1356 13449
f 19
f 4
a 1357 129
f 280
a 1358 28776
a 1359 8511
a 1360 531
f 1065
f 1115
a 1361 10230
f 117
f 793
a 1362 25111
a 1363 22766
a 1364 15702
f 348
f 913
f 1013
f 1216
f 802
f 81
a 1365 30879
a 1366 24068
a 1367 4191
a 1368 18501
f 8
f 1275
a 1369 3798
f 74
a 1370 8075
a 1371 3281
f 787
a 1372 16622
a 1373 26003
a 1374 10448
a 1375 17546
f 990
a 1376 20404
a 1377 30556
f 68
a 1378 12601
a 1379 15838
f 1331
a 1380 24555
a 1381 6502
a 1382 26617
f 1014
f 1133
f 1347
a 1383 15968
a 1384 6340
a 1385 9440
a 1386 19298
a 1387 21746
a 1388 18491
a 1389 22672
a 1390 4648
a 1391 340
a 1392 13080
f 197
a 1393 26332
a 1394 26598
f 279
a 1395 29977
f 107
a 1396 1872
f 1226
a 1397 14833
a 1398 20569
a 1399 2527
a 1400 20736
a 1401 21288
a 1402 25524
a 1403 9818
a 1404 26023
a 1405 2172
f 535
f 1179
a 1406 7337
a 1407 20486
f 610
f 58
a 1408 16423
a 1409 8278
f 1004
a 1410 28942
a 1411 28143
f 1316
f 479
a 1412 20254
f 1363
a 1413 2554
f 416
a 1414 22209
f 222
a 1415 13888
f 151
a 1416 29881
a 1417 12590
f 1052
f 1092
a 1418 20129
a 1419 1044
a 1420 27660
f 633
a 1421 12904
f 635
f 879
a 1422 6453
f 1113
f 226
f 523
a 1423 21998
a 1424 24280
f 887
a 1425 10324
a 1426 20255
f 938
f 281
a 1427 23208
f 1252
f 886
f 565
f 1099
f 820
a 1428 9194
f 340
a 1429 21418
a 1430 20696
f 444
a 1431 12206
f 814
f 1070
f 1273
a 1432 238
a 1433 17758
f 1175
f 352
a 1434 11413
a 1435 28421
a 1436 19130
a 1437 17739
a 1438 24709
a 1439 24334
a 1440 12259
a 1441 23213
a 1442 26227
f 668
a 1443 27798
f 1338
a 1444 14133
f 903
f 1421
f 865
a 1445 20538
a 1446 31146
f 664
f 1067
a 1447 3602
a 1448 3336
f 825
a 1449 23936
f 188
a 1450 178
a 1451 29885
f 238
f 1277
f 979
f 1010
f 1419
a 1452 28725
f 364
f 149
f 974
f 1418
f 1309
a 1453 24205
f 1209
a 1454 17233
f 315
f 936
a 1455 1629
f 1271
a 1456 9219
a 1457 26593
f 147
f 539
f 1268
a 1458 26202
f 567
a 1459 29650
f 714
a 1460 1175
f 527
f 760
a 1461 1907
a 1462 28474
a 1463 25273
a 1464 9673
f 1366
a 1465 32289
f 274
f 1433
a 1466 28951
a 1467 16933
a 1468 31071
a 1469 2977
f 1345
f 1452
a 1470 30196
f 395
f 836
f 1398
f 312
f 861
a 1471 3318
f 1047
f 1097
f 1281
a 1472 31799
a 1473 1976
a 1474 11077
f 1391
f 1317
f 536
f 808
a 1475 27378
a 1476 1671
f 1165
f 99
a 1477 13974
f 1437
a 1478 24790
a 1479 24884
f 719
f 526
a 1480 26763
a 1481 11660
a 1482 18824
f 1390
f 961
a 1483 21112
a 1484 7050
a 1485 23892
f 1169
a 1486 18950
f 429
f 537
a 1487 192
f 1170
a 1488 2457
a 1489 13736
a 1490 5246
a 1491 5991
f 1247
f 548
f 1413
f 1173
f 1248
f 5
a 1492 22870
f 803
f 164
a 1493 23331
a 1494 4254
f 1326
a 1495 5088
a 1496 1344
f 725
f 1119
f 1476
f 983
f 1134
a 1497 32440
f 870
a 1498 2788
a 1499 29458
a 1500 22515
a 1501 31026
a 1502 10359
f 241
a 1503 29436
a 1504 9009
f 1297
f 1395
f 1132
a 1505 27512
a 1506 26629
f 1296
f 1440
a 1507 1756
f 1381
a 1508 10957
a 1509 7680
f 452
a 1510 27340
a 1511 27815
f 180
f 1376
a 1512 28105
a 1513 24770
f 880
a 1514 29183
a 1515 29835
a 1516 10026
a 1517 30094
f 1478
f 1080
a 1518 24220
a 1519 8020
a 1520 26723
a 1521 28326
f 78
f 1364
f 1491
a 1522 32515
a 1523 21042
f 798
f 531
f 1513
f 813
a 1524 29948
f 973
a 1525 31624
f 1007
a 1526 5417
f 1240
f 1314
a 1527 8814
f 1410
f 844
a 1528 6413
f 1313
f 293
a 1529 22372
a 1530 80
f 963
a 1531 427
f 837
a 1532 27361
f 1083
a 1533 27826
a 1534 28859
a 1535 978
a 1536 1622
f 1243
a 1537 25875
a 1538 5462
a 1539 11912
a 1540 8877
a 1541 9462
f 1525
f 1462
a 1542 31054
f 584
a 1543 27578
a 1544 24666
a 1545 24813
a 1546 12540
f 1223
a 1547 13486
f 1111
f 1172
f 958
f 1095
a 1548 5287
a 1549 21420
a 1550 17552
f 510
a 1551 2632
f 630
f 1449
a 1552 22260
f 940
a 1553 1384
a 1554 14009
f 474
a 1555 29911
a 1556 23557
f 1230
f 1544
f 1526
f 619
f 868
f 1299
a 1557 14260
a 1558 27664
f 162
a 1559 18179
a 1560 7576
f 1380
f 1071
f 1200
a 1561 28221
f 607
a 1562 9402
a 1563 9046
a 1564 4111
f 693
f 1116
a 1565 16700
f 1397
f 1500
a 1566 5707
f 821
f 419
f 685
a 1567 948
f 1192
f 731
a 1568 20454
a 1569 22475
f 1524
f 405
f 1135
a 1570 25605
a 1571 26788
a 1572 22986
f 1289
a 1573 1805
a 1574 13486
f 1411
f 330
a 1575 8508
f 453
f 1213
f 1034
a 1576 20669
f 175
a 1577 28997
f 509
f 1461
a 1578 12050
f 493
a 1579 14933
f 1434
a 1580 7864
f 11
f 878
a 1581 29036
f 1548
f 114
a 1582 19080
f 1465
f 171
a 1583 22025
a 1584 22565
a 1585 6982
a 1586 11020
a 1587 9784
f 586
f 1029
a 1588 15836
f 994
a 1589 21697
f 646
a 1590 22070
f 967
a 1591 19209
a 1592 13073
f 1088
f 759
a 1593 9860
f 1342
f 763
a 1594 20339
a 1595 24706
f 52
a 1596 29902
f 1231
a 1597 29245
a 1598 20420
a 1599 23799
f 1160
f 699
f 563
a 1600 14993
f 890
f 255
a 1601 1147
f 1584
f 1222
f 141
a 1602 2958
a 1603 16635
a 1604 3918
f 1017
a 1605 29944
f 1249
a 1606 7587
f 1018
a 1607 19757
a 1608 16057
f 1482
f 284
a 1609 24075
a 1610 16553
a 1611 31336
a 1612 1123
a 1613 1539
a 1614 25032
a 1615 7704
f 311
a 1616 3088
f 1310
f 670
a 1617 10777
f 1606
f 1580
f 1443
f 534
f 1332
a 1618 9162
f 91
f 1444
f 867
f 1438
f 932
f 401
f 749
f 1401
a 1619 14930
f 1306
f 1613
f 1456
a 1620 6319
f 305
a 1621 31261
a 1622 5945
a 1623 19621
f 1407
a 1624 20749
f 1612
a 1625 10368
a 1626 26916
a 1627 1700
f 686
a 1628 1605
a 1629 26586
a 1630 8590
a 1631 4379
f 1148
f 83
a 1632 31674
f 1604
f 119
a 1633 5005
f 653
a 1634 16163
a 1635 6551
f 1043
a 1636 1786
a 1637 9491
f 1459
a 1638 11675
f 864
f 1637
a 1639 20211
a 1640 11833
f 843
a 1641 27811
a 1642 5795
f 988
a 1643 11150
a 1644 28331
f 918
f 1121
f 1358
f 1602
f 1373
a 1645 16065
f 853
f 1564
f 1467
f 811
a 1646 5158
f 90
a 1647 23639
a 1648 9102
f 1286
f 501
f 921
a 1649 32379
f 231
a 1650 360
f 1191
a 1651 3489
a 1652 18357
a 1653 30291
f 381
f 1210
f 399
f 1378
a 1654 21776
f 1142
f 1499
a 1655 20261
f 1081
f 1276
a 1656 19621
a 1657 2519
f 1517
f 1657
f 445
f 513
f 616
f 817
f 292
a 1658 4016
f 609
f 1506
f 1403
f 177
f 901
f 1426
a 1659 11967
f 1445
f 338
f 600
f 1235
a 1660 7262
f 1615
a 1661 11225
a 1662 15116
f 70
a 1663 1626
a 1664 4146
a 1665 3956
f 1246
f 606
f 675
a 1666 2349
f 1181
a 1667 8287
f 1427
a 1668 17585
f 1037
f 1554
a 1669 23657
f 952
f 1646
f 722
f 1618
f 1044
a 1670 17813
f 859
f 1036
f 1129
f 296
a 1671 13315
f 121
a 1672 28331
a 1673 19500
a 1674 9599
f 1545
f 179
a 1675 28388
f 712
a 1676 12477
f 1620
a 1677 63
a 1678 6272
f 1124
a 1679 15582
f 1351
f 129
a 1680 22072
a 1681 17013
f 1285
a 1682 966
a 1683 9472
a 1684 15359
f 639
f 1473
f 1308
a 1685 7250
f 995
a 1686 26135
f 398
f 326
f 1339
f 258
a 1687 22518
a 1688 12562
f 1319
a 1689 5735
a 1690 4252
a 1691 6240
f 631
a 1692 7988
a 1693 18191
a 1694 4691
f 1349
a 1695 29115
f 248
a 1696 11124
f 1009
a 1697 4002
a 1698 19795
a 1699 10552
f 1325
f 786
a 1700 4741
f 1683
f 1157
a 1701 12351
a 1702 11123
f 862
a 1703 29466
a 1704 21720
a 1705 18071
a 1706 768
f 1300
f 1304
f 1653
a 1707 27974
a 1708 8859
f 333
f 766
f 1340
f 1515
a 1709 28678
f 1553
f 1701
a 1710 17842
f 16
f 1504
f 38
f 446
f 1703
f 1242
f 1472
a 1711 11847
a 1712 6875
a 1713 22723
a 1714 22387
a 1715 21002
f 1227
f 1021
a 1716 8132
a 1717 31031
f 1495
f 465
f 737
a 1718 19881
a 1719 22542
a 1720 10950
a 1721 31133
f 1485
f 1474
f 1655
a 1722 31218
f 415
f 1644
a 1723 6431
f 55
f 309
f 1006
f 1488
f 1442
a 1724 26366
a 1725 1860
a 1726 32355
a 1727 7587
a 1728 2404
a 1729 21511
f 789
f 1692
a 1730 12544
a 1731 11435
a 1732 4421
a 1733 16414
f 221
a 1734 21967
a 1735 5097
f 915
f 660
f 1441
f 1489
f 754
a 1736 10056
f 1679
f 966
a 1737 29252
f 667
f 450
f 1162
f 1549
f 1662
f 1704
a 1738 31312
f 1656
f 597
f 237
a 1739 10506
f 782
a 1740 22093
a 1741 1718
f 826
a 1742 9224
a 1743 28292
f 976
f 404
f 1726
f 316
f 1510
f 1333
a 1744 25214
f 1284
f 591
a 1745 18566
a 1746 10614
a 1747 7161
f 968
a 1748 9264
a 1749 8857
a 1750 10039
f 1118
a 1751 8678
f 1374
a 1752 17682
a 1753 2128
a 1754 423
f 1496
a 1755 24738
f 77
f 368
f 1555
f 282
a 1756 5757
f 308
f 1512
a 1757 28060
f 174
f 1212
f 519
f 1302
a 1758 4051
f 1658
a 1759 19684
a 1760 25225
a 1761 4357
a 1762 10855
f 92
f 259
f 1409
a 1763 11007
f 907
f 387
f 1728
f 1328
f 336
a 1764 5003
f 355
a 1765 10331
f 1041
a 1766 18003
f 708
a 1767 840
f 1039
f 1158
a 1768 32023
a 1769 9240
a 1770 5801
f 373
a 1771 17477
a 1772 26507
f 1106
a 1773 27315
a 1774 23862
a 1775 21549
a 1776 5596
f 1686
f 1520
a 1777 31103
f 1589
f 1603
a 1778 399
a 1779 11533
f 1735
a 1780 14763
f 1572
a 1781 23884
a 1782 16342
f 944
f 202
f 1266
f 1078
f 1323
a 1783 11235
a 1784 14906
f 1177
a 1785 27418
a 1786 896
f 1503
a 1787 20766
a 1788 12269
a 1789 1411
f 1322
f 791
a 1790 26640
f 1722
f 1045
f 1400
f 400
f 1669
a 1791 31312
a 1792 17103
a 1793 11243
f 1420
a 1794 30213
f 1755
f 1594
a 1795 13281
f 776
f 1197
f 726
a 1796 836
a 1797 27933
a 1798 12936
f 1439
f 1219
f 1552
f 1086
f 1193
a 1799 21477
a 1800 20313
f 1674
a 1801 25111
f 747
f 1484
f 414
f 1103
a 1802 25717
f 1001
a 1803 31628
a 1804 9707
a 1805 21324
a 1806 19149
f 678
f 1695
a 1807 5202
f 1258
a 1808 5469
f 1518
f 1516
a 1809 201
f 590
f 905
f 753
a 1810 8958
f 1073
f 816
a 1811 1125
f 291
f 614
a 1812 29357
a 1813 23727
f 1556
a 1814 7770
a 1815 24393
f 1244
f 1282
a 1816 5654
a 1817 26927
f 1387
f 1430
a 1818 21878
a 1819 11350
f 1360
f 1479
a 1820 9321
a 1821 25622
a 1822 20235
a 1823 13514
f 1773
a 1824 702
a 1825 10222
a 1826 12974
f 470
f 1629
f 824
a 1827 21117
f 1272
a 1828 4548
f 1576
f 1630
a 1829 7660
a 1830 15153
a 1831 11131
f 1049
a 1832 31987
f 934
a 1833 5757
a 1834 10484
f 1730
f 1188
a 1835 5426
a 1836 22925
a 1837 13411
f 1189
f 703
f 1344
f 100
f 1803
a 1838 25388
f 745
f 989
f 717
f 875
a 1839 17613
a 1840 31641
a 1841 15889
f 1493
a 1842 13255
f 1661
a 1843 11366
a 1844 20743
a 1845 23155
a 1846 14826
a 1847 13233
a 1848 27440
f 1361
f 939
f 1843
f 1836
f 214
f 1228
a 1849 5049
a 1850 12956
f 1744
f 1636
f 1454
f 1833
f 785
f 1724
a 1851 21790
f 752
f 1371
a 1852 7648
f 927
f 1765
a 1853 4103
a 1854 18288
a 1855 22484
f 391
a 1856 9019
a 1857 927
f 657
a 1858 25610
a 1859 7719
a 1860 29261
a 1861 29109
f 1471
f 1424
f 951
f 1769
a 1862 29213
a 1863 7289
a 1864 250
f 1560
f 232
f 1824
f 1688
f 1303
a 1865 17238
f 1786
a 1866 20582
f 1154
f 738
f 1691
a 1867 1291
f 788
f 1261
f 1841
f 1291
a 1868 25162
a 1869 29336
a 1870 17659
a 1871 23311
a 1872 25171
a 1873 2382
a 1874 27256
a 1875 13721
f 451
f 1745
f 605
f 1741
f 697
f 1367
f 1292
f 1601
f 1149
f 273
f 1386
f 1538
f 877
f 354
f 564
f 1827
f 1263
f 690
f 732
f 268
a 1876 15794
a 1877 18148
f 1561
f 1739
f 839
f 1195
a 1878 7955
a 1879 22258
f 3
a 1880 23135
f 1847
a 1881 4525
a 1882 31876
a 1883 25946
f 1868
f 1511
a 1884 17281
a 1885 4619
a 1886 24926
f 1060
f 1717
f 1586
a 1887 24742
a 1888 19396
f 1854
a 1889 18155
f 143
f 1880
a 1890 7068
f 1529
f 469
a 1891 12151
f 1826
a 1892 24354
f 1362
f 1287
a 1893 6996
a 1894 28284
a 1895 11324
f 874
f 1862
f 1107
a 1896 7055
f 1250
f 1038
f 1881
f 1611
a 1897 30362
f 1759
f 1772
a 1898 21161
f 1708
f 424
f 1198
f 796
a 1899 1196
f 1093
a 1900 29022
f 838
a 1901 24559
f 1682
f 458
f 1294
a 1902 8473
a 1903 26486
a 1904 27124
a 1905 12540
a 1906 620
f 750
f 1879
a 1907 13837
a 1908 27418
f 652
f 1217
f 1481
f 94
f 1201
a 1909 20914
f 900
f 1264
f 701
a 1910 17246
a 1911 8600
f 767
f 1780
a 1912 11493
f 1907
f 1673
f 517
a 1913 19497
f 1888
f 1834
f 898
f 172
f 1382
a 1914 4901
f 1164
a 1915 22658
f 928
f 6
f 1910
f 1238
f 743
f 240
a 1916 14498
a 1917 28100
f 615
f 1863
f 917
a 1918 2966
f 529
f 777
f 1845
a 1919 8120
f 603
f 1625
f 1104
a 1920 11053
f 930
a 1921 397
f 1640
f 507
a 1922 2122
a 1923 14829
f 1814
f 1085
a 1924 10507
a 1925 5793
a 1926 12214
f 297
f 60
a 1927 17851
a 1928 11580
f 1295
a 1929 16065
f 1763
a 1930 20067
a 1931 24623
f 643
a 1932 7578
f 478
f 1737
a 1933 16638
f 984
a 1934 17177
a 1935 19740
f 1033
a 1936 17288
f 1578
f 1571
f 1884
f 1334
a 1937 2261
f 1521
f 770
f 834
f 689
f 556
f 332
f 1840
a 1938 13973
f 1186
f 710
a 1939 3386
f 1587
f 1505
f 1817
f 1900
a 1940 25068
f 1256
f 1754
a 1941 2875
a 1942 18276
f 323
f 1654
f 220
f 1534
a 1943 6099
a 1944 16651
f 173
a 1945 15178
a 1946 827
a 1947 2719
f 234
a 1948 5686
f 1895
f 1705
f 1647
f 1903
a 1949 17188
f 661
a 1950 9013
a 1951 1752
a 1952 31453
a 1953 31242
a 1954 11359
a 1955 2573
a 1956 4462
f 933
f 1685
a 1957 11762
f 578
a 1958 3774
a 1959 22716
f 1939
f 1785
a 1960 1231
a 1961 24544
a 1962 6819
a 1963 14191
a 1964 4617
a 1965 6801
f 1
a 1966 30768
f 696
f 628
f 357
a 1967 13862
f 1810
a 1968 32064
f 1908
f 1540
f 530
f 1288
a 1969 18695
f 1320
f 390
a 1970 697
a 1971 11357
f 1792
f 251
f 1850
f 1221
f 1385
a 1972 30820
a 1973 24147
a 1974 26472
a 1975 14057
a 1976 2366
a 1977 4995
a 1978 19252
f 819
f 290
f 1312
a 1979 19409
a 1980 7857
f 1678
f 314
f 1066
f 1318
f 294
f 869
a 1981 22619
f 1944
a 1982 488
a 1983 21432
f 1941
f 1929
f 1392
f 1523
f 1983
a 1984 25738
a 1985 19753
a 1986 31251
f 244
a 1987 10247
f 1969
a 1988 11984
f 1733
f 830
f 1568
a 1989 30762
f 1736
a 1990 32230
a 1991 25984
f 1977
f 828
f 1684
a 1992 24510
a 1993 2371
f 937
f 236
f 1725
a 1994 3852
f 611
f 1991
f 1579
a 1995 29645
f 1671
a 1996 5926
f 1742
f 827
f 587
a 1997 2005
f 1048
f 1905
a 1998 5295
a 1999 1177
f 1925
f 1676
a 2000 20841
a 2001 32242
f 807
a 2002 27455
f 1715
a 2003 9054
f 144
a 2004 29721
f 965
f 1927
f 1950
a 2005 8844
f 1519
f 1952
f 1020
a 2006 23140
f 185
f 1187
f 956
f 460
a 2007 20260
f 1982
a 2008 23983
f 1514
a 2009 4987
f 2006
f 1051
f 1509
a 2010 30350
f 1892
a 2011 18506
f 1937
f 1596
f 1633
f 1844
f 1547
f 1232
a 2012 27772
a 2013 19518
f 105
a 2014 19104
a 2015 22275
f 810
f 1477
f 2000
f 1501
a 2016 2680
f 1533
a 2017 15854
f 1961
a 2018 5770
f 1265
a 2019 24275
f 1141
a 2020 7147
f 1254
f 267
a 2021 3903
f 1327
a 2022 22328
f 1167
a 2023 13559
f 1269
a 2024 23802
a 2025 19330
f 412
f 1839
a 2026 17011
f 546
f 1914
f 1575
a 2027 12912
f 598
a 2028 13956
f 1857
a 2029 22787
f 943
a 2030 22515
a 2031 32679
f 1994
f 2024
f 1203
f 1448
a 2032 14315
a 2033 18523
f 1931
f 950
f 1727
a 2034 2926
f 1425
f 1301
a 2035 12845
f 37
a 2036 5704
f 1867
f 1743
f 247
f 2012
f 945
f 1267
f 596
f 1450
f 50
a 2037 1796
f 298
f 1428
f 1569
f 209
f 1259
f 1788
f 1015
f 1108
f 1820
f 1966
f 337
f 1372
f 2027
f 409
a 2038 24483
f 1791
a 2039 10823
f 1307
f 1992
a 2040 24683
f 1707
a 2041 12899
f 49
a 2042 20415
f 1815
a 2043 1237
f 1498
f 489
f 1953
f 122
f 1970
f 1948
f 1894
f 1399
f 960
f 2030
f 1926
f 1245
f 1414
a 2044 23263
f 1816
f 1779
f 1626
a 2045 12593
f 909
f 1842
f 1003
f 805
a 2046 13509
f 1346
f 1930
a 2047 6120
f 924
f 923
f 1990
a 2048 29237
f 1945
f 1976
f 1783
f 371
a 2049 30224
f 1542
f 1887
a 2050 864
f 799
f 532
a 2051 26580
a 2052 12598
f 1975
f 1877
f 1635
f 1159
f 1919
f 912
f 544
a 2053 16196
a 2054 31047
f 1913
a 2055 32114
f 1163
a 2056 8789
f 1527
f 27
f 1416
a 2057 3866
f 1394
f 1796
a 2058 8
a 2059 25349
a 2060 14586
a 2061 14979
f 1337
f 1595
f 1819
f 1896
f 1557
f 1537
a 2062 28383
f 1821
a 2063 32131
a 2064 31304
f 636
a 2065 11818
f 347
a 2066 10807
f 461
a 2067 7848
f 625
a 2068 21157
a 2069 5541
f 1648
a 2070 15064
f 916
f 1225
f 2057
a 2071 15995
a 2072 13310
f 1590
a 2073 28365
f 888
f 1096
a 2074 26779
f 812
a 2075 12243
f 1117
f 1846
f 919
a 2076 26990
f 1878
a 2077 20624
f 1729
f 2036
f 1638
f 1205
f 1147
f 1241
a 2078 5617
a 2079 5168
a 2080 4565
f 1918
f 1677
a 2081 30454
f 1693
a 2082 28331
f 1898
f 2062
f 380
f 2079
f 895
f 1624
f 204
f 1076
f 2007
a 2083 31478
f 1432
f 1255
f 1082
f 1776
f 1922
f 2015
f 2050
a 2084 2292
a 2085 28146
f 1837
f 1429
a 2086 29319
a 2087 13264
f 1293
f 1522
f 1762
f 608
a 2088 29785
f 1713
f 1711
f 65
f 1057
a 2089 19340
a 2090 13051
f 1906
f 957
f 1290
f 1825
f 2019
f 1305
a 2091 23297
f 1329
f 1166
f 1178
f 744
a 2092 16211
f 734
a 2093 9374
f 1220
a 2094 21711
f 2085
f 1324
a 2095 18864
f 1321
f 683
a 2096 2584
a 2097 15265
f 1607
f 2090
a 2098 5492
f 1593
f 1909
f 1330
f 1700
f 287
f 2045
f 1876
f 1077
a 2099 3829
a 2100 28839
f 1995
f 1859
f 1882
f 1891
f 170
f 1766
f 2009
f 2026
f 1832
f 1384
a 2101 3831
f 1760
f 1928
f 1822
f 1597
f 2023
f 1298
f 1872
f 1904
f 1764
f 1182
f 1184
f 1890
a 2102 24236
f 1875
a 2103 11716
f 2071
f 884
f 1771
f 1136
f 1980
a 2104 17545
f 2092
a 2105 32267
f 2016
a 2106 14647
f 993
f 1582
f 931
a 2107 1724
f 1422
f 1960
f 1278
a 2108 23029
f 1355
f 2087
f 2104
f 1229
f 205
f 2029
f 1886
a 2109 22167
a 2110 27168
f 1204
f 1030
a 2111 23758
a 2112 16304
f 1090
a 2113 31531
f 949
f 741
a 2114 27006
f 1150
f 1689
f 1383
f 2070
f 1274
f 543
a 2115 854
f 2086
a 2116 3521
a 2117 31408
f 1650
f 1336
f 2028
f 1901
f 2037
f 2114
f 76
f 1211
f 1059
f 1808
a 2118 31519
f 728
f 910
f 1668
f 262
a 2119 18741
f 716
f 1475
a 2120 168
f 1435
a 2121 16110
a 2122 2207
f 829
f 780
f 1483
f 1591
a 2123 7523
f 1938
a 2124 13689
f 1871
a 2125 21406
a 2126 21260
f 2066
f 2075
f 1453
f 1801
f 680
a 2127 2003
f 1168
f 313
f 1455
f 138
a 2128 23042
a 2129 13590
a 2130 949
a 2131 10346
a 2132 22353
a 2133 24164
a 2134 1497
f 1831
a 2135 20975
f 561
f 350
f 835
a 2136 25444
f 533
f 1028
f 1531
a 2137 7170
f 1600
f 688
f 1740
f 1709
a 2138 5454
a 2139 4132
f 2047
f 1652
f 53
f 1359
f 1781
a 2140 18664
a 2141 9930
f 1923
f 2096
a 2142 6756
f 1585
a 2143 20205
f 1123
a 2144 17567
f 1389
a 2145 2140
a 2146 17650
f 1838
f 1470
a 2147 14425
f 1180
f 687
f 1126
f 1974
a 2148 21406
f 1641
f 756
f 2132
f 1463
f 580
f 1609
f 436
f 692
f 1138
f 1775
f 1536
a 2149 22300
f 1988
f 794
a 2150 32065
f 1799
a 2151 5429
a 2152 6873
a 2153 26123
f 1935
f 2031
a 2154 2321
f 1224
a 2155 5872
f 1218
a 2156 24613
a 2157 2173
f 1829
f 1987
f 2102
a 2158 24258
f 831
f 402
a 2159 21253
a 2160 31039
f 985
f 1480
a 2161 6440
f 2013
f 1784
f 1588
a 2162 15484
f 1998
f 2141
f 2121
a 2163 13034
f 2053
a 2164 17285
f 560
f 1823
f 2021
f 1436
a 2165 26370
f 1690
f 1084
a 2166 31422
a 2167 5381
f 2137
f 1153
f 1423
f 2097
a 2168 30012
f 1860
f 1851
a 2169 15238
f 1061
f 762
f 1447
a 2170 14376
f 1979
f 24
a 2171 27190
f 1758
f 1805
f 2008
f 1720
f 1137
a 2172 78
a 2173 6370
a 2174 16928
a 2175 10631
f 1128
f 455
f 1062
a 2176 20667
f 1710
a 2177 29132
f 2064
f 1155
a 2178 21928
a 2179 23384
f 1353
f 2149
f 872
f 1986
f 1958
f 1100
f 1497
a 2180 31613
a 2181 6168
f 2122
a 2182 27644
f 711
f 1562
f 2117
f 153
f 2145
f 1451
f 1365
f 1835
f 2136
a 2183 11400
f 2011
a 2184 11217
f 1663
a 2185 29943
f 1130
f 522
f 2077
f 2174
f 1412
f 1858
f 126
f 1698
f 552
f 2065
f 1110
f 1712
a 2186 26206
f 662
f 1921
a 2187 3835
f 1985
f 2040
f 2039
f 1577
f 1257
f 885
f 1807
f 1984
a 2188 17671
a 2189 21004
a 2190 5492
f 1369
f 1543
f 1031
f 1431
f 1681
f 1610
f 1460
f 163
a 2191 22945
f 1889
a 2192 12694
a 2193 13182
f 1024
a 2194 18186
f 1883
f 1632
a 2195 198
f 491
a 2196 10443
f 2125
a 2197 26846
f 1072
f 1458
f 1971
f 2095
f 2155
f 969
f 1621
f 1402
a 2198 19825
f 2171
f 263
f 1617
a 2199 22073
f 2106
a 2200 29353
f 671
f 508
f 1651
a 2201 22323
f 1997
f 1962
a 2202 9981
a 2203 28092
f 781
f 1714
f 1239
a 2204 17710
f 1190
f 773
a 2205 24115
f 904
a 2206 12984
f 1559
a 2207 16238
f 2051
a 2208 4755
f 1091
a 2209 2898
f 2165
a 2210 24014
a 2211 22967
f 2025
f 863
a 2212 24915
f 1874
f 2148
a 2213 16205
f 2061
f 1940
a 2214 10389
f 1035
f 1873
f 1828
f 1161
f 1794
a 2215 25659
f 44
f 2181
a 2216 5031
f 568
a 2217 4139
a 2218 16930
f 1619
f 2084
f 1865
a 2219 3235
f 795
f 2214
f 2128
a 2220 11640
f 1947
f 407
f 1747
a 2221 7834
f 2105
a 2222 6133
f 914
f 1716
f 2003
f 1417
f 1466
f 2198
f 139
f 684
a 2223 13720
f 622
f 1912
a 2224 26579
f 1949
f 1558
f 2224
f 1968
f 1356
a 2225 32764
a 2226 24478
a 2227 23329
f 2052
f 2205
a 2228 31908
f 804
a 2229 16065
f 394
f 2017
a 2230 14425
f 1370
f 2150
a 2231 7006
f 2163
a 2232 31572
f 2166
f 1670
f 2142
f 10
f 1194
f 431
f 97
f 2112
a 2233 8899
a 2234 10715
f 2010
f 2216
f 1583
f 2123
a 2235 26007
f 2146
f 1934
f 511
a 2236 24444
f 2118
f 2194
f 1855
f 1789
f 1954
f 1406
f 1753
f 320
a 2237 20371
f 1761
a 2238 30150
a 2239 1509
f 1993
f 372
f 1853
a 2240 12532
f 1063
f 2206
f 2091
f 2014
f 1749
f 1719
f 1283
a 2241 19663
a 2242 23976
f 1566
a 2243 5006
f 1675
f 852
f 1605
f 2179
f 1546
a 2244 21663
f 1019
a 2245 32056
a 2246 13911
f 2189
a 2247 16736
f 1943
f 1797
a 2248 15867
a 2249 1564
f 1787
a 2250 10676
f 1861
f 575
f 2236
f 1614
f 1528
f 2248
f 2169
a 2251 28817
f 2225
a 2252 931
a 2253 22050
f 1457
f 439
a 2254 981
f 1539
a 2255 16704
f 2182
f 1377
f 1042
f 2107
f 1911
f 156
f 1143
f 1852
a 2256 32460
a 2257 7807
f 1415
f 2119
f 624
a 2258 29502
f 2043
f 2238
f 1666
f 2254
f 1795
f 195
f 1634
a 2259 13006
f 1341
a 2260 11347
a 2261 13436
f 1171
a 2262 29501
f 1687
f 1642
f 1649
f 2253
f 1040
f 219
a 2263 20180
f 1732
f 2234
f 1697
f 941
a 2264 15246
f 2260
f 2100
f 1616
f 342
f 1464
a 2265 23788
f 2151
f 1486
f 1999
f 477
a 2266 6923
f 2042
f 1917
f 396
f 1490
a 2267 6859
f 858
f 2249
a 2268 7302
f 2083
f 1592
f 779
a 2269 25545
f 2055
a 2270 3537
f 2212
f 2069
f 2076
a 2271 16299
f 2173
a 2272 26395
f 1627
f 2088
f 2144
f 2041
f 2247
a 2273 9767
a 2274 2703
a 2275 1730
f 2059
a 2276 7034
f 1311
f 2098
f 2190
f 1388
f 2134
f 2275
f 2196
f 2271
f 1251
a 2277 11183
a 2278 31981
f 1660
a 2279 5441
f 881
f 1102
f 1942
a 2280 10454
f 1973
f 1508
f 1897
a 2281 18772
f 925
f 2109
f 2266
a 2282 2249
f 1280
f 1354
f 1348
a 2283 830
f 1738
f 2162
f 2268
f 2202
f 2228
f 736
a 2284 18997
f 2158
f 1396
f 2230
f 2172
f 1468
a 2285 15599
f 2239
f 1664
f 857
a 2286 19295
f 2237
a 2287 10407
f 2262
f 2287
f 2187
f 299
a 2288 31961
a 2289 5905
f 2116
f 894
f 1806
f 67
f 1260
f 2063
f 2044
f 2111
f 1152
f 1757
f 1551
f 1127
f 2005
f 1924
f 769
f 1645
f 1023
f 1848
f 2188
f 713
f 892
f 2074
f 2072
a 2290 25082
f 2277
f 2241
f 1405
f 1978
f 2267
f 1469
a 2291 21937
f 2126
f 1751
f 1446
a 2292 32042
a 2293 13745
f 1565
a 2294 13533
f 1237
f 1767
f 1893
f 2252
f 1967
f 2217
f 168
f 2032
f 1270
a 2295 18936
f 1016
f 2222
f 2231
f 2124
f 1902
f 2080
a 2296 25710
f 1598
f 1680
f 621
f 1672
f 2295
f 1731
f 2099
f 1350
f 2201
f 2186
f 1981
a 2297 438
f 1746
f 2289
f 1933
f 2156
f 1315
a 2298 19700
a 2299 29941
f 1022
f 1574
f 1798
f 2033
f 2278
f 1723
a 2300 3043
f 2056
f 1768
f 1813
f 388
f 1550
a 2301 3697
f 1721
f 676
f 1734
f 2263
f 1936
f 2215
a 2302 13700
f 997
a 2303 1167
f 1487
f 1581
f 72
f 1573
a 2304 890
f 2227
a 2305 17339
f 2022
a 2306 11386
f 1989
a 2307 7855
f 1112
f 1357
f 242
f 1864
a 2308 36
f 2175
a 2309 16625
f 2299
f 499
f 2288
a 2310 22834
a 2311 1550
f 125
f 2219
f 2279
a 2312 7686
f 2306
f 2054
f 1856
f 2308
f 1214
f 553
a 2313 27407
a 2314 21143
f 1702
f 1946
a 2315 14256
f 1782
f 2302
a 2316 28296
f 2272
a 2317 24264
a 2318 11273
a 2319 30562
f 2246
f 2178
f 2038
f 1494
f 1567
f 420
f 691
f 2259
f 1530
f 1790
f 411
f 1752
f 2200
f 1756
f 1699
f 1818
f 2138
f 2311
a 2320 13266
f 1368
f 2068
f 475
f 978
f 1870
f 778
f 1234
f 999
f 946
f 1956
f 2195
f 2294
f 2152
a 2321 11942
f 2251
a 2322 18352
f 1706
f 1622
a 2323 26785
a 2324 5977
f 959
a 2325 5403
f 1869
f 2120
f 2304
f 2140
f 1809
f 2081
f 1532
a 2326 8968
f 2170
f 2164
f 902
f 2147
f 1899
f 2291
f 1570
f 897
f 2153
a 2327 27673
f 1393
f 1885
f 1404
f 2303
a 2328 30320
f 2108
a 2329 7508
f 51
f 2002
f 456
f 2229
a 2330 18053
f 2001
a 2331 28501
f 2269
f 2261
a 2332 14045
a 2333 18277
f 2207
a 2334 23900
f 1996
f 1750
a 2335 25985
f 996
f 2332
f 2243
f 349
f 2256
a 2336 2288
f 2326
f 2020
f 1352
a 2337 865
f 1972
a 2338 8706
a 2339 26690
a 2340 10512
f 1965
f 2273
f 2245
f 1964
f 2258
a 2341 31529
f 896
f 2067
f 2328
f 2292
a 2342 15498
f 2101
f 2018
f 2297
f 2192
f 2329
a 2343 17424
f 2093
f 1027
f 155
f 2315
f 2331
f 1866
f 926
a 2344 24314
f 2322
a 2345 22094
a 2346 8570
f 2176
f 1202
f 849
a 2347 25278
f 490
f 1665
f 2157
f 1599
f 1507
f 1955
f 2319
a 2348 13649
f 2285
f 2203
f 1916
f 2290
f 2317
f 1696
f 2283
f 2103
a 2349 17048
a 2350 871
f 1608
f 2348
f 2193
f 673
f 1718
a 2351 25310
f 1849
f 2340
f 1800
f 679
f 2280
f 2035
f 2048
f 2323
f 2139
f 2350
f 2282
f 286
f 254
f 2183
f 2349
f 982
f 2305
a 2352 11150
f 1262
f 2265
f 224
f 2004
f 43
f 2073
f 1793
f 2320
f 2264
f 2310
a 2353 3159
f 2284
a 2354 2902
f 2184
f 2197
f 1694
f 2127
f 2240
f 2226
f 159
f 2293
f 2154
f 2161
f 2352
f 2129
f 669
f 2221
a 2355 26059
f 991
f 1957
a 2356 31546
a 2357 11350
f 1774
f 2345
f 2232
f 417
a 2358 28973
f 1492
f 1379
f 1144
f 2133
f 2312
f 1830
a 2359 32232
f 2049
f 739
f 2089
f 2321
f 1915
f 1963
f 1959
f 382
f 1623
a 2360 7822
f 1932
f 2274
f 2143
f 2309
f 1343
f 1643
f 2327
f 2270
f 2341
f 2082
a 2361 32636
f 2208
f 2360
a 2362 5651
a 2363 8778
f 2347
f 2213
a 2364 4703
f 2361
f 1804
f 2242
f 1502
f 1174
f 2211
f 2210
f 228
f 2307
a 2365 31402
f 2115
a 2366 10212
f 2223
a 2367 27937
a 2368 12937
a 2369 23008
a 2370 19175
f 2363
f 2078
f 2255
f 2301
f 1375
a 2371 27293
f 2371
f 2094
f 1628
a 2372 31602
f 2220
f 1777
f 2131
f 2160
a 2373 1143
f 1659
f 1811
f 1770
a 2374 6839
f 2366
a 2375 11099
f 2135
f 2362
f 2110
f 115
f 158
f 2313
f 2359
f 2374
f 154
f 2235
f 2346
f 208
f 2344
f 2356
f 2204
a 2376 801
f 2355
a 2377 2932
f 2180
f 2130
f 1056
f 2034
f 2300
f 1667
a 2378 3356
f 2358
f 2375
a 2379 9935
f 2314
f 2316
f 1778
f 2257
f 1748
a 2380 462
f 1631
a 2381 9877
f 2378
f 2365
f 2343
f 2058
f 2372
f 2368
f 2281
f 2334
f 1207
f 2209
f 2377
f 2199
f 2353
f 2379
a 2382 17063
f 577
f 2381
f 2233
f 2298
f 2185
f 2354
f 2382
f 1812
a 2383 4405
f 2336
f 2339
a 2384 3806
f 2296
f 480
f 545
f 1541
a 2385 28437
f 557
f 1563
a 2386 29880
f 2168
a 2387 24462
f 2167
f 2385
f 2276
f 2159
f 2364
f 656
f 2113
f 2046
f 2337
f 161
f 2338
f 906
f 1920
f 2244
f 2342
a 2388 8479
f 25
f 2250
a 2389 5163
f 2286
f 2387
f 2330
f 1639
f 2351
f 2369
f 1408
f 2191
f 2380
a 2390 28019
a 2391 8550
f 1026
f 383
f 2367
f 2324
a 2392 26084
f 1951
f 2218
a 2393 3908
f 2335
f 2376
a 2394 31428
f 2333
a 2395 8531
f 1535
f 250
f 2357
f 2393
f 2177
f 2390
f 2318
f 484
a 2396 27491
f 2395
f 2373
a 2397 8406
f 2391
f 842
f 2383
f 2389
f 2325
f 2394
f 2396
f 2370
a 2398 9319
f 2060
f 95
f 2397
f 2392
f 2388
f 2398
f 1802
f 2386
f 2384
f 1140
a 2399 15570
f 2399
This source diff could not be displayed because it is too large. You can view the blob instead.
20000
6
12
1
a 0 2040
a 1 2040
f 1
a 2 48
a 3 4072
f 3
a 4 4072
f 0
f 2
a 5 4072
f 4
f 5
20000
6
12
1
a 0 2040
a 1 4010
a 2 48
a 3 4072
a 4 4072
a 5 4072
f 0
f 1
f 2
f 3
f 4
f 5
20000
4
10
1
a 0 4072
f 0
a 1 48
a 2 48
a 3 48
f 2
f 1
f 3
a 0 4080
f 0
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment