Still to-do:
- Behaviour model (continuous dep variable!)
- Make plot (department + discipline)
- Goodness of fit analyses + plot
- Use new dataset?
- Functie as varying covariate
- Write introduction etc.
- Data/methods: explain why undirected network
#Trying behaviour as dependent variable
#start clean
rm(list=ls())
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)
}
})
}
fsave <- function(x, file = NULL, location = "./data/processed/") {
ifelse(!dir.exists("data"), dir.create("data"), FALSE)
ifelse(!dir.exists("data/processed"), dir.create("data/processed"), FALSE)
if (is.null(file))
file = deparse(substitute(x))
datename <- substr(gsub("[:-]", "", Sys.time()), 1, 8)
totalname <- paste(location, datename, file, ".rda", sep = "")
save(x, file = totalname) #need to fix if file is reloaded as input name, not as x.
}
fload <- function(filename) {
load(filename)
get(ls()[ls() != "filename"])
}
fshowdf <- function(x, ...) {
knitr::kable(x, digits = 2, "html", ...) %>%
kableExtra::kable_styling(bootstrap_options = c("striped", "hover")) %>%
kableExtra::scroll_box(width = "100%", height = "300px")
}
fcolnet <- function(data = scholars, university = "RU", discipline = "sociology", waves = list(c(2015,
2018), c(2019, 2023)), type = c("first")) {
# step 1
demographics <- do.call(rbind.data.frame, data$demographics)
demographics <- demographics %>%
mutate(Universiteit1.22 = replace(Universiteit1.22, is.na(Universiteit1.22), ""), Universiteit2.22 = replace(Universiteit2.22,
is.na(Universiteit2.22), ""), Universiteit1.24 = replace(Universiteit1.24, is.na(Universiteit1.24),
""), Universiteit2.24 = replace(Universiteit2.24, is.na(Universiteit2.24), ""), discipline.22 = replace(discipline.22,
is.na(discipline.22), ""), discipline.24 = replace(discipline.24, is.na(discipline.24), ""))
sample <- which((demographics$Universiteit1.22 %in% university | demographics$Universiteit2.22 %in%
university | demographics$Universiteit1.24 %in% university | demographics$Universiteit2.24 %in%
university) & (demographics$discipline.22 %in% discipline | demographics$discipline.24 %in% discipline))
demographics_soc <- demographics[sample, ]
scholars_sel <- lapply(scholars, "[", sample)
# step 2
ids <- demographics_soc$au_id
nwaves <- length(waves)
nets <- array(0, dim = c(nwaves, length(ids), length(ids)), dimnames = list(wave = 1:nwaves, ids,
ids))
dimnames(nets)
# step 3
df_works <- tibble(works_id = unlist(lapply(scholars_sel$work, function(l) l$id)), works_author = unlist(lapply(scholars_sel$work,
function(l) l$author), recursive = FALSE), works_year = unlist(lapply(scholars_sel$work, function(l) l$publication_year),
recursive = FALSE))
df_works <- df_works[!duplicated(df_works), ]
# step 4
if (type == "first") {
for (j in 1:nwaves) {
df_works_w <- df_works[df_works$works_year >= waves[[j]][1] & df_works$works_year <= waves[[j]][2],
]
for (i in 1:nrow(df_works_w)) {
ego <- df_works_w$works_author[i][[1]]$au_id[1]
alters <- df_works_w$works_author[i][[1]]$au_id[-1]
if (sum(ids %in% ego) > 0 & sum(ids %in% alters) > 0) {
nets[j, which(ids %in% ego), which(ids %in% alters)] <- 1
}
}
}
}
if (type == "last") {
for (j in 1:nwaves) {
df_works_w <- df_works[df_works$works_year >= waves[[j]][1] & df_works$works_year <= waves[[j]][2],
]
for (i in 1:nrow(df_works_w)) {
ego <- rev(df_works_w$works_author[i][[1]]$au_id)[1]
alters <- rev(df_works_w$works_author[i][[1]]$au_id)[-1]
if (sum(ids %in% ego) > 0 & sum(ids %in% alters) > 0) {
nets[j, which(ids %in% ego), which(ids %in% alters)] <- 1
}
}
}
}
if (type == "all") {
for (j in 1:nwaves) {
df_works_w <- df_works[df_works$works_year >= waves[[j]][1] & df_works$works_year <= waves[[j]][2],
]
for (i in 1:nrow(df_works_w)) {
egos <- df_works_w$works_author[i][[1]]$au_id
if (sum(ids %in% egos) > 0) {
nets[j, which(ids %in% egos), which(ids %in% egos)] <- 1
}
}
}
}
output <- list()
output$data <- scholars_sel
output$nets <- nets
return(output)
}
packages = c("RSiena", "tidyverse")
fpackage.check(packages)
##load data
#network
scholars <- fload("C:/Users/kalle/OneDrive/Documenten/REMA/Jaar 2/Social Networks/KS_labjournal/data/processed/scholars_20240924.rda")
scholars_net <- fcolnet(data = scholars,
university = c("RU", "UU", "RUG", "UvA", "VU", "EUR", "Leiden", "UvT"),
discipline = c("sociology", "political science"),
waves = list(c(2015, 2018), c(2019, 2023)),
type = c("all"))
wave1 <- scholars_net$nets[1,,]
wave2 <- scholars_net$nets[2,,]
#ego characteristics
df_ego <- fload("C:/Users/kalle/OneDrive/Documenten/REMA/Jaar 2/Social Networks/KS_labjournal/data/processed/20251010df_ego.rda")
citations <- df_ego |>
select(citations_w1, citations_w2) |>
as.matrix()
str(citations)
##some checks
dim(wave1)
dim(wave2)
#should be 0
sum(is.na(wave1))
#set diagonal to 0
sum(diag(wave2)==0)
diag(wave1) <- 0
diag(wave2) <- 0
#only 1s and 0s
sum(wave1>1)
#at least some 1s
sum(wave1>0)
#make array
nets <- array(data = c(wave1, wave2), dim = c(dim(wave1), 2))
## dependent
net <- sienaDependent(nets)
citation_dep <- sienaDependent(citations, type = "continuous")
str(citation_dep)
## independent
functie <- coCovar(df_ego$functie_level)
df_ego$Universiteit1.22 <- as.numeric(as.factor(df_ego$Universiteit1.22))
uni <- coCovar(df_ego$Universiteit1.22)
df_ego$discipline.22 <- as.numeric(as.factor(df_ego$discipline.22))
disc <- coCovar(df_ego$discipline.22)
mydata <- sienaDataCreate(net, citation_dep, functie, uni, disc)
#Initial effects and look at data
myeff <- getEffects(mydata)
myeff
print01Report(mydata, modelname = "./results/behavtest_scholars")
##Specify model
myeff <- getEffects(mydata)
#basic structural elements
myeff <- includeEffects(myeff, gwesp, outAct)
#homophily based on position
myeff <- includeEffects(myeff, simX, interaction1 = "functie") #sameX proberen?
#egoX of AltX toevoegen
#control for same uni and discipline, (gender?)
myeff <- includeEffects(myeff, sameX, interaction1 = "uni")
myeff <- includeEffects(myeff, sameX, interaction1 = "disc")
##behavioural effects?
#attraction towards higher/lower citation scores of alters
myeff <- includeEffects(myeff, linear, quadratic, name = "citation_dep")
myeff <- includeEffects(myeff, avAlt, name = "citation_dep")
myeff <- includeEffects(myeff, avXAlt, interaction1 = "functie", name = "citation_dep")
myeff
#Estimate model
myAlgorithm <- sienaAlgorithmCreate(projname = "scholars", modelType = 3)
EstM1 <- siena07(myAlgorithm, data = mydata, effects = myeff, returnDeps = TRUE)
EstM1
LS0tDQp0aXRsZTogIldlZWsgNiINCmF1dGhvcjogIkthbGxlIFN0b2ZmZXJzIg0KZGF0ZTogIjIwMjUtMTAtMTAiDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpTdGlsbCB0by1kbzoNCg0KLSBCZWhhdmlvdXIgbW9kZWwgKGNvbnRpbnVvdXMgZGVwIHZhcmlhYmxlISkNCi0gTWFrZSBwbG90IChkZXBhcnRtZW50ICsgZGlzY2lwbGluZSkNCi0gR29vZG5lc3Mgb2YgZml0IGFuYWx5c2VzICsgcGxvdA0KLSBVc2UgbmV3IGRhdGFzZXQ/DQotIEZ1bmN0aWUgYXMgdmFyeWluZyBjb3ZhcmlhdGUNCi0gV3JpdGUgaW50cm9kdWN0aW9uIGV0Yy4NCi0gRGF0YS9tZXRob2RzOiBleHBsYWluIHdoeSB1bmRpcmVjdGVkIG5ldHdvcmsNCg0KDQoNCg0KDQojVHJ5aW5nIGJlaGF2aW91ciBhcyBkZXBlbmRlbnQgdmFyaWFibGUNCmBgYHtyLCBldmFsPUYsIGVjaG89VH0NCg0KI3N0YXJ0IGNsZWFuDQpybShsaXN0PWxzKCkpDQoNCmZwYWNrYWdlLmNoZWNrIDwtIGZ1bmN0aW9uKHBhY2thZ2VzKSB7DQogICAgbGFwcGx5KHBhY2thZ2VzLCBGVU4gPSBmdW5jdGlvbih4KSB7DQogICAgICAgIGlmICghcmVxdWlyZSh4LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpKSB7DQogICAgICAgICAgICBpbnN0YWxsLnBhY2thZ2VzKHgsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICAgICAgICAgICBsaWJyYXJ5KHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCiAgICAgICAgfQ0KICAgIH0pDQp9DQoNCmZzYXZlIDwtIGZ1bmN0aW9uKHgsIGZpbGUgPSBOVUxMLCBsb2NhdGlvbiA9ICIuL2RhdGEvcHJvY2Vzc2VkLyIpIHsNCiAgICBpZmVsc2UoIWRpci5leGlzdHMoImRhdGEiKSwgZGlyLmNyZWF0ZSgiZGF0YSIpLCBGQUxTRSkNCiAgICBpZmVsc2UoIWRpci5leGlzdHMoImRhdGEvcHJvY2Vzc2VkIiksIGRpci5jcmVhdGUoImRhdGEvcHJvY2Vzc2VkIiksIEZBTFNFKQ0KICAgIGlmIChpcy5udWxsKGZpbGUpKQ0KICAgICAgICBmaWxlID0gZGVwYXJzZShzdWJzdGl0dXRlKHgpKQ0KICAgIGRhdGVuYW1lIDwtIHN1YnN0cihnc3ViKCJbOi1dIiwgIiIsIFN5cy50aW1lKCkpLCAxLCA4KQ0KICAgIHRvdGFsbmFtZSA8LSBwYXN0ZShsb2NhdGlvbiwgZGF0ZW5hbWUsIGZpbGUsICIucmRhIiwgc2VwID0gIiIpDQogICAgc2F2ZSh4LCBmaWxlID0gdG90YWxuYW1lKSAgI25lZWQgdG8gZml4IGlmIGZpbGUgaXMgcmVsb2FkZWQgYXMgaW5wdXQgbmFtZSwgbm90IGFzIHguIA0KfQ0KDQpmbG9hZCA8LSBmdW5jdGlvbihmaWxlbmFtZSkgew0KICAgIGxvYWQoZmlsZW5hbWUpDQogICAgZ2V0KGxzKClbbHMoKSAhPSAiZmlsZW5hbWUiXSkNCn0NCg0KZnNob3dkZiA8LSBmdW5jdGlvbih4LCAuLi4pIHsNCiAgICBrbml0cjo6a2FibGUoeCwgZGlnaXRzID0gMiwgImh0bWwiLCAuLi4pICU+JQ0KICAgICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKSAlPiUNCiAgICAgICAga2FibGVFeHRyYTo6c2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjMwMHB4IikNCn0NCg0KZmNvbG5ldCA8LSBmdW5jdGlvbihkYXRhID0gc2Nob2xhcnMsIHVuaXZlcnNpdHkgPSAiUlUiLCBkaXNjaXBsaW5lID0gInNvY2lvbG9neSIsIHdhdmVzID0gbGlzdChjKDIwMTUsDQogICAgMjAxOCksIGMoMjAxOSwgMjAyMykpLCB0eXBlID0gYygiZmlyc3QiKSkgew0KDQogICAgIyBzdGVwIDENCiAgICBkZW1vZ3JhcGhpY3MgPC0gZG8uY2FsbChyYmluZC5kYXRhLmZyYW1lLCBkYXRhJGRlbW9ncmFwaGljcykNCiAgICBkZW1vZ3JhcGhpY3MgPC0gZGVtb2dyYXBoaWNzICU+JQ0KICAgICAgICBtdXRhdGUoVW5pdmVyc2l0ZWl0MS4yMiA9IHJlcGxhY2UoVW5pdmVyc2l0ZWl0MS4yMiwgaXMubmEoVW5pdmVyc2l0ZWl0MS4yMiksICIiKSwgVW5pdmVyc2l0ZWl0Mi4yMiA9IHJlcGxhY2UoVW5pdmVyc2l0ZWl0Mi4yMiwNCiAgICAgICAgICAgIGlzLm5hKFVuaXZlcnNpdGVpdDIuMjIpLCAiIiksIFVuaXZlcnNpdGVpdDEuMjQgPSByZXBsYWNlKFVuaXZlcnNpdGVpdDEuMjQsIGlzLm5hKFVuaXZlcnNpdGVpdDEuMjQpLA0KICAgICAgICAgICAgIiIpLCBVbml2ZXJzaXRlaXQyLjI0ID0gcmVwbGFjZShVbml2ZXJzaXRlaXQyLjI0LCBpcy5uYShVbml2ZXJzaXRlaXQyLjI0KSwgIiIpLCBkaXNjaXBsaW5lLjIyID0gcmVwbGFjZShkaXNjaXBsaW5lLjIyLA0KICAgICAgICAgICAgaXMubmEoZGlzY2lwbGluZS4yMiksICIiKSwgZGlzY2lwbGluZS4yNCA9IHJlcGxhY2UoZGlzY2lwbGluZS4yNCwgaXMubmEoZGlzY2lwbGluZS4yNCksICIiKSkNCg0KICAgIHNhbXBsZSA8LSB3aGljaCgoZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDEuMjIgJWluJSB1bml2ZXJzaXR5IHwgZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDIuMjIgJWluJQ0KICAgICAgICB1bml2ZXJzaXR5IHwgZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDEuMjQgJWluJSB1bml2ZXJzaXR5IHwgZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDIuMjQgJWluJQ0KICAgICAgICB1bml2ZXJzaXR5KSAmIChkZW1vZ3JhcGhpY3MkZGlzY2lwbGluZS4yMiAlaW4lIGRpc2NpcGxpbmUgfCBkZW1vZ3JhcGhpY3MkZGlzY2lwbGluZS4yNCAlaW4lIGRpc2NpcGxpbmUpKQ0KDQogICAgZGVtb2dyYXBoaWNzX3NvYyA8LSBkZW1vZ3JhcGhpY3Nbc2FtcGxlLCBdDQogICAgc2Nob2xhcnNfc2VsIDwtIGxhcHBseShzY2hvbGFycywgIlsiLCBzYW1wbGUpDQoNCiAgICAjIHN0ZXAgMg0KICAgIGlkcyA8LSBkZW1vZ3JhcGhpY3Nfc29jJGF1X2lkDQogICAgbndhdmVzIDwtIGxlbmd0aCh3YXZlcykNCiAgICBuZXRzIDwtIGFycmF5KDAsIGRpbSA9IGMobndhdmVzLCBsZW5ndGgoaWRzKSwgbGVuZ3RoKGlkcykpLCBkaW1uYW1lcyA9IGxpc3Qod2F2ZSA9IDE6bndhdmVzLCBpZHMsDQogICAgICAgIGlkcykpDQogICAgZGltbmFtZXMobmV0cykNCg0KICAgICMgc3RlcCAzDQogICAgZGZfd29ya3MgPC0gdGliYmxlKHdvcmtzX2lkID0gdW5saXN0KGxhcHBseShzY2hvbGFyc19zZWwkd29yaywgZnVuY3Rpb24obCkgbCRpZCkpLCB3b3Jrc19hdXRob3IgPSB1bmxpc3QobGFwcGx5KHNjaG9sYXJzX3NlbCR3b3JrLA0KICAgICAgICBmdW5jdGlvbihsKSBsJGF1dGhvciksIHJlY3Vyc2l2ZSA9IEZBTFNFKSwgd29ya3NfeWVhciA9IHVubGlzdChsYXBwbHkoc2Nob2xhcnNfc2VsJHdvcmssIGZ1bmN0aW9uKGwpIGwkcHVibGljYXRpb25feWVhciksDQogICAgICAgIHJlY3Vyc2l2ZSA9IEZBTFNFKSkNCg0KICAgIGRmX3dvcmtzIDwtIGRmX3dvcmtzWyFkdXBsaWNhdGVkKGRmX3dvcmtzKSwgXQ0KDQogICAgIyBzdGVwIDQNCiAgICBpZiAodHlwZSA9PSAiZmlyc3QiKSB7DQogICAgICAgIGZvciAoaiBpbiAxOm53YXZlcykgew0KICAgICAgICAgICAgZGZfd29ya3NfdyA8LSBkZl93b3Jrc1tkZl93b3JrcyR3b3Jrc195ZWFyID49IHdhdmVzW1tqXV1bMV0gJiBkZl93b3JrcyR3b3Jrc195ZWFyIDw9IHdhdmVzW1tqXV1bMl0sDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgZm9yIChpIGluIDE6bnJvdyhkZl93b3Jrc193KSkgew0KICAgICAgICAgICAgICAgIGVnbyA8LSBkZl93b3Jrc193JHdvcmtzX2F1dGhvcltpXVtbMV1dJGF1X2lkWzFdDQogICAgICAgICAgICAgICAgYWx0ZXJzIDwtIGRmX3dvcmtzX3ckd29ya3NfYXV0aG9yW2ldW1sxXV0kYXVfaWRbLTFdDQogICAgICAgICAgICAgICAgaWYgKHN1bShpZHMgJWluJSBlZ28pID4gMCAmIHN1bShpZHMgJWluJSBhbHRlcnMpID4gMCkgew0KICAgICAgICAgICAgICAgICAgbmV0c1tqLCB3aGljaChpZHMgJWluJSBlZ28pLCB3aGljaChpZHMgJWluJSBhbHRlcnMpXSA8LSAxDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKHR5cGUgPT0gImxhc3QiKSB7DQogICAgICAgIGZvciAoaiBpbiAxOm53YXZlcykgew0KICAgICAgICAgICAgZGZfd29ya3NfdyA8LSBkZl93b3Jrc1tkZl93b3JrcyR3b3Jrc195ZWFyID49IHdhdmVzW1tqXV1bMV0gJiBkZl93b3JrcyR3b3Jrc195ZWFyIDw9IHdhdmVzW1tqXV1bMl0sDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgZm9yIChpIGluIDE6bnJvdyhkZl93b3Jrc193KSkgew0KICAgICAgICAgICAgICAgIGVnbyA8LSByZXYoZGZfd29ya3NfdyR3b3Jrc19hdXRob3JbaV1bWzFdXSRhdV9pZClbMV0NCiAgICAgICAgICAgICAgICBhbHRlcnMgPC0gcmV2KGRmX3dvcmtzX3ckd29ya3NfYXV0aG9yW2ldW1sxXV0kYXVfaWQpWy0xXQ0KICAgICAgICAgICAgICAgIGlmIChzdW0oaWRzICVpbiUgZWdvKSA+IDAgJiBzdW0oaWRzICVpbiUgYWx0ZXJzKSA+IDApIHsNCiAgICAgICAgICAgICAgICAgIG5ldHNbaiwgd2hpY2goaWRzICVpbiUgZWdvKSwgd2hpY2goaWRzICVpbiUgYWx0ZXJzKV0gPC0gMQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmICh0eXBlID09ICJhbGwiKSB7DQogICAgICAgIGZvciAoaiBpbiAxOm53YXZlcykgew0KICAgICAgICAgICAgZGZfd29ya3NfdyA8LSBkZl93b3Jrc1tkZl93b3JrcyR3b3Jrc195ZWFyID49IHdhdmVzW1tqXV1bMV0gJiBkZl93b3JrcyR3b3Jrc195ZWFyIDw9IHdhdmVzW1tqXV1bMl0sDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgZm9yIChpIGluIDE6bnJvdyhkZl93b3Jrc193KSkgew0KICAgICAgICAgICAgICAgIGVnb3MgPC0gZGZfd29ya3NfdyR3b3Jrc19hdXRob3JbaV1bWzFdXSRhdV9pZA0KICAgICAgICAgICAgICAgIGlmIChzdW0oaWRzICVpbiUgZWdvcykgPiAwKSB7DQogICAgICAgICAgICAgICAgICBuZXRzW2osIHdoaWNoKGlkcyAlaW4lIGVnb3MpLCB3aGljaChpZHMgJWluJSBlZ29zKV0gPC0gMQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBvdXRwdXQgPC0gbGlzdCgpDQogICAgb3V0cHV0JGRhdGEgPC0gc2Nob2xhcnNfc2VsDQogICAgb3V0cHV0JG5ldHMgPC0gbmV0cw0KICAgIHJldHVybihvdXRwdXQpDQp9DQoNCnBhY2thZ2VzID0gYygiUlNpZW5hIiwgInRpZHl2ZXJzZSIpDQpmcGFja2FnZS5jaGVjayhwYWNrYWdlcykNCg0KDQpgYGANCg0KYGBge3IsIGV2YWw9RiwgZWNobz1UfQ0KIyNsb2FkIGRhdGENCg0KI25ldHdvcmsNCnNjaG9sYXJzIDwtIGZsb2FkKCJDOi9Vc2Vycy9rYWxsZS9PbmVEcml2ZS9Eb2N1bWVudGVuL1JFTUEvSmFhciAyL1NvY2lhbCBOZXR3b3Jrcy9LU19sYWJqb3VybmFsL2RhdGEvcHJvY2Vzc2VkL3NjaG9sYXJzXzIwMjQwOTI0LnJkYSIpDQogIA0Kc2Nob2xhcnNfbmV0IDwtIGZjb2xuZXQoZGF0YSA9IHNjaG9sYXJzLCANCiAgICAgICAgICAgICAgICB1bml2ZXJzaXR5ID0gYygiUlUiLCAiVVUiLCAiUlVHIiwgIlV2QSIsICJWVSIsICJFVVIiLCAiTGVpZGVuIiwgIlV2VCIpLCANCiAgICAgICAgICAgICAgICBkaXNjaXBsaW5lID0gYygic29jaW9sb2d5IiwgInBvbGl0aWNhbCBzY2llbmNlIiksIA0KICAgICAgICAgICAgICAgIHdhdmVzID0gbGlzdChjKDIwMTUsIDIwMTgpLCBjKDIwMTksIDIwMjMpKSwgDQogICAgICAgICAgICAgICAgdHlwZSA9IGMoImFsbCIpKQ0KDQp3YXZlMSA8LSBzY2hvbGFyc19uZXQkbmV0c1sxLCxdDQp3YXZlMiA8LSBzY2hvbGFyc19uZXQkbmV0c1syLCxdDQoNCg0KI2VnbyBjaGFyYWN0ZXJpc3RpY3MNCg0KZGZfZWdvIDwtIGZsb2FkKCJDOi9Vc2Vycy9rYWxsZS9PbmVEcml2ZS9Eb2N1bWVudGVuL1JFTUEvSmFhciAyL1NvY2lhbCBOZXR3b3Jrcy9LU19sYWJqb3VybmFsL2RhdGEvcHJvY2Vzc2VkLzIwMjUxMDEwZGZfZWdvLnJkYSIpDQoNCmNpdGF0aW9ucyA8LSBkZl9lZ28gfD4NCiAgc2VsZWN0KGNpdGF0aW9uc193MSwgY2l0YXRpb25zX3cyKSB8Pg0KICBhcy5tYXRyaXgoKQ0KDQpzdHIoY2l0YXRpb25zKQ0KDQojI3NvbWUgY2hlY2tzDQpkaW0od2F2ZTEpDQpkaW0od2F2ZTIpDQoNCiNzaG91bGQgYmUgMA0Kc3VtKGlzLm5hKHdhdmUxKSkNCg0KI3NldCBkaWFnb25hbCB0byAwDQpzdW0oZGlhZyh3YXZlMik9PTApDQoNCmRpYWcod2F2ZTEpIDwtIDANCmRpYWcod2F2ZTIpIDwtIDANCg0KI29ubHkgMXMgYW5kIDBzDQpzdW0od2F2ZTE+MSkNCg0KI2F0IGxlYXN0IHNvbWUgMXMNCnN1bSh3YXZlMT4wKQ0KDQojbWFrZSBhcnJheQ0KbmV0cyA8LSBhcnJheShkYXRhID0gYyh3YXZlMSwgd2F2ZTIpLCBkaW0gPSBjKGRpbSh3YXZlMSksIDIpKQ0KDQojIyBkZXBlbmRlbnQNCm5ldCA8LSBzaWVuYURlcGVuZGVudChuZXRzKQ0KDQpjaXRhdGlvbl9kZXAgPC0gc2llbmFEZXBlbmRlbnQoY2l0YXRpb25zLCB0eXBlID0gImNvbnRpbnVvdXMiKQ0KDQpzdHIoY2l0YXRpb25fZGVwKQ0KDQoNCiMjIGluZGVwZW5kZW50DQoNCmZ1bmN0aWUgPC0gY29Db3ZhcihkZl9lZ28kZnVuY3RpZV9sZXZlbCkNCg0KZGZfZWdvJFVuaXZlcnNpdGVpdDEuMjIgPC0gYXMubnVtZXJpYyhhcy5mYWN0b3IoZGZfZWdvJFVuaXZlcnNpdGVpdDEuMjIpKQ0KdW5pIDwtIGNvQ292YXIoZGZfZWdvJFVuaXZlcnNpdGVpdDEuMjIpDQoNCmRmX2VnbyRkaXNjaXBsaW5lLjIyIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKGRmX2VnbyRkaXNjaXBsaW5lLjIyKSkNCmRpc2MgPC0gY29Db3ZhcihkZl9lZ28kZGlzY2lwbGluZS4yMikNCg0KbXlkYXRhIDwtIHNpZW5hRGF0YUNyZWF0ZShuZXQsIGNpdGF0aW9uX2RlcCwgZnVuY3RpZSwgdW5pLCBkaXNjKQ0KDQpgYGANCg0KYGBge3IsIGV2YWw9RiwgZWNobz1UfQ0KI0luaXRpYWwgZWZmZWN0cyBhbmQgbG9vayBhdCBkYXRhDQpteWVmZiA8LSBnZXRFZmZlY3RzKG15ZGF0YSkNCm15ZWZmDQoNCnByaW50MDFSZXBvcnQobXlkYXRhLCBtb2RlbG5hbWUgPSAiLi9yZXN1bHRzL2JlaGF2dGVzdF9zY2hvbGFycyIpDQoNCmBgYA0KDQpgYGB7ciwgZXZhbD1GQUxTRSwgZWNobz1UUlVFfQ0KIyNTcGVjaWZ5IG1vZGVsDQpteWVmZiA8LSBnZXRFZmZlY3RzKG15ZGF0YSkNCg0KI2Jhc2ljIHN0cnVjdHVyYWwgZWxlbWVudHMNCm15ZWZmIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmLCBnd2VzcCwgb3V0QWN0KQ0KDQojaG9tb3BoaWx5IGJhc2VkIG9uIHBvc2l0aW9uDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgc2ltWCwgaW50ZXJhY3Rpb24xID0gImZ1bmN0aWUiKSAjc2FtZVggcHJvYmVyZW4/IA0KI2Vnb1ggb2YgQWx0WCB0b2V2b2VnZW4NCg0KI2NvbnRyb2wgZm9yIHNhbWUgdW5pIGFuZCBkaXNjaXBsaW5lLCAoZ2VuZGVyPykNCm15ZWZmIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmLCBzYW1lWCwgaW50ZXJhY3Rpb24xID0gInVuaSIpDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgc2FtZVgsIGludGVyYWN0aW9uMSA9ICJkaXNjIikNCg0KIyNiZWhhdmlvdXJhbCBlZmZlY3RzPw0KDQojYXR0cmFjdGlvbiB0b3dhcmRzIGhpZ2hlci9sb3dlciBjaXRhdGlvbiBzY29yZXMgb2YgYWx0ZXJzDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgbGluZWFyLCBxdWFkcmF0aWMsIG5hbWUgPSAiY2l0YXRpb25fZGVwIikNCm15ZWZmIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmLCBhdkFsdCwgbmFtZSA9ICJjaXRhdGlvbl9kZXAiKQ0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIGF2WEFsdCwgaW50ZXJhY3Rpb24xID0gImZ1bmN0aWUiLCBuYW1lID0gImNpdGF0aW9uX2RlcCIpDQpteWVmZg0KDQoNCg0KDQpgYGANCg0KYGBge3IsIGV2YWw9RkFMU0UsIGVjaG89VFJVRX0NCiNFc3RpbWF0ZSBtb2RlbA0KDQpteUFsZ29yaXRobSA8LSBzaWVuYUFsZ29yaXRobUNyZWF0ZShwcm9qbmFtZSA9ICJzY2hvbGFycyIsIG1vZGVsVHlwZSA9IDMpDQpFc3RNMSA8LSBzaWVuYTA3KG15QWxnb3JpdGhtLCBkYXRhID0gbXlkYXRhLCBlZmZlY3RzID0gbXllZmYsIHJldHVybkRlcHMgPSBUUlVFKQ0KDQpFc3RNMQ0KDQpgYGANCg0KDQoNCg==