Last compiled on May, 2025



This is the code with which we make our dependent variables according to the revision of our manuscript.



1 Initatiating R environment

Start out with a custom function to load a set of required packages.

# packages and read data
rm(list = ls())

# (c) Jochem Tolsma
fpackage.check <- function(packages) {
    lapply(packages, FUN = function(x) {
        if (!require(x, character.only = TRUE)) {
            install.packages(x, dependencies = TRUE)
            library(x, character.only = TRUE)
        }
    })
}
packages = c("haven", "coda", "matrixStats", "parallel", "MASS", "doParallel", "dplyr", "cowplot", "tidyverse",
    "naniar", "dotwhisker", "gt", "reshape2", "VGAM", "expss", "networkscaleup")
fpackage.check(packages)
rm(packages)
load("data/dutch_netsize_analyses.rda")

Revision 2 dependent variable for network size

dfans <- df[, c("uni", "hbo", "mbo", "dochterzoon", "tweeling", "corona", 
              "elauto", "scooter", "vegan", 
              "Sophie", "Julia","Sanne","Lisa","Laura","Maria","Linda","Johanna","Monique","Ester",
              "Anna","Elisabeth","Cornelia","Wilhelmina","Amira","Samira","Sara","Daan","Sem",
              "Thomas","Max","Kevin","Johannes","Dennis","Jeroen","Jan","Marcel","Cornelis","Hendrik","Petrus",
              "Willem","Ali","Mohammed","Noor")] # take mean of each of the cats

ref1 <- c(84957, 75214, 145600, 168066, 2500, 1558549)
# ORDER:  uni, hbo, mbo, dochter/zoon, tweeling, corona

ref2 <- c(273259, 460618, 261000)
# ORDER:   elecauto, scooter, vegan,

ref3 <- c(15276,16350,27394,21200,25681,334502,29955,266522,39481, 2692,
          136296,110231,112807,98208,1386,2186,11640,22704,13276,
          40543,17024,23167,307032,36411,49182,186746,35973,134956,118610,86500,
          102296,4213,5003,4517)
# ORDER:   Sophie, Julia,Sanne,Lisa,Laura,Maria,Linda,Johanna,Monique,Ester,
#             Anna,Elisabeth,Cornelia,Wilhelmina,Amira,Samira,Sara,Daan,Sem,
#             Thomas,Max,Kevin,Johannes,Dennis,Jeroen,Jan,Marcel,Cornelis,Hendrik,Petrus,
#             Willem,Ali,Mohammed,Noor



pops <- c(ref1, ref2, ref3)

# Analyze an example ard data set using Zheng et al. (2006) models
ard <- as.matrix(dfans)
subpop_sizes <- pops
known_ind <- c(1:43)

N <- 17407585


# renormalization
# first with primary scaling groups ALL
overdisp.est1 <- overdispersed(ard,
                            known_sizes = subpop_sizes[known_ind],
                            known_ind = known_ind,
                            G1_ind = known_ind,
                            N = N,
                            warmup = 500,
                            iter = 5000)

# two scaling groups, ALL groups selected
overdisp.est2 <- overdispersed(ard,
                            known_sizes = subpop_sizes[known_ind],
                            known_ind = known_ind,
                            G1_ind = c(2, 3, 4, 7, 9, 35), #hbo, mbo,dochterzoon, elauto,vegan, jan
                            G2_ind = c(15, 17, 32), # maria, johanna, johannes
                            N = N,
                            warmup = 500,
                            iter = 5000)
 

# subgroup selection
# regularize subpopulations to < 10k and selection < 10k
ard <- as.matrix(dfans)
subpop_sizes <- pops
z <- which(subpop_sizes < 10000)
ard <- ard[, z]
subpop_sizes <- pops[z]
known_ind <- c(1:length(subpop_sizes))
overdisp.est3 <- overdispersed(ard,
                            known_sizes = subpop_sizes[known_ind],
                            known_ind = known_ind,
                            G1_ind = known_ind,
                            N = N,
                            warmup = 500,
                            iter = 5000)

# only subpopulations < 50k
ard <- as.matrix(dfans)
subpop_sizes <- pops
z <- which(subpop_sizes < 50000)
ard <- ard[, z]
subpop_sizes <- pops[z]
known_ind <- c(1:length(subpop_sizes))
overdisp.est4 <- overdispersed(ard,
                            known_sizes = subpop_sizes[known_ind],
                            known_ind = known_ind,
                            N = N,
                            warmup = 500,
                            iter = 5000)



#without corona, the very top level one
ard <- as.matrix(dfans[,-c(6)]) 
subpop_sizes <- pops[-6]
known_ind <- c(1:42)
overdisp.est5 <- overdispersed(ard,
                            known_sizes = subpop_sizes[known_ind],
                            known_ind = known_ind,
                            G1_ind = known_ind,
                            N = N,
                            warmup = 500,
                            iter = 5000)


#with mccormick selection criteria .1-.2
ref <- as.data.frame(pops)
ref$prop <- (ref$pops/N)*100

ref <- ref[ref$prop < .22,]
ref <- ref[ref$prop > .08,]
z <- as.integer(rownames(ref))

ard <- as.matrix(dfans)
ard <- ard[, z]
subpop_sizes <- pops[z]
known_ind <- c(1:length(subpop_sizes))

overdisp.mccormick1 <- overdispersed(ard,
                            known_sizes = subpop_sizes[known_ind],
                            known_ind = known_ind,
                            G1_ind = known_ind,
                            N = N,
                            warmup = 500,
                            iter = 5000)



# 
# #with mccormick selection criteria .05-.25
# ref <- as.data.frame(pops)
# ref$prop <- (ref$pops/N)*100
# 
# ref <- ref[ref$prop < .25,]
# ref <- ref[ref$prop > .05,]
# z <- as.integer(rownames(ref))
# 
# ard <- ard[, z]
# subpop_sizes <- pops[z]
# known_ind <- c(1:length(subpop_sizes))
# 
# overdisp.mccormick2 <- overdispersed(ard,
#                             known_sizes = subpop_sizes[known_ind],
#                             known_ind = known_ind,
#                             G1_ind = known_ind,
#                             N = N,
#                             warmup = 500,
#                             iter = 5000)



# same iterations in one mean, correlate
x1 <- data.frame(colMeans(overdisp.est1$degrees))
x2 <- data.frame(colMeans(overdisp.est2$degrees))
x3 <- data.frame(colMeans(overdisp.est3$degrees))
x4 <- data.frame(colMeans(overdisp.est4$degrees))
x5 <- data.frame(colMeans(overdisp.est5$degrees))
x6 <- data.frame(colMeans(overdisp.mccormick1$degrees))
#x7 <- data.frame(colMeans(overdisp.mccormick2$degrees))
summary(x1[,1])
summary(x2[,1])
summary(x3[,1])
summary(x4[,1])
summary(x5[,1])
summary(x6[,1])
#summary(x7[,1])

#safe to data
df$netsover1 <- colMeans(overdisp.est1$degrees)
df$netsover2 <- colMeans(overdisp.est2$degrees)
df$netsover3 <- colMeans(overdisp.est3$degrees)
df$netsover4 <- colMeans(overdisp.est4$degrees)
df$netsover5 <- colMeans(overdisp.est5$degrees)
df$netsover6 <- colMeans(overdisp.mccormick1$degrees)

df$netsover7 <- colMeans(overdisp.mccormick1$degrees)
#df$netsover7 <- colMeans(overdisp.mccormick2$degrees)
cor(df[,c("netsover1", "netsover2", "netsover3", "netsover4", "netsover5", "netsover6")])


summary(df$netsover1)
summary(df$netsover2)
summary(df$netsover3)
summary(df$netsover4)
summary(df$netsover5)
summary(df$netsover6)
summary(df$netsover7)

Homogeneity metrics for gender.

# jeroense et al.: The numerical response to each name question was divided by the name frequency
# in the population.  We then calculated a total sum for each set of distinct ethnic-group names
# and for all names.  By dividing the total sum of co-ethnic names by the total sum of all names
# multiplied by 100, we derive our relative ethnic homogeneity measurement, running from 0 to 100.

# volker et al.: For our gender and educational homogeneity metrics we follow Jeroense and
# colleagues' (2023) approach to measuring homogeneity in extended networks.  We first divide the
# numerical response to each name by that name's population size.  We then sum these numbers for
# all names and for women en men names seperately.  we subsequently divide the sum of women (or
# men) names by the sum of all names multiplied by 100 for the relative number of women (or men) in
# the alter category answers (from 0 to 100). This is defined as follows: We also divide the sum of
# same-gender names by the sum of all names multipled by 100 for our relative gender homogeneity
# measurement (from 0 to 100). We define both measurements as follows:

