To summarize what we discussed, we are interested in knowing if the answers to questions 12 ("fellowship_yn"), 15 ("enfolded_postgrad_yn"), 16 ("private_academic"), 17 ("fellowship_years"), and 18 ("fellowship_field") differ based on year of training ("current_year"), debt ("debt"), gender ("gender"), race ("race"), age ("age"), marital status ("marital_status"), and family planning ("children").

Went from 265 to 257 rows because 8 cases from the original csv were removed due to having 50% or fewer of the questions answered.

read in and format data

df <- read.csv("maggie2.csv")
df <- df[!is.na(df$fellowship_yn),]


df2 <- df[c(2,7,20,22:23,31:33,35,37:39)]

df2$pgy_cat <- ifelse(df2$current_year==1|df2$current_year==2, 'junior', ifelse(df2$current_year==7|df2$current_year==6, "senior", "midlevel"))

df2$fellow_cat <- ifelse(df2$fellowship_yn==1|df2$fellowship_yn==2, 'Probably or Definitely Yes', ifelse(df2$fellowship_yn==4|df2$fellowship_yn==5, "Probably or Definitely No", "Undecided"))

df2$age_cat <- ifelse(df2$age==2, '22-25 y/o', ifelse(df2$age==3, "26-30 y/o", ifelse(df2$age==4, "31-35 y/o", "36-45 y/o")))

df2$race_cat <- ifelse(df2$race==1, 'Native American or Alaska Native', ifelse(df2$race==2, "Asian", ifelse(df2$race==3, "Black or African American", ifelse(df2$race==4, "Native Hawaiian or other Pacific Islander", ifelse(df2$race==5, "White", "Other/No Response")))))

df2$gender_cat <- ifelse(df2$gender==1, 'Cis Woman', ifelse(df2$gender==2, "Cis Man", ifelse(df2$gender==3, "NB", ifelse(df2$gender==4, "Trans Woman", ifelse(df2$gender==7, "No Response", "Other")))))

RACE x fellowship

  1. native american/alaskan
  2. asian
  3. black/AA
  4. native hawaiin or pacific islander
  5. white
df_race <- df2[!df2$race==7,]
df_race <- df_race[!df_race$race==6,]
df_race <- df_race[!is.na(df_race$fellowship_yn),]

race <- table(df_race$fellow_cat,df_race$race_cat)
race2 <- as.data.frame(table(df_race$fellow_cat,df_race$race_cat))
colnames(race2) <- c("fellow_cat","race","count")
race_pct <- setDT(race2)[, list(Sum_Count = sum(count)), keyby = list(race, fellow_cat)][, 
            Count_Pct := round(Sum_Count/sum(Sum_Count), 2)*100, by = race][]
race_pct2 <- setDT(race2)[, list(sum_count = sum(count)), keyby = list(fellow_cat,race)][, 
            pct := round(sum_count/sum(sum_count), 2)*100, by = fellow_cat][]


p_all<-ggplot(data=race_pct, aes(x=race, y=Count_Pct, fill=fellow_cat))  + geom_bar(stat="identity", color="black", position=position_dodge())+
  theme_minimal()+ scale_fill_brewer(palette="Blues")+gghisto+ggtitle("fellowship committments for all races") + #scale_x_discrete(labels=c("NA or Alaskan","Asian","Black or AA", "Hawaiian or PI","White")) + 
  ylim(0,100)+
     geom_text(aes(label=Count_Pct), position=position_dodge(width=0.9), vjust=-0.25)+ theme(axis.text.x = element_text(size=6, angle=15))
p_all

fishers tests between groups race and fellow cat

fisher.test(df_race$race_cat,df_race$fellow_cat, simulate.p.value = TRUE, B=2000)

    Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)

data:  df_race$race_cat and df_race$fellow_cat
p-value = 0.0004998
alternative hypothesis: two.sided
fisher.test(table(df_race$fellow_cat,df_race$race_cat), simulate.p.value = TRUE, B=2000)

    Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)

data:  table(df_race$fellow_cat, df_race$race_cat)
p-value = 0.0004998
alternative hypothesis: two.sided

Conclusion from fisher’s test: there are significant differences between race and fellowship plans.

Below: 2-group fishers tests

Native American excluded for low sample size (n=4)

white.asian <- table(df_race[df_race$race_cat=="White" | df_race$race_cat=="Asian",14],df_race[df_race$race_cat=="White" | df_race$race_cat=="Asian",16])

white.black <- table(df_race[df_race$race_cat=="White" | df_race$race_cat=="Black or African American",14],df_race[df_race$race_cat=="White" | df_race$race_cat=="Black or African American",16])

white.NHPA <- table(df_race[df_race$race_cat=="White" | df_race$race_cat=="Native Hawaiian or other Pacific Islander",14],df_race[df_race$race_cat=="White" | df_race$race_cat=="Native Hawaiian or other Pacific Islander",16])

asian.black <- table(df_race[df_race$race_cat=="Asian" | df_race$race_cat=="Black or African American",14],df_race[df_race$race_cat=="Asian" | df_race$race_cat=="Black or African American",16])

asian.NHPA <- table(df_race[df_race$race_cat=="Asian" | df_race$race_cat=="Native Hawaiian or other Pacific Islander",14],df_race[df_race$race_cat=="Asian" | df_race$race_cat=="Native Hawaiian or other Pacific Islander",16])

