Introduction

This analysis compares subsistence data from William Ayers’ 1985 study “Easter Island Subsistence” with recent analyses of faunal remains from Anakena excavations. Ayers’ study presents data from three sites:

  1. Site 12-1 (Runga Va’e): South coast, rocky coastline, shallow inshore depths
  2. Site 34-2 (Papa te Kena): North coast, rocky coastline, deep inshore waters
  3. Site 35-7 (Anakena): North coast, sand bottom and rocky coast, shallow inshore depths

The key questions are: - Do Ayers’ data support his claims about resource depletion and subsistence change? - How do patterns in Ayers’ data compare with the comprehensive Anakena analysis? - What do both datasets tell us about Easter Island subsistence strategies?

library(tidyverse)
library(ggplot2)
library(reshape2)
library(gridExtra)
library(vegan)
library(knitr)
library(kableExtra)

Data Extraction from Ayers (1985)

Table 3: Midden Analysis

# Ayers Table 3 - Midden Analysis
ayers_midden <- data.frame(
  Site = rep(c("12-1", "34-2", "35-7"), each = 14),
  Component = rep(c("Cypraea", "Nerita", "Chiton", "Other_Shell", "Total_Shell",
                    "Fish", "Chicken", "Bird", "Rat", "Sheep", "Human", 
                    "Porpoise", "Other_Bone", "Total_Bone"), 3),
  Weight_g = c(
    # Site 12-1
    1119, 1671, 1035, 435, 4260, 111, 124, 14, 220, 109, 578, NA, NA, 578,
    # Site 34-2  
    1917, 3386, 1644, 524, 7471, 734, 296, 40, 1164, NA, 105, 12, NA, 2356,
    # Site 35-7
    1475, 983, 510, 347, 3315, 356, 316, 30, 400, NA, 108, 23, NA, 1233
  ),
  CI = c(
    # Site 12-1 (g/m³)
    379, 566, 351, 147, 1444, 38, 42, 5, 74, 37, 196, NA, NA, 196,
    # Site 34-2 (g/m³)
    451, 797, 387, 123, 1758, 173, 70, 9, 274, NA, 25, 3, NA, 554,
    # Site 35-7 (g/m³)
    364, 243, 126, 86, 818, 88, 78, 7, 99, NA, 27, 6, NA, 304
  ),
  Percent = c(
    # Site 12-1
    26, 39, 24, 10, 88, 19, 21, 2, 38, 19, NA, NA, NA, 12,
    # Site 34-2
    26, 45, 22, 7, 76, 31, 12, 2, 49, NA, 4, 1, NA, 24,
    # Site 35-7
    44, 30, 15, 11, 73, 29, 26, 2, 32, NA, 9, 2, NA, 27
  ),
  Volume_m3 = rep(c(2.95, 4.25, 4.05), each = 14)
)

# Calculate key metrics
midden_summary <- ayers_midden %>%
  filter(Component %in% c("Total_Shell", "Fish", "Chicken", "Total_Bone")) %>%
  select(Site, Component, Weight_g, CI, Percent) %>%
  pivot_wider(names_from = Component, values_from = c(Weight_g, CI, Percent))

kable(midden_summary, caption = "Summary of Ayers' Midden Analysis") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Summary of Ayers' Midden Analysis
Site Weight_g_Total_Shell Weight_g_Fish Weight_g_Chicken Weight_g_Total_Bone CI_Total_Shell CI_Fish CI_Chicken CI_Total_Bone Percent_Total_Shell Percent_Fish Percent_Chicken Percent_Total_Bone
12-1 4260 111 124 578 1444 38 42 196 88 19 21 12
34-2 7471 734 296 2356 1758 173 70 554 76 31 12 24
35-7 3315 356 316 1233 818 88 78 304 73 29 26 27

Table 4: Fish Remains by Site and Layer

# Extract fish family data from Ayers Table 4
# Site 12-1 stratigraphic data
site_12_1_fish <- data.frame(
  Layer = c("I", "II", "III", "IVa", "IVb"),
  Labridae = c(66, 0, 30.3, 26, 21.4),
  Serranidae = c(16.6, 0, 6.0, 4.3, 7.1),
  Muraenidae_Congridae_Brotulidae = c(16.6, 0, 30.3, 21.8, 28.6),
  Other = c(0.8, 0, 33.4, 47.9, 42.9),
  Total_CI = c(5.4, 0, 60, 58, 28),
  Min_Fish = c(6, 0, 33, 23, 14)
)

# Site totals for comparison
site_totals_fish <- data.frame(
  Site = c("12-1", "34-2", "35-7"),
  Labridae = c(30.3, 32.2, 20.6),
  Serranidae = c(6.5, 9.1, 12.9),
  Congridae = c(26.3, 26.2, 23.2),
  Muraenidae = c(9.2, 3.4, 2.6),
  Total_Min_Fish = c(76, 626, 194)
)

kable(site_totals_fish, caption = "Fish Family Percentages by Site (Ayers 1985)") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Fish Family Percentages by Site (Ayers 1985)
Site Labridae Serranidae Congridae Muraenidae Total_Min_Fish
12-1 30.3 6.5 26.3 9.2 76
34-2 32.2 9.1 26.2 3.4 626
35-7 20.6 12.9 23.2 2.6 194

Analysis of Ayers’ Claims

Claim 1: Regional Variation in Marine Food Exploitation

Ayers hypothesizes that fish are more abundant on the north/northwest coasts compared to the south coast.

# Extract marine percentages
marine_data <- ayers_midden %>%
  filter(Component %in% c("Fish", "Total_Shell", "Total_Bone")) %>%
  select(Site, Component, Percent, CI) %>%
  pivot_wider(names_from = Component, values_from = c(Percent, CI))

marine_data$Fish_of_Bone <- c(19, 31, 29)  # Fish as % of bone
marine_data$Marine_Total <- marine_data$Percent_Total_Shell + 
                           (marine_data$Percent_Total_Bone * marine_data$Fish_of_Bone / 100)

