1 Introduction

For this weeks assignment, I am going to perform an exploratory analysis on data that was collected from the U.S Small business administration. The data ranges from the years 1987 to 2014, and each observation is a loan guaranteed the SBA.This large data set contains 27 variables and 899,164 observations. It is split into nine smaller data sets.

First, we are going to load in the nine data sets and combine them into on large one called ‘loan’.

loan01 = read.csv("https://raw.githubusercontent.com/AvaDeSt/bank_data/refs/heads/main/w06-SBAnational01.csv", header = TRUE)[, -1]
loan02 = read.csv("https://raw.githubusercontent.com/AvaDeSt/bank_data/refs/heads/main/w06-SBAnational02.csv", header = TRUE)[, -1]
loan03 = read.csv("https://raw.githubusercontent.com/AvaDeSt/bank_data/refs/heads/main/w06-SBAnational03.csv", header = TRUE)[, -1]
loan04 = read.csv("https://raw.githubusercontent.com/AvaDeSt/bank_data/refs/heads/main/w06-SBAnational04.csv", header = TRUE)[, -1]
loan05 = read.csv("https://raw.githubusercontent.com/AvaDeSt/bank_data/refs/heads/main/w06-SBAnational05.csv", header = TRUE)[, -1]
loan06 = read.csv("https://raw.githubusercontent.com/AvaDeSt/bank_data/refs/heads/main/w06-SBAnational06.csv", header = TRUE)[, -1]
loan07 = read.csv("https://raw.githubusercontent.com/AvaDeSt/bank_data/refs/heads/main/w06-SBAnational07.csv", header = TRUE)[, -1]
loan08 = read.csv("https://raw.githubusercontent.com/AvaDeSt/bank_data/refs/heads/main/w06-SBAnational08.csv", header = TRUE)[, -1]
loan09 = read.csv("https://raw.githubusercontent.com/AvaDeSt/bank_data/refs/heads/main/w06-SBAnational09.csv", header = TRUE)[, -1]
loan = rbind(loan01, loan02, loan03, loan04, loan05, loan06, loan07, loan08, loan09)
# dim(bankLoan)
#names(bankLoan)

2 Data Preparation

First, I am going to delete all records whose MIS_Status value was missing. This takes the data set down to 897,167 observations.

loans <- na.omit(loan[!is.na(loan$MIS_Status), ])

2.1 Modified Character Value

Now, I am going to stratify the character value ‘State’ into where ever their respective region is located in the United States. This new variable will be called ‘Region’. First, I am going to rename each state with whatever region they are located in the United States and create the stratified variable.

state_to_region <- c(
  'AL' = 'Southeast', 'AK' = 'West', 'AZ' = 'West', 'AR' = 'Southeast', 'CA' = 'West',
  'CO' = 'West', 'CT' = 'Northeast', 'DC' = 'Northeast', 'DE' = 'Northeast', 'FL' = 'Southeast',
  'GA' = 'Southeast', 'HI' = 'West', 'ID' = 'West', 'IL' = 'Midwest', 'IN' = 'Midwest',
  'IA' = 'Midwest', 'KS' = 'Midwest', 'KY' = 'Southeast', 'LA' = 'South', 'ME' = 'Northeast',
  'MD' = 'Northeast', 'MA' = 'Northeast', 'MI' = 'Midwest', 'MN' = 'Midwest',
  'MS' = 'Southeast', 'MO' = 'Midwest', 'MT' = 'West', 'NE' = 'Midwest', 'NV' = 'West',
  'NH' = 'Northeast', 'NJ' = 'Northeast', 'NM' = 'West', 'NY' = 'Northeast',
  'NC' = 'Southeast', 'ND' = 'Midwest', 'OH' = 'Midwest', 'OK' = 'South', 'OR' = 'West',
  'PA' = 'Northeast', 'RI' = 'Northeast', 'SC' = 'Southeast', 'SD' = 'Midwest', 'TN' = 'South',
  'TX' = 'South', 'UT' = 'West', 'VT' = 'Northeast', 'VA' = 'South', 'WA' = 'West',
  'WV' = 'Southeast', 'WI' = 'Midwest', 'WY' = 'West'
)

loans <- loans %>%
  mutate(Region = state_to_region[State])

Now, we can split the data into subsets depending on which region they are located in the United States. There are five regions which are as follows: west, south, Midwest, northeast, and southeast. Now, I will make five separate data sets based on each region.

southeast <- filter(loans, Region == "Southeast")

northeast <- filter(loans, Region == "Northeast")

midwest <- filter(loans, Region == "Midwest")

south <- filter(loans, Region == "South")

west <- filter(loans, Region == "West")

freq.table = table(loans$Region)
kable(t(freq.table)) 
Midwest Northeast South Southeast West
202538 204001 112640 116761 263069