black.NHPA <- table(df_race[df_race$race_cat=="Black or African American" | df_race$race_cat=="Native Hawaiian or other Pacific Islander",14],df_race[df_race$race_cat=="Black or African American" | df_race$race_cat=="Native Hawaiian or other Pacific Islander",16])
#tests
fisher.test(white.asian, simulate.p.value = TRUE, B=2000) #S

    Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)

data:  white.asian
p-value = 0.0004998
alternative hypothesis: two.sided
fisher.test(white.black, simulate.p.value = TRUE, B=2000) #NS

    Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)

data:  white.black
p-value = 0.07746
alternative hypothesis: two.sided
fisher.test(white.NHPA, simulate.p.value = TRUE, B=2000) #S

    Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)

data:  white.NHPA
p-value = 0.0009995
alternative hypothesis: two.sided
fisher.test(asian.black, simulate.p.value = TRUE, B=2000) #S -> NS after corrections. 

    Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)

data:  asian.black
p-value = 0.01549
alternative hypothesis: two.sided
fisher.test(asian.NHPA, simulate.p.value = TRUE, B=2000) #NS

    Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)

data:  asian.NHPA
p-value = 1
alternative hypothesis: two.sided
fisher.test(black.NHPA, simulate.p.value = TRUE, B=2000) #NS

    Fisher's Exact Test for Count Data

data:  black.NHPA
p-value = 0.09753
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
  0.6423599 35.5109712
sample estimates:
odds ratio 
  4.298978 
df_race[,13:16] %>%
  tbl_summary(by=race_cat) %>%
  add_p()