# Create visualization
p1 <- ggplot(marine_data, aes(x = Site, y = CI_Fish)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(title = "Fish Bone Concentration by Site",
       subtitle = "Higher concentrations at north coast sites",
       x = "Site", y = "Fish Concentration (g/m³)") +
  geom_text(aes(label = CI_Fish), vjust = -0.5) +
  theme_minimal()

p2 <- ggplot(marine_data, aes(x = Site, y = Fish_of_Bone)) +
  geom_bar(stat = "identity", fill = "coral") +
  labs(title = "Fish as Percentage of Total Bone",
       subtitle = "North coast sites show higher fish percentages",
       x = "Site", y = "Fish % of Bone") +
  geom_text(aes(label = Fish_of_Bone), vjust = -0.5) +
  theme_minimal()

grid.arrange(p1, p2, ncol = 2)


# Statistical comparison
fish_stats <- data.frame(
  Site = c("12-1", "34-2", "35-7"),
  Coast = c("South", "North", "North"),
  Fish_CI = c(38, 173, 88),
  Fish_Percent = c(19, 31, 29)
)

# Calculate means by coast
coast_means <- fish_stats %>%
  group_by(Coast) %>%
  summarise(
    Mean_Fish_CI = mean(Fish_CI),
    Mean_Fish_Percent = mean(Fish_Percent),
    n = n()
  )

kable(coast_means, caption = "Fish Resources by Coast") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Fish Resources by Coast
Coast Mean_Fish_CI Mean_Fish_Percent n
North 130.5 30 2
South 38.0 19 1

# Note: With only 3 sites, formal statistical testing is limited
# but the pattern is clear: North coast sites have 3.4x higher fish concentration

Finding: Ayers’ data DOES support regional variation. North coast sites (34-2 and 35-7) have substantially higher fish concentrations (173 and 88 g/m³) compared to the south coast site 12-1 (38 g/m³).

Claim 2: Temporal Changes in Subsistence

Ayers suggests changes in marine food utilization through time, particularly at site 12-1.

# Analyze Site 12-1 temporal data
site_12_1_temporal <- data.frame(
  Layer = c("I", "II", "III", "IVa", "IVb"),
  Period = c("Post-1850", "1850", "1750", "1600-1650", "Pre-1469-1600"),
  Fish_CI = c(5, 0, 82, 90, 32),
  Chicken_CI = c(3, 3, 73, 145, 44),
  Labridae_Percent = c(66, 0, 30.3, 26, 21.4)
)

# Convert to long format for plotting
temporal_long <- site_12_1_temporal %>%
  select(Layer, Fish_CI, Chicken_CI) %>%
  pivot_longer(cols = -Layer, names_to = "Resource", values_to = "CI")

p3 <- ggplot(temporal_long, aes(x = Layer, y = CI, color = Resource, group = Resource)) +
  geom_line(size = 2) +
  geom_point(size = 4) +
  scale_x_discrete(limits = rev(c("I", "II", "III", "IVa", "IVb"))) +
  labs(title = "Temporal Changes in Fish vs Chicken at Site 12-1",
       subtitle = "Major shift after Layer IVa (ca. 1650 AD)",
       x = "Layer (oldest to youngest →)", y = "Concentration Index (g/m³)") +
  theme_minimal() +
  theme(legend.position = "bottom")

p4 <- ggplot(site_12_1_temporal, aes(x = Layer, y = Labridae_Percent)) +
  geom_bar(stat = "identity", fill = "darkgreen") +
  scale_x_discrete(limits = rev(c("I", "II", "III", "IVa", "IVb"))) +
  labs(title = "Changes in Labridae (Wrasse) Dominance",
       subtitle = "Increasing specialization in recent layers",
       x = "Layer (oldest to youngest →)", y = "Labridae % of Fish") +
  theme_minimal()

grid.arrange(p3, p4, ncol = 1)

Finding: Ayers’ data shows dramatic temporal changes: - Chicken consumption peaks in Layer IVa (145 g/m³) then crashes to nearly zero - Fish remains relatively stable until historic layers - Labridae (wrasse) increases from 21% to 66%, suggesting increased inshore fishing

Comparison with Anakena Multi-Excavation Analysis

The recent Anakena analysis argues that apparent changes in faunal composition reflect depositional rates, not genuine subsistence shifts. Let’s compare:

# Key findings from Anakena analysis
anakena_findings <- data.frame(
  Aspect = c("Marine dominance", "Temporal pattern", "Shellfish role", 
             "Interpretation", "Sample size effects"),
  Anakena_Analysis = c(
    "50-99% marine resources across all excavations",
    "No directional trend; variation reflects deposition",
    "Primary resource (3000+ individuals/layer), not fallback",
    "Site formation processes, not cultural change",
    "Diversity correlates with sample size"
  ),
  Ayers_1985 = c(
    "73-88% shell + variable fish (2-31% of bone)",
    "Clear temporal shifts in chicken and fish",
    "Important but decreasing through time",
    "Subsistence changes reflect population stress",
    "Not explicitly considered"
  )
)

kable(anakena_findings, caption = "Contrasting Interpretations") %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1, bold = TRUE)
Contrasting Interpretations
Aspect Anakena_Analysis Ayers_1985
Marine dominance 50-99% marine resources across all excavations 73-88% shell + variable fish (2-31% of bone)
Temporal pattern No directional trend; variation reflects deposition Clear temporal shifts in chicken and fish
Shellfish role Primary resource (3000+ individuals/layer), not fallback Important but decreasing through time
Interpretation Site formation processes, not cultural change Subsistence changes reflect population stress
Sample size effects Diversity correlates with sample size Not explicitly considered

Re-analyzing Ayers’ Data Through a Depositional Lens

# Calculate coefficient of variation for Ayers' sites
ayers_cv <- ayers_midden %>%
  filter(Component %in% c("Fish", "Chicken", "Rat")) %>%
  group_by(Site) %>%
  summarise(
    Mean_CI = mean(CI, na.rm = TRUE),
    SD_CI = sd(CI, na.rm = TRUE),
    CV = (SD_CI / Mean_CI) * 100
  )

# Compare with volume-adjusted metrics
volume_comparison <- data.frame(
  Site = c("12-1", "34-2", "35-7"),
  Volume_m3 = c(2.95, 4.25, 4.05),
  Total_Bone_g = c(578, 2356, 1233),
  Bone_per_m3 = c(196, 554, 304),
  Fish_percent = c(19, 31, 29)
)

p5 <- ggplot(volume_comparison, aes(x = Volume_m3, y = Bone_per_m3)) +
  geom_point(size = 5, color = "darkblue") +
  geom_text(aes(label = Site), vjust = -1) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  labs(title = "Bone Density vs. Excavation Volume",
       subtitle = "No clear relationship between volume and density",
       x = "Excavation Volume (m³)", y = "Bone Density (g/m³)") +
  theme_minimal()

# Test if fish percentage correlates with bone density
cor.test(volume_comparison$Bone_per_m3, volume_comparison$Fish_percent)

    Pearson's product-moment correlation

data:  volume_comparison$Bone_per_m3 and volume_comparison$Fish_percent
t = 1.4853, df = 1, p-value = 0.3772
alternative hypothesis: true correlation is not equal to 0
sample estimates:
      cor 
0.8295221 

Synthesis: Variable Deposition vs. Cultural Change

# Create a comprehensive comparison plot
# Combine temporal data with spatial data
comprehensive_data <- data.frame(
  Context = c("12-1 Layer I", "12-1 Layer III", "12-1 Layer IVa", "12-1 Layer IVb",
              "34-2 Total", "35-7 Total"),
  Fish_CI = c(5, 82, 90, 32, 173, 88),
  Period = c("Historic", "Late Prehistoric", "1600-1650", "Pre-1600",
             "Mixed", "Mixed"),
  Coast = c(rep("South", 4), rep("North", 2))
)