# GENDER table(df$woman) df$numwoman <- rowSums(df[, c('Sophie',
# 'Julia','Sanne','Lisa','Laura','Maria','Linda','Johanna','Monique','Ester',
# 'Anna','Elisabeth','Cornelia','Wilhelmina','Amira','Samira','Sara', 'Noor')]) df$numman <-
# rowSums(df[, c('Daan','Sem','Thomas','Max','Kevin','Johannes','Dennis',
# 'Jeroen','Jan','Marcel','Cornelis','Hendrik','Petrus', 'Willem','Ali','Mohammed')]) dfans <- df[,
# c('Sophie', 'Julia','Sanne','Lisa','Laura','Maria','Linda','Johanna','Monique','Ester',
# 'Anna','Elisabeth','Cornelia','Wilhelmina','Amira','Samira','Sara','Daan','Sem',
# 'Thomas','Max','Kevin','Johannes','Dennis','Jeroen','Jan','Marcel','Cornelis','Hendrik','Petrus',
# 'Willem','Ali','Mohammed','Noor')] # take mean of each of the cats df$numnames <-
# df$numwoman+df$numman df$samegender <- ifelse(df$woman == 1, (df$numwoman/df$numnames)*100,
# (df$numman/df$numnames)*100) summary(df$samegender) summary(df[df$woman == 1, c('samegender')])
# summary(df[df$woman == 0, c('samegender')])

# women homogeneity extract answers to women names
women <- df[, c("Sophie", "Julia", "Sanne", "Lisa", "Laura", "Maria", "Linda", "Johanna", "Monique",
    "Ester", "Anna", "Elisabeth", "Cornelia", "Wilhelmina", "Amira", "Samira", "Sara", "Noor")]

wompop <- c(15276, 16350, 27394, 21200, 25681, 334502, 29955, 266522, 39481, 2692, 136296, 110231, 112807,
    98208, 1386, 2186, 11640, 4517)

#
sort(c(15276, 16350, 27394, 21200, 25681, 334502, 29955, 266522, 39481, 2692, 136296, 110231, 112807,
    98208, 1386, 2186, 11640, 4517)) > sort(c(22704, 13276, 40543, 17024, 23167, 307032, 36411, 49182,
    186746, 35973, 134956, 118610, 86500, 102296, 4213, 5003))

# ORDER: Sophie, Julia,Sanne,Lisa,Laura,Maria,Linda,Johanna,Monique,Ester,
# Anna,Elisabeth,Cornelia,Wilhelmina,Amira,Samira,Sara, Noor

for (i in 1:length(women)) {

    women[[i]] <- women[[i]]/wompop[i]

}
women$womsum <- rowSums(women[, c("Sophie", "Julia", "Sanne", "Lisa", "Laura", "Maria", "Linda", "Johanna",
    "Monique", "Ester", "Anna", "Elisabeth", "Cornelia", "Wilhelmina", "Amira", "Samira", "Sara", "Noor")])


# men homogeneity extract answers to men names
men <- df[, c("Daan", "Sem", "Thomas", "Max", "Kevin", "Johannes", "Dennis", "Jeroen", "Jan", "Marcel",
    "Cornelis", "Hendrik", "Petrus", "Willem", "Ali", "Mohammed")]

# popu
menpop <- c(22704, 13276, 40543, 17024, 23167, 307032, 36411, 49182, 186746, 35973, 134956, 118610, 86500,
    102296, 4213, 5003)
# ORDER: Daan,Sem, Thomas,Max,Kevin,Johannes,Dennis,Jeroen,Jan,Marcel,Cornelis,Hendrik,Petrus,
# Willem,Ali,Mohammed,

for (i in 1:length(men)) {

    men[[i]] <- men[[i]]/menpop[i]

}
men$mensum <- rowSums(men[, c("Daan", "Sem", "Thomas", "Max", "Kevin", "Johannes", "Dennis", "Jeroen",
    "Jan", "Marcel", "Cornelis", "Hendrik", "Petrus", "Willem", "Ali", "Mohammed")])

# and the totals
df2 <- cbind(women, men)
df2$perwomen <- df2$womsum/(df2$womsum + df2$mensum)
df2$permen <- df2$mensum/(df2$womsum + df2$mensum)

df <- cbind(df, df2[, c("perwomen", "permen")])
df$samegender <- ifelse(df$woman == 1, df$perwomen, df$permen)

Homogeneity metrics for education.

# EDUC independent
df$opl2[df$opleiding == 1] <- 0  # prim/sec
df$opl2[df$opleiding == 2] <- 0  # prim/sec
df$opl2[df$opleiding == 3] <- 0  # prim/sec
df$opl2[df$opleiding == 4] <- 0  # prim/sec

df$opl2[df$opleiding == 5] <- 0  # prim/sec

df$opl2[df$opleiding == 6] <- 1  # prim/sec
df$opl2[df$opleiding == 7] <- 1  # prim/sec
table(df$opleiding)
table(df$opl2)

df$numeduchigh <- df$hbo + df$uni
df$numeduclow <- df$mbo

df$numeduc <- rowSums(df[, c("uni", "hbo", "mbo")])

df$pereduchigh <- df$numeduchigh/df$numeduc
df$pereduclow <- df$numeduclow/df$numeduc

df$sameeduc <- ifelse(df$opl2 == 1, df$pereduchigh, df$pereduclow)
# df$sameeduc <- ifelse(df$opl2 == 1, (df$numeduchigh / df$numeduc) * 100, df$sameeduc)

summary(df$sameeduc)
summary(df[df$opl2 == 1, c("sameeduc")])
summary(df[df$opl2 == 0, c("sameeduc")])

# df$sameeduc[df$oplei == 5] <- (df$hbo / df$numeduc) * 100 df$sameeduc[df$oplei == 6] <- (df$hbo /
# df$numeduc) * 100 df$sameeduc[df$oplei == 7] <- (df$uni / df$numeduc) * 100

# df[138, c('opleiding', 'oplei', 'numeduc', 'mbo', 'hbo', 'uni', 'sameeduc')]

# geen onderwijs / basisonderwijs / cursus inburgering / cursus Nederlandse taal 1 LBO / VBO / VMBO
# (kader- of beroepsgerichte leerweg) / MBO 1 (assistentenopleidi 2 MAVO / HAVO of VWO (eerste drie
# jaar) / ULO / MULO / VMBO (TL of GL) / VSO 3 MBO 2, 3, 4 (basisberoeps-, vak-, middenkader- of
# specialistenopleiding) of MBO 4 HAVO of VWO (overgegaan naar de 4e klas) / HBS / MMS / HBO
# propedeuse of WO Prop 5 HBO (behalve HBO-master) / WO-kandidaats -of WO-bachelor 6 WO-doctoraal
# of WO-master of HBO-master / postdoctoraal onderwijs 7

Homogeneity metrics for ethnic background

# # ETHNIC df$numdutch <- rowSums(df[, c('Sophie',
# 'Julia','Sanne','Lisa','Laura','Maria','Linda','Johanna','Monique','Ester',
# 'Anna','Elisabeth','Cornelia','Wilhelmina', 'Sara', 'Noor',
# 'Daan','Sem','Thomas','Max','Kevin','Johannes','Dennis',
# 'Jeroen','Jan','Marcel','Cornelis','Hendrik','Petrus', 'Willem')]) df$numnodutch <- rowSums(df[,
# c('Ali','Mohammed','Amira','Samira')]) table(df$migr3) df$sameethnic1 <- ifelse(df$migr3 == 1,
# (df$numdutch/df$numnames)*100, (df$numnodutch/df$numnames)*100) df$sameethnic2 <- ifelse(df$migr3
# == 1, (df$numdutch/df$numnames)*100, (df$numnodutch/df$numnames)*100) df$sameethnic2 <-
# ifelse(df$migr3 == 2, NA, df$sameethnic1) df[37, c('migr3', 'sameethnic1', 'numdutch',
# 'numnodutch', 'numnames')]
# women homogeneity extract answers to women names NO AMIRA AND SAMIRA
women <- df[, c("Sophie", "Julia", "Sanne", "Lisa", "Laura", "Maria", "Linda", "Johanna", "Monique",
    "Ester", "Anna", "Elisabeth", "Cornelia", "Wilhelmina", "Sara", "Noor")]
wompop <- c(15276, 16350, 27394, 21200, 25681, 334502, 29955, 266522, 39481, 2692, 136296, 110231, 112807,
    98208, 11640, 4517)
# ORDER: Sophie, Julia,Sanne,Lisa,Laura,Maria,Linda,Johanna,Monique,Ester,
# Anna,Elisabeth,Cornelia,Wilhelmina,Sara, Noor

for (i in 1:length(women)) {

    women[[i]] <- women[[i]]/wompop[i]

}
women$womsum <- rowSums(women[, c("Sophie", "Julia", "Sanne", "Lisa", "Laura", "Maria", "Linda", "Johanna",
    "Monique", "Ester", "Anna", "Elisabeth", "Cornelia", "Wilhelmina", "Sara", "Noor")])


# men homogeneity extract answers to men names
men <- df[, c("Daan", "Sem", "Thomas", "Max", "Kevin", "Johannes", "Dennis", "Jeroen", "Jan", "Marcel",
    "Cornelis", "Hendrik", "Petrus", "Willem", "Ali", "Mohammed")]
# popu
menpop <- c(22704, 13276, 40543, 17024, 23167, 307032, 36411, 49182, 186746, 35973, 134956, 118610, 86500,
    102296, 4213, 5003)
# ORDER: Daan,Sem, Thomas,Max,Kevin,Johannes,Dennis,Jeroen,Jan,Marcel,Cornelis,Hendrik,Petrus,
# Willem,Ali,Mohammed,
for (i in 1:length(men)) {

    men[[i]] <- men[[i]]/menpop[i]

}
men$mensum <- rowSums(men[, c("Daan", "Sem", "Thomas", "Max", "Kevin", "Johannes", "Dennis", "Jeroen",
    "Jan", "Marcel", "Cornelis", "Hendrik", "Petrus", "Willem", "Ali", "Mohammed")])

