Code Set-Up


#Example: 'person' is simulated data, conv stores some basic known values we want to use for quantification conversions, rest is done with mutate.

person <- read_xlsx(here("GO_Conversions.xlsx"), sheet=3)
conv <- read_xlsx(here("GO_Conversions.xlsx"), sheet=2)

quant <- coalesce_join(person, conv, by = 'type')

#Conversion Mutations

quant %>% mutate(standby_hours_dy = 8 - active_hours_dy,
                 kwh_active_dy = ((active_watts*active_hours_dy)/1000),
                 kwh_standby_dy = ((standby_watts*standby_hours_dy)/1000),
                 kwh_dy = kwh_active_dy+kwh_standby_dy,
                 kwh_wk = ifelse(type == c("incandescent", "halogen", "cfl", "led", "computer", "monitor", "personal_printer","other_elec"), kwh_dy*5, 
                          ifelse(type == "glass",
                      ((`weight (lbs)`*value_wk)/2000)*kwh_per_ton,
                          ifelse(type == "aluminum",
                      ((`weight (lbs)`*value_wk)/2000)*kwh_per_ton, #this can be cleaned with an '%in%'
                          ifelse(type == "plastic",
                      ((`weight (lbs)`*value_wk)/2000)*kwh_per_ton,
                          ifelse(type == "cardboard",
                      ((`weight (lbs)`*value_wk)/2000)*kwh_per_ton,
                          ifelse(type == "paper",
                      ((`weight (lbs)`*value_wk)/2000)*kwh_per_ton, NA))))))) -> quant

quant %>% mutate(gallons_oil_wk = kwh_wk/43.9,
                 kg_CO2_wk = (((gallons_oil_wk/42)*0.43)*1000)) -> quant
#Psuedo-real example. Using goquestidy, which is aggregated data, to get net impact in a hypothetical year if all participants took survey at same time. Need to use goques with a loop over month/year of entry to get over-time calculations.

#Relevant Questions:
#Count of lightbulbs and kind of lightbulbs
#"All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs."
#-> If Yes, Will just assume they are all using 2 LEDs. If Action Needed, will just assume using 2 incandescents.

#Wattage of computer and monitor and personal printer and “other electronics”
#"My computer monitor is set to sleep after 10 minutes or less"
#-> If Yes, do (8 - assumed 6 active_hours_dy) + .166 (ten minutes) = active_hours_dy and standby_hours_dy = 0

#"I shut off my personal printer when not in use"
#-> If Yes, standby_hours_dy = 0

#Amount of recycling for each material
#"I recycle all bottles and cans that I come across in the office."
#-> If Yes, will just assume 1 plastic bottle /wk

#"I recycle all cardboard that I come across in the office."
#-> If Yes, will just assume 1 cardboard box / wk

#Amount of paper used
#"I recycle all office paper."
#-> If Yes, value_wk for type == "paper" stays same, ifelse, value_wk for type == "paper" is "0".

#Note that I still need to develop columns that captures usage independent of sustainable action. Number of pieces of paper used, bottles drunk, etc. Because of the large amount of assumptions I'm using here, I'm sticking with quantities that match the sustainability questions. For example, "I recycle all paper" the value_wk is pieces of paper recycled. Not making a claim on paper used by those who don't do this.
goques %>% filter(question == "All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs." |
                      question == "My computer monitor is set to sleep after 10 minutes or less." |
                      question == "I shut off my personal printer when not in use." |
                      question == "I recycle all bottles and cans that I come across in the office." |
                      question ==  "I recycle all cardboard that I come across in the office." |
                      question == "I recycle all office paper.") %>%
  select(`NU ID`, question, section, answer_1) -> goquant

#Adding columns from 'person' simulated data
goquant[c("type", "value", "value_wk", "active_watts", "standby_watts", "active_hours_dy", "standby_hours_dy")] <- NA

#lightbulbs
goquant %>% mutate(type = ifelse(question == "All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs." & answer_1 == "Yes", "led", 
            ifelse(question == "All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs." & answer_1 == "Action Needed", "incandescent", NA))) -> goquant

goquant %>% mutate(value = ifelse(type == "led", 2, 
                           ifelse(type == "incandescent", 2, type))) -> goquant

goquant %>% mutate(active_watts = ifelse(type == "led", 9, 
                                  ifelse(type == "incandescent", 60, active_watts))) -> goquant
goquant %>% mutate(standby_watts = ifelse(type == "led", 0, 
                                  ifelse(type == "incandescent", 0, standby_watts))) -> goquant

goquant %>% mutate(active_hours_dy = ifelse(question == "All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs.", 8, active_hours_dy)) -> goquant
goquant %>% mutate(standby_hours_dy = ifelse(question == "All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs.", 8- active_hours_dy, standby_hours_dy)) -> goquant

#computer monitor
goquant %>% mutate(type = ifelse(question == "My computer monitor is set to sleep after 10 minutes or less.","monitor", type)) -> goquant

goquant %>% mutate(active_watts = ifelse(type == "monitor", 45, active_watts)) -> goquant
goquant %>% mutate(standby_watts = ifelse(type == "monitor", 4, standby_watts)) -> goquant
goquant %>% mutate(active_hours_dy = ifelse(type == "monitor", 6, active_hours_dy)) -> goquant

goquant %>% mutate(standby_hours_dy = ifelse(type == "monitor" & answer_1 == "Yes", 0, 
                            ifelse(type == "monitor" & answer_1 == "Action Needed", 8-active_hours_dy, standby_hours_dy))) -> goquant

#personal printer (here need to account for whether they have one or not)
goquant %>% mutate(type = ifelse(question == "I shut off my personal printer when not in use.", "printer", type)) -> goquant

goquant %>% mutate(active_watts = ifelse(type == "printer" & answer_1 != "N/A", 40, 
                                  ifelse(type == "printer" & answer_1 == "N/A", 0, active_watts))) -> goquant
                   
goquant %>% mutate(standby_watts = ifelse(type == "printer" & answer_1 != "N/A", 4, 
                                  ifelse(type == "printer" & answer_1 == "N/A", 0, standby_watts))) -> goquant                   
goquant %>% mutate(active_hours_dy = ifelse(type == "printer" & answer_1 != "N/A", 1,
                                     ifelse(type == "printer" & answer_1 == "N/A", 0, active_hours_dy))) -> goquant

goquant %>% mutate(standby_hours_dy = ifelse(type == "printer" & answer_1 == "Yes",
                                             0, 
                   ifelse(type == "printer" & answer_1 == "Action Needed", 
                          8-active_hours_dy, 
                   ifelse(type == "printer" & answer_1 == "N/A", 0, standby_hours_dy)))) -> goquant

#Bottles and Cans Recycling
goquant %>% mutate(type = ifelse(question == "I recycle all bottles and cans that I come across in the office.", "plastic", type)) -> goquant

goquant %>% mutate(value_wk = ifelse(type == "plastic", 1, value_wk)) -> goquant

#Cardboard Recycling
goquant %>% mutate(type = ifelse(question == "I recycle all cardboard that I come across in the office.", "cardboard", type)) -> goquant

goquant %>% mutate(value_wk = ifelse(type == "cardboard", 1, value_wk)) -> goquant

#Paper Recycling
goquant %>% mutate(type = ifelse(question == "I recycle all office paper.", "paper", type)) -> goquant

goquant %>% mutate(value_wk = ifelse(type == "paper" & answer_1 == "Yes" , 25, value_wk)) -> goquant
quant <- coalesce_join(goquant, conv, by = 'type')

quant %>% mutate(kwh_active_dy = ((active_watts*active_hours_dy)/1000),
                 kwh_standby_dy = ((standby_watts*standby_hours_dy)/1000),
                 kwh_dy = kwh_active_dy+kwh_standby_dy,
                 kwh_wk = ifelse(type == c("incandescent", "led", "monitor","printer"), kwh_dy*5, NA)) -> quant

quant %>% mutate(kwh_wk = ifelse(type == "paper",
                      ((`weight (lbs)`*value_wk)/2000)*kwh_per_ton,
                          ifelse(type == "plastic",
                      ((`weight (lbs)`*value_wk)/2000)*kwh_per_ton, #this can be cleaned with an '%in%'
                          ifelse(type == "cardboard", 
                      ((`weight (lbs)`*value_wk)/2000)*kwh_per_ton, kwh_dy*5)))) -> quant

quant %>% mutate(gallons_oil_wk = kwh_wk/43.9,
                 kg_CO2_wk = (((gallons_oil_wk/42)*0.43)*1000)) -> quant

Quantifiying Environmental Impact of the Green Office Challenge.

The following quantifies the (theoretical) environmental impact of six questions from the Green Office Challenge. It is a combination of reasonable assumptions (e.g. watts for an average computer monitor) with Green Office survey data (e.g. number of people who say “Yes” to having their monitor set to sleep after 10 minutes). A number of conversions were then calculated to estimate the impact on Kilowatt Hours of Electricity, Gallons of Oil, and Kilograms of CO2 for a 48-week year

The survey data contains 483 participants and is subset to just their first survey. The resultant calculations are, in effect, the theoretical environmental impact over one year if all 483 participants took the survey at the same time.


Dataframes


Below is the dataframe (Table 1) for which all following visualizations are referenced. To dive deeper into how it was created, select “Show All Code” underneath the “Code” button in the top-right of this document.

Each row corresponds to a unique question and answer_1 combination. The other columns illustrate the various assumptions used in this project. For example, in the question, “All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs.”, when the column “answer_1” is “Yes” the column “type” has a value of “led” and when the column “answer_1” is “Action Needed”, the column “type” has a value of “incandescent”. Furthermore, the “value” column for those lightbulb types are both “2”, indicating that all other calculations for that question assumes a participant has either 2 incandescent or led lightbulbs in their workstation.

Several of the other questions also use similar simplyifing assumptions, given that the actual data is unknown. For example, in the question “I recycle all bottles and cans that I come across in the office.”, I assume the “type” of recycled object to be a plastic bottle and that participants who answered “Yes” recycle just 2 of these a week.

Gathering the actual information from all previous Green Office participants will allow much more precise and in-depth calculations for the questions in this project and several others from the larger Green Office Survey.

All other data assumptions (e.g. weight (lbs) per type of recyclable material) or conversions (e.g. kwh_wk to gallons_oil_wk) come from authoritative sources such as the EPA.

Table 1:


quant %>% select(-`NU ID`) -> quant_lite
quant_lite[!duplicated(quant_lite),]
NA
NA

Supplementing Table 1, this dataframe (Table 1) shows the counts of different answers for each of the six questions examined in this project. These counts were used to calculate the environmental impact of those who do take the reference action (i.e. “Yes”) and those who do not (i.e. “Action Needed”).

Table 2:


goquestidy %>% select(question, `Action Needed`, `N/A`, Yes) %>% ungroup() %>%
semi_join(., quant %>% select(question)) %>% filter(surveyorder==1) %>% select(-surveyorder)
NA


Technological Adjustment Questions and Visualizations


Three Technology-related questions from the Green Office Survey lend themselves to quantification:

  1. “All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs.”
  2. “I shut off my personal printer when not in use.”
  3. “My computer monitor is set to sleep after 10 minutes or less.”

The key assumptions for these questions are the Watts of electricity used when a device is active and in standby as well as the number of hours for each. This allows for the calculation of Kilowatt hours per day and by extension Kilowatt hours per week and per year. The exact assumptions used can be seen in Table 1, depending on the type of device and the answer given to the question.

Below is the visualized impact of each of these “Technological Adjustment” questions from the assumptions in Table 1 relative to the count of answer type from Table 2:


Recycling Questions and Visualizations


Three Recycling-related questions from the Green Office Survey lend themselves to quantification:

  1. “I recycle all bottles and cans that I come across in the office.”
  2. “I recycle all cardboard that I come across in the office.”
  3. “I recycle all office paper.”

The key assumptions for these questions are the type of recycled material and the quantity recycled in a week. The exact assumptions used can be seen in Table 1. Where type is “plastic”, “cardboard”, or "paper, weight (lbs) is based on EPA data for a 20 fl oz bottle, a 2’ by 2’ by 2’ cardboard box, 3mm, and a standard sheet of printer paper, respectively.

Below is the visualized impact of each of these “Recycling” questions from the assumptions in Table 1 relative to the count of answer type from Table 2:


Time Series


Below is a time series visualization of the environmental impact Green Office Participants made each week since the program began.

goques2 %>% filter(question == "All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs." |
                      question == "My computer monitor is set to sleep after 10 minutes or less." |
                      question == "I shut off my personal printer when not in use." |
                      question == "I recycle all bottles and cans that I come across in the office." |
                      question ==  "I recycle all cardboard that I come across in the office." |
                      question == "I recycle all office paper.") %>%
  select(`NU ID`, question, section, answer_1, date, month, year) -> goquant

#Adding columns from 'person' simulated data
goquant[c("type", "value", "value_wk", "active_watts", "standby_watts", "active_hours_dy", "standby_hours_dy")] <- NA

#lightbulbs
goquant %>% mutate(type = ifelse(question == "All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs." & answer_1 == "Yes", "led", 
            ifelse(question == "All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs." & answer_1 == "Action Needed", "incandescent", NA))) -> goquant

goquant %>% mutate(value = ifelse(type == "led", 2, 
                           ifelse(type == "incandescent", 2, type))) -> goquant

goquant %>% mutate(active_watts = ifelse(type == "led", 9, 
                                  ifelse(type == "incandescent", 60, active_watts))) -> goquant
goquant %>% mutate(standby_watts = ifelse(type == "led", 0, 
                                  ifelse(type == "incandescent", 0, standby_watts))) -> goquant

goquant %>% mutate(active_hours_dy = ifelse(question == "All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs.", 8, active_hours_dy)) -> goquant
goquant %>% mutate(standby_hours_dy = ifelse(question == "All of my task lighting (including floor and desk lamps) uses either LED or CFL, but no incandescent light bulbs.", 8- active_hours_dy, standby_hours_dy)) -> goquant

#computer monitor
goquant %>% mutate(type = ifelse(question == "My computer monitor is set to sleep after 10 minutes or less.","monitor", type)) -> goquant

goquant %>% mutate(active_watts = ifelse(type == "monitor", 45, active_watts)) -> goquant
goquant %>% mutate(standby_watts = ifelse(type == "monitor", 4, standby_watts)) -> goquant
goquant %>% mutate(active_hours_dy = ifelse(type == "monitor", 6, active_hours_dy)) -> goquant

goquant %>% mutate(standby_hours_dy = ifelse(type == "monitor" & answer_1 == "Yes", 0, 
                            ifelse(type == "monitor" & answer_1 == "Action Needed", 8-active_hours_dy, standby_hours_dy))) -> goquant

#personal printer (here need to account for whether they have one or not)
goquant %>% mutate(type = ifelse(question == "I shut off my personal printer when not in use.", "printer", type)) -> goquant

goquant %>% mutate(active_watts = ifelse(type == "printer" & answer_1 != "N/A", 40, 
                                  ifelse(type == "printer" & answer_1 == "N/A", 0, active_watts))) -> goquant
                   
goquant %>% mutate(standby_watts = ifelse(type == "printer" & answer_1 != "N/A", 4, 
                                  ifelse(type == "printer" & answer_1 == "N/A", 0, standby_watts))) -> goquant                   
goquant %>% mutate(active_hours_dy = ifelse(type == "printer" & answer_1 != "N/A", 1,
                                     ifelse(type == "printer" & answer_1 == "N/A", 0, active_hours_dy))) -> goquant

goquant %>% mutate(standby_hours_dy = ifelse(type == "printer" & answer_1 == "Yes",
                                             0, 
                   ifelse(type == "printer" & answer_1 == "Action Needed", 
                          8-active_hours_dy, 
                   ifelse(type == "printer" & answer_1 == "N/A", 0, standby_hours_dy)))) -> goquant

#Bottles and Cans Recycling
goquant %>% mutate(type = ifelse(question == "I recycle all bottles and cans that I come across in the office.", "plastic", type)) -> goquant

goquant %>% mutate(value_wk = ifelse(type == "plastic", 1, value_wk)) -> goquant

#Cardboard Recycling
goquant %>% mutate(type = ifelse(question == "I recycle all cardboard that I come across in the office.", "cardboard", type)) -> goquant

goquant %>% mutate(value_wk = ifelse(type == "cardboard", 1, value_wk)) -> goquant

#Paper Recycling
goquant %>% mutate(type = ifelse(question == "I recycle all office paper.", "paper", type)) -> goquant

goquant %>% mutate(value_wk = ifelse(type == "paper" & answer_1 == "Yes" , 25, value_wk)) -> goquant
quant <- coalesce_join(goquant, conv, by = 'type')

quant %>% mutate(kwh_active_dy = ((active_watts*active_hours_dy)/1000),
                 kwh_standby_dy = ((standby_watts*standby_hours_dy)/1000),
                 kwh_dy = kwh_active_dy+kwh_standby_dy,
                 kwh_wk = ifelse(type == c("incandescent", "led", "monitor","printer"), kwh_dy*5, NA)) -> quant

quant %>% mutate(kwh_wk = ifelse(type == "paper",
                      ((`weight (lbs)`*value_wk)/2000)*kwh_per_ton,
                          ifelse(type == "plastic",
                      ((`weight (lbs)`*value_wk)/2000)*kwh_per_ton, #this can be cleaned with an '%in%'
                          ifelse(type == "cardboard", 
                      ((`weight (lbs)`*value_wk)/2000)*kwh_per_ton, kwh_dy*5)))) -> quant

quant %>% mutate(gallons_oil_wk = kwh_wk/43.9,
                 kg_CO2_wk = (((gallons_oil_wk/42)*0.43)*1000)) -> quant

Conclusion

This project emphasizes the potential for the Green Office Challenge to be a major facet of Northeastern University’s Sustainability and Climate goals. The environmental impact of these six questions is significant even under conservative assumptions. By gathering more accurate data in place of these assumptions, we can demonstrate the impact of this program at the individual, department, and campus level across a much broader variety of environmental impacts. This information can play a central role in helping participants of the Green Office Challenge understand the impact of their efforts and commit to taking further action.

