#start clean
rm(list=ls())
#Custom functions
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")
}

colorize <- function(x, color) {
    sprintf("<span style='color: %s;'>%s</span>", color, x)
}

#the big one
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)
}

fpackage.check(c("tidyverse", "RSiena"))
## [[1]]
## NULL
## 
## [[2]]
## NULL

#Add citations to the data

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"))

df_ego <- do.call(rbind.data.frame, scholars_net$data$demographics)

df_citations <-  fload("C:/Users/kalle/OneDrive/Documenten/REMA/Jaar 2/Social Networks/KS_labjournal/data/processed/df_20250929.rda")

#merging
df_ego <- df_ego |>
  left_join(df_citations |> select(Naam, citations_w1, citations_w2),
            by = "Naam")

#make ordinal variable function

table(df_ego$Functie.24, useNA = "always")
## 
##                                                                                             ? 
##                                                                                             1 
##                                                                            Adjunct hoogleraar 
##                                                                                             1 
##                                                                          Associate researcher 
##                                                                                             1 
##                                                                          Bijzonder hoogleraar 
##                                                                                            14 
##                                                                          Bijzonder Hoogleraar 
##                                                                                             2 
##                                                                                   Datamanager 
##                                                                                             1 
##                                                                                 Directeur SoG 
##                                                                                             1 
##                                                                                        Docent 
##                                                                                            24 
##                                                                        Docent (gepensioneerd) 
##                                                                                             1 
##                                                                                   Docent, phd 
##                                                                                             1 
##                                                                            Docent/PhD student 
##                                                                                             1 
##                                                                                       Docent? 
##                                                                                             1 
##                                                                           Doctoral Researcher 
##                                                                                             2 
##                                                                              Doctoral student 
##                                                                                             1 
## Does project at UvA, has worked as professor, lecturer, and research fellow at different unis 
##                                                                                             1 
##                                                                           Emeritus hoogleraar 
##                                                                                            12 
##                                                                   Emeritus hoogleraar (gast?) 
##                                                                                             1 
##                                                                                  External Phd 
##                                                                                             6 
##                                                                                  External PhD 
##                                                                                             1 
##                                                                                        Fellow 
##                                                                                             1 
##                                                                             Gast/ Onderzoeker 
##                                                                                             1 
##                                                        Gast/Emeritus universitair hoofddocent 
##                                                                                             1 
##                                                                               Gastonderzoeker 
##                                                                                             1 
##                                                               Gepensioneerd docent sociologie 
##                                                                                             1 
##                                                                             Gepensioneerd UHD 
##                                                                                             1 
##                                                                              Guest Researcher 
##                                                                                             2 
##                                                                            Honorary professor 
##                                                                                             2 
##                                                                              Hoofdonderzoeker 
##                                                                                             1 
##                                                                                    Hoogleraar 
##                                                                                            83 
##                                                                             Hoogleraar (gast) 
##                                                                                             1 
##                                                                         Hoogleraar (visiting) 
##                                                                                             1 
##                                                         Hoogleraar + Universitair hoofddocent 
##                                                                                             1 
##                                                                Hoogleraar/Afdelingsvoorzitter 
##                                                                                             1 
##                                                                                 Junior docent 
##                                                                                             1 
##                                                                            Junior onderzoeker 
##                                                                                             1 
##                                                                                      Lecturer 
##                                                                                             9 
##                                                                       Lecturer and Researcher 
##                                                                                             1 
##                                                                           Lecturer/researcher 
##                                                                                             1 
##                                                       Managing director/co-founder SocioQuest 
##                                                                                             1 
##                                                                                    Medewerker 
##                                                                                             1 
##                                                                         Onderwijsontwikkelaar 
##                                                                                             1 
##                                                                                   Onderzoeker 
##                                                                                            34 
##                                                                          Onderzoeker/Lecturer 
##                                                                                             1 
##                                                                              Onderzoeksfellow 
##                                                                                             1 
##                                                                          Onderzoeksmedewerker 
##                                                                                             1 
##                                                                              Other researcher 
##                                                                                             1 
##                                                                 part-time doctoral researcher 
##                                                                                             1 
##                                                                                 Phd & postdoc 
##                                                                                             1 
##                                                                                   Phd Student 
##                                                                                             1 
##                                                                                   PhD student 
##                                                                                            42 
##                                                                                   PhD Student 
##                                                                                           112 
##                                                                     PhD Student anthropologie 
##                                                                                             1 
##                                                                    PhD student, Junior Docent 
##                                                                                             2 
##                                                                              PhD student/Gast 
##                                                                                             2 
##                                                                                  PhD studentt 
##                                                                                             1 
##                                                                                       Postdoc 
##                                                                                            22 
##                                                                  Postdoctoral Research Fellow 
##                                                                                             1 
##                                                                                   Promovendus 
##                                                                                             1 
##                                                                               Research fellow 
##                                                                                             1 
##                                                                           Scholarship student 
##                                                                                             1 
##                                                                               Senior lecturer 
##                                                                                             3 
##                                                                            Senior Onderzoeker 
##                                                                                             1 
##                                                                        Senior Research Fellow 
##                                                                                             1 
##                                                                             Senior researcher 
##                                                                                             1 
##                                                                             Senior Researcher 
##                                                                                             1 
##                                                                   Senior researcher part-time 
##                                                                                             1 
##                                                                           Universitair docent 
##                                                                                           154 
##                                                                           Universitair Docent 
##                                                                                             3 
##                                                                      Universitair hoofddocent 
##                                                                                            84 
##                                                   Universitair hoofddocent/Onderwijsdirecteur 
##                                                                                             1 
##                                                                        Unversitair docent GPM 
##                                                                                             1 
##                                                                    Wetenschappelijk directeur 
##                                                                                             1 
##                                                                                          <NA> 
##                                                                                             8
#categories:
#(bijzonder) hoogleraar, UHD, UD, postdoc/senior/docent/researcher, PhD (external).