There was an error in 'add_p()/add_difference()' for variable 'fellow_cat', p-value omitted:
Error in stats::fisher.test(c("Probably or Definitely No", "Probably or Definitely Yes", : FEXACT error 7(location). LDSTP=18630 is too small for this problem,
  (pastp=19.1276, ipn_0:=ipoin[itp=423]=279, stp[ipn_0]=16.7221).
Increase workspace or consider using 'simulate.p.value=TRUE'
There was an error in 'add_p()/add_difference()' for variable 'age_cat', p-value omitted:
Error in stats::fisher.test(c("36-45 y/o", "26-30 y/o", "36-45 y/o", "31-35 y/o", : FEXACT error 6.  LDKEY=621 is too small for this problem,
  (ii := key2[itp=295] = 3790869, ldstp=18630)
Try increasing the size of the workspace and possibly 'mult'
Characteristic Asian, N = 321 Black or African American, N = 221 Native American or Alaska Native, N = 41 Native Hawaiian or other Pacific Islander, N = 121 White, N = 1541 p-value2
pgy_cat 0.053
    junior 5 (16%) 7 (33%) 0 (0%) 7 (58%) 34 (22%)
    midlevel 18 (56%) 12 (57%) 4 (100%) 3 (25%) 96 (62%)
    senior 9 (28%) 2 (9.5%) 0 (0%) 2 (17%) 24 (16%)
    Unknown 0 1 0 0 0
fellow_cat
    Probably or Definitely No 1 (3.1%) 0 (0%) 0 (0%) 0 (0%) 8 (5.2%)
    Probably or Definitely Yes 17 (53%) 19 (86%) 1 (25%) 7 (58%) 141 (92%)
    Undecided 14 (44%) 3 (14%) 3 (75%) 5 (42%) 5 (3.2%)
age_cat
    22-25 y/o 4 (12%) 2 (9.1%) 0 (0%) 3 (25%) 18 (12%)
    26-30 y/o 8 (25%) 8 (36%) 1 (25%) 5 (42%) 76 (49%)
    31-35 y/o 16 (50%) 11 (50%) 0 (0%) 4 (33%) 50 (32%)
    36-45 y/o 4 (12%) 1 (4.5%) 3 (75%) 0 (0%) 10 (6.5%)
1 n (%)
2 Fisher's exact test

Native American or Alaskan: Prob/Def No 0% Prob/Def Yes 25% Unsure 75%

Asian Prob/Def No 3% Prob/Def Yes 53% Unsure 44%

Black or African American Prob/Def No 0% Prob/Def Yes 86% Unsure 14%

Native Hawaiian or Pacific Islander Prob/Def No 0% Prob/Def Yes 58% Unsure 42%

White Prob/Def No 5% Prob/Def Yes 92% Unsure 3%

GENDER x fellowship

  1. cis woman
  2. cis man
  3. NB
  4. T woman
  5. T man
  6. Not Listed
  7. No response
df_gen <- df2[!df2$gender==5,]
df_gen <- df_gen[!df_gen$gender==6,]
df_gen <- df_gen[!is.na(df_gen$fellowship_yn),]

#df_gen2 is only cis men, cis women, and NR
df_gen2 <- df_gen[!df_gen$gender==3,]
df_gen2 <- df_gen2[!df_gen2$gender==4,]
gender <- table(df_gen$fellow_cat,df_gen$gender_cat)
gender2 <- as.data.frame(table(df_gen$fellow_cat,df_gen$gender_cat))
colnames(gender2) <- c("fellow_cat","gender","count")
gen_pct <- setDT(gender2)[, list(sum_count = sum(count)), keyby = list(fellow_cat,gender)][, 
            pct := round(sum_count/sum(sum_count), 2)*100, by = fellow_cat][]
gen_pct2 <- setDT(gender2)[, list(sum_count = sum(count)), keyby = list(fellow_cat,gender)][, 
            pct := round(sum_count/sum(sum_count), 2)*100, by = gender][]


p_all<-ggplot(data=gen_pct2, aes(x=gender, y=pct, fill=fellow_cat))  + geom_bar(stat="identity", color="black", position=position_dodge())+
  theme_minimal()+ scale_fill_brewer(palette="Blues")+gghisto+ggtitle("fellowship committments for all genders") + #scale_x_discrete(labels=c("Cis Woman","Cis Man","NB", "T Woman","No Response")) + 
  ylim(0,100)+
     geom_text(aes(label=pct), position=position_dodge(width=0.9), vjust=-0.25)+ theme(axis.text.x = element_text(size=12, angle=15))
p_all

The categories for TW and NB are not normally distributed compared to the other 3 categories. “In 2018, 0.7% of matriculating medical students identified as TGNB” https://www.aamc.org/data-reports/students-residents/report/matriculating-student-questionnaire-msq

df_gen[,13:17] %>%
  tbl_summary(by=gender_cat)%>%
  add_p()
There was an error in 'add_p()/add_difference()' for variable 'age_cat', p-value omitted:
Error in stats::fisher.test(c("36-45 y/o", "26-30 y/o", "26-30 y/o", "36-45 y/o", : FEXACT error 6.  LDKEY=621 is too small for this problem,
  (ii := key2[itp=562] = 5767166, ldstp=18630)
Try increasing the size of the workspace and possibly 'mult'
There was an error in 'add_p()/add_difference()' for variable 'race_cat', p-value omitted:
Error in stats::fisher.test(c("White", "Other/No Response", "White", "White", : FEXACT[f3xact()] error: hash key 7e+09 > INT_MAX, kyy=153, it[i (= nco = 6)]= -13532483.
Rather set 'simulate.p.value=TRUE'
Characteristic Cis Man, N = 1511 Cis Woman, N = 591 NB, N = 81 No Response, N = 111 Trans Woman, N = 151 p-value2
pgy_cat 0.048
    junior 26 (17%) 20 (35%) 4 (50%) 1 (20%) 5 (33%)
    midlevel 95 (63%) 28 (49%) 2 (25%) 2 (40%) 8 (53%)
    senior 30 (20%) 9 (16%) 2 (25%) 2 (40%) 2 (13%)
    Unknown 0 2 0 6 0
fellow_cat <0.001
    Probably or Definitely No 5 (3.3%) 4 (6.8%) 0 (0%) 1 (9.1%) 0 (0%)
    Probably or Definitely Yes 133 (88%) 51 (86%) 5 (62%) 9 (82%) 6 (40%)
    Undecided 13 (8.6%) 4 (6.8%) 3 (38%) 1 (9.1%) 9 (60%)
age_cat
    22-25 y/o 18 (12%) 4 (7.0%) 0 (0%) 0 (0%) 1 (6.7%)
    26-30 y/o 61 (40%) 32 (56%) 2 (25%) 3 (27%) 5 (33%)
    31-35 y/o 57 (38%) 16 (28%) 5 (62%) 5 (45%) 7 (47%)
    36-45 y/o 15 (9.9%) 5 (8.8%) 1 (12%) 3 (27%) 2 (13%)
    Unknown 0 2 0 0 0
race_cat
    Asian 15 (9.9%) 6 (10%) 0 (0%) 0 (0%) 9 (60%)
    Black or African American 15 (9.9%) 1 (1.7%) 1 (12%) 1 (9.1%) 2 (13%)
    Native American or Alaska Native 4 (2.6%) 0 (0%) 0 (0%) 0 (0%) 0 (0%)
    Native Hawaiian or other Pacific Islander 3 (2.0%) 0 (0%) 6 (75%) 0 (0%) 3 (20%)
    Other/No Response 11 (7.3%) 4 (6.9%) 0 (0%) 10 (91%) 0 (0%)
    White 103 (68%) 47 (81%) 1 (12%) 0 (0%) 1 (6.7%)
    Unknown 0 1 0 0 0
1 n (%)
2 Fisher's exact test

Redoing the analysis and excluding NB and NR gender categories

gender2 <- as.data.frame(table(df_gen2$fellow_cat,df_gen2$gender_cat))
colnames(gender2) <- c("fellow_cat","gender","count")
gen_pct <- setDT(gender2)[, list(sum_count = sum(count)), keyby = list(fellow_cat,gender)][, 
            pct := round(sum_count/sum(sum_count), 2)*100, by = fellow_cat][]
gen_pct2 <- setDT(gender2)[, list(sum_count = sum(count)), keyby = list(fellow_cat,gender)][, 
            pct := round(sum_count/sum(sum_count), 2)*100, by = gender][]


p_all<-ggplot(data=gen_pct2, aes(x=gender, y=pct, fill=fellow_cat))  + geom_bar(stat="identity", color="black", position=position_dodge())+
  theme_minimal()+ scale_fill_brewer(palette="Blues")+gghisto+ggtitle("fellowship committments for all genders") + ylim(0,100)+
     geom_text(aes(label=pct), position=position_dodge(width=0.9), vjust=-0.25)
p_all

fishers tests between groups race and fellow cat

fisher.test(df_gen2$gender_cat,df_gen2$fellow_cat, simulate.p.value = TRUE, B=2000)

    Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)

data:  df_gen2$gender_cat and df_gen2$fellow_cat
p-value = 0.4973
alternative hypothesis: two.sided
fisher.test(table(df_gen2$fellow_cat,df_gen2$gender_cat), simulate.p.value = TRUE, B=2000)

    Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)

data:  table(df_gen2$fellow_cat, df_gen2$gender_cat)
p-value = 0.5012
alternative hypothesis: two.sided
df_gen2[,13:17] %>%
  tbl_summary(by=gender_cat)%>%
  add_p()
There was an error in 'add_p()/add_difference()' for variable 'race_cat', p-value omitted:
Error in stats::fisher.test(c("White", "Other/No Response", "White", "White", : FEXACT error 7(location). LDSTP=18630 is too small for this problem,
  (pastp=26.1932, ipn_0:=ipoin[itp=38]=1202, stp[ipn_0]=28.4756).
Increase workspace or consider using 'simulate.p.value=TRUE'
Characteristic Cis Man, N = 1511 Cis Woman, N = 591 No Response, N = 111 p-value2
pgy_cat 0.043
    junior 26 (17%) 20 (35%) 1 (20%)
    midlevel 95 (63%) 28 (49%) 2 (40%)
    senior 30 (20%) 9 (16%) 2 (40%)
    Unknown 0 2 6
fellow_cat 0.5
    Probably or Definitely No 5 (3.3%) 4 (6.8%) 1 (9.1%)
    Probably or Definitely Yes 133 (88%) 51 (86%) 9 (82%)
    Undecided 13 (8.6%) 4 (6.8%) 1 (9.1%)
age_cat 0.2
    22-25 y/o 18 (12%) 4 (7.0%) 0 (0%)
    26-30 y/o 61 (40%) 32 (56%) 3 (27%)
    31-35 y/o 57 (38%) 16 (28%) 5 (45%)
    36-45 y/o 15 (9.9%) 5 (8.8%) 3 (27%)
    Unknown 0 2 0
race_cat
    Asian 15 (9.9%) 6 (10%) 0 (0%)
    Black or African American 15 (9.9%) 1 (1.7%) 1 (9.1%)
    Native American or Alaska Native 4 (2.6%) 0 (0%) 0 (0%)
    Native Hawaiian or other Pacific Islander 3 (2.0%) 0 (0%) 0 (0%)
    Other/No Response 11 (7.3%) 4 (6.9%) 10 (91%)
    White 103 (68%) 47 (81%) 0 (0%)
    Unknown 0 1 0
1 n (%)
2 Fisher's exact test
LS0tCnRpdGxlOiAiTWFnZ2llIERhdGEiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRvIHN1bW1hcml6ZSB3aGF0IHdlIGRpc2N1c3NlZCwgd2UgYXJlIGludGVyZXN0ZWQgaW4ga25vd2luZyBpZiB0aGUgYW5zd2VycyB0byBxdWVzdGlvbnMgMTIgYCgiZmVsbG93c2hpcF95biIpYCwgMTUgYCgiZW5mb2xkZWRfcG9zdGdyYWRfeW4iKWAsIDE2IGAoInByaXZhdGVfYWNhZGVtaWMiKWAsIDE3IGAoImZlbGxvd3NoaXBfeWVhcnMiKWAsIGFuZCAxOCBgKCJmZWxsb3dzaGlwX2ZpZWxkIilgIGRpZmZlciBiYXNlZCBvbiB5ZWFyIG9mIHRyYWluaW5nIGAoImN1cnJlbnRfeWVhciIpYCwgZGVidCBgKCJkZWJ0IilgLCBnZW5kZXIgYCgiZ2VuZGVyIilgLCByYWNlIGAoInJhY2UiKWAsIGFnZSBgKCJhZ2UiKWAsIG1hcml0YWwgc3RhdHVzIGAoIm1hcml0YWxfc3RhdHVzIilgLCBhbmQgZmFtaWx5IHBsYW5uaW5nIGAoImNoaWxkcmVuIilgLgoKV2VudCBmcm9tIDI2NSB0byAyNTcgcm93cyBiZWNhdXNlIDggY2FzZXMgZnJvbSB0aGUgb3JpZ2luYWwgY3N2IHdlcmUgcmVtb3ZlZCBkdWUgdG8gaGF2aW5nIDUwJSBvciBmZXdlciBvZiB0aGUgcXVlc3Rpb25zIGFuc3dlcmVkLiAKCmBgYHtyICxlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpybShsaXN0ID0gbHMoKSkKCmxpYnJhcnkoZ2dwbG90Mik7bGlicmFyeShNYXRjaGluZyk7bGlicmFyeShyZWFkeGwpO2xpYnJhcnkodGliYmxlKTtsaWJyYXJ5KGdyaWRFeHRyYSk7bGlicmFyeSgiZ2dwdWJyIik7bGlicmFyeShjYXJldCk7bGlicmFyeShndHN1bW1hcnkpO2xpYnJhcnkoZ2dyaWRnZXMpO2xpYnJhcnkoZHBseXIpO2xpYnJhcnkoZm9yZWlnbik7bGlicmFyeShubmV0KTtsaWJyYXJ5KFZHQU0pO2xpYnJhcnkoZGF0YS50YWJsZSk7bGlicmFyeShzY2FsZXMpCmBgYAoKYGBge3IgLGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiNwbG90IGVsZW1lbnRzCmdnaGlzdG8gPC0gbGlzdCgKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgY29sb3I9InJveWFsYmx1ZTQiLCBzaXplPTE0KSwKICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBjb2xvcj0icm95YWxibHVlNCIsIAogICAgICAgICAgc2l6ZT0xNiwgYW5nbGU9MjUpLAogICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNyxmYWNlPSJpdGFsaWMiKSwKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNyxmYWNlPSJib2xkIikpKQpgYGAKCiMjIyMgcmVhZCBpbiBhbmQgZm9ybWF0IGRhdGEKYGBge3J9CmRmIDwtIHJlYWQuY3N2KCJtYWdnaWUyLmNzdiIpCmRmIDwtIGRmWyFpcy5uYShkZiRmZWxsb3dzaGlwX3luKSxdCgoKZGYyIDwtIGRmW2MoMiw3LDIwLDIyOjIzLDMxOjMzLDM1LDM3OjM5KV0KCmRmMiRwZ3lfY2F0IDwtIGlmZWxzZShkZjIkY3VycmVudF95ZWFyPT0xfGRmMiRjdXJyZW50X3llYXI9PTIsICdqdW5pb3InLCBpZmVsc2UoZGYyJGN1cnJlbnRfeWVhcj09N3xkZjIkY3VycmVudF95ZWFyPT02LCAic2VuaW9yIiwgIm1pZGxldmVsIikpCgpkZjIkZmVsbG93X2NhdCA8LSBpZmVsc2UoZGYyJGZlbGxvd3NoaXBfeW49PTF8ZGYyJGZlbGxvd3NoaXBfeW49PTIsICdQcm9iYWJseSBvciBEZWZpbml0ZWx5IFllcycsIGlmZWxzZShkZjIkZmVsbG93c2hpcF95bj09NHxkZjIkZmVsbG93c2hpcF95bj09NSwgIlByb2JhYmx5IG9yIERlZmluaXRlbHkgTm8iLCAiVW5kZWNpZGVkIikpCgpkZjIkYWdlX2NhdCA8LSBpZmVsc2UoZGYyJGFnZT09MiwgJzIyLTI1IHkvbycsIGlmZWxzZShkZjIkYWdlPT0zLCAiMjYtMzAgeS9vIiwgaWZlbHNlKGRmMiRhZ2U9PTQsICIzMS0zNSB5L28iLCAiMzYtNDUgeS9vIikpKQoKZGYyJHJhY2VfY2F0IDwtIGlmZWxzZShkZjIkcmFjZT09MSwgJ05hdGl2ZSBBbWVyaWNhbiBvciBBbGFza2EgTmF0aXZlJywgaWZlbHNlKGRmMiRyYWNlPT0yLCAiQXNpYW4iLCBpZmVsc2UoZGYyJHJhY2U9PTMsICJCbGFjayBvciBBZnJpY2FuIEFtZXJpY2FuIiwgaWZlbHNlKGRmMiRyYWNlPT00LCAiTmF0aXZlIEhhd2FpaWFuIG9yIG90aGVyIFBhY2lmaWMgSXNsYW5kZXIiLCBpZmVsc2UoZGYyJHJhY2U9PTUsICJXaGl0ZSIsICJPdGhlci9ObyBSZXNwb25zZSIpKSkpKQoKZGYyJGdlbmRlcl9jYXQgPC0gaWZlbHNlKGRmMiRnZW5kZXI9PTEsICdDaXMgV29tYW4nLCBpZmVsc2UoZGYyJGdlbmRlcj09MiwgIkNpcyBNYW4iLCBpZmVsc2UoZGYyJGdlbmRlcj09MywgIk5CIiwgaWZlbHNlKGRmMiRnZW5kZXI9PTQsICJUcmFucyBXb21hbiIsIGlmZWxzZShkZjIkZ2VuZGVyPT03LCAiTm8gUmVzcG9uc2UiLCAiT3RoZXIiKSkpKSkKYGBgCgoKIyMjIyBSQUNFIHggZmVsbG93c2hpcAoxLiBuYXRpdmUgYW1lcmljYW4vYWxhc2thbgoyLiBhc2lhbgozLiBibGFjay9BQQo0LiBuYXRpdmUgaGF3YWlpbiBvciBwYWNpZmljIGlzbGFuZGVyCjUuIHdoaXRlCmBgYHtyfQpkZl9yYWNlIDwtIGRmMlshZGYyJHJhY2U9PTcsXQpkZl9yYWNlIDwtIGRmX3JhY2VbIWRmX3JhY2UkcmFjZT09NixdCmRmX3JhY2UgPC0gZGZfcmFjZVshaXMubmEoZGZfcmFjZSRmZWxsb3dzaGlwX3luKSxdCgpyYWNlIDwtIHRhYmxlKGRmX3JhY2UkZmVsbG93X2NhdCxkZl9yYWNlJHJhY2VfY2F0KQpyYWNlMiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRmX3JhY2UkZmVsbG93X2NhdCxkZl9yYWNlJHJhY2VfY2F0KSkKY29sbmFtZXMocmFjZTIpIDwtIGMoImZlbGxvd19jYXQiLCJyYWNlIiwiY291bnQiKQpgYGAKCgpgYGB7cn0KcmFjZV9wY3QgPC0gc2V0RFQocmFjZTIpWywgbGlzdChTdW1fQ291bnQgPSBzdW0oY291bnQpKSwga2V5YnkgPSBsaXN0KHJhY2UsIGZlbGxvd19jYXQpXVssIAogICAgICAgICAgICBDb3VudF9QY3QgOj0gcm91bmQoU3VtX0NvdW50L3N1bShTdW1fQ291bnQpLCAyKSoxMDAsIGJ5ID0gcmFjZV1bXQpyYWNlX3BjdDIgPC0gc2V0RFQocmFjZTIpWywgbGlzdChzdW1fY291bnQgPSBzdW0oY291bnQpKSwga2V5YnkgPSBsaXN0KGZlbGxvd19jYXQscmFjZSldWywgCiAgICAgICAgICAgIHBjdCA6PSByb3VuZChzdW1fY291bnQvc3VtKHN1bV9jb3VudCksIDIpKjEwMCwgYnkgPSBmZWxsb3dfY2F0XVtdCgoKcF9hbGw8LWdncGxvdChkYXRhPXJhY2VfcGN0LCBhZXMoeD1yYWNlLCB5PUNvdW50X1BjdCwgZmlsbD1mZWxsb3dfY2F0KSkgICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBjb2xvcj0iYmxhY2siLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICB0aGVtZV9taW5pbWFsKCkrIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkJsdWVzIikrZ2doaXN0bytnZ3RpdGxlKCJmZWxsb3dzaGlwIGNvbW1pdHRtZW50cyBmb3IgYWxsIHJhY2VzIikgKyAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTkEgb3IgQWxhc2thbiIsIkFzaWFuIiwiQmxhY2sgb3IgQUEiLCAiSGF3YWlpYW4gb3IgUEkiLCJXaGl0ZSIpKSArIAogIHlsaW0oMCwxMDApKwogICAgIGdlb21fdGV4dChhZXMobGFiZWw9Q291bnRfUGN0KSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC45KSwgdmp1c3Q9LTAuMjUpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTYsIGFuZ2xlPTE1KSkKcF9hbGwKYGBgCgoKZmlzaGVycyB0ZXN0cyBiZXR3ZWVuIGdyb3VwcyByYWNlIGFuZCBmZWxsb3cgY2F0CmBgYHtyfQpmaXNoZXIudGVzdChkZl9yYWNlJHJhY2VfY2F0LGRmX3JhY2UkZmVsbG93X2NhdCwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEI9MjAwMCkKZmlzaGVyLnRlc3QodGFibGUoZGZfcmFjZSRmZWxsb3dfY2F0LGRmX3JhY2UkcmFjZV9jYXQpLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQj0yMDAwKQpgYGAKQ29uY2x1c2lvbiBmcm9tIGZpc2hlcidzIHRlc3Q6IHRoZXJlIGFyZSBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHJhY2UgYW5kIGZlbGxvd3NoaXAgcGxhbnMuIAoKQmVsb3c6IDItZ3JvdXAgZmlzaGVycyB0ZXN0cwoKTmF0aXZlIEFtZXJpY2FuIGV4Y2x1ZGVkIGZvciBsb3cgc2FtcGxlIHNpemUgKG49NCkKYGBge3J9CndoaXRlLmFzaWFuIDwtIHRhYmxlKGRmX3JhY2VbZGZfcmFjZSRyYWNlX2NhdD09IldoaXRlIiB8IGRmX3JhY2UkcmFjZV9jYXQ9PSJBc2lhbiIsMTRdLGRmX3JhY2VbZGZfcmFjZSRyYWNlX2NhdD09IldoaXRlIiB8IGRmX3JhY2UkcmFjZV9jYXQ9PSJBc2lhbiIsMTZdKQoKd2hpdGUuYmxhY2sgPC0gdGFibGUoZGZfcmFjZVtkZl9yYWNlJHJhY2VfY2F0PT0iV2hpdGUiIHwgZGZfcmFjZSRyYWNlX2NhdD09IkJsYWNrIG9yIEFmcmljYW4gQW1lcmljYW4iLDE0XSxkZl9yYWNlW2RmX3JhY2UkcmFjZV9jYXQ9PSJXaGl0ZSIgfCBkZl9yYWNlJHJhY2VfY2F0PT0iQmxhY2sgb3IgQWZyaWNhbiBBbWVyaWNhbiIsMTZdKQoKd2hpdGUuTkhQQSA8LSB0YWJsZShkZl9yYWNlW2RmX3JhY2UkcmFjZV9jYXQ9PSJXaGl0ZSIgfCBkZl9yYWNlJHJhY2VfY2F0PT0iTmF0aXZlIEhhd2FpaWFuIG9yIG90aGVyIFBhY2lmaWMgSXNsYW5kZXIiLDE0XSxkZl9yYWNlW2RmX3JhY2UkcmFjZV9jYXQ9PSJXaGl0ZSIgfCBkZl9yYWNlJHJhY2VfY2F0PT0iTmF0aXZlIEhhd2FpaWFuIG9yIG90aGVyIFBhY2lmaWMgSXNsYW5kZXIiLDE2XSkKCmFzaWFuLmJsYWNrIDwtIHRhYmxlKGRmX3JhY2VbZGZfcmFjZSRyYWNlX2NhdD09IkFzaWFuIiB8IGRmX3JhY2UkcmFjZV9jYXQ9PSJCbGFjayBvciBBZnJpY2FuIEFtZXJpY2FuIiwxNF0sZGZfcmFjZVtkZl9yYWNlJHJhY2VfY2F0PT0iQXNpYW4iIHwgZGZfcmFjZSRyYWNlX2NhdD09IkJsYWNrIG9yIEFmcmljYW4gQW1lcmljYW4iLDE2XSkKCmFzaWFuLk5IUEEgPC0gdGFibGUoZGZfcmFjZVtkZl9yYWNlJHJhY2VfY2F0PT0iQXNpYW4iIHwgZGZfcmFjZSRyYWNlX2NhdD09Ik5hdGl2ZSBIYXdhaWlhbiBvciBvdGhlciBQYWNpZmljIElzbGFuZGVyIiwxNF0sZGZfcmFjZVtkZl9yYWNlJHJhY2VfY2F0PT0iQXNpYW4iIHwgZGZfcmFjZSRyYWNlX2NhdD09Ik5hdGl2ZSBIYXdhaWlhbiBvciBvdGhlciBQYWNpZmljIElzbGFuZGVyIiwxNl0pCgpibGFjay5OSFBBIDwtIHRhYmxlKGRmX3JhY2VbZGZfcmFjZSRyYWNlX2NhdD09IkJsYWNrIG9yIEFmcmljYW4gQW1lcmljYW4iIHwgZGZfcmFjZSRyYWNlX2NhdD09Ik5hdGl2ZSBIYXdhaWlhbiBvciBvdGhlciBQYWNpZmljIElzbGFuZGVyIiwxNF0sZGZfcmFjZVtkZl9yYWNlJHJhY2VfY2F0PT0iQmxhY2sgb3IgQWZyaWNhbiBBbWVyaWNhbiIgfCBkZl9yYWNlJHJhY2VfY2F0PT0iTmF0aXZlIEhhd2FpaWFuIG9yIG90aGVyIFBhY2lmaWMgSXNsYW5kZXIiLDE2XSkKYGBgCgoKYGBge3J9CiN0ZXN0cwpmaXNoZXIudGVzdCh3aGl0ZS5hc2lhbiwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEI9MjAwMCkgI1MKZmlzaGVyLnRlc3Qod2hpdGUuYmxhY2ssIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCPTIwMDApICNOUwpmaXNoZXIudGVzdCh3aGl0ZS5OSFBBLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQj0yMDAwKSAjUwpmaXNoZXIudGVzdChhc2lhbi5ibGFjaywgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEI9MjAwMCkgI1MgLT4gTlMgYWZ0ZXIgY29ycmVjdGlvbnMuIApmaXNoZXIudGVzdChhc2lhbi5OSFBBLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQj0yMDAwKSAjTlMKZmlzaGVyLnRlc3QoYmxhY2suTkhQQSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUsIEI9MjAwMCkgI05TCmBgYAoKCmBgYHtyfQpkZl9yYWNlWywxMzoxNl0gJT4lCiAgdGJsX3N1bW1hcnkoYnk9cmFjZV9jYXQpICU+JQogIGFkZF9wKCkKYGBgCgoKTmF0aXZlIEFtZXJpY2FuIG9yIEFsYXNrYW46ClByb2IvRGVmIE5vIDAlClByb2IvRGVmIFllcyAyNSUKVW5zdXJlIDc1JQoKQXNpYW4KUHJvYi9EZWYgTm8gMyUKUHJvYi9EZWYgWWVzIDUzJQpVbnN1cmUgNDQlCgpCbGFjayBvciBBZnJpY2FuIEFtZXJpY2FuClByb2IvRGVmIE5vIDAlClByb2IvRGVmIFllcyA4NiUKVW5zdXJlIDE0JQoKTmF0aXZlIEhhd2FpaWFuIG9yIFBhY2lmaWMgSXNsYW5kZXIKUHJvYi9EZWYgTm8gMCUKUHJvYi9EZWYgWWVzIDU4JQpVbnN1cmUgNDIlCgpXaGl0ZQpQcm9iL0RlZiBObyA1JQpQcm9iL0RlZiBZZXMgOTIlClVuc3VyZSAzJQoKLS0tCi0tLQoKIyMjIyBHRU5ERVIgeCBmZWxsb3dzaGlwCjEuIGNpcyB3b21hbiAKMi4gY2lzIG1hbgozLiBOQgo0LiBUIHdvbWFuCjUuIFQgbWFuCjYuIE5vdCBMaXN0ZWQKNy4gTm8gcmVzcG9uc2UKCmBgYHtyfQpkZl9nZW4gPC0gZGYyWyFkZjIkZ2VuZGVyPT01LF0KZGZfZ2VuIDwtIGRmX2dlblshZGZfZ2VuJGdlbmRlcj09NixdCmRmX2dlbiA8LSBkZl9nZW5bIWlzLm5hKGRmX2dlbiRmZWxsb3dzaGlwX3luKSxdCgojZGZfZ2VuMiBpcyBvbmx5IGNpcyBtZW4sIGNpcyB3b21lbiwgYW5kIE5SCmRmX2dlbjIgPC0gZGZfZ2VuWyFkZl9nZW4kZ2VuZGVyPT0zLF0KZGZfZ2VuMiA8LSBkZl9nZW4yWyFkZl9nZW4yJGdlbmRlcj09NCxdCmBgYAoKYGBge3J9CmdlbmRlciA8LSB0YWJsZShkZl9nZW4kZmVsbG93X2NhdCxkZl9nZW4kZ2VuZGVyX2NhdCkKZ2VuZGVyMiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRmX2dlbiRmZWxsb3dfY2F0LGRmX2dlbiRnZW5kZXJfY2F0KSkKY29sbmFtZXMoZ2VuZGVyMikgPC0gYygiZmVsbG93X2NhdCIsImdlbmRlciIsImNvdW50IikKYGBgCgpgYGB7cn0KZ2VuX3BjdCA8LSBzZXREVChnZW5kZXIyKVssIGxpc3Qoc3VtX2NvdW50ID0gc3VtKGNvdW50KSksIGtleWJ5ID0gbGlzdChmZWxsb3dfY2F0LGdlbmRlcildWywgCiAgICAgICAgICAgIHBjdCA6PSByb3VuZChzdW1fY291bnQvc3VtKHN1bV9jb3VudCksIDIpKjEwMCwgYnkgPSBmZWxsb3dfY2F0XVtdCmdlbl9wY3QyIDwtIHNldERUKGdlbmRlcjIpWywgbGlzdChzdW1fY291bnQgPSBzdW0oY291bnQpKSwga2V5YnkgPSBsaXN0KGZlbGxvd19jYXQsZ2VuZGVyKV1bLCAKICAgICAgICAgICAgcGN0IDo9IHJvdW5kKHN1bV9jb3VudC9zdW0oc3VtX2NvdW50KSwgMikqMTAwLCBieSA9IGdlbmRlcl1bXQoKCnBfYWxsPC1nZ3Bsb3QoZGF0YT1nZW5fcGN0MiwgYWVzKHg9Z2VuZGVyLCB5PXBjdCwgZmlsbD1mZWxsb3dfY2F0KSkgICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBjb2xvcj0iYmxhY2siLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICB0aGVtZV9taW5pbWFsKCkrIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkJsdWVzIikrZ2doaXN0bytnZ3RpdGxlKCJmZWxsb3dzaGlwIGNvbW1pdHRtZW50cyBmb3IgYWxsIGdlbmRlcnMiKSArICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJDaXMgV29tYW4iLCJDaXMgTWFuIiwiTkIiLCAiVCBXb21hbiIsIk5vIFJlc3BvbnNlIikpICsgCiAgeWxpbSgwLDEwMCkrCiAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wY3QpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpLCB2anVzdD0tMC4yNSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTIsIGFuZ2xlPTE1KSkKcF9hbGwKYGBgCgoKVGhlIGNhdGVnb3JpZXMgZm9yIFRXIGFuZCBOQiBhcmUgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGNvbXBhcmVkIHRvIHRoZSBvdGhlciAzIGNhdGVnb3JpZXMuICJJbiAyMDE4LCAwLjclIG9mIG1hdHJpY3VsYXRpbmcgbWVkaWNhbCBzdHVkZW50cyBpZGVudGlmaWVkIGFzIFRHTkIiIGh0dHBzOi8vd3d3LmFhbWMub3JnL2RhdGEtcmVwb3J0cy9zdHVkZW50cy1yZXNpZGVudHMvcmVwb3J0L21hdHJpY3VsYXRpbmctc3R1ZGVudC1xdWVzdGlvbm5haXJlLW1zcQoKCgpgYGB7cn0KZGZfZ2VuWywxMzoxN10gJT4lCiAgdGJsX3N1bW1hcnkoYnk9Z2VuZGVyX2NhdCklPiUKICBhZGRfcCgpCmBgYAoKCiMjIyMgUmVkb2luZyB0aGUgYW5hbHlzaXMgYW5kIGV4Y2x1ZGluZyBOQiBhbmQgTlIgZ2VuZGVyIGNhdGVnb3JpZXMKCmBgYHtyfQpnZW5kZXIyIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGZfZ2VuMiRmZWxsb3dfY2F0LGRmX2dlbjIkZ2VuZGVyX2NhdCkpCmNvbG5hbWVzKGdlbmRlcjIpIDwtIGMoImZlbGxvd19jYXQiLCJnZW5kZXIiLCJjb3VudCIpCmBgYAoKYGBge3J9Cmdlbl9wY3QgPC0gc2V0RFQoZ2VuZGVyMilbLCBsaXN0KHN1bV9jb3VudCA9IHN1bShjb3VudCkpLCBrZXlieSA9IGxpc3QoZmVsbG93X2NhdCxnZW5kZXIpXVssIAogICAgICAgICAgICBwY3QgOj0gcm91bmQoc3VtX2NvdW50L3N1bShzdW1fY291bnQpLCAyKSoxMDAsIGJ5ID0gZmVsbG93X2NhdF1bXQpnZW5fcGN0MiA8LSBzZXREVChnZW5kZXIyKVssIGxpc3Qoc3VtX2NvdW50ID0gc3VtKGNvdW50KSksIGtleWJ5ID0gbGlzdChmZWxsb3dfY2F0LGdlbmRlcildWywgCiAgICAgICAgICAgIHBjdCA6PSByb3VuZChzdW1fY291bnQvc3VtKHN1bV9jb3VudCksIDIpKjEwMCwgYnkgPSBnZW5kZXJdW10KCgpwX2FsbDwtZ2dwbG90KGRhdGE9Z2VuX3BjdDIsIGFlcyh4PWdlbmRlciwgeT1wY3QsIGZpbGw9ZmVsbG93X2NhdCkpICArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgY29sb3I9ImJsYWNrIiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrCiAgdGhlbWVfbWluaW1hbCgpKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJCbHVlcyIpK2dnaGlzdG8rZ2d0aXRsZSgiZmVsbG93c2hpcCBjb21taXR0bWVudHMgZm9yIGFsbCBnZW5kZXJzIikgKyB5bGltKDAsMTAwKSsKICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPXBjdCksIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIHZqdXN0PS0wLjI1KQpwX2FsbApgYGAKCgpmaXNoZXJzIHRlc3RzIGJldHdlZW4gZ3JvdXBzIHJhY2UgYW5kIGZlbGxvdyBjYXQKYGBge3J9CmZpc2hlci50ZXN0KGRmX2dlbjIkZ2VuZGVyX2NhdCxkZl9nZW4yJGZlbGxvd19jYXQsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCBCPTIwMDApCmZpc2hlci50ZXN0KHRhYmxlKGRmX2dlbjIkZmVsbG93X2NhdCxkZl9nZW4yJGdlbmRlcl9jYXQpLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQj0yMDAwKQoKYGBgCgoKYGBge3J9CmRmX2dlbjJbLDEzOjE3XSAlPiUKICB0Ymxfc3VtbWFyeShieT1nZW5kZXJfY2F0KSU+JQogIGFkZF9wKCkKYGBgCgo=