1 activity

This week, you have learned about how different susceptibility-shaping mechanisms can have a big impact on disease dynamics. In this exercise, your task is to bring these mechanisms - population turnover, vaccination and waning immunity - together to investigate a public health question. By now hopefully you will be familiar with the general approach used, to simulate a model in R. This etivity is less structured, so it allows you to independently practice what you have learnt over the whole course so far. Here are the instructions:

A neonatal vaccine has recently become available against an endemic viral infection in livestock. The Ministry of Agriculture has asked you to model the impact of different vaccination scenarios to inform the design of a farm animal vaccination programme. They provide you with the following information: - The infection rate of the disease in this population is 1 day\(^{-1}\) and the average duration of the infectious period is 20 days. - The average lifespan of the population is 3 years. - The total population size in the country is 300000 and has not varied over time. The disease is endemic but thought to be relatively rare in this population. - The vaccine, which has perfect efficacy, is given to a proportion p_vacc of newborn animals (that is, it is a neonatal vaccine). It is currently not known whether immunity to the disease and to the vaccine is life-long or wanes over time.

They want you to run the model to endemic equilibrum to answer the questions below.

Tip: It might be helpful to first read all the questions and think about what kind of model structure and parameters you need to be able to answer them all, and draw a diagram of the model structure before coding it. You have covered all these principles separately in the course so far, so if you struggle with a specific aspect you might want to look back at previous etivities. But don’t worry - the etivity is designed to be challenging and get you thinking about how to develop and use a model to answer a specific research question!

1.0.1 What is the endemic prevalence of the disease currently (the baseline prevalence), assuming permanent immunity?

1.0.2 What proportion of newborn animals would you need to vaccinate to reduce the prevalence by half, assuming life-long immunity?

1.0.3 Would it be possible to eliminate the disease from the population using neonatal vaccination under the assumption of lifelong immunity?

1.0.4 If the average duration of immunity is only 1 year, how would this impact the proportional reduction in the prevalence with the vaccine coverage you obtained above compared to the baseline?

1.0.5 Would it be possible to eliminate the disease from the population using neonatal vaccination under these assumptions?

1.0.6 If an adjuvant (a vaccine promoter) was given along with the vaccine, that would extend the duration of immunity to 2.5 years on average, what vaccine coverage would be needed to reduce the baseline prevalence by half? Would it be possible to eliminate the disease from the population under these assumptions using neonatal vaccination?

1.0.7 Based on your results, what overall recommendation would you give to the Minister?

1.0.8 Also provide some information to help the Minister interpret these results. Write down the assumptions in your modelling approach that you think might affect your results. Are there any adaptations you could make to the model structure that would make it more realistic or that would allow you to answer more detailed questions?

2 solution

2.1 Setting up the model:

The SIR structure needs to be extended to incorporate vaccinated births (going into the R compartment), unvaccinated births (going into the S compartment), deaths, and waning immunity. As we are modelling an endemic infection, the initial conditions for the population don’t matter as long as they add up to 300000 according to the instructions (this is because all initial conditions will end up at the same endemic equilibrium, given enough time). For the baseline scenario, we are assuming no vaccine coverage (p_vacc = 0) and no waning of immunity (\(\sigma\) = 0).

#<img src="w4_nb4_model_diagram.png">

2.2 Modelling the baseline (no vaccination) assuming permanent immunity:

# LOAD THE PACKAGES:
library(deSolve)
library(reshape2)
library(ggplot2)

# MODEL INPUTS:

# Vector storing the initial number in each compartment (at timestep 0)

N <- 300000

initial_state_values <- c(S = 0.5*N,  
                          I = 0.05*N,      
                          R = 0.45*N)     
# the exact proportions here don't matter, we have chosen an infection prevalence of 5% to start with in line with the
# information that the disease is thought to be relatively rare in this population. 
# As described above, any initial conditions will converge on the same endemic equilibrium, given enough time.

# Vector storing the parameters describing the transition rates in units of years^-1
parameters <- c(beta = 365/1,            # the infection rate
                gamma = 365/20,          # the rate of recovery
                mu = 1/3,                # the background mortality rate
                b = 1/3,                 # the birth rate
                p_vacc = 0,              # the neonatal vaccine coverage
                sigma = 0)               # the rate at which immunity wanes                   

# TIMESTEPS:

# Vector storing the sequence of timesteps to solve the model at
times <- seq(from = 0, to = 5, by = 1/365)   # from 0 to 5 years in daily intervals
# We are simulating over a period of 10 years to allow the model to come to equilibrium. 
# You might need a different timespan depending on the initial conditions you chose.

# SIR MODEL FUNCTION: 

# The model function takes as input arguments (in the following order): time, state and parameters
sir_model <- function(time, state, parameters) {  

    with(as.list(c(state, parameters)), {  # tell R to unpack variable names from the state and parameters inputs   
        
    # Calculating the total population size N (the sum of the number of people in each compartment)
      N <- S+I+R
      
    # Defining lambda as a function of beta and I:
      lambda <- beta * I/N
        
    # The differential equations
      dS <- -lambda*S - mu*S + (1-p_vacc)*b*N + sigma*R           
      dI <- lambda*S - gamma*I  - mu*I           
      dR <- gamma*I - mu*R  + p_vacc*b*N - sigma*R   
    
    # Because this is a neonatal vaccine (given straight after birth), we model this simply as a proportion p_vacc
    # of births entering the R compartment (Recovered/Immune),
    # with the remaining births (1-p_vacc) entering the susceptible compartment.
      
    # Output the number in the S, I and R compartments at each timestep 
    # (in the same order as the input state variables)
    return(list(c(dS, dI, dR))) 
    })
  
}

# MODEL OUTPUT (solving the differential equations):

# Solving the differential equations using the ode integration algorithm
output <- as.data.frame(ode(y = initial_state_values, 
                            times = times, 
                            func = sir_model,
                            parms = parameters))

# PLOT

output_long <- melt(as.data.frame(output), id = "time")                  # turn output dataset into long format

# Calculating the proportion in each compartment as a column in the long-format output
output_long$proportion <- output_long$value/sum(initial_state_values)

# Plot the proportion in the S, I and R compartments over time
ggplot(data = output_long,                                               # specify object containing data to plot
       aes(x = time, y = proportion, colour = variable, group = variable)) +  # assign columns to axes and groups
  geom_line() +                                                          # represent data as lines
  xlab("Time (years)")+                                                  # add label for x axis
  ylab("Prevalence (proportion)") +                                      # add label for y axis
  labs(colour = "Compartment",                                           # add legend title  
       title = "Baseline prevalence of susceptible, infected and recovered animals over time")

### What is the endemic prevalence of the disease currently (the baseline prevalence), assuming permanent immunity?
# The prevalence seems to have stabilised by 2 years:
# calculating the prevalence in year 2
output_long$proportion[round(output_long$time,0) == 2 & output_long$variable == "I"][1]
## [1] 0.01703558
# Note that here we are selecting the proportion infected at timestep 2, 
# but since the timesteps are not exact numbers, we are selecting the timesteps that, when rounded to 0 decimals,
# is and display only the first one of those

The baseline prevalence is 1.7%.

From the output, we can also get the number in each compartment at endemic equilibrium and use these as the initial conditions in the vaccine model:

output[output$time == 2,]  # print state values at equilibrium
##     time        S        I        R
## 731    2 15253.83 5125.043 279621.1

2.3 Reducing the prevalence to around 0.85% using the neonatal vaccine, assuming permanent immunity:

# Before introducing a vaccine, change initial state values to baseline endemic equilibrium
initial_state_values <- c(S = 15254,  
                          I = 5125,      
                          R = 279621)    

parameters["p_vacc"] <- 0.5   # try different coverage values to find an endemic prevalence of half the baseline prevalence

# MODEL OUTPUT (solving the differential equations):

# Solving the differential equations using the ode integration algorithm
output <- as.data.frame(ode(y = initial_state_values, 
                             times = times, 
                             func = sir_model,
                             parms = parameters))

output_long <- melt(as.data.frame(output), id = "time")                  # turn output dataset into long format

# Calculating the proportion in each compartment as a column in the long-format output
output_long$proportion <- output_long$value/sum(initial_state_values)

# PLOT

# Plot the proportion in the I compartment over time: divide the number in I over time by the total population size
ggplot(data = output,                                                    # specify object containing data to plot
       aes(x = time, y = output$I/N)) +                                  # assign columns to axes and groups
  geom_line() +                                                          # represent data as lines
  xlab("Time (years)")+                                                  # add label for x axis
  ylab("Prevalence (proportion)") +                                      # add label for y axis
  labs(colour = "Compartment",                                           # add legend title  
       title = "Infection prevalence with neonatal vaccine coverage of 50%")
## Warning: Use of `output$I` is discouraged. Use `I` instead.

# Calculating the prevalence in year 5 (introduction of the vaccine at first perturbs the initial equilibrium, but
# we are interested in the new endemic equilibrium achieved with vaccination)

output_long$proportion[round(output_long$time,0) == 5 & output_long$variable == "I"][1]
## [1] 0.008058337

2.3.1 What proportion of newborn animals would you need to vaccinate to reduce the prevalence by half, assuming life-long immunity?

If immunity induced by infection and vaccination is lifelong, we only need to vaccinate around 50% of all newborns to achieve a reduction of the endemic prevalence to less than 0.85%.

2.4 Increasing the vaccine coverage to achieve elimination:

parameters["p_vacc"] <- 0.95   # try different coverage values to see if the disease persists

# MODEL OUTPUT (solving the differential equations):

# Solving the differential equations using the ode integration algorithm
output <- as.data.frame(ode(y = initial_state_values, 
                             times = times, 
                             func = sir_model,
                             parms = parameters))

output_long <- melt(as.data.frame(output), id = "time")                  # turn output dataset into long format

# Calculating the proportion in each compartment as a column in the long-format output
output_long$proportion <- output_long$value/sum(initial_state_values)

# PLOT

# Plot the proportion in the I compartment over time: divide number in I over time by the total population size
ggplot(data = output,                                                    # specify object containing data to plot
       aes(x = time, y = output$I/N)) +                                  # assign columns to axes and groups
  geom_line() +                                                          # represent data as lines
  xlab("Time (years)")+                                                  # add label for x axis
  ylab("Prevalence (proportion)") +                                      # add label for y axis
  labs(colour = "Compartment",                                           # add legend title  
       title = "Infection prevalence with neonatal vaccine coverage of 95%")
## Warning: Use of `output$I` is discouraged. Use `I` instead.

# Double-check how many animals remain infected at the 5 year timestep
output[round(output$time,0) == 5,"I"][1]
## [1] 4.904184e-09

2.4.1 Would it be possible to eliminate the disease from the population using neonatal vaccination under the assumption of lifelong immunity?

The model suggests that yes, with a vaccine coverage of 95% or higher, it appears that the disease dies out. We could define elimination as the reduction of prevalence to a certain threshold value. Here, we have simply checked that infection dies out eventually, with a prevalence that tends towards zero over time and less than 1 animal remaining infected at the end of the simulation.

2.5 Modelling the baseline prevalence and impact of vaccination assuming immunity with an average duration of 1 year:

# BASELINE SCENARIO WITH WANING IMMUNITY

initial_state_values <- c(S = 0.5*N,  
                          I = 0.05*N,      
                          R = 0.45*N)

parameters["p_vacc"] <- 0
parameters["sigma"] <- 1

waning_baseline <- as.data.frame(ode(y = initial_state_values, 
                                     times = times, 
                                     func = sir_model,
                                     parms = parameters))

waning_baseline_long <- melt(as.data.frame(waning_baseline), id = "time")   

# Calculating the proportion in each compartment
waning_baseline_long$proportion <- waning_baseline_long$value/sum(initial_state_values)

# VACCINE SCENARIO WITH WANING IMMUNITY

parameters["p_vacc"] <- 0.5
parameters["sigma"] <- 1