2.2 Defining Clusters

Now, we are going to define clusters using the variable for zip code to use later in a cluster random sample.

clusters <- unique(loans$Zip)

3 Random Sampling Process

In this section, I will take take random samples from the newly modified data set ‘loans’. I will use four different strategies to take four random samples. This will include a simple random sample, a systematic random sample, a stratified random sample, and a cluster random sample.

3.1 Simple Random Sampling

First, I will take a simple random sample, I will use a sample size of 4,000.

loans$sampling.frame = 1:length(loans$GrAppv)   
# sampling list
# names(study.pop)                                     
# checking the sampling list variable
sampled.list = sample(1:length(loans$GrAppv), 4000) 
# sampling the list
SRS.sample = loans[sampled.list,]                  
# extract the sampling units (observations)
## dimension check
dimension.SRS = dim(SRS.sample)
names(dimension.SRS) = c("Size", "Var.count")
kable(t(dimension.SRS)) 
Size Var.count
4000 29

3.2 Systematic Random Sample

Next, I will take a stratified random sample which will also have a sample size of 4,000.

jump.size = dim(loans)[1]%/%4000  
# find the jump size in the systematic sampling
# jump.size
rand.starting.pt=sample(1:jump.size,1) # find the random starting value
sampling.id = seq(rand.starting.pt, dim(loans)[1], jump.size)  # sampling IDs
#length(sampling.id)
sys.sample=loans[sampling.id,]    
# extract the sampling units of systematic samples
sys.Sample.dim = dim(sys.sample)
names(sys.Sample.dim) = c("Size", "Var.count")
kable(t(sys.Sample.dim))
Size Var.count
4013 29

As we can see, the actual sample we get using this method is 4013, despite the target size being 4000. This is because the jump size involves rounding error and the population is large.

3.3 Stratified Random Sample

Now, we will take a stratified random sample based on the Region Variable that we created previously. First we will take the SRS from each stratum

freq.table = table(loans$Region)  
rel.freq = freq.table/sum(freq.table)   
strata.size = round(rel.freq*4000)     
strata.names=names(strata.size) 


kable(t(strata.size)) 
Midwest Northeast South Southeast West
901 908 501 520 1170

Now, we will take a stratified sample.

strata.sample = loans[1,]    
strata.sample$add.id = 1   
                          
for (i in 1:length(strata.names)){
   ith.strata.names = strata.names[i]   
   ith.strata.size = strata.size[i]     
   
   ith.sampling.id = which(loans$Region==ith.strata.names) 
   ith.strata = loans[ith.sampling.id,]  
   ith.strata$add.id = 1:dim(ith.strata)[1]  

   ith.sampling.id = sample(1:dim(ith.strata)[1], ith.strata.size) 

   ith.sample =ith.strata[ith.strata$add.id %in%ith.sampling.id,]
  
   strata.sample = rbind(strata.sample, ith.sample) 
 }

 strat.sample.final = strata.sample[-1,]

3.4 Cluster Sample

Finally, we will take a cluster random sample from the cluster identified earlier based on the variable for zip code.

set.seed(123) 

sampled_clusters <- sample(clusters, size = 10)  

sampled_data <- loans %>% filter(Zip %in% sampled_clusters)

head(sampled_data)
  LoanNr_ChkDgt                           Name      City State   Zip
1    1025315002      Northeast Collision, Inc.      ELMA    NY 14059
2    1028384000  PIONEER INDUSTRIAL SALES, LLC KINGSPORT    TN 37660
3    1116524005  CHRISTOPHER DAVID'S STUDIO OF      ELMA    NY 14059
4    1116555010           Altech, Incorporated KINGSPORT    TN 37660
5    1179315005 JAMES A CARR DBA GOLFER'S EDGE KINGSPORT    TN 37660
6    1187614005   MUSSETTER DISTRIBUTING, INC.    AUBURN    CA 95602
                           Bank BankState  NAICS ApprovalDate ApprovalFY Term
1 MANUFACTURERS & TRADERS TR CO        NY 811121    20-Jul-04       2004   48
2                1ST BK & TR CO        VA      0    12-Mar-97       1997   84
3    BANK OF AMERICA NATL ASSOC        RI      0    10-Apr-97       1997   60
4    BANK OF AMERICA NATL ASSOC        NC 811212     1-Dec-04       2005   84
5        CAPITAL ONE NATL ASSOC        VA 451110     2-Feb-05       2005   30
6    MUFG UNION BANK NATL ASSOC        CA 422810     1-May-97       1997  120
  NoEmp NewExist CreateJob RetainedJob FranchiseCode UrbanRural RevLineCr
