Update 07/27/2017

RChunk in Getting Data with census API was hidden due to echo = FALSE. It is now visible. To run: obtain an API Key at https://www.census.gov/developers/ and store in local directory as file name = CensusAPIKEY and format csv, first row, first column. APIKEY Variable is set to read from this file and the local directory path.

Setting Up Data

Getting Data with census API

library(RCurl)
library(data.table)
APIKEY <- fread(file.path(getwd(),paste("CensusAPIKEY",".csv",sep = "")), header = TRUE)
censusGEOURL <- paste0("https://api.census.gov/data/2016/pep/population?get=POP,DENSITY,GEONAME&for=state:*&key=",APIKEY)
censusAGEURL <- paste0("https://api.census.gov/data/2016/pep/natmonthly?get=POP,MONTHLY,AGE,GEONAME&for=us:*&key=",APIKEY)
rm(APIKEY)

Parsing Data: Population and Geography

library(jsonlite)
### this is to parse the census for us population by state, no age.
myjsoncensus <- jsonlite::fromJSON(txt = censusGEOURL)
uspop <- as.data.frame(myjsoncensus)
names(uspop) <- as.character(unlist(uspop[1,]))
uspop <- uspop[-1,]
uspop$POP <- as.numeric(as.character(uspop$POP))
uspop$DENSITY <- as.numeric(as.character(uspop$DENSITY))

Parsing Data: Population,Month, and Age

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

### this is to parse the census for us population by age and month 
myjsoncensusAGE <- jsonlite::fromJSON(txt = censusAGEURL)
uspopAGE <- as.data.frame(myjsoncensusAGE)
names(uspopAGE) <- as.character(unlist(uspopAGE[1,]))
uspopAGE <- uspopAGE[-1,]
uspopAGE$POP <- as.numeric(as.character(uspopAGE$POP))
uspopAGE$AGE <- as.numeric(as.character(uspopAGE$AGE))
uspopAGE$MONTHLY <- as.numeric(as.character(uspopAGE$MONTHLY))

Going Through Data

Population By Age for Dec 2016

Population seems uniform.

#plot filtered to dec 2016
uspopAGEDist <- uspopAGE[which((uspopAGE$AGE <= 80) & (uspopAGE$AGE >= 1) & (uspopAGE$MONTHLY == 94)),]
plot(x=uspopAGEDist$AGE, y=(uspopAGEDist$POP/1000), type = "h", xlab = "AGE", ylab = "Population ('000s)")

Pct Gains and Decline By Age

The changes in population fluctate between gains and losses plus or minus 5 percent, so the number that went from one age to another, is followed by a close figure to replace them. Keeping the number of populants in the early age category giving more of a uniform distribution to the entire us population and age

av <- zoo::zoo(uspopAGEDist$POP)
agelag <- as.data.frame(lag(av,k = -1, na.pad = TRUE))
names(agelag) <- c("agelagyr")
agelagcombined <-  as.data.frame(cbind(uspopAGEDist, agelag[1]))
agelagcombined_pct <-  as.data.frame(((agelagcombined$POP - agelagcombined$agelagyr)
                                      /agelagcombined$agelagyr)*100)
names(agelagcombined_pct) <- c("pct_chg")
agelagcombined <-  as.data.frame(cbind(agelagcombined, agelagcombined_pct[1]))
plot(agelagcombined$pct_chg, type = "o")

Normal Distribution: Population Values

Setting Up Distributions

Using the values for one two and three standard deviations Use either method to return population value :

onedev <- .68*max(uspop$POP)
twodev <- .95*max(uspop$POP)
threedev <- .9967*max(uspop$POP)
  • One Deviation : 26690011.56
  • Two Deviation: 37287516.15
  • Three Deviation: 37287516.15

or use this quickly built basic function and enter a value between 1 and 3:

QtyPopulationByDev <- function(no_deviations = 1){
  if(no_deviations == 1){devValue <- .68*max(uspop$POP)}
      else if(no_deviations == 2){devValue <- .95*max(uspop$POP)}
          else if(no_deviations == 3){devValue <- .9967*max(uspop$POP)}
  return(devValue)
}

