This is the code with which we make our dependent variables according
to the revision of our manuscript.
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 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
# 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)
# primary scaling groups all, except some
overdisp.est2 <- overdispersed(ard,
known_sizes = subpop_sizes[known_ind],
known_ind = known_ind,
G2_ind = c(2, 3, 4, 7, 9, 35), #hbo, mbo,dochterzoon, elauto,vegan, jan
B2_ind = c(15, 17, 32), # maria, johanna, johannes
N = N,
warmup = 500,
iter = 5000)
# regularize subpopulations to < 10k
z <- which(subpop_sizes < 10000)
overdisp.est3 <- overdispersed(ard,
known_sizes = subpop_sizes[known_ind],
known_ind = known_ind,
G1_ind = z,
N = N,
warmup = 500,
iter = 5000)
# only subpopulations < 50k
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)
# 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))
summary(x1[,1])
summary(x2[,1])
summary(x3[,1])
summary(x4[,1])
summary(x5[,1])
x <- cbind(x1[,1],x2[,1], x3[,1], x4[,1], x5[,1])
cor(x)
#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)
cor(df[,c("netsover1", "netsover2", "netsover3", "netsover4", "netsover5")])
Homogeneity metrics for gender.
# 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")])
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")])
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$sameeduc <- ifelse(df$opl2 == 0, (df$numeduclow/df$numeduc) * 100, NA)
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')]
LS0tCnRpdGxlOiAiRGVwZW5kZW50IHZhcmlhYmxlczogUmV2aXNpb24iCiNiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliCmF1dGhvcjogIkJhcyBIb2ZzdHJhIgotLS0KCmBgYHtyLCBnbG9iYWxzZXR0aW5ncywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9CmxpYnJhcnkoa25pdHIpCgprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCm9wdHNfY2h1bmskc2V0KHRpZHkub3B0cz1saXN0KHdpZHRoLmN1dG9mZj0xMDApLHRpZHk9VFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsY29tbWVudCA9ICIjPiIsIGNhY2hlPVRSVUUsIGNsYXNzLnNvdXJjZT1jKCJ0ZXN0IiksIGNsYXNzLm91dHB1dD1jKCJ0ZXN0MiIpKQpvcHRpb25zKHdpZHRoID0gMTAwKQpyZ2w6OnNldHVwS25pdHIoKQoKCgpjb2xvcml6ZSA8LSBmdW5jdGlvbih4LCBjb2xvcikge3NwcmludGYoIjxzcGFuIHN0eWxlPSdjb2xvcjogJXM7Jz4lczwvc3Bhbj4iLCBjb2xvciwgeCkgfQoKYGBgCgpgYGB7ciBrbGlwcHksIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRX0Ka2xpcHB5OjprbGlwcHkocG9zaXRpb24gPSBjKCd0b3AnLCAncmlnaHQnKSkKI2tsaXBweTo6a2xpcHB5KGNvbG9yID0gJ2RhcmtyZWQnKQoja2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScpCmBgYAoKTGFzdCBjb21waWxlZCBvbiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVCLCAlWScpYAoKPGJyPgoKLS0tLQoKVGhpcyBpcyB0aGUgY29kZSB3aXRoIHdoaWNoIHdlIG1ha2Ugb3VyIGRlcGVuZGVudCB2YXJpYWJsZXMgYWNjb3JkaW5nIHRvIHRoZSByZXZpc2lvbiBvZiBvdXIgbWFudXNjcmlwdC4KCjxicj4KCi0tLS0KCiMgSW5pdGF0aWF0aW5nIFIgZW52aXJvbm1lbnQKClN0YXJ0IG91dCB3aXRoIGEgY3VzdG9tIGZ1bmN0aW9uIHRvIGxvYWQgYSBzZXQgb2YgcmVxdWlyZWQgcGFja2FnZXMuCiAgCmBgYHtyIHBhY2ssIGV2YWw9RkFMU0V9CgojIHBhY2thZ2VzIGFuZCByZWFkIGRhdGEKcm0obGlzdCA9IGxzKCkpCgojIChjKSBKb2NoZW0gVG9sc21hCmZwYWNrYWdlLmNoZWNrIDwtIGZ1bmN0aW9uKHBhY2thZ2VzKSB7CiAgbGFwcGx5KHBhY2thZ2VzLCBGVU4gPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIXJlcXVpcmUoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKSkgewogICAgICBpbnN0YWxsLnBhY2thZ2VzKHgsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiAgICAgIGxpYnJhcnkoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQogICAgfQogIH0pCn0KcGFja2FnZXMgPSBjKCJoYXZlbiIsICJjb2RhIiwgIm1hdHJpeFN0YXRzIiwgInBhcmFsbGVsIiwgIk1BU1MiLCAiZG9QYXJhbGxlbCIsICJkcGx5ciIsICJjb3dwbG90IiwgCiAgICAgICAgICAgICAidGlkeXZlcnNlIiwgIm5hbmlhciIsICJkb3R3aGlza2VyIiAsImd0IiwgInJlc2hhcGUyIiwgIlZHQU0iLCAiZXhwc3MiLCAibmV0d29ya3NjYWxldXAiKQpmcGFja2FnZS5jaGVjayhwYWNrYWdlcykKcm0ocGFja2FnZXMpCmxvYWQoImRhdGEvZHV0Y2hfbmV0c2l6ZV9hbmFseXNlcy5yZGEiKQoKCgpgYGAKCgoKUmV2aXNpb24gZGVwZW5kZW50IHZhcmlhYmxlIGZvciBuZXR3b3JrIHNpemUKCmBgYHtyIHJldmlzaW9uZGlzcGVyc2VkLCBldmFsPUZBTFNFfQoKZGZhbnMgPC0gZGZbLCBjKCJ1bmkiLCAiaGJvIiwgIm1ibyIsICJkb2NodGVyem9vbiIsICJ0d2VlbGluZyIsICJjb3JvbmEiLCAKICAgICAgICAgICAgICAiZWxhdXRvIiwgInNjb290ZXIiLCAidmVnYW4iLCAKICAgICAgICAgICAgICAiU29waGllIiwgIkp1bGlhIiwiU2FubmUiLCJMaXNhIiwiTGF1cmEiLCJNYXJpYSIsIkxpbmRhIiwiSm9oYW5uYSIsIk1vbmlxdWUiLCJFc3RlciIsCiAgICAgICAgICAgICAgIkFubmEiLCJFbGlzYWJldGgiLCJDb3JuZWxpYSIsIldpbGhlbG1pbmEiLCJBbWlyYSIsIlNhbWlyYSIsIlNhcmEiLCJEYWFuIiwiU2VtIiwKICAgICAgICAgICAgICAiVGhvbWFzIiwiTWF4IiwiS2V2aW4iLCJKb2hhbm5lcyIsIkRlbm5pcyIsIkplcm9lbiIsIkphbiIsIk1hcmNlbCIsIkNvcm5lbGlzIiwiSGVuZHJpayIsIlBldHJ1cyIsCiAgICAgICAgICAgICAgIldpbGxlbSIsIkFsaSIsIk1vaGFtbWVkIiwiTm9vciIpXSAjIHRha2UgbWVhbiBvZiBlYWNoIG9mIHRoZSBjYXRzCgpyZWYxIDwtIGMoODQ5NTcsIDc1MjE0LCAxNDU2MDAsIDE2ODA2NiwgMjUwMCwgMTU1ODU0OSkKIyBPUkRFUjogIHVuaSwgaGJvLCBtYm8sIGRvY2h0ZXIvem9vbiwgdHdlZWxpbmcsIGNvcm9uYQoKcmVmMiA8LSBjKDI3MzI1OSwgNDYwNjE4LCAyNjEwMDApCiMgT1JERVI6ICAgZWxlY2F1dG8sIHNjb290ZXIsIHZlZ2FuLAoKcmVmMyA8LSBjKDE1Mjc2LDE2MzUwLDI3Mzk0LDIxMjAwLDI1NjgxLDMzNDUwMiwyOTk1NSwyNjY1MjIsMzk0ODEsIDI2OTIsCiAgICAgICAgICAxMzYyOTYsMTEwMjMxLDExMjgwNyw5ODIwOCwxMzg2LDIxODYsMTE2NDAsMjI3MDQsMTMyNzYsCiAgICAgICAgICA0MDU0MywxNzAyNCwyMzE2NywzMDcwMzIsMzY0MTEsNDkxODIsMTg2NzQ2LDM1OTczLDEzNDk1NiwxMTg2MTAsODY1MDAsCiAgICAgICAgICAxMDIyOTYsNDIxMyw1MDAzLDQ1MTcpCiMgT1JERVI6ICAgU29waGllLCBKdWxpYSxTYW5uZSxMaXNhLExhdXJhLE1hcmlhLExpbmRhLEpvaGFubmEsTW9uaXF1ZSxFc3RlciwKIyAgICAgICAgICAgICBBbm5hLEVsaXNhYmV0aCxDb3JuZWxpYSxXaWxoZWxtaW5hLEFtaXJhLFNhbWlyYSxTYXJhLERhYW4sU2VtLAojICAgICAgICAgICAgIFRob21hcyxNYXgsS2V2aW4sSm9oYW5uZXMsRGVubmlzLEplcm9lbixKYW4sTWFyY2VsLENvcm5lbGlzLEhlbmRyaWssUGV0cnVzLAojICAgICAgICAgICAgIFdpbGxlbSxBbGksTW9oYW1tZWQsTm9vcgpwb3BzIDwtIGMocmVmMSwgcmVmMiwgcmVmMykKCiMgQW5hbHl6ZSBhbiBleGFtcGxlIGFyZCBkYXRhIHNldCB1c2luZyBaaGVuZyBldCBhbC4gKDIwMDYpIG1vZGVscwphcmQgPC0gYXMubWF0cml4KGRmYW5zKQpzdWJwb3Bfc2l6ZXMgPC0gcG9wcwprbm93bl9pbmQgPC0gYygxOjQzKQpOIDwtIDE3NDA3NTg1CgojIGZpcnN0IHdpdGggcHJpbWFyeSBzY2FsaW5nIGdyb3VwcyBBTEwKb3ZlcmRpc3AuZXN0MSA8LSBvdmVyZGlzcGVyc2VkKGFyZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX3NpemVzID0gc3VicG9wX3NpemVzW2tub3duX2luZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93bl9pbmQgPSBrbm93bl9pbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHMV9pbmQgPSBrbm93bl9pbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOID0gTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm11cCA9IDUwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIgPSA1MDAwKQoKIyBwcmltYXJ5IHNjYWxpbmcgZ3JvdXBzIGFsbCwgZXhjZXB0IHNvbWUKb3ZlcmRpc3AuZXN0MiA8LSBvdmVyZGlzcGVyc2VkKGFyZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX3NpemVzID0gc3VicG9wX3NpemVzW2tub3duX2luZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93bl9pbmQgPSBrbm93bl9pbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHMl9pbmQgPSBjKDIsIDMsIDQsIDcsIDksIDM1KSwgI2hibywgbWJvLGRvY2h0ZXJ6b29uLCBlbGF1dG8sdmVnYW4sIGphbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQjJfaW5kID0gYygxNSwgMTcsIDMyKSwgIyBtYXJpYSwgam9oYW5uYSwgam9oYW5uZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gPSBOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybXVwID0gNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlciA9IDUwMDApCiAKIyByZWd1bGFyaXplIHN1YnBvcHVsYXRpb25zIHRvIDwgMTBrCnogPC0gd2hpY2goc3VicG9wX3NpemVzIDwgMTAwMDApCm92ZXJkaXNwLmVzdDMgPC0gb3ZlcmRpc3BlcnNlZChhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93bl9zaXplcyA9IHN1YnBvcF9zaXplc1trbm93bl9pbmRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd25faW5kID0ga25vd25faW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRzFfaW5kID0geiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gPSBOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybXVwID0gNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlciA9IDUwMDApCgoKIyBvbmx5IHN1YnBvcHVsYXRpb25zIDwgNTBrCnogPC0gd2hpY2goc3VicG9wX3NpemVzIDwgNTAwMDApCmFyZCA8LSBhcmRbLCB6XQpzdWJwb3Bfc2l6ZXMgPC0gcG9wc1t6XQprbm93bl9pbmQgPC0gYygxOmxlbmd0aChzdWJwb3Bfc2l6ZXMpKQpvdmVyZGlzcC5lc3Q0IDwtIG92ZXJkaXNwZXJzZWQoYXJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd25fc2l6ZXMgPSBzdWJwb3Bfc2l6ZXNba25vd25faW5kXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX2luZCA9IGtub3duX2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gPSBOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybXVwID0gNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlciA9IDUwMDApCgoKI3dpdGhvdXQgY29yb25hLCB0aGUgdmVyeSB0b3AgbGV2ZWwgb25lCmFyZCA8LSBhcy5tYXRyaXgoZGZhbnNbLC1jKDYpXSkgCnN1YnBvcF9zaXplcyA8LSBwb3BzWy02XQprbm93bl9pbmQgPC0gYygxOjQyKQpvdmVyZGlzcC5lc3Q1IDwtIG92ZXJkaXNwZXJzZWQoYXJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd25fc2l6ZXMgPSBzdWJwb3Bfc2l6ZXNba25vd25faW5kXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX2luZCA9IGtub3duX2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcxX2luZCA9IGtub3duX2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gPSBOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybXVwID0gNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlciA9IDUwMDApCgojIHNhbWUgaXRlcmF0aW9ucyBpbiBvbmUgbWVhbiwgY29ycmVsYXRlCngxIDwtIGRhdGEuZnJhbWUoY29sTWVhbnMob3ZlcmRpc3AuZXN0MSRkZWdyZWVzKSkKeDIgPC0gZGF0YS5mcmFtZShjb2xNZWFucyhvdmVyZGlzcC5lc3QyJGRlZ3JlZXMpKQp4MyA8LSBkYXRhLmZyYW1lKGNvbE1lYW5zKG92ZXJkaXNwLmVzdDMkZGVncmVlcykpCng0IDwtIGRhdGEuZnJhbWUoY29sTWVhbnMob3ZlcmRpc3AuZXN0NCRkZWdyZWVzKSkKeDUgPC0gZGF0YS5mcmFtZShjb2xNZWFucyhvdmVyZGlzcC5lc3Q1JGRlZ3JlZXMpKQpzdW1tYXJ5KHgxWywxXSkKc3VtbWFyeSh4MlssMV0pCnN1bW1hcnkoeDNbLDFdKQpzdW1tYXJ5KHg0WywxXSkKc3VtbWFyeSh4NVssMV0pCnggPC0gY2JpbmQoeDFbLDFdLHgyWywxXSwgeDNbLDFdLCB4NFssMV0sIHg1WywxXSkKY29yKHgpCgoKCiNzYWZlIHRvIGRhdGEKZGYkbmV0c292ZXIxIDwtIGNvbE1lYW5zKG92ZXJkaXNwLmVzdDEkZGVncmVlcykKZGYkbmV0c292ZXIyIDwtIGNvbE1lYW5zKG92ZXJkaXNwLmVzdDIkZGVncmVlcykKZGYkbmV0c292ZXIzIDwtIGNvbE1lYW5zKG92ZXJkaXNwLmVzdDMkZGVncmVlcykKZGYkbmV0c292ZXI0IDwtIGNvbE1lYW5zKG92ZXJkaXNwLmVzdDQkZGVncmVlcykKZGYkbmV0c292ZXI1IDwtIGNvbE1lYW5zKG92ZXJkaXNwLmVzdDUkZGVncmVlcykKY29yKGRmWyxjKCJuZXRzb3ZlcjEiLCAibmV0c292ZXIyIiwgIm5ldHNvdmVyMyIsICJuZXRzb3ZlcjQiLCAibmV0c292ZXI1IildKQoKYGBgCgpIb21vZ2VuZWl0eSBtZXRyaWNzIGZvciBnZW5kZXIuCgpgYGB7ciByZXZpc2lvbmhvbW9nZW5laXR5X2dlbiwgIGV2YWw9RkFMU0V9CgojR0VOREVSCnRhYmxlKGRmJHdvbWFuKQpkZiRudW13b21hbiA8LSByb3dTdW1zKGRmWywgYygiU29waGllIiwgIkp1bGlhIiwiU2FubmUiLCJMaXNhIiwiTGF1cmEiLCJNYXJpYSIsIkxpbmRhIiwiSm9oYW5uYSIsIk1vbmlxdWUiLCJFc3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbm5hIiwiRWxpc2FiZXRoIiwiQ29ybmVsaWEiLCJXaWxoZWxtaW5hIiwiQW1pcmEiLCJTYW1pcmEiLCJTYXJhIiwgIk5vb3IiKV0pCmRmJG51bW1hbiA8LSByb3dTdW1zKGRmWywgYygiRGFhbiIsIlNlbSIsIlRob21hcyIsIk1heCIsIktldmluIiwiSm9oYW5uZXMiLCJEZW5uaXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkplcm9lbiIsIkphbiIsIk1hcmNlbCIsIkNvcm5lbGlzIiwiSGVuZHJpayIsIlBldHJ1cyIsICJXaWxsZW0iLCJBbGkiLCJNb2hhbW1lZCIpXSkKZGYkbnVtbmFtZXMgPC0gZGYkbnVtd29tYW4rZGYkbnVtbWFuCmRmJHNhbWVnZW5kZXIgPC0gaWZlbHNlKGRmJHdvbWFuID09IDEsIChkZiRudW13b21hbi9kZiRudW1uYW1lcykqMTAwLCAoZGYkbnVtbWFuL2RmJG51bW5hbWVzKSoxMDApCnN1bW1hcnkoZGYkc2FtZWdlbmRlcikKCnN1bW1hcnkoZGZbZGYkd29tYW4gPT0gMSwgYygic2FtZWdlbmRlciIpXSkKc3VtbWFyeShkZltkZiR3b21hbiA9PSAwLCBjKCJzYW1lZ2VuZGVyIildKQoKYGBgCgpIb21vZ2VuZWl0eSBtZXRyaWNzIGZvciBlZHVjYXRpb24uCgpgYGB7ciByZXZpc2lvbmhvbW9nZW5laXR5X2VkdWMsICBldmFsPUZBTFNFfQojRURVQwojaW5kZXBlbmRlbnQKZGYkb3BsMltkZiRvcGxlaWRpbmcgPT0gMV0gPC0gMCAjIHByaW0vc2VjCmRmJG9wbDJbZGYkb3BsZWlkaW5nID09IDJdIDwtIDAgIyBwcmltL3NlYwpkZiRvcGwyW2RmJG9wbGVpZGluZyA9PSAzXSA8LSAwICMgcHJpbS9zZWMKZGYkb3BsMltkZiRvcGxlaWRpbmcgPT0gNF0gPC0gMCAjIHByaW0vc2VjCgpkZiRvcGwyW2RmJG9wbGVpZGluZyA9PSA1XSA8LSAwICMgcHJpbS9zZWMKCmRmJG9wbDJbZGYkb3BsZWlkaW5nID09IDZdIDwtIDEgIyBwcmltL3NlYwpkZiRvcGwyW2RmJG9wbGVpZGluZyA9PSA3XSA8LSAxICMgcHJpbS9zZWMKdGFibGUoZGYkb3BsZWlkaW5nKQp0YWJsZShkZiRvcGwyKQoKZGYkbnVtZWR1Y2hpZ2ggPC0gZGYkaGJvICsgZGYkdW5pCmRmJG51bWVkdWNsb3cgPC0gZGYkbWJvCgpkZiRudW1lZHVjIDwtIHJvd1N1bXMoZGZbLCBjKCJ1bmkiLCAiaGJvIiwgIm1ibyIpXSkKCmRmJHNhbWVlZHVjIDwtIGlmZWxzZShkZiRvcGwyID09IDAsIChkZiRudW1lZHVjbG93IC8gZGYkbnVtZWR1YykgKiAxMDAsIE5BKQpkZiRzYW1lZWR1YyA8LSBpZmVsc2UoZGYkb3BsMiA9PSAxLCAoZGYkbnVtZWR1Y2hpZ2ggLyBkZiRudW1lZHVjKSAqIDEwMCwgZGYkc2FtZWVkdWMpCgpzdW1tYXJ5KGRmJHNhbWVlZHVjKQpzdW1tYXJ5KGRmW2RmJG9wbDIgPT0gMSwgYygic2FtZWVkdWMiKV0pCnN1bW1hcnkoZGZbZGYkb3BsMiA9PSAwLCBjKCJzYW1lZWR1YyIpXSkKCiMgZGYkc2FtZWVkdWNbZGYkb3BsZWkgPT0gNV0gPC0gKGRmJGhibyAvIGRmJG51bWVkdWMpICogMTAwCiMgZGYkc2FtZWVkdWNbZGYkb3BsZWkgPT0gNl0gPC0gKGRmJGhibyAvIGRmJG51bWVkdWMpICogMTAwCiMgCiMgZGYkc2FtZWVkdWNbZGYkb3BsZWkgPT0gN10gPC0gKGRmJHVuaSAvIGRmJG51bWVkdWMpICogMTAwCgojZGZbMTM4LCBjKCJvcGxlaWRpbmciLCAib3BsZWkiLCAibnVtZWR1YyIsICJtYm8iLCAiaGJvIiwgInVuaSIsICJzYW1lZWR1YyIpXQoKIyBnZWVuIG9uZGVyd2lqcyAvIGJhc2lzb25kZXJ3aWpzIC8gY3Vyc3VzIGluYnVyZ2VyaW5nIC8gY3Vyc3VzIE5lZGVybGFuZHNlIHRhYWwgCiMgMSAKIyBMQk8gLyBWQk8gLyBWTUJPIChrYWRlci0gb2YgYmVyb2Vwc2dlcmljaHRlIGxlZXJ3ZWcpIC8gTUJPIDEgKGFzc2lzdGVudGVub3BsZWlkaSAKIyAyIAojIE1BVk8gLyBIQVZPIG9mIFZXTyAoZWVyc3RlIGRyaWUgamFhcikgLyBVTE8gLyBNVUxPIC8gVk1CTyAoVEwgb2YgR0wpIC8gVlNPIAojIDMgCiMgTUJPIDIsIDMsIDQgKGJhc2lzYmVyb2Vwcy0sIHZhay0sIG1pZGRlbmthZGVyLSBvZiBzcGVjaWFsaXN0ZW5vcGxlaWRpbmcpIG9mIE1CTyAKIyA0IAojIEhBVk8gb2YgVldPIChvdmVyZ2VnYWFuIG5hYXIgZGUgNGUga2xhcykgLyBIQlMgLyBNTVMgLyBIQk8gcHJvcGVkZXVzZSBvZiBXTyBQcm9wIAojIDUgCiMgSEJPIChiZWhhbHZlIEhCTy1tYXN0ZXIpIC8gV08ta2FuZGlkYWF0cyAtb2YgV08tYmFjaGVsb3IgCiMgNiAKIyBXTy1kb2N0b3JhYWwgb2YgV08tbWFzdGVyIG9mIEhCTy1tYXN0ZXIgLyBwb3N0ZG9jdG9yYWFsIG9uZGVyd2lqcyAKIyA3CmBgYAoKCkhvbW9nZW5laXR5IG1ldHJpY3MgZm9yIGV0aG5pYyBiYWNrZ3JvdW5kCgpgYGB7ciByZXZpc2lvbmhvbW9nZW5laXR5X2V0aG5pYywgIGV2YWw9RkFMU0V9CiMgCiMgIyBFVEhOSUMKIyBkZiRudW1kdXRjaCA8LSByb3dTdW1zKGRmWywgYygiU29waGllIiwgIkp1bGlhIiwiU2FubmUiLCJMaXNhIiwiTGF1cmEiLCJNYXJpYSIsIkxpbmRhIiwiSm9oYW5uYSIsIk1vbmlxdWUiLCJFc3RlciIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFubmEiLCJFbGlzYWJldGgiLCJDb3JuZWxpYSIsIldpbGhlbG1pbmEiLCAiU2FyYSIsICJOb29yIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGFhbiIsIlNlbSIsIlRob21hcyIsIk1heCIsIktldmluIiwiSm9oYW5uZXMiLCJEZW5uaXMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKZXJvZW4iLCJKYW4iLCJNYXJjZWwiLCJDb3JuZWxpcyIsIkhlbmRyaWsiLCJQZXRydXMiLCAiV2lsbGVtIildKQojIGRmJG51bW5vZHV0Y2ggPC0gcm93U3VtcyhkZlssIGMoIkFsaSIsIk1vaGFtbWVkIiwiQW1pcmEiLCJTYW1pcmEiKV0pCiMgdGFibGUoZGYkbWlncjMpCiMgZGYkc2FtZWV0aG5pYzEgPC0gaWZlbHNlKGRmJG1pZ3IzID09IDEsIChkZiRudW1kdXRjaC9kZiRudW1uYW1lcykqMTAwLCAoZGYkbnVtbm9kdXRjaC9kZiRudW1uYW1lcykqMTAwKQojIGRmJHNhbWVldGhuaWMyIDwtIGlmZWxzZShkZiRtaWdyMyA9PSAxLCAoZGYkbnVtZHV0Y2gvZGYkbnVtbmFtZXMpKjEwMCwgKGRmJG51bW5vZHV0Y2gvZGYkbnVtbmFtZXMpKjEwMCkKIyBkZiRzYW1lZXRobmljMiA8LSBpZmVsc2UoZGYkbWlncjMgPT0gMiwgTkEsIGRmJHNhbWVldGhuaWMxKQojIAojIGRmWzM3LCBjKCJtaWdyMyIsICJzYW1lZXRobmljMSIsICJudW1kdXRjaCIsICJudW1ub2R1dGNoIiwgIm51bW5hbWVzIildCgoKYGBgCgojIERhdGEgc3RvcmFnZQogIApGaW5hbGx5LCB3ZSBzYXZlIHRoZSBkYXRhIHRoYXQgd2UgdXNlIGZvciB0aGUgYW5hbHlzZXMuCiAgCmBgYHtyIGRhdGFzYXZlLCBldmFsPUZBTFNFfQoKIyBzYXZlIGRhdGEKc2F2ZShkZiwgZmlsZSA9ICJkYXRhL2R1dGNoX25ldHNpemVfYW5hbHlzZXNfcmV2aXNpb24ucmRhIikKCmBgYA==