1    30        1         0           0         10729          2         Y
2     3        2         0           0             1          0         N
3     4        1         0           0             1          0         N
4     6        1         0           0             1          1         Y
5     5        1         1           5             1          1         N
6    25        1         0           0             1          0         N
  LowDoc ChgOffDate DisbursementDate DisbursementGross BalanceGross MIS_Status
1      N                   31-Aug-04      $450,890.00        $0.00       P I F
2      Y                   30-Apr-97       $50,000.00        $0.00       P I F
3      Y                   28-Apr-97       $10,000.00        $0.00       P I F
4      N                   31-Dec-04       $50,000.00        $0.00       P I F
5      N  11-Feb-10        28-Feb-05       $50,000.00        $0.00      CHGOFF
6      N                   31-Jul-97      $550,000.00        $0.00       P I F
  ChgOffPrinGr       GrAppv     SBA_Appv    Region sampling.frame
1       $0.00  $200,000.00  $100,000.00  Northeast           3753
2       $0.00   $50,000.00   $40,000.00      South           4158
3       $0.00   $10,000.00    $8,000.00  Northeast          16031
4       $0.00   $50,000.00   $25,000.00      South          16036
5  $24,695.00   $50,000.00   $25,000.00      South          23882
6       $0.00  $550,000.00  $412,500.00       West          24976

4 Summary and Conclusion

For this assignment we looked at a large data set containing bank loan information from the SBA. After combining all of our data into one large data set, we performed some data cleaning be removing missing values from the MIS_Status variable, and defined our stratified variable which was region. We then took four different random samples, a simple, systematic, stratified, and cluster random sample. For the simple, systematic, and stratified random samples, I used a sample size of 4000. For the cluster random sample, we used the variable for zip code. The samples yielded were all different and had certain advantages. for example, the simple random sample was the most ‘random’ of them all. But the cluster random sample is likely the most practical since it would be the most cost effective in a real experiment. While a stratified random sample is best if you want samples only from certain demographics of a population. The optimal random sample to use depends on the study or experiment being performed.