LS0tCnRpdGxlOiAiR3JlZW4gT2ZmaWNlIFF1YW50aWZpY2F0aW9uIERlbW8tIFNhZ2UgR2liYm9ucyIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGZpZ193aWR0aDogMQogICAgZmlnX2hlaWdodDogMgogIGh0bWxfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMycKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoKYm9keXsgLyogTm9ybWFsICAqLwogICAgICBmb250LXNpemU6IDE0cHg7CiAgfQp0ZCB7ICAvKiBUYWJsZSAgKi8KICBmb250LXNpemU6IDEycHg7Cn0KaDEudGl0bGUgewogIGZvbnQtc2l6ZTogMThweDsKfQpoMSB7IC8qIEhlYWRlciAxICovCiAgZm9udC1zaXplOiAxOHB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQpoMiB7IC8qIEhlYWRlciAyICovCiAgICBmb250LXNpemU6IDE2cHg7CiAgY29sb3I6IERhcmtCbHVlOwp9Cn0KaDMgeyAvKiBIZWFkZXIgMyAqLwogICAgZm9udC1zaXplOiAxNHB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQpjb2RlLnJ7IC8qIENvZGUgYmxvY2sgKi8KICAgIGZvbnQtc2l6ZTogMTJweDsKfQpwcmUgeyAvKiBDb2RlIGJsb2NrIC0gZGV0ZXJtaW5lcyBjb2RlIHNwYWNpbmcgYmV0d2VlbiBsaW5lcyAqLwogICAgZm9udC1zaXplOiAxNHB4Owp9Cjwvc3R5bGU+CgojIENvZGUgU2V0LVVwCgoKYGBge3IgTGlicmFyaWVzIGFuZCBEYXRhLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgY29tbWVudD0iIn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkobGVtb24pCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkodGlkeXRleHQpCmxpYnJhcnkoc3RyaW5ncikKCmdvIDwtIHJlYWRfeGxzeChoZXJlKCJncmVlbm9mZmljZV8yMDE2X2ZhbGwyMDE5Lnhsc3giKSwgc2hlZXQ9MSkgI0FnZ3JlZ2F0ZWQgU3VydmV5IFNjb3JlIERhdGEKCnN1cnYgPC0gcmVhZF94bHN4KGhlcmUoIkdyZWVuT2ZmaWNlU3VydmV5cy54bHN4IikpICNJbmRpdmlkdWFsIFN1cnZleSBSZXNwb25zZSBEYXRhCmBgYAoKCmBgYHtyIGdvc3VydiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY29tbWVudD0iIiwgcmVzdWx0cz0naGlkZSd9CiNnb3N1cnYgKG1hc3RlciBkYXRhZnJhbWUuIEVhY2ggcm93IGNvcnJlc3BvbmRzIHRvIGEgdW5pcXVlIFN1cnZleSBJRCkKIyMjI0NsZWFuaW5nLCBKb2luaW5nLCBDbGVhbmluZyMjIyMKCiNOQXMsIHJlbW92aW5nIHJvd3MKc3VydiA8LSBzdXJ2W3doaWNoKCFpcy5uYShzdXJ2JGBJIHR1cm4gb2ZmIG9mZmljZSBsaWdodHMgd2hlbiByb29tcyBhcmUgdW5vY2N1cGllZC5gKSksXQoKIyNEYXRlIENvbHVtbnMKI0NvbnZlcnQgY2hhcmFjdGVyIHRvIFBPU0lYY3QKc3VydiRgRGF0ZSBDcmVhdGVkYCA8LSBhcy5QT1NJWGN0KHN1cnYkYERhdGUgQ3JlYXRlZGAsIGZvcm1hdD0gIiVtLyVkLyV5IikKCiNDcmVhdGluZyBkYXRlIGNvbHVtbiAobm8gdGltZSkKZ28gPC0gZ28gJT4lbXV0YXRlKGRhdGUgPSBmb3JtYXQoYERhdGUgQ3JlYXRlZGAsICIlbS8lZC8leSIpKQpzdXJ2IDwtIHN1cnYgJT4lbXV0YXRlKGRhdGUgPSBmb3JtYXQoYERhdGUgQ3JlYXRlZGAsICIlbS8lZC8leSIpKQoKI1JlbW92aW5nIG9yaWdpbmFsIERhdGUgY29sdW1uIHNvIGdvIGFuZCBzdXJ2IGNhbiBqb2luIHByb3Blcmx5CmdvIDwtIGdvICU+JSBzZWxlY3QoLWBEYXRlIENyZWF0ZWRgKQpzdXJ2IDwtIHN1cnYgJT4lIHNlbGVjdCgtYERhdGUgQ3JlYXRlZGApCgojc2V0dGluZyBjZXJ0aWZpY2F0aW9uIGxldmVscwpnbyRgQ2VydGlmaWNhdGlvbiBMZXZlbGAgPC0gZmFjdG9yKGdvJGBDZXJ0aWZpY2F0aW9uIExldmVsYCwgbGV2ZWxzID0gYygiQlJPTlpFIiwgIlNJTFZFUiIsICJHT0xEIikpCgojSm9pbmluZwpnb3N1cnYgPC0gbGVmdF9qb2luKGdvLCBzdXJ2KQoKI1RoZXJlIGFyZSAxODkgcm93cyBpbiBzdXJ2IG5vdCBpbiBnby4gTmVlZCB0byB3b3JrIHdpdGggdGhvc2UgdG8gaW50ZWdyYXRlLgpzdXJ2X3N0cmFnZyA8LSBhbnRpX2pvaW4oc3VydiwgZ28pICNzdHJhZ2dsaW5nIGRhdGEKCiMjQWRqdXN0aW5nIERhdGUgQ29sdW1ucyBhZnRlciBKb2luCiNjb252ZXJ0aW5nIGJhY2sgaW50byBQT1NJWGN0IGZvciBlYXNpZXIgbWFuaXB1bGF0aW9uIGxhdGVyCmdvc3VydiRkYXRlIDwtIGFzLlBPU0lYY3QoZ29zdXJ2JGRhdGUsIGZvcm1hdD0gIiVtLyVkLyV5IikKCiNhZGRpbmcgbW9udGggYW5kIHllYXIgY29sdW1ucwpnb3N1cnYgPC0gZ29zdXJ2ICU+JQptdXRhdGUobW9udGggPSBmb3JtYXQoZGF0ZSwgIiVtIiksIHllYXIgPSBmb3JtYXQoZGF0ZSwgIiVZIikpCgojQWRkaW5nIHRoZSAic3VydmV5b3JkZXIiIGNvbHVtbiBhbmQgcmVsb2NhdGluZy4gVmFsdWVzIGFyZSAxLTQgZm9yIHRoZSBvcmRlciBhIHN1cnZleSBpcyBmb3IgYSBnaXZlbiB1c2VyIGJ5IGRhdGUuCmdvc3VydiAlPiUgCiAgZ3JvdXBfYnkoYE5VIElEYCkgJT4lCiAgYXJyYW5nZShgTlUgSURgLCBkYXRlKSAlPiUKICBtdXRhdGUoc3VydmV5b3JkZXIgPSByb3dfbnVtYmVyKCkpICU+JSAKICByZWxvY2F0ZSguLCBkYXRlLCAuYWZ0ZXIgPWBTdXJ2ZXkgSURgKSAlPiUKICByZWxvY2F0ZSguLCBzdXJ2ZXlvcmRlciwgLmFmdGVyPWBTdXJ2ZXkgSURgKSAlPiUKICB1bmdyb3VwKCkgLT4gZ29zdXJ2CgojcmVuYW1pbmcKZ29zdXJ2IDwtIGdvc3VydiAlPiUgcmVuYW1lKERlcGFydG1lbnQgPSBgRGVwYXJ0bWVudCBOYW1lYCkKZ29zdXJ2IDwtIGdvc3VydiAlPiUgcmVuYW1lKC4sIGMoQ2VydCA9IGBDZXJ0aWZpY2F0aW9uIExldmVsYCwgUGVyYyA9IFBlcmNlbnRhZ2UpKQpnb3N1cnYgPC0gZ29zdXJ2ICU+JSByZW5hbWUoLiwgc3VydmV5X0lEID0gYFN1cnZleSBJRGApCgojcmVsb2NhdGluZwpnb3N1cnYgPC0gcmVsb2NhdGUoZ29zdXJ2LCBtb250aCwgLmFmdGVyPSBkYXRlKQpnb3N1cnYgPC0gcmVsb2NhdGUoZ29zdXJ2LCB5ZWFyLCAuYWZ0ZXI9IG1vbnRoKQoKZ29zdXJ2ICU+JSAKICByZWxvY2F0ZSguLCBQZXJjLCAuYWZ0ZXIgPSBzdXJ2ZXlvcmRlcikgJT4lCiAgcmVsb2NhdGUoLiwgQ2VydCwgLmFmdGVyID0gUGVyYykgJT4lCiAgcmVsb2NhdGUoLiwgYE5VIElEYCwgLmJlZm9yZSA9IFJlcXVlc3RvcikgJT4lCiAgc2VsZWN0KC1DZXJ0aWZpY2F0aW9uKSAtPiBnb3N1cnYKCiNDcmVhdGluZyBhbnN3ZXIgY291bnRzIHBlciBTdXJ2ZXkgSUQKI25vdGUgdGhhdCBJIGxlYXZpbmcgb3V0IHRoZSBlY28tYW1iYXNzYWRvciBxdWVzdGlvbgpnb3N1cnYgJT4lIG11dGF0ZShjbnRfeWVzID0gcm93U3Vtcyhnb3N1cnZbLCBjKDE2OjU3KV0gPT0gJ1llcycsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgIGNudF9hY3Rpb25uZWVkZWQgPSByb3dTdW1zKGdvc3VydlssIGMoMTY6NTcpXSA9PSAnQWN0aW9uIE5lZWRlZCcsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgIGNudF9uYSA9IHJvd1N1bXMoZ29zdXJ2WywgYygxNjo1NyldID09ICdOL0EnLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICBjbnRfbm8gPSByb3dTdW1zKGdvc3VydlssIGMoMTY6NTcpXSA9PSAnTm8nLCBuYS5ybSA9IFQpKSAtPiBnb3N1cnYKCmdvc3VydiRzdXJ2ZXlvcmRlciA8LSBhcy5jaGFyYWN0ZXIoZ29zdXJ2JHN1cnZleW9yZGVyKQoKYGBgCgoKYGBge3IgZ290aWR5LCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgY29tbWVudD0iIn0KI2dvdGlkeSAoRGVyaXZlZCBmcm9tIGdvc3Vydi4gRWFjaCByb3cgY29ycmVzcG9uZHMgdG8gYSB1bmlxdWUgTlUgSUQgKHBlcnNvbikuIFVzZWZ1bCBmb3IgYW5hbHl6aW5nIHBvc2l0aW9uIGFuZCBkZXBhcnRtZW50IGNoYW5nZXMgaW4gcmVsYXRpb24gdG8gYW5zd2VyIGNvdW50cyBhbmQgc3VydmV5IHJlc3VsdHMuKQoKIyMjI0NyZWF0aW5nICJnb3RpZHkiIHdoZXJlIGV2ZXJ5IHJvdyBjb3JyZXNwb25kcyB0byBhIHVuaXF1ZSBgTlUgSURgIyMjIwoKI1dpZGVuaW5nIFBlcmMsIENlcnQsIGFuZCBjbnRfWCBjb2x1bW5zIGNvbHVtbnMgdG8gY2FwdHVyZSBzY29yZXMgYWNyb3NzIHJlY2VydGlmaWNhdGlvbnMuCmdvc3VydiAlPiUKICBwaXZvdF93aWRlciguLCAKICAgICAgICAgICBpZF9jb2xzPWMoYE5VIElEYCwgc3VydmV5b3JkZXIsIFBlcmMsIAogICAgICAgICAgICAgICAgICAgICBDZXJ0LCBjbnRfeWVzLCBjbnRfYWN0aW9ubmVlZGVkLCBjbnRfbmEsIGNudF9ubyksIAogICAgICAgICAgICAgICAgICAgICBuYW1lc19mcm9tPXN1cnZleW9yZGVyLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbT1jKFBlcmMsIENlcnQsIGNudF95ZXMsIGNudF9hY3Rpb25uZWVkZWQsIGNudF9uYSwgY250X25vKSkgLT4gZ290aWR5CgojU2hvdWxkIGJlIHRydWUsIGluZGljYXRpbmcgd2UgaGF2ZSBhIHVuaXF1ZSBOVSBJRCBwZXIgcm93IGluIGdvdGlkeQpnb3N1cnYgJT4lIGZpbHRlcighZHVwbGljYXRlZChgTlUgSURgKSkgJT4lIG5yb3coKSA9PSBucm93KGdvdGlkeSkKCiNXaWRlbmluZyBQb3NpdGlvbnMgYW5kIERlcGFydG1lbnRzIHRvIGNhcHR1cmUgY2hhbmdlcyBhY3Jvc3MgcmVjZXJ0aWZpY2F0aW9ucwpnb3N1cnYgJT4lICN0cmFja2luZyBwb3NpdGlvbnMgYW5kIGRlcGFydG1lbnQgY2hhbmdlcyBvdmVyIGNlcnRzCiAgcGl2b3Rfd2lkZXIoLiwgCiAgICAgICAgICAgaWRfY29scz1jKGBOVSBJRGAsIHN1cnZleW9yZGVyLCBQb3NpdGlvbiwgRGVwYXJ0bWVudCksCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfZnJvbT1zdXJ2ZXlvcmRlciwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbT1jKFBvc2l0aW9uLCBEZXBhcnRtZW50KSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgI2NyaXRpY2FsCiAgI2NyZWF0aW5nIHRlbXBvcmFyeSBUUlVFL0ZBTFNFIGNvbHVtbnMgb2YgcG9zaXRpb25zIGFuZCBkZXBhcnRtZW50cyB1bmlxdWVseQogIG11dGF0ZShwb3NfY2hhbmdlMTIgPSBpZmVsc2UoUG9zaXRpb25fMSAhPSBQb3NpdGlvbl8yLCAiVFJVRSIsICJGQUxTRSIpKSAlPiUKICBtdXRhdGUoZGVwX2NoYW5nZTEyID0gaWZlbHNlKERlcGFydG1lbnRfMSAhPSBEZXBhcnRtZW50XzIsICJUUlVFIiwgIkZBTFNFIikpICU+JQogIG11dGF0ZShwb3NfY2hhbmdlMjMgPSBpZmVsc2UoUG9zaXRpb25fMiAhPSBQb3NpdGlvbl8zLCAiVFJVRSIsICJGQUxTRSIpKSAlPiUKICBtdXRhdGUoZGVwX2NoYW5nZTIzID0gaWZlbHNlKERlcGFydG1lbnRfMiAhPSBEZXBhcnRtZW50XzMsICJUUlVFIiwgIkZBTFNFIikpICU+JQogICNjb21iaW5pbmcgcG9zaXRpb24gYW5kIGRlcGFydG1lbnQgY2hhbmdlcyBpbnRvIGZvdXIgdmFsdWVzIGZvciAxc3QgdG8gMm5kIHN1cnZleSAocG9zZGVwMV8yKSBhbmQgMm5kIHRvIDNyZCBzdXJ2ZXkgKHBvc2RlcDJfMykuIFN1cnZleSAzIHRvIDQgaXMgbGVmdCBvdXQgYmVjYXVzZSBvbmx5IG9uZSBpbmRpdmlkdWFsIHRvb2sgaXQgNCB0aW1lcyBhbmQgZGlkIG5vdCBjaGFuZ2UuCiAgbXV0YXRlKHBvc2RlcDFfMiA9IGlmZWxzZShwb3NfY2hhbmdlMTIgPT0gIlRSVUUiICYgZGVwX2NoYW5nZTEyID09ICJUUlVFIiwgImJvdGgiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZShwb3NfY2hhbmdlMTIgPT0gIlRSVUUiICYgZGVwX2NoYW5nZTEyID09ICJGQUxTRSIsICJwb3NpdGlvbl9jaGFuZ2UiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZShwb3NfY2hhbmdlMTIgPT0gIkZBTFNFIiAmIGRlcF9jaGFuZ2UxMiA9PSAiVFJVRSIsICJkZXBhcnRtZW50X2NoYW5nZSIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHBvc19jaGFuZ2UxMiA9PSAiRkFMU0UiICYgZGVwX2NoYW5nZTEyID09ICJGQUxTRSIsICJub19jaGFuZ2UiLCBOQSkpKSkpICU+JQogIG11dGF0ZShwb3NkZXAyXzMgPSBpZmVsc2UocG9zX2NoYW5nZTIzID09ICJUUlVFIiAmIGRlcF9jaGFuZ2UyMyA9PSAiVFJVRSIsICJib3RoIiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UocG9zX2NoYW5nZTIzID09ICJUUlVFIiAmIGRlcF9jaGFuZ2UyMyA9PSAiRkFMU0UiLCAicG9zaXRpb25fY2hhbmdlIiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UocG9zX2NoYW5nZTIzID09ICJGQUxTRSIgJiBkZXBfY2hhbmdlMjMgPT0gIlRSVUUiLCAiZGVwYXJ0bWVudF9jaGFuZ2UiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZShwb3NfY2hhbmdlMjMgPT0gIkZBTFNFIiAmIGRlcF9jaGFuZ2UyMyA9PSAiRkFMU0UiLCAibm9fY2hhbmdlIiwgTkEpKSkpKSAlPiUKICAjcmVtb3ZpbmcgdGVtcG9yYXJ5IFRSVUUvRkFMU0UgY29sdW1tcyBhbmQgcmVsb2NhdGluZwogIHNlbGVjdCgtYyhwb3NfY2hhbmdlMTIsIGRlcF9jaGFuZ2UxMiwgcG9zX2NoYW5nZTIzLCBkZXBfY2hhbmdlMjMpKSAlPiUKICByZWxvY2F0ZSguLCBjKHBvc2RlcDFfMiwgcG9zZGVwMl8zKSwgLmJlZm9yZT1Qb3NpdGlvbl8xKSAtPiBwb3NkZXBjaGFuZ2UKCmxlZnRfam9pbihnb3RpZHksIHBvc2RlcGNoYW5nZSkgLT4gZ290aWR5CgoKYGBgCgoKYGBge3IgZ29xdWVzLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgY29tbWVudD0iIiB9CiNnb3F1ZXMgKERlcml2ZWQgZnJvbSBnb3N1cnYuIExhcmdlLCBub24tdGlkeSBkYXRhZnJhbWUgdXNlZnVsIGFzIGEgc3RhcnRpbmcgcGxhY2UgZm9yIGRhdGFmcmFtZXMgdGhhdCBhbmFseXplIHF1ZXN0aW9ucywgYW5zd2VycywgY2VydGlmaWNhdGlvbnMsIGFjcm9zcyBzdXJ2ZXkgd2F2ZXMpCmdvc3VydiAlPiUgcGl2b3RfbG9uZ2VyKGMoMTY6NTgpLCBuYW1lc190bz0icXVlc3Rpb24iLCB2YWx1ZXNfdG89ImFuc3dlciIpICU+JQogIHBpdm90X3dpZGVyKC4sIAogICAgICAgICAgIGlkX2NvbHM9YyhgTlUgSURgLCBzdXJ2ZXlvcmRlciwgcXVlc3Rpb24sIGFuc3dlciksIAogICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb209c3VydmV5b3JkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2Zyb209YyhhbnN3ZXIpLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3ByZWZpeD0iYW5zd2VyXyIpIC0+IGdvcXVlcwoKbGVmdF9qb2luKGdvcXVlcywgZ290aWR5KSAtPiBnb3F1ZXMKCiNyZW1vdmluZyB1bm5lY2Vzc2FyeSBjb2x1bW5zIChvbmx5IG9uZSBwZXJzb24gdG9vayB0aGUgc3VydmV5IGZvdXIgdGltZXMgYW5kIGRpZCBub3QgY2hhbmdlIGRlcGFydG1lbnQgb3IgcG9zaXRpb24pCmdvcXVlcyA8LSBnb3F1ZXMgJT4lIHNlbGVjdCgtYyhQZXJjXzQsIENlcnRfNCwgYW5zd2VyXzQsIFBvc2l0aW9uXzQsIERlcGFydG1lbnRfNCkpCgojQ3JlYXRpbmcgY29sdW1ucyAiYWN0aW9udGFrZW4xXzIiIGFuZCAiYWN0aW9udGFrZW4zXzQiIHdoaWNoIGNhcHR1cmUgaG93IGFuc3dlcnMgdG8gcXVlc3Rpb25zIGNoYW5nZWQgb3Igc3RheWVkIHN0YWJsZSBhY3Jvc3MgcmVjZXJ0aWZpY2F0aW9ucyAKZ29xdWVzICU+JQogIG11dGF0ZShhY3Rpb250YWtlbjFfMiA9IAogIGlmZWxzZShhbnN3ZXJfMSA9PSAiQWN0aW9uIE5lZWRlZCIgJiBhbnN3ZXJfMiA9PSAiWWVzIiwgImltcHJvdmVkIiwKICBpZmVsc2UoYW5zd2VyXzEgPT0gIlllcyIgJiBhbnN3ZXJfMiA9PSAiQWN0aW9uIE5lZWRlZCIsICJyZWdyZXNzZWQiLAogIGlmZWxzZShhbnN3ZXJfMSA9PSAiWWVzIiAmIGFuc3dlcl8yID09ICJZZXMiLCAieWVzX3N0YWJsZSIsCiAgaWZlbHNlKGFuc3dlcl8xID09ICJBY3Rpb24gTmVlZGVkIiAmIGFuc3dlcl8yID09ICJBY3Rpb24gTmVlZGVkIiwgImFjdGlvbl9zdGlsbF9uZWVkZWQiLCAKICBpZmVsc2UoYW5zd2VyXzEgPT0gIk4vQSIgJiBhbnN3ZXJfMiA9PSAiTi9BIiwgIm5vdF9hcHBsaWNhYmxlIiwgTkEpKSkpKSkgJT4lCiAgbXV0YXRlKGFjdGlvbnRha2VuMl8zID0KICBpZmVsc2UoYW5zd2VyXzIgPT0gIkFjdGlvbiBOZWVkZWQiICYgYW5zd2VyXzMgPT0gIlllcyIsICJpbXByb3ZlZCIsCiAgaWZlbHNlKGFuc3dlcl8yID09ICJZZXMiICYgYW5zd2VyXzMgPT0gIkFjdGlvbiBOZWVkZWQiLCAicmVncmVzc2VkIiwKICBpZmVsc2UoYW5zd2VyXzIgPT0gIlllcyIgJiBhbnN3ZXJfMyA9PSAiWWVzIiwgInllc19zdGFibGUiLAogIGlmZWxzZShhbnN3ZXJfMiA9PSAiQWN0aW9uIE5lZWRlZCIgJiBhbnN3ZXJfMyA9PSAiQWN0aW9uIE5lZWRlZCIsICJhY3Rpb25fc3RpbGxfbmVlZGVkIiwgCiAgaWZlbHNlKGFuc3dlcl8yID09ICJOL0EiICYgYW5zd2VyXzMgPT0gIk4vQSIsICJub3RfYXBwbGljYWJsZSIsIE5BKSkpKSkpICU+JQogIHJlbG9jYXRlKC4sIGMoYWN0aW9udGFrZW4xXzIsIGFjdGlvbnRha2VuMl8zKSwgLmFmdGVyPWFuc3dlcl8zKSAtPiBnb3F1ZXMKCiNBZGRpbmcgcXVlc3Rpb24gY2F0ZWdvcmllcwpnb3F1ZXMgJT4lIHVuZ3JvdXAoKSAlPiUgc2VsZWN0KHF1ZXN0aW9uKSAlPiUgZmlsdGVyKCFkdXBsaWNhdGVkKHF1ZXN0aW9uKSkgJT4lCiAgbXV0YXRlKHJvdyA9IHJvd19udW1iZXIoKSkgJT4lCiAgbXV0YXRlKHNlY3Rpb24gPSBpZmVsc2UoYmV0d2Vlbihyb3csIDEsIDExKSwgImVuZXJneSIsIAogICAgICAgICAgICAgICAgICAgaWZlbHNlKHJvdyA9PSAxMiwgIm1pc2MiLAogICAgICAgICAgICAgICAgICAgaWZlbHNlKGJldHdlZW4ocm93LCAxMywyNSksICJ3YXN0ZSIsCiAgICAgICAgICAgICAgICAgICBpZmVsc2UoYmV0d2Vlbihyb3csIDI2LCAzMiksICJyZWN5Y2xpbmciLAogICAgICAgICAgICAgICAgICAgaWZlbHNlKGJldHdlZW4ocm93LCAzMywgMzUpLCAidHJhbnNwb3J0YXRpb24iLAogICAgICAgICAgICAgICAgICAgaWZlbHNlKGJldHdlZW4ocm93LCAzNiwgNDIpLCAicHVyY2hhc2luZyIsCiAgICAgICAgICAgICAgICAgICBpZmVsc2Uocm93ID09IDQzLCAibWlzYyIsTkEpKSkpKSkpKSAtPiBxdWVzdGlvbnMKCnF1ZXN0aW9ucyAlPiUgc2VsZWN0KC1yb3cpICU+JSBsZWZ0X2pvaW4oZ29xdWVzLCAuKSAlPiUgcmVsb2NhdGUoLiwgc2VjdGlvbiwgLmFmdGVyPXF1ZXN0aW9uKSAtPiBnb3F1ZXMKYGBgCgoKYGBge3IgZ29xdWVzdGlkeSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGNvbW1lbnQ9IiJ9CiNnb3F1ZXN0aWR5IChEZXJpdmVkIGZyb20gZ29xdWVzLiBUaWR5IGRhdGFmcmFtZSB0aGF0IG9yZ2FuaXplcyBxdWVzdGlvbi1hbnN3ZXIgY29tYm9zIGFjcm9zcyBzdXJ2ZXl3YXZlcy4KCmdvcXVlcyAlPiUgZ3JvdXBfYnkocXVlc3Rpb24sIGFuc3dlcl8xKSAlPiUgY291bnQoKSAlPiUgCiAgcGl2b3Rfd2lkZXIoLiwgCiAgICAgICAgICBpZF9jb2xzPWMocXVlc3Rpb24sIGFuc3dlcl8xKSwKICAgICAgICAgIG5hbWVzX2Zyb209KGFuc3dlcl8xKSwKICAgICAgICAgIHZhbHVlc19mcm9tPWMobikpICU+JSAKICBtdXRhdGUoc3VydmV5b3JkZXIgPSAiMSIpIC0+IGdvcXVlczEKCmdvcXVlcyAlPiUgZ3JvdXBfYnkocXVlc3Rpb24sIGFuc3dlcl8yKSAlPiUgZmlsdGVyKCFpcy5uYShhbnN3ZXJfMikpICU+JSBjb3VudCgpICU+JSAKICBwaXZvdF93aWRlciguLCAKICAgICAgICAgIGlkX2NvbHM9YyhxdWVzdGlvbiwgYW5zd2VyXzIpLAogICAgICAgICAgbmFtZXNfZnJvbT0oYW5zd2VyXzIpLAogICAgICAgICAgdmFsdWVzX2Zyb209YyhuKSkgJT4lIAogIG11dGF0ZShzdXJ2ZXlvcmRlciA9ICIyIiktPiBnb3F1ZXMyCgpnb3F1ZXMgJT4lIGdyb3VwX2J5KHF1ZXN0aW9uLCBhbnN3ZXJfMykgJT4lIGZpbHRlcighaXMubmEoYW5zd2VyXzMpKSAlPiUgY291bnQoKSAlPiUgCiAgcGl2b3Rfd2lkZXIoLiwgCiAgICAgICAgICBpZF9jb2xzPWMocXVlc3Rpb24sIGFuc3dlcl8zKSwKICAgICAgICAgIG5hbWVzX2Zyb209KGFuc3dlcl8zKSwKICAgICAgICAgIHZhbHVlc19mcm9tPWMobikpICU+JSAKICBtdXRhdGUoc3VydmV5b3JkZXIgPSAiMyIpLT4gZ29xdWVzMwoKZ29xdWVzdGlkeSA8LSBmdWxsX2pvaW4oZ29xdWVzMSwgZ29xdWVzMikKCmdvcXVlc3RpZHkgPC0gZnVsbF9qb2luKGdvcXVlc3RpZHksIGdvcXVlczMpCgojQ2FsY3VsYXRpbmcgcXVlc3Rpb24tYW5zd2VyIGNvbWJvcyBhcyBhIHByb3BvcnRpb24gb2YgcGVvcGxlIHdobyB0b29rIHRoZSBzdXJ2ZXkgaW4gYSBnaXZlbiB3YXZlLiBXaXRoaW4gYSByb3csIHByb3BvcnRpb25zIGFyZSBlcXVpdmFsZW50IHRvIGNvdW50cywgYnV0IGFjcm9zcyBzdXJ2ZXkgd2F2ZXMsIHRoZXkgYXJlIG5vcm1hbGl6aW5nIGluIGNvbXBhcmlzb24gdG8gcmF3IGNvdW50cy4KCiNHZXR0aW5nIGNvdW50cyBvZiBwZW9wbGUgaW4gZWFjaCBzdXJ2ZXlvcmRlciB3YXZlLgpnb3N1cnYgJT4lIGdyb3VwX2J5KHN1cnZleW9yZGVyKSAlPiUgY291bnQoKSAtPiBzdXJ2ZXlvcmRlcnBlb3BsZQpzdXJ2ZXlvcmRlcnBlb3BsZSRzdXJ2ZXlvcmRlciA8LSBhcy5jaGFyYWN0ZXIoc3VydmV5b3JkZXJwZW9wbGUkc3VydmV5b3JkZXIpCgpnb3F1ZXN0aWR5ICU+JSBncm91cF9ieShzdXJ2ZXlvcmRlcikgJT4lIAogIGxlZnRfam9pbiguLCBzdXJ2ZXlvcmRlcnBlb3BsZSkgJT4lCiAgbXV0YXRlKGFuX3Byb3AgPSAocm91bmQoKChgQWN0aW9uIE5lZWRlZGAvbikqMTAwKSwyKSksCiAgICAgICAgIG5hX3Byb3AgPSAocm91bmQoKChgTi9BYC9uKSoxMDApLDIpKSwKICAgICAgICAgeWVzX3Byb3AgPSAocm91bmQoKChZZXMvbikqMTAwKSwyKSksCiAgICAgICAgIG5vX3Byb3AgPSAocm91bmQoKChOby9uKSoxMDApLDIpKSkgJT4lCiAgc2VsZWN0KC1uKSAtPiBnb3F1ZXN0aWR5CgojQWRkaW5nIHF1ZXN0aW9uIHNlY3Rpb25zCnF1ZXN0aW9ucyAlPiUgc2VsZWN0KC1yb3cpICU+JSBsZWZ0X2pvaW4oZ29xdWVzdGlkeSwgLikgJT4lIHJlbG9jYXRlKC4sIHNlY3Rpb24sIC5hZnRlcj1xdWVzdGlvbikgLT4gZ29xdWVzdGlkeQoKYGBgCgoKYGBge3IgZ29hY3QsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBjb21tZW50PSIifQojZ29hY3QgKERlcml2ZWQgZnJvbSBnb3F1ZXMuIEFuIGFnZ3JlZ2F0aW9uIG9mIGdvcXVlc3RpZHkgdG8gY3JlYXRlIHRoZSBsYXRlbnQgY29uc3RydWN0ICJhY3Rpb25fdGFrZW4iKS4KCmdvcXVlcyAlPiUgZmlsdGVyKCFpcy5uYShhY3Rpb250YWtlbjFfMikpICU+JSAKICAgICAgICAgICBncm91cF9ieShxdWVzdGlvbiwgYWN0aW9udGFrZW4xXzIpICU+JSAKICAgICAgICAgICBjb3VudCgpICU+JSAKICBwaXZvdF93aWRlciguLCAKICAgICAgICAgIGlkX2NvbHM9YyhxdWVzdGlvbiwgYWN0aW9udGFrZW4xXzIpLAogICAgICAgICAgbmFtZXNfZnJvbT0oYWN0aW9udGFrZW4xXzIpLAogICAgICAgICAgdmFsdWVzX2Zyb209YyhuKSkgJT4lIAogIG11dGF0ZShzdXJ2ZXlvcmRlciA9ICIxIHRvIDIiKSAtPiBnb2FjdDFfMgoKZ29xdWVzICU+JSBmaWx0ZXIoIWlzLm5hKGFjdGlvbnRha2VuMl8zKSkgJT4lIAogICAgICAgICAgIGdyb3VwX2J5KHF1ZXN0aW9uLCBhY3Rpb250YWtlbjJfMykgJT4lIAogICAgICAgICAgIGNvdW50KCkgJT4lIAogIHBpdm90X3dpZGVyKC4sIAogICAgICAgICAgaWRfY29scz1jKHF1ZXN0aW9uLCBhY3Rpb250YWtlbjJfMyksCiAgICAgICAgICBuYW1lc19mcm9tPShhY3Rpb250YWtlbjJfMyksCiAgICAgICAgICB2YWx1ZXNfZnJvbT1jKG4pKSAlPiUgCiAgbXV0YXRlKHN1cnZleW9yZGVyID0gIjIgdG8gMyIpIC0+IGdvYWN0Ml8zCgpnb2FjdCA8LSBmdWxsX2pvaW4oZ29hY3QxXzIsICBnb2FjdDJfMykKCiNDYWxjdWxhdGluZyBxdWVzdGlvbi1hbnN3ZXIgY29tYm9zIGFzIGEgcHJvcG9ydGlvbiBvZiBwZW9wbGUgd2hvIHRvb2sgdGhlIHN1cnZleSBhY3Jvc3Mgd2F2ZXMgMSB0byAyIGFuZCAyIHRvIDMuIFdpdGhpbiBhIHJvdywgcHJvcG9ydGlvbnMgYXJlIGVxdWl2YWxlbnQgdG8gY291bnRzLCBidXQgYWNyb3NzIHN1cnZleSB3YXZlcywgdGhleSBhcmUgbm9ybWFsaXppbmcgaW4gY29tcGFyaXNvbiB0byByYXcgY291bnRzLgoKI0dldHRpbmcgY291bnRzIG9mIHBlb3BsZSBpbiBlYWNoIHN1cnZleW9yZGVyIHdhdmUgYW5kIHJlbGFiZWxpbmcgc3VydmV5b3JkZXIgdmFsdWVzIHRvIGJldHRlciBpbmRpY2F0ZSBpdCBpcyBhIGNvbWJpbmF0aW9uIG9mIDEgYW5kIDIgb3IgMiBhbmQgMy4KZ29zdXJ2ICU+JSBmaWx0ZXIoc3VydmV5b3JkZXIgPT0gMiB8IHN1cnZleW9yZGVyID09IDMpICU+JSAKICBncm91cF9ieShzdXJ2ZXlvcmRlcikgJT4lIAogIGNvdW50KCkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3VydmV5b3JkZXIpLCAKICAgIGxpc3QofmNhc2Vfd2hlbigKICAgICAgLiA9PSAiMiIgfiAiMSB0byAyIiwKICAgICAgLiA9PSAiMyIgIH4gIjIgdG8gMyIsCiAgICAgIFRSVUUgfiAiTkEiKSkpIC0+IHN1cnZleW9yZGVycGVvcGxlMgoKZ29hY3QgJT4lIGdyb3VwX2J5KHN1cnZleW9yZGVyKSAlPiUgCiAgbGVmdF9qb2luKC4sIHN1cnZleW9yZGVycGVvcGxlMikgJT4lCiAgbXV0YXRlKGFzbl9wcm9wID0gKHJvdW5kKCgoYWN0aW9uX3N0aWxsX25lZWRlZC9uKSoxMDApLDIpKSwKICAgICAgICAgbmFfcHJvcCA9IChyb3VuZCgoKG5vdF9hcHBsaWNhYmxlL24pKjEwMCksMikpLAogICAgICAgICByZWdfcHJvcCA9IChyb3VuZCgoKHJlZ3Jlc3NlZC9uKSoxMDApLDIpKSwKICAgICAgICAgeWVzX3Byb3AgPSAocm91bmQoKCh5ZXNfc3RhYmxlL24pKjEwMCksMikpKSAlPiUKICBzZWxlY3QoLW4pIC0+IGdvYWN0CgojQWRkaW5nIHF1ZXN0aW9uIHNlY3Rpb25zCnF1ZXN0aW9ucyAlPiUgc2VsZWN0KC1yb3cpICU+JSBsZWZ0X2pvaW4oZ29hY3QsIC4pICU+JSByZWxvY2F0ZSguLCBzZWN0aW9uLCAuYWZ0ZXI9cXVlc3Rpb24pIC0+IGdvYWN0CgpgYGAKCgpgYGB7ciBnb3F1ZXNjZXJ0LCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgY29tbWVudD0iIn0KI2dvcXVlc2NlcnQgKERlcml2ZWQgZnJvbSBnb3F1ZXMuIEEgdmVyc2lvbiBvZiBnb3F1ZXN0aWR5IHRoYXQgZGlzYWdncmVnYXRlcyBhbnN3ZXIgY291bnRzIGJ5IGNlcnRpZmljYXRpb24gZm9yIGNvbXBhcmlzb24gd2l0aGluIGFuZCBhY3Jvc3Mgc3VydmV5IHdhdmVzLiBOb3RlIHRoYXQgdGhlcmUgYXJlIG9ubHkgNCAiYnJvbnplIiBjZXJ0aWZpY2F0aW9uIGxldmVscyBpbiBzdXJ2ZXlvcmRlciAyKS4KCiNDb3VudCBvZiBDZXJ0XzEgbGV2ZWxzIEtlZXBpbmcgcXVlcyBjb2x1bW4gZm9yIGxhdGVyIGpvaW4uCmdvcXVlcyAlPiUgZ3JvdXBfYnkocXVlc3Rpb24sIENlcnRfMSkgJT4lIGNvdW50KCkgJT4lIHJlbmFtZShjZXJ0X2NudCA9IG4pIC0+IHN1cnYxcHJvcAogCiNDb3VudCBvZiBhbnN3ZXJzICYgQ2VydF8xIGxldmVscyBmb3IgZWFjaCBxdWVzdGlvbiwgZGl2aWRlZCBieSB0b3RhbCBjZXJ0aWZpY2F0aW9ucyBmb3IgcHJvcG9ydGlvbi4KZ29xdWVzICU+JSBncm91cF9ieShxdWVzdGlvbiwgYW5zd2VyXzEsIENlcnRfMSkgJT4lIGNvdW50KCkgJT4lIHJlbmFtZShhbnN3ZXJjZXJ0X2NudCA9IG4pICU+JQogIGxlZnRfam9pbihzdXJ2MXByb3ApICU+JSBtdXRhdGUoY2VydHByb3AgPSAocm91bmQoKChhbnN3ZXJjZXJ0X2NudC9jZXJ0X2NudCkqMTAwKSwyKSkpICU+JSAKICByZW5hbWUoYW5zd2VyID0gYW5zd2VyXzEsIENlcnQgPSBDZXJ0XzEpICU+JSBtdXRhdGUoc3VydmV5b3JkZXIgPSAiMSIpIC0+IHF1ZXMxCgojQ291bnQgb2YgQ2VydF8yIGxldmVscyBLZWVwaW5nIHF1ZXMgY29sdW1uIGZvciBsYXRlciBqb2luLgpnb3F1ZXMgJT4lIGdyb3VwX2J5KHF1ZXN0aW9uLCBDZXJ0XzIpICU+JSBjb3VudCgpICU+JSByZW5hbWUoY2VydF9jbnQgPSBuKSAtPiBzdXJ2MnByb3AKIAojQ291bnQgb2YgYW5zd2VycyAmIENlcnRfMiBsZXZlbHMgZm9yIGVhY2ggcXVlc3Rpb24sIGRpdmlkZWQgYnkgdG90YWwgY2VydGlmaWNhdGlvbnMgZm9yIHByb3BvcnRpb24uCmdvcXVlcyAlPiUgZ3JvdXBfYnkocXVlc3Rpb24sIGFuc3dlcl8yLCBDZXJ0XzIpICU+JSBjb3VudCgpICU+JSByZW5hbWUoYW5zd2VyY2VydF9jbnQgPSBuKSAlPiUKICBsZWZ0X2pvaW4oc3VydjJwcm9wKSAlPiUgbXV0YXRlKGNlcnRwcm9wID0gKHJvdW5kKCgoYW5zd2VyY2VydF9jbnQvY2VydF9jbnQpKjEwMCksMikpKSAlPiUgCiAgcmVuYW1lKGFuc3dlciA9IGFuc3dlcl8yLCBDZXJ0ID0gQ2VydF8yKSAlPiUgbXV0YXRlKHN1cnZleW9yZGVyID0gIjIiKSAlPiUgZmlsdGVyKCFpcy5uYShDZXJ0KSkgLT4gcXVlczIKCgojUmFua2luZyBxdWVzMSBhbmQgcXVlczIgcXVlc3Rpb24tYW5zd2VyIHByb3BvcnRpb25zIGJ5IGNlcnQgbGV2ZWwKIyMjI3F1ZXMxIHJhbmtpbmcjIyMjCnF1ZXMxICU+JSAKICB1bmdyb3VwKCkgJT4lIGZpbHRlcihDZXJ0ID09ICJCUk9OWkUiKSAlPiUKICAgIGdyb3VwX2J5KGFuc3dlcikgJT4lCiAgICBtdXRhdGUocWFyYW5rID0gb3JkZXIob3JkZXIoYW5zd2VyLCBjZXJ0cHJvcCwgZGVjcmVhc2luZz1UUlVFKSkpICU+JQogICAgYXJyYW5nZShhbnN3ZXIsIHFhcmFuaykgLT4gYnJvbnplcmFuazEKCnF1ZXMxICU+JQogIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKENlcnQgPT0gIlNJTFZFUiIpICU+JQogICAgZ3JvdXBfYnkoYW5zd2VyKSAlPiUKICAgIG11dGF0ZShxYXJhbmsgPSBvcmRlcihvcmRlcihhbnN3ZXIsIGNlcnRwcm9wLCBkZWNyZWFzaW5nPVRSVUUpKSkgJT4lCiAgICBhcnJhbmdlKGFuc3dlciwgcWFyYW5rKSAtPiBzaWx2ZXJyYW5rMQoKcXVlczEgJT4lCiAgdW5ncm91cCgpICU+JSBmaWx0ZXIoQ2VydCA9PSAiR09MRCIpICU+JQogICAgZ3JvdXBfYnkoYW5zd2VyKSAlPiUKICAgIG11dGF0ZShxYXJhbmsgPSBvcmRlcihvcmRlcihhbnN3ZXIsIGNlcnRwcm9wLCBkZWNyZWFzaW5nPVRSVUUpKSkgJT4lCiAgICBhcnJhbmdlKGFuc3dlciwgcWFyYW5rKS0+IGdvbGRyYW5rMQoKZnVsbF9qb2luKGJyb256ZXJhbmsxLCBzaWx2ZXJyYW5rMSkgJT4lIGZ1bGxfam9pbiguLCBnb2xkcmFuazEpIC0+IHF1ZXMxCgojIyMjcXVlczIgcmFua2luZyMjIyMKcXVlczIgJT4lIAogIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKENlcnQgPT0gIkJST05aRSIpICU+JQogICAgZ3JvdXBfYnkoYW5zd2VyKSAlPiUKICAgIG11dGF0ZShxYXJhbmsgPSBvcmRlcihvcmRlcihhbnN3ZXIsIGNlcnRwcm9wLCBkZWNyZWFzaW5nPVRSVUUpKSkgJT4lCiAgICBhcnJhbmdlKGFuc3dlciwgcWFyYW5rKSAtPiBicm9uemVyYW5rMgoKcXVlczIgJT4lCiAgdW5ncm91cCgpICU+JSBmaWx0ZXIoQ2VydCA9PSAiU0lMVkVSIikgJT4lCiAgICBncm91cF9ieShhbnN3ZXIpICU+JQogICAgbXV0YXRlKHFhcmFuayA9IG9yZGVyKG9yZGVyKGFuc3dlciwgY2VydHByb3AsIGRlY3JlYXNpbmc9VFJVRSkpKSAlPiUKICAgIGFycmFuZ2UoYW5zd2VyLCBxYXJhbmspIC0+IHNpbHZlcnJhbmsyCgpxdWVzMiAlPiUKICB1bmdyb3VwKCkgJT4lIGZpbHRlcihDZXJ0ID09ICJHT0xEIikgJT4lCiAgICBncm91cF9ieShhbnN3ZXIpICU+JQogICAgbXV0YXRlKHFhcmFuayA9IG9yZGVyKG9yZGVyKGFuc3dlciwgY2VydHByb3AsIGRlY3JlYXNpbmc9VFJVRSkpKSAlPiUKICAgIGFycmFuZ2UoYW5zd2VyLCBxYXJhbmspLT4gZ29sZHJhbmsyCgpmdWxsX2pvaW4oYnJvbnplcmFuazIsIHNpbHZlcnJhbmsyKSAlPiUgZnVsbF9qb2luKC4sIGdvbGRyYW5rMikgLT4gcXVlczIKCiMjIyNKb2luaW5nIyMjIwpmdWxsX2pvaW4ocXVlczEsIHF1ZXMyKSAtPiBxdWVzMV8yCgojQWRkaW5nIHF1ZXN0aW9uIHNlY3Rpb25zCnF1ZXN0aW9ucyAlPiUgc2VsZWN0KC1yb3cpICU+JSBsZWZ0X2pvaW4ocXVlczFfMiwgLikgJT4lIHJlbG9jYXRlKC4sIHNlY3Rpb24sIC5hZnRlcj1xdWVzdGlvbikgLT4gZ29xdWVzY2VydAoKYGBgCgoKCmBgYHtyIGNvYWxlc2NlX2pvaW4sIGVycm9yPUZBTFNFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCAgY29tbWVudD0iIn0KY29hbGVzY2Vfam9pbiA8LSBmdW5jdGlvbih4LCB5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IE5VTEwsIHN1ZmZpeCA9IGMoIi54IiwgIi55IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gPSBkcGx5cjo6ZnVsbF9qb2luLCAuLi4pIHsKICAgIGpvaW5lZCA8LSBqb2luKHgsIHksIGJ5ID0gYnksIHN1ZmZpeCA9IHN1ZmZpeCwgLi4uKQogICAgIyBuYW1lcyBvZiBkZXNpcmVkIG91dHB1dAogICAgY29scyA8LSB1bmlvbihuYW1lcyh4KSwgbmFtZXMoeSkpCiAgICAKICAgIHRvX2NvYWxlc2NlIDwtIG5hbWVzKGpvaW5lZClbIW5hbWVzKGpvaW5lZCkgJWluJSBjb2xzXQogICAgc3VmZml4X3VzZWQgPC0gc3VmZml4W2lmZWxzZShlbmRzV2l0aCh0b19jb2FsZXNjZSwgc3VmZml4WzFdKSwgMSwgMildCiAgICAjIHJlbW92ZSBzdWZmaXhlcyBhbmQgZGVkdXBsaWNhdGUKICAgIHRvX2NvYWxlc2NlIDwtIHVuaXF1ZShzdWJzdHIoCiAgICAgICAgdG9fY29hbGVzY2UsIAogICAgICAgIDEsIAogICAgICAgIG5jaGFyKHRvX2NvYWxlc2NlKSAtIG5jaGFyKHN1ZmZpeF91c2VkKQogICAgKSkKICAgIAogICAgY29hbGVzY2VkIDwtIHB1cnJyOjptYXBfZGZjKHRvX2NvYWxlc2NlLCB+ZHBseXI6OmNvYWxlc2NlKAogICAgICAgIGpvaW5lZFtbcGFzdGUwKC54LCBzdWZmaXhbMV0pXV0sIAogICAgICAgIGpvaW5lZFtbcGFzdGUwKC54LCBzdWZmaXhbMl0pXV0KICAgICkpCiAgICBuYW1lcyhjb2FsZXNjZWQpIDwtIHRvX2NvYWxlc2NlCiAgICAKICAgIGRwbHlyOjpiaW5kX2NvbHMoam9pbmVkLCBjb2FsZXNjZWQpW2NvbHNdCn0KYGBgCgpgYGB7ciBQc2V1ZG8tZXhhbXBsZSwgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCAgY29tbWVudD0iIn0KCiNFeGFtcGxlOiAncGVyc29uJyBpcyBzaW11bGF0ZWQgZGF0YSwgY29udiBzdG9yZXMgc29tZSBiYXNpYyBrbm93biB2YWx1ZXMgd2Ugd2FudCB0byB1c2UgZm9yIHF1YW50aWZpY2F0aW9uIGNvbnZlcnNpb25zLCByZXN0IGlzIGRvbmUgd2l0aCBtdXRhdGUuCgpwZXJzb24gPC0gcmVhZF94bHN4KGhlcmUoIkdPX0NvbnZlcnNpb25zLnhsc3giKSwgc2hlZXQ9MykKY29udiA8LSByZWFkX3hsc3goaGVyZSgiR09fQ29udmVyc2lvbnMueGxzeCIpLCBzaGVldD0yKQoKcXVhbnQgPC0gY29hbGVzY2Vfam9pbihwZXJzb24sIGNvbnYsIGJ5ID0gJ3R5cGUnKQoKI0NvbnZlcnNpb24gTXV0YXRpb25zCgpxdWFudCAlPiUgbXV0YXRlKHN0YW5kYnlfaG91cnNfZHkgPSA4IC0gYWN0aXZlX2hvdXJzX2R5LAogICAgICAgICAgICAgICAgIGt3aF9hY3RpdmVfZHkgPSAoKGFjdGl2ZV93YXR0cyphY3RpdmVfaG91cnNfZHkpLzEwMDApLAogICAgICAgICAgICAgICAgIGt3aF9zdGFuZGJ5X2R5ID0gKChzdGFuZGJ5X3dhdHRzKnN0YW5kYnlfaG91cnNfZHkpLzEwMDApLAogICAgICAgICAgICAgICAgIGt3aF9keSA9IGt3aF9hY3RpdmVfZHkra3doX3N0YW5kYnlfZHksCiAgICAgICAgICAgICAgICAga3doX3drID0gaWZlbHNlKHR5cGUgPT0gYygiaW5jYW5kZXNjZW50IiwgImhhbG9nZW4iLCAiY2ZsIiwgImxlZCIsICJjb21wdXRlciIsICJtb25pdG9yIiwgInBlcnNvbmFsX3ByaW50ZXIiLCJvdGhlcl9lbGVjIiksIGt3aF9keSo1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHlwZSA9PSAiZ2xhc3MiLAogICAgICAgICAgICAgICAgICAgICAgKChgd2VpZ2h0IChsYnMpYCp2YWx1ZV93aykvMjAwMCkqa3doX3Blcl90b24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gImFsdW1pbnVtIiwKICAgICAgICAgICAgICAgICAgICAgICgoYHdlaWdodCAobGJzKWAqdmFsdWVfd2spLzIwMDApKmt3aF9wZXJfdG9uLCAjdGhpcyBjYW4gYmUgY2xlYW5lZCB3aXRoIGFuICclaW4lJwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eXBlID09ICJwbGFzdGljIiwKICAgICAgICAgICAgICAgICAgICAgICgoYHdlaWdodCAobGJzKWAqdmFsdWVfd2spLzIwMDApKmt3aF9wZXJfdG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eXBlID09ICJjYXJkYm9hcmQiLAogICAgICAgICAgICAgICAgICAgICAgKChgd2VpZ2h0IChsYnMpYCp2YWx1ZV93aykvMjAwMCkqa3doX3Blcl90b24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gInBhcGVyIiwKICAgICAgICAgICAgICAgICAgICAgICgoYHdlaWdodCAobGJzKWAqdmFsdWVfd2spLzIwMDApKmt3aF9wZXJfdG9uLCBOQSkpKSkpKSkgLT4gcXVhbnQKCnF1YW50ICU+JSBtdXRhdGUoZ2FsbG9uc19vaWxfd2sgPSBrd2hfd2svNDMuOSwKICAgICAgICAgICAgICAgICBrZ19DTzJfd2sgPSAoKChnYWxsb25zX29pbF93ay80MikqMC40MykqMTAwMCkpIC0+IHF1YW50CgoKCmBgYAoKYGBge3IgQXNzdW1wdGlvbiBOb3RlcywgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCAgY29tbWVudD0iIn0KI1BzdWVkby1yZWFsIGV4YW1wbGUuIFVzaW5nIGdvcXVlc3RpZHksIHdoaWNoIGlzIGFnZ3JlZ2F0ZWQgZGF0YSwgdG8gZ2V0IG5ldCBpbXBhY3QgaW4gYSBoeXBvdGhldGljYWwgeWVhciBpZiBhbGwgcGFydGljaXBhbnRzIHRvb2sgc3VydmV5IGF0IHNhbWUgdGltZS4gTmVlZCB0byB1c2UgZ29xdWVzIHdpdGggYSBsb29wIG92ZXIgbW9udGgveWVhciBvZiBlbnRyeSB0byBnZXQgb3Zlci10aW1lIGNhbGN1bGF0aW9ucy4KCiNSZWxldmFudCBRdWVzdGlvbnM6CiNDb3VudCBvZiBsaWdodGJ1bGJzIGFuZCBraW5kIG9mIGxpZ2h0YnVsYnMKIyJBbGwgb2YgbXkgdGFzayBsaWdodGluZyAoaW5jbHVkaW5nIGZsb29yIGFuZCBkZXNrIGxhbXBzKSB1c2VzIGVpdGhlciBMRUQgb3IgQ0ZMLCBidXQgbm8gaW5jYW5kZXNjZW50IGxpZ2h0IGJ1bGJzLiIKIy0+IElmIFllcywgV2lsbCBqdXN0IGFzc3VtZSB0aGV5IGFyZSBhbGwgdXNpbmcgMiBMRURzLiBJZiBBY3Rpb24gTmVlZGVkLCB3aWxsIGp1c3QgYXNzdW1lIHVzaW5nIDIgaW5jYW5kZXNjZW50cy4KCiNXYXR0YWdlIG9mIGNvbXB1dGVyIGFuZCBtb25pdG9yIGFuZCBwZXJzb25hbCBwcmludGVyIGFuZCDigJxvdGhlciBlbGVjdHJvbmljc+KAnQojIk15IGNvbXB1dGVyIG1vbml0b3IgaXMgc2V0IHRvIHNsZWVwIGFmdGVyIDEwIG1pbnV0ZXMgb3IgbGVzcyIKIy0+IElmIFllcywgZG8gKDggLSBhc3N1bWVkIDYgYWN0aXZlX2hvdXJzX2R5KSArIC4xNjYgKHRlbiBtaW51dGVzKSA9IGFjdGl2ZV9ob3Vyc19keSBhbmQgc3RhbmRieV9ob3Vyc19keSA9IDAKCiMiSSBzaHV0IG9mZiBteSBwZXJzb25hbCBwcmludGVyIHdoZW4gbm90IGluIHVzZSIKIy0+IElmIFllcywgc3RhbmRieV9ob3Vyc19keSA9IDAKCiNBbW91bnQgb2YgcmVjeWNsaW5nIGZvciBlYWNoIG1hdGVyaWFsCiMiSSByZWN5Y2xlIGFsbCBib3R0bGVzIGFuZCBjYW5zIHRoYXQgSSBjb21lIGFjcm9zcyBpbiB0aGUgb2ZmaWNlLiIKIy0+IElmIFllcywgd2lsbCBqdXN0IGFzc3VtZSAxIHBsYXN0aWMgYm90dGxlIC93awoKIyJJIHJlY3ljbGUgYWxsIGNhcmRib2FyZCB0aGF0IEkgY29tZSBhY3Jvc3MgaW4gdGhlIG9mZmljZS4iCiMtPiBJZiBZZXMsIHdpbGwganVzdCBhc3N1bWUgMSBjYXJkYm9hcmQgYm94IC8gd2sKCiNBbW91bnQgb2YgcGFwZXIgdXNlZAojIkkgcmVjeWNsZSBhbGwgb2ZmaWNlIHBhcGVyLiIKIy0+IElmIFllcywgdmFsdWVfd2sgZm9yIHR5cGUgPT0gInBhcGVyIiBzdGF5cyBzYW1lLCBpZmVsc2UsIHZhbHVlX3drIGZvciB0eXBlID09ICJwYXBlciIgaXMgIjAiLgoKI05vdGUgdGhhdCBJIHN0aWxsIG5lZWQgdG8gZGV2ZWxvcCBjb2x1bW5zIHRoYXQgY2FwdHVyZXMgdXNhZ2UgaW5kZXBlbmRlbnQgb2Ygc3VzdGFpbmFibGUgYWN0aW9uLiBOdW1iZXIgb2YgcGllY2VzIG9mIHBhcGVyIHVzZWQsIGJvdHRsZXMgZHJ1bmssIGV0Yy4gQmVjYXVzZSBvZiB0aGUgbGFyZ2UgYW1vdW50IG9mIGFzc3VtcHRpb25zIEknbSB1c2luZyBoZXJlLCBJJ20gc3RpY2tpbmcgd2l0aCBxdWFudGl0aWVzIHRoYXQgbWF0Y2ggdGhlIHN1c3RhaW5hYmlsaXR5IHF1ZXN0aW9ucy4gRm9yIGV4YW1wbGUsICJJIHJlY3ljbGUgYWxsIHBhcGVyIiB0aGUgdmFsdWVfd2sgaXMgcGllY2VzIG9mIHBhcGVyIHJlY3ljbGVkLiBOb3QgbWFraW5nIGEgY2xhaW0gb24gcGFwZXIgdXNlZCBieSB0aG9zZSB3aG8gZG9uJ3QgZG8gdGhpcy4KYGBgCgpgYGB7ciBXcmFuZ2xpbmcsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgIGNvbW1lbnQ9IiJ9CmdvcXVlcyAlPiUgZmlsdGVyKHF1ZXN0aW9uID09ICJBbGwgb2YgbXkgdGFzayBsaWdodGluZyAoaW5jbHVkaW5nIGZsb29yIGFuZCBkZXNrIGxhbXBzKSB1c2VzIGVpdGhlciBMRUQgb3IgQ0ZMLCBidXQgbm8gaW5jYW5kZXNjZW50IGxpZ2h0IGJ1bGJzLiIgfAogICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24gPT0gIk15IGNvbXB1dGVyIG1vbml0b3IgaXMgc2V0IHRvIHNsZWVwIGFmdGVyIDEwIG1pbnV0ZXMgb3IgbGVzcy4iIHwKICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uID09ICJJIHNodXQgb2ZmIG15IHBlcnNvbmFsIHByaW50ZXIgd2hlbiBub3QgaW4gdXNlLiIgfAogICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24gPT0gIkkgcmVjeWNsZSBhbGwgYm90dGxlcyBhbmQgY2FucyB0aGF0IEkgY29tZSBhY3Jvc3MgaW4gdGhlIG9mZmljZS4iIHwKICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uID09ICAiSSByZWN5Y2xlIGFsbCBjYXJkYm9hcmQgdGhhdCBJIGNvbWUgYWNyb3NzIGluIHRoZSBvZmZpY2UuIiB8CiAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiA9PSAiSSByZWN5Y2xlIGFsbCBvZmZpY2UgcGFwZXIuIikgJT4lCiAgc2VsZWN0KGBOVSBJRGAsIHF1ZXN0aW9uLCBzZWN0aW9uLCBhbnN3ZXJfMSkgLT4gZ29xdWFudAoKI0FkZGluZyBjb2x1bW5zIGZyb20gJ3BlcnNvbicgc2ltdWxhdGVkIGRhdGEKZ29xdWFudFtjKCJ0eXBlIiwgInZhbHVlIiwgInZhbHVlX3drIiwgImFjdGl2ZV93YXR0cyIsICJzdGFuZGJ5X3dhdHRzIiwgImFjdGl2ZV9ob3Vyc19keSIsICJzdGFuZGJ5X2hvdXJzX2R5IildIDwtIE5BCgojbGlnaHRidWxicwpnb3F1YW50ICU+JSBtdXRhdGUodHlwZSA9IGlmZWxzZShxdWVzdGlvbiA9PSAiQWxsIG9mIG15IHRhc2sgbGlnaHRpbmcgKGluY2x1ZGluZyBmbG9vciBhbmQgZGVzayBsYW1wcykgdXNlcyBlaXRoZXIgTEVEIG9yIENGTCwgYnV0IG5vIGluY2FuZGVzY2VudCBsaWdodCBidWxicy4iICYgYW5zd2VyXzEgPT0gIlllcyIsICJsZWQiLCAKICAgICAgICAgICAgaWZlbHNlKHF1ZXN0aW9uID09ICJBbGwgb2YgbXkgdGFzayBsaWdodGluZyAoaW5jbHVkaW5nIGZsb29yIGFuZCBkZXNrIGxhbXBzKSB1c2VzIGVpdGhlciBMRUQgb3IgQ0ZMLCBidXQgbm8gaW5jYW5kZXNjZW50IGxpZ2h0IGJ1bGJzLiIgJiBhbnN3ZXJfMSA9PSAiQWN0aW9uIE5lZWRlZCIsICJpbmNhbmRlc2NlbnQiLCBOQSkpKSAtPiBnb3F1YW50Cgpnb3F1YW50ICU+JSBtdXRhdGUodmFsdWUgPSBpZmVsc2UodHlwZSA9PSAibGVkIiwgMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eXBlID09ICJpbmNhbmRlc2NlbnQiLCAyLCB0eXBlKSkpIC0+IGdvcXVhbnQKCmdvcXVhbnQgJT4lIG11dGF0ZShhY3RpdmVfd2F0dHMgPSBpZmVsc2UodHlwZSA9PSAibGVkIiwgOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHlwZSA9PSAiaW5jYW5kZXNjZW50IiwgNjAsIGFjdGl2ZV93YXR0cykpKSAtPiBnb3F1YW50CmdvcXVhbnQgJT4lIG11dGF0ZShzdGFuZGJ5X3dhdHRzID0gaWZlbHNlKHR5cGUgPT0gImxlZCIsIDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gImluY2FuZGVzY2VudCIsIDAsIHN0YW5kYnlfd2F0dHMpKSkgLT4gZ29xdWFudAoKZ29xdWFudCAlPiUgbXV0YXRlKGFjdGl2ZV9ob3Vyc19keSA9IGlmZWxzZShxdWVzdGlvbiA9PSAiQWxsIG9mIG15IHRhc2sgbGlnaHRpbmcgKGluY2x1ZGluZyBmbG9vciBhbmQgZGVzayBsYW1wcykgdXNlcyBlaXRoZXIgTEVEIG9yIENGTCwgYnV0IG5vIGluY2FuZGVzY2VudCBsaWdodCBidWxicy4iLCA4LCBhY3RpdmVfaG91cnNfZHkpKSAtPiBnb3F1YW50CmdvcXVhbnQgJT4lIG11dGF0ZShzdGFuZGJ5X2hvdXJzX2R5ID0gaWZlbHNlKHF1ZXN0aW9uID09ICJBbGwgb2YgbXkgdGFzayBsaWdodGluZyAoaW5jbHVkaW5nIGZsb29yIGFuZCBkZXNrIGxhbXBzKSB1c2VzIGVpdGhlciBMRUQgb3IgQ0ZMLCBidXQgbm8gaW5jYW5kZXNjZW50IGxpZ2h0IGJ1bGJzLiIsIDgtIGFjdGl2ZV9ob3Vyc19keSwgc3RhbmRieV9ob3Vyc19keSkpIC0+IGdvcXVhbnQKCiNjb21wdXRlciBtb25pdG9yCmdvcXVhbnQgJT4lIG11dGF0ZSh0eXBlID0gaWZlbHNlKHF1ZXN0aW9uID09ICJNeSBjb21wdXRlciBtb25pdG9yIGlzIHNldCB0byBzbGVlcCBhZnRlciAxMCBtaW51dGVzIG9yIGxlc3MuIiwibW9uaXRvciIsIHR5cGUpKSAtPiBnb3F1YW50Cgpnb3F1YW50ICU+JSBtdXRhdGUoYWN0aXZlX3dhdHRzID0gaWZlbHNlKHR5cGUgPT0gIm1vbml0b3IiLCA0NSwgYWN0aXZlX3dhdHRzKSkgLT4gZ29xdWFudApnb3F1YW50ICU+JSBtdXRhdGUoc3RhbmRieV93YXR0cyA9IGlmZWxzZSh0eXBlID09ICJtb25pdG9yIiwgNCwgc3RhbmRieV93YXR0cykpIC0+IGdvcXVhbnQKZ29xdWFudCAlPiUgbXV0YXRlKGFjdGl2ZV9ob3Vyc19keSA9IGlmZWxzZSh0eXBlID09ICJtb25pdG9yIiwgNiwgYWN0aXZlX2hvdXJzX2R5KSkgLT4gZ29xdWFudAoKZ29xdWFudCAlPiUgbXV0YXRlKHN0YW5kYnlfaG91cnNfZHkgPSBpZmVsc2UodHlwZSA9PSAibW9uaXRvciIgJiBhbnN3ZXJfMSA9PSAiWWVzIiwgMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHlwZSA9PSAibW9uaXRvciIgJiBhbnN3ZXJfMSA9PSAiQWN0aW9uIE5lZWRlZCIsIDgtYWN0aXZlX2hvdXJzX2R5LCBzdGFuZGJ5X2hvdXJzX2R5KSkpIC0+IGdvcXVhbnQKCiNwZXJzb25hbCBwcmludGVyIChoZXJlIG5lZWQgdG8gYWNjb3VudCBmb3Igd2hldGhlciB0aGV5IGhhdmUgb25lIG9yIG5vdCkKZ29xdWFudCAlPiUgbXV0YXRlKHR5cGUgPSBpZmVsc2UocXVlc3Rpb24gPT0gIkkgc2h1dCBvZmYgbXkgcGVyc29uYWwgcHJpbnRlciB3aGVuIG5vdCBpbiB1c2UuIiwgInByaW50ZXIiLCB0eXBlKSkgLT4gZ29xdWFudAoKZ29xdWFudCAlPiUgbXV0YXRlKGFjdGl2ZV93YXR0cyA9IGlmZWxzZSh0eXBlID09ICJwcmludGVyIiAmIGFuc3dlcl8xICE9ICJOL0EiLCA0MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHlwZSA9PSAicHJpbnRlciIgJiBhbnN3ZXJfMSA9PSAiTi9BIiwgMCwgYWN0aXZlX3dhdHRzKSkpIC0+IGdvcXVhbnQKICAgICAgICAgICAgICAgICAgIApnb3F1YW50ICU+JSBtdXRhdGUoc3RhbmRieV93YXR0cyA9IGlmZWxzZSh0eXBlID09ICJwcmludGVyIiAmIGFuc3dlcl8xICE9ICJOL0EiLCA0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eXBlID09ICJwcmludGVyIiAmIGFuc3dlcl8xID09ICJOL0EiLCAwLCBzdGFuZGJ5X3dhdHRzKSkpIC0+IGdvcXVhbnQgICAgICAgICAgICAgICAgICAgCmdvcXVhbnQgJT4lIG11dGF0ZShhY3RpdmVfaG91cnNfZHkgPSBpZmVsc2UodHlwZSA9PSAicHJpbnRlciIgJiBhbnN3ZXJfMSAhPSAiTi9BIiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eXBlID09ICJwcmludGVyIiAmIGFuc3dlcl8xID09ICJOL0EiLCAwLCBhY3RpdmVfaG91cnNfZHkpKSkgLT4gZ29xdWFudAoKZ29xdWFudCAlPiUgbXV0YXRlKHN0YW5kYnlfaG91cnNfZHkgPSBpZmVsc2UodHlwZSA9PSAicHJpbnRlciIgJiBhbnN3ZXJfMSA9PSAiWWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgCiAgICAgICAgICAgICAgICAgICBpZmVsc2UodHlwZSA9PSAicHJpbnRlciIgJiBhbnN3ZXJfMSA9PSAiQWN0aW9uIE5lZWRlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIDgtYWN0aXZlX2hvdXJzX2R5LCAKICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eXBlID09ICJwcmludGVyIiAmIGFuc3dlcl8xID09ICJOL0EiLCAwLCBzdGFuZGJ5X2hvdXJzX2R5KSkpKSAtPiBnb3F1YW50CgojQm90dGxlcyBhbmQgQ2FucyBSZWN5Y2xpbmcKZ29xdWFudCAlPiUgbXV0YXRlKHR5cGUgPSBpZmVsc2UocXVlc3Rpb24gPT0gIkkgcmVjeWNsZSBhbGwgYm90dGxlcyBhbmQgY2FucyB0aGF0IEkgY29tZSBhY3Jvc3MgaW4gdGhlIG9mZmljZS4iLCAicGxhc3RpYyIsIHR5cGUpKSAtPiBnb3F1YW50Cgpnb3F1YW50ICU+JSBtdXRhdGUodmFsdWVfd2sgPSBpZmVsc2UodHlwZSA9PSAicGxhc3RpYyIsIDEsIHZhbHVlX3drKSkgLT4gZ29xdWFudAoKI0NhcmRib2FyZCBSZWN5Y2xpbmcKZ29xdWFudCAlPiUgbXV0YXRlKHR5cGUgPSBpZmVsc2UocXVlc3Rpb24gPT0gIkkgcmVjeWNsZSBhbGwgY2FyZGJvYXJkIHRoYXQgSSBjb21lIGFjcm9zcyBpbiB0aGUgb2ZmaWNlLiIsICJjYXJkYm9hcmQiLCB0eXBlKSkgLT4gZ29xdWFudAoKZ29xdWFudCAlPiUgbXV0YXRlKHZhbHVlX3drID0gaWZlbHNlKHR5cGUgPT0gImNhcmRib2FyZCIsIDEsIHZhbHVlX3drKSkgLT4gZ29xdWFudAoKI1BhcGVyIFJlY3ljbGluZwpnb3F1YW50ICU+JSBtdXRhdGUodHlwZSA9IGlmZWxzZShxdWVzdGlvbiA9PSAiSSByZWN5Y2xlIGFsbCBvZmZpY2UgcGFwZXIuIiwgInBhcGVyIiwgdHlwZSkpIC0+IGdvcXVhbnQKCmdvcXVhbnQgJT4lIG11dGF0ZSh2YWx1ZV93ayA9IGlmZWxzZSh0eXBlID09ICJwYXBlciIgJiBhbnN3ZXJfMSA9PSAiWWVzIiAsIDI1LCB2YWx1ZV93aykpIC0+IGdvcXVhbnQKCmBgYAoKYGBge3IgQ29udmVyc2lvbnMsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgIGNvbW1lbnQ9IiJ9CnF1YW50IDwtIGNvYWxlc2NlX2pvaW4oZ29xdWFudCwgY29udiwgYnkgPSAndHlwZScpCgpxdWFudCAlPiUgbXV0YXRlKGt3aF9hY3RpdmVfZHkgPSAoKGFjdGl2ZV93YXR0cyphY3RpdmVfaG91cnNfZHkpLzEwMDApLAogICAgICAgICAgICAgICAgIGt3aF9zdGFuZGJ5X2R5ID0gKChzdGFuZGJ5X3dhdHRzKnN0YW5kYnlfaG91cnNfZHkpLzEwMDApLAogICAgICAgICAgICAgICAgIGt3aF9keSA9IGt3aF9hY3RpdmVfZHkra3doX3N0YW5kYnlfZHksCiAgICAgICAgICAgICAgICAga3doX3drID0gaWZlbHNlKHR5cGUgPT0gYygiaW5jYW5kZXNjZW50IiwgImxlZCIsICJtb25pdG9yIiwicHJpbnRlciIpLCBrd2hfZHkqNSwgTkEpKSAtPiBxdWFudAoKcXVhbnQgJT4lIG11dGF0ZShrd2hfd2sgPSBpZmVsc2UodHlwZSA9PSAicGFwZXIiLAogICAgICAgICAgICAgICAgICAgICAgKChgd2VpZ2h0IChsYnMpYCp2YWx1ZV93aykvMjAwMCkqa3doX3Blcl90b24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gInBsYXN0aWMiLAogICAgICAgICAgICAgICAgICAgICAgKChgd2VpZ2h0IChsYnMpYCp2YWx1ZV93aykvMjAwMCkqa3doX3Blcl90b24sICN0aGlzIGNhbiBiZSBjbGVhbmVkIHdpdGggYW4gJyVpbiUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gImNhcmRib2FyZCIsIAogICAgICAgICAgICAgICAgICAgICAgKChgd2VpZ2h0IChsYnMpYCp2YWx1ZV93aykvMjAwMCkqa3doX3Blcl90b24sIGt3aF9keSo1KSkpKSAtPiBxdWFudAoKcXVhbnQgJT4lIG11dGF0ZShnYWxsb25zX29pbF93ayA9IGt3aF93ay80My45LAogICAgICAgICAgICAgICAgIGtnX0NPMl93ayA9ICgoKGdhbGxvbnNfb2lsX3drLzQyKSowLjQzKSoxMDAwKSkgLT4gcXVhbnQKYGBgCgpgYGB7ciAjQWdncmVnYXRpb24sIGVjaG89RkFMU0UsIGZpZy5zaG93PSdoaWRlJywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgIGNvbW1lbnQ9IiJ9CiNBZ2dyZWdhdGlvbgpxdWFudCAlPiUgZ3JvdXBfYnkocXVlc3Rpb24sIGFuc3dlcl8xKSAlPiUKICBzdW1tYXJpemUoa3doX3lyX3N1bSA9IHJvdW5kKChzdW0oa3doX3drKSo0OCksMiksCiAgICAgICAgICAgIGt3aF95cl9tbiA9IG1lYW4oa3doX3drKSo0OCwKICAgICAgICAgICAgZ2FsbG9uc19vaWxfeXJfc3VtID0gcm91bmQoKHN1bShnYWxsb25zX29pbF93aykqNDgpLDIpLAogICAgICAgICAgICBnYWxsb25zX29pbF95cl9tbiA9IHJvdW5kKChtZWFuKGdhbGxvbnNfb2lsX3drKSo0OCksMiksCiAgICAgICAgICAgIGtnX0NPMl95cl9zdW0gPSByb3VuZCgoc3VtKGtnX0NPMl93aykqNDgpLDIpLAogICAgICAgICAgICBrZ19DTzJfeXJfbW4gPSByb3VuZCgobWVhbihrZ19DTzJfd2spKjQ4KSwyKSkgLT4gcXVhbnRhZ2cKCnF1YW50YWdnICU+JSBwaXZvdF9sb25nZXIoYygzOjgpLCBuYW1lc190bz0ibWV0cmljIiwgdmFsdWVzX3RvPSJ2YWx1ZSIpIC0+IHF1YW50YWdnCmBgYAoKIyBRdWFudGlmaXlpbmcgRW52aXJvbm1lbnRhbCBJbXBhY3Qgb2YgdGhlIEdyZWVuIE9mZmljZSBDaGFsbGVuZ2UuCgpUaGUgZm9sbG93aW5nIHF1YW50aWZpZXMgdGhlICh0aGVvcmV0aWNhbCkgZW52aXJvbm1lbnRhbCBpbXBhY3Qgb2Ygc2l4IHF1ZXN0aW9ucyBmcm9tIHRoZSBHcmVlbiBPZmZpY2UgQ2hhbGxlbmdlLiBJdCBpcyBhIGNvbWJpbmF0aW9uIG9mIHJlYXNvbmFibGUgYXNzdW1wdGlvbnMgKGUuZy4gd2F0dHMgZm9yIGFuIGF2ZXJhZ2UgY29tcHV0ZXIgbW9uaXRvcikgd2l0aCBHcmVlbiBPZmZpY2Ugc3VydmV5IGRhdGEgKGUuZy4gbnVtYmVyIG9mIHBlb3BsZSB3aG8gc2F5ICJZZXMiIHRvIGhhdmluZyB0aGVpciBtb25pdG9yIHNldCB0byBzbGVlcCBhZnRlciAxMCBtaW51dGVzKS4gQSBudW1iZXIgb2YgY29udmVyc2lvbnMgd2VyZSB0aGVuIGNhbGN1bGF0ZWQgdG8gZXN0aW1hdGUgdGhlIGltcGFjdCBvbiBLaWxvd2F0dCBIb3VycyBvZiBFbGVjdHJpY2l0eSwgR2FsbG9ucyBvZiBPaWwsIGFuZCBLaWxvZ3JhbXMgb2YgQ08yIGZvciBhIDQ4LXdlZWsgeWVhcgoKVGhlIHN1cnZleSBkYXRhIGNvbnRhaW5zIDQ4MyBwYXJ0aWNpcGFudHMgYW5kIGlzIHN1YnNldCB0byBqdXN0IHRoZWlyIGZpcnN0IHN1cnZleS4gVGhlIHJlc3VsdGFudCBjYWxjdWxhdGlvbnMgYXJlLCBpbiBlZmZlY3QsIHRoZSB0aGVvcmV0aWNhbCBlbnZpcm9ubWVudGFsIGltcGFjdCBvdmVyIG9uZSB5ZWFyIGlmIGFsbCA0ODMgcGFydGljaXBhbnRzIHRvb2sgdGhlIHN1cnZleSBhdCB0aGUgc2FtZSB0aW1lLgoKXAoKCiMjIERhdGFmcmFtZXMKXAoKQmVsb3cgaXMgdGhlIGRhdGFmcmFtZSAoVGFibGUgMSkgZm9yIHdoaWNoIGFsbCBmb2xsb3dpbmcgdmlzdWFsaXphdGlvbnMgYXJlIHJlZmVyZW5jZWQuIFRvIGRpdmUgZGVlcGVyIGludG8gaG93IGl0IHdhcyBjcmVhdGVkLCBzZWxlY3QgIlNob3cgQWxsIENvZGUiIHVuZGVybmVhdGggdGhlICJDb2RlIiBidXR0b24gaW4gdGhlIHRvcC1yaWdodCBvZiB0aGlzIGRvY3VtZW50LiAKCkVhY2ggcm93IGNvcnJlc3BvbmRzIHRvIGEgdW5pcXVlIHF1ZXN0aW9uIGFuZCBhbnN3ZXJfMSBjb21iaW5hdGlvbi4gVGhlIG90aGVyIGNvbHVtbnMgaWxsdXN0cmF0ZSB0aGUgdmFyaW91cyBhc3N1bXB0aW9ucyB1c2VkIGluIHRoaXMgcHJvamVjdC4gRm9yIGV4YW1wbGUsIGluIHRoZSBxdWVzdGlvbiwgIkFsbCBvZiBteSB0YXNrIGxpZ2h0aW5nIChpbmNsdWRpbmcgZmxvb3IgYW5kIGRlc2sgbGFtcHMpIHVzZXMgZWl0aGVyIExFRCBvciBDRkwsIGJ1dCBubyBpbmNhbmRlc2NlbnQgbGlnaHQgYnVsYnMuIiwgd2hlbiB0aGUgY29sdW1uICJhbnN3ZXJfMSIgaXMgIlllcyIgdGhlIGNvbHVtbiAidHlwZSIgaGFzIGEgdmFsdWUgb2YgImxlZCIgYW5kIHdoZW4gdGhlIGNvbHVtbiAiYW5zd2VyXzEiIGlzICJBY3Rpb24gTmVlZGVkIiwgdGhlIGNvbHVtbiAidHlwZSIgaGFzIGEgdmFsdWUgb2YgImluY2FuZGVzY2VudCIuIEZ1cnRoZXJtb3JlLCB0aGUgInZhbHVlIiBjb2x1bW4gZm9yIHRob3NlIGxpZ2h0YnVsYiB0eXBlcyBhcmUgYm90aCAiMiIsIGluZGljYXRpbmcgdGhhdCBhbGwgb3RoZXIgY2FsY3VsYXRpb25zIGZvciB0aGF0IHF1ZXN0aW9uIGFzc3VtZXMgYSBwYXJ0aWNpcGFudCBoYXMgZWl0aGVyIDIgaW5jYW5kZXNjZW50IG9yIGxlZCBsaWdodGJ1bGJzIGluIHRoZWlyIHdvcmtzdGF0aW9uLgoKU2V2ZXJhbCBvZiB0aGUgb3RoZXIgcXVlc3Rpb25zIGFsc28gdXNlIHNpbWlsYXIgc2ltcGx5aWZpbmcgYXNzdW1wdGlvbnMsIGdpdmVuIHRoYXQgdGhlIGFjdHVhbCBkYXRhIGlzIHVua25vd24uIEZvciBleGFtcGxlLCBpbiB0aGUgcXVlc3Rpb24gIkkgcmVjeWNsZSBhbGwgYm90dGxlcyBhbmQgY2FucyB0aGF0IEkgY29tZSBhY3Jvc3MgaW4gdGhlIG9mZmljZS4iLCBJIGFzc3VtZSB0aGUgInR5cGUiIG9mIHJlY3ljbGVkIG9iamVjdCB0byBiZSBhIHBsYXN0aWMgYm90dGxlIGFuZCB0aGF0IHBhcnRpY2lwYW50cyB3aG8gYW5zd2VyZWQgIlllcyIgcmVjeWNsZSBqdXN0IDIgb2YgdGhlc2UgYSB3ZWVrLgoKR2F0aGVyaW5nIHRoZSBhY3R1YWwgaW5mb3JtYXRpb24gZnJvbSBhbGwgcHJldmlvdXMgR3JlZW4gT2ZmaWNlIHBhcnRpY2lwYW50cyB3aWxsIGFsbG93IG11Y2ggbW9yZSBwcmVjaXNlIGFuZCBpbi1kZXB0aCBjYWxjdWxhdGlvbnMgZm9yIHRoZSBxdWVzdGlvbnMgaW4gdGhpcyBwcm9qZWN0IGFuZCBzZXZlcmFsIG90aGVycyBmcm9tIHRoZSBsYXJnZXIgR3JlZW4gT2ZmaWNlIFN1cnZleS4gCgpBbGwgb3RoZXIgZGF0YSBhc3N1bXB0aW9ucyAoZS5nLiB3ZWlnaHQgKGxicykgcGVyIHR5cGUgb2YgcmVjeWNsYWJsZSBtYXRlcmlhbCkgb3IgY29udmVyc2lvbnMgKGUuZy4ga3doX3drIHRvIGdhbGxvbnNfb2lsX3drKSBjb21lIGZyb20gYXV0aG9yaXRhdGl2ZSBzb3VyY2VzIHN1Y2ggYXMgdGhlIEVQQS4KClRhYmxlIDE6CmBgYHtyIHF1YW50LCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLH0KCnF1YW50ICU+JSBzZWxlY3QoLWBOVSBJRGApIC0+IHF1YW50X2xpdGUKcXVhbnRfbGl0ZVshZHVwbGljYXRlZChxdWFudF9saXRlKSxdCgoKYGBgCgpTdXBwbGVtZW50aW5nIFRhYmxlIDEsIHRoaXMgZGF0YWZyYW1lIChUYWJsZSAxKSBzaG93cyB0aGUgY291bnRzIG9mIGRpZmZlcmVudCBhbnN3ZXJzIGZvciBlYWNoIG9mIHRoZSBzaXggcXVlc3Rpb25zIGV4YW1pbmVkIGluIHRoaXMgcHJvamVjdC4gVGhlc2UgY291bnRzIHdlcmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGVudmlyb25tZW50YWwgaW1wYWN0IG9mIHRob3NlIHdobyBkbyB0YWtlIHRoZSByZWZlcmVuY2UgYWN0aW9uIChpLmUuICJZZXMiKSBhbmQgdGhvc2Ugd2hvIGRvIG5vdCAoaS5lLiAiQWN0aW9uIE5lZWRlZCIpLiAKClRhYmxlIDI6CmBgYHtyIHF1YW50IGFuc3dlciBjb3VudCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KCmdvcXVlc3RpZHkgJT4lIHNlbGVjdChxdWVzdGlvbiwgYEFjdGlvbiBOZWVkZWRgLCBgTi9BYCwgWWVzKSAlPiUgdW5ncm91cCgpICU+JQpzZW1pX2pvaW4oLiwgcXVhbnQgJT4lIHNlbGVjdChxdWVzdGlvbikpICU+JSBmaWx0ZXIoc3VydmV5b3JkZXI9PTEpICU+JSBzZWxlY3QoLXN1cnZleW9yZGVyKQoKYGBgCgpcCgoKIyBUZWNobm9sb2dpY2FsIEFkanVzdG1lbnQgUXVlc3Rpb25zIGFuZCBWaXN1YWxpemF0aW9ucwpcCgpUaHJlZSBUZWNobm9sb2d5LXJlbGF0ZWQgcXVlc3Rpb25zIGZyb20gdGhlIEdyZWVuIE9mZmljZSBTdXJ2ZXkgbGVuZCB0aGVtc2VsdmVzIHRvIHF1YW50aWZpY2F0aW9uOgoKMS4gIkFsbCBvZiBteSB0YXNrIGxpZ2h0aW5nIChpbmNsdWRpbmcgZmxvb3IgYW5kIGRlc2sgbGFtcHMpIHVzZXMgZWl0aGVyIExFRCBvciBDRkwsIGJ1dCBubyBpbmNhbmRlc2NlbnQgbGlnaHQgYnVsYnMuIgoyLiAiSSBzaHV0IG9mZiBteSBwZXJzb25hbCBwcmludGVyIHdoZW4gbm90IGluIHVzZS4iCjMuICJNeSBjb21wdXRlciBtb25pdG9yIGlzIHNldCB0byBzbGVlcCBhZnRlciAxMCBtaW51dGVzIG9yIGxlc3MuIgoKVGhlIGtleSBhc3N1bXB0aW9ucyBmb3IgdGhlc2UgcXVlc3Rpb25zIGFyZSB0aGUgV2F0dHMgb2YgZWxlY3RyaWNpdHkgdXNlZCB3aGVuIGEgZGV2aWNlIGlzIGFjdGl2ZSBhbmQgaW4gc3RhbmRieSBhcyB3ZWxsIGFzIHRoZSBudW1iZXIgb2YgaG91cnMgZm9yIGVhY2guIFRoaXMgYWxsb3dzIGZvciB0aGUgY2FsY3VsYXRpb24gb2YgS2lsb3dhdHQgaG91cnMgcGVyIGRheSBhbmQgYnkgZXh0ZW5zaW9uIEtpbG93YXR0IGhvdXJzIHBlciB3ZWVrIGFuZCBwZXIgeWVhci4gVGhlIGV4YWN0IGFzc3VtcHRpb25zIHVzZWQgY2FuIGJlIHNlZW4gaW4gVGFibGUgMSwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGRldmljZSBhbmQgdGhlIGFuc3dlciBnaXZlbiB0byB0aGUgcXVlc3Rpb24uCgpCZWxvdyBpcyB0aGUgdmlzdWFsaXplZCBpbXBhY3Qgb2YgZWFjaCBvZiB0aGVzZSAiVGVjaG5vbG9naWNhbCBBZGp1c3RtZW50IiBxdWVzdGlvbnMgZnJvbSB0aGUgYXNzdW1wdGlvbnMgaW4gVGFibGUgMSByZWxhdGl2ZSB0byB0aGUgY291bnQgb2YgYW5zd2VyIHR5cGUgZnJvbSBUYWJsZSAyOgoKCmBgYHtyIFRlY2ggdml4IGV4cCwgZWNobz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9IDUsIGZpZy53aWR0aD0xMCwgZHBpPTk2LCBldmFsPUZBTFNFfQojRmFjZXRlZApxdWFudGFnZyAlPiUgdW5ncm91cCgpICU+JSBtdXRhdGUocXVlcyA9IHN0cl90cnVuYyhxdWFudGFnZyRxdWVzdGlvbiwgODAsICJyaWdodCIsIGVsbGlwc2lzID0gIi0iKSkgJT4lIGZpbHRlcihxdWVzdGlvbiA9PSAiQWxsIG9mIG15IHRhc2sgbGlnaHRpbmcgKGluY2x1ZGluZyBmbG9vciBhbmQgZGVzayBsYW1wcykgdXNlcyBlaXRoZXIgTEVEIG9yIENGTCwgYnV0IG5vIGluY2FuZGVzY2VudCBsaWdodCBidWxicy4iIHwKICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uID09ICJNeSBjb21wdXRlciBtb25pdG9yIGlzIHNldCB0byBzbGVlcCBhZnRlciAxMCBtaW51dGVzIG9yIGxlc3MuIiB8CiAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiA9PSAiSSBzaHV0IG9mZiBteSBwZXJzb25hbCBwcmludGVyIHdoZW4gbm90IGluIHVzZS4iKSAlPiUKICBmaWx0ZXIoYW5zd2VyXzEhPSJOL0EiKSAlPiUKICBmaWx0ZXIobWV0cmljID09ICJrd2hfeXJfbW4iIHxtZXRyaWMgPT0gICJnYWxsb25zX29pbF95cl9tbiIgfG1ldHJpYyA9PSAgImtnX0NPMl95cl9tbiIpICU+JSAKICBnZ3Bsb3QoLiwgYWVzKHZhbHVlLCBxdWVzLCBmaWxsPWFuc3dlcl8xKSkgKyBnZW9tX2NvbChwb3NpdGlvbj0iZG9kZ2UiKSsKICBmYWNldF9yZXBfd3JhcCh+bWV0cmljLHNjYWxlcz0iZnJlZV94Iixucm93PTIpICsKZ2VvbV90ZXh0KAogICAgYWVzKGxhYmVsID0gdmFsdWUpLCAKICAgIGhqdXN0ID0gMSwgc2l6ZSA9IDgsCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSksCiAgICBpbmhlcml0LmFlcyA9IFRSVUUpKyAKICBsYWJzKHRpdGxlID0gIk1lYW4gS2lsb3dhdHQgSG91cnMvWWVhciBieSBUZWNoLiBBZGp1c3RtZW50IikrCiAgICAgICB4bGFiKCJNZWFuIEtpbG93YXR0IEhvdXJzL1llYXIiKSsKICAgICAgIHlsYWIoIiIpKwp0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyLjgpLCBhbmdsZSA9IDAwKSkgKwp0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyLjgpLCBhbmdsZSA9IDAwKSkgKwp0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQ9MywgZmFjZT0iYm9sZCIsIGNvbG9yPSJibGFjayIsIHNpemU9MjUpKSArCnRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMDAsIGhqdXN0ID0gMSwgc2l6ZT0gcmVsKDIuOCkpKSArCnRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMDAsIGhqdXN0ID0gMSwgc2l6ZT0gcmVsKDIuOCkpKQoKCmBgYAoKYGBge3IgVGVjaCwgZWNobz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9IDUsIGZpZy53aWR0aD0xMCwgZHBpPTk2fQpxdWFudGFnZyAlPiUgdW5ncm91cCgpICU+JSBtdXRhdGUocXVlcyA9IHN0cl90cnVuYyhxdWFudGFnZyRxdWVzdGlvbiwgODAsICJyaWdodCIsIGVsbGlwc2lzID0gIi0iKSkgJT4lIGZpbHRlcihxdWVzdGlvbiA9PSAiQWxsIG9mIG15IHRhc2sgbGlnaHRpbmcgKGluY2x1ZGluZyBmbG9vciBhbmQgZGVzayBsYW1wcykgdXNlcyBlaXRoZXIgTEVEIG9yIENGTCwgYnV0IG5vIGluY2FuZGVzY2VudCBsaWdodCBidWxicy4iIHwKICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uID09ICJNeSBjb21wdXRlciBtb25pdG9yIGlzIHNldCB0byBzbGVlcCBhZnRlciAxMCBtaW51dGVzIG9yIGxlc3MuIiB8CiAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiA9PSAiSSBzaHV0IG9mZiBteSBwZXJzb25hbCBwcmludGVyIHdoZW4gbm90IGluIHVzZS4iKSAlPiUKICBmaWx0ZXIoYW5zd2VyXzEhPSJOL0EiKSAlPiUKICBmaWx0ZXIobWV0cmljID09ICJrd2hfeXJfbW4iKSAlPiUgZ2dwbG90KC4sIGFlcyh2YWx1ZSwgcXVlcywgZmlsbD1hbnN3ZXJfMSkpICsgZ2VvbV9jb2wocG9zaXRpb249ImRvZGdlIikrCmdlb21fdGV4dCgKICAgIGFlcyhsYWJlbCA9IHZhbHVlKSwgCiAgICBoanVzdCA9IDEsIHNpemUgPSA4LAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLAogICAgaW5oZXJpdC5hZXMgPSBUUlVFKSsgCiAgbGFicyh0aXRsZSA9ICJNZWFuIEtpbG93YXR0IEhvdXJzL1llYXIgYnkgVGVjaC4gQWRqdXN0bWVudCIpKwogICAgICAgeGxhYigiTWVhbiBLaWxvd2F0dCBIb3Vycy9ZZWFyIikrCiAgICAgICB5bGFiKCIiKSsKdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMi44KSwgYW5nbGUgPSAwMCkpICsKdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMi44KSwgYW5nbGUgPSAwMCkpICsKdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTMsIGZhY2U9ImJvbGQiLCBjb2xvcj0iYmxhY2siLCBzaXplPTI1KSkgKwp0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBoanVzdCA9IDEsIHNpemU9IHJlbCgyLjgpKSkgKwp0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBoanVzdCA9IDEsIHNpemU9IHJlbCgyLjgpKSkKCnF1YW50YWdnICU+JSB1bmdyb3VwKCkgJT4lIG11dGF0ZShxdWVzID0gc3RyX3RydW5jKHF1YW50YWdnJHF1ZXN0aW9uLCA4MCwgInJpZ2h0IiwgZWxsaXBzaXMgPSAiLSIpKSAlPiUgZmlsdGVyKHF1ZXN0aW9uID09ICJBbGwgb2YgbXkgdGFzayBsaWdodGluZyAoaW5jbHVkaW5nIGZsb29yIGFuZCBkZXNrIGxhbXBzKSB1c2VzIGVpdGhlciBMRUQgb3IgQ0ZMLCBidXQgbm8gaW5jYW5kZXNjZW50IGxpZ2h0IGJ1bGJzLiIgfAogICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24gPT0gIk15IGNvbXB1dGVyIG1vbml0b3IgaXMgc2V0IHRvIHNsZWVwIGFmdGVyIDEwIG1pbnV0ZXMgb3IgbGVzcy4iIHwKICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uID09ICJJIHNodXQgb2ZmIG15IHBlcnNvbmFsIHByaW50ZXIgd2hlbiBub3QgaW4gdXNlLiIpICU+JQogIGZpbHRlcihhbnN3ZXJfMSE9Ik4vQSIpICU+JQogIGZpbHRlcihtZXRyaWMgPT0gImdhbGxvbnNfb2lsX3lyX21uIikgJT4lIGdncGxvdCguLCBhZXModmFsdWUsIHF1ZXMsIGZpbGw9YW5zd2VyXzEpKSArIGdlb21fY29sKHBvc2l0aW9uPSJkb2RnZSIpKwpnZW9tX3RleHQoCiAgICBhZXMobGFiZWwgPSB2YWx1ZSksIAogICAgaGp1c3QgPSAxLCBzaXplID0gOCwKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwKICAgIGluaGVyaXQuYWVzID0gVFJVRSkrIAogIGxhYnModGl0bGUgPSAiTWVhbiBHYWxsb25zIG9mIE9pbC9ZZWFyIGJ5IFRlY2guIEFkanVzdG1lbnQiKSsKICAgICAgIHhsYWIoIk1lYW4gR2FsbG9ucyBvZiBPaWwvWWVhciIpKwogICAgICAgeWxhYigiIikrCnRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIuOCksIGFuZ2xlID0gMDApKSArCnRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIuOCksIGFuZ2xlID0gMDApKSArCnRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQobGluZWhlaWdodD0zLCBmYWNlPSJib2xkIiwgY29sb3I9ImJsYWNrIiwgc2l6ZT0yNSkpICsKdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwMCwgaGp1c3QgPSAxLCBzaXplPSByZWwoMi44KSkpICsKdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwMCwgaGp1c3QgPSAxLCBzaXplPSByZWwoMi44KSkpCgpxdWFudGFnZyAlPiUgdW5ncm91cCgpICU+JSBtdXRhdGUocXVlcyA9IHN0cl90cnVuYyhxdWFudGFnZyRxdWVzdGlvbiwgODAsICJyaWdodCIsIGVsbGlwc2lzID0gIi0iKSkgJT4lIGZpbHRlcihxdWVzdGlvbiA9PSAiQWxsIG9mIG15IHRhc2sgbGlnaHRpbmcgKGluY2x1ZGluZyBmbG9vciBhbmQgZGVzayBsYW1wcykgdXNlcyBlaXRoZXIgTEVEIG9yIENGTCwgYnV0IG5vIGluY2FuZGVzY2VudCBsaWdodCBidWxicy4iIHwKICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uID09ICJNeSBjb21wdXRlciBtb25pdG9yIGlzIHNldCB0byBzbGVlcCBhZnRlciAxMCBtaW51dGVzIG9yIGxlc3MuIiB8CiAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiA9PSAiSSBzaHV0IG9mZiBteSBwZXJzb25hbCBwcmludGVyIHdoZW4gbm90IGluIHVzZS4iKSAlPiUKICBmaWx0ZXIoYW5zd2VyXzEhPSJOL0EiKSAlPiUKICBmaWx0ZXIobWV0cmljID09ICJrZ19DTzJfeXJfbW4iKSAlPiUgZ2dwbG90KC4sIGFlcyh2YWx1ZSwgcXVlcywgZmlsbD1hbnN3ZXJfMSkpICsgZ2VvbV9jb2wocG9zaXRpb249ImRvZGdlIikrCmdlb21fdGV4dCgKICAgIGFlcyhsYWJlbCA9IHZhbHVlKSwgCiAgICBoanVzdCA9IDEsIHNpemUgPSA4LAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLAogICAgaW5oZXJpdC5hZXMgPSBUUlVFKSsgCiAgbGFicyh0aXRsZSA9ICJNZWFuIEtpbG9ncmFtcyBvZiBDTzIvWWVhciBieSBUZWNoLiBBZGp1c3RtZW50IikrCiAgICAgICB4bGFiKCJNZWFuIEtpbG9ncmFtcyBvZiBDTzIvWWVhciIpKwogICAgICAgeWxhYigiIikrCnRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIuOCksIGFuZ2xlID0gMDApKSArCnRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIuOCksIGFuZ2xlID0gMDApKSArCnRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQobGluZWhlaWdodD0zLCBmYWNlPSJib2xkIiwgY29sb3I9ImJsYWNrIiwgc2l6ZT0yNSkpICsKdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwMCwgaGp1c3QgPSAxLCBzaXplPSByZWwoMi44KSkpICsKdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwMCwgaGp1c3QgPSAxLCBzaXplPSByZWwoMi44KSkpCmBgYAoKXAoKCiMgUmVjeWNsaW5nIFF1ZXN0aW9ucyBhbmQgVmlzdWFsaXphdGlvbnMKXAoKVGhyZWUgUmVjeWNsaW5nLXJlbGF0ZWQgcXVlc3Rpb25zIGZyb20gdGhlIEdyZWVuIE9mZmljZSBTdXJ2ZXkgbGVuZCB0aGVtc2VsdmVzIHRvIHF1YW50aWZpY2F0aW9uOgoKMS4gIkkgcmVjeWNsZSBhbGwgYm90dGxlcyBhbmQgY2FucyB0aGF0IEkgY29tZSBhY3Jvc3MgaW4gdGhlIG9mZmljZS4iCjIuICJJIHJlY3ljbGUgYWxsIGNhcmRib2FyZCB0aGF0IEkgY29tZSBhY3Jvc3MgaW4gdGhlIG9mZmljZS4iCjMuICJJIHJlY3ljbGUgYWxsIG9mZmljZSBwYXBlci4iCgpUaGUga2V5IGFzc3VtcHRpb25zIGZvciB0aGVzZSBxdWVzdGlvbnMgYXJlIHRoZSB0eXBlIG9mIHJlY3ljbGVkIG1hdGVyaWFsIGFuZCB0aGUgcXVhbnRpdHkgcmVjeWNsZWQgaW4gYSB3ZWVrLiBUaGUgZXhhY3QgYXNzdW1wdGlvbnMgdXNlZCBjYW4gYmUgc2VlbiBpbiBUYWJsZSAxLiBXaGVyZSB0eXBlIGlzICJwbGFzdGljIiwgImNhcmRib2FyZCIsIG9yICJwYXBlciwgd2VpZ2h0IChsYnMpIGlzIGJhc2VkIG9uIEVQQSBkYXRhIGZvciBhIDIwIGZsIG96IGJvdHRsZSwgYSAyJyBieSAyJyBieSAyJyBjYXJkYm9hcmQgYm94LCAzbW0sIGFuZCBhIHN0YW5kYXJkIHNoZWV0IG9mIHByaW50ZXIgcGFwZXIsIHJlc3BlY3RpdmVseS4KCkJlbG93IGlzIHRoZSB2aXN1YWxpemVkIGltcGFjdCBvZiBlYWNoIG9mIHRoZXNlICJSZWN5Y2xpbmciIHF1ZXN0aW9ucyBmcm9tIHRoZSBhc3N1bXB0aW9ucyBpbiBUYWJsZSAxIHJlbGF0aXZlIHRvIHRoZSBjb3VudCBvZiBhbnN3ZXIgdHlwZSBmcm9tIFRhYmxlIDI6CgpgYGB7ciBSZWN5Y2xpbmcsIGVjaG89RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PSA1LCBmaWcud2lkdGg9MTAsIGRwaT05Nn0KI1JlY3ljbGluZwpxdWFudGFnZyAlPiUgdW5ncm91cCgpICU+JSBtdXRhdGUocXVlcyA9IHN0cl90cnVuYyhxdWFudGFnZyRxdWVzdGlvbiwgODAsICJyaWdodCIsIGVsbGlwc2lzID0gIi0iKSkgJT4lIGZpbHRlcihxdWVzdGlvbiA9PSAiSSByZWN5Y2xlIGFsbCBib3R0bGVzIGFuZCBjYW5zIHRoYXQgSSBjb21lIGFjcm9zcyBpbiB0aGUgb2ZmaWNlLiIgfAogICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24gPT0gICJJIHJlY3ljbGUgYWxsIGNhcmRib2FyZCB0aGF0IEkgY29tZSBhY3Jvc3MgaW4gdGhlIG9mZmljZS4iIHwKICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uID09ICJJIHJlY3ljbGUgYWxsIG9mZmljZSBwYXBlci4iKSAlPiUKICBmaWx0ZXIoYW5zd2VyXzE9PSJZZXMiKSAlPiUKICBmaWx0ZXIobWV0cmljID09ICJrd2hfeXJfc3VtIikgJT4lIGdncGxvdCguLCBhZXModmFsdWUsIHF1ZXMsIGZpbGw9YW5zd2VyXzEpKSArIGdlb21fY29sKHBvc2l0aW9uPSJkb2RnZSIpKwpnZW9tX3RleHQoCiAgICBhZXMobGFiZWwgPSB2YWx1ZSksIAogICAgaGp1c3QgPSAxLCBzaXplID0gNywKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwKICAgIGluaGVyaXQuYWVzID0gVFJVRSkrIAogIGxhYnModGl0bGUgPSAiU3VtIEtpbG93YXR0IEhvdXJzL1llYXIgU2F2ZWQgYnkgUmVjeWNsaW5nIikrCiAgICAgICB4bGFiKCJTdW0gS2lsb3dhdHQgSG91cnMvWWVhciIpKwogICAgICAgeWxhYigiIikrCnRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIuOCksIGFuZ2xlID0gMDApKSArCnRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIuOCksIGFuZ2xlID0gMDApKSArCnRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQobGluZWhlaWdodD0zLCBmYWNlPSJib2xkIiwgY29sb3I9ImJsYWNrIiwgc2l6ZT0yNSkpICsKdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwMCwgaGp1c3QgPSAxLCBzaXplPSByZWwoMi44KSkpICsKdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwMCwgaGp1c3QgPSAxLCBzaXplPSByZWwoMi44KSkpCgpxdWFudGFnZyAlPiUgdW5ncm91cCgpICU+JSBtdXRhdGUocXVlcyA9IHN0cl90cnVuYyhxdWFudGFnZyRxdWVzdGlvbiwgODAsICJyaWdodCIsIGVsbGlwc2lzID0gIi0iKSkgJT4lIGZpbHRlcihxdWVzdGlvbiA9PSAiSSByZWN5Y2xlIGFsbCBib3R0bGVzIGFuZCBjYW5zIHRoYXQgSSBjb21lIGFjcm9zcyBpbiB0aGUgb2ZmaWNlLiIgfAogICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24gPT0gICJJIHJlY3ljbGUgYWxsIGNhcmRib2FyZCB0aGF0IEkgY29tZSBhY3Jvc3MgaW4gdGhlIG9mZmljZS4iIHwKICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uID09ICJJIHJlY3ljbGUgYWxsIG9mZmljZSBwYXBlci4iKSAlPiUKICBmaWx0ZXIoYW5zd2VyXzE9PSJZZXMiKSAlPiUKICBmaWx0ZXIobWV0cmljID09ICJnYWxsb25zX29pbF95cl9zdW0iKSAlPiUgZ2dwbG90KC4sIGFlcyh2YWx1ZSwgcXVlcywgZmlsbD1hbnN3ZXJfMSkpICsgZ2VvbV9jb2wocG9zaXRpb249ImRvZGdlIikrCmdlb21fdGV4dCgKICAgIGFlcyhsYWJlbCA9IHZhbHVlKSwgCiAgICBoanVzdCA9IDEsIHNpemUgPSA3LAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLAogICAgaW5oZXJpdC5hZXMgPSBUUlVFKSsgCiAgbGFicyh0aXRsZSA9ICJTdW0gR2FsbG9ucyBvZiBPaWwvWWVhciBTYXZlZCBieSBSZWN5Y2xpbmciKSsKICAgICAgIHhsYWIoIlN1bSBHYWxsb25zIG9mIE9pbC9ZZWFyIikrCiAgICAgICB5bGFiKCIiKSsKdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMi44KSwgYW5nbGUgPSAwMCkpICsKdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMi44KSwgYW5nbGUgPSAwMCkpICsKdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTMsIGZhY2U9ImJvbGQiLCBjb2xvcj0iYmxhY2siLCBzaXplPTI1KSkgKwp0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBoanVzdCA9IDEsIHNpemU9IHJlbCgyLjgpKSkgKwp0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBoanVzdCA9IDEsIHNpemU9IHJlbCgyLjgpKSkKCnF1YW50YWdnICU+JSB1bmdyb3VwKCkgJT4lIG11dGF0ZShxdWVzID0gc3RyX3RydW5jKHF1YW50YWdnJHF1ZXN0aW9uLCA4MCwgInJpZ2h0IiwgZWxsaXBzaXMgPSAiLSIpKSAlPiUgZmlsdGVyKHF1ZXN0aW9uID09ICJJIHJlY3ljbGUgYWxsIGJvdHRsZXMgYW5kIGNhbnMgdGhhdCBJIGNvbWUgYWNyb3NzIGluIHRoZSBvZmZpY2UuIiB8CiAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiA9PSAgIkkgcmVjeWNsZSBhbGwgY2FyZGJvYXJkIHRoYXQgSSBjb21lIGFjcm9zcyBpbiB0aGUgb2ZmaWNlLiIgfAogICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24gPT0gIkkgcmVjeWNsZSBhbGwgb2ZmaWNlIHBhcGVyLiIpICU+JQogIGZpbHRlcihhbnN3ZXJfMT09IlllcyIpICU+JQogIGZpbHRlcihtZXRyaWMgPT0gImtnX0NPMl95cl9zdW0iKSAlPiUgZ2dwbG90KC4sIGFlcyh2YWx1ZSwgcXVlcywgZmlsbD1hbnN3ZXJfMSkpICsgZ2VvbV9jb2wocG9zaXRpb249ImRvZGdlIikrCmdlb21fdGV4dCgKICAgIGFlcyhsYWJlbCA9IHZhbHVlKSwgCiAgICBoanVzdCA9IDEsIHNpemUgPSA3LAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLAogICAgaW5oZXJpdC5hZXMgPSBUUlVFKSsgCiAgbGFicyh0aXRsZSA9ICJTdW0gS2lsb2dyYW1zIG9mIENPMi9ZZWFyIFNhdmVkIGJ5IFJlY3ljbGluZyIpKwogICAgICAgeGxhYigiU3VtIEtpbG9ncmFtcyBvZiBDTzIvWWVhciIpKwogICAgICAgeWxhYigiIikrCnRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIuOCksIGFuZ2xlID0gMDApKSArCnRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIuOCksIGFuZ2xlID0gMDApKSArCnRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQobGluZWhlaWdodD0zLCBmYWNlPSJib2xkIiwgY29sb3I9ImJsYWNrIiwgc2l6ZT0yNSkpICsKdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwMCwgaGp1c3QgPSAxLCBzaXplPSByZWwoMi44KSkpICsKdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwMCwgaGp1c3QgPSAxLCBzaXplPSByZWwoMi44KSkpCmBgYAoKXAoKCiMgVGltZSBTZXJpZXMKXAoKQmVsb3cgaXMgYSB0aW1lIHNlcmllcyB2aXN1YWxpemF0aW9uIG9mIHRoZSBlbnZpcm9ubWVudGFsIGltcGFjdCBHcmVlbiBPZmZpY2UgUGFydGljaXBhbnRzIG1hZGUgZWFjaCB3ZWVrIHNpbmNlIHRoZSBwcm9ncmFtIGJlZ2FuLgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBjb21tZW50PSIifQojQ3JlYXRpbmcgYW4gZXhwZXJpbWVudGFsIGdvcXVlczIgd2l0aCBkYXRlIHZhcmlhYmxlcwpnb3N1cnYgJT4lIHBpdm90X2xvbmdlcihjKDE2OjU4KSwgbmFtZXNfdG89InF1ZXN0aW9uIiwgdmFsdWVzX3RvPSJhbnN3ZXIiKSAlPiUKICBwaXZvdF93aWRlciguLCAKICAgICAgICAgICBpZF9jb2xzPWMoYE5VIElEYCwgc3VydmV5b3JkZXIsIHF1ZXN0aW9uLCBhbnN3ZXIsIGRhdGUsIG1vbnRoLCB5ZWFyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfZnJvbT1zdXJ2ZXlvcmRlciwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbT1jKGFuc3dlciksCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfcHJlZml4PSJhbnN3ZXJfIikgLT4gZ29xdWVzMgoKbGVmdF9qb2luKGdvcXVlczIsIGdvdGlkeSkgLT4gZ29xdWVzMgoKZ29xdWVzMiA8LSBnb3F1ZXMyICU+JSBzZWxlY3QoLWMoUGVyY180LCBDZXJ0XzQsIGFuc3dlcl80LCBQb3NpdGlvbl80LCBEZXBhcnRtZW50XzQpKQoKI0NyZWF0aW5nIGNvbHVtbnMgImFjdGlvbnRha2VuMV8yIiBhbmQgImFjdGlvbnRha2VuM180IiB3aGljaCBjYXB0dXJlIGhvdyBhbnN3ZXJzIHRvIHF1ZXN0aW9ucyBjaGFuZ2VkIG9yIHN0YXllZCBzdGFibGUgYWNyb3NzIHJlY2VydGlmaWNhdGlvbnMgCmdvcXVlczIgJT4lCiAgbXV0YXRlKGFjdGlvbnRha2VuMV8yID0gCiAgaWZlbHNlKGFuc3dlcl8xID09ICJBY3Rpb24gTmVlZGVkIiAmIGFuc3dlcl8yID09ICJZZXMiLCAiaW1wcm92ZWQiLAogIGlmZWxzZShhbnN3ZXJfMSA9PSAiWWVzIiAmIGFuc3dlcl8yID09ICJBY3Rpb24gTmVlZGVkIiwgInJlZ3Jlc3NlZCIsCiAgaWZlbHNlKGFuc3dlcl8xID09ICJZZXMiICYgYW5zd2VyXzIgPT0gIlllcyIsICJ5ZXNfc3RhYmxlIiwKICBpZmVsc2UoYW5zd2VyXzEgPT0gIkFjdGlvbiBOZWVkZWQiICYgYW5zd2VyXzIgPT0gIkFjdGlvbiBOZWVkZWQiLCAiYWN0aW9uX3N0aWxsX25lZWRlZCIsIAogIGlmZWxzZShhbnN3ZXJfMSA9PSAiTi9BIiAmIGFuc3dlcl8yID09ICJOL0EiLCAibm90X2FwcGxpY2FibGUiLCBOQSkpKSkpKSAlPiUKICBtdXRhdGUoYWN0aW9udGFrZW4yXzMgPQogIGlmZWxzZShhbnN3ZXJfMiA9PSAiQWN0aW9uIE5lZWRlZCIgJiBhbnN3ZXJfMyA9PSAiWWVzIiwgImltcHJvdmVkIiwKICBpZmVsc2UoYW5zd2VyXzIgPT0gIlllcyIgJiBhbnN3ZXJfMyA9PSAiQWN0aW9uIE5lZWRlZCIsICJyZWdyZXNzZWQiLAogIGlmZWxzZShhbnN3ZXJfMiA9PSAiWWVzIiAmIGFuc3dlcl8zID09ICJZZXMiLCAieWVzX3N0YWJsZSIsCiAgaWZlbHNlKGFuc3dlcl8yID09ICJBY3Rpb24gTmVlZGVkIiAmIGFuc3dlcl8zID09ICJBY3Rpb24gTmVlZGVkIiwgImFjdGlvbl9zdGlsbF9uZWVkZWQiLCAKICBpZmVsc2UoYW5zd2VyXzIgPT0gIk4vQSIgJiBhbnN3ZXJfMyA9PSAiTi9BIiwgIm5vdF9hcHBsaWNhYmxlIiwgTkEpKSkpKSkgJT4lCiAgcmVsb2NhdGUoLiwgYyhhY3Rpb250YWtlbjFfMiwgYWN0aW9udGFrZW4yXzMpLCAuYWZ0ZXI9YW5zd2VyXzMpIC0+IGdvcXVlczIKCiNBZGRpbmcgcXVlc3Rpb24gY2F0ZWdvcmllcwpnb3F1ZXMyICU+JSB1bmdyb3VwKCkgJT4lIHNlbGVjdChxdWVzdGlvbikgJT4lIGZpbHRlcighZHVwbGljYXRlZChxdWVzdGlvbikpICU+JQogIG11dGF0ZShyb3cgPSByb3dfbnVtYmVyKCkpICU+JQogIG11dGF0ZShzZWN0aW9uID0gaWZlbHNlKGJldHdlZW4ocm93LCAxLCAxMSksICJlbmVyZ3kiLCAKICAgICAgICAgICAgICAgICAgIGlmZWxzZShyb3cgPT0gMTIsICJtaXNjIiwKICAgICAgICAgICAgICAgICAgIGlmZWxzZShiZXR3ZWVuKHJvdywgMTMsMjUpLCAid2FzdGUiLAogICAgICAgICAgICAgICAgICAgaWZlbHNlKGJldHdlZW4ocm93LCAyNiwgMzIpLCAicmVjeWNsaW5nIiwKICAgICAgICAgICAgICAgICAgIGlmZWxzZShiZXR3ZWVuKHJvdywgMzMsIDM1KSwgInRyYW5zcG9ydGF0aW9uIiwKICAgICAgICAgICAgICAgICAgIGlmZWxzZShiZXR3ZWVuKHJvdywgMzYsIDQyKSwgInB1cmNoYXNpbmciLAogICAgICAgICAgICAgICAgICAgaWZlbHNlKHJvdyA9PSA0MywgIm1pc2MiLE5BKSkpKSkpKSkgLT4gcXVlc3Rpb25zCgpxdWVzdGlvbnMgJT4lIHNlbGVjdCgtcm93KSAlPiUgbGVmdF9qb2luKGdvcXVlczIsIC4pICU+JSByZWxvY2F0ZSguLCBzZWN0aW9uLCAuYWZ0ZXI9cXVlc3Rpb24pIC0+IGdvcXVlczIKCgpgYGAKCmBgYHtyIFdyYW5nbGluZzIsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgIGNvbW1lbnQ9IiJ9CmdvcXVlczIgJT4lIGZpbHRlcihxdWVzdGlvbiA9PSAiQWxsIG9mIG15IHRhc2sgbGlnaHRpbmcgKGluY2x1ZGluZyBmbG9vciBhbmQgZGVzayBsYW1wcykgdXNlcyBlaXRoZXIgTEVEIG9yIENGTCwgYnV0IG5vIGluY2FuZGVzY2VudCBsaWdodCBidWxicy4iIHwKICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uID09ICJNeSBjb21wdXRlciBtb25pdG9yIGlzIHNldCB0byBzbGVlcCBhZnRlciAxMCBtaW51dGVzIG9yIGxlc3MuIiB8CiAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiA9PSAiSSBzaHV0IG9mZiBteSBwZXJzb25hbCBwcmludGVyIHdoZW4gbm90IGluIHVzZS4iIHwKICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uID09ICJJIHJlY3ljbGUgYWxsIGJvdHRsZXMgYW5kIGNhbnMgdGhhdCBJIGNvbWUgYWNyb3NzIGluIHRoZSBvZmZpY2UuIiB8CiAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiA9PSAgIkkgcmVjeWNsZSBhbGwgY2FyZGJvYXJkIHRoYXQgSSBjb21lIGFjcm9zcyBpbiB0aGUgb2ZmaWNlLiIgfAogICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24gPT0gIkkgcmVjeWNsZSBhbGwgb2ZmaWNlIHBhcGVyLiIpICU+JQogIHNlbGVjdChgTlUgSURgLCBxdWVzdGlvbiwgc2VjdGlvbiwgYW5zd2VyXzEsIGRhdGUsIG1vbnRoLCB5ZWFyKSAtPiBnb3F1YW50CgojQWRkaW5nIGNvbHVtbnMgZnJvbSAncGVyc29uJyBzaW11bGF0ZWQgZGF0YQpnb3F1YW50W2MoInR5cGUiLCAidmFsdWUiLCAidmFsdWVfd2siLCAiYWN0aXZlX3dhdHRzIiwgInN0YW5kYnlfd2F0dHMiLCAiYWN0aXZlX2hvdXJzX2R5IiwgInN0YW5kYnlfaG91cnNfZHkiKV0gPC0gTkEKCiNsaWdodGJ1bGJzCmdvcXVhbnQgJT4lIG11dGF0ZSh0eXBlID0gaWZlbHNlKHF1ZXN0aW9uID09ICJBbGwgb2YgbXkgdGFzayBsaWdodGluZyAoaW5jbHVkaW5nIGZsb29yIGFuZCBkZXNrIGxhbXBzKSB1c2VzIGVpdGhlciBMRUQgb3IgQ0ZMLCBidXQgbm8gaW5jYW5kZXNjZW50IGxpZ2h0IGJ1bGJzLiIgJiBhbnN3ZXJfMSA9PSAiWWVzIiwgImxlZCIsIAogICAgICAgICAgICBpZmVsc2UocXVlc3Rpb24gPT0gIkFsbCBvZiBteSB0YXNrIGxpZ2h0aW5nIChpbmNsdWRpbmcgZmxvb3IgYW5kIGRlc2sgbGFtcHMpIHVzZXMgZWl0aGVyIExFRCBvciBDRkwsIGJ1dCBubyBpbmNhbmRlc2NlbnQgbGlnaHQgYnVsYnMuIiAmIGFuc3dlcl8xID09ICJBY3Rpb24gTmVlZGVkIiwgImluY2FuZGVzY2VudCIsIE5BKSkpIC0+IGdvcXVhbnQKCmdvcXVhbnQgJT4lIG11dGF0ZSh2YWx1ZSA9IGlmZWxzZSh0eXBlID09ICJsZWQiLCAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gImluY2FuZGVzY2VudCIsIDIsIHR5cGUpKSkgLT4gZ29xdWFudAoKZ29xdWFudCAlPiUgbXV0YXRlKGFjdGl2ZV93YXR0cyA9IGlmZWxzZSh0eXBlID09ICJsZWQiLCA5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eXBlID09ICJpbmNhbmRlc2NlbnQiLCA2MCwgYWN0aXZlX3dhdHRzKSkpIC0+IGdvcXVhbnQKZ29xdWFudCAlPiUgbXV0YXRlKHN0YW5kYnlfd2F0dHMgPSBpZmVsc2UodHlwZSA9PSAibGVkIiwgMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHlwZSA9PSAiaW5jYW5kZXNjZW50IiwgMCwgc3RhbmRieV93YXR0cykpKSAtPiBnb3F1YW50Cgpnb3F1YW50ICU+JSBtdXRhdGUoYWN0aXZlX2hvdXJzX2R5ID0gaWZlbHNlKHF1ZXN0aW9uID09ICJBbGwgb2YgbXkgdGFzayBsaWdodGluZyAoaW5jbHVkaW5nIGZsb29yIGFuZCBkZXNrIGxhbXBzKSB1c2VzIGVpdGhlciBMRUQgb3IgQ0ZMLCBidXQgbm8gaW5jYW5kZXNjZW50IGxpZ2h0IGJ1bGJzLiIsIDgsIGFjdGl2ZV9ob3Vyc19keSkpIC0+IGdvcXVhbnQKZ29xdWFudCAlPiUgbXV0YXRlKHN0YW5kYnlfaG91cnNfZHkgPSBpZmVsc2UocXVlc3Rpb24gPT0gIkFsbCBvZiBteSB0YXNrIGxpZ2h0aW5nIChpbmNsdWRpbmcgZmxvb3IgYW5kIGRlc2sgbGFtcHMpIHVzZXMgZWl0aGVyIExFRCBvciBDRkwsIGJ1dCBubyBpbmNhbmRlc2NlbnQgbGlnaHQgYnVsYnMuIiwgOC0gYWN0aXZlX2hvdXJzX2R5LCBzdGFuZGJ5X2hvdXJzX2R5KSkgLT4gZ29xdWFudAoKI2NvbXB1dGVyIG1vbml0b3IKZ29xdWFudCAlPiUgbXV0YXRlKHR5cGUgPSBpZmVsc2UocXVlc3Rpb24gPT0gIk15IGNvbXB1dGVyIG1vbml0b3IgaXMgc2V0IHRvIHNsZWVwIGFmdGVyIDEwIG1pbnV0ZXMgb3IgbGVzcy4iLCJtb25pdG9yIiwgdHlwZSkpIC0+IGdvcXVhbnQKCmdvcXVhbnQgJT4lIG11dGF0ZShhY3RpdmVfd2F0dHMgPSBpZmVsc2UodHlwZSA9PSAibW9uaXRvciIsIDQ1LCBhY3RpdmVfd2F0dHMpKSAtPiBnb3F1YW50CmdvcXVhbnQgJT4lIG11dGF0ZShzdGFuZGJ5X3dhdHRzID0gaWZlbHNlKHR5cGUgPT0gIm1vbml0b3IiLCA0LCBzdGFuZGJ5X3dhdHRzKSkgLT4gZ29xdWFudApnb3F1YW50ICU+JSBtdXRhdGUoYWN0aXZlX2hvdXJzX2R5ID0gaWZlbHNlKHR5cGUgPT0gIm1vbml0b3IiLCA2LCBhY3RpdmVfaG91cnNfZHkpKSAtPiBnb3F1YW50Cgpnb3F1YW50ICU+JSBtdXRhdGUoc3RhbmRieV9ob3Vyc19keSA9IGlmZWxzZSh0eXBlID09ICJtb25pdG9yIiAmIGFuc3dlcl8xID09ICJZZXMiLCAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eXBlID09ICJtb25pdG9yIiAmIGFuc3dlcl8xID09ICJBY3Rpb24gTmVlZGVkIiwgOC1hY3RpdmVfaG91cnNfZHksIHN0YW5kYnlfaG91cnNfZHkpKSkgLT4gZ29xdWFudAoKI3BlcnNvbmFsIHByaW50ZXIgKGhlcmUgbmVlZCB0byBhY2NvdW50IGZvciB3aGV0aGVyIHRoZXkgaGF2ZSBvbmUgb3Igbm90KQpnb3F1YW50ICU+JSBtdXRhdGUodHlwZSA9IGlmZWxzZShxdWVzdGlvbiA9PSAiSSBzaHV0IG9mZiBteSBwZXJzb25hbCBwcmludGVyIHdoZW4gbm90IGluIHVzZS4iLCAicHJpbnRlciIsIHR5cGUpKSAtPiBnb3F1YW50Cgpnb3F1YW50ICU+JSBtdXRhdGUoYWN0aXZlX3dhdHRzID0gaWZlbHNlKHR5cGUgPT0gInByaW50ZXIiICYgYW5zd2VyXzEgIT0gIk4vQSIsIDQwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eXBlID09ICJwcmludGVyIiAmIGFuc3dlcl8xID09ICJOL0EiLCAwLCBhY3RpdmVfd2F0dHMpKSkgLT4gZ29xdWFudAogICAgICAgICAgICAgICAgICAgCmdvcXVhbnQgJT4lIG11dGF0ZShzdGFuZGJ5X3dhdHRzID0gaWZlbHNlKHR5cGUgPT0gInByaW50ZXIiICYgYW5zd2VyXzEgIT0gIk4vQSIsIDQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gInByaW50ZXIiICYgYW5zd2VyXzEgPT0gIk4vQSIsIDAsIHN0YW5kYnlfd2F0dHMpKSkgLT4gZ29xdWFudCAgICAgICAgICAgICAgICAgICAKZ29xdWFudCAlPiUgbXV0YXRlKGFjdGl2ZV9ob3Vyc19keSA9IGlmZWxzZSh0eXBlID09ICJwcmludGVyIiAmIGFuc3dlcl8xICE9ICJOL0EiLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gInByaW50ZXIiICYgYW5zd2VyXzEgPT0gIk4vQSIsIDAsIGFjdGl2ZV9ob3Vyc19keSkpKSAtPiBnb3F1YW50Cgpnb3F1YW50ICU+JSBtdXRhdGUoc3RhbmRieV9ob3Vyc19keSA9IGlmZWxzZSh0eXBlID09ICJwcmludGVyIiAmIGFuc3dlcl8xID09ICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAKICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eXBlID09ICJwcmludGVyIiAmIGFuc3dlcl8xID09ICJBY3Rpb24gTmVlZGVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgOC1hY3RpdmVfaG91cnNfZHksIAogICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gInByaW50ZXIiICYgYW5zd2VyXzEgPT0gIk4vQSIsIDAsIHN0YW5kYnlfaG91cnNfZHkpKSkpIC0+IGdvcXVhbnQKCiNCb3R0bGVzIGFuZCBDYW5zIFJlY3ljbGluZwpnb3F1YW50ICU+JSBtdXRhdGUodHlwZSA9IGlmZWxzZShxdWVzdGlvbiA9PSAiSSByZWN5Y2xlIGFsbCBib3R0bGVzIGFuZCBjYW5zIHRoYXQgSSBjb21lIGFjcm9zcyBpbiB0aGUgb2ZmaWNlLiIsICJwbGFzdGljIiwgdHlwZSkpIC0+IGdvcXVhbnQKCmdvcXVhbnQgJT4lIG11dGF0ZSh2YWx1ZV93ayA9IGlmZWxzZSh0eXBlID09ICJwbGFzdGljIiwgMSwgdmFsdWVfd2spKSAtPiBnb3F1YW50CgojQ2FyZGJvYXJkIFJlY3ljbGluZwpnb3F1YW50ICU+JSBtdXRhdGUodHlwZSA9IGlmZWxzZShxdWVzdGlvbiA9PSAiSSByZWN5Y2xlIGFsbCBjYXJkYm9hcmQgdGhhdCBJIGNvbWUgYWNyb3NzIGluIHRoZSBvZmZpY2UuIiwgImNhcmRib2FyZCIsIHR5cGUpKSAtPiBnb3F1YW50Cgpnb3F1YW50ICU+JSBtdXRhdGUodmFsdWVfd2sgPSBpZmVsc2UodHlwZSA9PSAiY2FyZGJvYXJkIiwgMSwgdmFsdWVfd2spKSAtPiBnb3F1YW50CgojUGFwZXIgUmVjeWNsaW5nCmdvcXVhbnQgJT4lIG11dGF0ZSh0eXBlID0gaWZlbHNlKHF1ZXN0aW9uID09ICJJIHJlY3ljbGUgYWxsIG9mZmljZSBwYXBlci4iLCAicGFwZXIiLCB0eXBlKSkgLT4gZ29xdWFudAoKZ29xdWFudCAlPiUgbXV0YXRlKHZhbHVlX3drID0gaWZlbHNlKHR5cGUgPT0gInBhcGVyIiAmIGFuc3dlcl8xID09ICJZZXMiICwgMjUsIHZhbHVlX3drKSkgLT4gZ29xdWFudAoKYGBgCgpgYGB7ciBDb252ZXJzaW9uczIsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgIGNvbW1lbnQ9IiJ9CnF1YW50IDwtIGNvYWxlc2NlX2pvaW4oZ29xdWFudCwgY29udiwgYnkgPSAndHlwZScpCgpxdWFudCAlPiUgbXV0YXRlKGt3aF9hY3RpdmVfZHkgPSAoKGFjdGl2ZV93YXR0cyphY3RpdmVfaG91cnNfZHkpLzEwMDApLAogICAgICAgICAgICAgICAgIGt3aF9zdGFuZGJ5X2R5ID0gKChzdGFuZGJ5X3dhdHRzKnN0YW5kYnlfaG91cnNfZHkpLzEwMDApLAogICAgICAgICAgICAgICAgIGt3aF9keSA9IGt3aF9hY3RpdmVfZHkra3doX3N0YW5kYnlfZHksCiAgICAgICAgICAgICAgICAga3doX3drID0gaWZlbHNlKHR5cGUgPT0gYygiaW5jYW5kZXNjZW50IiwgImxlZCIsICJtb25pdG9yIiwicHJpbnRlciIpLCBrd2hfZHkqNSwgTkEpKSAtPiBxdWFudAoKcXVhbnQgJT4lIG11dGF0ZShrd2hfd2sgPSBpZmVsc2UodHlwZSA9PSAicGFwZXIiLAogICAgICAgICAgICAgICAgICAgICAgKChgd2VpZ2h0IChsYnMpYCp2YWx1ZV93aykvMjAwMCkqa3doX3Blcl90b24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gInBsYXN0aWMiLAogICAgICAgICAgICAgICAgICAgICAgKChgd2VpZ2h0IChsYnMpYCp2YWx1ZV93aykvMjAwMCkqa3doX3Blcl90b24sICN0aGlzIGNhbiBiZSBjbGVhbmVkIHdpdGggYW4gJyVpbiUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gImNhcmRib2FyZCIsIAogICAgICAgICAgICAgICAgICAgICAgKChgd2VpZ2h0IChsYnMpYCp2YWx1ZV93aykvMjAwMCkqa3doX3Blcl90b24sIGt3aF9keSo1KSkpKSAtPiBxdWFudAoKcXVhbnQgJT4lIG11dGF0ZShnYWxsb25zX29pbF93ayA9IGt3aF93ay80My45LAogICAgICAgICAgICAgICAgIGtnX0NPMl93ayA9ICgoKGdhbGxvbnNfb2lsX3drLzQyKSowLjQzKSoxMDAwKSkgLT4gcXVhbnQKYGBgCgpgYGB7ciAjQWdncmVnYXRpb24yLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naGlkZScsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsICBjb21tZW50PSIifQojQWdncmVnYXRpb24KcXVhbnQgJT4lIG11dGF0ZShrd2hfbXRoID0ga3doX3drKjQsCiAgICAgICAgICAgIGdhbGxvbnNfb2lsX210aCA9IGdhbGxvbnNfb2lsX3drKjQsCiAgICAgICAgICAgIGtnX0NPMl9tdGggPSBrZ19DTzJfd2sqNCkgLT4gcXVhbnRhZ2cyCgoKI2lzIGEgY2hhcmFjdGVyIGZvciBzb21lIHJlYXNvbi4uLgpxdWFudGFnZzIkTW9udGhfWXIgPC0gZm9ybWF0KGFzLkRhdGUocXVhbnRhZ2cyJGRhdGUpLCAiJVktJW0iKQpxdWFudGFnZzIkV2Vla19ZciA8LSBmb3JtYXQoYXMuRGF0ZShxdWFudGFnZzIkZGF0ZSksICIlWS0lVyIpCnF1YW50YWdnMiRXZWVrIDwtIGZvcm1hdChhcy5EYXRlKHF1YW50YWdnMiRkYXRlKSwgIiVXIikgI2NyZWF0aW5nICJ3ZWVrIiBjb2x1bW4gZm9yIGFnZ3JlZ2F0aW9uCgpxdWFudGFnZzIgJT4lIGdyb3VwX2J5KHF1ZXN0aW9uLCBhbnN3ZXJfMSwgV2VlaywgeWVhcikgJT4lCiAgc3VtbWFyaXNlKHRvdF9rd2hfd2sgPSBzdW0oa3doX3drKSwKICAgICAgICAgICAgdG90X2dhbGxvbnNfb2lsX3drID0gc3VtKCBnYWxsb25zX29pbF93ayksCiAgICAgICAgICAgIHRvdF9rZ19DTzJfd2sgPSBzdW0oa2dfQ08yX3drKSkgLT4gcXVhbnRhZ2cyICNhZ2dyZWdhdGluZwoKcXVhbnRhZ2cyICU+JSB1bmdyb3VwKCkgJT4lIG11dGF0ZShkYXRlID0gYXMuRGF0ZShwYXN0ZSgiMSIsIHF1YW50YWdnMiRXZWVrLCBxdWFudGFnZzIkeWVhciwgc2VwID0gIi0iKSwgZm9ybWF0ID0gIiV3LSVXLSVZIikpIC0+IHF1YW50YWdnMiAjcmVjcmVhdGluZyBtYWRlLXVwIGRhdGUgc3RhcnRpbmcgb24gTW9uZGF5IGJhc2VkIG9uIFdlZWsgYW5kIFllYXIgY29sdW1ucy4KCiNmaWx0ZXJpbmcgTkFzCnF1YW50YWdnMiA8LSBxdWFudGFnZzIgJT4lIGZpbHRlcighaXMubmEodG90X2t3aF93aykpCiNhcnJhbmdpbmcgaW4gZGF0ZSBvcmRlcgpxdWFudGFnZzIgPC0gcXVhbnRhZ2cyICU+JSBhcnJhbmdlKGRhdGUpCgpyZWN5Y2xlX3llcyA8LSBxdWFudGFnZzIgJT4lIGZpbHRlcihhbnN3ZXJfMSA9PSAiWWVzIikgJT4lIGZpbHRlcihxdWVzdGlvbiA9PSAiSSByZWN5Y2xlIGFsbCBjYXJkYm9hcmQgdGhhdCBJIGNvbWUgYWNyb3NzIGluIHRoZSBvZmZpY2UuIiB8IHF1ZXN0aW9uID09ICJJIHJlY3ljbGUgYWxsIGJvdHRsZXMgYW5kIGNhbnMgdGhhdCBJIGNvbWUgYWNyb3NzIGluIHRoZSBvZmZpY2UuIiB8IHF1ZXN0aW9uID09ICJJIHJlY3ljbGUgYWxsIG9mZmljZSBwYXBlci4iKSAlPiUKICBzZWxlY3QoLWFuc3dlcl8xKSAlPiUgZ3JvdXBfYnkocXVlc3Rpb24pICU+JQogIG11dGF0ZShjdW1zdW1fa3doID0gY3Vtc3VtKHRvdF9rd2hfd2spLAogICAgICAgICBjdW1zdW1fb2lsID0gY3Vtc3VtKHRvdF9nYWxsb25zX29pbF93ayksCiAgICAgICAgIGN1bXN1bV9jYXJib24gPSBjdW1zdW0odG90X2tnX0NPMl93aykpCiAgICAgICAgIApnMSA8LSBnZ3Bsb3QocmVjeWNsZV95ZXMsIGFlcyh4PWRhdGUsIHk9Y3Vtc3VtX2t3aCwgY29sb3I9cXVlc3Rpb24pKSArCiAgZ2VvbV9saW5lKCkgKyBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMyBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViLSV5JyIpKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAidmVydGljYWwiKSsKICBsYWJzKHRpdGxlID0gIktpbG93YXR0IEhvdXJzIG9mIEVsZWN0cmljaXR5IFNhdmVkIEVhY2ggV2VlayBieSBSZWN5Y2xpbmciKSArIAogICAgICAgeGxhYigiRGF0ZSIpKyAKICAgICAgIHlsYWIoIktpbG93YXR0IEhvdXJzIFNhdmVkIEVhY2ggV2VlayIpKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKGZyb20gPSAwLCB0byA9IDI1MCwgYnkgPSAyNSkpCgpnMiA8LSBnZ3Bsb3QocmVjeWNsZV95ZXMsIGFlcyh4PWRhdGUsIHk9Y3Vtc3VtX29pbCwgY29sb3I9cXVlc3Rpb24pKSArCiAgZ2VvbV9saW5lKCkgKyBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMyBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViLSV5JyIpKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAidmVydGljYWwiKSsKICBsYWJzKHRpdGxlID0gIkdhbGxvbnMgb2YgT2lsIFNhdmVkIEVhY2ggV2VlayBieSBSZWN5Y2xpbmciKSArIAogICAgICAgeGxhYigiRGF0ZSIpKyAKICAgICAgIHlsYWIoIkdhbGxvbnMgb2YgT2lsIFNhdmVkIEVhY2ggV2VlayIpKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKGZyb20gPSAwLCB0byA9IDYsIGJ5ID0gMSkpCgpnMyA8LSBnZ3Bsb3QocmVjeWNsZV95ZXMsIGFlcyh4PWRhdGUsIHk9Y3Vtc3VtX2NhcmJvbiwgY29sb3I9cXVlc3Rpb24pKSArCiAgZ2VvbV9saW5lKCkgKyBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMyBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViLSV5JyIpKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAidmVydGljYWwiKSsKICBsYWJzKHRpdGxlID0gIktpbG9ncmFtcyBvZiBDTzIgU2F2ZWQgRWFjaCBXZWVrIGJ5IFJlY3ljbGluZyIpICsgCiAgICAgICB4bGFiKCJEYXRlIikrIAogICAgICAgeWxhYigiS2cgb2YgQ08yIFNhdmVkIEVhY2ggV2VlayIpKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKGZyb20gPSAwLCB0byA9IDYwLCBieSA9IDEwKSkKCmBgYAoKCmBgYHtyICNBZ2dyZWdhdGlvbjMsIGV2YWw9IEZBTFNFLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naGlkZScsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsICBjb21tZW50PSIifQojRmlyc3QgbmVlZCB0byBmaW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gWWVzIGFuZCBBY3Rpb24gTmVlZGVkIGZvciB0aGUgVGVjaC4gQWRqdXN0bWVudCBxdWVzdGlvbnMgaW4gb3JkZXIgdG8gZmluZCAiZW5lcmd5IHNhdmluZ3MiCgojVGhpcyBpcyBoYXJkLi4gRnVuZGFtZW50YWwgYW5hbHlzaXMgcHJvYmxlbSBpcyB0aGF0IEknbSBkZXJpdmluZyBkaWZmZXJlbmNlIGJhc2VkIG9uIHRoZSBhbnN3ZXIgZ3JvdXBzLCByYXRoZXIgdGhhbiB0aGUgYXNzdW1wdGlvbnMgb2YgZW5lcmd5IHVzYWdlIGluIHF1YW50LiBXaGF0IEknZCByZWFsbHkgd2FudCBpcyB0YWtlIHdlZWsgb3ZlciB3ZWVrLCB0aGUgbnVtYmVyIG9mIGZvbGtzIHdobyBzYWlkICJ5ZXMiLCBzdW0gdG8gZ2V0IHRvdF9rd2hfd2sgYW5kIHN1YnRyYWN0IHRoYXQgZnJvbSB3aGF0IGl0IFdPVUxEJ1ZFIGJlZW4gaWYgdGhleSBoYWQgc2FpZCAiQWN0aW9uIE5lZWRlZCIsIHRoYXQgd2F5IGl0IGlzIGEgc3ltbWV0cmljYWwgZGF0YXNldC4gQWJzZW50IHRoYXQsIEknbSBub3Qgc3VyZSBob3cgdG8gdmlzdWFsaXplLiBCZWNhdXNlIHVuZGVybmVhdGggdGhlIHRpbWUgc2VyaWVzIGlzIGNoYW5naW5nIHJhdGVzIG9mIHBlb3BsZSwgc28gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYW5zd2VycyBpcyBtaW5pbWl6ZWQgYmVjYXVzZSB0aGUgYW1vdW50IG9mIHBlb3BsZSBhcmUgc2tld2VkLiBUaGVyZSdzIGFsbW9zdCA0eCBhcyBtYW55IHBlb3BsZSB3aG8gc2FpZCAieWVzIiB0byBsaWdodGJ1bGIgcXVlc3Rpb24sIHNvIGl0J3MgaGFyZCB0byBpbnRlcnByZXQuCgojUHJvYmxlbXMuLi4gc2VlIGFib3ZlXgpxdWFudGFnZzIgJT4lIGZpbHRlcihxdWVzdGlvbiA9PSAiQWxsIG9mIG15IHRhc2sgbGlnaHRpbmcgKGluY2x1ZGluZyBmbG9vciBhbmQgZGVzayBsYW1wcykgdXNlcyBlaXRoZXIgTEVEIG9yIENGTCwgYnV0IG5vIGluY2FuZGVzY2VudCBsaWdodCBidWxicy4iIHwgcXVlc3Rpb24gPT0gIkkgc2h1dCBvZmYgbXkgcGVyc29uYWwgcHJpbnRlciB3aGVuIG5vdCBpbiB1c2UuIiB8IHF1ZXN0aW9uID09Ik15IGNvbXB1dGVyIG1vbml0b3IgaXMgc2V0IHRvIHNsZWVwIGFmdGVyIDEwIG1pbnV0ZXMgb3IgbGVzcy4iKSAlPiUgCiAgZmlsdGVyKGFuc3dlcl8xICE9ICJOL0EiKSAlPiUKICBzZWxlY3QoLWMoV2VlaywgeWVhcikpICU+JSB1bmdyb3VwKCkgJT4lCnBpdm90X3dpZGVyKC4sIAogICAgICAgICAgIGlkX2NvbHM9YyhxdWVzdGlvbiwgYW5zd2VyXzEsIGRhdGUpLCAKICAgICAgICAgICAgICAgICAgICAgbmFtZXNfZnJvbT1hbnN3ZXJfMSwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2Zyb209Yyh0b3Rfa3doX3drLCB0b3RfZ2FsbG9uc19vaWxfd2ssIHRvdF9rZ19DTzJfd2spKSAlPiUgCiAgbXV0YXRlKHRvdF9rd2hfd2sgPSAoYHRvdF9rd2hfd2tfQWN0aW9uIE5lZWRlZGAgLSB0b3Rfa3doX3drX1llcyksCiAgICAgICAgIHRvdF9nYWxsb25zX29pbF93ayA9IChgdG90X2dhbGxvbnNfb2lsX3drX0FjdGlvbiBOZWVkZWRgIC0gdG90X2dhbGxvbnNfb2lsX3drX1llcyksCiAgICAgICAgIHRvdF9rZ19DTzJfd2sgPSAoYHRvdF9rZ19DTzJfd2tfQWN0aW9uIE5lZWRlZGAgLSB0b3Rfa2dfQ08yX3drX1llcykpICU+JSAKICAgZmlsdGVyKCFpcy5uYSh0b3Rfa3doX3drKSkgJT4lIGFycmFuZ2UoZGF0ZSkgJT4lCiAgbXV0YXRlKGN1bXN1bV9rd2ggPSBjdW1zdW0odG90X2t3aF93aykpICU+JSBmaWx0ZXIocXVlc3Rpb24gPT0gIkFsbCBvZiBteSB0YXNrIGxpZ2h0aW5nIChpbmNsdWRpbmcgZmxvb3IgYW5kIGRlc2sgbGFtcHMpIHVzZXMgZWl0aGVyIExFRCBvciBDRkwsIGJ1dCBubyBpbmNhbmRlc2NlbnQgbGlnaHQgYnVsYnMuIikgJT4lIAogZ2dwbG90KC4sIGFlcyh4PWRhdGUsIHk9Y3Vtc3VtX2t3aCkpICsKICBnZW9tX2xpbmUoKSArIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIzIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWItJXknIikrIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJ2ZXJ0aWNhbCIpCgoKCiNMZXQncyBqdXN0IGRvIGRpZmZlcmVuY2VzIGluc3RlYWQKdGVjaF9kaWZmIDwtIHF1YW50YWdnMiAlPiUgZmlsdGVyKHF1ZXN0aW9uID09ICJBbGwgb2YgbXkgdGFzayBsaWdodGluZyAoaW5jbHVkaW5nIGZsb29yIGFuZCBkZXNrIGxhbXBzKSB1c2VzIGVpdGhlciBMRUQgb3IgQ0ZMLCBidXQgbm8gaW5jYW5kZXNjZW50IGxpZ2h0IGJ1bGJzLiIgfCBxdWVzdGlvbiA9PSAiSSBzaHV0IG9mZiBteSBwZXJzb25hbCBwcmludGVyIHdoZW4gbm90IGluIHVzZS4iIHwgcXVlc3Rpb24gPT0iTXkgY29tcHV0ZXIgbW9uaXRvciBpcyBzZXQgdG8gc2xlZXAgYWZ0ZXIgMTAgbWludXRlcyBvciBsZXNzLiIpICU+JSAKICBmaWx0ZXIoYW5zd2VyXzEgIT0gIk4vQSIpICU+JQogIGdyb3VwX2J5KHF1ZXN0aW9uLCBhbnN3ZXJfMSkgJT4lCiAgbXV0YXRlKGN1bXN1bV9rd2ggPSBjdW1zdW0odG90X2t3aF93ayksCiAgICAgICAgIGN1bXN1bV9vaWwgPSBjdW1zdW0odG90X2dhbGxvbnNfb2lsX3drKSwKICAgICAgICAgY3Vtc3VtX2NhcmJvbiA9IGN1bXN1bSh0b3Rfa2dfQ08yX3drKSkKCnF1YW50ICU+JSBncm91cF9ieShxdWVzdGlvbiwgYW5zd2VyXzEpICU+JSBmaWx0ZXIoIWlzLm5hKGFuc3dlcl8xKSkgJT4lIGNvdW50KCkKZ3VhbnRhZ2cyCnRlY2hfZGlmZiAlPiUgZ3JvdXBfYnkocXVlc3Rpb24sIGFuc3dlcl8xKSAlPiUgc3VtbWFyaXplKHN1bV9rdyA9IHN1bShjdW1zdW1fa3doKSkKdGVjaF9kaWZmICU+JSBncm91cF9ieShxdWVzdGlvbiwgYW5zd2VyXzEpICU+JSBzdW1tYXJpemUoc3VtX2t3ID0gc3VtKHRvdF9rd2hfd2spKQoKI2c0IGlzIGdvb2QsIGp1c3QgbmVlZCB0byBkbyB0aGUgcmVzdC4gCgpnNCA8LSB0ZWNoX2RpZmYgJT4lIGZpbHRlcihxdWVzdGlvbiA9PSAiQWxsIG9mIG15IHRhc2sgbGlnaHRpbmcgKGluY2x1ZGluZyBmbG9vciBhbmQgZGVzayBsYW1wcykgdXNlcyBlaXRoZXIgTEVEIG9yIENGTCwgYnV0IG5vIGluY2FuZGVzY2VudCBsaWdodCBidWxicy4iKSAlPiUKIGdncGxvdCguLCBhZXMoeD1kYXRlLCB5PWN1bXN1bV9rd2gsIGNvbG9yPWFuc3dlcl8xKSkgKwogIGdlb21fbGluZSgpICsgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjMgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYi0leSciKSsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gInZlcnRpY2FsIikrCiAgbGFicyh0aXRsZSA9ICJLaWxvd2F0dCBIb3VycyBvZiBFbGVjdHJpY2l0eSBVc2VkIEVhY2ggV2VlayBieSBMaWdodGJ1bGIgVHlwZSIpICsgCiAgICAgICB4bGFiKCJEYXRlIikrIAogICAgICAgeWxhYigiS2lsb3dhdHQgSG91cnMgVXNlZCBFYWNoIFdlZWsiKSsgCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9IkxpZ2h0YnVsYiBUeXBlIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9IGMoIiNGQzZCNDkiLCIjNUNBOUZEIiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPSBjKCJJbmNhbmRlc2NlbnQiLCAiTEVEIikpCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcShmcm9tID0gMCwgdG8gPSAxNjAsIGJ5ID0gMjApKQoKZzUgPC0gZ2dwbG90KHJlY3ljbGVfeWVzLCBhZXMoeD1kYXRlLCB5PWN1bXN1bV9vaWwsIGNvbG9yPXF1ZXN0aW9uKSkgKwogIGdlb21fbGluZSgpICsgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjMgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlbS0lWSIpKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAidmVydGljYWwiKSsKICBsYWJzKHRpdGxlID0gIkdhbGxvbnMgb2YgT2lsIFNhdmVkIEVhY2ggV2VlayBieSBSZWN5Y2xpbmciKSArIAogICAgICAgeGxhYigiRGF0ZSIpKyAKICAgICAgIHlsYWIoIkdhbGxvbnMgb2YgT2lsIFNhdmVkIEVhY2ggV2VlayIpKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKGZyb20gPSAwLCB0byA9IDYsIGJ5ID0gMSkpCgpnNiA8LSBnZ3Bsb3QocmVjeWNsZV95ZXMsIGFlcyh4PWRhdGUsIHk9Y3Vtc3VtX2NhcmJvbiwgY29sb3I9cXVlc3Rpb24pKSArCiAgZ2VvbV9saW5lKCkgKyBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMyBtb250aCIsIGRhdGVfbGFiZWxzID0gIiVtLSVZIikrIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJ2ZXJ0aWNhbCIpKwogIGxhYnModGl0bGUgPSAiS2lsb2dyYW1zIG9mIENPMiBTYXZlZCBFYWNoIFdlZWsgYnkgUmVjeWNsaW5nIikgKyAKICAgICAgIHhsYWIoIkRhdGUiKSsgCiAgICAgICB5bGFiKCJLZyBvZiBDTzIgU2F2ZWQgRWFjaCBXZWVrIikrIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoZnJvbSA9IDAsIHRvID0gNjAsIGJ5ID0gMTApKQoKCgpgYGAKCmBgYHtyIFRpbWUgU2VyaWVzLCBlY2hvPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD0gNSwgZmlnLndpZHRoPTcsIGRwaT05Nn0KCmcxCmcyCmczCgpgYGAKCgoKIyBDb25jbHVzaW9uCgpUaGlzIHByb2plY3QgZW1waGFzaXplcyB0aGUgcG90ZW50aWFsIGZvciB0aGUgR3JlZW4gT2ZmaWNlIENoYWxsZW5nZSB0byBiZSBhIG1ham9yIGZhY2V0IG9mIE5vcnRoZWFzdGVybiBVbml2ZXJzaXR5J3MgU3VzdGFpbmFiaWxpdHkgYW5kIENsaW1hdGUgZ29hbHMuIFRoZSBlbnZpcm9ubWVudGFsIGltcGFjdCBvZiB0aGVzZSBzaXggcXVlc3Rpb25zIGlzIHNpZ25pZmljYW50IGV2ZW4gdW5kZXIgY29uc2VydmF0aXZlIGFzc3VtcHRpb25zLiBCeSBnYXRoZXJpbmcgbW9yZSBhY2N1cmF0ZSBkYXRhIGluIHBsYWNlIG9mIHRoZXNlIGFzc3VtcHRpb25zLCB3ZSBjYW4gZGVtb25zdHJhdGUgdGhlIGltcGFjdCBvZiB0aGlzIHByb2dyYW0gYXQgdGhlIGluZGl2aWR1YWwsIGRlcGFydG1lbnQsIGFuZCBjYW1wdXMgbGV2ZWwgYWNyb3NzIGEgbXVjaCBicm9hZGVyIHZhcmlldHkgb2YgZW52aXJvbm1lbnRhbCBpbXBhY3RzLiBUaGlzIGluZm9ybWF0aW9uIGNhbiBwbGF5IGEgY2VudHJhbCByb2xlIGluIGhlbHBpbmcgcGFydGljaXBhbnRzIG9mIHRoZSBHcmVlbiBPZmZpY2UgQ2hhbGxlbmdlIHVuZGVyc3RhbmQgdGhlIGltcGFjdCBvZiB0aGVpciBlZmZvcnRzIGFuZCBjb21taXQgdG8gdGFraW5nIGZ1cnRoZXIgYWN0aW9uLgoKCgo=