waning_vacc <- as.data.frame(ode(y = initial_state_values, 
                                     times = times, 
                                     func = sir_model,
                                     parms = parameters))

waning_vacc_long <- melt(as.data.frame(waning_vacc), id = "time")   

# Calculating the proportion in each compartment
waning_vacc_long$proportion <- waning_vacc_long$value/sum(initial_state_values)

# PLOTTING THE 2 SCENARIOS

# Baseline
ggplot(data = waning_baseline,                                           # specify object containing data to plot
       aes(x = time, y = I/N)) +                                         # assign columns to axes and groups
  geom_line() +                                                          # represent data as lines
  xlab("Time (years)")+                                                  # add label for x axis
  ylab("Prevalence (proportion)") +                                      # add label for y axis
  labs(colour = "Compartment",                                           # add legend title  
       title = "Baseline prevalence with waning immunity") +
  ylim(c(0,0.4))                                                         # define y axis range to be plotted (0-0.4)

# With vaccine
ggplot(data = waning_vacc,                                               # specify object containing data to plot
       aes(x = time, y = I/N)) +                                         # assign columns to axes and groups
  geom_line() +                                                          # represent data as lines
  xlab("Time (years)")+                                                  # add label for x axis
  ylab("Prevalence (proportion)") +                                      # add label for y axis
  labs(colour = "Compartment",                                           # add legend title  
       title = "Prevalence with waning immunity and vaccine coverage of 50%") +
  ylim(c(0,0.4))                                                         # define y axis range to be plotted (0-0.4)

# Calculating the baseline prevalence with waning immunity
waning_baseline_prev <- waning_baseline_long$proportion[round(waning_baseline_long$time,0) == 2 & 
                                                        waning_baseline_long$variable == "I"][1]

# Calculating the endemic prevalence with waning immunity and neonatal vaccination coverage of 50%
waning_vacc_prev <- waning_vacc_long$proportion[round(waning_vacc_long$time,0) == 2 & 
                                                waning_vacc_long$variable == "I"][1]

# Calculating the reduction in prevalence achieved with 50% neonatal vaccine coverage:
1-waning_vacc_prev/waning_baseline_prev
## [1] 0.1317056

2.5.1 If the average duration of immunity is only 1 year, how would this impact the proportional reduction in the prevalence with the vaccine coverage you obtained above compared to the baseline?

If immunity is not permanent but wanes on average after a duration of 1 year in the recovered compartment, a neonatal vaccine coverage of 50% now only leads to a 13% reduction in disease prevalence compared to baseline, rather than 50%.

2.6 Modelling the impact of vaccination with 100% coverage assuming immunity with an average duration of 1 year:

# VACCINE SCENARIO WITH WANING IMMUNITY: INCREASING COVERAGE TO 100%

parameters["p_vacc"] <- 1
parameters["sigma"] <- 1

waning_vacc <- as.data.frame(ode(y = initial_state_values, 
                                     times = times, 
                                     func = sir_model,
                                     parms = parameters))

# With vaccine
ggplot(data = waning_vacc,                                      # specify object containing data to plot
       aes(x = time, y = I/N)) +  # assign columns to axes and groups
  geom_line() +                                                          # represent data as lines
  xlab("Time (years)")+                                                  # add label for x axis
  ylab("Prevalence (proportion)") +                                      # add label for y axis
  labs(colour = "Compartment",                                           # add legend title  
       title = "Prevalence with waning immunity and vaccine coverage of 100%") +
ylim(c(0,0.4))

2.6.1 Would it be possible to eliminate the disease from the population using neonatal vaccination under these assumptions? What minimum vaccine coverage would this require?

If immunity only persists for 1 year on average, the model prediction suggests elimination of the disease using neonatal vaccination alone would not be possible. Even with 100% coverage, the prevalence remains at around 5%.

2.7 Modelling the baseline prevalence and impact of vaccination with 100% coverage assuming immunity with an average duration of 2.5 years:

# BASELINE SCENARIO WITH WANING IMMUNITY

parameters["p_vacc"] <- 0
parameters["sigma"] <- 1/2.5

waning_baseline <- as.data.frame(ode(y = initial_state_values, 
                                     times = times, 
                                     func = sir_model,
                                     parms = parameters))

waning_baseline_long <- melt(as.data.frame(waning_baseline), id = "time")   

# Calculating the proportion in each compartment
waning_baseline_long$proportion <- waning_baseline_long$value/sum(initial_state_values)

# VACCINE SCENARIO WITH WANING IMMUNITY

parameters["p_vacc"] <- 1
parameters["sigma"] <- 1/2.5

waning_vacc <- as.data.frame(ode(y = initial_state_values, 
                                     times = times, 
                                     func = sir_model,
                                     parms = parameters))

waning_vacc_long <- melt(as.data.frame(waning_vacc), id = "time")   

# Calculating the proportion in each compartment
waning_vacc_long$proportion <- waning_vacc_long$value/sum(initial_state_values)

# Calculating the baseline prevalence with slower waning immunity
print("Baseline prevalence:")
## [1] "Baseline prevalence:"
waning_baseline_long$proportion[round(waning_baseline_long$time,0) == 2 & waning_baseline_long$variable == "I"][1]
## [1] 0.03666481
# Calculating the endemic prevalence with slower waning immunity and neonatal vaccination coverage of 100%
print("Prevalence with neonatal vaccine coverage of 100%:")
## [1] "Prevalence with neonatal vaccine coverage of 100%:"
waning_vacc_long$proportion[round(waning_vacc_long$time,0) == 2 & waning_vacc_long$variable == "I"][1]
## [1] 0.0189942

2.7.1 If an adjuvant (a vaccine promoter) was given along with the vaccine, that would extend the duration of immunity to 2.5 years on average, what vaccine coverage would be needed to reduce the baseline prevalence by half? Would it be possible to eliminate the disease from the population under these assumptions using neonatal vaccination?

If the average duration of immunity was increased to an average of 2.5 years by giving an adjuvant, the baseline prevalence could be reduced to about half (from 3.7% to 1.9%) by achieving a neonatal vaccine coverage of 100%. This means that neonatal vaccination alone is not enough to eliminate the disease from the population as it remains endemic even if every newborn animal is vaccinated.

2.7.2 Based on your results, what overall recommendation would you give to the Minister?

The modelling analysis suggests that neonatal vaccination can lead to substantial reductions in endemic prevalence of the disease if recovery and vaccination provide long-term immunity, even if not lifelong. However, the vaccine coverage required to achieve a halving of the endemic prevalence and the impact of the neonatal vaccination in general are strongly dependent on the assumptions we make about waning of immunity. If immunity is only short-term, even perfect coverage of the neonatal vaccine would have limited impact, and elimination of the disease seems only possible if immunity does not wane.

Therefore, the modelling results are inconclusive regarding the current prevalence and the impact of neonatal vaccination until further knowledge on the waning or persistence of immunity becomes available. The Minister could consider investing into further research on this. If neonatal vaccination is implemented and immunity is found to wane quickly, addition of an adjuvant could improve the impact of vaccination.

2.7.3 Also provide some information to help the Minister interpret these results. Write down the assumptions in your modelling approach that you think might affect your results. Are there any adaptations you could make to the model structure that would make it more realistic or that would allow you to answer more detailed questions?

The results have shown that the conclusions strongly depend on the assumptions we made about the rate of waning of immunity. Other assumptions that might impact our results are for example: - we assume vaccination is applied to a proportion p_vacc of births at every timestep, i.e. to all newborns all the time - we assume vaccine-induced immunity and immunity provided by recovery from natural infection confer the same protection and wane at the same time - we assume transmission is independent of age-mixing, but the vaccine is only given to newborns, so its effect might change depending on the rate at which different age groups transmit and acquire infection

In future weeks, we will see how to stratify the model into different age groups, to allow for mixing between these groups. We could also investigate the effect these assumptions have on the result by having separate immune compartments and waning rates for those recovered and those vaccinated. We could also give more information on the timescales of this intervention by modelling the baseline case and vaccine introduction chronologically. In this example, we have only modelled the disease with or without the intervention and compared the prevalence at an arbitrarily chosen timepoint after the system has reached equilibrium. It would be more realistic and informative to model introduction of the vaccine at a specific time after the endemic equilibrium has been reached, i.e. by running the model with p_vacc = 0 until the current year and changing p_vacc for this timestep onwards to represent introduction of the vaccine. This would allow us for example to investigate how long it takes for prevalence to be reduced by half by the vaccine.

2.8 Take-home message

Well done on completing the first specialisation and this challenging etivity! Hopefully you have seen from this exercise that vaccination coverage decisions are affected by a range of population factors, and it can be helpful to see these as different (and sometimes competing) ways of shaping population immunity and susceptibility. Of course, the infection dynamics we see in the real world arise from a combination of many different factors, and the effects of the different susceptibility-shaping mechanisms we covered separately this week might look different when they come together.

After learning about the theory of infectious disease dynamics and coding models in R over the past few weeks, this exercise has also given you a first insight into how models can be used in practice to answer public health questions. Model predictions, for example of intervention impact, can vary a lot depending on the assumptions we make about the model structure and the parameter values. But don’t worry if you struggled or don’t fully understand everything in this etivity yet - in the next weeks, you will learn more about how models can be developed to describe an infection process more realistically, and how they can be linked to data to achieve a more accurate representation of the real world.