# and the totals
df2 <- cbind(women, men)
df2$perwomen_red <- df2$womsum/(df2$womsum + df2$mensum)
df2$permen_red <- df2$mensum/(df2$womsum + df2$mensum)

df <- cbind(df, df2[, c("perwomen_red", "permen_red")])
df$samegender_red <- ifelse(df$woman == 1, df$perwomen, df$permen)
# women homogeneity extract answers to women names NO Maria,Johanna
women <- df[, c("Sophie", "Julia", "Sanne", "Lisa", "Laura", "Linda", "Monique", "Ester", "Anna", "Elisabeth",
    "Cornelia", "Wilhelmina", "Sara", "Noor")]
wompop <- c(15276, 16350, 27394, 21200, 25681, 29955, 39481, 2692, 136296, 110231, 112807, 98208, 11640,
    4517)
# ORDER: Sophie, Julia,Sanne,Lisa,Laura,Maria,Linda,Johanna,Monique,Ester,
# Anna,Elisabeth,Cornelia,Wilhelmina,Sara, Noor

for (i in 1:length(women)) {

    women[[i]] <- women[[i]]/wompop[i]

}
women$womsum <- rowSums(women[, c("Sophie", "Julia", "Sanne", "Lisa", "Laura", "Linda", "Monique", "Ester",
    "Anna", "Elisabeth", "Cornelia", "Wilhelmina", "Sara", "Noor")])


# men homogeneity extract answers to men names
men <- df[, c("Daan", "Sem", "Thomas", "Max", "Kevin", "Johannes", "Dennis", "Jeroen", "Jan", "Marcel",
    "Cornelis", "Hendrik", "Petrus", "Willem", "Ali", "Mohammed")]
# popu
menpop <- c(22704, 13276, 40543, 17024, 23167, 307032, 36411, 49182, 186746, 35973, 134956, 118610, 86500,
    102296, 4213, 5003)
# ORDER: Daan,Sem, Thomas,Max,Kevin,Johannes,Dennis,Jeroen,Jan,Marcel,Cornelis,Hendrik,Petrus,
# Willem,Ali,Mohammed,
for (i in 1:length(men)) {

    men[[i]] <- men[[i]]/menpop[i]

}
men$mensum <- rowSums(men[, c("Daan", "Sem", "Thomas", "Max", "Kevin", "Johannes", "Dennis", "Jeroen",
    "Jan", "Marcel", "Cornelis", "Hendrik", "Petrus", "Willem", "Ali", "Mohammed")])

# and the totals
df2 <- cbind(women, men)
df2$perwomen_up <- df2$womsum/(df2$womsum + df2$mensum)
df2$permen_up <- df2$mensum/(df2$womsum + df2$mensum)

df <- cbind(df, df2[, c("perwomen_up", "permen_up")])
df$samegender_up <- ifelse(df$woman == 1, df$perwomen_up, df$permen_up)

2 Data storage

Finally, we save the data that we use for the analyses.