p6 <- ggplot(comprehensive_data, aes(x = Context, y = Fish_CI, fill = Coast)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(title = "Fish Concentrations Across All Contexts",
       subtitle = "High variability both temporally and spatially",
       y = "Fish Concentration (g/m³)")

# Calculate depositional variability metrics
deposition_metrics <- data.frame(
  Dataset = c("Ayers South Coast", "Ayers North Coast", "Anakena (reported)"),
  CV_Range = c("100%+", "~50%", "7-120%"),
  Interpretation = c("High variability", "Moderate variability", "Depositional effects")
)

kable(deposition_metrics, caption = "Depositional Variability Comparison") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Depositional Variability Comparison
Dataset CV_Range Interpretation
Ayers South Coast 100%+ High variability
Ayers North Coast ~50% Moderate variability
Anakena (reported) 7-120% Depositional effects

Key Findings

1. Regional Patterns (Ayers’ Claim SUPPORTED)

  • Clear north-south differences in fish exploitation
  • North coast sites have 2-4x higher fish concentrations
  • Pattern consistent with ecological expectations

2. Temporal Changes (Ayers’ Claim PARTIALLY SUPPORTED)

  • Dramatic changes in faunal assemblages are evident
  • However, these may reflect:
    • Variable deposition rates (as Anakena analysis suggests)
    • Site use changes rather than island-wide subsistence shifts
    • Small sample effects in some layers (Layer II has 0 fish)

3. Comparison with Anakena Multi-Decadal Analysis

  • Both datasets show high marine resource use (>70%)
  • Both show high variability between contexts
  • Key difference: Interpretation of variability
    • Ayers: Cultural/subsistence change
    • Anakena: Depositional processes

4. Methodological Considerations

methods_compare <- data.frame(
  Aspect = c("Temporal control", "Sample size", "Quantification", 
             "Site types", "Interpretation framework"),
  Ayers_1985 = c("5 layers at 12-1 only", "Small (n=76-626 fish)", 
                 "Weight, CI, percentages", "Rock shelters", 
                 "Culture historical"),
  Anakena_Analysis = c("Multiple excavations over 19 years", 
                      "Large (thousands of specimens)", 
                      "NISP, MNI, weight", "Multiple site types", 
                      "Site formation processes")
)

kable(methods_compare, caption = "Methodological Comparison") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Methodological Comparison
Aspect Ayers_1985 Anakena_Analysis
Temporal control 5 layers at 12-1 only Multiple excavations over 19 years
Sample size Small (n=76-626 fish) Large (thousands of specimens)
Quantification Weight, CI, percentages NISP, MNI, weight
Site types Rock shelters Multiple site types
Interpretation framework Culture historical Site formation processes

Conclusions

  1. Ayers’ data quality: The data are valuable but limited by:
    • Small sample sizes in some contexts
    • Single-site temporal sequence
    • Lack of consideration for depositional processes
  2. Regional variation: Strongly supported by both datasets
    • Real ecological differences between coasts
    • Consistent with ethnographic accounts
  3. Temporal patterns: More complex than either study alone suggests
    • Ayers shows dramatic changes at one site
    • Anakena analysis shows no island-wide directional trends
    • Likely explanation: Local site use changes + depositional variability
  4. Synthesis: Both studies contribute important pieces:
    • Ayers provides early quantified data and regional comparison
    • Anakena analysis provides methodological sophistication and larger samples
    • Together they suggest: Persistent marine adaptation with local variability

Recommendations

  1. Re-analyze Ayers’ specimens with modern methods (MNI, size reconstruction)
  2. Apply depositional analysis to all Easter Island faunal assemblages
  3. Integrate spatial and temporal patterns across all available data
  4. Consider site formation processes as primary explanation for variability

References

Ayres, W.S. (1985). Easter Island Subsistence. Journal de la Société des Océanistes, 41(80), 103-124.

Hunt, T.L. and Lipo, C.P. (2006). Late colonization of Easter Island. Science 311: 1603-1606.

[Additional Anakena excavation references as cited in the original analysis]

LS0tCnRpdGxlOiAiQ29tcGFyYXRpdmUgQW5hbHlzaXMgb2YgRWFzdGVyIElzbGFuZCBTdWJzaXN0ZW5jZTogQXllcnMgKDE5ODUpIHZzLiBBbmFrZW5hIEV4Y2F2YXRpb25zIgphdXRob3I6ICJBcmNoYWVvbG9naWNhbCBBbmFseXNpcyIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHRhbmdvCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOCkKYGBgCgojIEludHJvZHVjdGlvbgoKVGhpcyBhbmFseXNpcyBjb21wYXJlcyBzdWJzaXN0ZW5jZSBkYXRhIGZyb20gV2lsbGlhbSBBeWVycycgMTk4NSBzdHVkeSAiRWFzdGVyIElzbGFuZCBTdWJzaXN0ZW5jZSIgd2l0aCByZWNlbnQgYW5hbHlzZXMgb2YgZmF1bmFsIHJlbWFpbnMgZnJvbSBBbmFrZW5hIGV4Y2F2YXRpb25zLiBBeWVycycgc3R1ZHkgcHJlc2VudHMgZGF0YSBmcm9tIHRocmVlIHNpdGVzOgoKMS4gKipTaXRlIDEyLTEgKFJ1bmdhIFZhJ2UpKio6IFNvdXRoIGNvYXN0LCByb2NreSBjb2FzdGxpbmUsIHNoYWxsb3cgaW5zaG9yZSBkZXB0aHMKMi4gKipTaXRlIDM0LTIgKFBhcGEgdGUgS2VuYSkqKjogTm9ydGggY29hc3QsIHJvY2t5IGNvYXN0bGluZSwgZGVlcCBpbnNob3JlIHdhdGVycyAgCjMuICoqU2l0ZSAzNS03IChBbmFrZW5hKSoqOiBOb3J0aCBjb2FzdCwgc2FuZCBib3R0b20gYW5kIHJvY2t5IGNvYXN0LCBzaGFsbG93IGluc2hvcmUgZGVwdGhzCgpUaGUga2V5IHF1ZXN0aW9ucyBhcmU6Ci0gRG8gQXllcnMnIGRhdGEgc3VwcG9ydCBoaXMgY2xhaW1zIGFib3V0IHJlc291cmNlIGRlcGxldGlvbiBhbmQgc3Vic2lzdGVuY2UgY2hhbmdlPwotIEhvdyBkbyBwYXR0ZXJucyBpbiBBeWVycycgZGF0YSBjb21wYXJlIHdpdGggdGhlIGNvbXByZWhlbnNpdmUgQW5ha2VuYSBhbmFseXNpcz8KLSBXaGF0IGRvIGJvdGggZGF0YXNldHMgdGVsbCB1cyBhYm91dCBFYXN0ZXIgSXNsYW5kIHN1YnNpc3RlbmNlIHN0cmF0ZWdpZXM/CgpgYGB7ciBsaWJyYXJpZXN9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KHZlZ2FuKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmBgYAoKIyBEYXRhIEV4dHJhY3Rpb24gZnJvbSBBeWVycyAoMTk4NSkKCiMjIFRhYmxlIDM6IE1pZGRlbiBBbmFseXNpcwoKYGBge3IgYXllcnMtbWlkZGVuLWRhdGF9CiMgQXllcnMgVGFibGUgMyAtIE1pZGRlbiBBbmFseXNpcwpheWVyc19taWRkZW4gPC0gZGF0YS5mcmFtZSgKICBTaXRlID0gcmVwKGMoIjEyLTEiLCAiMzQtMiIsICIzNS03IiksIGVhY2ggPSAxNCksCiAgQ29tcG9uZW50ID0gcmVwKGMoIkN5cHJhZWEiLCAiTmVyaXRhIiwgIkNoaXRvbiIsICJPdGhlcl9TaGVsbCIsICJUb3RhbF9TaGVsbCIsCiAgICAgICAgICAgICAgICAgICAgIkZpc2giLCAiQ2hpY2tlbiIsICJCaXJkIiwgIlJhdCIsICJTaGVlcCIsICJIdW1hbiIsIAogICAgICAgICAgICAgICAgICAgICJQb3Jwb2lzZSIsICJPdGhlcl9Cb25lIiwgIlRvdGFsX0JvbmUiKSwgMyksCiAgV2VpZ2h0X2cgPSBjKAogICAgIyBTaXRlIDEyLTEKICAgIDExMTksIDE2NzEsIDEwMzUsIDQzNSwgNDI2MCwgMTExLCAxMjQsIDE0LCAyMjAsIDEwOSwgNTc4LCBOQSwgTkEsIDU3OCwKICAgICMgU2l0ZSAzNC0yICAKICAgIDE5MTcsIDMzODYsIDE2NDQsIDUyNCwgNzQ3MSwgNzM0LCAyOTYsIDQwLCAxMTY0LCBOQSwgMTA1LCAxMiwgTkEsIDIzNTYsCiAgICAjIFNpdGUgMzUtNwogICAgMTQ3NSwgOTgzLCA1MTAsIDM0NywgMzMxNSwgMzU2LCAzMTYsIDMwLCA0MDAsIE5BLCAxMDgsIDIzLCBOQSwgMTIzMwogICksCiAgQ0kgPSBjKAogICAgIyBTaXRlIDEyLTEgKGcvbcKzKQogICAgMzc5LCA1NjYsIDM1MSwgMTQ3LCAxNDQ0LCAzOCwgNDIsIDUsIDc0LCAzNywgMTk2LCBOQSwgTkEsIDE5NiwKICAgICMgU2l0ZSAzNC0yIChnL23CsykKICAgIDQ1MSwgNzk3LCAzODcsIDEyMywgMTc1OCwgMTczLCA3MCwgOSwgMjc0LCBOQSwgMjUsIDMsIE5BLCA1NTQsCiAgICAjIFNpdGUgMzUtNyAoZy9twrMpCiAgICAzNjQsIDI0MywgMTI2LCA4NiwgODE4LCA4OCwgNzgsIDcsIDk5LCBOQSwgMjcsIDYsIE5BLCAzMDQKICApLAogIFBlcmNlbnQgPSBjKAogICAgIyBTaXRlIDEyLTEKICAgIDI2LCAzOSwgMjQsIDEwLCA4OCwgMTksIDIxLCAyLCAzOCwgMTksIE5BLCBOQSwgTkEsIDEyLAogICAgIyBTaXRlIDM0LTIKICAgIDI2LCA0NSwgMjIsIDcsIDc2LCAzMSwgMTIsIDIsIDQ5LCBOQSwgNCwgMSwgTkEsIDI0LAogICAgIyBTaXRlIDM1LTcKICAgIDQ0LCAzMCwgMTUsIDExLCA3MywgMjksIDI2LCAyLCAzMiwgTkEsIDksIDIsIE5BLCAyNwogICksCiAgVm9sdW1lX20zID0gcmVwKGMoMi45NSwgNC4yNSwgNC4wNSksIGVhY2ggPSAxNCkKKQoKIyBDYWxjdWxhdGUga2V5IG1ldHJpY3MKbWlkZGVuX3N1bW1hcnkgPC0gYXllcnNfbWlkZGVuICU+JQogIGZpbHRlcihDb21wb25lbnQgJWluJSBjKCJUb3RhbF9TaGVsbCIsICJGaXNoIiwgIkNoaWNrZW4iLCAiVG90YWxfQm9uZSIpKSAlPiUKICBzZWxlY3QoU2l0ZSwgQ29tcG9uZW50LCBXZWlnaHRfZywgQ0ksIFBlcmNlbnQpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBDb21wb25lbnQsIHZhbHVlc19mcm9tID0gYyhXZWlnaHRfZywgQ0ksIFBlcmNlbnQpKQoKa2FibGUobWlkZGVuX3N1bW1hcnksIGNhcHRpb24gPSAiU3VtbWFyeSBvZiBBeWVycycgTWlkZGVuIEFuYWx5c2lzIikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkKYGBgCgojIyBUYWJsZSA0OiBGaXNoIFJlbWFpbnMgYnkgU2l0ZSBhbmQgTGF5ZXIKCmBgYHtyIGF5ZXJzLWZpc2gtZGF0YX0KIyBFeHRyYWN0IGZpc2ggZmFtaWx5IGRhdGEgZnJvbSBBeWVycyBUYWJsZSA0CiMgU2l0ZSAxMi0xIHN0cmF0aWdyYXBoaWMgZGF0YQpzaXRlXzEyXzFfZmlzaCA8LSBkYXRhLmZyYW1lKAogIExheWVyID0gYygiSSIsICJJSSIsICJJSUkiLCAiSVZhIiwgIklWYiIpLAogIExhYnJpZGFlID0gYyg2NiwgMCwgMzAuMywgMjYsIDIxLjQpLAogIFNlcnJhbmlkYWUgPSBjKDE2LjYsIDAsIDYuMCwgNC4zLCA3LjEpLAogIE11cmFlbmlkYWVfQ29uZ3JpZGFlX0Jyb3R1bGlkYWUgPSBjKDE2LjYsIDAsIDMwLjMsIDIxLjgsIDI4LjYpLAogIE90aGVyID0gYygwLjgsIDAsIDMzLjQsIDQ3LjksIDQyLjkpLAogIFRvdGFsX0NJID0gYyg1LjQsIDAsIDYwLCA1OCwgMjgpLAogIE1pbl9GaXNoID0gYyg2LCAwLCAzMywgMjMsIDE0KQopCgojIFNpdGUgdG90YWxzIGZvciBjb21wYXJpc29uCnNpdGVfdG90YWxzX2Zpc2ggPC0gZGF0YS5mcmFtZSgKICBTaXRlID0gYygiMTItMSIsICIzNC0yIiwgIjM1LTciKSwKICBMYWJyaWRhZSA9IGMoMzAuMywgMzIuMiwgMjAuNiksCiAgU2VycmFuaWRhZSA9IGMoNi41LCA5LjEsIDEyLjkpLAogIENvbmdyaWRhZSA9IGMoMjYuMywgMjYuMiwgMjMuMiksCiAgTXVyYWVuaWRhZSA9IGMoOS4yLCAzLjQsIDIuNiksCiAgVG90YWxfTWluX0Zpc2ggPSBjKDc2LCA2MjYsIDE5NCkKKQoKa2FibGUoc2l0ZV90b3RhbHNfZmlzaCwgY2FwdGlvbiA9ICJGaXNoIEZhbWlseSBQZXJjZW50YWdlcyBieSBTaXRlIChBeWVycyAxOTg1KSIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpCmBgYAoKIyBBbmFseXNpcyBvZiBBeWVycycgQ2xhaW1zCgojIyBDbGFpbSAxOiBSZWdpb25hbCBWYXJpYXRpb24gaW4gTWFyaW5lIEZvb2QgRXhwbG9pdGF0aW9uCgpBeWVycyBoeXBvdGhlc2l6ZXMgdGhhdCBmaXNoIGFyZSBtb3JlIGFidW5kYW50IG9uIHRoZSBub3J0aC9ub3J0aHdlc3QgY29hc3RzIGNvbXBhcmVkIHRvIHRoZSBzb3V0aCBjb2FzdC4KCmBgYHtyIHJlZ2lvbmFsLXZhcmlhdGlvbn0KIyBFeHRyYWN0IG1hcmluZSBwZXJjZW50YWdlcwptYXJpbmVfZGF0YSA8LSBheWVyc19taWRkZW4gJT4lCiAgZmlsdGVyKENvbXBvbmVudCAlaW4lIGMoIkZpc2giLCAiVG90YWxfU2hlbGwiLCAiVG90YWxfQm9uZSIpKSAlPiUKICBzZWxlY3QoU2l0ZSwgQ29tcG9uZW50LCBQZXJjZW50LCBDSSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IENvbXBvbmVudCwgdmFsdWVzX2Zyb20gPSBjKFBlcmNlbnQsIENJKSkKCm1hcmluZV9kYXRhJEZpc2hfb2ZfQm9uZSA8LSBjKDE5LCAzMSwgMjkpICAjIEZpc2ggYXMgJSBvZiBib25lCm1hcmluZV9kYXRhJE1hcmluZV9Ub3RhbCA8LSBtYXJpbmVfZGF0YSRQZXJjZW50X1RvdGFsX1NoZWxsICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXJpbmVfZGF0YSRQZXJjZW50X1RvdGFsX0JvbmUgKiBtYXJpbmVfZGF0YSRGaXNoX29mX0JvbmUgLyAxMDApCgojIENyZWF0ZSB2aXN1YWxpemF0aW9uCnAxIDwtIGdncGxvdChtYXJpbmVfZGF0YSwgYWVzKHggPSBTaXRlLCB5ID0gQ0lfRmlzaCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJzdGVlbGJsdWUiKSArCiAgbGFicyh0aXRsZSA9ICJGaXNoIEJvbmUgQ29uY2VudHJhdGlvbiBieSBTaXRlIiwKICAgICAgIHN1YnRpdGxlID0gIkhpZ2hlciBjb25jZW50cmF0aW9ucyBhdCBub3J0aCBjb2FzdCBzaXRlcyIsCiAgICAgICB4ID0gIlNpdGUiLCB5ID0gIkZpc2ggQ29uY2VudHJhdGlvbiAoZy9twrMpIikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDSV9GaXNoKSwgdmp1c3QgPSAtMC41KSArCiAgdGhlbWVfbWluaW1hbCgpCgpwMiA8LSBnZ3Bsb3QobWFyaW5lX2RhdGEsIGFlcyh4ID0gU2l0ZSwgeSA9IEZpc2hfb2ZfQm9uZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJjb3JhbCIpICsKICBsYWJzKHRpdGxlID0gIkZpc2ggYXMgUGVyY2VudGFnZSBvZiBUb3RhbCBCb25lIiwKICAgICAgIHN1YnRpdGxlID0gIk5vcnRoIGNvYXN0IHNpdGVzIHNob3cgaGlnaGVyIGZpc2ggcGVyY2VudGFnZXMiLAogICAgICAgeCA9ICJTaXRlIiwgeSA9ICJGaXNoICUgb2YgQm9uZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gRmlzaF9vZl9Cb25lKSwgdmp1c3QgPSAtMC41KSArCiAgdGhlbWVfbWluaW1hbCgpCgpncmlkLmFycmFuZ2UocDEsIHAyLCBuY29sID0gMikKCiMgU3RhdGlzdGljYWwgY29tcGFyaXNvbgpmaXNoX3N0YXRzIDwtIGRhdGEuZnJhbWUoCiAgU2l0ZSA9IGMoIjEyLTEiLCAiMzQtMiIsICIzNS03IiksCiAgQ29hc3QgPSBjKCJTb3V0aCIsICJOb3J0aCIsICJOb3J0aCIpLAogIEZpc2hfQ0kgPSBjKDM4LCAxNzMsIDg4KSwKICBGaXNoX1BlcmNlbnQgPSBjKDE5LCAzMSwgMjkpCikKCiMgQ2FsY3VsYXRlIG1lYW5zIGJ5IGNvYXN0CmNvYXN0X21lYW5zIDwtIGZpc2hfc3RhdHMgJT4lCiAgZ3JvdXBfYnkoQ29hc3QpICU+JQogIHN1bW1hcmlzZSgKICAgIE1lYW5fRmlzaF9DSSA9IG1lYW4oRmlzaF9DSSksCiAgICBNZWFuX0Zpc2hfUGVyY2VudCA9IG1lYW4oRmlzaF9QZXJjZW50KSwKICAgIG4gPSBuKCkKICApCgprYWJsZShjb2FzdF9tZWFucywgY2FwdGlvbiA9ICJGaXNoIFJlc291cmNlcyBieSBDb2FzdCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpCgojIE5vdGU6IFdpdGggb25seSAzIHNpdGVzLCBmb3JtYWwgc3RhdGlzdGljYWwgdGVzdGluZyBpcyBsaW1pdGVkCiMgYnV0IHRoZSBwYXR0ZXJuIGlzIGNsZWFyOiBOb3J0aCBjb2FzdCBzaXRlcyBoYXZlIDMuNHggaGlnaGVyIGZpc2ggY29uY2VudHJhdGlvbgpgYGAKCioqRmluZGluZyoqOiBBeWVycycgZGF0YSBET0VTIHN1cHBvcnQgcmVnaW9uYWwgdmFyaWF0aW9uLiBOb3J0aCBjb2FzdCBzaXRlcyAoMzQtMiBhbmQgMzUtNykgaGF2ZSBzdWJzdGFudGlhbGx5IGhpZ2hlciBmaXNoIGNvbmNlbnRyYXRpb25zICgxNzMgYW5kIDg4IGcvbcKzKSBjb21wYXJlZCB0byB0aGUgc291dGggY29hc3Qgc2l0ZSAxMi0xICgzOCBnL23CsykuCgojIyBDbGFpbSAyOiBUZW1wb3JhbCBDaGFuZ2VzIGluIFN1YnNpc3RlbmNlCgpBeWVycyBzdWdnZXN0cyBjaGFuZ2VzIGluIG1hcmluZSBmb29kIHV0aWxpemF0aW9uIHRocm91Z2ggdGltZSwgcGFydGljdWxhcmx5IGF0IHNpdGUgMTItMS4KCmBgYHtyIHRlbXBvcmFsLWNoYW5nZXN9CiMgQW5hbHl6ZSBTaXRlIDEyLTEgdGVtcG9yYWwgZGF0YQpzaXRlXzEyXzFfdGVtcG9yYWwgPC0gZGF0YS5mcmFtZSgKICBMYXllciA9IGMoIkkiLCAiSUkiLCAiSUlJIiwgIklWYSIsICJJVmIiKSwKICBQZXJpb2QgPSBjKCJQb3N0LTE4NTAiLCAiMTg1MCIsICIxNzUwIiwgIjE2MDAtMTY1MCIsICJQcmUtMTQ2OS0xNjAwIiksCiAgRmlzaF9DSSA9IGMoNSwgMCwgODIsIDkwLCAzMiksCiAgQ2hpY2tlbl9DSSA9IGMoMywgMywgNzMsIDE0NSwgNDQpLAogIExhYnJpZGFlX1BlcmNlbnQgPSBjKDY2LCAwLCAzMC4zLCAyNiwgMjEuNCkKKQoKIyBDb252ZXJ0IHRvIGxvbmcgZm9ybWF0IGZvciBwbG90dGluZwp0ZW1wb3JhbF9sb25nIDwtIHNpdGVfMTJfMV90ZW1wb3JhbCAlPiUKICBzZWxlY3QoTGF5ZXIsIEZpc2hfQ0ksIENoaWNrZW5fQ0kpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLUxheWVyLCBuYW1lc190byA9ICJSZXNvdXJjZSIsIHZhbHVlc190byA9ICJDSSIpCgpwMyA8LSBnZ3Bsb3QodGVtcG9yYWxfbG9uZywgYWVzKHggPSBMYXllciwgeSA9IENJLCBjb2xvciA9IFJlc291cmNlLCBncm91cCA9IFJlc291cmNlKSkgKwogIGdlb21fbGluZShzaXplID0gMikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldihjKCJJIiwgIklJIiwgIklJSSIsICJJVmEiLCAiSVZiIikpKSArCiAgbGFicyh0aXRsZSA9ICJUZW1wb3JhbCBDaGFuZ2VzIGluIEZpc2ggdnMgQ2hpY2tlbiBhdCBTaXRlIDEyLTEiLAogICAgICAgc3VidGl0bGUgPSAiTWFqb3Igc2hpZnQgYWZ0ZXIgTGF5ZXIgSVZhIChjYS4gMTY1MCBBRCkiLAogICAgICAgeCA9ICJMYXllciAob2xkZXN0IHRvIHlvdW5nZXN0IOKGkikiLCB5ID0gIkNvbmNlbnRyYXRpb24gSW5kZXggKGcvbcKzKSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQoKcDQgPC0gZ2dwbG90KHNpdGVfMTJfMV90ZW1wb3JhbCwgYWVzKHggPSBMYXllciwgeSA9IExhYnJpZGFlX1BlcmNlbnQpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiZGFya2dyZWVuIikgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KGMoIkkiLCAiSUkiLCAiSUlJIiwgIklWYSIsICJJVmIiKSkpICsKICBsYWJzKHRpdGxlID0gIkNoYW5nZXMgaW4gTGFicmlkYWUgKFdyYXNzZSkgRG9taW5hbmNlIiwKICAgICAgIHN1YnRpdGxlID0gIkluY3JlYXNpbmcgc3BlY2lhbGl6YXRpb24gaW4gcmVjZW50IGxheWVycyIsCiAgICAgICB4ID0gIkxheWVyIChvbGRlc3QgdG8geW91bmdlc3Qg4oaSKSIsIHkgPSAiTGFicmlkYWUgJSBvZiBGaXNoIikgKwogIHRoZW1lX21pbmltYWwoKQoKZ3JpZC5hcnJhbmdlKHAzLCBwNCwgbmNvbCA9IDEpCmBgYAoKKipGaW5kaW5nKio6IEF5ZXJzJyBkYXRhIHNob3dzIGRyYW1hdGljIHRlbXBvcmFsIGNoYW5nZXM6Ci0gQ2hpY2tlbiBjb25zdW1wdGlvbiBwZWFrcyBpbiBMYXllciBJVmEgKDE0NSBnL23CsykgdGhlbiBjcmFzaGVzIHRvIG5lYXJseSB6ZXJvCi0gRmlzaCByZW1haW5zIHJlbGF0aXZlbHkgc3RhYmxlIHVudGlsIGhpc3RvcmljIGxheWVycwotIExhYnJpZGFlICh3cmFzc2UpIGluY3JlYXNlcyBmcm9tIDIxJSB0byA2NiUsIHN1Z2dlc3RpbmcgaW5jcmVhc2VkIGluc2hvcmUgZmlzaGluZwoKIyMgQ29tcGFyaXNvbiB3aXRoIEFuYWtlbmEgTXVsdGktRXhjYXZhdGlvbiBBbmFseXNpcwoKVGhlIHJlY2VudCBBbmFrZW5hIGFuYWx5c2lzIGFyZ3VlcyB0aGF0IGFwcGFyZW50IGNoYW5nZXMgaW4gZmF1bmFsIGNvbXBvc2l0aW9uIHJlZmxlY3QgZGVwb3NpdGlvbmFsIHJhdGVzLCBub3QgZ2VudWluZSBzdWJzaXN0ZW5jZSBzaGlmdHMuIExldCdzIGNvbXBhcmU6CgpgYGB7ciBhbmFrZW5hLWNvbXBhcmlzb259CiMgS2V5IGZpbmRpbmdzIGZyb20gQW5ha2VuYSBhbmFseXNpcwphbmFrZW5hX2ZpbmRpbmdzIDwtIGRhdGEuZnJhbWUoCiAgQXNwZWN0ID0gYygiTWFyaW5lIGRvbWluYW5jZSIsICJUZW1wb3JhbCBwYXR0ZXJuIiwgIlNoZWxsZmlzaCByb2xlIiwgCiAgICAgICAgICAgICAiSW50ZXJwcmV0YXRpb24iLCAiU2FtcGxlIHNpemUgZWZmZWN0cyIpLAogIEFuYWtlbmFfQW5hbHlzaXMgPSBjKAogICAgIjUwLTk5JSBtYXJpbmUgcmVzb3VyY2VzIGFjcm9zcyBhbGwgZXhjYXZhdGlvbnMiLAogICAgIk5vIGRpcmVjdGlvbmFsIHRyZW5kOyB2YXJpYXRpb24gcmVmbGVjdHMgZGVwb3NpdGlvbiIsCiAgICAiUHJpbWFyeSByZXNvdXJjZSAoMzAwMCsgaW5kaXZpZHVhbHMvbGF5ZXIpLCBub3QgZmFsbGJhY2siLAogICAgIlNpdGUgZm9ybWF0aW9uIHByb2Nlc3Nlcywgbm90IGN1bHR1cmFsIGNoYW5nZSIsCiAgICAiRGl2ZXJzaXR5IGNvcnJlbGF0ZXMgd2l0aCBzYW1wbGUgc2l6ZSIKICApLAogIEF5ZXJzXzE5ODUgPSBjKAogICAgIjczLTg4JSBzaGVsbCArIHZhcmlhYmxlIGZpc2ggKDItMzElIG9mIGJvbmUpIiwKICAgICJDbGVhciB0ZW1wb3JhbCBzaGlmdHMgaW4gY2hpY2tlbiBhbmQgZmlzaCIsCiAgICAiSW1wb3J0YW50IGJ1dCBkZWNyZWFzaW5nIHRocm91Z2ggdGltZSIsCiAgICAiU3Vic2lzdGVuY2UgY2hhbmdlcyByZWZsZWN0IHBvcHVsYXRpb24gc3RyZXNzIiwKICAgICJOb3QgZXhwbGljaXRseSBjb25zaWRlcmVkIgogICkKKQoKa2FibGUoYW5ha2VuYV9maW5kaW5ncywgY2FwdGlvbiA9ICJDb250cmFzdGluZyBJbnRlcnByZXRhdGlvbnMiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKSAlPiUKICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkKYGBgCgojIyBSZS1hbmFseXppbmcgQXllcnMnIERhdGEgVGhyb3VnaCBhIERlcG9zaXRpb25hbCBMZW5zCgpgYGB7ciBkZXBvc2l0aW9uYWwtYW5hbHlzaXN9CiMgQ2FsY3VsYXRlIGNvZWZmaWNpZW50IG9mIHZhcmlhdGlvbiBmb3IgQXllcnMnIHNpdGVzCmF5ZXJzX2N2IDwtIGF5ZXJzX21pZGRlbiAlPiUKICBmaWx0ZXIoQ29tcG9uZW50ICVpbiUgYygiRmlzaCIsICJDaGlja2VuIiwgIlJhdCIpKSAlPiUKICBncm91cF9ieShTaXRlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBNZWFuX0NJID0gbWVhbihDSSwgbmEucm0gPSBUUlVFKSwKICAgIFNEX0NJID0gc2QoQ0ksIG5hLnJtID0gVFJVRSksCiAgICBDViA9IChTRF9DSSAvIE1lYW5fQ0kpICogMTAwCiAgKQoKIyBDb21wYXJlIHdpdGggdm9sdW1lLWFkanVzdGVkIG1ldHJpY3MKdm9sdW1lX2NvbXBhcmlzb24gPC0gZGF0YS5mcmFtZSgKICBTaXRlID0gYygiMTItMSIsICIzNC0yIiwgIjM1LTciKSwKICBWb2x1bWVfbTMgPSBjKDIuOTUsIDQuMjUsIDQuMDUpLAogIFRvdGFsX0JvbmVfZyA9IGMoNTc4LCAyMzU2LCAxMjMzKSwKICBCb25lX3Blcl9tMyA9IGMoMTk2LCA1NTQsIDMwNCksCiAgRmlzaF9wZXJjZW50ID0gYygxOSwgMzEsIDI5KQopCgpwNSA8LSBnZ3Bsb3Qodm9sdW1lX2NvbXBhcmlzb24sIGFlcyh4ID0gVm9sdW1lX20zLCB5ID0gQm9uZV9wZXJfbTMpKSArCiAgZ2VvbV9wb2ludChzaXplID0gNSwgY29sb3IgPSAiZGFya2JsdWUiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFNpdGUpLCB2anVzdCA9IC0xKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnModGl0bGUgPSAiQm9uZSBEZW5zaXR5IHZzLiBFeGNhdmF0aW9uIFZvbHVtZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJObyBjbGVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiB2b2x1bWUgYW5kIGRlbnNpdHkiLAogICAgICAgeCA9ICJFeGNhdmF0aW9uIFZvbHVtZSAobcKzKSIsIHkgPSAiQm9uZSBEZW5zaXR5IChnL23CsykiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIFRlc3QgaWYgZmlzaCBwZXJjZW50YWdlIGNvcnJlbGF0ZXMgd2l0aCBib25lIGRlbnNpdHkKY29yLnRlc3Qodm9sdW1lX2NvbXBhcmlzb24kQm9uZV9wZXJfbTMsIHZvbHVtZV9jb21wYXJpc29uJEZpc2hfcGVyY2VudCkKYGBgCgojIyBTeW50aGVzaXM6IFZhcmlhYmxlIERlcG9zaXRpb24gdnMuIEN1bHR1cmFsIENoYW5nZQoKYGBge3Igc3ludGhlc2lzLXBsb3RzfQojIENyZWF0ZSBhIGNvbXByZWhlbnNpdmUgY29tcGFyaXNvbiBwbG90CiMgQ29tYmluZSB0ZW1wb3JhbCBkYXRhIHdpdGggc3BhdGlhbCBkYXRhCmNvbXByZWhlbnNpdmVfZGF0YSA8LSBkYXRhLmZyYW1lKAogIENvbnRleHQgPSBjKCIxMi0xIExheWVyIEkiLCAiMTItMSBMYXllciBJSUkiLCAiMTItMSBMYXllciBJVmEiLCAiMTItMSBMYXllciBJVmIiLAogICAgICAgICAgICAgICIzNC0yIFRvdGFsIiwgIjM1LTcgVG90YWwiKSwKICBGaXNoX0NJID0gYyg1LCA4MiwgOTAsIDMyLCAxNzMsIDg4KSwKICBQZXJpb2QgPSBjKCJIaXN0b3JpYyIsICJMYXRlIFByZWhpc3RvcmljIiwgIjE2MDAtMTY1MCIsICJQcmUtMTYwMCIsCiAgICAgICAgICAgICAiTWl4ZWQiLCAiTWl4ZWQiKSwKICBDb2FzdCA9IGMocmVwKCJTb3V0aCIsIDQpLCByZXAoIk5vcnRoIiwgMikpCikKCnA2IDwtIGdncGxvdChjb21wcmVoZW5zaXZlX2RhdGEsIGFlcyh4ID0gQ29udGV4dCwgeSA9IEZpc2hfQ0ksIGZpbGwgPSBDb2FzdCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiRmlzaCBDb25jZW50cmF0aW9ucyBBY3Jvc3MgQWxsIENvbnRleHRzIiwKICAgICAgIHN1YnRpdGxlID0gIkhpZ2ggdmFyaWFiaWxpdHkgYm90aCB0ZW1wb3JhbGx5IGFuZCBzcGF0aWFsbHkiLAogICAgICAgeSA9ICJGaXNoIENvbmNlbnRyYXRpb24gKGcvbcKzKSIpCgojIENhbGN1bGF0ZSBkZXBvc2l0aW9uYWwgdmFyaWFiaWxpdHkgbWV0cmljcwpkZXBvc2l0aW9uX21ldHJpY3MgPC0gZGF0YS5mcmFtZSgKICBEYXRhc2V0ID0gYygiQXllcnMgU291dGggQ29hc3QiLCAiQXllcnMgTm9ydGggQ29hc3QiLCAiQW5ha2VuYSAocmVwb3J0ZWQpIiksCiAgQ1ZfUmFuZ2UgPSBjKCIxMDAlKyIsICJ+NTAlIiwgIjctMTIwJSIpLAogIEludGVycHJldGF0aW9uID0gYygiSGlnaCB2YXJpYWJpbGl0eSIsICJNb2RlcmF0ZSB2YXJpYWJpbGl0eSIsICJEZXBvc2l0aW9uYWwgZWZmZWN0cyIpCikKCmthYmxlKGRlcG9zaXRpb25fbWV0cmljcywgY2FwdGlvbiA9ICJEZXBvc2l0aW9uYWwgVmFyaWFiaWxpdHkgQ29tcGFyaXNvbiIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpCmBgYAoKIyBLZXkgRmluZGluZ3MKCiMjIDEuIFJlZ2lvbmFsIFBhdHRlcm5zIChBeWVycycgQ2xhaW0gU1VQUE9SVEVEKQotIENsZWFyIG5vcnRoLXNvdXRoIGRpZmZlcmVuY2VzIGluIGZpc2ggZXhwbG9pdGF0aW9uCi0gTm9ydGggY29hc3Qgc2l0ZXMgaGF2ZSAyLTR4IGhpZ2hlciBmaXNoIGNvbmNlbnRyYXRpb25zCi0gUGF0dGVybiBjb25zaXN0ZW50IHdpdGggZWNvbG9naWNhbCBleHBlY3RhdGlvbnMKCiMjIDIuIFRlbXBvcmFsIENoYW5nZXMgKEF5ZXJzJyBDbGFpbSBQQVJUSUFMTFkgU1VQUE9SVEVEKQotIERyYW1hdGljIGNoYW5nZXMgaW4gZmF1bmFsIGFzc2VtYmxhZ2VzIGFyZSBldmlkZW50Ci0gSG93ZXZlciwgdGhlc2UgbWF5IHJlZmxlY3Q6CiAgLSBWYXJpYWJsZSBkZXBvc2l0aW9uIHJhdGVzIChhcyBBbmFrZW5hIGFuYWx5c2lzIHN1Z2dlc3RzKQogIC0gU2l0ZSB1c2UgY2hhbmdlcyByYXRoZXIgdGhhbiBpc2xhbmQtd2lkZSBzdWJzaXN0ZW5jZSBzaGlmdHMKICAtIFNtYWxsIHNhbXBsZSBlZmZlY3RzIGluIHNvbWUgbGF5ZXJzIChMYXllciBJSSBoYXMgMCBmaXNoKQoKIyMgMy4gQ29tcGFyaXNvbiB3aXRoIEFuYWtlbmEgTXVsdGktRGVjYWRhbCBBbmFseXNpcwotIEJvdGggZGF0YXNldHMgc2hvdyBoaWdoIG1hcmluZSByZXNvdXJjZSB1c2UgKD43MCUpCi0gQm90aCBzaG93IGhpZ2ggdmFyaWFiaWxpdHkgYmV0d2VlbiBjb250ZXh0cwotIEtleSBkaWZmZXJlbmNlOiBJbnRlcnByZXRhdGlvbiBvZiB2YXJpYWJpbGl0eQogIC0gQXllcnM6IEN1bHR1cmFsL3N1YnNpc3RlbmNlIGNoYW5nZQogIC0gQW5ha2VuYTogRGVwb3NpdGlvbmFsIHByb2Nlc3NlcwoKIyMgNC4gTWV0aG9kb2xvZ2ljYWwgQ29uc2lkZXJhdGlvbnMKYGBge3IgbWV0aG9kcy1jb21wYXJpc29ufQptZXRob2RzX2NvbXBhcmUgPC0gZGF0YS5mcmFtZSgKICBBc3BlY3QgPSBjKCJUZW1wb3JhbCBjb250cm9sIiwgIlNhbXBsZSBzaXplIiwgIlF1YW50aWZpY2F0aW9uIiwgCiAgICAgICAgICAgICAiU2l0ZSB0eXBlcyIsICJJbnRlcnByZXRhdGlvbiBmcmFtZXdvcmsiKSwKICBBeWVyc18xOTg1ID0gYygiNSBsYXllcnMgYXQgMTItMSBvbmx5IiwgIlNtYWxsIChuPTc2LTYyNiBmaXNoKSIsIAogICAgICAgICAgICAgICAgICJXZWlnaHQsIENJLCBwZXJjZW50YWdlcyIsICJSb2NrIHNoZWx0ZXJzIiwgCiAgICAgICAgICAgICAgICAgIkN1bHR1cmUgaGlzdG9yaWNhbCIpLAogIEFuYWtlbmFfQW5hbHlzaXMgPSBjKCJNdWx0aXBsZSBleGNhdmF0aW9ucyBvdmVyIDE5IHllYXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICAiTGFyZ2UgKHRob3VzYW5kcyBvZiBzcGVjaW1lbnMpIiwgCiAgICAgICAgICAgICAgICAgICAgICAiTklTUCwgTU5JLCB3ZWlnaHQiLCAiTXVsdGlwbGUgc2l0ZSB0eXBlcyIsIAogICAgICAgICAgICAgICAgICAgICAgIlNpdGUgZm9ybWF0aW9uIHByb2Nlc3NlcyIpCikKCmthYmxlKG1ldGhvZHNfY29tcGFyZSwgY2FwdGlvbiA9ICJNZXRob2RvbG9naWNhbCBDb21wYXJpc29uIikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkKYGBgCgojIENvbmNsdXNpb25zCgoxLiAqKkF5ZXJzJyBkYXRhIHF1YWxpdHkqKjogVGhlIGRhdGEgYXJlIHZhbHVhYmxlIGJ1dCBsaW1pdGVkIGJ5OgogICAtIFNtYWxsIHNhbXBsZSBzaXplcyBpbiBzb21lIGNvbnRleHRzCiAgIC0gU2luZ2xlLXNpdGUgdGVtcG9yYWwgc2VxdWVuY2UKICAgLSBMYWNrIG9mIGNvbnNpZGVyYXRpb24gZm9yIGRlcG9zaXRpb25hbCBwcm9jZXNzZXMKCjIuICoqUmVnaW9uYWwgdmFyaWF0aW9uKio6IFN0cm9uZ2x5IHN1cHBvcnRlZCBieSBib3RoIGRhdGFzZXRzCiAgIC0gUmVhbCBlY29sb2dpY2FsIGRpZmZlcmVuY2VzIGJldHdlZW4gY29hc3RzCiAgIC0gQ29uc2lzdGVudCB3aXRoIGV0aG5vZ3JhcGhpYyBhY2NvdW50cwoKMy4gKipUZW1wb3JhbCBwYXR0ZXJucyoqOiBNb3JlIGNvbXBsZXggdGhhbiBlaXRoZXIgc3R1ZHkgYWxvbmUgc3VnZ2VzdHMKICAgLSBBeWVycyBzaG93cyBkcmFtYXRpYyBjaGFuZ2VzIGF0IG9uZSBzaXRlCiAgIC0gQW5ha2VuYSBhbmFseXNpcyBzaG93cyBubyBpc2xhbmQtd2lkZSBkaXJlY3Rpb25hbCB0cmVuZHMKICAgLSBMaWtlbHkgZXhwbGFuYXRpb246IExvY2FsIHNpdGUgdXNlIGNoYW5nZXMgKyBkZXBvc2l0aW9uYWwgdmFyaWFiaWxpdHkKCjQuICoqU3ludGhlc2lzKio6IEJvdGggc3R1ZGllcyBjb250cmlidXRlIGltcG9ydGFudCBwaWVjZXM6CiAgIC0gQXllcnMgcHJvdmlkZXMgZWFybHkgcXVhbnRpZmllZCBkYXRhIGFuZCByZWdpb25hbCBjb21wYXJpc29uCiAgIC0gQW5ha2VuYSBhbmFseXNpcyBwcm92aWRlcyBtZXRob2RvbG9naWNhbCBzb3BoaXN0aWNhdGlvbiBhbmQgbGFyZ2VyIHNhbXBsZXMKICAgLSBUb2dldGhlciB0aGV5IHN1Z2dlc3Q6IFBlcnNpc3RlbnQgbWFyaW5lIGFkYXB0YXRpb24gd2l0aCBsb2NhbCB2YXJpYWJpbGl0eQoKIyMgUmVjb21tZW5kYXRpb25zCgoxLiBSZS1hbmFseXplIEF5ZXJzJyBzcGVjaW1lbnMgd2l0aCBtb2Rlcm4gbWV0aG9kcyAoTU5JLCBzaXplIHJlY29uc3RydWN0aW9uKQoyLiBBcHBseSBkZXBvc2l0aW9uYWwgYW5hbHlzaXMgdG8gYWxsIEVhc3RlciBJc2xhbmQgZmF1bmFsIGFzc2VtYmxhZ2VzCjMuIEludGVncmF0ZSBzcGF0aWFsIGFuZCB0ZW1wb3JhbCBwYXR0ZXJucyBhY3Jvc3MgYWxsIGF2YWlsYWJsZSBkYXRhCjQuIENvbnNpZGVyIHNpdGUgZm9ybWF0aW9uIHByb2Nlc3NlcyBhcyBwcmltYXJ5IGV4cGxhbmF0aW9uIGZvciB2YXJpYWJpbGl0eQoKIyBSZWZlcmVuY2VzCgpBeXJlcywgVy5TLiAoMTk4NSkuIEVhc3RlciBJc2xhbmQgU3Vic2lzdGVuY2UuIEpvdXJuYWwgZGUgbGEgU29jacOpdMOpIGRlcyBPY8OpYW5pc3RlcywgNDEoODApLCAxMDMtMTI0LgoKSHVudCwgVC5MLiBhbmQgTGlwbywgQy5QLiAoMjAwNikuIExhdGUgY29sb25pemF0aW9uIG9mIEVhc3RlciBJc2xhbmQuIFNjaWVuY2UgMzExOiAxNjAzLTE2MDYuCgpbQWRkaXRpb25hbCBBbmFrZW5hIGV4Y2F2YXRpb24gcmVmZXJlbmNlcyBhcyBjaXRlZCBpbiB0aGUgb3JpZ2luYWwgYW5hbHlzaXNd