LS0tDQp0aXRsZTogIk5lb25hdGFsIFZhY2NpbmF0aW9uIHRvIFJlZHVjZSBQcmV2YWxlbmNlIG9mIGFuIEVuZGVtaWMgRGlzZWFzZSBpbiBMaXZlc3RvY2sgKFc0IFNJUikiDQphdXRob3I6ICJCSW5oIFRoYW5nIFRyYW4iDQpkYXRlOiAiNS8yNi8yMDIwIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQojIGFjdGl2aXR5DQoNClRoaXMgd2VlaywgeW91IGhhdmUgbGVhcm5lZCBhYm91dCBob3cgZGlmZmVyZW50IHN1c2NlcHRpYmlsaXR5LXNoYXBpbmcgbWVjaGFuaXNtcyBjYW4gaGF2ZSBhIGJpZyBpbXBhY3Qgb24gZGlzZWFzZSBkeW5hbWljcy4gSW4gdGhpcyBleGVyY2lzZSwgeW91ciB0YXNrIGlzIHRvIGJyaW5nIHRoZXNlIG1lY2hhbmlzbXMgLSBwb3B1bGF0aW9uIHR1cm5vdmVyLCB2YWNjaW5hdGlvbiBhbmQgd2FuaW5nIGltbXVuaXR5IC0gdG9nZXRoZXIgdG8gaW52ZXN0aWdhdGUgYSBwdWJsaWMgaGVhbHRoIHF1ZXN0aW9uLiBCeSBub3cgaG9wZWZ1bGx5IHlvdSB3aWxsIGJlIGZhbWlsaWFyIHdpdGggdGhlIGdlbmVyYWwgYXBwcm9hY2ggdXNlZCwgdG8gc2ltdWxhdGUgYSBtb2RlbCBpbiBSLiBUaGlzIGV0aXZpdHkgaXMgbGVzcyBzdHJ1Y3R1cmVkLCBzbyBpdCBhbGxvd3MgeW91IHRvIGluZGVwZW5kZW50bHkgcHJhY3RpY2Ugd2hhdCB5b3UgaGF2ZSBsZWFybnQgb3ZlciB0aGUgd2hvbGUgY291cnNlIHNvIGZhci4gSGVyZSBhcmUgdGhlIGluc3RydWN0aW9uczoNCg0KQSBuZW9uYXRhbCB2YWNjaW5lIGhhcyByZWNlbnRseSBiZWNvbWUgYXZhaWxhYmxlIGFnYWluc3QgYW4gZW5kZW1pYyB2aXJhbCBpbmZlY3Rpb24gaW4gbGl2ZXN0b2NrLiBUaGUgTWluaXN0cnkgb2YgQWdyaWN1bHR1cmUgaGFzIGFza2VkIHlvdSB0byBtb2RlbCB0aGUgaW1wYWN0IG9mIGRpZmZlcmVudCB2YWNjaW5hdGlvbiBzY2VuYXJpb3MgdG8gaW5mb3JtIHRoZSBkZXNpZ24gb2YgYSBmYXJtIGFuaW1hbCB2YWNjaW5hdGlvbiBwcm9ncmFtbWUuIFRoZXkgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOg0KLSBUaGUgaW5mZWN0aW9uIHJhdGUgb2YgdGhlIGRpc2Vhc2UgaW4gdGhpcyBwb3B1bGF0aW9uIGlzIDEgZGF5JF57LTF9JCBhbmQgdGhlIGF2ZXJhZ2UgZHVyYXRpb24gb2YgdGhlIGluZmVjdGlvdXMgcGVyaW9kIGlzIDIwIGRheXMuIA0KLSBUaGUgYXZlcmFnZSBsaWZlc3BhbiBvZiB0aGUgcG9wdWxhdGlvbiBpcyAzIHllYXJzLg0KLSBUaGUgdG90YWwgcG9wdWxhdGlvbiBzaXplIGluIHRoZSBjb3VudHJ5IGlzIDMwMDAwMCBhbmQgaGFzIG5vdCB2YXJpZWQgb3ZlciB0aW1lLiBUaGUgZGlzZWFzZSBpcyBlbmRlbWljIGJ1dCB0aG91Z2h0IHRvIGJlIHJlbGF0aXZlbHkgcmFyZSBpbiB0aGlzIHBvcHVsYXRpb24uDQotIFRoZSB2YWNjaW5lLCB3aGljaCBoYXMgcGVyZmVjdCBlZmZpY2FjeSwgaXMgZ2l2ZW4gdG8gYSBwcm9wb3J0aW9uICpwX3ZhY2MqIG9mIG5ld2Jvcm4gYW5pbWFscyAodGhhdCBpcywgaXQgaXMgYSBuZW9uYXRhbCB2YWNjaW5lKS4gSXQgaXMgY3VycmVudGx5IG5vdCBrbm93biB3aGV0aGVyIGltbXVuaXR5IHRvIHRoZSBkaXNlYXNlIGFuZCB0byB0aGUgdmFjY2luZSBpcyBsaWZlLWxvbmcgb3Igd2FuZXMgb3ZlciB0aW1lLg0KDQpUaGV5IHdhbnQgeW91IHRvIHJ1biB0aGUgbW9kZWwgdG8gZW5kZW1pYyBlcXVpbGlicnVtIHRvIGFuc3dlciB0aGUgcXVlc3Rpb25zIGJlbG93Lg0KDQoqKlRpcDoqKiBJdCBtaWdodCBiZSBoZWxwZnVsIHRvIGZpcnN0IHJlYWQgYWxsIHRoZSBxdWVzdGlvbnMgYW5kIHRoaW5rIGFib3V0IHdoYXQga2luZCBvZiBtb2RlbCBzdHJ1Y3R1cmUgYW5kIHBhcmFtZXRlcnMgeW91IG5lZWQgdG8gYmUgYWJsZSB0byBhbnN3ZXIgdGhlbSBhbGwsIGFuZCBkcmF3IGEgZGlhZ3JhbSBvZiB0aGUgbW9kZWwgc3RydWN0dXJlIGJlZm9yZSBjb2RpbmcgaXQuIFlvdSBoYXZlIGNvdmVyZWQgYWxsIHRoZXNlIHByaW5jaXBsZXMgc2VwYXJhdGVseSBpbiB0aGUgY291cnNlIHNvIGZhciwgc28gaWYgeW91IHN0cnVnZ2xlIHdpdGggYSBzcGVjaWZpYyBhc3BlY3QgeW91IG1pZ2h0IHdhbnQgdG8gbG9vayBiYWNrIGF0IHByZXZpb3VzIGV0aXZpdGllcy4gQnV0IGRvbid0IHdvcnJ5IC0gdGhlIGV0aXZpdHkgaXMgZGVzaWduZWQgdG8gYmUgY2hhbGxlbmdpbmcgYW5kIGdldCB5b3UgdGhpbmtpbmcgYWJvdXQgaG93IHRvIGRldmVsb3AgYW5kIHVzZSBhIG1vZGVsIHRvIGFuc3dlciBhIHNwZWNpZmljIHJlc2VhcmNoIHF1ZXN0aW9uIQ0KDQojIyMgV2hhdCBpcyB0aGUgZW5kZW1pYyBwcmV2YWxlbmNlIG9mIHRoZSBkaXNlYXNlIGN1cnJlbnRseSAodGhlIGJhc2VsaW5lIHByZXZhbGVuY2UpLCBhc3N1bWluZyBwZXJtYW5lbnQgaW1tdW5pdHk/DQojIyMgV2hhdCBwcm9wb3J0aW9uIG9mIG5ld2Jvcm4gYW5pbWFscyB3b3VsZCB5b3UgbmVlZCB0byB2YWNjaW5hdGUgdG8gcmVkdWNlIHRoZSBwcmV2YWxlbmNlIGJ5IGhhbGYsIGFzc3VtaW5nIGxpZmUtbG9uZyBpbW11bml0eT8NCiMjIyBXb3VsZCBpdCBiZSBwb3NzaWJsZSB0byBlbGltaW5hdGUgdGhlIGRpc2Vhc2UgZnJvbSB0aGUgcG9wdWxhdGlvbiB1c2luZyBuZW9uYXRhbCB2YWNjaW5hdGlvbiB1bmRlciB0aGUgYXNzdW1wdGlvbiBvZiBsaWZlbG9uZyBpbW11bml0eT8NCiMjIyBJZiB0aGUgYXZlcmFnZSBkdXJhdGlvbiBvZiBpbW11bml0eSBpcyBvbmx5IDEgeWVhciwgaG93IHdvdWxkIHRoaXMgaW1wYWN0IHRoZSBwcm9wb3J0aW9uYWwgcmVkdWN0aW9uIGluIHRoZSBwcmV2YWxlbmNlIHdpdGggdGhlIHZhY2NpbmUgY292ZXJhZ2UgeW91IG9idGFpbmVkIGFib3ZlIGNvbXBhcmVkIHRvIHRoZSBiYXNlbGluZT8gDQojIyMgV291bGQgaXQgYmUgcG9zc2libGUgdG8gZWxpbWluYXRlIHRoZSBkaXNlYXNlIGZyb20gdGhlIHBvcHVsYXRpb24gdXNpbmcgbmVvbmF0YWwgdmFjY2luYXRpb24gdW5kZXIgdGhlc2UgYXNzdW1wdGlvbnM/DQojIyMgSWYgYW4gYWRqdXZhbnQgKGEgdmFjY2luZSBwcm9tb3Rlcikgd2FzIGdpdmVuIGFsb25nIHdpdGggdGhlIHZhY2NpbmUsIHRoYXQgd291bGQgZXh0ZW5kIHRoZSBkdXJhdGlvbiBvZiBpbW11bml0eSB0byAyLjUgeWVhcnMgb24gYXZlcmFnZSwgd2hhdCB2YWNjaW5lIGNvdmVyYWdlIHdvdWxkIGJlIG5lZWRlZCB0byByZWR1Y2UgdGhlIGJhc2VsaW5lIHByZXZhbGVuY2UgYnkgaGFsZj8gV291bGQgaXQgYmUgcG9zc2libGUgdG8gZWxpbWluYXRlIHRoZSBkaXNlYXNlIGZyb20gdGhlIHBvcHVsYXRpb24gdW5kZXIgdGhlc2UgYXNzdW1wdGlvbnMgdXNpbmcgbmVvbmF0YWwgdmFjY2luYXRpb24/DQojIyMgQmFzZWQgb24geW91ciByZXN1bHRzLCB3aGF0IG92ZXJhbGwgcmVjb21tZW5kYXRpb24gd291bGQgeW91IGdpdmUgdG8gdGhlIE1pbmlzdGVyPw0KIyMjIEFsc28gcHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIHRvIGhlbHAgdGhlIE1pbmlzdGVyIGludGVycHJldCB0aGVzZSByZXN1bHRzLiBXcml0ZSBkb3duIHRoZSBhc3N1bXB0aW9ucyBpbiB5b3VyIG1vZGVsbGluZyBhcHByb2FjaCB0aGF0IHlvdSB0aGluayBtaWdodCBhZmZlY3QgeW91ciByZXN1bHRzLiBBcmUgdGhlcmUgYW55IGFkYXB0YXRpb25zIHlvdSBjb3VsZCBtYWtlIHRvIHRoZSBtb2RlbCBzdHJ1Y3R1cmUgdGhhdCB3b3VsZCBtYWtlIGl0IG1vcmUgcmVhbGlzdGljIG9yIHRoYXQgd291bGQgYWxsb3cgeW91IHRvIGFuc3dlciBtb3JlIGRldGFpbGVkIHF1ZXN0aW9ucz8NCg0KDQoNCiMgc29sdXRpb24NCg0KDQojIyBTZXR0aW5nIHVwIHRoZSBtb2RlbDogDQoNClRoZSBTSVIgc3RydWN0dXJlIG5lZWRzIHRvIGJlIGV4dGVuZGVkIHRvIGluY29ycG9yYXRlIHZhY2NpbmF0ZWQgYmlydGhzIChnb2luZyBpbnRvIHRoZSBSIGNvbXBhcnRtZW50KSwgdW52YWNjaW5hdGVkIGJpcnRocyAoZ29pbmcgaW50byB0aGUgUyBjb21wYXJ0bWVudCksIGRlYXRocywgYW5kIHdhbmluZyBpbW11bml0eS4gQXMgd2UgYXJlIG1vZGVsbGluZyBhbiBlbmRlbWljIGluZmVjdGlvbiwgdGhlIGluaXRpYWwgY29uZGl0aW9ucyBmb3IgdGhlIHBvcHVsYXRpb24gZG9uJ3QgbWF0dGVyIGFzIGxvbmcgYXMgdGhleSBhZGQgdXAgdG8gMzAwMDAwIGFjY29yZGluZyB0byB0aGUgaW5zdHJ1Y3Rpb25zICh0aGlzIGlzIGJlY2F1c2UgYWxsIGluaXRpYWwgY29uZGl0aW9ucyB3aWxsIGVuZCB1cCBhdCB0aGUgc2FtZSBlbmRlbWljIGVxdWlsaWJyaXVtLCBnaXZlbiBlbm91Z2ggdGltZSkuIEZvciB0aGUgYmFzZWxpbmUgc2NlbmFyaW8sIHdlIGFyZSBhc3N1bWluZyBubyB2YWNjaW5lIGNvdmVyYWdlICgqcF92YWNjKiA9IDApIGFuZCBubyB3YW5pbmcgb2YgaW1tdW5pdHkgKCRcc2lnbWEkID0gMCkuIA0KDQpgYGB7cn0NCiM8aW1nIHNyYz0idzRfbmI0X21vZGVsX2RpYWdyYW0ucG5nIj4NCmBgYA0KDQoNCiMjIE1vZGVsbGluZyB0aGUgYmFzZWxpbmUgKG5vIHZhY2NpbmF0aW9uKSBhc3N1bWluZyBwZXJtYW5lbnQgaW1tdW5pdHk6DQoNCmBgYHtyfQ0KIyBMT0FEIFRIRSBQQUNLQUdFUzoNCmxpYnJhcnkoZGVTb2x2ZSkNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgTU9ERUwgSU5QVVRTOg0KDQojIFZlY3RvciBzdG9yaW5nIHRoZSBpbml0aWFsIG51bWJlciBpbiBlYWNoIGNvbXBhcnRtZW50IChhdCB0aW1lc3RlcCAwKQ0KDQpOIDwtIDMwMDAwMA0KDQppbml0aWFsX3N0YXRlX3ZhbHVlcyA8LSBjKFMgPSAwLjUqTiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBJID0gMC4wNSpOLCAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gMC40NSpOKSAgICAgDQojIHRoZSBleGFjdCBwcm9wb3J0aW9ucyBoZXJlIGRvbid0IG1hdHRlciwgd2UgaGF2ZSBjaG9zZW4gYW4gaW5mZWN0aW9uIHByZXZhbGVuY2Ugb2YgNSUgdG8gc3RhcnQgd2l0aCBpbiBsaW5lIHdpdGggdGhlDQojIGluZm9ybWF0aW9uIHRoYXQgdGhlIGRpc2Vhc2UgaXMgdGhvdWdodCB0byBiZSByZWxhdGl2ZWx5IHJhcmUgaW4gdGhpcyBwb3B1bGF0aW9uLiANCiMgQXMgZGVzY3JpYmVkIGFib3ZlLCBhbnkgaW5pdGlhbCBjb25kaXRpb25zIHdpbGwgY29udmVyZ2Ugb24gdGhlIHNhbWUgZW5kZW1pYyBlcXVpbGlicml1bSwgZ2l2ZW4gZW5vdWdoIHRpbWUuDQoNCiMgVmVjdG9yIHN0b3JpbmcgdGhlIHBhcmFtZXRlcnMgZGVzY3JpYmluZyB0aGUgdHJhbnNpdGlvbiByYXRlcyBpbiB1bml0cyBvZiB5ZWFyc14tMQ0KcGFyYW1ldGVycyA8LSBjKGJldGEgPSAzNjUvMSwgICAgICAgICAgICAjIHRoZSBpbmZlY3Rpb24gcmF0ZQ0KICAgICAgICAgICAgICAgIGdhbW1hID0gMzY1LzIwLCAgICAgICAgICAjIHRoZSByYXRlIG9mIHJlY292ZXJ5DQogICAgICAgICAgICAgICAgbXUgPSAxLzMsICAgICAgICAgICAgICAgICMgdGhlIGJhY2tncm91bmQgbW9ydGFsaXR5IHJhdGUNCiAgICAgICAgICAgICAgICBiID0gMS8zLCAgICAgICAgICAgICAgICAgIyB0aGUgYmlydGggcmF0ZQ0KICAgICAgICAgICAgICAgIHBfdmFjYyA9IDAsICAgICAgICAgICAgICAjIHRoZSBuZW9uYXRhbCB2YWNjaW5lIGNvdmVyYWdlDQogICAgICAgICAgICAgICAgc2lnbWEgPSAwKSAgICAgICAgICAgICAgICMgdGhlIHJhdGUgYXQgd2hpY2ggaW1tdW5pdHkgd2FuZXMgICAgICAgICAgICAgICAgICAgDQoNCiMgVElNRVNURVBTOg0KDQojIFZlY3RvciBzdG9yaW5nIHRoZSBzZXF1ZW5jZSBvZiB0aW1lc3RlcHMgdG8gc29sdmUgdGhlIG1vZGVsIGF0DQp0aW1lcyA8LSBzZXEoZnJvbSA9IDAsIHRvID0gNSwgYnkgPSAxLzM2NSkgICAjIGZyb20gMCB0byA1IHllYXJzIGluIGRhaWx5IGludGVydmFscw0KIyBXZSBhcmUgc2ltdWxhdGluZyBvdmVyIGEgcGVyaW9kIG9mIDEwIHllYXJzIHRvIGFsbG93IHRoZSBtb2RlbCB0byBjb21lIHRvIGVxdWlsaWJyaXVtLiANCiMgWW91IG1pZ2h0IG5lZWQgYSBkaWZmZXJlbnQgdGltZXNwYW4gZGVwZW5kaW5nIG9uIHRoZSBpbml0aWFsIGNvbmRpdGlvbnMgeW91IGNob3NlLg0KDQojIFNJUiBNT0RFTCBGVU5DVElPTjogDQoNCiMgVGhlIG1vZGVsIGZ1bmN0aW9uIHRha2VzIGFzIGlucHV0IGFyZ3VtZW50cyAoaW4gdGhlIGZvbGxvd2luZyBvcmRlcik6IHRpbWUsIHN0YXRlIGFuZCBwYXJhbWV0ZXJzDQpzaXJfbW9kZWwgPC0gZnVuY3Rpb24odGltZSwgc3RhdGUsIHBhcmFtZXRlcnMpIHsgIA0KDQogICAgd2l0aChhcy5saXN0KGMoc3RhdGUsIHBhcmFtZXRlcnMpKSwgeyAgIyB0ZWxsIFIgdG8gdW5wYWNrIHZhcmlhYmxlIG5hbWVzIGZyb20gdGhlIHN0YXRlIGFuZCBwYXJhbWV0ZXJzIGlucHV0cyAgIA0KICAgICAgICANCiAgICAjIENhbGN1bGF0aW5nIHRoZSB0b3RhbCBwb3B1bGF0aW9uIHNpemUgTiAodGhlIHN1bSBvZiB0aGUgbnVtYmVyIG9mIHBlb3BsZSBpbiBlYWNoIGNvbXBhcnRtZW50KQ0KICAgICAgTiA8LSBTK0krUg0KICAgICAgDQogICAgIyBEZWZpbmluZyBsYW1iZGEgYXMgYSBmdW5jdGlvbiBvZiBiZXRhIGFuZCBJOg0KICAgICAgbGFtYmRhIDwtIGJldGEgKiBJL04NCiAgICAgICAgDQogICAgIyBUaGUgZGlmZmVyZW50aWFsIGVxdWF0aW9ucw0KICAgICAgZFMgPC0gLWxhbWJkYSpTIC0gbXUqUyArICgxLXBfdmFjYykqYipOICsgc2lnbWEqUiAgICAgICAgICAgDQogICAgICBkSSA8LSBsYW1iZGEqUyAtIGdhbW1hKkkgIC0gbXUqSSAgICAgICAgICAgDQogICAgICBkUiA8LSBnYW1tYSpJIC0gbXUqUiAgKyBwX3ZhY2MqYipOIC0gc2lnbWEqUiAgIA0KICAgIA0KICAgICMgQmVjYXVzZSB0aGlzIGlzIGEgbmVvbmF0YWwgdmFjY2luZSAoZ2l2ZW4gc3RyYWlnaHQgYWZ0ZXIgYmlydGgpLCB3ZSBtb2RlbCB0aGlzIHNpbXBseSBhcyBhIHByb3BvcnRpb24gcF92YWNjDQogICAgIyBvZiBiaXJ0aHMgZW50ZXJpbmcgdGhlIFIgY29tcGFydG1lbnQgKFJlY292ZXJlZC9JbW11bmUpLA0KICAgICMgd2l0aCB0aGUgcmVtYWluaW5nIGJpcnRocyAoMS1wX3ZhY2MpIGVudGVyaW5nIHRoZSBzdXNjZXB0aWJsZSBjb21wYXJ0bWVudC4NCiAgICAgIA0KICAgICMgT3V0cHV0IHRoZSBudW1iZXIgaW4gdGhlIFMsIEkgYW5kIFIgY29tcGFydG1lbnRzIGF0IGVhY2ggdGltZXN0ZXAgDQogICAgIyAoaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGlucHV0IHN0YXRlIHZhcmlhYmxlcykNCiAgICByZXR1cm4obGlzdChjKGRTLCBkSSwgZFIpKSkgDQogICAgfSkNCiAgDQp9DQoNCiMgTU9ERUwgT1VUUFVUIChzb2x2aW5nIHRoZSBkaWZmZXJlbnRpYWwgZXF1YXRpb25zKToNCg0KIyBTb2x2aW5nIHRoZSBkaWZmZXJlbnRpYWwgZXF1YXRpb25zIHVzaW5nIHRoZSBvZGUgaW50ZWdyYXRpb24gYWxnb3JpdGhtDQpvdXRwdXQgPC0gYXMuZGF0YS5mcmFtZShvZGUoeSA9IGluaXRpYWxfc3RhdGVfdmFsdWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcyA9IHRpbWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jID0gc2lyX21vZGVsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zID0gcGFyYW1ldGVycykpDQoNCiMgUExPVA0KDQpvdXRwdXRfbG9uZyA8LSBtZWx0KGFzLmRhdGEuZnJhbWUob3V0cHV0KSwgaWQgPSAidGltZSIpICAgICAgICAgICAgICAgICAgIyB0dXJuIG91dHB1dCBkYXRhc2V0IGludG8gbG9uZyBmb3JtYXQNCg0KIyBDYWxjdWxhdGluZyB0aGUgcHJvcG9ydGlvbiBpbiBlYWNoIGNvbXBhcnRtZW50IGFzIGEgY29sdW1uIGluIHRoZSBsb25nLWZvcm1hdCBvdXRwdXQNCm91dHB1dF9sb25nJHByb3BvcnRpb24gPC0gb3V0cHV0X2xvbmckdmFsdWUvc3VtKGluaXRpYWxfc3RhdGVfdmFsdWVzKQ0KDQojIFBsb3QgdGhlIHByb3BvcnRpb24gaW4gdGhlIFMsIEkgYW5kIFIgY29tcGFydG1lbnRzIG92ZXIgdGltZQ0KZ2dwbG90KGRhdGEgPSBvdXRwdXRfbG9uZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2lmeSBvYmplY3QgY29udGFpbmluZyBkYXRhIHRvIHBsb3QNCiAgICAgICBhZXMoeCA9IHRpbWUsIHkgPSBwcm9wb3J0aW9uLCBjb2xvdXIgPSB2YXJpYWJsZSwgZ3JvdXAgPSB2YXJpYWJsZSkpICsgICMgYXNzaWduIGNvbHVtbnMgdG8gYXhlcyBhbmQgZ3JvdXBzDQogIGdlb21fbGluZSgpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXByZXNlbnQgZGF0YSBhcyBsaW5lcw0KICB4bGFiKCJUaW1lICh5ZWFycykiKSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGxhYmVsIGZvciB4IGF4aXMNCiAgeWxhYigiUHJldmFsZW5jZSAocHJvcG9ydGlvbikiKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCBsYWJlbCBmb3IgeSBheGlzDQogIGxhYnMoY29sb3VyID0gIkNvbXBhcnRtZW50IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgbGVnZW5kIHRpdGxlICANCiAgICAgICB0aXRsZSA9ICJCYXNlbGluZSBwcmV2YWxlbmNlIG9mIHN1c2NlcHRpYmxlLCBpbmZlY3RlZCBhbmQgcmVjb3ZlcmVkIGFuaW1hbHMgb3ZlciB0aW1lIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyMjIFdoYXQgaXMgdGhlIGVuZGVtaWMgcHJldmFsZW5jZSBvZiB0aGUgZGlzZWFzZSBjdXJyZW50bHkgKHRoZSBiYXNlbGluZSBwcmV2YWxlbmNlKSwgYXNzdW1pbmcgcGVybWFuZW50IGltbXVuaXR5Pw0KYGBgDQoNCmBgYHtyfQ0KIyBUaGUgcHJldmFsZW5jZSBzZWVtcyB0byBoYXZlIHN0YWJpbGlzZWQgYnkgMiB5ZWFyczoNCiMgY2FsY3VsYXRpbmcgdGhlIHByZXZhbGVuY2UgaW4geWVhciAyDQpvdXRwdXRfbG9uZyRwcm9wb3J0aW9uW3JvdW5kKG91dHB1dF9sb25nJHRpbWUsMCkgPT0gMiAmIG91dHB1dF9sb25nJHZhcmlhYmxlID09ICJJIl1bMV0NCg0KIyBOb3RlIHRoYXQgaGVyZSB3ZSBhcmUgc2VsZWN0aW5nIHRoZSBwcm9wb3J0aW9uIGluZmVjdGVkIGF0IHRpbWVzdGVwIDIsIA0KIyBidXQgc2luY2UgdGhlIHRpbWVzdGVwcyBhcmUgbm90IGV4YWN0IG51bWJlcnMsIHdlIGFyZSBzZWxlY3RpbmcgdGhlIHRpbWVzdGVwcyB0aGF0LCB3aGVuIHJvdW5kZWQgdG8gMCBkZWNpbWFscywNCiMgaXMgYW5kIGRpc3BsYXkgb25seSB0aGUgZmlyc3Qgb25lIG9mIHRob3NlDQpgYGANCg0KDQpUaGUgYmFzZWxpbmUgcHJldmFsZW5jZSBpcyAxLjclLg0KDQpGcm9tIHRoZSBvdXRwdXQsIHdlIGNhbiBhbHNvIGdldCB0aGUgbnVtYmVyIGluIGVhY2ggY29tcGFydG1lbnQgYXQgZW5kZW1pYyBlcXVpbGlicml1bSBhbmQgdXNlIHRoZXNlIGFzIHRoZSBpbml0aWFsIGNvbmRpdGlvbnMgaW4gdGhlIHZhY2NpbmUgbW9kZWw6DQoNCmBgYHtyfQ0Kb3V0cHV0W291dHB1dCR0aW1lID09IDIsXSAgIyBwcmludCBzdGF0ZSB2YWx1ZXMgYXQgZXF1aWxpYnJpdW0NCmBgYA0KDQojIyBSZWR1Y2luZyB0aGUgcHJldmFsZW5jZSB0byBhcm91bmQgMC44NSUgdXNpbmcgdGhlIG5lb25hdGFsIHZhY2NpbmUsIGFzc3VtaW5nIHBlcm1hbmVudCBpbW11bml0eToNCg0KYGBge3J9DQojIEJlZm9yZSBpbnRyb2R1Y2luZyBhIHZhY2NpbmUsIGNoYW5nZSBpbml0aWFsIHN0YXRlIHZhbHVlcyB0byBiYXNlbGluZSBlbmRlbWljIGVxdWlsaWJyaXVtDQppbml0aWFsX3N0YXRlX3ZhbHVlcyA8LSBjKFMgPSAxNTI1NCwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBJID0gNTEyNSwgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IDI3OTYyMSkgICAgDQoNCnBhcmFtZXRlcnNbInBfdmFjYyJdIDwtIDAuNSAgICMgdHJ5IGRpZmZlcmVudCBjb3ZlcmFnZSB2YWx1ZXMgdG8gZmluZCBhbiBlbmRlbWljIHByZXZhbGVuY2Ugb2YgaGFsZiB0aGUgYmFzZWxpbmUgcHJldmFsZW5jZQ0KDQojIE1PREVMIE9VVFBVVCAoc29sdmluZyB0aGUgZGlmZmVyZW50aWFsIGVxdWF0aW9ucyk6DQoNCiMgU29sdmluZyB0aGUgZGlmZmVyZW50aWFsIGVxdWF0aW9ucyB1c2luZyB0aGUgb2RlIGludGVncmF0aW9uIGFsZ29yaXRobQ0Kb3V0cHV0IDwtIGFzLmRhdGEuZnJhbWUob2RlKHkgPSBpbml0aWFsX3N0YXRlX3ZhbHVlcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzID0gdGltZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jID0gc2lyX21vZGVsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcyA9IHBhcmFtZXRlcnMpKQ0KDQpvdXRwdXRfbG9uZyA8LSBtZWx0KGFzLmRhdGEuZnJhbWUob3V0cHV0KSwgaWQgPSAidGltZSIpICAgICAgICAgICAgICAgICAgIyB0dXJuIG91dHB1dCBkYXRhc2V0IGludG8gbG9uZyBmb3JtYXQNCg0KIyBDYWxjdWxhdGluZyB0aGUgcHJvcG9ydGlvbiBpbiBlYWNoIGNvbXBhcnRtZW50IGFzIGEgY29sdW1uIGluIHRoZSBsb25nLWZvcm1hdCBvdXRwdXQNCm91dHB1dF9sb25nJHByb3BvcnRpb24gPC0gb3V0cHV0X2xvbmckdmFsdWUvc3VtKGluaXRpYWxfc3RhdGVfdmFsdWVzKQ0KDQojIFBMT1QNCg0KIyBQbG90IHRoZSBwcm9wb3J0aW9uIGluIHRoZSBJIGNvbXBhcnRtZW50IG92ZXIgdGltZTogZGl2aWRlIHRoZSBudW1iZXIgaW4gSSBvdmVyIHRpbWUgYnkgdGhlIHRvdGFsIHBvcHVsYXRpb24gc2l6ZQ0KZ2dwbG90KGRhdGEgPSBvdXRwdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2lmeSBvYmplY3QgY29udGFpbmluZyBkYXRhIHRvIHBsb3QNCiAgICAgICBhZXMoeCA9IHRpbWUsIHkgPSBvdXRwdXQkSS9OKSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFzc2lnbiBjb2x1bW5zIHRvIGF4ZXMgYW5kIGdyb3Vwcw0KICBnZW9tX2xpbmUoKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwcmVzZW50IGRhdGEgYXMgbGluZXMNCiAgeGxhYigiVGltZSAoeWVhcnMpIikrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCBsYWJlbCBmb3IgeCBheGlzDQogIHlsYWIoIlByZXZhbGVuY2UgKHByb3BvcnRpb24pIikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgbGFiZWwgZm9yIHkgYXhpcw0KICBsYWJzKGNvbG91ciA9ICJDb21wYXJ0bWVudCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGxlZ2VuZCB0aXRsZSAgDQogICAgICAgdGl0bGUgPSAiSW5mZWN0aW9uIHByZXZhbGVuY2Ugd2l0aCBuZW9uYXRhbCB2YWNjaW5lIGNvdmVyYWdlIG9mIDUwJSIpDQpgYGANCg0KYGBge3J9DQojIENhbGN1bGF0aW5nIHRoZSBwcmV2YWxlbmNlIGluIHllYXIgNSAoaW50cm9kdWN0aW9uIG9mIHRoZSB2YWNjaW5lIGF0IGZpcnN0IHBlcnR1cmJzIHRoZSBpbml0aWFsIGVxdWlsaWJyaXVtLCBidXQNCiMgd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIG5ldyBlbmRlbWljIGVxdWlsaWJyaXVtIGFjaGlldmVkIHdpdGggdmFjY2luYXRpb24pDQoNCm91dHB1dF9sb25nJHByb3BvcnRpb25bcm91bmQob3V0cHV0X2xvbmckdGltZSwwKSA9PSA1ICYgb3V0cHV0X2xvbmckdmFyaWFibGUgPT0gIkkiXVsxXQ0KYGBgDQoNCg0KIyMjIFdoYXQgcHJvcG9ydGlvbiBvZiBuZXdib3JuIGFuaW1hbHMgd291bGQgeW91IG5lZWQgdG8gdmFjY2luYXRlIHRvIHJlZHVjZSB0aGUgcHJldmFsZW5jZSBieSBoYWxmLCBhc3N1bWluZyBsaWZlLWxvbmcgaW1tdW5pdHk/DQoNCklmIGltbXVuaXR5ICBpbmR1Y2VkIGJ5IGluZmVjdGlvbiBhbmQgdmFjY2luYXRpb24gaXMgbGlmZWxvbmcsIHdlIG9ubHkgbmVlZCB0byB2YWNjaW5hdGUgYXJvdW5kIDUwJSBvZiBhbGwgbmV3Ym9ybnMgdG8gYWNoaWV2ZSBhIHJlZHVjdGlvbiBvZiB0aGUgZW5kZW1pYyBwcmV2YWxlbmNlIHRvIGxlc3MgdGhhbiAwLjg1JS4NCg0KIyMgSW5jcmVhc2luZyB0aGUgdmFjY2luZSBjb3ZlcmFnZSB0byBhY2hpZXZlIGVsaW1pbmF0aW9uOg0KYGBge3J9DQpwYXJhbWV0ZXJzWyJwX3ZhY2MiXSA8LSAwLjk1ICAgIyB0cnkgZGlmZmVyZW50IGNvdmVyYWdlIHZhbHVlcyB0byBzZWUgaWYgdGhlIGRpc2Vhc2UgcGVyc2lzdHMNCg0KIyBNT0RFTCBPVVRQVVQgKHNvbHZpbmcgdGhlIGRpZmZlcmVudGlhbCBlcXVhdGlvbnMpOg0KDQojIFNvbHZpbmcgdGhlIGRpZmZlcmVudGlhbCBlcXVhdGlvbnMgdXNpbmcgdGhlIG9kZSBpbnRlZ3JhdGlvbiBhbGdvcml0aG0NCm91dHB1dCA8LSBhcy5kYXRhLmZyYW1lKG9kZSh5ID0gaW5pdGlhbF9zdGF0ZV92YWx1ZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcyA9IHRpbWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyA9IHNpcl9tb2RlbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMgPSBwYXJhbWV0ZXJzKSkNCg0Kb3V0cHV0X2xvbmcgPC0gbWVsdChhcy5kYXRhLmZyYW1lKG91dHB1dCksIGlkID0gInRpbWUiKSAgICAgICAgICAgICAgICAgICMgdHVybiBvdXRwdXQgZGF0YXNldCBpbnRvIGxvbmcgZm9ybWF0DQoNCiMgQ2FsY3VsYXRpbmcgdGhlIHByb3BvcnRpb24gaW4gZWFjaCBjb21wYXJ0bWVudCBhcyBhIGNvbHVtbiBpbiB0aGUgbG9uZy1mb3JtYXQgb3V0cHV0DQpvdXRwdXRfbG9uZyRwcm9wb3J0aW9uIDwtIG91dHB1dF9sb25nJHZhbHVlL3N1bShpbml0aWFsX3N0YXRlX3ZhbHVlcykNCg0KIyBQTE9UDQoNCiMgUGxvdCB0aGUgcHJvcG9ydGlvbiBpbiB0aGUgSSBjb21wYXJ0bWVudCBvdmVyIHRpbWU6IGRpdmlkZSBudW1iZXIgaW4gSSBvdmVyIHRpbWUgYnkgdGhlIHRvdGFsIHBvcHVsYXRpb24gc2l6ZQ0KZ2dwbG90KGRhdGEgPSBvdXRwdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2lmeSBvYmplY3QgY29udGFpbmluZyBkYXRhIHRvIHBsb3QNCiAgICAgICBhZXMoeCA9IHRpbWUsIHkgPSBvdXRwdXQkSS9OKSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFzc2lnbiBjb2x1bW5zIHRvIGF4ZXMgYW5kIGdyb3Vwcw0KICBnZW9tX2xpbmUoKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwcmVzZW50IGRhdGEgYXMgbGluZXMNCiAgeGxhYigiVGltZSAoeWVhcnMpIikrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCBsYWJlbCBmb3IgeCBheGlzDQogIHlsYWIoIlByZXZhbGVuY2UgKHByb3BvcnRpb24pIikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgbGFiZWwgZm9yIHkgYXhpcw0KICBsYWJzKGNvbG91ciA9ICJDb21wYXJ0bWVudCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGxlZ2VuZCB0aXRsZSAgDQogICAgICAgdGl0bGUgPSAiSW5mZWN0aW9uIHByZXZhbGVuY2Ugd2l0aCBuZW9uYXRhbCB2YWNjaW5lIGNvdmVyYWdlIG9mIDk1JSIpDQpgYGANCg0KDQpgYGB7cn0NCiMgRG91YmxlLWNoZWNrIGhvdyBtYW55IGFuaW1hbHMgcmVtYWluIGluZmVjdGVkIGF0IHRoZSA1IHllYXIgdGltZXN0ZXANCm91dHB1dFtyb3VuZChvdXRwdXQkdGltZSwwKSA9PSA1LCJJIl1bMV0NCmBgYA0KDQoNCiMjIyBXb3VsZCBpdCBiZSBwb3NzaWJsZSB0byBlbGltaW5hdGUgdGhlIGRpc2Vhc2UgZnJvbSB0aGUgcG9wdWxhdGlvbiB1c2luZyBuZW9uYXRhbCB2YWNjaW5hdGlvbiB1bmRlciB0aGUgYXNzdW1wdGlvbiBvZiBsaWZlbG9uZyBpbW11bml0eT8NCg0KVGhlIG1vZGVsIHN1Z2dlc3RzIHRoYXQgeWVzLCB3aXRoIGEgdmFjY2luZSBjb3ZlcmFnZSBvZiA5NSUgb3IgaGlnaGVyLCBpdCBhcHBlYXJzIHRoYXQgdGhlIGRpc2Vhc2UgZGllcyBvdXQuIFdlIGNvdWxkIGRlZmluZSBlbGltaW5hdGlvbiBhcyB0aGUgcmVkdWN0aW9uIG9mIHByZXZhbGVuY2UgdG8gYSBjZXJ0YWluIHRocmVzaG9sZCB2YWx1ZS4gSGVyZSwgd2UgaGF2ZSBzaW1wbHkgY2hlY2tlZCB0aGF0IGluZmVjdGlvbiBkaWVzIG91dCBldmVudHVhbGx5LCB3aXRoIGEgcHJldmFsZW5jZSB0aGF0IHRlbmRzIHRvd2FyZHMgemVybyBvdmVyIHRpbWUgYW5kIGxlc3MgdGhhbiAxIGFuaW1hbCByZW1haW5pbmcgaW5mZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2ltdWxhdGlvbi4NCg0KIyMgTW9kZWxsaW5nIHRoZSBiYXNlbGluZSBwcmV2YWxlbmNlIGFuZCBpbXBhY3Qgb2YgdmFjY2luYXRpb24gYXNzdW1pbmcgaW1tdW5pdHkgd2l0aCBhbiBhdmVyYWdlIGR1cmF0aW9uIG9mIDEgeWVhcjoNCg0KYGBge3J9DQojIEJBU0VMSU5FIFNDRU5BUklPIFdJVEggV0FOSU5HIElNTVVOSVRZDQoNCmluaXRpYWxfc3RhdGVfdmFsdWVzIDwtIGMoUyA9IDAuNSpOLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIEkgPSAwLjA1Kk4sICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSAwLjQ1Kk4pDQoNCnBhcmFtZXRlcnNbInBfdmFjYyJdIDwtIDANCnBhcmFtZXRlcnNbInNpZ21hIl0gPC0gMQ0KDQp3YW5pbmdfYmFzZWxpbmUgPC0gYXMuZGF0YS5mcmFtZShvZGUoeSA9IGluaXRpYWxfc3RhdGVfdmFsdWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcyA9IHRpbWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jID0gc2lyX21vZGVsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zID0gcGFyYW1ldGVycykpDQoNCndhbmluZ19iYXNlbGluZV9sb25nIDwtIG1lbHQoYXMuZGF0YS5mcmFtZSh3YW5pbmdfYmFzZWxpbmUpLCBpZCA9ICJ0aW1lIikgICANCg0KIyBDYWxjdWxhdGluZyB0aGUgcHJvcG9ydGlvbiBpbiBlYWNoIGNvbXBhcnRtZW50DQp3YW5pbmdfYmFzZWxpbmVfbG9uZyRwcm9wb3J0aW9uIDwtIHdhbmluZ19iYXNlbGluZV9sb25nJHZhbHVlL3N1bShpbml0aWFsX3N0YXRlX3ZhbHVlcykNCg0KIyBWQUNDSU5FIFNDRU5BUklPIFdJVEggV0FOSU5HIElNTVVOSVRZDQoNCnBhcmFtZXRlcnNbInBfdmFjYyJdIDwtIDAuNQ0KcGFyYW1ldGVyc1sic2lnbWEiXSA8LSAxDQoNCndhbmluZ192YWNjIDwtIGFzLmRhdGEuZnJhbWUob2RlKHkgPSBpbml0aWFsX3N0YXRlX3ZhbHVlcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgPSB0aW1lcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyA9IHNpcl9tb2RlbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcyA9IHBhcmFtZXRlcnMpKQ0KDQp3YW5pbmdfdmFjY19sb25nIDwtIG1lbHQoYXMuZGF0YS5mcmFtZSh3YW5pbmdfdmFjYyksIGlkID0gInRpbWUiKSAgIA0KDQojIENhbGN1bGF0aW5nIHRoZSBwcm9wb3J0aW9uIGluIGVhY2ggY29tcGFydG1lbnQNCndhbmluZ192YWNjX2xvbmckcHJvcG9ydGlvbiA8LSB3YW5pbmdfdmFjY19sb25nJHZhbHVlL3N1bShpbml0aWFsX3N0YXRlX3ZhbHVlcykNCg0KIyBQTE9UVElORyBUSEUgMiBTQ0VOQVJJT1MNCg0KIyBCYXNlbGluZQ0KZ2dwbG90KGRhdGEgPSB3YW5pbmdfYmFzZWxpbmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2lmeSBvYmplY3QgY29udGFpbmluZyBkYXRhIHRvIHBsb3QNCiAgICAgICBhZXMoeCA9IHRpbWUsIHkgPSBJL04pKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFzc2lnbiBjb2x1bW5zIHRvIGF4ZXMgYW5kIGdyb3Vwcw0KICBnZW9tX2xpbmUoKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwcmVzZW50IGRhdGEgYXMgbGluZXMNCiAgeGxhYigiVGltZSAoeWVhcnMpIikrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCBsYWJlbCBmb3IgeCBheGlzDQogIHlsYWIoIlByZXZhbGVuY2UgKHByb3BvcnRpb24pIikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgbGFiZWwgZm9yIHkgYXhpcw0KICBsYWJzKGNvbG91ciA9ICJDb21wYXJ0bWVudCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGxlZ2VuZCB0aXRsZSAgDQogICAgICAgdGl0bGUgPSAiQmFzZWxpbmUgcHJldmFsZW5jZSB3aXRoIHdhbmluZyBpbW11bml0eSIpICsNCiAgeWxpbShjKDAsMC40KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlZmluZSB5IGF4aXMgcmFuZ2UgdG8gYmUgcGxvdHRlZCAoMC0wLjQpDQoNCiMgV2l0aCB2YWNjaW5lDQpnZ3Bsb3QoZGF0YSA9IHdhbmluZ192YWNjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWZ5IG9iamVjdCBjb250YWluaW5nIGRhdGEgdG8gcGxvdA0KICAgICAgIGFlcyh4ID0gdGltZSwgeSA9IEkvTikpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXNzaWduIGNvbHVtbnMgdG8gYXhlcyBhbmQgZ3JvdXBzDQogIGdlb21fbGluZSgpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXByZXNlbnQgZGF0YSBhcyBsaW5lcw0KICB4bGFiKCJUaW1lICh5ZWFycykiKSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGxhYmVsIGZvciB4IGF4aXMNCiAgeWxhYigiUHJldmFsZW5jZSAocHJvcG9ydGlvbikiKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCBsYWJlbCBmb3IgeSBheGlzDQogIGxhYnMoY29sb3VyID0gIkNvbXBhcnRtZW50IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgbGVnZW5kIHRpdGxlICANCiAgICAgICB0aXRsZSA9ICJQcmV2YWxlbmNlIHdpdGggd2FuaW5nIGltbXVuaXR5IGFuZCB2YWNjaW5lIGNvdmVyYWdlIG9mIDUwJSIpICsNCiAgeWxpbShjKDAsMC40KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlZmluZSB5IGF4aXMgcmFuZ2UgdG8gYmUgcGxvdHRlZCAoMC0wLjQpDQpgYGANCg0KDQoNCmBgYHtyfQ0KIyBDYWxjdWxhdGluZyB0aGUgYmFzZWxpbmUgcHJldmFsZW5jZSB3aXRoIHdhbmluZyBpbW11bml0eQ0Kd2FuaW5nX2Jhc2VsaW5lX3ByZXYgPC0gd2FuaW5nX2Jhc2VsaW5lX2xvbmckcHJvcG9ydGlvbltyb3VuZCh3YW5pbmdfYmFzZWxpbmVfbG9uZyR0aW1lLDApID09IDIgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FuaW5nX2Jhc2VsaW5lX2xvbmckdmFyaWFibGUgPT0gIkkiXVsxXQ0KDQojIENhbGN1bGF0aW5nIHRoZSBlbmRlbWljIHByZXZhbGVuY2Ugd2l0aCB3YW5pbmcgaW1tdW5pdHkgYW5kIG5lb25hdGFsIHZhY2NpbmF0aW9uIGNvdmVyYWdlIG9mIDUwJQ0Kd2FuaW5nX3ZhY2NfcHJldiA8LSB3YW5pbmdfdmFjY19sb25nJHByb3BvcnRpb25bcm91bmQod2FuaW5nX3ZhY2NfbG9uZyR0aW1lLDApID09IDIgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbmluZ192YWNjX2xvbmckdmFyaWFibGUgPT0gIkkiXVsxXQ0KDQojIENhbGN1bGF0aW5nIHRoZSByZWR1Y3Rpb24gaW4gcHJldmFsZW5jZSBhY2hpZXZlZCB3aXRoIDUwJSBuZW9uYXRhbCB2YWNjaW5lIGNvdmVyYWdlOg0KMS13YW5pbmdfdmFjY19wcmV2L3dhbmluZ19iYXNlbGluZV9wcmV2DQpgYGANCg0KDQojIyMgSWYgdGhlIGF2ZXJhZ2UgZHVyYXRpb24gb2YgaW1tdW5pdHkgaXMgb25seSAxIHllYXIsIGhvdyB3b3VsZCB0aGlzIGltcGFjdCB0aGUgcHJvcG9ydGlvbmFsIHJlZHVjdGlvbiBpbiB0aGUgcHJldmFsZW5jZSB3aXRoIHRoZSB2YWNjaW5lIGNvdmVyYWdlIHlvdSBvYnRhaW5lZCBhYm92ZSBjb21wYXJlZCB0byB0aGUgYmFzZWxpbmU/IA0KDQpJZiBpbW11bml0eSBpcyBub3QgcGVybWFuZW50IGJ1dCB3YW5lcyBvbiBhdmVyYWdlIGFmdGVyIGEgZHVyYXRpb24gb2YgMSB5ZWFyIGluIHRoZSByZWNvdmVyZWQgY29tcGFydG1lbnQsIGEgbmVvbmF0YWwgdmFjY2luZSBjb3ZlcmFnZSBvZiA1MCUgbm93IG9ubHkgbGVhZHMgdG8gYSAxMyUgcmVkdWN0aW9uIGluIGRpc2Vhc2UgcHJldmFsZW5jZSBjb21wYXJlZCB0byBiYXNlbGluZSwgcmF0aGVyIHRoYW4gNTAlLiANCg0KIyMgTW9kZWxsaW5nIHRoZSBpbXBhY3Qgb2YgdmFjY2luYXRpb24gd2l0aCAxMDAlIGNvdmVyYWdlIGFzc3VtaW5nIGltbXVuaXR5IHdpdGggYW4gYXZlcmFnZSBkdXJhdGlvbiBvZiAxIHllYXI6DQoNCmBgYHtyfQ0KIyBWQUNDSU5FIFNDRU5BUklPIFdJVEggV0FOSU5HIElNTVVOSVRZOiBJTkNSRUFTSU5HIENPVkVSQUdFIFRPIDEwMCUNCg0KcGFyYW1ldGVyc1sicF92YWNjIl0gPC0gMQ0KcGFyYW1ldGVyc1sic2lnbWEiXSA8LSAxDQoNCndhbmluZ192YWNjIDwtIGFzLmRhdGEuZnJhbWUob2RlKHkgPSBpbml0aWFsX3N0YXRlX3ZhbHVlcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgPSB0aW1lcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyA9IHNpcl9tb2RlbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcyA9IHBhcmFtZXRlcnMpKQ0KDQojIFdpdGggdmFjY2luZQ0KZ2dwbG90KGRhdGEgPSB3YW5pbmdfdmFjYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2lmeSBvYmplY3QgY29udGFpbmluZyBkYXRhIHRvIHBsb3QNCiAgICAgICBhZXMoeCA9IHRpbWUsIHkgPSBJL04pKSArICAjIGFzc2lnbiBjb2x1bW5zIHRvIGF4ZXMgYW5kIGdyb3Vwcw0KICBnZW9tX2xpbmUoKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwcmVzZW50IGRhdGEgYXMgbGluZXMNCiAgeGxhYigiVGltZSAoeWVhcnMpIikrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCBsYWJlbCBmb3IgeCBheGlzDQogIHlsYWIoIlByZXZhbGVuY2UgKHByb3BvcnRpb24pIikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgbGFiZWwgZm9yIHkgYXhpcw0KICBsYWJzKGNvbG91ciA9ICJDb21wYXJ0bWVudCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGxlZ2VuZCB0aXRsZSAgDQogICAgICAgdGl0bGUgPSAiUHJldmFsZW5jZSB3aXRoIHdhbmluZyBpbW11bml0eSBhbmQgdmFjY2luZSBjb3ZlcmFnZSBvZiAxMDAlIikgKw0KeWxpbShjKDAsMC40KSkNCmBgYA0KDQojIyMgV291bGQgaXQgYmUgcG9zc2libGUgdG8gZWxpbWluYXRlIHRoZSBkaXNlYXNlIGZyb20gdGhlIHBvcHVsYXRpb24gdXNpbmcgbmVvbmF0YWwgdmFjY2luYXRpb24gdW5kZXIgdGhlc2UgYXNzdW1wdGlvbnM/IFdoYXQgbWluaW11bSB2YWNjaW5lIGNvdmVyYWdlIHdvdWxkIHRoaXMgcmVxdWlyZT8NCg0KSWYgaW1tdW5pdHkgb25seSBwZXJzaXN0cyBmb3IgMSB5ZWFyIG9uIGF2ZXJhZ2UsIHRoZSBtb2RlbCBwcmVkaWN0aW9uIHN1Z2dlc3RzIGVsaW1pbmF0aW9uIG9mIHRoZSBkaXNlYXNlIHVzaW5nIG5lb25hdGFsIHZhY2NpbmF0aW9uIGFsb25lIHdvdWxkIG5vdCBiZSBwb3NzaWJsZS4gRXZlbiB3aXRoIDEwMCUgY292ZXJhZ2UsIHRoZSBwcmV2YWxlbmNlIHJlbWFpbnMgYXQgYXJvdW5kIDUlLg0KDQojIyBNb2RlbGxpbmcgdGhlIGJhc2VsaW5lIHByZXZhbGVuY2UgYW5kIGltcGFjdCBvZiB2YWNjaW5hdGlvbiB3aXRoIDEwMCUgY292ZXJhZ2UgYXNzdW1pbmcgaW1tdW5pdHkgd2l0aCBhbiBhdmVyYWdlIGR1cmF0aW9uIG9mIDIuNSB5ZWFyczoNCg0KYGBge3J9DQojIEJBU0VMSU5FIFNDRU5BUklPIFdJVEggV0FOSU5HIElNTVVOSVRZDQoNCnBhcmFtZXRlcnNbInBfdmFjYyJdIDwtIDANCnBhcmFtZXRlcnNbInNpZ21hIl0gPC0gMS8yLjUNCg0Kd2FuaW5nX2Jhc2VsaW5lIDwtIGFzLmRhdGEuZnJhbWUob2RlKHkgPSBpbml0aWFsX3N0YXRlX3ZhbHVlcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgPSB0aW1lcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyA9IHNpcl9tb2RlbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcyA9IHBhcmFtZXRlcnMpKQ0KDQp3YW5pbmdfYmFzZWxpbmVfbG9uZyA8LSBtZWx0KGFzLmRhdGEuZnJhbWUod2FuaW5nX2Jhc2VsaW5lKSwgaWQgPSAidGltZSIpICAgDQoNCiMgQ2FsY3VsYXRpbmcgdGhlIHByb3BvcnRpb24gaW4gZWFjaCBjb21wYXJ0bWVudA0Kd2FuaW5nX2Jhc2VsaW5lX2xvbmckcHJvcG9ydGlvbiA8LSB3YW5pbmdfYmFzZWxpbmVfbG9uZyR2YWx1ZS9zdW0oaW5pdGlhbF9zdGF0ZV92YWx1ZXMpDQoNCiMgVkFDQ0lORSBTQ0VOQVJJTyBXSVRIIFdBTklORyBJTU1VTklUWQ0KDQpwYXJhbWV0ZXJzWyJwX3ZhY2MiXSA8LSAxDQpwYXJhbWV0ZXJzWyJzaWdtYSJdIDwtIDEvMi41DQoNCndhbmluZ192YWNjIDwtIGFzLmRhdGEuZnJhbWUob2RlKHkgPSBpbml0aWFsX3N0YXRlX3ZhbHVlcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgPSB0aW1lcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyA9IHNpcl9tb2RlbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcyA9IHBhcmFtZXRlcnMpKQ0KDQp3YW5pbmdfdmFjY19sb25nIDwtIG1lbHQoYXMuZGF0YS5mcmFtZSh3YW5pbmdfdmFjYyksIGlkID0gInRpbWUiKSAgIA0KDQojIENhbGN1bGF0aW5nIHRoZSBwcm9wb3J0aW9uIGluIGVhY2ggY29tcGFydG1lbnQNCndhbmluZ192YWNjX2xvbmckcHJvcG9ydGlvbiA8LSB3YW5pbmdfdmFjY19sb25nJHZhbHVlL3N1bShpbml0aWFsX3N0YXRlX3ZhbHVlcykNCg0KIyBDYWxjdWxhdGluZyB0aGUgYmFzZWxpbmUgcHJldmFsZW5jZSB3aXRoIHNsb3dlciB3YW5pbmcgaW1tdW5pdHkNCnByaW50KCJCYXNlbGluZSBwcmV2YWxlbmNlOiIpDQp3YW5pbmdfYmFzZWxpbmVfbG9uZyRwcm9wb3J0aW9uW3JvdW5kKHdhbmluZ19iYXNlbGluZV9sb25nJHRpbWUsMCkgPT0gMiAmIHdhbmluZ19iYXNlbGluZV9sb25nJHZhcmlhYmxlID09ICJJIl1bMV0NCiMgQ2FsY3VsYXRpbmcgdGhlIGVuZGVtaWMgcHJldmFsZW5jZSB3aXRoIHNsb3dlciB3YW5pbmcgaW1tdW5pdHkgYW5kIG5lb25hdGFsIHZhY2NpbmF0aW9uIGNvdmVyYWdlIG9mIDEwMCUNCnByaW50KCJQcmV2YWxlbmNlIHdpdGggbmVvbmF0YWwgdmFjY2luZSBjb3ZlcmFnZSBvZiAxMDAlOiIpDQp3YW5pbmdfdmFjY19sb25nJHByb3BvcnRpb25bcm91bmQod2FuaW5nX3ZhY2NfbG9uZyR0aW1lLDApID09IDIgJiB3YW5pbmdfdmFjY19sb25nJHZhcmlhYmxlID09ICJJIl1bMV0NCmBgYA0KDQoNCg0KIyMjIElmIGFuIGFkanV2YW50IChhIHZhY2NpbmUgcHJvbW90ZXIpIHdhcyBnaXZlbiBhbG9uZyB3aXRoIHRoZSB2YWNjaW5lLCB0aGF0IHdvdWxkIGV4dGVuZCB0aGUgZHVyYXRpb24gb2YgaW1tdW5pdHkgdG8gMi41IHllYXJzIG9uIGF2ZXJhZ2UsIHdoYXQgdmFjY2luZSBjb3ZlcmFnZSB3b3VsZCBiZSBuZWVkZWQgdG8gcmVkdWNlIHRoZSBiYXNlbGluZSBwcmV2YWxlbmNlIGJ5IGhhbGY/IFdvdWxkIGl0IGJlIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSB0aGUgZGlzZWFzZSBmcm9tIHRoZSBwb3B1bGF0aW9uIHVuZGVyIHRoZXNlIGFzc3VtcHRpb25zIHVzaW5nIG5lb25hdGFsIHZhY2NpbmF0aW9uPw0KDQpJZiB0aGUgYXZlcmFnZSBkdXJhdGlvbiBvZiBpbW11bml0eSB3YXMgaW5jcmVhc2VkIHRvIGFuIGF2ZXJhZ2Ugb2YgMi41IHllYXJzIGJ5IGdpdmluZyBhbiBhZGp1dmFudCwgdGhlIGJhc2VsaW5lIHByZXZhbGVuY2UgY291bGQgYmUgcmVkdWNlZCB0byBhYm91dCBoYWxmIChmcm9tIDMuNyUgdG8gMS45JSkgYnkgYWNoaWV2aW5nIGEgbmVvbmF0YWwgdmFjY2luZSBjb3ZlcmFnZSBvZiAxMDAlLiBUaGlzIG1lYW5zIHRoYXQgbmVvbmF0YWwgdmFjY2luYXRpb24gYWxvbmUgaXMgbm90IGVub3VnaCB0byBlbGltaW5hdGUgdGhlIGRpc2Vhc2UgZnJvbSB0aGUgcG9wdWxhdGlvbiBhcyBpdCByZW1haW5zIGVuZGVtaWMgZXZlbiBpZiBldmVyeSBuZXdib3JuIGFuaW1hbCBpcyB2YWNjaW5hdGVkLiANCg0KIyMjIEJhc2VkIG9uIHlvdXIgcmVzdWx0cywgd2hhdCBvdmVyYWxsIHJlY29tbWVuZGF0aW9uIHdvdWxkIHlvdSBnaXZlIHRvIHRoZSBNaW5pc3Rlcj8NCg0KVGhlIG1vZGVsbGluZyBhbmFseXNpcyBzdWdnZXN0cyB0aGF0IG5lb25hdGFsIHZhY2NpbmF0aW9uIGNhbiBsZWFkIHRvIHN1YnN0YW50aWFsIHJlZHVjdGlvbnMgaW4gZW5kZW1pYyBwcmV2YWxlbmNlIG9mIHRoZSBkaXNlYXNlIGlmIHJlY292ZXJ5IGFuZCB2YWNjaW5hdGlvbiBwcm92aWRlIGxvbmctdGVybSBpbW11bml0eSwgZXZlbiBpZiBub3QgbGlmZWxvbmcuIEhvd2V2ZXIsIHRoZSB2YWNjaW5lIGNvdmVyYWdlIHJlcXVpcmVkIHRvIGFjaGlldmUgYSBoYWx2aW5nIG9mIHRoZSBlbmRlbWljIHByZXZhbGVuY2UgYW5kIHRoZSBpbXBhY3Qgb2YgdGhlIG5lb25hdGFsIHZhY2NpbmF0aW9uIGluIGdlbmVyYWwgYXJlIHN0cm9uZ2x5IGRlcGVuZGVudCBvbiB0aGUgYXNzdW1wdGlvbnMgd2UgbWFrZSBhYm91dCB3YW5pbmcgb2YgaW1tdW5pdHkuIElmIGltbXVuaXR5IGlzIG9ubHkgc2hvcnQtdGVybSwgZXZlbiBwZXJmZWN0IGNvdmVyYWdlIG9mIHRoZSBuZW9uYXRhbCB2YWNjaW5lIHdvdWxkIGhhdmUgbGltaXRlZCBpbXBhY3QsIGFuZCBlbGltaW5hdGlvbiBvZiB0aGUgZGlzZWFzZSBzZWVtcyBvbmx5IHBvc3NpYmxlIGlmIGltbXVuaXR5IGRvZXMgbm90IHdhbmUuDQoNClRoZXJlZm9yZSwgdGhlIG1vZGVsbGluZyByZXN1bHRzIGFyZSBpbmNvbmNsdXNpdmUgcmVnYXJkaW5nIHRoZSBjdXJyZW50IHByZXZhbGVuY2UgYW5kIHRoZSBpbXBhY3Qgb2YgbmVvbmF0YWwgdmFjY2luYXRpb24gdW50aWwgZnVydGhlciBrbm93bGVkZ2Ugb24gdGhlIHdhbmluZyBvciBwZXJzaXN0ZW5jZSBvZiBpbW11bml0eSBiZWNvbWVzIGF2YWlsYWJsZS4gVGhlIE1pbmlzdGVyIGNvdWxkIGNvbnNpZGVyIGludmVzdGluZyBpbnRvIGZ1cnRoZXIgcmVzZWFyY2ggb24gdGhpcy4gSWYgbmVvbmF0YWwgdmFjY2luYXRpb24gaXMgaW1wbGVtZW50ZWQgYW5kIGltbXVuaXR5IGlzIGZvdW5kIHRvIHdhbmUgcXVpY2tseSwgYWRkaXRpb24gb2YgYW4gYWRqdXZhbnQgY291bGQgaW1wcm92ZSB0aGUgaW1wYWN0IG9mIHZhY2NpbmF0aW9uLg0KDQojIyMgQWxzbyBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gdG8gaGVscCB0aGUgTWluaXN0ZXIgaW50ZXJwcmV0IHRoZXNlIHJlc3VsdHMuIFdyaXRlIGRvd24gdGhlIGFzc3VtcHRpb25zIGluIHlvdXIgbW9kZWxsaW5nIGFwcHJvYWNoIHRoYXQgeW91IHRoaW5rIG1pZ2h0IGFmZmVjdCB5b3VyIHJlc3VsdHMuIEFyZSB0aGVyZSBhbnkgYWRhcHRhdGlvbnMgeW91IGNvdWxkIG1ha2UgdG8gdGhlIG1vZGVsIHN0cnVjdHVyZSB0aGF0IHdvdWxkIG1ha2UgaXQgbW9yZSByZWFsaXN0aWMgb3IgdGhhdCB3b3VsZCBhbGxvdyB5b3UgdG8gYW5zd2VyIG1vcmUgZGV0YWlsZWQgcXVlc3Rpb25zPw0KDQpUaGUgcmVzdWx0cyBoYXZlIHNob3duIHRoYXQgdGhlIGNvbmNsdXNpb25zIHN0cm9uZ2x5IGRlcGVuZCBvbiB0aGUgYXNzdW1wdGlvbnMgd2UgbWFkZSBhYm91dCB0aGUgcmF0ZSBvZiB3YW5pbmcgb2YgaW1tdW5pdHkuIE90aGVyIGFzc3VtcHRpb25zIHRoYXQgbWlnaHQgaW1wYWN0IG91ciByZXN1bHRzIGFyZSBmb3IgZXhhbXBsZToNCi0gd2UgYXNzdW1lIHZhY2NpbmF0aW9uIGlzIGFwcGxpZWQgdG8gYSBwcm9wb3J0aW9uICpwX3ZhY2MqIG9mIGJpcnRocyBhdCBldmVyeSB0aW1lc3RlcCwgaS5lLiB0byBhbGwgbmV3Ym9ybnMgYWxsIHRoZSB0aW1lDQotIHdlIGFzc3VtZSB2YWNjaW5lLWluZHVjZWQgaW1tdW5pdHkgYW5kIGltbXVuaXR5IHByb3ZpZGVkIGJ5IHJlY292ZXJ5IGZyb20gbmF0dXJhbCBpbmZlY3Rpb24gY29uZmVyIHRoZSBzYW1lIHByb3RlY3Rpb24gYW5kIHdhbmUgYXQgdGhlIHNhbWUgdGltZQ0KLSB3ZSBhc3N1bWUgdHJhbnNtaXNzaW9uIGlzIGluZGVwZW5kZW50IG9mIGFnZS1taXhpbmcsIGJ1dCB0aGUgdmFjY2luZSBpcyBvbmx5IGdpdmVuIHRvIG5ld2Jvcm5zLCBzbyBpdHMgZWZmZWN0IG1pZ2h0IGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIHJhdGUgYXQgd2hpY2ggZGlmZmVyZW50IGFnZSBncm91cHMgdHJhbnNtaXQgYW5kIGFjcXVpcmUgaW5mZWN0aW9uDQoNCkluIGZ1dHVyZSB3ZWVrcywgd2Ugd2lsbCBzZWUgaG93IHRvIHN0cmF0aWZ5IHRoZSBtb2RlbCBpbnRvIGRpZmZlcmVudCBhZ2UgZ3JvdXBzLCB0byBhbGxvdyBmb3IgbWl4aW5nIGJldHdlZW4gdGhlc2UgZ3JvdXBzLiBXZSBjb3VsZCBhbHNvIGludmVzdGlnYXRlIHRoZSBlZmZlY3QgdGhlc2UgYXNzdW1wdGlvbnMgaGF2ZSBvbiB0aGUgcmVzdWx0IGJ5IGhhdmluZyBzZXBhcmF0ZSBpbW11bmUgY29tcGFydG1lbnRzIGFuZCB3YW5pbmcgcmF0ZXMgZm9yIHRob3NlIHJlY292ZXJlZCBhbmQgdGhvc2UgdmFjY2luYXRlZC4gV2UgY291bGQgYWxzbyBnaXZlIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHRpbWVzY2FsZXMgb2YgdGhpcyBpbnRlcnZlbnRpb24gYnkgbW9kZWxsaW5nIHRoZSBiYXNlbGluZSBjYXNlIGFuZCB2YWNjaW5lIGludHJvZHVjdGlvbiBjaHJvbm9sb2dpY2FsbHkuIEluIHRoaXMgZXhhbXBsZSwgd2UgaGF2ZSBvbmx5IG1vZGVsbGVkIHRoZSBkaXNlYXNlIHdpdGggb3Igd2l0aG91dCB0aGUgaW50ZXJ2ZW50aW9uIGFuZCBjb21wYXJlZCB0aGUgcHJldmFsZW5jZSBhdCBhbiBhcmJpdHJhcmlseSBjaG9zZW4gdGltZXBvaW50IGFmdGVyIHRoZSBzeXN0ZW0gaGFzIHJlYWNoZWQgZXF1aWxpYnJpdW0uIEl0IHdvdWxkIGJlIG1vcmUgcmVhbGlzdGljIGFuZCBpbmZvcm1hdGl2ZSB0byBtb2RlbCBpbnRyb2R1Y3Rpb24gb2YgdGhlIHZhY2NpbmUgYXQgYSBzcGVjaWZpYyB0aW1lIGFmdGVyIHRoZSBlbmRlbWljIGVxdWlsaWJyaXVtIGhhcyBiZWVuIHJlYWNoZWQsIGkuZS4gYnkgcnVubmluZyB0aGUgbW9kZWwgd2l0aCAqcF92YWNjKiA9IDAgdW50aWwgdGhlIGN1cnJlbnQgeWVhciBhbmQgY2hhbmdpbmcgKnBfdmFjYyogZm9yIHRoaXMgdGltZXN0ZXAgb253YXJkcyB0byByZXByZXNlbnQgaW50cm9kdWN0aW9uIG9mIHRoZSB2YWNjaW5lLiBUaGlzIHdvdWxkIGFsbG93IHVzIGZvciBleGFtcGxlIHRvIGludmVzdGlnYXRlIGhvdyBsb25nIGl0IHRha2VzIGZvciBwcmV2YWxlbmNlIHRvIGJlIHJlZHVjZWQgYnkgaGFsZiBieSB0aGUgdmFjY2luZS4NCg0KYGBge3J9DQoNCmBgYA0KIyMgVGFrZS1ob21lIG1lc3NhZ2UNCg0KV2VsbCBkb25lIG9uIGNvbXBsZXRpbmcgdGhlIGZpcnN0IHNwZWNpYWxpc2F0aW9uIGFuZCB0aGlzIGNoYWxsZW5naW5nIGV0aXZpdHkhIEhvcGVmdWxseSB5b3UgaGF2ZSBzZWVuIGZyb20gdGhpcyBleGVyY2lzZSB0aGF0IHZhY2NpbmF0aW9uIGNvdmVyYWdlIGRlY2lzaW9ucyBhcmUgYWZmZWN0ZWQgYnkgYSByYW5nZSBvZiBwb3B1bGF0aW9uIGZhY3RvcnMsIGFuZCBpdCBjYW4gYmUgaGVscGZ1bCB0byBzZWUgdGhlc2UgYXMgZGlmZmVyZW50IChhbmQgc29tZXRpbWVzIGNvbXBldGluZykgd2F5cyBvZiBzaGFwaW5nIHBvcHVsYXRpb24gaW1tdW5pdHkgYW5kIHN1c2NlcHRpYmlsaXR5LiBPZiBjb3Vyc2UsIHRoZSBpbmZlY3Rpb24gZHluYW1pY3Mgd2Ugc2VlIGluIHRoZSByZWFsIHdvcmxkIGFyaXNlIGZyb20gYSBjb21iaW5hdGlvbiBvZiBtYW55IGRpZmZlcmVudCBmYWN0b3JzLCBhbmQgdGhlIGVmZmVjdHMgb2YgdGhlIGRpZmZlcmVudCBzdXNjZXB0aWJpbGl0eS1zaGFwaW5nIG1lY2hhbmlzbXMgd2UgY292ZXJlZCBzZXBhcmF0ZWx5IHRoaXMgd2VlayBtaWdodCBsb29rIGRpZmZlcmVudCB3aGVuIHRoZXkgY29tZSB0b2dldGhlci4NCg0KQWZ0ZXIgbGVhcm5pbmcgYWJvdXQgdGhlIHRoZW9yeSBvZiBpbmZlY3Rpb3VzIGRpc2Vhc2UgZHluYW1pY3MgYW5kIGNvZGluZyBtb2RlbHMgaW4gUiBvdmVyIHRoZSBwYXN0IGZldyB3ZWVrcywgdGhpcyBleGVyY2lzZSBoYXMgYWxzbyBnaXZlbiB5b3UgYSBmaXJzdCBpbnNpZ2h0IGludG8gaG93IG1vZGVscyBjYW4gYmUgdXNlZCBpbiBwcmFjdGljZSB0byBhbnN3ZXIgcHVibGljIGhlYWx0aCBxdWVzdGlvbnMuIE1vZGVsIHByZWRpY3Rpb25zLCBmb3IgZXhhbXBsZSBvZiBpbnRlcnZlbnRpb24gaW1wYWN0LCBjYW4gdmFyeSBhIGxvdCBkZXBlbmRpbmcgb24gdGhlIGFzc3VtcHRpb25zIHdlIG1ha2UgYWJvdXQgdGhlIG1vZGVsIHN0cnVjdHVyZSBhbmQgdGhlIHBhcmFtZXRlciB2YWx1ZXMuIEJ1dCBkb24ndCB3b3JyeSBpZiB5b3Ugc3RydWdnbGVkIG9yIGRvbid0IGZ1bGx5IHVuZGVyc3RhbmQgZXZlcnl0aGluZyBpbiB0aGlzIGV0aXZpdHkgeWV0IC0gaW4gdGhlIG5leHQgd2Vla3MsIHlvdSB3aWxsIGxlYXJuIG1vcmUgYWJvdXQgaG93IG1vZGVscyBjYW4gYmUgZGV2ZWxvcGVkIHRvIGRlc2NyaWJlIGFuIGluZmVjdGlvbiBwcm9jZXNzIG1vcmUgcmVhbGlzdGljYWxseSwgYW5kIGhvdyB0aGV5IGNhbiBiZSBsaW5rZWQgdG8gZGF0YSB0byBhY2hpZXZlIGEgbW9yZSBhY2N1cmF0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVhbCB3b3JsZC4NCg==