df_ego <- df_ego |>
  mutate(functie_level =
           case_when(
             grepl("hoogleraar|professor", tolower(Functie.24)) ~ 5,
             grepl("universitair hoofddocent|uhd", tolower(Functie.24)) ~ 4,
             grepl("universitair docent|unversitair docent", tolower(Functie.24)) ~ 3,
             grepl("postdoc|senior|fellow", tolower(Functie.24)) ~ 2,
             tolower(Functie.24) %in% c(
               "docent", "lecturer", "onderzoeker", "onderzoeker/lecturer", 
               "lecturer and researcher", "lecturer/researcher", 
               "docent (gepensioneerd)", "docent?", "gast/ onderzoeker", 
               "gastonderzoeker", "gepensioneerd docent sociologie", 
               "guest researcher"
             ) ~ 2,
             tolower(Functie.24) %in% c("doctoral researcher", "doctoral student", "part-time doctoral researcher") ~ 1,
             grepl("phd|junior|promovendus", tolower(Functie.24)) ~ 1,
             .default = NA
           )
         )


table(df_ego$functie_level, df_ego$Functie.24, useNA="always")
##       
##          ? Adjunct hoogleraar Associate researcher Bijzonder hoogleraar Bijzonder Hoogleraar
##   1      0                  0                    0                    0                    0
##   2      0                  0                    0                    0                    0
##   3      0                  0                    0                    0                    0
##   4      0                  0                    0                    0                    0
##   5      0                  1                    0                   14                    2
##   <NA>   1                  0                    1                    0                    0
##       
##        Datamanager Directeur SoG Docent Docent (gepensioneerd) Docent, phd Docent/PhD student
##   1              0             0      0                      0           1                  1
##   2              0             0     24                      1           0                  0
##   3              0             0      0                      0           0                  0
##   4              0             0      0                      0           0                  0
##   5              0             0      0                      0           0                  0
##   <NA>           1             1      0                      0           0                  0
##       
##        Docent? Doctoral Researcher Doctoral student
##   1          0                   2                1
##   2          1                   0                0
##   3          0                   0                0
##   4          0                   0                0
##   5          0                   0                0
##   <NA>       0                   0                0
##       
##        Does project at UvA, has worked as professor, lecturer, and research fellow at different unis
##   1                                                                                                0
##   2                                                                                                0
##   3                                                                                                0
##   4                                                                                                0
##   5                                                                                                1
##   <NA>                                                                                             0
##       
##        Emeritus hoogleraar Emeritus hoogleraar (gast?) External Phd External PhD Fellow
##   1                      0                           0            6            1      0
##   2                      0                           0            0            0      1
##   3                      0                           0            0            0      0
##   4                      0                           0            0            0      0
##   5                     12                           1            0            0      0
##   <NA>                   0                           0            0            0      0
##       
##        Gast/ Onderzoeker Gast/Emeritus universitair hoofddocent Gastonderzoeker
##   1                    0                                      0               0
##   2                    1                                      0               1
##   3                    0                                      0               0
##   4                    0                                      1               0
##   5                    0                                      0               0
##   <NA>                 0                                      0               0
##       
##        Gepensioneerd docent sociologie Gepensioneerd UHD Guest Researcher Honorary professor
##   1                                  0                 0                0                  0
##   2                                  1                 0                2                  0
##   3                                  0                 0                0                  0
##   4                                  0                 1                0                  0
##   5                                  0                 0                0                  2
##   <NA>                               0                 0                0                  0
##       
##        Hoofdonderzoeker Hoogleraar Hoogleraar (gast) Hoogleraar (visiting)
##   1                   0          0                 0                     0
##   2                   0          0                 0                     0
##   3                   0          0                 0                     0
##   4                   0          0                 0                     0
##   5                   0         83                 1                     1
##   <NA>                1          0                 0                     0
##       
##        Hoogleraar + Universitair hoofddocent Hoogleraar/Afdelingsvoorzitter Junior docent
##   1                                        0                              0             1
##   2                                        0                              0             0
##   3                                        0                              0             0
##   4                                        0                              0             0
##   5                                        1                              1             0
##   <NA>                                     0                              0             0
##       
##        Junior onderzoeker Lecturer Lecturer and Researcher Lecturer/researcher
##   1                     1        0                       0                   0
##   2                     0        9                       1                   1
##   3                     0        0                       0                   0
##   4                     0        0                       0                   0
##   5                     0        0                       0                   0
##   <NA>                  0        0                       0                   0
##       
##        Managing director/co-founder SocioQuest Medewerker Onderwijsontwikkelaar Onderzoeker
##   1                                          0          0                     0           0
##   2                                          0          0                     0          34
##   3                                          0          0                     0           0
##   4                                          0          0                     0           0
##   5                                          0          0                     0           0
##   <NA>                                       1          1                     1           0
##       
##        Onderzoeker/Lecturer Onderzoeksfellow Onderzoeksmedewerker Other researcher
##   1                       0                0                    0                0
##   2                       1                1                    0                0
##   3                       0                0                    0                0
##   4                       0                0                    0                0
##   5                       0                0                    0                0
##   <NA>                    0                0                    1                1
##       
##        part-time doctoral researcher Phd & postdoc Phd Student PhD student PhD Student
##   1                                1             0           1          42         112
##   2                                0             1           0           0           0
##   3                                0             0           0           0           0
##   4                                0             0           0           0           0
##   5                                0             0           0           0           0
##   <NA>                             0             0           0           0           0
##       
##        PhD Student anthropologie PhD student, Junior Docent PhD student/Gast PhD studentt Postdoc
##   1                            1                          2                2            1       0
##   2                            0                          0                0            0      22
##   3                            0                          0                0            0       0
##   4                            0                          0                0            0       0
##   5                            0                          0                0            0       0
##   <NA>                         0                          0                0            0       0
##       
##        Postdoctoral Research Fellow Promovendus Research fellow Scholarship student Senior lecturer
##   1                               0           1               0                   0               0
##   2                               1           0               1                   0               3
##   3                               0           0               0                   0               0
##   4                               0           0               0                   0               0
##   5                               0           0               0                   0               0
##   <NA>                            0           0               0                   1               0
##       
##        Senior Onderzoeker Senior Research Fellow Senior researcher Senior Researcher
##   1                     0                      0                 0                 0
##   2                     1                      1                 1                 1
##   3                     0                      0                 0                 0
##   4                     0                      0                 0                 0
##   5                     0                      0                 0                 0
##   <NA>                  0                      0                 0                 0
##       
##        Senior researcher part-time Universitair docent Universitair Docent Universitair hoofddocent
##   1                              0                   0                   0                        0
##   2                              1                   0                   0                        0
##   3                              0                 154                   3                        0
##   4                              0                   0                   0                       84
##   5                              0                   0                   0                        0
##   <NA>                           0                   0                   0                        0
##       
##        Universitair hoofddocent/Onderwijsdirecteur Unversitair docent GPM
##   1                                              0                      0
##   2                                              0                      0
##   3                                              0                      1
##   4                                              1                      0
##   5                                              0                      0
##   <NA>                                           0                      0
##       
##        Wetenschappelijk directeur <NA>
##   1                             0    0
##   2                             0    0
##   3                             0    0
##   4                             0    0
##   5                             0    0
##   <NA>                          1    8
table(df_ego$functie_level, useNA = "always")
## 
##    1    2    3    4    5 <NA> 
##  177  112  158   87  120   20
fsave(df_ego)

