Leah Kelly

Introduction

This project examines recognition accuracy across repeated learning cycles in two groups: Healthy Controls (HC) and People with Aphasia (PWA). Learning and recognition performance are important topics in psycholinguistics because they show how language processing changes over time and how neurological differences shape learning outcomes. By comparing performance across cycles and groups, this analysis highlights both group level patterns and individual variability.

Using quantitative methods introduced in LNGN 320/APLN 536, this project relies on data visualization to explore trends, variation, and group differences. Rather than focusing on raw data alone, the analysis uses summary measures and multiple visualization types to make patterns in learning and accuracy easier to interpret.

Dataset Description

Data on recognition accuracy is gathered over several learning cycles to make up the dataset. The researchers who conducted this study took two groups of people, Healthy Control and Person with Aphasia, and presented them with a set of made-up words.

The analysis represents novel word learning and measured by recognition accuracy across the repeated learning cycles between the two groups (HC and PWA). Recognition based measures is more useful to measure in people with aphasia since their speech production is typically limited or hindered. This way, the researchers can examine lexical learning while not focusing too much on phonological production.

Group and cycle variables were converted to factors, and missing or invalid recognition values were excluded from visualizations where necessary. No transformations were applied beyond these basic cleaning steps, allowing the patterns observed in the figures to closely reflect the original data structure.

Research Questions

This analysis addresses the following research questions:

  1. How does recognition accuracy change across learning cycles?

  2. Do Healthy Controls and People with Aphasia differ in overall recognition accuracy?

  3. How much variability exists within each group across cycles?

These questions are designed to be answered visually and quantitatively using summary statistics and comparative plots.

library(tidyverse)

# Load data
data <- read_csv("/Users/leahkelly/Downloads/DataR (2).csv")

# Clean data
data_clean <- data %>%
  mutate(
    group = factor(group, levels = c("HC", "PWA")),
    cycle = factor(cycle)
  )

# Summary stats
rec_summary <- data_clean %>%
  group_by(group, cycle) %>%
  summarise(
    n = sum(!is.na(recognition)),
    mean_recognition = mean(recognition, na.rm = TRUE),
    sd_recognition = sd(recognition, na.rm = TRUE),
    se_recognition = sd_recognition / sqrt(n),
    .groups = "drop"
  )

# Plot
ggplot(rec_summary, aes(x = cycle, y = mean_recognition, group = group,
                        linetype = group, shape = group)) +
  geom_line() +
  geom_point(size = 3) +
  geom_errorbar(
    aes(ymin = mean_recognition - se_recognition,
        ymax = mean_recognition + se_recognition),
    width = 0.1
  ) +
  scale_y_continuous(
    labels = scales::percent_format(accuracy = 1),
    limits = c(0, 1)
  ) +
  labs(
    title = "Recognition Accuracy Across Learning Cycles",
    subtitle = "Comparing Healthy Controls (HC) and People with Aphasia (PWA)",
    x = "Cycle",
    y = "Mean recognition accuracy",
    linetype = "Group",
    shape = "Group"
  ) +
  theme_minimal(base_size = 13)

2.1 Visualization Type 1: Mean Accuracy Across Learning Cycles

The first visualization demonstrates mean recognition accuracy across learning cycles for both groups, along with measures of variability. This type of plot is well suited for identifying overall trends and comparing group performance over time.

Figure 1 shows that recognition accuracy increases across cycles for both groups, showing increased learning over time. Healthy Controls consistently demonstrate higher mean accuracy than People with Aphasia at each cycle. However, the upward trend for both groups suggests that repeated exposure supports improvement regardless of group. Error bars are there for variability around the mean and show that while the groups differ, their performance ranges partially overlap.

library(tidyverse)

# Load data
data <- read_csv("/Users/leahkelly/Downloads/DataR (2).csv")

# Clean + optional filter to avoid missing/out-of-range warnings
data_clean <- data %>%
  mutate(
    group = factor(group, levels = c("HC", "PWA")),
    cycle = factor(cycle)
  ) %>%
  filter(!is.na(recognition), recognition >= 0, recognition <= 1)

# Summary stats (mean ± SE)
rec_summary <- data_clean %>%
  group_by(group, cycle) %>%
  summarise(
    n = n(),
    mean_recognition = mean(recognition),
    sd_recognition = sd(recognition),
    se_recognition = sd_recognition / sqrt(n),
    .groups = "drop"
  ) %>%
  mutate(
    ymin = pmax(0, mean_recognition - se_recognition),
    ymax = pmin(1, mean_recognition + se_recognition)
  )