So 2 deviations results in 3.728751610^{7}

Age range estimates per deviation: Normal Distribution

#age range between 1 and 80 at 1 deviation
agemedian <- 80/2
AgeonedevLow <- (agemedian*(1-(.68/2)))
AgeonedevHigh <- (agemedian*(1+(.68/2)))
# normal distribution on 2 deviations. 95 percent
AgetwodevLow <- (agemedian*(1-(.95/2)))
AgetwodevHigh <- (agemedian*(1+(.95/2)))
#normal at 3 deviations, 99.7
AgethreedevLow <- (agemedian*(1-(.997/2)))
AgethreedevHigh <- (agemedian*(1+(.997/2)))

Using the source above:

  • The population falls between 26 and 54 at 1 deviation
  • The population falls between 21 and 59 at 2 deviations
  • The population falls between 20 and 60 at 3 deviations

Based on a normal distribution, what amount of population do not have credit cards based on legal age to apply?

# normal distribution outside 95 percent that are cannot have credit cards
qty_Popul_earlyAge <- (((1-.95)/2)*sum(uspop$POP))
CensusEarlyAge <- sum(uspopAGEDist[which(uspopAGEDist$AGE >= 1 & uspopAGEDist$AGE <= 21),"POP"])
CensusAdultAge <- sum(uspopAGEDist[which(uspopAGEDist$AGE >= 21),"POP"])
Total_Number_CreditCards <- as.numeric(1895834000)                
Total_Number_CardHolders <- as.numeric(199800000)  
  • 8163471 are left of the distribution outside of 2 deviations or 95 percent that do have credit cards.
  • 86795911 is the actual value that is given in the census data for December 2016
  • 78632440 is a large difference, which makes sense looking at the trend that about 5 percent flow from one age bracket to another, and resulting in a uniform distribution as seen on the Census Chart (see Going Through Data graphs).

  • 228760509 are probably eligble for a credit card. According to statistics brain (from source derived from FRBNY) there are 1895834000 number of credit cards and 199800000 cardholders. Thats about 9 credit cards per cardholder.