#First analyses (undirected network)

1 Homophily?

#Step 1: define data

wave1 <- scholars_net$nets[1,,]
wave2 <- scholars_net$nets[2,,]

##some checks
dim(wave1)
## [1] 674 674
dim(wave2)
## [1] 674 674
#should be 0
sum(is.na(wave1))
## [1] 0
#set diagonal to 0
sum(diag(wave2)==0)
## [1] 26
diag(wave1) <- 0
diag(wave2) <- 0

#only 1s and 0s
sum(wave1>1)
## [1] 0
#at least some 1s
sum(wave1>0)
## [1] 940
#make array
nets <- array(data = c(wave1, wave2), dim = c(dim(wave1), 2))

# dependent
net <- sienaDependent(nets)

#independent

functie <- coCovar(df_ego$functie_level)

mydata <- sienaDataCreate(net, functie)
#Step 2: effects
myeff <- getEffects(mydata)
myeff
##   effectName               include fix   test  initialValue parm
## 1 basic rate parameter net TRUE    FALSE FALSE    4.52955   0   
## 2 degree (density)         TRUE    FALSE FALSE   -1.66572   0
#Step 3: initial description

print01Report(mydata, modelname = "./results/secondtest_scholars")
#step 4: specify model
myeff <- getEffects(mydata)
myeff <- includeEffects(myeff, gwesp, outAct)
##   effectNumber effectName    shortName include fix   test  initialValue parm
## 1 21           GWESP (#)     gwesp     TRUE    FALSE FALSE          0   69  
## 2 39           degree of ego outAct    TRUE    FALSE FALSE          0    0
myeff <- includeEffects(myeff, simX, interaction1 = "functie")
##   effectNumber effectName         shortName include fix   test  initialValue parm
## 1 153          functie similarity simX      TRUE    FALSE FALSE          0   0
myeff
##   effectName               include fix   test  initialValue parm
## 1 basic rate parameter net TRUE    FALSE FALSE    4.52955    0  
## 2 degree (density)         TRUE    FALSE FALSE   -1.66572    0  
## 3 GWESP (#)                TRUE    FALSE FALSE    0.00000   69  
## 4 degree of ego            TRUE    FALSE FALSE    0.00000    0  
## 5 functie similarity       TRUE    FALSE FALSE    0.00000    0
#Estimate
myAlgorithm <- sienaAlgorithmCreate(projname = "scholars")
EstM1 <- siena07(myAlgorithm, data = mydata, effects = myeff, returnDeps = TRUE)

