1 Getting started

To copy the code, click the button in the upper right corner of the code-chunks.

1.1 clean up

rm(list = ls())
gc()


1.2 custom functions

We defined a number custom functions, at Download custom_functions.R.

source("./custom_functions.R")


1.3 necessary packages

  • tidyverse: data wrangling
  • igraph: generate and visualize graphs
  • parallel: parallel computing to speed up simulation
  • foreach: looping in parallel
  • doParallel: parallel backend for foreach
  • ggplot2: data visualization
  • ggh4x: hacks for ggplot2
  • ggpubr: make visualizations publication-ready
packages = c("tidyverse", "igraph", "ggplot2", "parallel", "doParallel", "foreach", "ggh4x", "ggpubr",
    "plotly", "RColorBrewer", "grid", "gridExtra", "patchwork", "ggplotify", "ggraph", "gganimate", "RColorBrewer",
    "ggtext", "magick", "jsonlite", "lubridate", "ggtext")

invisible(fpackage.check(packages))
rm(packages)

2 import data

data <- read.csv("./rawdata/all_apps_wide_2026-03-23-ii.csv")
times <- read.csv("./rawdata/PageTimes-2026-03-23-ii.csv")

# cbind(data$participant.node,data$participant.role)[complete.cases(
# #cbind(data$participant.node,data$participant.role)),]

bonus <- data[, c("participant.bonus", "participant.label")]
bonus <- bonus[!is.na(bonus$participant.bonus), ]
bonus_out <- data.frame(id = bonus$participant.label, bonus = bonus$participant.bonus)
# nrow(bonus_out)
write.table(bonus_out, "bonus.txt", sep = ",", row.names = FALSE, col.names = TRUE, quote = FALSE)

3 results

On 23-03-2026, I recruited 59 Prolific participants via a brief sign-up survey to populate a network of N=50 (with a 10% minority group).

net <- jsonlite::fromJSON("./networks/network_test_n50.json")

g <- graph_from_adjacency_matrix(net$adj_matrix, mode = "undirected")
V(g)$role <- ifelse(net$role_vector == 1, "trendsetter", "conformist")

fplot_graph(g)


3.1 diagnostics

3.1.1 dropout

When did people time out?

dropout_long <- data %>%
    filter(!is.na(participant.node)) %>%
    select(participant.label, participant.role, matches("unpop\\.[0-9]+\\.player\\.is_dropout")) %>%
    pivot_longer(cols = matches("unpop\\.[0-9]+\\.player\\.is_dropout"), names_to = "round", values_to = "is_dropout") %>%
    mutate(round = str_extract(round, "[0-9]+"), round = as.numeric(round))

dropout_df <- dropout_long %>%
    filter(is_dropout == 1) %>%
    select(participant.label, participant.role, round)

ggplot(na.omit(dropout_df), aes(x = round)) + geom_bar()

# number of players that experienced time-outs:
dropout_df %>%
    distinct(participant.label) %>%
    nrow()
#> [1] 9
# players exiting after recurring timeouts:
table(data$participant.exit)
#> 
#>  0  1 
#> 46  4

3.2 unpopular norm spread

df_long <- data %>%
  filter(!is.na(participant.node)) %>%
  select(participant.label, participant.role, participant.node, starts_with("unpop.")) %>% #also include network node.
  
  pivot_longer(
    cols = matches("unpop\\.\\d+\\.player\\.choice$"),  # only choice columns
    names_to = "round",
    values_to = "choice"
  ) %>%
  mutate(
    round = as.integer(gsub("unpop\\.(\\d+)\\.player\\.choice", "\\1", round)),
    is_bot = ifelse(participant.label == "", TRUE, FALSE)
  ) %>%
  select(participant.label, participant.node, participant.role, round, choice, is_bot)

# aggregated
df_plot <- df_long %>%
  group_by(round) %>%
  summarise(
    pct_choice1 = mean(choice, na.rm = TRUE) * 100,  # proportion * 100
    n = n()
  )