# save data
save(df, file = "data/dutch_netsize_analyses_revision_2.rda")
LS0tCnRpdGxlOiAiRGVwZW5kZW50IHZhcmlhYmxlczogUmV2aXNpb24gMiIKI2JpYmxpb2dyYXBoeTogcmVmZXJlbmNlcy5iaWIKYXV0aG9yOiAiQmFzIEhvZnN0cmEiCi0tLQoKYGBge3IsIGdsb2JhbHNldHRpbmdzLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KbGlicmFyeShrbml0cikKCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKb3B0c19jaHVuayRzZXQodGlkeS5vcHRzPWxpc3Qod2lkdGguY3V0b2ZmPTEwMCksdGlkeT1UUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSxjb21tZW50ID0gIiM+IiwgY2FjaGU9VFJVRSwgY2xhc3Muc291cmNlPWMoInRlc3QiKSwgY2xhc3Mub3V0cHV0PWMoInRlc3QyIikpCm9wdGlvbnMod2lkdGggPSAxMDApCnJnbDo6c2V0dXBLbml0cigpCgoKCmNvbG9yaXplIDwtIGZ1bmN0aW9uKHgsIGNvbG9yKSB7c3ByaW50ZigiPHNwYW4gc3R5bGU9J2NvbG9yOiAlczsnPiVzPC9zcGFuPiIsIGNvbG9yLCB4KSB9CgpgYGAKCmBgYHtyIGtsaXBweSwgZWNobz1GQUxTRSwgaW5jbHVkZT1UUlVFfQprbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoJ3RvcCcsICdyaWdodCcpKQoja2xpcHB5OjprbGlwcHkoY29sb3IgPSAnZGFya3JlZCcpCiNrbGlwcHk6OmtsaXBweSh0b29sdGlwX21lc3NhZ2UgPSAnQ2xpY2sgdG8gY29weScsIHRvb2x0aXBfc3VjY2VzcyA9ICdEb25lJykKYGBgCgpMYXN0IGNvbXBpbGVkIG9uIGByIGZvcm1hdChTeXMudGltZSgpLCAnJUIsICVZJylgCgo8YnI+CgotLS0tCgpUaGlzIGlzIHRoZSBjb2RlIHdpdGggd2hpY2ggd2UgbWFrZSBvdXIgZGVwZW5kZW50IHZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gdGhlIHJldmlzaW9uIG9mIG91ciBtYW51c2NyaXB0LgoKPGJyPgoKLS0tLQoKIyBJbml0YXRpYXRpbmcgUiBlbnZpcm9ubWVudAoKU3RhcnQgb3V0IHdpdGggYSBjdXN0b20gZnVuY3Rpb24gdG8gbG9hZCBhIHNldCBvZiByZXF1aXJlZCBwYWNrYWdlcy4KICAKYGBge3IgcGFjaywgZXZhbD1GQUxTRX0KCiMgcGFja2FnZXMgYW5kIHJlYWQgZGF0YQpybShsaXN0ID0gbHMoKSkKCiMgKGMpIEpvY2hlbSBUb2xzbWEKZnBhY2thZ2UuY2hlY2sgPC0gZnVuY3Rpb24ocGFja2FnZXMpIHsKICBsYXBwbHkocGFja2FnZXMsIEZVTiA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghcmVxdWlyZSh4LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpKSB7CiAgICAgIGluc3RhbGwucGFja2FnZXMoeCwgZGVwZW5kZW5jaWVzID0gVFJVRSkKICAgICAgbGlicmFyeSh4LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpCiAgICB9CiAgfSkKfQpwYWNrYWdlcyA9IGMoImhhdmVuIiwgImNvZGEiLCAibWF0cml4U3RhdHMiLCAicGFyYWxsZWwiLCAiTUFTUyIsICJkb1BhcmFsbGVsIiwgImRwbHlyIiwgImNvd3Bsb3QiLCAKICAgICAgICAgICAgICJ0aWR5dmVyc2UiLCAibmFuaWFyIiwgImRvdHdoaXNrZXIiICwiZ3QiLCAicmVzaGFwZTIiLCAiVkdBTSIsICJleHBzcyIsICJuZXR3b3Jrc2NhbGV1cCIpCmZwYWNrYWdlLmNoZWNrKHBhY2thZ2VzKQpybShwYWNrYWdlcykKbG9hZCgiZGF0YS9kdXRjaF9uZXRzaXplX2FuYWx5c2VzLnJkYSIpCgoKCmBgYAoKCgpSZXZpc2lvbiAyIGRlcGVuZGVudCB2YXJpYWJsZSBmb3IgbmV0d29yayBzaXplCgpgYGB7ciByZXZpc2lvbmRpc3BlcnNlZCwgZXZhbD1GQUxTRX0KCmRmYW5zIDwtIGRmWywgYygidW5pIiwgImhibyIsICJtYm8iLCAiZG9jaHRlcnpvb24iLCAidHdlZWxpbmciLCAiY29yb25hIiwgCiAgICAgICAgICAgICAgImVsYXV0byIsICJzY29vdGVyIiwgInZlZ2FuIiwgCiAgICAgICAgICAgICAgIlNvcGhpZSIsICJKdWxpYSIsIlNhbm5lIiwiTGlzYSIsIkxhdXJhIiwiTWFyaWEiLCJMaW5kYSIsIkpvaGFubmEiLCJNb25pcXVlIiwiRXN0ZXIiLAogICAgICAgICAgICAgICJBbm5hIiwiRWxpc2FiZXRoIiwiQ29ybmVsaWEiLCJXaWxoZWxtaW5hIiwiQW1pcmEiLCJTYW1pcmEiLCJTYXJhIiwiRGFhbiIsIlNlbSIsCiAgICAgICAgICAgICAgIlRob21hcyIsIk1heCIsIktldmluIiwiSm9oYW5uZXMiLCJEZW5uaXMiLCJKZXJvZW4iLCJKYW4iLCJNYXJjZWwiLCJDb3JuZWxpcyIsIkhlbmRyaWsiLCJQZXRydXMiLAogICAgICAgICAgICAgICJXaWxsZW0iLCJBbGkiLCJNb2hhbW1lZCIsIk5vb3IiKV0gIyB0YWtlIG1lYW4gb2YgZWFjaCBvZiB0aGUgY2F0cwoKcmVmMSA8LSBjKDg0OTU3LCA3NTIxNCwgMTQ1NjAwLCAxNjgwNjYsIDI1MDAsIDE1NTg1NDkpCiMgT1JERVI6ICB1bmksIGhibywgbWJvLCBkb2NodGVyL3pvb24sIHR3ZWVsaW5nLCBjb3JvbmEKCnJlZjIgPC0gYygyNzMyNTksIDQ2MDYxOCwgMjYxMDAwKQojIE9SREVSOiAgIGVsZWNhdXRvLCBzY29vdGVyLCB2ZWdhbiwKCnJlZjMgPC0gYygxNTI3NiwxNjM1MCwyNzM5NCwyMTIwMCwyNTY4MSwzMzQ1MDIsMjk5NTUsMjY2NTIyLDM5NDgxLCAyNjkyLAogICAgICAgICAgMTM2Mjk2LDExMDIzMSwxMTI4MDcsOTgyMDgsMTM4NiwyMTg2LDExNjQwLDIyNzA0LDEzMjc2LAogICAgICAgICAgNDA1NDMsMTcwMjQsMjMxNjcsMzA3MDMyLDM2NDExLDQ5MTgyLDE4Njc0NiwzNTk3MywxMzQ5NTYsMTE4NjEwLDg2NTAwLAogICAgICAgICAgMTAyMjk2LDQyMTMsNTAwMyw0NTE3KQojIE9SREVSOiAgIFNvcGhpZSwgSnVsaWEsU2FubmUsTGlzYSxMYXVyYSxNYXJpYSxMaW5kYSxKb2hhbm5hLE1vbmlxdWUsRXN0ZXIsCiMgICAgICAgICAgICAgQW5uYSxFbGlzYWJldGgsQ29ybmVsaWEsV2lsaGVsbWluYSxBbWlyYSxTYW1pcmEsU2FyYSxEYWFuLFNlbSwKIyAgICAgICAgICAgICBUaG9tYXMsTWF4LEtldmluLEpvaGFubmVzLERlbm5pcyxKZXJvZW4sSmFuLE1hcmNlbCxDb3JuZWxpcyxIZW5kcmlrLFBldHJ1cywKIyAgICAgICAgICAgICBXaWxsZW0sQWxpLE1vaGFtbWVkLE5vb3IKCgoKcG9wcyA8LSBjKHJlZjEsIHJlZjIsIHJlZjMpCgojIEFuYWx5emUgYW4gZXhhbXBsZSBhcmQgZGF0YSBzZXQgdXNpbmcgWmhlbmcgZXQgYWwuICgyMDA2KSBtb2RlbHMKYXJkIDwtIGFzLm1hdHJpeChkZmFucykKc3VicG9wX3NpemVzIDwtIHBvcHMKa25vd25faW5kIDwtIGMoMTo0MykKCk4gPC0gMTc0MDc1ODUKCgojIHJlbm9ybWFsaXphdGlvbgojIGZpcnN0IHdpdGggcHJpbWFyeSBzY2FsaW5nIGdyb3VwcyBBTEwKb3ZlcmRpc3AuZXN0MSA8LSBvdmVyZGlzcGVyc2VkKGFyZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX3NpemVzID0gc3VicG9wX3NpemVzW2tub3duX2luZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93bl9pbmQgPSBrbm93bl9pbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHMV9pbmQgPSBrbm93bl9pbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOID0gTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm11cCA9IDUwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIgPSA1MDAwKQoKIyB0d28gc2NhbGluZyBncm91cHMsIEFMTCBncm91cHMgc2VsZWN0ZWQKb3ZlcmRpc3AuZXN0MiA8LSBvdmVyZGlzcGVyc2VkKGFyZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX3NpemVzID0gc3VicG9wX3NpemVzW2tub3duX2luZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93bl9pbmQgPSBrbm93bl9pbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHMV9pbmQgPSBjKDIsIDMsIDQsIDcsIDksIDM1KSwgI2hibywgbWJvLGRvY2h0ZXJ6b29uLCBlbGF1dG8sdmVnYW4sIGphbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRzJfaW5kID0gYygxNSwgMTcsIDMyKSwgIyBtYXJpYSwgam9oYW5uYSwgam9oYW5uZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gPSBOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybXVwID0gNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlciA9IDUwMDApCiAKCiMgc3ViZ3JvdXAgc2VsZWN0aW9uCiMgcmVndWxhcml6ZSBzdWJwb3B1bGF0aW9ucyB0byA8IDEwayBhbmQgc2VsZWN0aW9uIDwgMTBrCmFyZCA8LSBhcy5tYXRyaXgoZGZhbnMpCnN1YnBvcF9zaXplcyA8LSBwb3BzCnogPC0gd2hpY2goc3VicG9wX3NpemVzIDwgMTAwMDApCmFyZCA8LSBhcmRbLCB6XQpzdWJwb3Bfc2l6ZXMgPC0gcG9wc1t6XQprbm93bl9pbmQgPC0gYygxOmxlbmd0aChzdWJwb3Bfc2l6ZXMpKQpvdmVyZGlzcC5lc3QzIDwtIG92ZXJkaXNwZXJzZWQoYXJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd25fc2l6ZXMgPSBzdWJwb3Bfc2l6ZXNba25vd25faW5kXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX2luZCA9IGtub3duX2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcxX2luZCA9IGtub3duX2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gPSBOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybXVwID0gNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlciA9IDUwMDApCgojIG9ubHkgc3VicG9wdWxhdGlvbnMgPCA1MGsKYXJkIDwtIGFzLm1hdHJpeChkZmFucykKc3VicG9wX3NpemVzIDwtIHBvcHMKeiA8LSB3aGljaChzdWJwb3Bfc2l6ZXMgPCA1MDAwMCkKYXJkIDwtIGFyZFssIHpdCnN1YnBvcF9zaXplcyA8LSBwb3BzW3pdCmtub3duX2luZCA8LSBjKDE6bGVuZ3RoKHN1YnBvcF9zaXplcykpCm92ZXJkaXNwLmVzdDQgPC0gb3ZlcmRpc3BlcnNlZChhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93bl9zaXplcyA9IHN1YnBvcF9zaXplc1trbm93bl9pbmRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd25faW5kID0ga25vd25faW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTiA9IE4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJtdXAgPSA1MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyID0gNTAwMCkKCgoKI3dpdGhvdXQgY29yb25hLCB0aGUgdmVyeSB0b3AgbGV2ZWwgb25lCmFyZCA8LSBhcy5tYXRyaXgoZGZhbnNbLC1jKDYpXSkgCnN1YnBvcF9zaXplcyA8LSBwb3BzWy02XQprbm93bl9pbmQgPC0gYygxOjQyKQpvdmVyZGlzcC5lc3Q1IDwtIG92ZXJkaXNwZXJzZWQoYXJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd25fc2l6ZXMgPSBzdWJwb3Bfc2l6ZXNba25vd25faW5kXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX2luZCA9IGtub3duX2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcxX2luZCA9IGtub3duX2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gPSBOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybXVwID0gNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlciA9IDUwMDApCgoKI3dpdGggbWNjb3JtaWNrIHNlbGVjdGlvbiBjcml0ZXJpYSAuMS0uMgpyZWYgPC0gYXMuZGF0YS5mcmFtZShwb3BzKQpyZWYkcHJvcCA8LSAocmVmJHBvcHMvTikqMTAwCgpyZWYgPC0gcmVmW3JlZiRwcm9wIDwgLjIyLF0KcmVmIDwtIHJlZltyZWYkcHJvcCA+IC4wOCxdCnogPC0gYXMuaW50ZWdlcihyb3duYW1lcyhyZWYpKQoKYXJkIDwtIGFzLm1hdHJpeChkZmFucykKYXJkIDwtIGFyZFssIHpdCnN1YnBvcF9zaXplcyA8LSBwb3BzW3pdCmtub3duX2luZCA8LSBjKDE6bGVuZ3RoKHN1YnBvcF9zaXplcykpCgpvdmVyZGlzcC5tY2Nvcm1pY2sxIDwtIG92ZXJkaXNwZXJzZWQoYXJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd25fc2l6ZXMgPSBzdWJwb3Bfc2l6ZXNba25vd25faW5kXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX2luZCA9IGtub3duX2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcxX2luZCA9IGtub3duX2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gPSBOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybXVwID0gNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlciA9IDUwMDApCgoKCiMgCiMgI3dpdGggbWNjb3JtaWNrIHNlbGVjdGlvbiBjcml0ZXJpYSAuMDUtLjI1CiMgcmVmIDwtIGFzLmRhdGEuZnJhbWUocG9wcykKIyByZWYkcHJvcCA8LSAocmVmJHBvcHMvTikqMTAwCiMgCiMgcmVmIDwtIHJlZltyZWYkcHJvcCA8IC4yNSxdCiMgcmVmIDwtIHJlZltyZWYkcHJvcCA+IC4wNSxdCiMgeiA8LSBhcy5pbnRlZ2VyKHJvd25hbWVzKHJlZikpCiMgCiMgYXJkIDwtIGFyZFssIHpdCiMgc3VicG9wX3NpemVzIDwtIHBvcHNbel0KIyBrbm93bl9pbmQgPC0gYygxOmxlbmd0aChzdWJwb3Bfc2l6ZXMpKQojIAojIG92ZXJkaXNwLm1jY29ybWljazIgPC0gb3ZlcmRpc3BlcnNlZChhcmQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX3NpemVzID0gc3VicG9wX3NpemVzW2tub3duX2luZF0sCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX2luZCA9IGtub3duX2luZCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRzFfaW5kID0ga25vd25faW5kLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOID0gTiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybXVwID0gNTAwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyID0gNTAwMCkKCgoKIyBzYW1lIGl0ZXJhdGlvbnMgaW4gb25lIG1lYW4sIGNvcnJlbGF0ZQp4MSA8LSBkYXRhLmZyYW1lKGNvbE1lYW5zKG92ZXJkaXNwLmVzdDEkZGVncmVlcykpCngyIDwtIGRhdGEuZnJhbWUoY29sTWVhbnMob3ZlcmRpc3AuZXN0MiRkZWdyZWVzKSkKeDMgPC0gZGF0YS5mcmFtZShjb2xNZWFucyhvdmVyZGlzcC5lc3QzJGRlZ3JlZXMpKQp4NCA8LSBkYXRhLmZyYW1lKGNvbE1lYW5zKG92ZXJkaXNwLmVzdDQkZGVncmVlcykpCng1IDwtIGRhdGEuZnJhbWUoY29sTWVhbnMob3ZlcmRpc3AuZXN0NSRkZWdyZWVzKSkKeDYgPC0gZGF0YS5mcmFtZShjb2xNZWFucyhvdmVyZGlzcC5tY2Nvcm1pY2sxJGRlZ3JlZXMpKQojeDcgPC0gZGF0YS5mcmFtZShjb2xNZWFucyhvdmVyZGlzcC5tY2Nvcm1pY2syJGRlZ3JlZXMpKQpzdW1tYXJ5KHgxWywxXSkKc3VtbWFyeSh4MlssMV0pCnN1bW1hcnkoeDNbLDFdKQpzdW1tYXJ5KHg0WywxXSkKc3VtbWFyeSh4NVssMV0pCnN1bW1hcnkoeDZbLDFdKQojc3VtbWFyeSh4N1ssMV0pCgojc2FmZSB0byBkYXRhCmRmJG5ldHNvdmVyMSA8LSBjb2xNZWFucyhvdmVyZGlzcC5lc3QxJGRlZ3JlZXMpCmRmJG5ldHNvdmVyMiA8LSBjb2xNZWFucyhvdmVyZGlzcC5lc3QyJGRlZ3JlZXMpCmRmJG5ldHNvdmVyMyA8LSBjb2xNZWFucyhvdmVyZGlzcC5lc3QzJGRlZ3JlZXMpCmRmJG5ldHNvdmVyNCA8LSBjb2xNZWFucyhvdmVyZGlzcC5lc3Q0JGRlZ3JlZXMpCmRmJG5ldHNvdmVyNSA8LSBjb2xNZWFucyhvdmVyZGlzcC5lc3Q1JGRlZ3JlZXMpCmRmJG5ldHNvdmVyNiA8LSBjb2xNZWFucyhvdmVyZGlzcC5tY2Nvcm1pY2sxJGRlZ3JlZXMpCgpkZiRuZXRzb3ZlcjcgPC0gY29sTWVhbnMob3ZlcmRpc3AubWNjb3JtaWNrMSRkZWdyZWVzKQojZGYkbmV0c292ZXI3IDwtIGNvbE1lYW5zKG92ZXJkaXNwLm1jY29ybWljazIkZGVncmVlcykKY29yKGRmWyxjKCJuZXRzb3ZlcjEiLCAibmV0c292ZXIyIiwgIm5ldHNvdmVyMyIsICJuZXRzb3ZlcjQiLCAibmV0c292ZXI1IiwgIm5ldHNvdmVyNiIpXSkKCgpzdW1tYXJ5KGRmJG5ldHNvdmVyMSkKc3VtbWFyeShkZiRuZXRzb3ZlcjIpCnN1bW1hcnkoZGYkbmV0c292ZXIzKQpzdW1tYXJ5KGRmJG5ldHNvdmVyNCkKc3VtbWFyeShkZiRuZXRzb3ZlcjUpCnN1bW1hcnkoZGYkbmV0c292ZXI2KQpzdW1tYXJ5KGRmJG5ldHNvdmVyNykKCgpgYGAKCkhvbW9nZW5laXR5IG1ldHJpY3MgZm9yIGdlbmRlci4KCmBgYHtyIHJldmlzaW9uaG9tb2dlbmVpdHlfZ2VuLCAgZXZhbD1GQUxTRX0KIyBqZXJvZW5zZSBldCBhbC46CiMgVGhlIG51bWVyaWNhbCByZXNwb25zZSB0byBlYWNoIG5hbWUgcXVlc3Rpb24gd2FzIGRpdmlkZWQgYnkgdGhlIG5hbWUgZnJlcXVlbmN5IGluIHRoZSBwb3B1bGF0aW9uLiAKI1dlIHRoZW4gY2FsY3VsYXRlZCBhIHRvdGFsIHN1bSBmb3IgZWFjaCBzZXQgb2YgZGlzdGluY3QgZXRobmljLWdyb3VwIG5hbWVzIGFuZCBmb3IgYWxsIG5hbWVzLiAKIyBCeSBkaXZpZGluZyB0aGUgdG90YWwgc3VtIG9mIGNvLWV0aG5pYyBuYW1lcyBieSB0aGUgdG90YWwgc3VtIG9mIGFsbCBuYW1lcyBtdWx0aXBsaWVkIGJ5IDEwMCwgCiMgd2UgZGVyaXZlIG91ciByZWxhdGl2ZSBldGhuaWMgaG9tb2dlbmVpdHkgbWVhc3VyZW1lbnQsIHJ1bm5pbmcgZnJvbSAwIHRvIDEwMC4KCiMgdm9sa2VyIGV0IGFsLjoKIyBGb3Igb3VyIGdlbmRlciBhbmQgZWR1Y2F0aW9uYWwgaG9tb2dlbmVpdHkgbWV0cmljcyB3ZSBmb2xsb3cgSmVyb2Vuc2UgYW5kIGNvbGxlYWd1ZXMnICgyMDIzKSBhcHByb2FjaCB0byBtZWFzdXJpbmcgaG9tb2dlbmVpdHkgaW4gZXh0ZW5kZWQgbmV0d29ya3MuCiMgV2UgZmlyc3QgZGl2aWRlIHRoZSBudW1lcmljYWwgcmVzcG9uc2UgdG8gZWFjaCBuYW1lIGJ5IHRoYXQgbmFtZSdzIHBvcHVsYXRpb24gc2l6ZS4KIyBXZSB0aGVuIHN1bSB0aGVzZSBudW1iZXJzIGZvciBhbGwgbmFtZXMgYW5kIGZvciB3b21lbiBlbiBtZW4gbmFtZXMgc2VwZXJhdGVseS4gCiMgd2Ugc3Vic2VxdWVudGx5IGRpdmlkZSB0aGUgc3VtIG9mIHdvbWVuIChvciBtZW4pIG5hbWVzIGJ5IHRoZSBzdW0gb2YgYWxsIG5hbWVzIG11bHRpcGxpZWQgYnkgMTAwIGZvciB0aGUgcmVsYXRpdmUgbnVtYmVyIG9mIHdvbWVuIChvciBtZW4pIGluIHRoZSBhbHRlciBjYXRlZ29yeSBhbnN3ZXJzIChmcm9tIDAgdG8gMTAwKS4gVGhpcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CiMgV2UgYWxzbyBkaXZpZGUgdGhlIHN1bSBvZiBzYW1lLWdlbmRlciBuYW1lcyBieSB0aGUgc3VtIG9mIGFsbCBuYW1lcyBtdWx0aXBsZWQgYnkgMTAwIGZvciBvdXIgcmVsYXRpdmUgZ2VuZGVyIGhvbW9nZW5laXR5IG1lYXN1cmVtZW50IChmcm9tIDAgdG8gMTAwKS4gV2UgZGVmaW5lIGJvdGggbWVhc3VyZW1lbnRzIGFzIGZvbGxvd3M6CgojR0VOREVSCiMgdGFibGUoZGYkd29tYW4pCiMgZGYkbnVtd29tYW4gPC0gcm93U3VtcyhkZlssIGMoIlNvcGhpZSIsICJKdWxpYSIsIlNhbm5lIiwiTGlzYSIsIkxhdXJhIiwiTWFyaWEiLCJMaW5kYSIsIkpvaGFubmEiLCJNb25pcXVlIiwiRXN0ZXIiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbm5hIiwiRWxpc2FiZXRoIiwiQ29ybmVsaWEiLCJXaWxoZWxtaW5hIiwiQW1pcmEiLCJTYW1pcmEiLCJTYXJhIiwgIk5vb3IiKV0pCiMgCiMgCiMgCiMgZGYkbnVtbWFuIDwtIHJvd1N1bXMoZGZbLCBjKCJEYWFuIiwiU2VtIiwiVGhvbWFzIiwiTWF4IiwiS2V2aW4iLCJKb2hhbm5lcyIsIkRlbm5pcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKZXJvZW4iLCJKYW4iLCJNYXJjZWwiLCJDb3JuZWxpcyIsIkhlbmRyaWsiLCJQZXRydXMiLCAiV2lsbGVtIiwiQWxpIiwiTW9oYW1tZWQiKV0pCiMgCiMgZGZhbnMgPC0gZGZbLCBjKCJTb3BoaWUiLCAiSnVsaWEiLCJTYW5uZSIsIkxpc2EiLCJMYXVyYSIsIk1hcmlhIiwiTGluZGEiLCJKb2hhbm5hIiwiTW9uaXF1ZSIsIkVzdGVyIiwKIyAgICAgICAgICAgICAgICJBbm5hIiwiRWxpc2FiZXRoIiwiQ29ybmVsaWEiLCJXaWxoZWxtaW5hIiwiQW1pcmEiLCJTYW1pcmEiLCJTYXJhIiwiRGFhbiIsIlNlbSIsCiMgICAgICAgICAgICAgICAiVGhvbWFzIiwiTWF4IiwiS2V2aW4iLCJKb2hhbm5lcyIsIkRlbm5pcyIsIkplcm9lbiIsIkphbiIsIk1hcmNlbCIsIkNvcm5lbGlzIiwiSGVuZHJpayIsIlBldHJ1cyIsCiMgICAgICAgICAgICAgICAiV2lsbGVtIiwiQWxpIiwiTW9oYW1tZWQiLCJOb29yIildICMgdGFrZSBtZWFuIG9mIGVhY2ggb2YgdGhlIGNhdHMKIyAKIyAKIyBkZiRudW1uYW1lcyA8LSBkZiRudW13b21hbitkZiRudW1tYW4KIyBkZiRzYW1lZ2VuZGVyIDwtIGlmZWxzZShkZiR3b21hbiA9PSAxLCAoZGYkbnVtd29tYW4vZGYkbnVtbmFtZXMpKjEwMCwgKGRmJG51bW1hbi9kZiRudW1uYW1lcykqMTAwKQojIHN1bW1hcnkoZGYkc2FtZWdlbmRlcikKIyAKIyBzdW1tYXJ5KGRmW2RmJHdvbWFuID09IDEsIGMoInNhbWVnZW5kZXIiKV0pCiMgc3VtbWFyeShkZltkZiR3b21hbiA9PSAwLCBjKCJzYW1lZ2VuZGVyIildKQoKI3dvbWVuIGhvbW9nZW5laXR5CiMgZXh0cmFjdCBhbnN3ZXJzIHRvIHdvbWVuIG5hbWVzCndvbWVuIDwtIGRmWywgYygiU29waGllIiwgIkp1bGlhIiwiU2FubmUiLCJMaXNhIiwiTGF1cmEiLCJNYXJpYSIsIkxpbmRhIiwiSm9oYW5uYSIsIk1vbmlxdWUiLCJFc3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbm5hIiwiRWxpc2FiZXRoIiwiQ29ybmVsaWEiLCJXaWxoZWxtaW5hIiwiQW1pcmEiLCJTYW1pcmEiLCJTYXJhIiwgIk5vb3IiKV0KCndvbXBvcCA8LSBjKDE1Mjc2LDE2MzUwLDI3Mzk0LDIxMjAwLDI1NjgxLDMzNDUwMiwyOTk1NSwyNjY1MjIsMzk0ODEsIDI2OTIsCiAgICAgICAgICAxMzYyOTYsMTEwMjMxLDExMjgwNyw5ODIwOCwxMzg2LDIxODYsMTE2NDAsNDUxNykKCiMKc29ydChjKDE1Mjc2LDE2MzUwLDI3Mzk0LDIxMjAwLDI1NjgxLDMzNDUwMiwyOTk1NSwyNjY1MjIsMzk0ODEsIDI2OTIsCiAgICAgICAgICAxMzYyOTYsMTEwMjMxLDExMjgwNyw5ODIwOCwxMzg2LDIxODYsMTE2NDAsNDUxNykpID4gc29ydChjKDIyNzA0LDEzMjc2LDQwNTQzLDE3MDI0LDIzMTY3LDMwNzAzMiwzNjQxMSw0OTE4MiwxODY3NDYsMzU5NzMsMTM0OTU2LDExODYxMCw4NjUwMCwKICAgICAgICAgIDEwMjI5Niw0MjEzLDUwMDMpKQoKIyBPUkRFUjogICBTb3BoaWUsIEp1bGlhLFNhbm5lLExpc2EsTGF1cmEsTWFyaWEsTGluZGEsSm9oYW5uYSxNb25pcXVlLEVzdGVyLAojICAgICAgICAgICAgIEFubmEsRWxpc2FiZXRoLENvcm5lbGlhLFdpbGhlbG1pbmEsQW1pcmEsU2FtaXJhLFNhcmEsIE5vb3IgICAgICAKCmZvciAoaSBpbiAxOmxlbmd0aCh3b21lbikpIHsKICAKICB3b21lbltbaV1dIDwtIHdvbWVuW1tpXV0vd29tcG9wW2ldCiAgCn0Kd29tZW4kd29tc3VtIDwtIHJvd1N1bXMod29tZW5bLCBjKCJTb3BoaWUiLCAiSnVsaWEiLCJTYW5uZSIsIkxpc2EiLCJMYXVyYSIsIk1hcmlhIiwiTGluZGEiLCJKb2hhbm5hIiwiTW9uaXF1ZSIsIkVzdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFubmEiLCJFbGlzYWJldGgiLCJDb3JuZWxpYSIsIldpbGhlbG1pbmEiLCJBbWlyYSIsIlNhbWlyYSIsIlNhcmEiLCAiTm9vciIpXSkKCgojIG1lbiBob21vZ2VuZWl0eQojIGV4dHJhY3QgYW5zd2VycyB0byBtZW4gbmFtZXMKbWVuIDwtIGRmWywgYygiRGFhbiIsIlNlbSIsIlRob21hcyIsIk1heCIsIktldmluIiwiSm9oYW5uZXMiLCJEZW5uaXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkplcm9lbiIsIkphbiIsIk1hcmNlbCIsIkNvcm5lbGlzIiwiSGVuZHJpayIsIlBldHJ1cyIsICJXaWxsZW0iLCJBbGkiLCJNb2hhbW1lZCIpXQoKI3BvcHUKbWVucG9wIDwtIGMoMjI3MDQsMTMyNzYsNDA1NDMsMTcwMjQsMjMxNjcsMzA3MDMyLDM2NDExLDQ5MTgyLDE4Njc0NiwzNTk3MywxMzQ5NTYsMTE4NjEwLDg2NTAwLAogICAgICAgICAgMTAyMjk2LDQyMTMsNTAwMykKIyBPUkRFUjogICBEYWFuLFNlbSwgVGhvbWFzLE1heCxLZXZpbixKb2hhbm5lcyxEZW5uaXMsSmVyb2VuLEphbixNYXJjZWwsQ29ybmVsaXMsSGVuZHJpayxQZXRydXMsCiMgICAgICAgICAgICAgV2lsbGVtLEFsaSxNb2hhbW1lZCwKCmZvciAoaSBpbiAxOmxlbmd0aChtZW4pKSB7CiAgCiAgbWVuW1tpXV0gPC0gbWVuW1tpXV0vbWVucG9wW2ldCiAgCn0KbWVuJG1lbnN1bSA8LSByb3dTdW1zKG1lblssIGMoIkRhYW4iLCJTZW0iLCJUaG9tYXMiLCJNYXgiLCJLZXZpbiIsIkpvaGFubmVzIiwiRGVubmlzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKZXJvZW4iLCJKYW4iLCJNYXJjZWwiLCJDb3JuZWxpcyIsIkhlbmRyaWsiLCJQZXRydXMiLCAiV2lsbGVtIiwiQWxpIiwiTW9oYW1tZWQiKV0pCgojIGFuZCB0aGUgdG90YWxzCmRmMiA8LSBjYmluZCh3b21lbiwgbWVuKQpkZjIkcGVyd29tZW4gPC0gZGYyJHdvbXN1bS8oZGYyJHdvbXN1bStkZjIkbWVuc3VtKQpkZjIkcGVybWVuIDwtIGRmMiRtZW5zdW0vKGRmMiR3b21zdW0rZGYyJG1lbnN1bSkKCmRmIDwtIGNiaW5kKGRmLCBkZjJbLGMoInBlcndvbWVuIiwgInBlcm1lbiIpXSkKZGYkc2FtZWdlbmRlciA8LSBpZmVsc2UoZGYkd29tYW4gPT0gMSwgZGYkcGVyd29tZW4sIGRmJHBlcm1lbikKCmBgYAoKSG9tb2dlbmVpdHkgbWV0cmljcyBmb3IgZWR1Y2F0aW9uLgoKYGBge3IgcmV2aXNpb25ob21vZ2VuZWl0eV9lZHVjLCAgZXZhbD1GQUxTRX0KI0VEVUMKI2luZGVwZW5kZW50CmRmJG9wbDJbZGYkb3BsZWlkaW5nID09IDFdIDwtIDAgIyBwcmltL3NlYwpkZiRvcGwyW2RmJG9wbGVpZGluZyA9PSAyXSA8LSAwICMgcHJpbS9zZWMKZGYkb3BsMltkZiRvcGxlaWRpbmcgPT0gM10gPC0gMCAjIHByaW0vc2VjCmRmJG9wbDJbZGYkb3BsZWlkaW5nID09IDRdIDwtIDAgIyBwcmltL3NlYwoKZGYkb3BsMltkZiRvcGxlaWRpbmcgPT0gNV0gPC0gMCAjIHByaW0vc2VjCgpkZiRvcGwyW2RmJG9wbGVpZGluZyA9PSA2XSA8LSAxICMgcHJpbS9zZWMKZGYkb3BsMltkZiRvcGxlaWRpbmcgPT0gN10gPC0gMSAjIHByaW0vc2VjCnRhYmxlKGRmJG9wbGVpZGluZykKdGFibGUoZGYkb3BsMikKCmRmJG51bWVkdWNoaWdoIDwtIGRmJGhibyArIGRmJHVuaQpkZiRudW1lZHVjbG93IDwtIGRmJG1ibwoKZGYkbnVtZWR1YyA8LSByb3dTdW1zKGRmWywgYygidW5pIiwgImhibyIsICJtYm8iKV0pCgpkZiRwZXJlZHVjaGlnaCA8LSBkZiRudW1lZHVjaGlnaC9kZiRudW1lZHVjCmRmJHBlcmVkdWNsb3cgPC0gZGYkbnVtZWR1Y2xvdy9kZiRudW1lZHVjCgpkZiRzYW1lZWR1YyA8LSBpZmVsc2UoZGYkb3BsMiA9PSAxLCBkZiRwZXJlZHVjaGlnaCwgZGYkcGVyZWR1Y2xvdykKI2RmJHNhbWVlZHVjIDwtIGlmZWxzZShkZiRvcGwyID09IDEsIChkZiRudW1lZHVjaGlnaCAvIGRmJG51bWVkdWMpICogMTAwLCBkZiRzYW1lZWR1YykKCnN1bW1hcnkoZGYkc2FtZWVkdWMpCnN1bW1hcnkoZGZbZGYkb3BsMiA9PSAxLCBjKCJzYW1lZWR1YyIpXSkKc3VtbWFyeShkZltkZiRvcGwyID09IDAsIGMoInNhbWVlZHVjIildKQoKIyBkZiRzYW1lZWR1Y1tkZiRvcGxlaSA9PSA1XSA8LSAoZGYkaGJvIC8gZGYkbnVtZWR1YykgKiAxMDAKIyBkZiRzYW1lZWR1Y1tkZiRvcGxlaSA9PSA2XSA8LSAoZGYkaGJvIC8gZGYkbnVtZWR1YykgKiAxMDAKIyAKIyBkZiRzYW1lZWR1Y1tkZiRvcGxlaSA9PSA3XSA8LSAoZGYkdW5pIC8gZGYkbnVtZWR1YykgKiAxMDAKCiNkZlsxMzgsIGMoIm9wbGVpZGluZyIsICJvcGxlaSIsICJudW1lZHVjIiwgIm1ibyIsICJoYm8iLCAidW5pIiwgInNhbWVlZHVjIildCgojIGdlZW4gb25kZXJ3aWpzIC8gYmFzaXNvbmRlcndpanMgLyBjdXJzdXMgaW5idXJnZXJpbmcgLyBjdXJzdXMgTmVkZXJsYW5kc2UgdGFhbCAKIyAxIAojIExCTyAvIFZCTyAvIFZNQk8gKGthZGVyLSBvZiBiZXJvZXBzZ2VyaWNodGUgbGVlcndlZykgLyBNQk8gMSAoYXNzaXN0ZW50ZW5vcGxlaWRpIAojIDIgCiMgTUFWTyAvIEhBVk8gb2YgVldPIChlZXJzdGUgZHJpZSBqYWFyKSAvIFVMTyAvIE1VTE8gLyBWTUJPIChUTCBvZiBHTCkgLyBWU08gCiMgMyAKIyBNQk8gMiwgMywgNCAoYmFzaXNiZXJvZXBzLSwgdmFrLSwgbWlkZGVua2FkZXItIG9mIHNwZWNpYWxpc3Rlbm9wbGVpZGluZykgb2YgTUJPIAojIDQgCiMgSEFWTyBvZiBWV08gKG92ZXJnZWdhYW4gbmFhciBkZSA0ZSBrbGFzKSAvIEhCUyAvIE1NUyAvIEhCTyBwcm9wZWRldXNlIG9mIFdPIFByb3AgCiMgNSAKIyBIQk8gKGJlaGFsdmUgSEJPLW1hc3RlcikgLyBXTy1rYW5kaWRhYXRzIC1vZiBXTy1iYWNoZWxvciAKIyA2IAojIFdPLWRvY3RvcmFhbCBvZiBXTy1tYXN0ZXIgb2YgSEJPLW1hc3RlciAvIHBvc3Rkb2N0b3JhYWwgb25kZXJ3aWpzIAojIDcKYGBgCgoKSG9tb2dlbmVpdHkgbWV0cmljcyBmb3IgZXRobmljIGJhY2tncm91bmQKCmBgYHtyIHJldmlzaW9uaG9tb2dlbmVpdHlfZXRobmljLCAgZXZhbD1GQUxTRX0KIyAKIyAjIEVUSE5JQwojIGRmJG51bWR1dGNoIDwtIHJvd1N1bXMoZGZbLCBjKCJTb3BoaWUiLCAiSnVsaWEiLCJTYW5uZSIsIkxpc2EiLCJMYXVyYSIsIk1hcmlhIiwiTGluZGEiLCJKb2hhbm5hIiwiTW9uaXF1ZSIsIkVzdGVyIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5uYSIsIkVsaXNhYmV0aCIsIkNvcm5lbGlhIiwiV2lsaGVsbWluYSIsICJTYXJhIiwgIk5vb3IiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYWFuIiwiU2VtIiwiVGhvbWFzIiwiTWF4IiwiS2V2aW4iLCJKb2hhbm5lcyIsIkRlbm5pcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkplcm9lbiIsIkphbiIsIk1hcmNlbCIsIkNvcm5lbGlzIiwiSGVuZHJpayIsIlBldHJ1cyIsICJXaWxsZW0iKV0pCiMgZGYkbnVtbm9kdXRjaCA8LSByb3dTdW1zKGRmWywgYygiQWxpIiwiTW9oYW1tZWQiLCJBbWlyYSIsIlNhbWlyYSIpXSkKIyB0YWJsZShkZiRtaWdyMykKIyBkZiRzYW1lZXRobmljMSA8LSBpZmVsc2UoZGYkbWlncjMgPT0gMSwgKGRmJG51bWR1dGNoL2RmJG51bW5hbWVzKSoxMDAsIChkZiRudW1ub2R1dGNoL2RmJG51bW5hbWVzKSoxMDApCiMgZGYkc2FtZWV0aG5pYzIgPC0gaWZlbHNlKGRmJG1pZ3IzID09IDEsIChkZiRudW1kdXRjaC9kZiRudW1uYW1lcykqMTAwLCAoZGYkbnVtbm9kdXRjaC9kZiRudW1uYW1lcykqMTAwKQojIGRmJHNhbWVldGhuaWMyIDwtIGlmZWxzZShkZiRtaWdyMyA9PSAyLCBOQSwgZGYkc2FtZWV0aG5pYzEpCiMgCiMgZGZbMzcsIGMoIm1pZ3IzIiwgInNhbWVldGhuaWMxIiwgIm51bWR1dGNoIiwgIm51bW5vZHV0Y2giLCAibnVtbmFtZXMiKV0KCgpgYGAKCmBgYHtyIHJldmlzaW9uaG9tb2dlbmVpdHlfZ2Vuc3VicG9wcmVkdWNlZCwgIGV2YWw9RkFMU0V9CiN3b21lbiBob21vZ2VuZWl0eQojIGV4dHJhY3QgYW5zd2VycyB0byB3b21lbiBuYW1lcyAKIyBOTyBBTUlSQSBBTkQgU0FNSVJBCndvbWVuIDwtIGRmWywgYygiU29waGllIiwgIkp1bGlhIiwiU2FubmUiLCJMaXNhIiwiTGF1cmEiLCJNYXJpYSIsIkxpbmRhIiwiSm9oYW5uYSIsIk1vbmlxdWUiLCJFc3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbm5hIiwiRWxpc2FiZXRoIiwiQ29ybmVsaWEiLCJXaWxoZWxtaW5hIiwiU2FyYSIsICJOb29yIildCndvbXBvcCA8LSBjKDE1Mjc2LDE2MzUwLDI3Mzk0LDIxMjAwLDI1NjgxLDMzNDUwMiwyOTk1NSwyNjY1MjIsMzk0ODEsIDI2OTIsCiAgICAgICAgICAxMzYyOTYsMTEwMjMxLDExMjgwNyw5ODIwOCwgMTE2NDAsNDUxNykKIyBPUkRFUjogICBTb3BoaWUsIEp1bGlhLFNhbm5lLExpc2EsTGF1cmEsTWFyaWEsTGluZGEsSm9oYW5uYSxNb25pcXVlLEVzdGVyLAojICAgICAgICAgICAgIEFubmEsRWxpc2FiZXRoLENvcm5lbGlhLFdpbGhlbG1pbmEsU2FyYSwgTm9vciAgICAgIAoKZm9yIChpIGluIDE6bGVuZ3RoKHdvbWVuKSkgewogIAogIHdvbWVuW1tpXV0gPC0gd29tZW5bW2ldXS93b21wb3BbaV0KICAKfQp3b21lbiR3b21zdW0gPC0gcm93U3Vtcyh3b21lblssIGMoIlNvcGhpZSIsICJKdWxpYSIsIlNhbm5lIiwiTGlzYSIsIkxhdXJhIiwiTWFyaWEiLCJMaW5kYSIsIkpvaGFubmEiLCJNb25pcXVlIiwiRXN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5uYSIsIkVsaXNhYmV0aCIsIkNvcm5lbGlhIiwiV2lsaGVsbWluYSIsIlNhcmEiLCAiTm9vciIpXSkKCgojIG1lbiBob21vZ2VuZWl0eQojIGV4dHJhY3QgYW5zd2VycyB0byBtZW4gbmFtZXMKbWVuIDwtIGRmWywgYygiRGFhbiIsIlNlbSIsIlRob21hcyIsIk1heCIsIktldmluIiwiSm9oYW5uZXMiLCJEZW5uaXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkplcm9lbiIsIkphbiIsIk1hcmNlbCIsIkNvcm5lbGlzIiwiSGVuZHJpayIsIlBldHJ1cyIsICJXaWxsZW0iLCJBbGkiLCJNb2hhbW1lZCIpXQojcG9wdQptZW5wb3AgPC0gYygyMjcwNCwxMzI3Niw0MDU0MywxNzAyNCwyMzE2NywzMDcwMzIsMzY0MTEsNDkxODIsMTg2NzQ2LDM1OTczLDEzNDk1NiwxMTg2MTAsODY1MDAsCiAgICAgICAgICAxMDIyOTYsNDIxMyw1MDAzKQojIE9SREVSOiAgIERhYW4sU2VtLCBUaG9tYXMsTWF4LEtldmluLEpvaGFubmVzLERlbm5pcyxKZXJvZW4sSmFuLE1hcmNlbCxDb3JuZWxpcyxIZW5kcmlrLFBldHJ1cywKIyAgICAgICAgICAgICBXaWxsZW0sQWxpLE1vaGFtbWVkLApmb3IgKGkgaW4gMTpsZW5ndGgobWVuKSkgewogIAogIG1lbltbaV1dIDwtIG1lbltbaV1dL21lbnBvcFtpXQogIAp9Cm1lbiRtZW5zdW0gPC0gcm93U3VtcyhtZW5bLCBjKCJEYWFuIiwiU2VtIiwiVGhvbWFzIiwiTWF4IiwiS2V2aW4iLCJKb2hhbm5lcyIsIkRlbm5pcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmVyb2VuIiwiSmFuIiwiTWFyY2VsIiwiQ29ybmVsaXMiLCJIZW5kcmlrIiwiUGV0cnVzIiwgIldpbGxlbSIsIkFsaSIsIk1vaGFtbWVkIildKQoKIyBhbmQgdGhlIHRvdGFscwpkZjIgPC0gY2JpbmQod29tZW4sIG1lbikKZGYyJHBlcndvbWVuX3JlZCA8LSBkZjIkd29tc3VtLyhkZjIkd29tc3VtK2RmMiRtZW5zdW0pCmRmMiRwZXJtZW5fcmVkIDwtIGRmMiRtZW5zdW0vKGRmMiR3b21zdW0rZGYyJG1lbnN1bSkKCmRmIDwtIGNiaW5kKGRmLCBkZjJbLGMoInBlcndvbWVuX3JlZCIsICJwZXJtZW5fcmVkIildKQpkZiRzYW1lZ2VuZGVyX3JlZCA8LSBpZmVsc2UoZGYkd29tYW4gPT0gMSwgZGYkcGVyd29tZW4sIGRmJHBlcm1lbikKCmBgYAoKCmBgYHtyIHJldmlzaW9uaG9tb2dlbmVpdHlfZ2Vuc3VicG9wdXBwZWQsICBldmFsPUZBTFNFfQojd29tZW4gaG9tb2dlbmVpdHkKIyBleHRyYWN0IGFuc3dlcnMgdG8gd29tZW4gbmFtZXMgCiMgTk8gTWFyaWEsSm9oYW5uYQp3b21lbiA8LSBkZlssIGMoIlNvcGhpZSIsICJKdWxpYSIsIlNhbm5lIiwiTGlzYSIsIkxhdXJhIiwiTGluZGEiLCJNb25pcXVlIiwiRXN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5uYSIsIkVsaXNhYmV0aCIsIkNvcm5lbGlhIiwiV2lsaGVsbWluYSIsIlNhcmEiLCAiTm9vciIpXQp3b21wb3AgPC0gYygxNTI3NiwxNjM1MCwyNzM5NCwyMTIwMCwyNTY4MSwyOTk1NSwzOTQ4MSwgMjY5MiwKICAgICAgICAgIDEzNjI5NiwxMTAyMzEsMTEyODA3LDk4MjA4LCAxMTY0MCw0NTE3KQojIE9SREVSOiAgIFNvcGhpZSwgSnVsaWEsU2FubmUsTGlzYSxMYXVyYSxNYXJpYSxMaW5kYSxKb2hhbm5hLE1vbmlxdWUsRXN0ZXIsCiMgICAgICAgICAgICAgQW5uYSxFbGlzYWJldGgsQ29ybmVsaWEsV2lsaGVsbWluYSxTYXJhLCBOb29yICAgICAgCgpmb3IgKGkgaW4gMTpsZW5ndGgod29tZW4pKSB7CiAgCiAgd29tZW5bW2ldXSA8LSB3b21lbltbaV1dL3dvbXBvcFtpXQogIAp9CndvbWVuJHdvbXN1bSA8LSByb3dTdW1zKHdvbWVuWywgYygiU29waGllIiwgIkp1bGlhIiwiU2FubmUiLCJMaXNhIiwiTGF1cmEiLCJMaW5kYSIsIk1vbmlxdWUiLCJFc3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbm5hIiwiRWxpc2FiZXRoIiwiQ29ybmVsaWEiLCJXaWxoZWxtaW5hIiwiU2FyYSIsICJOb29yIildKQoKCiMgbWVuIGhvbW9nZW5laXR5CiMgZXh0cmFjdCBhbnN3ZXJzIHRvIG1lbiBuYW1lcwptZW4gPC0gZGZbLCBjKCJEYWFuIiwiU2VtIiwiVGhvbWFzIiwiTWF4IiwiS2V2aW4iLCJKb2hhbm5lcyIsIkRlbm5pcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmVyb2VuIiwiSmFuIiwiTWFyY2VsIiwiQ29ybmVsaXMiLCJIZW5kcmlrIiwiUGV0cnVzIiwgIldpbGxlbSIsIkFsaSIsIk1vaGFtbWVkIildCiNwb3B1Cm1lbnBvcCA8LSBjKDIyNzA0LDEzMjc2LDQwNTQzLDE3MDI0LDIzMTY3LDMwNzAzMiwzNjQxMSw0OTE4MiwxODY3NDYsMzU5NzMsMTM0OTU2LDExODYxMCw4NjUwMCwKICAgICAgICAgIDEwMjI5Niw0MjEzLDUwMDMpCiMgT1JERVI6ICAgRGFhbixTZW0sIFRob21hcyxNYXgsS2V2aW4sSm9oYW5uZXMsRGVubmlzLEplcm9lbixKYW4sTWFyY2VsLENvcm5lbGlzLEhlbmRyaWssUGV0cnVzLAojICAgICAgICAgICAgIFdpbGxlbSxBbGksTW9oYW1tZWQsCmZvciAoaSBpbiAxOmxlbmd0aChtZW4pKSB7CiAgCiAgbWVuW1tpXV0gPC0gbWVuW1tpXV0vbWVucG9wW2ldCiAgCn0KbWVuJG1lbnN1bSA8LSByb3dTdW1zKG1lblssIGMoIkRhYW4iLCJTZW0iLCJUaG9tYXMiLCJNYXgiLCJLZXZpbiIsIkpvaGFubmVzIiwiRGVubmlzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKZXJvZW4iLCJKYW4iLCJNYXJjZWwiLCJDb3JuZWxpcyIsIkhlbmRyaWsiLCJQZXRydXMiLCAiV2lsbGVtIiwiQWxpIiwiTW9oYW1tZWQiKV0pCgojIGFuZCB0aGUgdG90YWxzCmRmMiA8LSBjYmluZCh3b21lbiwgbWVuKQpkZjIkcGVyd29tZW5fdXAgPC0gZGYyJHdvbXN1bS8oZGYyJHdvbXN1bStkZjIkbWVuc3VtKQpkZjIkcGVybWVuX3VwIDwtIGRmMiRtZW5zdW0vKGRmMiR3b21zdW0rZGYyJG1lbnN1bSkKCmRmIDwtIGNiaW5kKGRmLCBkZjJbLGMoInBlcndvbWVuX3VwIiwgInBlcm1lbl91cCIpXSkKZGYkc2FtZWdlbmRlcl91cCA8LSBpZmVsc2UoZGYkd29tYW4gPT0gMSwgZGYkcGVyd29tZW5fdXAsIGRmJHBlcm1lbl91cCkKCmBgYAoKCiMgRGF0YSBzdG9yYWdlCiAgCkZpbmFsbHksIHdlIHNhdmUgdGhlIGRhdGEgdGhhdCB3ZSB1c2UgZm9yIHRoZSBhbmFseXNlcy4KICAKYGBge3IgZGF0YXNhdmUsIGV2YWw9RkFMU0V9CgojIHNhdmUgZGF0YQpzYXZlKGRmLCBmaWxlID0gImRhdGEvZHV0Y2hfbmV0c2l6ZV9hbmFseXNlc19yZXZpc2lvbl8yLnJkYSIpCgpgYGA=