# Plot
ggplot(rec_summary, aes(x = cycle, y = mean_recognition, group = group)) +
  geom_ribbon(
    aes(ymin = ymin, ymax = ymax, fill = group),
    alpha = 0.18,
    color = NA
  ) +
  geom_jitter(
    data = data_clean,
    aes(x = cycle, y = recognition, color = group),
    width = 0.12,
    alpha = 0.35,
    size = 2,
    inherit.aes = FALSE
  ) +
  geom_line(aes(color = group), linewidth = 1.2) +
  geom_point(aes(color = group), size = 3) +
  scale_y_continuous(
    labels = scales::percent_format(accuracy = 1),
    limits = c(0, 1)
  ) +
  scale_color_brewer(palette = "Set2") +
  scale_fill_brewer(palette = "Set2") +
  labs(
    title = "Recognition Accuracy Across Learning Cycles (Raw + Mean)",
    subtitle = "Dots = individual scores. Line = group mean. Band = mean ± 1 SE.",
    x = "Cycle",
    y = "Recognition accuracy",
    color = "Group",
    fill = "Group"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold"),
    panel.grid.minor = element_blank(),
    legend.position = "top"
  )

2.2 Visualization Type 2: Distribution of Accuracy Scores

To complement the mean-based analysis, the second visualization focuses on the distribution of recognition accuracy scores using violin and boxplot elements. This visualization highlights the spread, and shape of the data within each cycle and group.

Figure 2 reveals substantial variability within both groups, mainly in earlier cycles. The distribution for People with Aphasia is wider, suggesting greater individual differences in performance. Healthy Controls show more clustered scores, especially in later cycles, suggesting more consistent recognition accuracy. This visualization demonstrates why relying solely on means can be misleading, recognizing individual scores in the data is important to the bigger picture.

library(tidyverse)

# Load data
data <- read_csv("/Users/leahkelly/Downloads/DataR (2).csv")

# Clean data
data_clean <- data %>%
  mutate(
    group = factor(group, levels = c("HC", "PWA")),
    cycle = factor(cycle)
  )

# Create Correct vs Not Correct (assumes recognition is 0/1)
data_binary <- data_clean %>%
  filter(!is.na(recognition)) %>%
  mutate(outcome = if_else(recognition == 1, "Correct", "Not Correct"))

# Proportions per group/cycle
prop_data <- data_binary %>%
  count(group, cycle, outcome) %>%
  group_by(group, cycle) %>%
  mutate(prop = n / sum(n)) %>%
  ungroup()

# Plot
ggplot(prop_data, aes(x = cycle, y = prop, fill = outcome)) +
  geom_col(width = 0.75) +
  facet_wrap(~ group) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2") +
  labs(
    title = "Correct vs Not Correct Responses Across Learning Cycles",
    subtitle = "Each bar totals 100% within each group and cycle",
    x = "Cycle",
    y = "Percentage of responses",
    fill = ""
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold"),
    panel.grid.minor = element_blank(),
    legend.position = "top"
  )

2.3 Visualization Type 3: Correct vs. Not Correct Responses

The third visualization displays the proportion of correct versus not correct responses across learning cycles using a stacked bar chart. This format emphasizes relative proportions and makes group comparisons intuitive.

Figure 3 shows an increasing proportion of correct responses across cycles for both groups. Healthy Controls reach a higher proportion of correct responses earlier, while People with Aphasia show more gradual improvement. Because each bar sums to 100%, this visualization makes it easy to compare accuracy patterns across cycles without being influenced by differences in raw counts.

Conclusion and Discussion

Across all visualizations, a consistent pattern emerges: recognition accuracy improves across learning cycles for both groups, but Healthy Controls outperform People with Aphasia at each stage. The combination of visualizations reveals complementary insights. Mean based plots highlight overall trends, distributional plots expose individual variability, and proportional charts clarify group differences in correctness.

This data bolsters the fact that with repeated exposure to a word, it becomes easier for the brain to retain in healthy individuals, but also in people who have neurological conditions as well.

These visualizations are particularly useful because they make abstract numerical patterns visible and easy to digest and interpret. Overall, this project demonstrates how quantitative visualization techniques can be used to explore learning and recognition patterns in linguistic data in a clear and meaningful way.

These visualizations support the study’s conclusion that recognition based measurement provide a more informative assessment of novel word learning in individuals with aphasia. Although we are not provided more information on lesion location or type of aphasia, the overall data reflects a meaningful pattern in learning performance.