Licensed Under GNU AFFERO GENERAL PUBLIC LICENSE
<Quick Sample of Distribution of Population>
Copyright (C) 2017  Michael Garcia. All Rights Reserved.
Contact: mgar_datascience at protonmail dot com 

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
LS0tCnRpdGxlOiAiUXVpY2sgQ3JlZGl0IENhcmQgUXVlc3Rpb24gU2FtcGxlIgphdXRob3I6ICJNaWNoYWVsIEdhcmNpYSIKZGF0ZTogIjcvMjUvMjAxNyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyMjIyMgVXBkYXRlIDA3LzI3LzIwMTcKICBSQ2h1bmsgaW4gR2V0dGluZyBEYXRhIHdpdGggY2Vuc3VzIEFQSSB3YXMgaGlkZGVuIGR1ZSB0byBlY2hvID0gRkFMU0UuIEl0IGlzIG5vdyB2aXNpYmxlLiBUbyBydW46IG9idGFpbiBhbiBBUEkgS2V5IGF0IGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvZGV2ZWxvcGVycy8gYW5kIHN0b3JlIGluIGxvY2FsIGRpcmVjdG9yeSBhcyBmaWxlIG5hbWUgPSBDZW5zdXNBUElLRVkgYW5kIGZvcm1hdCBjc3YsIGZpcnN0IHJvdywgZmlyc3QgY29sdW1uLiBBUElLRVkgVmFyaWFibGUgaXMgc2V0IHRvIHJlYWQgZnJvbSB0aGlzIGZpbGUgYW5kIHRoZSBsb2NhbCBkaXJlY3RvcnkgcGF0aC4KCgojIyBTZXR0aW5nIFVwIERhdGEgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgojIyMgR2V0dGluZyBEYXRhIHdpdGggY2Vuc3VzIEFQSQoKYGBge3IgZmV0Y2ggRGF0ZSxpbmNsdWRlPVRSVUUsIGVjaG89VFJVRX0KbGlicmFyeShSQ3VybCkKbGlicmFyeShkYXRhLnRhYmxlKQpBUElLRVkgPC0gZnJlYWQoZmlsZS5wYXRoKGdldHdkKCkscGFzdGUoIkNlbnN1c0FQSUtFWSIsIi5jc3YiLHNlcCA9ICIiKSksIGhlYWRlciA9IFRSVUUpCmNlbnN1c0dFT1VSTCA8LSBwYXN0ZTAoImh0dHBzOi8vYXBpLmNlbnN1cy5nb3YvZGF0YS8yMDE2L3BlcC9wb3B1bGF0aW9uP2dldD1QT1AsREVOU0lUWSxHRU9OQU1FJmZvcj1zdGF0ZToqJmtleT0iLEFQSUtFWSkKY2Vuc3VzQUdFVVJMIDwtIHBhc3RlMCgiaHR0cHM6Ly9hcGkuY2Vuc3VzLmdvdi9kYXRhLzIwMTYvcGVwL25hdG1vbnRobHk/Z2V0PVBPUCxNT05USExZLEFHRSxHRU9OQU1FJmZvcj11czoqJmtleT0iLEFQSUtFWSkKcm0oQVBJS0VZKQpgYGAKCiMjIyBQYXJzaW5nIERhdGE6IFBvcHVsYXRpb24gYW5kIEdlb2dyYXBoeQoKCmBgYHtyICBwb3B1bGF0aW9uLGluY2x1ZGU9VFJVRSwgZWNobz1UUlVFfQpsaWJyYXJ5KGpzb25saXRlKQojIyMgdGhpcyBpcyB0byBwYXJzZSB0aGUgY2Vuc3VzIGZvciB1cyBwb3B1bGF0aW9uIGJ5IHN0YXRlLCBubyBhZ2UuCm15anNvbmNlbnN1cyA8LSBqc29ubGl0ZTo6ZnJvbUpTT04odHh0ID0gY2Vuc3VzR0VPVVJMKQp1c3BvcCA8LSBhcy5kYXRhLmZyYW1lKG15anNvbmNlbnN1cykKbmFtZXModXNwb3ApIDwtIGFzLmNoYXJhY3Rlcih1bmxpc3QodXNwb3BbMSxdKSkKdXNwb3AgPC0gdXNwb3BbLTEsXQp1c3BvcCRQT1AgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodXNwb3AkUE9QKSkKdXNwb3AkREVOU0lUWSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih1c3BvcCRERU5TSVRZKSkKYGBgCgojIyMgUGFyc2luZyBEYXRhOiBQb3B1bGF0aW9uLE1vbnRoLCBhbmQgQWdlCgpUaGlzIGlzIGFuIFIgTWFya2Rvd24gZG9jdW1lbnQuIE1hcmtkb3duIGlzIGEgc2ltcGxlIGZvcm1hdHRpbmcgc3ludGF4IGZvciBhdXRob3JpbmcgSFRNTCwgUERGLCBhbmQgTVMgV29yZCBkb2N1bWVudHMuIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgUiBNYXJrZG93biBzZWUgPGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20+LgoKV2hlbiB5b3UgY2xpY2sgdGhlICoqS25pdCoqIGJ1dHRvbiBhIGRvY3VtZW50IHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgaW5jbHVkZXMgYm90aCBjb250ZW50IGFzIHdlbGwgYXMgdGhlIG91dHB1dCBvZiBhbnkgZW1iZWRkZWQgUiBjb2RlIGNodW5rcyB3aXRoaW4gdGhlIGRvY3VtZW50LiBZb3UgY2FuIGVtYmVkIGFuIFIgY29kZSBjaHVuayBsaWtlIHRoaXM6CgpgYGB7ciBhZ2UsIGluY2x1ZGU9VFJVRSwgZWNobz1UUlVFfQojIyMgdGhpcyBpcyB0byBwYXJzZSB0aGUgY2Vuc3VzIGZvciB1cyBwb3B1bGF0aW9uIGJ5IGFnZSBhbmQgbW9udGggCm15anNvbmNlbnN1c0FHRSA8LSBqc29ubGl0ZTo6ZnJvbUpTT04odHh0ID0gY2Vuc3VzQUdFVVJMKQp1c3BvcEFHRSA8LSBhcy5kYXRhLmZyYW1lKG15anNvbmNlbnN1c0FHRSkKbmFtZXModXNwb3BBR0UpIDwtIGFzLmNoYXJhY3Rlcih1bmxpc3QodXNwb3BBR0VbMSxdKSkKdXNwb3BBR0UgPC0gdXNwb3BBR0VbLTEsXQp1c3BvcEFHRSRQT1AgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodXNwb3BBR0UkUE9QKSkKdXNwb3BBR0UkQUdFIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHVzcG9wQUdFJEFHRSkpCnVzcG9wQUdFJE1PTlRITFkgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodXNwb3BBR0UkTU9OVEhMWSkpCmBgYAoKIyMgCgojIyBHb2luZyBUaHJvdWdoIERhdGEgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgojIyMgUG9wdWxhdGlvbiBCeSBBZ2UgZm9yIERlYyAyMDE2CgoKUG9wdWxhdGlvbiBzZWVtcyB1bmlmb3JtLgoKYGBge3IgRmlsdGVyLCBpbmNsdWRlPVRSVUUsZWNobyA9IFRSVUV9CiNwbG90IGZpbHRlcmVkIHRvIGRlYyAyMDE2CnVzcG9wQUdFRGlzdCA8LSB1c3BvcEFHRVt3aGljaCgodXNwb3BBR0UkQUdFIDw9IDgwKSAmICh1c3BvcEFHRSRBR0UgPj0gMSkgJiAodXNwb3BBR0UkTU9OVEhMWSA9PSA5NCkpLF0KcGxvdCh4PXVzcG9wQUdFRGlzdCRBR0UsIHk9KHVzcG9wQUdFRGlzdCRQT1AvMTAwMCksIHR5cGUgPSAiaCIsIHhsYWIgPSAiQUdFIiwgeWxhYiA9ICJQb3B1bGF0aW9uICgnMDAwcykiKQpgYGAKCgojIyMgUGN0IEdhaW5zIGFuZCBEZWNsaW5lIEJ5IEFnZQoKVGhlIGNoYW5nZXMgaW4gcG9wdWxhdGlvbiBmbHVjdGF0ZSBiZXR3ZWVuIGdhaW5zIGFuZCBsb3NzZXMgcGx1cyBvciBtaW51cyA1IHBlcmNlbnQsIHNvIHRoZSBudW1iZXIgdGhhdCB3ZW50IGZyb20gb25lIGFnZSB0byBhbm90aGVyLCBpcyBmb2xsb3dlZCBieSBhIGNsb3NlIGZpZ3VyZSB0byByZXBsYWNlIHRoZW0uIEtlZXBpbmcgdGhlIG51bWJlciBvZiBwb3B1bGFudHMgaW4gdGhlIGVhcmx5IGFnZSBjYXRlZ29yeSBnaXZpbmcgbW9yZSBvZiBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIHRvIHRoZSBlbnRpcmUgdXMgcG9wdWxhdGlvbiBhbmQgYWdlCgoKYGBgIHtyIHBjdGRpZmYsIGluY2x1ZGU9IFRSVUUsIGVjaG89VFJVRX0KYXYgPC0gem9vOjp6b28odXNwb3BBR0VEaXN0JFBPUCkKYWdlbGFnIDwtIGFzLmRhdGEuZnJhbWUobGFnKGF2LGsgPSAtMSwgbmEucGFkID0gVFJVRSkpCm5hbWVzKGFnZWxhZykgPC0gYygiYWdlbGFneXIiKQoKYWdlbGFnY29tYmluZWQgPC0gIGFzLmRhdGEuZnJhbWUoY2JpbmQodXNwb3BBR0VEaXN0LCBhZ2VsYWdbMV0pKQphZ2VsYWdjb21iaW5lZF9wY3QgPC0gIGFzLmRhdGEuZnJhbWUoKChhZ2VsYWdjb21iaW5lZCRQT1AgLSBhZ2VsYWdjb21iaW5lZCRhZ2VsYWd5cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvYWdlbGFnY29tYmluZWQkYWdlbGFneXIpKjEwMCkKbmFtZXMoYWdlbGFnY29tYmluZWRfcGN0KSA8LSBjKCJwY3RfY2hnIikKYWdlbGFnY29tYmluZWQgPC0gIGFzLmRhdGEuZnJhbWUoY2JpbmQoYWdlbGFnY29tYmluZWQsIGFnZWxhZ2NvbWJpbmVkX3BjdFsxXSkpCnBsb3QoYWdlbGFnY29tYmluZWQkcGN0X2NoZywgdHlwZSA9ICJvIikKYGBgCgojIwoKCiMjIE5vcm1hbCBEaXN0cmlidXRpb246IFBvcHVsYXRpb24gVmFsdWVzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMjIFNldHRpbmcgVXAgRGlzdHJpYnV0aW9ucwpVc2luZyB0aGUgdmFsdWVzIGZvciBvbmUgdHdvIGFuZCB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zClVzZSBlaXRoZXIgbWV0aG9kIHRvIHJldHVybiBwb3B1bGF0aW9uICB2YWx1ZSA6CgpgYGAge3IgZGV2aWF0aW9ucywgaW5jbHVkZT0gVFJVRSwgZWNobyA9IFRSVUV9Cm9uZWRldiA8LSAuNjgqbWF4KHVzcG9wJFBPUCkKdHdvZGV2IDwtIC45NSptYXgodXNwb3AkUE9QKQp0aHJlZWRldiA8LSAuOTk2NyptYXgodXNwb3AkUE9QKQpgYGAKCgoqIE9uZSBEZXZpYXRpb24gOiBgciBwYXN0ZShvbmVkZXYpYAoqIFR3byBEZXZpYXRpb246IGByIHBhc3RlKHR3b2RldilgCiogVGhyZWUgRGV2aWF0aW9uOiBgciBwYXN0ZSh0d29kZXYpYAoKCm9yIHVzZSB0aGlzIHF1aWNrbHkgYnVpbHQgYmFzaWMgZnVuY3Rpb24gYW5kIGVudGVyIGEgdmFsdWUgYmV0d2VlbiAxIGFuZCAzOgoKYGBgIHtyIGZ1bmRldiwgaW5jbHVkZSA9IFRSVUUsIGVjaG8gPSBUUlVFfQpRdHlQb3B1bGF0aW9uQnlEZXYgPC0gZnVuY3Rpb24obm9fZGV2aWF0aW9ucyA9IDEpewogIGlmKG5vX2RldmlhdGlvbnMgPT0gMSl7ZGV2VmFsdWUgPC0gLjY4Km1heCh1c3BvcCRQT1ApfQogICAgICBlbHNlIGlmKG5vX2RldmlhdGlvbnMgPT0gMil7ZGV2VmFsdWUgPC0gLjk1Km1heCh1c3BvcCRQT1ApfQogICAgICAgICAgZWxzZSBpZihub19kZXZpYXRpb25zID09IDMpe2RldlZhbHVlIDwtIC45OTY3Km1heCh1c3BvcCRQT1ApfQogIHJldHVybihkZXZWYWx1ZSkKfQpgYGAKCgpTbyAyIGRldmlhdGlvbnMgcmVzdWx0cyBpbiBgciBRdHlQb3B1bGF0aW9uQnlEZXYobm9fZGV2aWF0aW9ucyA9IDIpYAoKIyMjIEFnZSByYW5nZSBlc3RpbWF0ZXMgcGVyIGRldmlhdGlvbjogTm9ybWFsIERpc3RyaWJ1dGlvbgoKYGBgIHtyIGluY2x1ZGUgPSBUUlVFLCBlY2hvID0gVFJVRX0KI2FnZSByYW5nZSBiZXR3ZWVuIDEgYW5kIDgwIGF0IDEgZGV2aWF0aW9uCmFnZW1lZGlhbiA8LSA4MC8yCkFnZW9uZWRldkxvdyA8LSAoYWdlbWVkaWFuKigxLSguNjgvMikpKQpBZ2VvbmVkZXZIaWdoIDwtIChhZ2VtZWRpYW4qKDErKC42OC8yKSkpCiMgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvbiAyIGRldmlhdGlvbnMuIDk1IHBlcmNlbnQKQWdldHdvZGV2TG93IDwtIChhZ2VtZWRpYW4qKDEtKC45NS8yKSkpCkFnZXR3b2RldkhpZ2ggPC0gKGFnZW1lZGlhbiooMSsoLjk1LzIpKSkKI25vcm1hbCBhdCAzIGRldmlhdGlvbnMsIDk5LjcKQWdldGhyZWVkZXZMb3cgPC0gKGFnZW1lZGlhbiooMS0oLjk5Ny8yKSkpCkFnZXRocmVlZGV2SGlnaCA8LSAoYWdlbWVkaWFuKigxKyguOTk3LzIpKSkKYGBgCgpVc2luZyB0aGUgc291cmNlIGFib3ZlOgoKKiBUaGUgcG9wdWxhdGlvbiBmYWxscyBiZXR3ZWVuIGByIHBhc3RlKHJvdW5kKEFnZW9uZWRldkxvdywwKSlgICAgYW5kICBgciBwYXN0ZShyb3VuZChBZ2VvbmVkZXZIaWdoLDApKWAgIGF0IDEgZGV2aWF0aW9uCiogVGhlIHBvcHVsYXRpb24gZmFsbHMgYmV0d2VlbiBgciBwYXN0ZShyb3VuZChBZ2V0d29kZXZMb3csMCkpYCAgIGFuZCAgYHIgcGFzdGUocm91bmQoQWdldHdvZGV2SGlnaCwwKSlgICBhdCAyIGRldmlhdGlvbnMKKiBUaGUgcG9wdWxhdGlvbiBmYWxscyBiZXR3ZWVuIGByIHBhc3RlKHJvdW5kKEFnZXRocmVlZGV2TG93LDApKWAgICBhbmQgIGByIHBhc3RlKHJvdW5kKEFnZXRocmVlZGV2SGlnaCwwKSlgICBhdCAzIGRldmlhdGlvbnMKCgpCYXNlZCBvbiBhIG5vcm1hbCBkaXN0cmlidXRpb24sIHdoYXQgYW1vdW50IG9mIHBvcHVsYXRpb24gZG8gbm90IGhhdmUgY3JlZGl0IGNhcmRzIGJhc2VkIG9uIGxlZ2FsIGFnZSB0byBhcHBseT8KCgpgYGAge3IgcG9wdWxhdGlvbmVhcmx5YWdlLCBpbmNsdWRlID0gVFJVRSwgZWNobyA9IFRSVUV9CiMgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvdXRzaWRlIDk1IHBlcmNlbnQgdGhhdCBhcmUgY2Fubm90IGhhdmUgY3JlZGl0IGNhcmRzCnF0eV9Qb3B1bF9lYXJseUFnZSA8LSAoKCgxLS45NSkvMikqc3VtKHVzcG9wJFBPUCkpCkNlbnN1c0Vhcmx5QWdlIDwtIHN1bSh1c3BvcEFHRURpc3Rbd2hpY2godXNwb3BBR0VEaXN0JEFHRSA+PSAxICYgdXNwb3BBR0VEaXN0JEFHRSA8PSAyMSksIlBPUCJdKQpDZW5zdXNBZHVsdEFnZSA8LSBzdW0odXNwb3BBR0VEaXN0W3doaWNoKHVzcG9wQUdFRGlzdCRBR0UgPj0gMjEpLCJQT1AiXSkKVG90YWxfTnVtYmVyX0NyZWRpdENhcmRzIDwtIGFzLm51bWVyaWMoMTg5NTgzNDAwMCkgICAgICAgICAgICAgICAgClRvdGFsX051bWJlcl9DYXJkSG9sZGVycyA8LSBhcy5udW1lcmljKDE5OTgwMDAwMCkgIApgYGAKCiogYHIgcGFzdGUocm91bmQocXR5X1BvcHVsX2Vhcmx5QWdlLDApKWAgYXJlIGxlZnQgb2YgdGhlIGRpc3RyaWJ1dGlvbiBvdXRzaWRlIG9mIDIgZGV2aWF0aW9ucyBvciA5NSBwZXJjZW50IHRoYXQgZG8gaGF2ZSBjcmVkaXQgY2FyZHMuCiogYHIgcGFzdGUocm91bmQoQ2Vuc3VzRWFybHlBZ2UpKWAgaXMgdGhlIGFjdHVhbCB2YWx1ZSB0aGF0IGlzIGdpdmVuIGluIHRoZSBjZW5zdXMgZGF0YSBmb3IgRGVjZW1iZXIgMjAxNgoqIGByIHBhc3RlKHJvdW5kKENlbnN1c0Vhcmx5QWdlIC0gcXR5X1BvcHVsX2Vhcmx5QWdlLDApKSBgIGlzIGEgbGFyZ2UgZGlmZmVyZW5jZSwgd2hpY2ggbWFrZXMgc2Vuc2UgbG9va2luZyBhdCB0aGUgdHJlbmQgdGhhdCBhYm91dCA1IHBlcmNlbnQgZmxvdyBmcm9tIG9uZSBhZ2UgYnJhY2tldCB0byBhbm90aGVyLCBhbmQgcmVzdWx0aW5nIGluIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gYXMgc2VlbiBvbiB0aGUgQ2Vuc3VzIENoYXJ0IChzZWUgR29pbmcgVGhyb3VnaCBEYXRhIGdyYXBocykuCgoqIGByIHBhc3RlKENlbnN1c0FkdWx0QWdlKWAgYXJlIHByb2JhYmx5IGVsaWdibGUgZm9yIGEgY3JlZGl0IGNhcmQuIEFjY29yZGluZyB0byBzdGF0aXN0aWNzIGJyYWluIChmcm9tIHNvdXJjZSBkZXJpdmVkIGZyb20gRlJCTlkpIHRoZXJlIGFyZSBgciBwYXN0ZShUb3RhbF9OdW1iZXJfQ3JlZGl0Q2FyZHMpYCBudW1iZXIgb2YgY3JlZGl0IGNhcmRzIGFuZCBgciBwYXN0ZShUb3RhbF9OdW1iZXJfQ2FyZEhvbGRlcnMpYCBjYXJkaG9sZGVycy4gVGhhdHMgYWJvdXQgYHIgcGFzdGUocm91bmQoVG90YWxfTnVtYmVyX0NyZWRpdENhcmRzL1RvdGFsX051bWJlcl9DYXJkSG9sZGVycywwKSlgIGNyZWRpdCBjYXJkcyBwZXIgY2FyZGhvbGRlci4KCiMjCgoKIyMjIyMgTGljZW5zZWQgVW5kZXIgR05VIEFGRkVSTyBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCgogICAgPFF1aWNrIFNhbXBsZSBvZiBEaXN0cmlidXRpb24gb2YgUG9wdWxhdGlvbj4KICAgIENvcHlyaWdodCAoQykgMjAxNyAgTWljaGFlbCBHYXJjaWEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICBDb250YWN0OiBtZ2FyX2RhdGFzY2llbmNlIGF0IHByb3Rvbm1haWwgZG90IGNvbSAKCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCiAgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lgo=