EstM1
#GOF

gof1 <- sienaGOF(EstM1, IndegreeDistribution, verbose = FALSE, join = T, varName ="net")

?sienaGOF

plot(gof1)

RI <- RSiena:::sienaRI(data=mydata, ans= EstM1)

class(RI)

RSiena:::plot.sienaRI(RI, addPieChart = T, legendColumns = 3)

Still to-do:

  • Behaviour model (continuous dep variable!)
  • Make plot (department + discipline)
  • Goodness of fit analyses + plot
  • Add new dataset
  • Write introduction etc.
  • Data/methods: explain why undirected network
LS0tDQp0aXRsZTogIldlZWsgNyINCmF1dGhvcjogIkthbGxlIFN0b2ZmZXJzIg0KZGF0ZTogIjIwMjUtMTAtMTciDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7cn0NCiNzdGFydCBjbGVhbg0Kcm0obGlzdD1scygpKQ0KYGBgDQoNCmBgYHtyfQ0KI0N1c3RvbSBmdW5jdGlvbnMNCmZwYWNrYWdlLmNoZWNrIDwtIGZ1bmN0aW9uKHBhY2thZ2VzKSB7DQogICAgbGFwcGx5KHBhY2thZ2VzLCBGVU4gPSBmdW5jdGlvbih4KSB7DQogICAgICAgIGlmICghcmVxdWlyZSh4LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpKSB7DQogICAgICAgICAgICBpbnN0YWxsLnBhY2thZ2VzKHgsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICAgICAgICAgICBsaWJyYXJ5KHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCiAgICAgICAgfQ0KICAgIH0pDQp9DQoNCmZzYXZlIDwtIGZ1bmN0aW9uKHgsIGZpbGUgPSBOVUxMLCBsb2NhdGlvbiA9ICIuL2RhdGEvcHJvY2Vzc2VkLyIpIHsNCiAgICBpZmVsc2UoIWRpci5leGlzdHMoImRhdGEiKSwgZGlyLmNyZWF0ZSgiZGF0YSIpLCBGQUxTRSkNCiAgICBpZmVsc2UoIWRpci5leGlzdHMoImRhdGEvcHJvY2Vzc2VkIiksIGRpci5jcmVhdGUoImRhdGEvcHJvY2Vzc2VkIiksIEZBTFNFKQ0KICAgIGlmIChpcy5udWxsKGZpbGUpKQ0KICAgICAgICBmaWxlID0gZGVwYXJzZShzdWJzdGl0dXRlKHgpKQ0KICAgIGRhdGVuYW1lIDwtIHN1YnN0cihnc3ViKCJbOi1dIiwgIiIsIFN5cy50aW1lKCkpLCAxLCA4KQ0KICAgIHRvdGFsbmFtZSA8LSBwYXN0ZShsb2NhdGlvbiwgZGF0ZW5hbWUsIGZpbGUsICIucmRhIiwgc2VwID0gIiIpDQogICAgc2F2ZSh4LCBmaWxlID0gdG90YWxuYW1lKSAgI25lZWQgdG8gZml4IGlmIGZpbGUgaXMgcmVsb2FkZWQgYXMgaW5wdXQgbmFtZSwgbm90IGFzIHguIA0KfQ0KDQpmbG9hZCA8LSBmdW5jdGlvbihmaWxlbmFtZSkgew0KICAgIGxvYWQoZmlsZW5hbWUpDQogICAgZ2V0KGxzKClbbHMoKSAhPSAiZmlsZW5hbWUiXSkNCn0NCg0KZnNob3dkZiA8LSBmdW5jdGlvbih4LCAuLi4pIHsNCiAgICBrbml0cjo6a2FibGUoeCwgZGlnaXRzID0gMiwgImh0bWwiLCAuLi4pICU+JQ0KICAgICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKSAlPiUNCiAgICAgICAga2FibGVFeHRyYTo6c2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjMwMHB4IikNCn0NCg0KY29sb3JpemUgPC0gZnVuY3Rpb24oeCwgY29sb3IpIHsNCiAgICBzcHJpbnRmKCI8c3BhbiBzdHlsZT0nY29sb3I6ICVzOyc+JXM8L3NwYW4+IiwgY29sb3IsIHgpDQp9DQoNCiN0aGUgYmlnIG9uZQ0KZmNvbG5ldCA8LSBmdW5jdGlvbihkYXRhID0gc2Nob2xhcnMsIHVuaXZlcnNpdHkgPSAiUlUiLCBkaXNjaXBsaW5lID0gInNvY2lvbG9neSIsIHdhdmVzID0gbGlzdChjKDIwMTUsDQogICAgMjAxOCksIGMoMjAxOSwgMjAyMykpLCB0eXBlID0gYygiZmlyc3QiKSkgew0KDQogICAgIyBzdGVwIDENCiAgICBkZW1vZ3JhcGhpY3MgPC0gZG8uY2FsbChyYmluZC5kYXRhLmZyYW1lLCBkYXRhJGRlbW9ncmFwaGljcykNCiAgICBkZW1vZ3JhcGhpY3MgPC0gZGVtb2dyYXBoaWNzICU+JQ0KICAgICAgICBtdXRhdGUoVW5pdmVyc2l0ZWl0MS4yMiA9IHJlcGxhY2UoVW5pdmVyc2l0ZWl0MS4yMiwgaXMubmEoVW5pdmVyc2l0ZWl0MS4yMiksICIiKSwgVW5pdmVyc2l0ZWl0Mi4yMiA9IHJlcGxhY2UoVW5pdmVyc2l0ZWl0Mi4yMiwNCiAgICAgICAgICAgIGlzLm5hKFVuaXZlcnNpdGVpdDIuMjIpLCAiIiksIFVuaXZlcnNpdGVpdDEuMjQgPSByZXBsYWNlKFVuaXZlcnNpdGVpdDEuMjQsIGlzLm5hKFVuaXZlcnNpdGVpdDEuMjQpLA0KICAgICAgICAgICAgIiIpLCBVbml2ZXJzaXRlaXQyLjI0ID0gcmVwbGFjZShVbml2ZXJzaXRlaXQyLjI0LCBpcy5uYShVbml2ZXJzaXRlaXQyLjI0KSwgIiIpLCBkaXNjaXBsaW5lLjIyID0gcmVwbGFjZShkaXNjaXBsaW5lLjIyLA0KICAgICAgICAgICAgaXMubmEoZGlzY2lwbGluZS4yMiksICIiKSwgZGlzY2lwbGluZS4yNCA9IHJlcGxhY2UoZGlzY2lwbGluZS4yNCwgaXMubmEoZGlzY2lwbGluZS4yNCksICIiKSkNCg0KICAgIHNhbXBsZSA8LSB3aGljaCgoZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDEuMjIgJWluJSB1bml2ZXJzaXR5IHwgZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDIuMjIgJWluJQ0KICAgICAgICB1bml2ZXJzaXR5IHwgZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDEuMjQgJWluJSB1bml2ZXJzaXR5IHwgZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDIuMjQgJWluJQ0KICAgICAgICB1bml2ZXJzaXR5KSAmIChkZW1vZ3JhcGhpY3MkZGlzY2lwbGluZS4yMiAlaW4lIGRpc2NpcGxpbmUgfCBkZW1vZ3JhcGhpY3MkZGlzY2lwbGluZS4yNCAlaW4lIGRpc2NpcGxpbmUpKQ0KDQogICAgZGVtb2dyYXBoaWNzX3NvYyA8LSBkZW1vZ3JhcGhpY3Nbc2FtcGxlLCBdDQogICAgc2Nob2xhcnNfc2VsIDwtIGxhcHBseShzY2hvbGFycywgIlsiLCBzYW1wbGUpDQoNCiAgICAjIHN0ZXAgMg0KICAgIGlkcyA8LSBkZW1vZ3JhcGhpY3Nfc29jJGF1X2lkDQogICAgbndhdmVzIDwtIGxlbmd0aCh3YXZlcykNCiAgICBuZXRzIDwtIGFycmF5KDAsIGRpbSA9IGMobndhdmVzLCBsZW5ndGgoaWRzKSwgbGVuZ3RoKGlkcykpLCBkaW1uYW1lcyA9IGxpc3Qod2F2ZSA9IDE6bndhdmVzLCBpZHMsDQogICAgICAgIGlkcykpDQogICAgZGltbmFtZXMobmV0cykNCg0KICAgICMgc3RlcCAzDQogICAgZGZfd29ya3MgPC0gdGliYmxlKHdvcmtzX2lkID0gdW5saXN0KGxhcHBseShzY2hvbGFyc19zZWwkd29yaywgZnVuY3Rpb24obCkgbCRpZCkpLCB3b3Jrc19hdXRob3IgPSB1bmxpc3QobGFwcGx5KHNjaG9sYXJzX3NlbCR3b3JrLA0KICAgICAgICBmdW5jdGlvbihsKSBsJGF1dGhvciksIHJlY3Vyc2l2ZSA9IEZBTFNFKSwgd29ya3NfeWVhciA9IHVubGlzdChsYXBwbHkoc2Nob2xhcnNfc2VsJHdvcmssIGZ1bmN0aW9uKGwpIGwkcHVibGljYXRpb25feWVhciksDQogICAgICAgIHJlY3Vyc2l2ZSA9IEZBTFNFKSkNCg0KICAgIGRmX3dvcmtzIDwtIGRmX3dvcmtzWyFkdXBsaWNhdGVkKGRmX3dvcmtzKSwgXQ0KDQogICAgIyBzdGVwIDQNCiAgICBpZiAodHlwZSA9PSAiZmlyc3QiKSB7DQogICAgICAgIGZvciAoaiBpbiAxOm53YXZlcykgew0KICAgICAgICAgICAgZGZfd29ya3NfdyA8LSBkZl93b3Jrc1tkZl93b3JrcyR3b3Jrc195ZWFyID49IHdhdmVzW1tqXV1bMV0gJiBkZl93b3JrcyR3b3Jrc195ZWFyIDw9IHdhdmVzW1tqXV1bMl0sDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgZm9yIChpIGluIDE6bnJvdyhkZl93b3Jrc193KSkgew0KICAgICAgICAgICAgICAgIGVnbyA8LSBkZl93b3Jrc193JHdvcmtzX2F1dGhvcltpXVtbMV1dJGF1X2lkWzFdDQogICAgICAgICAgICAgICAgYWx0ZXJzIDwtIGRmX3dvcmtzX3ckd29ya3NfYXV0aG9yW2ldW1sxXV0kYXVfaWRbLTFdDQogICAgICAgICAgICAgICAgaWYgKHN1bShpZHMgJWluJSBlZ28pID4gMCAmIHN1bShpZHMgJWluJSBhbHRlcnMpID4gMCkgew0KICAgICAgICAgICAgICAgICAgbmV0c1tqLCB3aGljaChpZHMgJWluJSBlZ28pLCB3aGljaChpZHMgJWluJSBhbHRlcnMpXSA8LSAxDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKHR5cGUgPT0gImxhc3QiKSB7DQogICAgICAgIGZvciAoaiBpbiAxOm53YXZlcykgew0KICAgICAgICAgICAgZGZfd29ya3NfdyA8LSBkZl93b3Jrc1tkZl93b3JrcyR3b3Jrc195ZWFyID49IHdhdmVzW1tqXV1bMV0gJiBkZl93b3JrcyR3b3Jrc195ZWFyIDw9IHdhdmVzW1tqXV1bMl0sDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgZm9yIChpIGluIDE6bnJvdyhkZl93b3Jrc193KSkgew0KICAgICAgICAgICAgICAgIGVnbyA8LSByZXYoZGZfd29ya3NfdyR3b3Jrc19hdXRob3JbaV1bWzFdXSRhdV9pZClbMV0NCiAgICAgICAgICAgICAgICBhbHRlcnMgPC0gcmV2KGRmX3dvcmtzX3ckd29ya3NfYXV0aG9yW2ldW1sxXV0kYXVfaWQpWy0xXQ0KICAgICAgICAgICAgICAgIGlmIChzdW0oaWRzICVpbiUgZWdvKSA+IDAgJiBzdW0oaWRzICVpbiUgYWx0ZXJzKSA+IDApIHsNCiAgICAgICAgICAgICAgICAgIG5ldHNbaiwgd2hpY2goaWRzICVpbiUgZWdvKSwgd2hpY2goaWRzICVpbiUgYWx0ZXJzKV0gPC0gMQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmICh0eXBlID09ICJhbGwiKSB7DQogICAgICAgIGZvciAoaiBpbiAxOm53YXZlcykgew0KICAgICAgICAgICAgZGZfd29ya3NfdyA8LSBkZl93b3Jrc1tkZl93b3JrcyR3b3Jrc195ZWFyID49IHdhdmVzW1tqXV1bMV0gJiBkZl93b3JrcyR3b3Jrc195ZWFyIDw9IHdhdmVzW1tqXV1bMl0sDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgZm9yIChpIGluIDE6bnJvdyhkZl93b3Jrc193KSkgew0KICAgICAgICAgICAgICAgIGVnb3MgPC0gZGZfd29ya3NfdyR3b3Jrc19hdXRob3JbaV1bWzFdXSRhdV9pZA0KICAgICAgICAgICAgICAgIGlmIChzdW0oaWRzICVpbiUgZWdvcykgPiAwKSB7DQogICAgICAgICAgICAgICAgICBuZXRzW2osIHdoaWNoKGlkcyAlaW4lIGVnb3MpLCB3aGljaChpZHMgJWluJSBlZ29zKV0gPC0gMQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBvdXRwdXQgPC0gbGlzdCgpDQogICAgb3V0cHV0JGRhdGEgPC0gc2Nob2xhcnNfc2VsDQogICAgb3V0cHV0JG5ldHMgPC0gbmV0cw0KICAgIHJldHVybihvdXRwdXQpDQp9DQoNCmZwYWNrYWdlLmNoZWNrKGMoInRpZHl2ZXJzZSIsICJSU2llbmEiKSkNCg0KYGBgDQoNCg0KI0FkZCBjaXRhdGlvbnMgdG8gdGhlIGRhdGENCmBgYHtyfQ0Kc2Nob2xhcnMgPC0gZmxvYWQoIkM6L1VzZXJzL2thbGxlL09uZURyaXZlL0RvY3VtZW50ZW4vUkVNQS9KYWFyIDIvU29jaWFsIE5ldHdvcmtzL0tTX2xhYmpvdXJuYWwvZGF0YS9wcm9jZXNzZWQvc2Nob2xhcnNfMjAyNDA5MjQucmRhIikNCg0KDQpzY2hvbGFyc19uZXQgPC0gZmNvbG5ldChkYXRhID0gc2Nob2xhcnMsIA0KICAgICAgICAgICAgICAgIHVuaXZlcnNpdHkgPSBjKCJSVSIsICJVVSIsICJSVUciLCAiVXZBIiwgIlZVIiwgIkVVUiIsICJMZWlkZW4iLCAiVXZUIiksIA0KICAgICAgICAgICAgICAgIGRpc2NpcGxpbmUgPSBjKCJzb2Npb2xvZ3kiLCAicG9saXRpY2FsIHNjaWVuY2UiKSwgDQogICAgICAgICAgICAgICAgd2F2ZXMgPSBsaXN0KGMoMjAxNSwgMjAxOCksIGMoMjAxOSwgMjAyMykpLCANCiAgICAgICAgICAgICAgICB0eXBlID0gYygiYWxsIikpDQoNCmRmX2VnbyA8LSBkby5jYWxsKHJiaW5kLmRhdGEuZnJhbWUsIHNjaG9sYXJzX25ldCRkYXRhJGRlbW9ncmFwaGljcykNCg0KZGZfY2l0YXRpb25zIDwtICBmbG9hZCgiQzovVXNlcnMva2FsbGUvT25lRHJpdmUvRG9jdW1lbnRlbi9SRU1BL0phYXIgMi9Tb2NpYWwgTmV0d29ya3MvS1NfbGFiam91cm5hbC9kYXRhL3Byb2Nlc3NlZC9kZl8yMDI1MDkyOS5yZGEiKQ0KDQojbWVyZ2luZw0KZGZfZWdvIDwtIGRmX2VnbyB8Pg0KICBsZWZ0X2pvaW4oZGZfY2l0YXRpb25zIHw+IHNlbGVjdChOYWFtLCBjaXRhdGlvbnNfdzEsIGNpdGF0aW9uc193MiksDQogICAgICAgICAgICBieSA9ICJOYWFtIikNCg0KYGBgDQoNCg0KI21ha2Ugb3JkaW5hbCB2YXJpYWJsZSBmdW5jdGlvbg0KYGBge3J9DQoNCnRhYmxlKGRmX2VnbyRGdW5jdGllLjI0LCB1c2VOQSA9ICJhbHdheXMiKQ0KDQojY2F0ZWdvcmllczoNCiMoYmlqem9uZGVyKSBob29nbGVyYWFyLCBVSEQsIFVELCBwb3N0ZG9jL3Nlbmlvci9kb2NlbnQvcmVzZWFyY2hlciwgUGhEIChleHRlcm5hbCkuDQoNCg0KZGZfZWdvIDwtIGRmX2VnbyB8Pg0KICBtdXRhdGUoZnVuY3RpZV9sZXZlbCA9DQogICAgICAgICAgIGNhc2Vfd2hlbigNCiAgICAgICAgICAgICBncmVwbCgiaG9vZ2xlcmFhcnxwcm9mZXNzb3IiLCB0b2xvd2VyKEZ1bmN0aWUuMjQpKSB+IDUsDQogICAgICAgICAgICAgZ3JlcGwoInVuaXZlcnNpdGFpciBob29mZGRvY2VudHx1aGQiLCB0b2xvd2VyKEZ1bmN0aWUuMjQpKSB+IDQsDQogICAgICAgICAgICAgZ3JlcGwoInVuaXZlcnNpdGFpciBkb2NlbnR8dW52ZXJzaXRhaXIgZG9jZW50IiwgdG9sb3dlcihGdW5jdGllLjI0KSkgfiAzLA0KICAgICAgICAgICAgIGdyZXBsKCJwb3N0ZG9jfHNlbmlvcnxmZWxsb3ciLCB0b2xvd2VyKEZ1bmN0aWUuMjQpKSB+IDIsDQogICAgICAgICAgICAgdG9sb3dlcihGdW5jdGllLjI0KSAlaW4lIGMoDQogICAgICAgICAgICAgICAiZG9jZW50IiwgImxlY3R1cmVyIiwgIm9uZGVyem9la2VyIiwgIm9uZGVyem9la2VyL2xlY3R1cmVyIiwgDQogICAgICAgICAgICAgICAibGVjdHVyZXIgYW5kIHJlc2VhcmNoZXIiLCAibGVjdHVyZXIvcmVzZWFyY2hlciIsIA0KICAgICAgICAgICAgICAgImRvY2VudCAoZ2VwZW5zaW9uZWVyZCkiLCAiZG9jZW50PyIsICJnYXN0LyBvbmRlcnpvZWtlciIsIA0KICAgICAgICAgICAgICAgImdhc3RvbmRlcnpvZWtlciIsICJnZXBlbnNpb25lZXJkIGRvY2VudCBzb2Npb2xvZ2llIiwgDQogICAgICAgICAgICAgICAiZ3Vlc3QgcmVzZWFyY2hlciINCiAgICAgICAgICAgICApIH4gMiwNCiAgICAgICAgICAgICB0b2xvd2VyKEZ1bmN0aWUuMjQpICVpbiUgYygiZG9jdG9yYWwgcmVzZWFyY2hlciIsICJkb2N0b3JhbCBzdHVkZW50IiwgInBhcnQtdGltZSBkb2N0b3JhbCByZXNlYXJjaGVyIikgfiAxLA0KICAgICAgICAgICAgIGdyZXBsKCJwaGR8anVuaW9yfHByb21vdmVuZHVzIiwgdG9sb3dlcihGdW5jdGllLjI0KSkgfiAxLA0KICAgICAgICAgICAgIC5kZWZhdWx0ID0gTkENCiAgICAgICAgICAgKQ0KICAgICAgICAgKQ0KDQoNCnRhYmxlKGRmX2VnbyRmdW5jdGllX2xldmVsLCBkZl9lZ28kRnVuY3RpZS4yNCwgdXNlTkE9ImFsd2F5cyIpDQp0YWJsZShkZl9lZ28kZnVuY3RpZV9sZXZlbCwgdXNlTkEgPSAiYWx3YXlzIikNCg0KZnNhdmUoZGZfZWdvKQ0KDQpgYGANCg0KI0ZpcnN0IGFuYWx5c2VzICh1bmRpcmVjdGVkIG5ldHdvcmspDQoNCiMjIEhvbW9waGlseT8NCg0KYGBge3J9DQojU3RlcCAxOiBkZWZpbmUgZGF0YQ0KDQp3YXZlMSA8LSBzY2hvbGFyc19uZXQkbmV0c1sxLCxdDQp3YXZlMiA8LSBzY2hvbGFyc19uZXQkbmV0c1syLCxdDQoNCiMjc29tZSBjaGVja3MNCmRpbSh3YXZlMSkNCmRpbSh3YXZlMikNCg0KI3Nob3VsZCBiZSAwDQpzdW0oaXMubmEod2F2ZTEpKQ0KDQojc2V0IGRpYWdvbmFsIHRvIDANCnN1bShkaWFnKHdhdmUyKT09MCkNCg0KZGlhZyh3YXZlMSkgPC0gMA0KZGlhZyh3YXZlMikgPC0gMA0KDQojb25seSAxcyBhbmQgMHMNCnN1bSh3YXZlMT4xKQ0KDQojYXQgbGVhc3Qgc29tZSAxcw0Kc3VtKHdhdmUxPjApDQoNCg0KI21ha2UgYXJyYXkNCm5ldHMgPC0gYXJyYXkoZGF0YSA9IGMod2F2ZTEsIHdhdmUyKSwgZGltID0gYyhkaW0od2F2ZTEpLCAyKSkNCg0KIyBkZXBlbmRlbnQNCm5ldCA8LSBzaWVuYURlcGVuZGVudChuZXRzKQ0KDQojaW5kZXBlbmRlbnQNCg0KZnVuY3RpZSA8LSBjb0NvdmFyKGRmX2VnbyRmdW5jdGllX2xldmVsKQ0KDQpteWRhdGEgPC0gc2llbmFEYXRhQ3JlYXRlKG5ldCwgZnVuY3RpZSkNCg0KYGBgDQoNCg0KYGBge3J9DQojU3RlcCAyOiBlZmZlY3RzDQpteWVmZiA8LSBnZXRFZmZlY3RzKG15ZGF0YSkNCm15ZWZmDQoNCmBgYA0KDQpgYGB7cn0NCiNTdGVwIDM6IGluaXRpYWwgZGVzY3JpcHRpb24NCg0KcHJpbnQwMVJlcG9ydChteWRhdGEsIG1vZGVsbmFtZSA9ICIuL3Jlc3VsdHMvc2Vjb25kdGVzdF9zY2hvbGFycyIpDQoNCmBgYA0KDQpgYGB7cn0NCiNzdGVwIDQ6IHNwZWNpZnkgbW9kZWwNCm15ZWZmIDwtIGdldEVmZmVjdHMobXlkYXRhKQ0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIGd3ZXNwLCBvdXRBY3QpDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgc2ltWCwgaW50ZXJhY3Rpb24xID0gImZ1bmN0aWUiKQ0KDQpteWVmZg0KYGBgDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KI0VzdGltYXRlDQpteUFsZ29yaXRobSA8LSBzaWVuYUFsZ29yaXRobUNyZWF0ZShwcm9qbmFtZSA9ICJzY2hvbGFycyIpDQpFc3RNMSA8LSBzaWVuYTA3KG15QWxnb3JpdGhtLCBkYXRhID0gbXlkYXRhLCBlZmZlY3RzID0gbXllZmYsIHJldHVybkRlcHMgPSBUUlVFKQ0KDQpFc3RNMQ0KDQpgYGANCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojR09GDQoNCmdvZjEgPC0gc2llbmFHT0YoRXN0TTEsIEluZGVncmVlRGlzdHJpYnV0aW9uLCB2ZXJib3NlID0gRkFMU0UsIGpvaW4gPSBULCB2YXJOYW1lID0ibmV0IikNCg0KP3NpZW5hR09GDQoNCnBsb3QoZ29mMSkNCg0KUkkgPC0gUlNpZW5hOjo6c2llbmFSSShkYXRhPW15ZGF0YSwgYW5zPSBFc3RNMSkNCg0KY2xhc3MoUkkpDQoNClJTaWVuYTo6OnBsb3Quc2llbmFSSShSSSwgYWRkUGllQ2hhcnQgPSBULCBsZWdlbmRDb2x1bW5zID0gMykNCmBgYA0KU3RpbGwgdG8tZG86DQoNCi0gQmVoYXZpb3VyIG1vZGVsIChjb250aW51b3VzIGRlcCB2YXJpYWJsZSEpDQotIE1ha2UgcGxvdCAoZGVwYXJ0bWVudCArIGRpc2NpcGxpbmUpDQotIEdvb2RuZXNzIG9mIGZpdCBhbmFseXNlcyArIHBsb3QNCi0gQWRkIG5ldyBkYXRhc2V0DQotIFdyaXRlIGludHJvZHVjdGlvbiBldGMuDQotIERhdGEvbWV0aG9kczogZXhwbGFpbiB3aHkgdW5kaXJlY3RlZCBuZXR3b3JrDQoNCg0KDQpgYGB7cn0NCg0KDQpgYGANCg0KDQoNCg0K