LS0tDQp0aXRsZTogIlNhbXBsaW5nIE1ldGhvZHMgZm9yIEJhbmtpbmcgRGF0YSINCmF1dGhvcjogJ0F2YSBEZVN0ZWZhbm8nDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBmaWdfd2lkdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCmFsd2F5c19hbGxvd19odG1sOiB0cnVlDQotLS0NCg0KYGBgez1odG1sfQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQovKiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzIChDU1MpIGlzIGEgc3R5bGVzaGVldCBsYW5ndWFnZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBwcmVzZW50YXRpb24gb2YgYSBkb2N1bWVudCB3cml0dGVuIGluIEhUTUwgb3IgWE1MLiBpdCBpcyBhIHNpbXBsZSBtZWNoYW5pc20gZm9yIGFkZGluZyBzdHlsZSAoZS5nLiwgZm9udHMsIGNvbG9ycywgc3BhY2luZykgdG8gV2ViIGRvY3VtZW50cy4gKi8NCg0KaDEudGl0bGUgeyAgLyogVGl0bGUgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIHRoZSByZXBvcnQgdGl0bGUgKi8NCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogbmF2eTsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBhdXRob3JzICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgNCBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQo8L3N0eWxlPg0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoIk1BU1MiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiTUFTUyIpDQogICBsaWJyYXJ5KE1BU1MpDQp9DQoNCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCmxpYnJhcnkoZ2dwbG90MikNCn0NCg0KaWYgKCFyZXF1aXJlKCJjbHVzdGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImNsdXN0ZXIiKQ0KbGlicmFyeShjbHVzdGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJkcGx5ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQpsaWJyYXJ5KGRwbHlyKQ0KfQ0KDQppZiAoIXJlcXVpcmUoImxlc3NSIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxlc3NSIikNCiAgIGxpYnJhcnkobGVzc1IpDQp9DQojIGxpYnJhcnkoY2x1c3RlcikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUUlVFLCAgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANCg0KDQojIEludHJvZHVjdGlvbg0KDQpGb3IgdGhpcyB3ZWVrcyBhc3NpZ25tZW50LCBJIGFtIGdvaW5nIHRvIHBlcmZvcm0gYW4gZXhwbG9yYXRvcnkgYW5hbHlzaXMNCm9uIGRhdGEgdGhhdCB3YXMgY29sbGVjdGVkIGZyb20gdGhlIFUuUyBTbWFsbCBidXNpbmVzcyBhZG1pbmlzdHJhdGlvbi4gVGhlDQpkYXRhIHJhbmdlcyBmcm9tIHRoZSB5ZWFycyAxOTg3IHRvIDIwMTQsIGFuZCBlYWNoIG9ic2VydmF0aW9uIGlzIGEgbG9hbiBndWFyYW50ZWVkIA0KdGhlIFNCQS5UaGlzIGxhcmdlIGRhdGEgc2V0IGNvbnRhaW5zIDI3IHZhcmlhYmxlcyBhbmQgODk5LDE2NCBvYnNlcnZhdGlvbnMuIA0KSXQgaXMgc3BsaXQgaW50byBuaW5lIHNtYWxsZXIgZGF0YSBzZXRzLg0KDQpGaXJzdCwgd2UgYXJlIGdvaW5nIHRvIGxvYWQgaW4gdGhlIG5pbmUgZGF0YSBzZXRzIGFuZCBjb21iaW5lIHRoZW0gaW50byBvbiBsYXJnZSBvbmUgY2FsbGVkICdsb2FuJy4NCg0KDQoNCmBgYHtyfQ0KbG9hbjAxID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9BdmFEZVN0L2JhbmtfZGF0YS9yZWZzL2hlYWRzL21haW4vdzA2LVNCQW5hdGlvbmFsMDEuY3N2IiwgaGVhZGVyID0gVFJVRSlbLCAtMV0NCmxvYW4wMiA9IHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vQXZhRGVTdC9iYW5rX2RhdGEvcmVmcy9oZWFkcy9tYWluL3cwNi1TQkFuYXRpb25hbDAyLmNzdiIsIGhlYWRlciA9IFRSVUUpWywgLTFdDQpsb2FuMDMgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0F2YURlU3QvYmFua19kYXRhL3JlZnMvaGVhZHMvbWFpbi93MDYtU0JBbmF0aW9uYWwwMy5jc3YiLCBoZWFkZXIgPSBUUlVFKVssIC0xXQ0KbG9hbjA0ID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9BdmFEZVN0L2JhbmtfZGF0YS9yZWZzL2hlYWRzL21haW4vdzA2LVNCQW5hdGlvbmFsMDQuY3N2IiwgaGVhZGVyID0gVFJVRSlbLCAtMV0NCmxvYW4wNSA9IHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vQXZhRGVTdC9iYW5rX2RhdGEvcmVmcy9oZWFkcy9tYWluL3cwNi1TQkFuYXRpb25hbDA1LmNzdiIsIGhlYWRlciA9IFRSVUUpWywgLTFdDQpsb2FuMDYgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0F2YURlU3QvYmFua19kYXRhL3JlZnMvaGVhZHMvbWFpbi93MDYtU0JBbmF0aW9uYWwwNi5jc3YiLCBoZWFkZXIgPSBUUlVFKVssIC0xXQ0KbG9hbjA3ID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9BdmFEZVN0L2JhbmtfZGF0YS9yZWZzL2hlYWRzL21haW4vdzA2LVNCQW5hdGlvbmFsMDcuY3N2IiwgaGVhZGVyID0gVFJVRSlbLCAtMV0NCmxvYW4wOCA9IHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vQXZhRGVTdC9iYW5rX2RhdGEvcmVmcy9oZWFkcy9tYWluL3cwNi1TQkFuYXRpb25hbDA4LmNzdiIsIGhlYWRlciA9IFRSVUUpWywgLTFdDQpsb2FuMDkgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0F2YURlU3QvYmFua19kYXRhL3JlZnMvaGVhZHMvbWFpbi93MDYtU0JBbmF0aW9uYWwwOS5jc3YiLCBoZWFkZXIgPSBUUlVFKVssIC0xXQ0KbG9hbiA9IHJiaW5kKGxvYW4wMSwgbG9hbjAyLCBsb2FuMDMsIGxvYW4wNCwgbG9hbjA1LCBsb2FuMDYsIGxvYW4wNywgbG9hbjA4LCBsb2FuMDkpDQojIGRpbShiYW5rTG9hbikNCiNuYW1lcyhiYW5rTG9hbikNCmBgYA0KDQojIERhdGEgUHJlcGFyYXRpb24NCg0KRmlyc3QsIEkgYW0gZ29pbmcgdG8gZGVsZXRlIGFsbCByZWNvcmRzIHdob3NlIE1JU19TdGF0dXMgdmFsdWUgd2FzIG1pc3NpbmcuIFRoaXMgdGFrZXMgdGhlIGRhdGENCnNldCBkb3duIHRvIDg5NywxNjcgb2JzZXJ2YXRpb25zLg0KYGBge3J9DQpsb2FucyA8LSBuYS5vbWl0KGxvYW5bIWlzLm5hKGxvYW4kTUlTX1N0YXR1cyksIF0pDQpgYGANCg0KDQojIyBNb2RpZmllZCBDaGFyYWN0ZXIgVmFsdWUgDQoNCk5vdywgSSBhbSBnb2luZyB0byBzdHJhdGlmeSB0aGUgY2hhcmFjdGVyIHZhbHVlICdTdGF0ZScgaW50byB3aGVyZSBldmVyIHRoZWlyIHJlc3BlY3RpdmUgcmVnaW9uIGlzIGxvY2F0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMuIFRoaXMgbmV3IHZhcmlhYmxlIHdpbGwgYmUgY2FsbGVkICdSZWdpb24nLiBGaXJzdCwgSSBhbSBnb2luZyB0byByZW5hbWUgZWFjaCBzdGF0ZSB3aXRoIHdoYXRldmVyIHJlZ2lvbiB0aGV5IGFyZSBsb2NhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZCBjcmVhdGUgdGhlIHN0cmF0aWZpZWQgdmFyaWFibGUuDQoNCg0KYGBge3J9DQpzdGF0ZV90b19yZWdpb24gPC0gYygNCiAgJ0FMJyA9ICdTb3V0aGVhc3QnLCAnQUsnID0gJ1dlc3QnLCAnQVonID0gJ1dlc3QnLCAnQVInID0gJ1NvdXRoZWFzdCcsICdDQScgPSAnV2VzdCcsDQogICdDTycgPSAnV2VzdCcsICdDVCcgPSAnTm9ydGhlYXN0JywgJ0RDJyA9ICdOb3J0aGVhc3QnLCAnREUnID0gJ05vcnRoZWFzdCcsICdGTCcgPSAnU291dGhlYXN0JywNCiAgJ0dBJyA9ICdTb3V0aGVhc3QnLCAnSEknID0gJ1dlc3QnLCAnSUQnID0gJ1dlc3QnLCAnSUwnID0gJ01pZHdlc3QnLCAnSU4nID0gJ01pZHdlc3QnLA0KICAnSUEnID0gJ01pZHdlc3QnLCAnS1MnID0gJ01pZHdlc3QnLCAnS1knID0gJ1NvdXRoZWFzdCcsICdMQScgPSAnU291dGgnLCAnTUUnID0gJ05vcnRoZWFzdCcsDQogICdNRCcgPSAnTm9ydGhlYXN0JywgJ01BJyA9ICdOb3J0aGVhc3QnLCAnTUknID0gJ01pZHdlc3QnLCAnTU4nID0gJ01pZHdlc3QnLA0KICAnTVMnID0gJ1NvdXRoZWFzdCcsICdNTycgPSAnTWlkd2VzdCcsICdNVCcgPSAnV2VzdCcsICdORScgPSAnTWlkd2VzdCcsICdOVicgPSAnV2VzdCcsDQogICdOSCcgPSAnTm9ydGhlYXN0JywgJ05KJyA9ICdOb3J0aGVhc3QnLCAnTk0nID0gJ1dlc3QnLCAnTlknID0gJ05vcnRoZWFzdCcsDQogICdOQycgPSAnU291dGhlYXN0JywgJ05EJyA9ICdNaWR3ZXN0JywgJ09IJyA9ICdNaWR3ZXN0JywgJ09LJyA9ICdTb3V0aCcsICdPUicgPSAnV2VzdCcsDQogICdQQScgPSAnTm9ydGhlYXN0JywgJ1JJJyA9ICdOb3J0aGVhc3QnLCAnU0MnID0gJ1NvdXRoZWFzdCcsICdTRCcgPSAnTWlkd2VzdCcsICdUTicgPSAnU291dGgnLA0KICAnVFgnID0gJ1NvdXRoJywgJ1VUJyA9ICdXZXN0JywgJ1ZUJyA9ICdOb3J0aGVhc3QnLCAnVkEnID0gJ1NvdXRoJywgJ1dBJyA9ICdXZXN0JywNCiAgJ1dWJyA9ICdTb3V0aGVhc3QnLCAnV0knID0gJ01pZHdlc3QnLCAnV1knID0gJ1dlc3QnDQopDQoNCmxvYW5zIDwtIGxvYW5zICU+JQ0KICBtdXRhdGUoUmVnaW9uID0gc3RhdGVfdG9fcmVnaW9uW1N0YXRlXSkNCg0KYGBgDQoNCk5vdywgd2UgY2FuIHNwbGl0IHRoZSBkYXRhIGludG8gc3Vic2V0cyBkZXBlbmRpbmcgb24gd2hpY2ggcmVnaW9uIHRoZXkgYXJlIGxvY2F0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMuIFRoZXJlIGFyZSBmaXZlIHJlZ2lvbnMgd2hpY2ggYXJlIGFzIGZvbGxvd3M6IHdlc3QsIHNvdXRoLCBNaWR3ZXN0LCBub3J0aGVhc3QsIGFuZCBzb3V0aGVhc3QuIE5vdywgSSB3aWxsIG1ha2UgZml2ZSBzZXBhcmF0ZSBkYXRhIHNldHMgYmFzZWQgb24gZWFjaCByZWdpb24uIA0KDQpgYGB7cn0NCnNvdXRoZWFzdCA8LSBmaWx0ZXIobG9hbnMsIFJlZ2lvbiA9PSAiU291dGhlYXN0IikNCg0Kbm9ydGhlYXN0IDwtIGZpbHRlcihsb2FucywgUmVnaW9uID09ICJOb3J0aGVhc3QiKQ0KDQptaWR3ZXN0IDwtIGZpbHRlcihsb2FucywgUmVnaW9uID09ICJNaWR3ZXN0IikNCg0Kc291dGggPC0gZmlsdGVyKGxvYW5zLCBSZWdpb24gPT0gIlNvdXRoIikNCg0Kd2VzdCA8LSBmaWx0ZXIobG9hbnMsIFJlZ2lvbiA9PSAiV2VzdCIpDQoNCmZyZXEudGFibGUgPSB0YWJsZShsb2FucyRSZWdpb24pDQprYWJsZSh0KGZyZXEudGFibGUpKSANCmBgYA0KDQojIyBEZWZpbmluZyBDbHVzdGVycw0KDQpOb3csIHdlIGFyZSBnb2luZyB0byBkZWZpbmUgY2x1c3RlcnMgdXNpbmcgdGhlIHZhcmlhYmxlIGZvciB6aXAgY29kZSB0byB1c2UgbGF0ZXIgaW4gYSBjbHVzdGVyIHJhbmRvbSBzYW1wbGUuIA0KYGBge3J9DQpjbHVzdGVycyA8LSB1bmlxdWUobG9hbnMkWmlwKQ0KYGBgDQoNCg0KIyBSYW5kb20gU2FtcGxpbmcgUHJvY2Vzcw0KDQpJbiB0aGlzIHNlY3Rpb24sIEkgd2lsbCB0YWtlIHRha2UgcmFuZG9tIHNhbXBsZXMgZnJvbSB0aGUgbmV3bHkgbW9kaWZpZWQgZGF0YSBzZXQgJ2xvYW5zJy4gSSB3aWxsIHVzZSBmb3VyIGRpZmZlcmVudCBzdHJhdGVnaWVzIHRvIHRha2UgZm91ciByYW5kb20gc2FtcGxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYSBzaW1wbGUgcmFuZG9tIHNhbXBsZSwgYSBzeXN0ZW1hdGljIHJhbmRvbSBzYW1wbGUsIGEgc3RyYXRpZmllZCByYW5kb20gc2FtcGxlLCBhbmQgYSBjbHVzdGVyIHJhbmRvbSBzYW1wbGUuIA0KDQojIyBTaW1wbGUgUmFuZG9tIFNhbXBsaW5nDQoNCkZpcnN0LCBJIHdpbGwgdGFrZSBhIHNpbXBsZSByYW5kb20gc2FtcGxlLCBJIHdpbGwgdXNlIGEgc2FtcGxlIHNpemUgb2YgNCwwMDAuIA0KYGBge3J9DQpsb2FucyRzYW1wbGluZy5mcmFtZSA9IDE6bGVuZ3RoKGxvYW5zJEdyQXBwdikgICANCiMgc2FtcGxpbmcgbGlzdA0KIyBuYW1lcyhzdHVkeS5wb3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KIyBjaGVja2luZyB0aGUgc2FtcGxpbmcgbGlzdCB2YXJpYWJsZQ0Kc2FtcGxlZC5saXN0ID0gc2FtcGxlKDE6bGVuZ3RoKGxvYW5zJEdyQXBwdiksIDQwMDApIA0KIyBzYW1wbGluZyB0aGUgbGlzdA0KU1JTLnNhbXBsZSA9IGxvYW5zW3NhbXBsZWQubGlzdCxdICAgICAgICAgICAgICAgICAgDQojIGV4dHJhY3QgdGhlIHNhbXBsaW5nIHVuaXRzIChvYnNlcnZhdGlvbnMpDQojIyBkaW1lbnNpb24gY2hlY2sNCmRpbWVuc2lvbi5TUlMgPSBkaW0oU1JTLnNhbXBsZSkNCm5hbWVzKGRpbWVuc2lvbi5TUlMpID0gYygiU2l6ZSIsICJWYXIuY291bnQiKQ0Ka2FibGUodChkaW1lbnNpb24uU1JTKSkgDQpgYGANCg0KIyMgU3lzdGVtYXRpYyBSYW5kb20gU2FtcGxlDQoNCk5leHQsIEkgd2lsbCB0YWtlIGEgc3RyYXRpZmllZCByYW5kb20gc2FtcGxlIHdoaWNoIHdpbGwgYWxzbyBoYXZlIGEgc2FtcGxlIHNpemUgb2YgNCwwMDAuDQoNCmBgYHtyfQ0KanVtcC5zaXplID0gZGltKGxvYW5zKVsxXSUvJTQwMDAgIA0KIyBmaW5kIHRoZSBqdW1wIHNpemUgaW4gdGhlIHN5c3RlbWF0aWMgc2FtcGxpbmcNCiMganVtcC5zaXplDQpyYW5kLnN0YXJ0aW5nLnB0PXNhbXBsZSgxOmp1bXAuc2l6ZSwxKSAjIGZpbmQgdGhlIHJhbmRvbSBzdGFydGluZyB2YWx1ZQ0Kc2FtcGxpbmcuaWQgPSBzZXEocmFuZC5zdGFydGluZy5wdCwgZGltKGxvYW5zKVsxXSwganVtcC5zaXplKSAgIyBzYW1wbGluZyBJRHMNCiNsZW5ndGgoc2FtcGxpbmcuaWQpDQpzeXMuc2FtcGxlPWxvYW5zW3NhbXBsaW5nLmlkLF0gICAgDQojIGV4dHJhY3QgdGhlIHNhbXBsaW5nIHVuaXRzIG9mIHN5c3RlbWF0aWMgc2FtcGxlcw0Kc3lzLlNhbXBsZS5kaW0gPSBkaW0oc3lzLnNhbXBsZSkNCm5hbWVzKHN5cy5TYW1wbGUuZGltKSA9IGMoIlNpemUiLCAiVmFyLmNvdW50IikNCmthYmxlKHQoc3lzLlNhbXBsZS5kaW0pKQ0KYGBgDQpBcyB3ZSBjYW4gc2VlLCB0aGUgYWN0dWFsIHNhbXBsZSB3ZSBnZXQgdXNpbmcgdGhpcyBtZXRob2QgaXMgNDAxMywgZGVzcGl0ZSB0aGUgdGFyZ2V0IHNpemUgYmVpbmcgNDAwMC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBqdW1wIHNpemUgaW52b2x2ZXMgcm91bmRpbmcgZXJyb3IgYW5kIHRoZSBwb3B1bGF0aW9uIGlzIGxhcmdlLiANCg0KIyMgU3RyYXRpZmllZCBSYW5kb20gU2FtcGxlDQoNCk5vdywgd2Ugd2lsbCB0YWtlIGEgc3RyYXRpZmllZCByYW5kb20gc2FtcGxlIGJhc2VkIG9uIHRoZSBSZWdpb24gVmFyaWFibGUgIHRoYXQgd2UgY3JlYXRlZCBwcmV2aW91c2x5LiBGaXJzdCB3ZSB3aWxsIHRha2UgdGhlIFNSUyBmcm9tIGVhY2ggc3RyYXR1bSANCg0KYGBge3J9DQpmcmVxLnRhYmxlID0gdGFibGUobG9hbnMkUmVnaW9uKSAgDQpyZWwuZnJlcSA9IGZyZXEudGFibGUvc3VtKGZyZXEudGFibGUpICAgDQpzdHJhdGEuc2l6ZSA9IHJvdW5kKHJlbC5mcmVxKjQwMDApICAgICANCnN0cmF0YS5uYW1lcz1uYW1lcyhzdHJhdGEuc2l6ZSkgDQoNCg0Ka2FibGUodChzdHJhdGEuc2l6ZSkpIA0KYGBgDQoNCk5vdywgd2Ugd2lsbCB0YWtlIGEgc3RyYXRpZmllZCBzYW1wbGUuDQoNCmBgYHtyfQ0Kc3RyYXRhLnNhbXBsZSA9IGxvYW5zWzEsXSAgICANCnN0cmF0YS5zYW1wbGUkYWRkLmlkID0gMSAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICANCmZvciAoaSBpbiAxOmxlbmd0aChzdHJhdGEubmFtZXMpKXsNCiAgIGl0aC5zdHJhdGEubmFtZXMgPSBzdHJhdGEubmFtZXNbaV0gICANCiAgIGl0aC5zdHJhdGEuc2l6ZSA9IHN0cmF0YS5zaXplW2ldICAgICANCiAgIA0KICAgaXRoLnNhbXBsaW5nLmlkID0gd2hpY2gobG9hbnMkUmVnaW9uPT1pdGguc3RyYXRhLm5hbWVzKSANCiAgIGl0aC5zdHJhdGEgPSBsb2Fuc1tpdGguc2FtcGxpbmcuaWQsXSAgDQogICBpdGguc3RyYXRhJGFkZC5pZCA9IDE6ZGltKGl0aC5zdHJhdGEpWzFdICANCg0KICAgaXRoLnNhbXBsaW5nLmlkID0gc2FtcGxlKDE6ZGltKGl0aC5zdHJhdGEpWzFdLCBpdGguc3RyYXRhLnNpemUpIA0KDQogICBpdGguc2FtcGxlID1pdGguc3RyYXRhW2l0aC5zdHJhdGEkYWRkLmlkICVpbiVpdGguc2FtcGxpbmcuaWQsXQ0KICANCiAgIHN0cmF0YS5zYW1wbGUgPSByYmluZChzdHJhdGEuc2FtcGxlLCBpdGguc2FtcGxlKSANCiB9DQoNCiBzdHJhdC5zYW1wbGUuZmluYWwgPSBzdHJhdGEuc2FtcGxlWy0xLF0NCmBgYA0KDQojIyBDbHVzdGVyIFNhbXBsZQ0KIA0KIEZpbmFsbHksIHdlIHdpbGwgdGFrZSBhIGNsdXN0ZXIgcmFuZG9tIHNhbXBsZSBmcm9tIHRoZSBjbHVzdGVyIGlkZW50aWZpZWQgZWFybGllciBiYXNlZCBvbiB0aGUgdmFyaWFibGUgZm9yIHppcCBjb2RlLiANCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKSANCg0Kc2FtcGxlZF9jbHVzdGVycyA8LSBzYW1wbGUoY2x1c3RlcnMsIHNpemUgPSAxMCkgIA0KDQpzYW1wbGVkX2RhdGEgPC0gbG9hbnMgJT4lIGZpbHRlcihaaXAgJWluJSBzYW1wbGVkX2NsdXN0ZXJzKQ0KDQpoZWFkKHNhbXBsZWRfZGF0YSkNCmBgYA0KDQojIFN1bW1hcnkgYW5kIENvbmNsdXNpb24NCg0KRm9yIHRoaXMgYXNzaWdubWVudCB3ZSBsb29rZWQgYXQgYSBsYXJnZSBkYXRhIHNldCBjb250YWluaW5nIGJhbmsgbG9hbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBTQkEuIEFmdGVyIGNvbWJpbmluZyBhbGwgb2Ygb3VyIGRhdGEgaW50byBvbmUgbGFyZ2UgZGF0YSBzZXQsIHdlIHBlcmZvcm1lZCBzb21lIGRhdGEgY2xlYW5pbmcgYmUgcmVtb3ZpbmcgbWlzc2luZyB2YWx1ZXMgZnJvbSB0aGUgTUlTX1N0YXR1cyB2YXJpYWJsZSwgYW5kIGRlZmluZWQgb3VyIHN0cmF0aWZpZWQgdmFyaWFibGUgd2hpY2ggd2FzIHJlZ2lvbi4gV2UgdGhlbiB0b29rIGZvdXIgZGlmZmVyZW50IHJhbmRvbSBzYW1wbGVzLCBhIHNpbXBsZSwgc3lzdGVtYXRpYywgc3RyYXRpZmllZCwgYW5kIGNsdXN0ZXIgcmFuZG9tIHNhbXBsZS4gRm9yIHRoZSBzaW1wbGUsIHN5c3RlbWF0aWMsIGFuZCBzdHJhdGlmaWVkIHJhbmRvbSBzYW1wbGVzLCBJIHVzZWQgYSBzYW1wbGUgc2l6ZSBvZiA0MDAwLiBGb3IgdGhlIGNsdXN0ZXIgcmFuZG9tIHNhbXBsZSwgd2UgdXNlZCB0aGUgdmFyaWFibGUgIGZvciB6aXAgY29kZS4gVGhlIHNhbXBsZXMgeWllbGRlZCB3ZXJlIGFsbCBkaWZmZXJlbnQgYW5kIGhhZCBjZXJ0YWluIGFkdmFudGFnZXMuIGZvciBleGFtcGxlLCB0aGUgc2ltcGxlIHJhbmRvbSBzYW1wbGUgd2FzIHRoZSBtb3N0ICdyYW5kb20nIG9mIHRoZW0gYWxsLiBCdXQgdGhlIGNsdXN0ZXIgcmFuZG9tIHNhbXBsZSBpcyBsaWtlbHkgdGhlIG1vc3QgcHJhY3RpY2FsIHNpbmNlIGl0IHdvdWxkIGJlIHRoZSBtb3N0IGNvc3QgZWZmZWN0aXZlIGluIGEgcmVhbCBleHBlcmltZW50LiBXaGlsZSBhIHN0cmF0aWZpZWQgcmFuZG9tIHNhbXBsZSBpcyBiZXN0IGlmIHlvdSB3YW50IHNhbXBsZXMgb25seSBmcm9tIGNlcnRhaW4gZGVtb2dyYXBoaWNzIG9mIGEgcG9wdWxhdGlvbi4gVGhlIG9wdGltYWwgcmFuZG9tIHNhbXBsZSB0byB1c2UgZGVwZW5kcyBvbiB0aGUgc3R1ZHkgb3IgZXhwZXJpbWVudCBiZWluZyBwZXJmb3JtZWQuIA==