ggplot(df_plot, aes(x = round, y = pct_choice1)) +
  geom_line(group = 1, color = "steelblue", size = .5) +
  geom_point(color = "steelblue", size = 2) +
   geom_hline(yintercept = 10, linetype = "longdash", color = "darkgrey", size = 0.8) +  # dashed line at 10
  scale_x_continuous(breaks = df_plot$round) +
  scale_y_continuous(limits = c(0, 100)) +  
  labs(
    x = "Round",
    y = "% agents choosing 'blue'",
    title = "Evolution of an unpopular norm"
  )

table(data$survey.1.player.enjoyment)
#> 
#>  2  3  4  5 
#>  4 10 15  8
table(data$survey.1.player.clarity)
#> 
#>  4  5 
#> 11 26
table(data$survey.1.player.majority)
#> 
#>  1  2  3 
#>  6 27  4
fshowdf(unique(data$survey.1.player.strategy))
x
Stuck with red to start and when I realised most people were going blue i swapped to maximise my points
Stuck with red as instructed unless both neighbours had blue the previous round, then changed to blue. Since at least one neighbour had red the next round, switched back from blue to red
I looked at what my neighbors were choosing the previous rounds.
mostly agreement between neighbors
I was just trying to cooperate with others and win as much points as I can.
Seeing my neighbors selecting blue and judging the return on investment of that color, I chose to always stick with blue to maximize gains.
Tracking how other players respond and highest payoff
Start with my color so signal which one was mine, then choose and stay with the majority choice the rest of the game - which happened to be all blue.
I wanted to pick red shirt at first, but I trusted people wanted all neighbours benefits so I decided to pick blue and based on people picks I still picked it, even though at first various neighbours picked red shirt.
It depended on knowing what my neighbors chose the day before
The second player almost always chooses the same skirt
I used the previous day’s selections because I knew that was the color that the other participants preferred to choose.
I started with red since it was a sure win. But then I started to notice that my neighbors were choosing blue and since it had higher profit, I chose blue for the rest of the days.
Well first i chose the color i got picked which was red, Then i saw more people using blue but i stayed red too see if people switched, They did not so i switched to blue then just picked blue.
what my partner wore
what neighbors were choosing previously.
I used a coordination-based strategy.
I saw there was a prefrence for blue and followed it to maximize point gain for myself and other group members
Choose the one that more people chose.
Tried to stay consistent with one of my neighbors that chose blue throughout the study.
In the beginning I went with the majority and kept choosing blue. But towards the end, someone started to choose red, so I chose red to see if we can influence people into switching to red, but was unsuccessful.
if they choosed blues yesterday i choose the same and then i just went with blue
You try to push others to follow you in a try to get more income, however, sometimes the others don’t follow, so you have to return to the starting point and try again, eventually they will agree with your scheme.
I went with the group. In this case I kept picking blue
I tried to coordinate my choice with my neighbors to maximize points. I usually chose the color that most of my neighbors picked in previous round.
I went with whatever produced the highest number
Firstly I wanted to stay to my color, but I risked and picked blue. After some time I saw that picking blue was a better deal, so I did it a copule of times. I wanted to switch back to red, cause I saw my neighbours picked red sometimes, but it didn’t work.
I just went with the safest option.
the greater good, always choose blue, it was the way of getting more points even if that risked to get 0, there was aroun a 60% chance that someone else will select blue as well, so i took the chance
At first, I thought we’re better off all doing blue, then I experimented to see if maybe all red could work but since it didn’t after a few rounds, I stuck to blue to maximise points.
Saw the way it was trending (Blue) and just kept rolling with it
started with red as this was the best but then went blue
fshowdf(unique(data$survey.1.player.perceived_rq))
x
See if others decisions affect people
About how others can influence yourself. How environment can shift you and your opinion
they are trying to answer a question related to people getting influenced by their close people maybe.
relating to group decisions and compromise
In my opinion, the researchers attempted to investigate the impact of the other peope decisions.
I believe the experiment seeks to understand how a pattern occurs. For example, I believe that if two people chose blue and one chose red, in the next round the pattern to follow was blue, and so it continued until the end.
How people decide
The experiment was about observing if people will give in to peer pressure and switch the financially good option
Cooperation and signalling
I think researchers want to test people identity to a group, pursuing everyone’s benefit instead of only one person benefit.
I think it was about to know how people make decisions
Play with AI
If previous selection would influence future decisions. Do people make decisions based on other’s influence?
I think it was regarding how a human mind works regarding doing the obvious or taking a risk and how it is affected by what others do.
maybe too see how fast people would cooperate and if people were willing to sacrifice 5 points to potentially earn more?
peer pressure
to know how strangers make decisions based on different situations.
The experiment seems to be about social coordination and collective behavior.
Analyzing people’s selfishness/priorities
I don’t know.
I guess trying to identify if people will move out to the mayority even if they don’t get reward
Influence about group decisions
Cooperation between people when faced with a reward.
To see how we change behavior depending on the majority.
The way that people can influence in others decisions.
If you choose to go with the group or stick to your choice
I honestly have no idea. may be to see who follows the previously given instructions.
This study was about how people make decisions in a group and how they coordinate with others when are different preferences.
Working with others
Going after the group, picking safest option, risk and prize balance
risk taking
I don’t really know but I think it was to see if will change their mind mid test because everyone else was selecting the other choice
Whether people will adjust to others to secure larger benefits.
Choices between assured vs. chance outcomes
conformity and herd behavior
fshowdf(unique(data$survey.1.player.comments))
x
No, everything was good. Thank you.
I loved being part of this study, thanks!
I think this is a pretty well done and enjoyable research, keep doing things like this!
None
nope
No, Thank you for this experience.
no thank you.
everything was clear and went well
The game should change the points of the colors mid game, making it more challenging
No Comments
The game was clear and easy to follow.
nothing to add
thanks!
LS0tDQp0aXRsZTogIkV4cGVyaW1lbnQiDQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQpsaW5rLWNpdGF0aW9uczogdHJ1ZQ0KZGF0ZTogIkxhc3QgY29tcGlsZWQgb24gYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBjc3M6IHR3ZWFrcy5jc3MNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCi0tLQ0KDQpgYGB7ciwgZ2xvYmFsc2V0dGluZ3MsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Kb3B0c19jaHVuayRzZXQodGlkeS5vcHRzPWxpc3Qod2lkdGguY3V0b2ZmPTEwMCksdGlkeT1UUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSxjb21tZW50ID0gIiM+IiwgY2FjaGU9VFJVRSwgY2xhc3Muc291cmNlPWMoInRlc3QiKSwgY2xhc3Mub3V0cHV0PWMoInRlc3QzIikpDQpvcHRpb25zKHdpZHRoID0gMTAwKQ0KcmdsOjpzZXR1cEtuaXRyKCkNCg0KY29sb3JpemUgPC0gZnVuY3Rpb24oeCwgY29sb3IpIHtzcHJpbnRmKCI8c3BhbiBzdHlsZT0nY29sb3I6ICVzOyc+JXM8L3NwYW4+IiwgY29sb3IsIHgpIH0NCmBgYA0KDQpgYGB7ciBrbGlwcHksIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygndG9wJywgJ3JpZ2h0JykpDQoja2xpcHB5OjprbGlwcHkoY29sb3IgPSAnZGFya3JlZCcpDQoja2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScpDQpgYGANCg0KLS0tDQoNCiMgR2V0dGluZyBzdGFydGVkDQoNClRvIGNvcHkgdGhlIGNvZGUsIGNsaWNrIHRoZSBidXR0b24gaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciBvZiB0aGUgY29kZS1jaHVua3MuDQoNCiMjIGNsZWFuIHVwDQoNCmBgYHtyLCBjbGVhbl91cCwgcmVzdWx0cz0naGlkZSd9DQpybShsaXN0PWxzKCkpDQpnYygpDQpgYGANCg0KPGJyPg0KDQojIyBjdXN0b20gZnVuY3Rpb25zDQoNCldlIGRlZmluZWQgYSBudW1iZXIgY3VzdG9tIGZ1bmN0aW9ucywgYXQgYHIgeGZ1bjo6ZW1iZWRfZmlsZSgiLi9jdXN0b21fZnVuY3Rpb25zLlIiKWAuDQoNCmBgYHtyLCBjdXN0b21fZnVuY3Rpb25zfQ0Kc291cmNlKCIuL2N1c3RvbV9mdW5jdGlvbnMuUiIpDQpgYGANCg0KPGJyPg0KDQojIyBuZWNlc3NhcnkgcGFja2FnZXMNCg0KLSBgdGlkeXZlcnNlYDogZGF0YSB3cmFuZ2xpbmcNCi0gYGlncmFwaGA6IGdlbmVyYXRlIGFuZCB2aXN1YWxpemUgZ3JhcGhzDQotIGBwYXJhbGxlbGA6IHBhcmFsbGVsIGNvbXB1dGluZyB0byBzcGVlZCB1cCBzaW11bGF0aW9uDQotIGBmb3JlYWNoYDogbG9vcGluZyBpbiBwYXJhbGxlbA0KLSBgZG9QYXJhbGxlbGA6IHBhcmFsbGVsIGJhY2tlbmQgZm9yIGBmb3JlYWNoYA0KLSBgZ2dwbG90MmA6IGRhdGEgdmlzdWFsaXphdGlvbg0KLSBgZ2doNHhgOiBoYWNrcyBmb3IgYGdncGxvdDJgDQotIGBnZ3B1YnJgOiBtYWtlIHZpc3VhbGl6YXRpb25zIHB1YmxpY2F0aW9uLXJlYWR5DQoNCg0KYGBge3IsIHBhY2thZ2VzfQ0KcGFja2FnZXMgPSBjKCJ0aWR5dmVyc2UiLCAiaWdyYXBoIiwgImdncGxvdDIiLCAicGFyYWxsZWwiLCAiZG9QYXJhbGxlbCIsICJmb3JlYWNoIiwgImdnaDR4IiwgImdncHViciIsICJwbG90bHkiLCAiUkNvbG9yQnJld2VyIiwgImdyaWQiLCAiZ3JpZEV4dHJhIiwgInBhdGNod29yayIsICJnZ3Bsb3RpZnkiLCAiZ2dyYXBoIiwgImdnYW5pbWF0ZSIsICJSQ29sb3JCcmV3ZXIiLA0KICAgICJnZ3RleHQiLCAibWFnaWNrIiwgImpzb25saXRlIiwgImx1YnJpZGF0ZSIsICJnZ3RleHQiKQ0KDQppbnZpc2libGUoZnBhY2thZ2UuY2hlY2socGFja2FnZXMpKQ0Kcm0ocGFja2FnZXMpDQpgYGANCg0KLS0tDQoNCiMgaW1wb3J0IGRhdGENCg0KYGBge3J9DQpkYXRhIDwtIHJlYWQuY3N2KCIuL3Jhd2RhdGEvYWxsX2FwcHNfd2lkZV8yMDI2LTAzLTIzLWlpLmNzdiIpDQp0aW1lcyA8LSByZWFkLmNzdigiLi9yYXdkYXRhL1BhZ2VUaW1lcy0yMDI2LTAzLTIzLWlpLmNzdiIpDQoNCiNjYmluZChkYXRhJHBhcnRpY2lwYW50Lm5vZGUsZGF0YSRwYXJ0aWNpcGFudC5yb2xlKVtjb21wbGV0ZS5jYXNlcyggI2NiaW5kKGRhdGEkcGFydGljaXBhbnQubm9kZSxkYXRhJHBhcnRpY2lwYW50LnJvbGUpKSxdDQoNCmJvbnVzIDwtIGRhdGFbLCBjKCJwYXJ0aWNpcGFudC5ib251cyIsICJwYXJ0aWNpcGFudC5sYWJlbCIpXQ0KYm9udXMgPC0gYm9udXNbIWlzLm5hKGJvbnVzJHBhcnRpY2lwYW50LmJvbnVzKSwgXQ0KYm9udXNfb3V0IDwtIGRhdGEuZnJhbWUoDQogIGlkID0gYm9udXMkcGFydGljaXBhbnQubGFiZWwsDQogIGJvbnVzID0gYm9udXMkcGFydGljaXBhbnQuYm9udXMNCikNCiNucm93KGJvbnVzX291dCkNCndyaXRlLnRhYmxlKGJvbnVzX291dCwgImJvbnVzLnR4dCIsIHNlcCA9ICIsIiwgcm93Lm5hbWVzID0gRkFMU0UsIGNvbC5uYW1lcyA9IFRSVUUsIHF1b3RlID0gRkFMU0UpDQpgYGANCg0KLS0tDQoNCiMgcmVzdWx0cw0KDQpPbiAyMy0wMy0yMDI2LCBJIHJlY3J1aXRlZCA1OSBQcm9saWZpYyBwYXJ0aWNpcGFudHMgdmlhIGEgYnJpZWYgW3NpZ24tdXAgc3VydmV5XShodHRwczovL2dpdGh1Yi5jb20vVXRyZWNodFVuaXZlcnNpdHkvc2lnbi11cC1leHBlcmltZW50KSB0byBwb3B1bGF0ZSBhIG5ldHdvcmsgb2YgTj01MCAod2l0aCBhIDEwJSBtaW5vcml0eSBncm91cCkuDQoNCg0KYGBge3IsIGNsYXNzLnNvdXJjZSA9ICdmb2xkLWhpZGUnfQ0KbmV0IDwtIGpzb25saXRlOjpmcm9tSlNPTigiLi9uZXR3b3Jrcy9uZXR3b3JrX3Rlc3RfbjUwLmpzb24iKQ0KDQpnIDwtIGdyYXBoX2Zyb21fYWRqYWNlbmN5X21hdHJpeChuZXQkYWRqX21hdHJpeCwgbW9kZSA9ICJ1bmRpcmVjdGVkIikNClYoZykkcm9sZSA8LSBpZmVsc2UobmV0JHJvbGVfdmVjdG9yID09IDEsICJ0cmVuZHNldHRlciIsICJjb25mb3JtaXN0IikNCg0KZnBsb3RfZ3JhcGgoZyApDQpgYGANCg0KDQo8YnI+DQoNCiMjIGRpYWdub3N0aWNzDQoNCg0KIyMjIGRyb3BvdXQNCg0KV2hlbiBkaWQgcGVvcGxlIHRpbWUgb3V0Pw0KDQpgYGB7cn0NCmRyb3BvdXRfbG9uZyA8LSBkYXRhICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHBhcnRpY2lwYW50Lm5vZGUpKSAlPiUNCiAgc2VsZWN0KA0KICAgIHBhcnRpY2lwYW50LmxhYmVsLA0KICAgIHBhcnRpY2lwYW50LnJvbGUsDQogICAgbWF0Y2hlcygidW5wb3BcXC5bMC05XStcXC5wbGF5ZXJcXC5pc19kcm9wb3V0IikNCiAgKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBtYXRjaGVzKCJ1bnBvcFxcLlswLTldK1xcLnBsYXllclxcLmlzX2Ryb3BvdXQiKSwNCiAgICBuYW1lc190byA9ICJyb3VuZCIsDQogICAgdmFsdWVzX3RvID0gImlzX2Ryb3BvdXQiDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICByb3VuZCA9IHN0cl9leHRyYWN0KHJvdW5kLCAiWzAtOV0rIiksDQogICAgcm91bmQgPSBhcy5udW1lcmljKHJvdW5kKQ0KICApDQoNCmRyb3BvdXRfZGYgPC0gZHJvcG91dF9sb25nICU+JQ0KICBmaWx0ZXIoaXNfZHJvcG91dCA9PSAxKSAlPiUNCiAgc2VsZWN0KHBhcnRpY2lwYW50LmxhYmVsLCBwYXJ0aWNpcGFudC5yb2xlLCByb3VuZCkNCg0KZ2dwbG90KG5hLm9taXQoZHJvcG91dF9kZiksIGFlcyh4ID0gcm91bmQpKSArDQogIGdlb21fYmFyKCkNCg0KIyBudW1iZXIgb2YgcGxheWVycyB0aGF0IGV4cGVyaWVuY2VkIHRpbWUtb3V0czoNCmRyb3BvdXRfZGYgJT4lDQogIGRpc3RpbmN0KHBhcnRpY2lwYW50LmxhYmVsKSAlPiUNCiAgbnJvdygpDQoNCiMgcGxheWVycyBleGl0aW5nIGFmdGVyIHJlY3VycmluZyB0aW1lb3V0czoNCnRhYmxlKGRhdGEkcGFydGljaXBhbnQuZXhpdCkNCmBgYA0KDQoNCi0tLS0NCg0KDQojIyB1bnBvcHVsYXIgbm9ybSBzcHJlYWQNCg0KYGBge3IsY2xhc3Muc291cmNlID0gJ2ZvbGQtaGlkZSd9DQpkZl9sb25nIDwtIGRhdGEgJT4lDQogIGZpbHRlcighaXMubmEocGFydGljaXBhbnQubm9kZSkpICU+JQ0KICBzZWxlY3QocGFydGljaXBhbnQubGFiZWwsIHBhcnRpY2lwYW50LnJvbGUsIHBhcnRpY2lwYW50Lm5vZGUsIHN0YXJ0c193aXRoKCJ1bnBvcC4iKSkgJT4lICNhbHNvIGluY2x1ZGUgbmV0d29yayBub2RlLg0KICANCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBtYXRjaGVzKCJ1bnBvcFxcLlxcZCtcXC5wbGF5ZXJcXC5jaG9pY2UkIiksICAjIG9ubHkgY2hvaWNlIGNvbHVtbnMNCiAgICBuYW1lc190byA9ICJyb3VuZCIsDQogICAgdmFsdWVzX3RvID0gImNob2ljZSINCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIHJvdW5kID0gYXMuaW50ZWdlcihnc3ViKCJ1bnBvcFxcLihcXGQrKVxcLnBsYXllclxcLmNob2ljZSIsICJcXDEiLCByb3VuZCkpLA0KICAgIGlzX2JvdCA9IGlmZWxzZShwYXJ0aWNpcGFudC5sYWJlbCA9PSAiIiwgVFJVRSwgRkFMU0UpDQogICkgJT4lDQogIHNlbGVjdChwYXJ0aWNpcGFudC5sYWJlbCwgcGFydGljaXBhbnQubm9kZSwgcGFydGljaXBhbnQucm9sZSwgcm91bmQsIGNob2ljZSwgaXNfYm90KQ0KDQojIGFnZ3JlZ2F0ZWQNCmRmX3Bsb3QgPC0gZGZfbG9uZyAlPiUNCiAgZ3JvdXBfYnkocm91bmQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgcGN0X2Nob2ljZTEgPSBtZWFuKGNob2ljZSwgbmEucm0gPSBUUlVFKSAqIDEwMCwgICMgcHJvcG9ydGlvbiAqIDEwMA0KICAgIG4gPSBuKCkNCiAgKQ0KDQpnZ3Bsb3QoZGZfcGxvdCwgYWVzKHggPSByb3VuZCwgeSA9IHBjdF9jaG9pY2UxKSkgKw0KICBnZW9tX2xpbmUoZ3JvdXAgPSAxLCBjb2xvciA9ICJzdGVlbGJsdWUiLCBzaXplID0gLjUpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJzdGVlbGJsdWUiLCBzaXplID0gMikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMTAsIGxpbmV0eXBlID0gImxvbmdkYXNoIiwgY29sb3IgPSAiZGFya2dyZXkiLCBzaXplID0gMC44KSArICAjIGRhc2hlZCBsaW5lIGF0IDEwDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBkZl9wbG90JHJvdW5kKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEwMCkpICsgIA0KICBsYWJzKA0KICAgIHggPSAiUm91bmQiLA0KICAgIHkgPSAiJSBhZ2VudHMgY2hvb3NpbmcgJ2JsdWUnIiwNCiAgICB0aXRsZSA9ICJFdm9sdXRpb24gb2YgYW4gdW5wb3B1bGFyIG5vcm0iDQogICkNCmBgYA0KDQoNCmBgYHtyfQ0KdGFibGUoZGF0YSRzdXJ2ZXkuMS5wbGF5ZXIuZW5qb3ltZW50KQ0KdGFibGUoZGF0YSRzdXJ2ZXkuMS5wbGF5ZXIuY2xhcml0eSkNCnRhYmxlKGRhdGEkc3VydmV5LjEucGxheWVyLm1ham9yaXR5KQ0KZnNob3dkZih1bmlxdWUoZGF0YSRzdXJ2ZXkuMS5wbGF5ZXIuc3RyYXRlZ3kpKQ0KZnNob3dkZih1bmlxdWUoZGF0YSRzdXJ2ZXkuMS5wbGF5ZXIucGVyY2VpdmVkX3JxKSkNCmZzaG93ZGYodW5pcXVlKGRhdGEkc3VydmV5LjEucGxheWVyLmNvbW1lbnRzKSkNCmBgYA0K


Copyright © Rob Franken