LS0tCnRpdGxlOiAiUmVjb2duaXRpb24gQWNjdXJhY3kgSGVhbHRoeSBJbmRpdmlkdWFscyB2cy4gUGVvcGxlIFdpdGggQXBoYXNpYSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKTGVhaCBLZWxseQoKIyMgWyoqSW50cm9kdWN0aW9uKipdey51bmRlcmxpbmV9CgpUaGlzIHByb2plY3QgZXhhbWluZXMgcmVjb2duaXRpb24gYWNjdXJhY3kgYWNyb3NzIHJlcGVhdGVkIGxlYXJuaW5nIGN5Y2xlcyBpbiB0d28gZ3JvdXBzOiBIZWFsdGh5IENvbnRyb2xzIChIQykgYW5kIFBlb3BsZSB3aXRoIEFwaGFzaWEgKFBXQSkuIExlYXJuaW5nIGFuZCByZWNvZ25pdGlvbiBwZXJmb3JtYW5jZSBhcmUgaW1wb3J0YW50IHRvcGljcyBpbiBwc3ljaG9saW5ndWlzdGljcyBiZWNhdXNlIHRoZXkgc2hvdyBob3cgbGFuZ3VhZ2UgcHJvY2Vzc2luZyBjaGFuZ2VzIG92ZXIgdGltZSBhbmQgaG93IG5ldXJvbG9naWNhbCBkaWZmZXJlbmNlcyBzaGFwZSBsZWFybmluZyBvdXRjb21lcy4gQnkgY29tcGFyaW5nIHBlcmZvcm1hbmNlIGFjcm9zcyBjeWNsZXMgYW5kIGdyb3VwcywgdGhpcyBhbmFseXNpcyBoaWdobGlnaHRzIGJvdGggZ3JvdXAgbGV2ZWwgcGF0dGVybnMgYW5kIGluZGl2aWR1YWwgdmFyaWFiaWxpdHkuCgpVc2luZyBxdWFudGl0YXRpdmUgbWV0aG9kcyBpbnRyb2R1Y2VkIGluIExOR04gMzIwL0FQTE4gNTM2LCB0aGlzIHByb2plY3QgcmVsaWVzIG9uIGRhdGEgdmlzdWFsaXphdGlvbiB0byBleHBsb3JlIHRyZW5kcywgdmFyaWF0aW9uLCBhbmQgZ3JvdXAgZGlmZmVyZW5jZXMuIFJhdGhlciB0aGFuIGZvY3VzaW5nIG9uIHJhdyBkYXRhIGFsb25lLCB0aGUgYW5hbHlzaXMgdXNlcyBzdW1tYXJ5IG1lYXN1cmVzIGFuZCBtdWx0aXBsZSB2aXN1YWxpemF0aW9uIHR5cGVzIHRvIG1ha2UgcGF0dGVybnMgaW4gbGVhcm5pbmcgYW5kIGFjY3VyYWN5IGVhc2llciB0byBpbnRlcnByZXQuCgojIyBbKipEYXRhc2V0IERlc2NyaXB0aW9uKipdey51bmRlcmxpbmV9CgpEYXRhIG9uIHJlY29nbml0aW9uIGFjY3VyYWN5IGlzIGdhdGhlcmVkIG92ZXIgc2V2ZXJhbCBsZWFybmluZyBjeWNsZXMgdG8gbWFrZSB1cCB0aGUgZGF0YXNldC4gVGhlIHJlc2VhcmNoZXJzIHdobyBjb25kdWN0ZWQgdGhpcyBzdHVkeSB0b29rIHR3byBncm91cHMgb2YgcGVvcGxlLCBIZWFsdGh5IENvbnRyb2wgYW5kIFBlcnNvbiB3aXRoIEFwaGFzaWEsIGFuZCBwcmVzZW50ZWQgdGhlbSB3aXRoIGEgc2V0IG9mIG1hZGUtdXAgd29yZHMuCgpUaGUgYW5hbHlzaXMgcmVwcmVzZW50cyBub3ZlbCB3b3JkIGxlYXJuaW5nIGFuZCBtZWFzdXJlZCBieSByZWNvZ25pdGlvbiBhY2N1cmFjeSBhY3Jvc3MgdGhlIHJlcGVhdGVkIGxlYXJuaW5nIGN5Y2xlcyBiZXR3ZWVuIHRoZSB0d28gZ3JvdXBzIChIQyBhbmQgUFdBKS4gUmVjb2duaXRpb24gYmFzZWQgbWVhc3VyZXMgaXMgbW9yZSB1c2VmdWwgdG8gbWVhc3VyZSBpbiBwZW9wbGUgd2l0aCBhcGhhc2lhIHNpbmNlIHRoZWlyIHNwZWVjaCBwcm9kdWN0aW9uIGlzIHR5cGljYWxseSBsaW1pdGVkIG9yIGhpbmRlcmVkLiBUaGlzIHdheSwgdGhlIHJlc2VhcmNoZXJzIGNhbiBleGFtaW5lIGxleGljYWwgbGVhcm5pbmcgd2hpbGUgbm90IGZvY3VzaW5nIHRvbyBtdWNoIG9uIHBob25vbG9naWNhbCBwcm9kdWN0aW9uLgoKR3JvdXAgYW5kIGN5Y2xlIHZhcmlhYmxlcyB3ZXJlIGNvbnZlcnRlZCB0byBmYWN0b3JzLCBhbmQgbWlzc2luZyBvciBpbnZhbGlkIHJlY29nbml0aW9uIHZhbHVlcyB3ZXJlIGV4Y2x1ZGVkIGZyb20gdmlzdWFsaXphdGlvbnMgd2hlcmUgbmVjZXNzYXJ5LiBObyB0cmFuc2Zvcm1hdGlvbnMgd2VyZSBhcHBsaWVkIGJleW9uZCB0aGVzZSBiYXNpYyBjbGVhbmluZyBzdGVwcywgYWxsb3dpbmcgdGhlIHBhdHRlcm5zIG9ic2VydmVkIGluIHRoZSBmaWd1cmVzIHRvIGNsb3NlbHkgcmVmbGVjdCB0aGUgb3JpZ2luYWwgZGF0YSBzdHJ1Y3R1cmUuCgojIyBbKipSZXNlYXJjaCBRdWVzdGlvbnMqKl17LnVuZGVybGluZX0KClRoaXMgYW5hbHlzaXMgYWRkcmVzc2VzIHRoZSBmb2xsb3dpbmcgcmVzZWFyY2ggcXVlc3Rpb25zOgoKMS4gIEhvdyBkb2VzIHJlY29nbml0aW9uIGFjY3VyYWN5IGNoYW5nZSBhY3Jvc3MgbGVhcm5pbmcgY3ljbGVzPwoKMi4gIERvIEhlYWx0aHkgQ29udHJvbHMgYW5kIFBlb3BsZSB3aXRoIEFwaGFzaWEgZGlmZmVyIGluIG92ZXJhbGwgcmVjb2duaXRpb24gYWNjdXJhY3k/CgozLiAgSG93IG11Y2ggdmFyaWFiaWxpdHkgZXhpc3RzIHdpdGhpbiBlYWNoIGdyb3VwIGFjcm9zcyBjeWNsZXM/CgpUaGVzZSBxdWVzdGlvbnMgYXJlIGRlc2lnbmVkIHRvIGJlIGFuc3dlcmVkIHZpc3VhbGx5IGFuZCBxdWFudGl0YXRpdmVseSB1c2luZyBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIGNvbXBhcmF0aXZlIHBsb3RzLgoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQoKIyBMb2FkIGRhdGEKZGF0YSA8LSByZWFkX2NzdigiL1VzZXJzL2xlYWhrZWxseS9Eb3dubG9hZHMvRGF0YVIgKDIpLmNzdiIpCgojIENsZWFuIGRhdGEKZGF0YV9jbGVhbiA8LSBkYXRhICU+JQogIG11dGF0ZSgKICAgIGdyb3VwID0gZmFjdG9yKGdyb3VwLCBsZXZlbHMgPSBjKCJIQyIsICJQV0EiKSksCiAgICBjeWNsZSA9IGZhY3RvcihjeWNsZSkKICApCgojIFN1bW1hcnkgc3RhdHMKcmVjX3N1bW1hcnkgPC0gZGF0YV9jbGVhbiAlPiUKICBncm91cF9ieShncm91cCwgY3ljbGUpICU+JQogIHN1bW1hcmlzZSgKICAgIG4gPSBzdW0oIWlzLm5hKHJlY29nbml0aW9uKSksCiAgICBtZWFuX3JlY29nbml0aW9uID0gbWVhbihyZWNvZ25pdGlvbiwgbmEucm0gPSBUUlVFKSwKICAgIHNkX3JlY29nbml0aW9uID0gc2QocmVjb2duaXRpb24sIG5hLnJtID0gVFJVRSksCiAgICBzZV9yZWNvZ25pdGlvbiA9IHNkX3JlY29nbml0aW9uIC8gc3FydChuKSwKICAgIC5ncm91cHMgPSAiZHJvcCIKICApCgojIFBsb3QKZ2dwbG90KHJlY19zdW1tYXJ5LCBhZXMoeCA9IGN5Y2xlLCB5ID0gbWVhbl9yZWNvZ25pdGlvbiwgZ3JvdXAgPSBncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSBncm91cCwgc2hhcGUgPSBncm91cCkpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IG1lYW5fcmVjb2duaXRpb24gLSBzZV9yZWNvZ25pdGlvbiwKICAgICAgICB5bWF4ID0gbWVhbl9yZWNvZ25pdGlvbiArIHNlX3JlY29nbml0aW9uKSwKICAgIHdpZHRoID0gMC4xCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLAogICAgbGltaXRzID0gYygwLCAxKQogICkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJSZWNvZ25pdGlvbiBBY2N1cmFjeSBBY3Jvc3MgTGVhcm5pbmcgQ3ljbGVzIiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmluZyBIZWFsdGh5IENvbnRyb2xzIChIQykgYW5kIFBlb3BsZSB3aXRoIEFwaGFzaWEgKFBXQSkiLAogICAgeCA9ICJDeWNsZSIsCiAgICB5ID0gIk1lYW4gcmVjb2duaXRpb24gYWNjdXJhY3kiLAogICAgbGluZXR5cGUgPSAiR3JvdXAiLAogICAgc2hhcGUgPSAiR3JvdXAiCiAgKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykKCmBgYAoKIyMgWyoqMi4xIFZpc3VhbGl6YXRpb24gVHlwZSAxOiBNZWFuIEFjY3VyYWN5IEFjcm9zcyBMZWFybmluZyBDeWNsZXMqKl17LnVuZGVybGluZX0KClRoZSBmaXJzdCB2aXN1YWxpemF0aW9uIGRlbW9uc3RyYXRlcyBtZWFuIHJlY29nbml0aW9uIGFjY3VyYWN5IGFjcm9zcyBsZWFybmluZyBjeWNsZXMgZm9yIGJvdGggZ3JvdXBzLCBhbG9uZyB3aXRoIG1lYXN1cmVzIG9mIHZhcmlhYmlsaXR5LiBUaGlzIHR5cGUgb2YgcGxvdCBpcyB3ZWxsIHN1aXRlZCBmb3IgaWRlbnRpZnlpbmcgb3ZlcmFsbCB0cmVuZHMgYW5kIGNvbXBhcmluZyBncm91cCBwZXJmb3JtYW5jZSBvdmVyIHRpbWUuCgpGaWd1cmUgMSBzaG93cyB0aGF0IHJlY29nbml0aW9uIGFjY3VyYWN5IGluY3JlYXNlcyBhY3Jvc3MgY3ljbGVzIGZvciBib3RoIGdyb3Vwcywgc2hvd2luZyBpbmNyZWFzZWQgbGVhcm5pbmcgb3ZlciB0aW1lLiBIZWFsdGh5IENvbnRyb2xzIGNvbnNpc3RlbnRseSBkZW1vbnN0cmF0ZSBoaWdoZXIgbWVhbiBhY2N1cmFjeSB0aGFuIFBlb3BsZSB3aXRoIEFwaGFzaWEgYXQgZWFjaCBjeWNsZS4gSG93ZXZlciwgdGhlIHVwd2FyZCB0cmVuZCBmb3IgYm90aCBncm91cHMgc3VnZ2VzdHMgdGhhdCByZXBlYXRlZCBleHBvc3VyZSBzdXBwb3J0cyBpbXByb3ZlbWVudCByZWdhcmRsZXNzIG9mIGdyb3VwLiBFcnJvciBiYXJzIGFyZSB0aGVyZSBmb3IgdmFyaWFiaWxpdHkgYXJvdW5kIHRoZSBtZWFuIGFuZCBzaG93IHRoYXQgd2hpbGUgdGhlIGdyb3VwcyBkaWZmZXIsIHRoZWlyIHBlcmZvcm1hbmNlIHJhbmdlcyBwYXJ0aWFsbHkgb3ZlcmxhcC4KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiMgTG9hZCBkYXRhCmRhdGEgPC0gcmVhZF9jc3YoIi9Vc2Vycy9sZWFoa2VsbHkvRG93bmxvYWRzL0RhdGFSICgyKS5jc3YiKQoKIyBDbGVhbiArIG9wdGlvbmFsIGZpbHRlciB0byBhdm9pZCBtaXNzaW5nL291dC1vZi1yYW5nZSB3YXJuaW5ncwpkYXRhX2NsZWFuIDwtIGRhdGEgJT4lCiAgbXV0YXRlKAogICAgZ3JvdXAgPSBmYWN0b3IoZ3JvdXAsIGxldmVscyA9IGMoIkhDIiwgIlBXQSIpKSwKICAgIGN5Y2xlID0gZmFjdG9yKGN5Y2xlKQogICkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZWNvZ25pdGlvbiksIHJlY29nbml0aW9uID49IDAsIHJlY29nbml0aW9uIDw9IDEpCgojIFN1bW1hcnkgc3RhdHMgKG1lYW4gwrEgU0UpCnJlY19zdW1tYXJ5IDwtIGRhdGFfY2xlYW4gJT4lCiAgZ3JvdXBfYnkoZ3JvdXAsIGN5Y2xlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBuID0gbigpLAogICAgbWVhbl9yZWNvZ25pdGlvbiA9IG1lYW4ocmVjb2duaXRpb24pLAogICAgc2RfcmVjb2duaXRpb24gPSBzZChyZWNvZ25pdGlvbiksCiAgICBzZV9yZWNvZ25pdGlvbiA9IHNkX3JlY29nbml0aW9uIC8gc3FydChuKSwKICAgIC5ncm91cHMgPSAiZHJvcCIKICApICU+JQogIG11dGF0ZSgKICAgIHltaW4gPSBwbWF4KDAsIG1lYW5fcmVjb2duaXRpb24gLSBzZV9yZWNvZ25pdGlvbiksCiAgICB5bWF4ID0gcG1pbigxLCBtZWFuX3JlY29nbml0aW9uICsgc2VfcmVjb2duaXRpb24pCiAgKQoKIyBQbG90CmdncGxvdChyZWNfc3VtbWFyeSwgYWVzKHggPSBjeWNsZSwgeSA9IG1lYW5fcmVjb2duaXRpb24sIGdyb3VwID0gZ3JvdXApKSArCiAgZ2VvbV9yaWJib24oCiAgICBhZXMoeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gZ3JvdXApLAogICAgYWxwaGEgPSAwLjE4LAogICAgY29sb3IgPSBOQQogICkgKwogIGdlb21faml0dGVyKAogICAgZGF0YSA9IGRhdGFfY2xlYW4sCiAgICBhZXMoeCA9IGN5Y2xlLCB5ID0gcmVjb2duaXRpb24sIGNvbG9yID0gZ3JvdXApLAogICAgd2lkdGggPSAwLjEyLAogICAgYWxwaGEgPSAwLjM1LAogICAgc2l6ZSA9IDIsCiAgICBpbmhlcml0LmFlcyA9IEZBTFNFCiAgKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGdyb3VwKSwgbGluZXdpZHRoID0gMS4yKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBncm91cCksIHNpemUgPSAzKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLAogICAgbGltaXRzID0gYygwLCAxKQogICkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJSZWNvZ25pdGlvbiBBY2N1cmFjeSBBY3Jvc3MgTGVhcm5pbmcgQ3ljbGVzIChSYXcgKyBNZWFuKSIsCiAgICBzdWJ0aXRsZSA9ICJEb3RzID0gaW5kaXZpZHVhbCBzY29yZXMuIExpbmUgPSBncm91cCBtZWFuLiBCYW5kID0gbWVhbiDCsSAxIFNFLiIsCiAgICB4ID0gIkN5Y2xlIiwKICAgIHkgPSAiUmVjb2duaXRpb24gYWNjdXJhY3kiLAogICAgY29sb3IgPSAiR3JvdXAiLAogICAgZmlsbCA9ICJHcm91cCIKICApICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArCiAgdGhlbWUoCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiCiAgKQoKYGBgCgojIyBbMi4yIFZpc3VhbGl6YXRpb24gVHlwZSAyOiBEaXN0cmlidXRpb24gb2YgQWNjdXJhY3kgU2NvcmVzXXsudW5kZXJsaW5lfQoKVG8gY29tcGxlbWVudCB0aGUgbWVhbi1iYXNlZCBhbmFseXNpcywgdGhlIHNlY29uZCB2aXN1YWxpemF0aW9uIGZvY3VzZXMgb24gdGhlIGRpc3RyaWJ1dGlvbiBvZiByZWNvZ25pdGlvbiBhY2N1cmFjeSBzY29yZXMgdXNpbmcgdmlvbGluIGFuZCBib3hwbG90IGVsZW1lbnRzLiBUaGlzIHZpc3VhbGl6YXRpb24gaGlnaGxpZ2h0cyB0aGUgc3ByZWFkLCBhbmQgc2hhcGUgb2YgdGhlIGRhdGEgd2l0aGluIGVhY2ggY3ljbGUgYW5kIGdyb3VwLgoKRmlndXJlIDIgcmV2ZWFscyBzdWJzdGFudGlhbCB2YXJpYWJpbGl0eSB3aXRoaW4gYm90aCBncm91cHMsIG1haW5seSBpbiBlYXJsaWVyIGN5Y2xlcy4gVGhlIGRpc3RyaWJ1dGlvbiBmb3IgUGVvcGxlIHdpdGggQXBoYXNpYSBpcyB3aWRlciwgc3VnZ2VzdGluZyBncmVhdGVyIGluZGl2aWR1YWwgZGlmZmVyZW5jZXMgaW4gcGVyZm9ybWFuY2UuIEhlYWx0aHkgQ29udHJvbHMgc2hvdyBtb3JlIGNsdXN0ZXJlZCBzY29yZXMsIGVzcGVjaWFsbHkgaW4gbGF0ZXIgY3ljbGVzLCBzdWdnZXN0aW5nIG1vcmUgY29uc2lzdGVudCByZWNvZ25pdGlvbiBhY2N1cmFjeS4gVGhpcyB2aXN1YWxpemF0aW9uIGRlbW9uc3RyYXRlcyB3aHkgcmVseWluZyBzb2xlbHkgb24gbWVhbnMgY2FuIGJlIG1pc2xlYWRpbmcsIHJlY29nbml6aW5nIGluZGl2aWR1YWwgc2NvcmVzIGluIHRoZSBkYXRhIGlzIGltcG9ydGFudCB0byB0aGUgYmlnZ2VyIHBpY3R1cmUuCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCgojIExvYWQgZGF0YQpkYXRhIDwtIHJlYWRfY3N2KCIvVXNlcnMvbGVhaGtlbGx5L0Rvd25sb2Fkcy9EYXRhUiAoMikuY3N2IikKCiMgQ2xlYW4gZGF0YQpkYXRhX2NsZWFuIDwtIGRhdGEgJT4lCiAgbXV0YXRlKAogICAgZ3JvdXAgPSBmYWN0b3IoZ3JvdXAsIGxldmVscyA9IGMoIkhDIiwgIlBXQSIpKSwKICAgIGN5Y2xlID0gZmFjdG9yKGN5Y2xlKQogICkKCiMgQ3JlYXRlIENvcnJlY3QgdnMgTm90IENvcnJlY3QgKGFzc3VtZXMgcmVjb2duaXRpb24gaXMgMC8xKQpkYXRhX2JpbmFyeSA8LSBkYXRhX2NsZWFuICU+JQogIGZpbHRlcighaXMubmEocmVjb2duaXRpb24pKSAlPiUKICBtdXRhdGUob3V0Y29tZSA9IGlmX2Vsc2UocmVjb2duaXRpb24gPT0gMSwgIkNvcnJlY3QiLCAiTm90IENvcnJlY3QiKSkKCiMgUHJvcG9ydGlvbnMgcGVyIGdyb3VwL2N5Y2xlCnByb3BfZGF0YSA8LSBkYXRhX2JpbmFyeSAlPiUKICBjb3VudChncm91cCwgY3ljbGUsIG91dGNvbWUpICU+JQogIGdyb3VwX2J5KGdyb3VwLCBjeWNsZSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuIC8gc3VtKG4pKSAlPiUKICB1bmdyb3VwKCkKCiMgUGxvdApnZ3Bsb3QocHJvcF9kYXRhLCBhZXMoeCA9IGN5Y2xlLCB5ID0gcHJvcCwgZmlsbCA9IG91dGNvbWUpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjc1KSArCiAgZmFjZXRfd3JhcCh+IGdyb3VwKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiQ29ycmVjdCB2cyBOb3QgQ29ycmVjdCBSZXNwb25zZXMgQWNyb3NzIExlYXJuaW5nIEN5Y2xlcyIsCiAgICBzdWJ0aXRsZSA9ICJFYWNoIGJhciB0b3RhbHMgMTAwJSB3aXRoaW4gZWFjaCBncm91cCBhbmQgY3ljbGUiLAogICAgeCA9ICJDeWNsZSIsCiAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgcmVzcG9uc2VzIiwKICAgIGZpbGwgPSAiIgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIKICApCgpgYGAKCiMjIFsqKjIuMyBWaXN1YWxpemF0aW9uIFR5cGUgMzogQ29ycmVjdCB2cy4gTm90IENvcnJlY3QgUmVzcG9uc2VzKipdey51bmRlcmxpbmV9CgpUaGUgdGhpcmQgdmlzdWFsaXphdGlvbiBkaXNwbGF5cyB0aGUgcHJvcG9ydGlvbiBvZiBjb3JyZWN0IHZlcnN1cyBub3QgY29ycmVjdCByZXNwb25zZXMgYWNyb3NzIGxlYXJuaW5nIGN5Y2xlcyB1c2luZyBhIHN0YWNrZWQgYmFyIGNoYXJ0LiBUaGlzIGZvcm1hdCBlbXBoYXNpemVzIHJlbGF0aXZlIHByb3BvcnRpb25zIGFuZCBtYWtlcyBncm91cCBjb21wYXJpc29ucyBpbnR1aXRpdmUuCgpGaWd1cmUgMyBzaG93cyBhbiBpbmNyZWFzaW5nIHByb3BvcnRpb24gb2YgY29ycmVjdCByZXNwb25zZXMgYWNyb3NzIGN5Y2xlcyBmb3IgYm90aCBncm91cHMuIEhlYWx0aHkgQ29udHJvbHMgcmVhY2ggYSBoaWdoZXIgcHJvcG9ydGlvbiBvZiBjb3JyZWN0IHJlc3BvbnNlcyBlYXJsaWVyLCB3aGlsZSBQZW9wbGUgd2l0aCBBcGhhc2lhIHNob3cgbW9yZSBncmFkdWFsIGltcHJvdmVtZW50LiBCZWNhdXNlIGVhY2ggYmFyIHN1bXMgdG8gMTAwJSwgdGhpcyB2aXN1YWxpemF0aW9uIG1ha2VzIGl0IGVhc3kgdG8gY29tcGFyZSBhY2N1cmFjeSBwYXR0ZXJucyBhY3Jvc3MgY3ljbGVzIHdpdGhvdXQgYmVpbmcgaW5mbHVlbmNlZCBieSBkaWZmZXJlbmNlcyBpbiByYXcgY291bnRzLgoKIyMgWyoqQ29uY2x1c2lvbiBhbmQgRGlzY3Vzc2lvbioqXXsudW5kZXJsaW5lfQoKQWNyb3NzIGFsbCB2aXN1YWxpemF0aW9ucywgYSBjb25zaXN0ZW50IHBhdHRlcm4gZW1lcmdlczogcmVjb2duaXRpb24gYWNjdXJhY3kgaW1wcm92ZXMgYWNyb3NzIGxlYXJuaW5nIGN5Y2xlcyBmb3IgYm90aCBncm91cHMsIGJ1dCBIZWFsdGh5IENvbnRyb2xzIG91dHBlcmZvcm0gUGVvcGxlIHdpdGggQXBoYXNpYSBhdCBlYWNoIHN0YWdlLiBUaGUgY29tYmluYXRpb24gb2YgdmlzdWFsaXphdGlvbnMgcmV2ZWFscyBjb21wbGVtZW50YXJ5IGluc2lnaHRzLiBNZWFuIGJhc2VkIHBsb3RzIGhpZ2hsaWdodCBvdmVyYWxsIHRyZW5kcywgZGlzdHJpYnV0aW9uYWwgcGxvdHMgZXhwb3NlIGluZGl2aWR1YWwgdmFyaWFiaWxpdHksIGFuZCBwcm9wb3J0aW9uYWwgY2hhcnRzIGNsYXJpZnkgZ3JvdXAgZGlmZmVyZW5jZXMgaW4gY29ycmVjdG5lc3MuCgpUaGlzIGRhdGEgYm9sc3RlcnMgdGhlIGZhY3QgdGhhdCB3aXRoIHJlcGVhdGVkIGV4cG9zdXJlIHRvIGEgd29yZCwgaXQgYmVjb21lcyBlYXNpZXIgZm9yIHRoZSBicmFpbiB0byByZXRhaW4gaW4gaGVhbHRoeSBpbmRpdmlkdWFscywgYnV0IGFsc28gaW4gcGVvcGxlIHdobyBoYXZlIG5ldXJvbG9naWNhbCBjb25kaXRpb25zIGFzIHdlbGwuCgpUaGVzZSB2aXN1YWxpemF0aW9ucyBhcmUgcGFydGljdWxhcmx5IHVzZWZ1bCBiZWNhdXNlIHRoZXkgbWFrZSBhYnN0cmFjdCBudW1lcmljYWwgcGF0dGVybnMgdmlzaWJsZSBhbmQgZWFzeSB0byBkaWdlc3QgYW5kIGludGVycHJldC4gT3ZlcmFsbCwgdGhpcyBwcm9qZWN0IGRlbW9uc3RyYXRlcyBob3cgcXVhbnRpdGF0aXZlIHZpc3VhbGl6YXRpb24gdGVjaG5pcXVlcyBjYW4gYmUgdXNlZCB0byBleHBsb3JlIGxlYXJuaW5nIGFuZCByZWNvZ25pdGlvbiBwYXR0ZXJucyBpbiBsaW5ndWlzdGljIGRhdGEgaW4gYSBjbGVhciBhbmQgbWVhbmluZ2Z1bCB3YXkuCgpUaGVzZSB2aXN1YWxpemF0aW9ucyBzdXBwb3J0IHRoZSBzdHVkeSdzIGNvbmNsdXNpb24gdGhhdCByZWNvZ25pdGlvbiBiYXNlZCBtZWFzdXJlbWVudCBwcm92aWRlIGEgbW9yZSBpbmZvcm1hdGl2ZSBhc3Nlc3NtZW50IG9mIG5vdmVsIHdvcmQgbGVhcm5pbmcgaW4gaW5kaXZpZHVhbHMgd2l0aCBhcGhhc2lhLiBBbHRob3VnaCB3ZSBhcmUgbm90IHByb3ZpZGVkIG1vcmUgaW5mb3JtYXRpb24gb24gbGVzaW9uIGxvY2F0aW9uIG9yIHR5cGUgb2YgYXBoYXNpYSwgdGhlIG92ZXJhbGwgZGF0YSByZWZsZWN0cyBhIG1lYW5pbmdmdWwgcGF0dGVybiBpbiBsZWFybmluZyBwZXJmb3JtYW5jZS4KCiMjIyMjIyBOYXZhcnJldGUtT3JlanVkbywgTC4sIFhpbSBDZXJkYS1Db21wYW55LCBHdWlsbGVtIE9saXbDqSwgTWFydGluLCBOLiwgTGFpbmUsIE0uLCBBbnRvbmkgUm9kcsOtZ3Vlei1Gb3JuZWxscywgJiBQZcOxYWxvemEsIEMuICgyMDIzKS4gRXhwcmVzc2l2ZSByZWNhbGwgYW5kIHJlY29nbml0aW9uIGFzIGNvbXBsZW1lbnRhcnkgbWVhc3VyZXMgdG8gYXNzZXNzIG5vdmVsIHdvcmQgbGVhcm5pbmcgYWJpbGl0eSBpbiBhcGhhc2lhLiAqQnJhaW4gYW5kIExhbmd1YWdlKiwgKjI0MyosIDEwNTMwM+KAkzEwNTMwMy4gPGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2ouYmFuZGwuMjAyMy4xMDUzMDM+IAo=