Final Exam Guidelines

  • Coverage: The major concepts and inference procedures—such as sampling distributions, confidence intervals, and hypothesis testing—are covered and implemented using both classical parametric likelihood-based methods and modern non-parametric approaches, including the bootstrap and kernel density estimation.

  • Part A requires derivation of selected likelihood-based functions for performing various types of inference, with sufficient detail to enable translation of these derivations into code for numerical analysis.

  • Your code for the problems in Part B must align with your derivations in Part A and be well commented where necessary.

  • In Part B, all numerical results must be interpreted from a practical perspective.


Policies of Using AI Tools

  • Policy on AI Tool Use: Students must adhere to the AI tool policy specified in the course syllabus. The direct copying of AI-generated content is strictly prohibited. All submitted work must reflect your own understanding; where external tools are consulted, content must be thoroughly rephrased and synthesized in your own words.

  • Code Inclusion Requirement: Any code included in your essay must be properly commented to explain the purpose and/or expected output of key code lines. Submitting AI-generated code without meaningful, student-added comments will not be accepted.


Working Model for the Final Exam

Caution: Please follow the suggested expressions and guided steps to complete the exam. Other approaches such as transformation for trivialize the problems that will not meet the exam objectives.

The Kumaraswamy distribution is a two-parameter continuous probability distribution defined on the interval (0, 1). It is often used as an alternative to the Beta distribution due to its simple closed-form expressions for the cumulative distribution function (CDF) and quantile function. It is commonly used in

  • Hydrology: Modeling rainfall, streamflow, or other bounded natural phenomena

  • Economics: Income shares, proportions, or bounded indices

  • Monte Carlo simulation: Efficient random variate generation (via inverse transform)

  • Machine learning: Output layer for bounded targets, prior distributions in Bayesian models

  • Reliability engineering: Modeling failure rates of systems with bounded lifetimes


Let \(X\) be the Kumaraswamy random variable with Cumulative Distribution Function (CDF)

\[ F(x; a, b) = 1 - (1 - x^a)^b \]

where \(a > 0\) and \(b > 0\) unknown parameters and \(0 < x < 1\).

The following are two special case of the Kumaraswamy distribution:

  1. Uniform Distribution: When \(a = 1\) and \(b = 1\), the Kumaraswamy distribution becomes a uniform distribution over \([0, 1]\) with CDF \(F(x) = x\).

  2. Power Distribution: when \(b = 1\) and \(a > 0\), the Kumaraswamy distribution becomes a power distribution over \([0, 1]\) with CDF \(F(x) = x^a\).

This final exam focuses on inferences of Kumaraswamy distribution and related data analysis.

Part A: Methodological Derivations


Problem A1:

Show that the density function of the Kumaraswamy distribution is

\[ f(x; a, b) = ab \, x^{a-1} (1 - x^a)^{b-1}. \]

In order to get the probability density function (pdf) for the Kumaraswamy distribution we must take the derivative of the cdf: \[ f(x; a, b) = \frac{d}{dx} F(x; a, b) = \frac{d}{dx} [1 - (1 - x^a)^b] \]

Using the chain rule, we obtain:

\[ f(x; a, b) = -b(1 - x^a)^{b-1} \cdot -ax^{a-1} \]

Once simplified, the pdf is: \[ f(x; a, b) = abx^{a-1}(1 - x^a)^{b-1} \]


Problem A2:

Let \(\{x_1, x_2, \cdots, x_n \}\) be an i.i.d. random sample taken from a population that follows the aove 2-parameter Kumaraswamy distribution. Write out the loglikelihood function of \(a\) and \(b\), denoted by \(\ell(a,b)\), based on the above random sample and derive the gradient vector \([\ell_a^\prime(a,b), \ell_b^\prime(a,b)]\), the first order partial derivative of the log-likelihood with respect to parameters \(a\) and \(b\).

From Problem A1, the PDF is: \[ f(x) = abx^{a-1}(1 - x^a)^{b-1}, \quad 0 < x < 1, a > 0, b > 0 \]

The likelihood function \(L(a, b)\) is: \[ L(a, b) = \prod_{i=1}^n f(x_i; a, b) = \prod_{i=1}^n abx_i^{a-1}(1 - x_i^a)^{b-1} \]

Rewriting the equation, we get: \[ \prod_{i=1}^n ab \cdot \prod_{i=1}^n x_i^{a-1} \cdot \prod_{i=1}^n (1 - x_i^a)^{b-1} \] \[ = a^n b^n \cdot \prod_{i=1}^n x_i^{a-1} \prod_{i=1}^n (1 - x_i^a)^{b-1} \]

To get the log-likelihood function, \(\ell(a, b)\), we take the natural log of the likelihood function. The log-likelihood function is: \[ \ell(a, b) = \ln L(a, b) = n \ln a + n \ln b + (a-1) \sum_{i=1}^n \ln x_i + (b-1) \sum_{i=1}^n \ln(1 - x_i^a) \]

To build our gradient vector, we need the first-order partial derivatives: \[ \ell'_a(a, b) = \frac{\partial \ell}{\partial a} = \frac{n}{a} + \sum \ln x + (b-1) \sum \frac{x_i^a \ln x_i}{1 - x_i^a} \] \[ \ell'_b = \frac{\partial \ell}{\partial b} = \frac{n}{b} + \sum \ln(1 - x_i^a) \]

The gradient vector \(\nabla \ell\) is: \[ \nabla \ell = \left[ \frac{n}{a} + \sum \ln x + \sum \frac{(b-1) x_i^a \ln x_i}{1 - x_i^a}, \frac{n}{b} + \sum \ln(1 - x_i^a) \right] \]


Problem A3:

Based on the gradients functions obtained in the above problem A2, derive the observed Fisher Information matrix (i.e, the negative Hessian Matrix).

In order to obtain the Fisher matrix, we need to get our second order partial derivatives.

The second-order partial derivatives are: \[ \frac{\partial^2 \ell}{\partial a^2} = -\frac{n}{a^2} + \sum \frac{(b-1) x_i^a (\ln x_i)^2}{1 - x_i^a} \] \[ \frac{\partial^2 \ell}{\partial a \partial b} = \sum \frac{x_i^a \ln x_i}{1 - x_i^a} \] \[ \frac{\partial^2 \ell}{\partial b \partial a} = \sum \frac{x_i^a \ln x_i}{1 - x_i^a} \] \[ \frac{\partial^2 \ell}{\partial b^2} = -\frac{n}{b^2} \]

If we were to build the matrix as is, we would get the hessian matrix. But there’s good news: the Fisher information matrix is just the hessian matrix multiplied by a scalar of -1. So, we can multiply each partial derivative by -1 and then build the matrix.

The Fisher Matrix ends up as: \[ \begin{bmatrix} \frac{n}{a^2} - \sum \frac{(b-1)x^a(\ln x)^2}{1-x^a} & -\sum \frac{x^a \ln x}{1-x^a} \\ -\sum \frac{x^a \ln x}{1-x^a} & \frac{n}{b^2} \end{bmatrix} \]

 

Problem A4:

Consider power distribution \(F(x) = x^a, (a >0 \quad \text{ and }\quad x \in (0,1))\), a special case of the Kumaraswamy distribution with \(b = 1\), and a random sample from this distribution \(\{ x_1, x_2, \cdots, x_n\}\). Derive the MLE and MME of \(a\) respectively. [Hint: To find the MME, you need to compute the moment of the power distribution; that is, \(E[X^k] = \int_0^1 x^k F'(x) dx\). Note that both the MLE and the MME have closed-form expressions.]

In order to derive either estimate for a, we need the pdf of the distribution. To get the pdf from the cdf, we need to take the derivative of the cdf: \[ f(x; a) \frac{d}{dx} F(x; a) = \frac{d}{dx} = x^a \] \[ f(x; a) = ax^{a-1}, \quad 0 < x < 1, \quad a > 0 \]

From here, let’s first derive the MLE for a. Once the pdf is obtained, we can get the likelihood function: \[ L(a) = \prod_{i=1}^n f(x_i; a) = \prod_{i=1}^n ax_i^{a-1} = a^n \prod_{i=1}^n x_i^{a-1} \]

And then the Log-likelihood function: \[ \ell(a) = \ln L = n \ln a + (a-1) \sum_{i=1}^n \ln x_i \]

Next, we can take the derivative with respect to a and obtain the score function: \[ \frac{d\ell}{da} = \frac{n}{a} + \sum_{i=1}^n \ln x_i \] Unlike before, we didn’t need to solve for any parameters, as we were just building a vector of the score functions. But, now we do need to solve for a parameter.

To do so, we need to set the derivative equal to 0 and solve for a. \[ \frac{n}{a} + \sum_{i=1}^n \ln x_i = 0 \]

Solving for a, we get our maximum likelihood estimator for a: \[ \hat{a} = -\frac{n}{\sum_{i=1}^n \ln x_i} \]

Next, we can get the method of moments estimator for a. To do so, we must set the population moment equal to the sample moment. Since we are only estimating one parameter, we only need the first population and sample moments.

The first moment for either a population or sample is the mean. To get the population mean, we need to compute the expected value of x. The expected value of x is: \[ \mu_x = \int_0^1 x \cdot ax^{a-1} \, dx = \int_0^1 ax^a \, dx = \left[ \frac{ax^{a+1}}{a+1} \right]_0^1 = \frac{a}{a+1} \]

Once we get the population mean, we can set it equal to the sample mean: \[ \mu_x = \bar{x} \implies \bar{x} = \frac{a}{a+1} \]

Solving for a, we get the method of moments estimator for a: \[ \hat{a} = \frac{\bar{x}}{1 - \bar{x}} \]


Problem A5:

Using the same setting as in Problem A4, find the asymptotic (Wald) confidence interval for \(a\). [Hint: Compute the Fisher information for \(a\), then take its reciprocal to obtain the variance.]

A Wald confidence interval looks like: \[ \text{Wald CI} = \hat{a} \pm z_{1-\alpha/2}*se, \]

where \(\hat{a}\) is the maximum likelihood estimate for a, \(z_{1-\alpha/2}\) is the critical value of the \((1 - \alpha)*100%\) confidence level, and se is the standard error.

Assuming we’re building a 95% Wald Confidence Interval, which would mean that \(\alpha = 0.05\):

\[ 95\% \text{ CI} = \left( \hat{a} - z_{0.975}*se, \hat{a} + 1.96*se \right) \]

We already have the maximum likelihood estimate from problem A4. But what is the critical z value and the standard error? Getting the critical z value is easy: that can just be looked up. The critical z value for a 95% confidence interval is 1.96. Getting the standard error is a little more difficult because that requires some math.

To get the standard error, we need to go back to the log likelihood function of a. We will first obtain the variance of a by taking the second derivative of the log-likelihood function (or the derivative of the score function we already obtained in problem A4). Regardless, we should get: \[ \frac{d^2\ell}{da^2} = -\frac{n}{a^2} \]

From here, we can compute the Fisher information, which is just the negative expected value of the second derivative. Since the second derivative is just a constant, the expected value will just be that derivative. Multiply it by -1, we get the fisher information.

\[ I(a) = -E\left(\frac{d^2 \ell}{da^2}\right) = \frac{n}{a^2}$ \]

To get the variance, we just take the reciprocal of the fisher information. \[ Var(a) = \frac{a^2}{n} \]

To get the standard error, we just take the square root of the variance: \[ {se}(a) = \frac{a}{\sqrt{n}} \]

And now we can build the 95% Wald Confidence Interval: \[ 95\% \text{Wald CI} = \left( \hat{a} - 1.96 \frac{\hat{a}}{\sqrt{n}}, \hat{a} + 1.96 \frac{\hat{a}}{\sqrt{n}} \right) \]


Problem A6:

Using the same setting as in Problem A4, perform a likelihood ratio test for the hypothesis \(H_0 :a=1\) (i.e., the power distribution reduces to a uniform distribution). [Hint: Evaluate the log-likelihood function at the maximum likelihood estimate \(\hat{a}\) and at \(a=1\), then use these values to construct the LRT test statistic.]

When doing a likelihood ratio test, we are comparing the fitness of two models: a simpler restricted model, or a more complex unrestricted model. In this case, we are going to test whether or not a power distribution or another Kumaraswamy based distribution will fit the data better. In other words, is this sample more likely to come from a population that is modeled with a power distribution or another Kumaraswamy based distribution?

\[ H_0: a = 1 (Power Distribution) H_a: a \neq 1 (Kumaraswamy Distribution) \]

To conduct our test, we need to evalute the log likelihood of the power distribution at two points: the first is when a is set to 1, which gives us our restricted model and the second is when a is set to the maximum likelihood estimator, which gives us our unrestricted model.

The null hypothesis, \(H_0\): \[ a = 1 \implies \ell(1) = 0 \]

The alternative hypothesis, \(H_a\): \[ a=\hat{a} \implies \ell(\hat{a}) = n \ln \hat{a} + (\hat{a}-1) \sum_{i=1}^n \ln x_i \]

The test statistic will be: \[ LR = 2[\ell(\hat{a}) - \ell(1)] = 2 \left[ n \ln \hat{a} + (\hat{a}-1) \sum_{i=1}^n \ln x_i \right] \]

There are several important things to note here: The first is that this test will work better if the sample size is large enough. The second is that if the sample size is large enough, then the test statistic will asymptotically follow a \(\chi^2\) distribution with 1 degree of freedom. The the third is that this is a two tailed test. Which means that there are two rejection regions: if the \(\chi^2\) statistic you obtain is less than the critical value associated with \(\frac{\alpha}{2}\) or greater than the critical value associated with \(\{frac{1-\alpha}{2}\). If \(n\) is large enough (\(n > 30\)), then \(LR \sim \chi_1^2\). For example, if the level of significance is 0.05, then you’d reject the null hypothesis if your test statistic was less than 0.000982 (and so on) or greater than 5.023886. But at least the p-value doesn’t change for rejection; you reject the null if the p-value is less than the level of significance.


Part B: Numerical Analysis

All code must be well commented and adhere to best coding practices

Working Dataset: A small reservoir supplies water to a town. During the dry season (50 days), engineers record the fraction of usable storage filled each morning. Values near 0 mean the reservoir is nearly empty; values near 1 mean it’s full. The distribution tends to be right‑skewed (mostly low levels due to drought) but with occasional replenishment.

The following 50 data points (ordered for clarity) represent the daily proportion of usable storage:

0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22,
0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32,
0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42,
0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52,
0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.78
# Putting Data Into An Object

water <- c(0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22,
0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32,
0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42,
0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52,
0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.78)


Problem B1:

Fit the Kumaraswamy distribution to the above data. Use the derivations in Problem A2 to find the MLE of \(a\) and \(b\). Please copy the key formulas before coding.

# Manual MLE implementation for Kumaraswamy distribution

# Kumaraswamy log-likelihood function
kuma.loglik <- function(params, data) {
  shape1 <- params[1]  # passing the parameters
  shape2 <- params[2]

n <- length(data)   # sample size
  
# Log-likelihood for Kumaraswamy distribution
loglik <- n*log(shape1) + n*log(shape2) + (shape1 - 1)*sum(log(data)) + 
            (shape2 - 1)*sum(log(1 - data^shape1)) 
  
  return(loglik)    # Return negative for minimization
}


## Score (gradient) equation
kuma.score <- function(params, data) {
  shape1 <- params[1]
  shape2 <- params[2]
  n <- length(data)
  
# Gradient for Parameter a
  grad_shape1 <- n/shape1 + sum(log(data)) -
                (shape2 - 1)*sum((log(data)*data^shape1)/(1-data^shape1))
  
# Gradient for Parameter b
  grad_shape2 <- (n/shape2) + sum(log(1-data^shape1))
                
  
  return(c(grad_shape1, grad_shape2))
}


# Need to provide initial values for parameters
initial.params <- c(shape1 = 2.2, shape2 = 1.5)  # Reasonable starting values

# Using optim with Nelder-Mead method
mle.result.kuma <- optim(
  par = initial.params,
  fn = kuma.loglik,
  gr = kuma.score,
  data = water,
  method = "L-BFGS-B",
  hessian = TRUE,
  control = list(trace = FALSE,
                 fnscale = -1,
                 maxit = 500,
                 abstol = 1e-8)
)
##
mle.result.kuma$par
  shape1   shape2 
2.529602 7.883386 

According to the output, the first shape parameter, a, is equal to 2.529602, and the second shape parameter, b, is equal to 7.883386.

For future use, the estimates will be extracted and put into objects.

# Extracting the Parameter Estimates for Future Use

shape1.est <- mle.result.kuma$par[1]
shape2.est <- mle.result.kuma$par[2]
kuma.est <- c(shape1.est, shape2.est)
kuma.est
  shape1   shape2 
2.529602 7.883386 


Problem B2:

Fit the power distribution to the above data using the derived of \(a\) obtained in Problem A4 to test the following hypothesis using likelihood ratio procedure ar significance level \(\alpha = 0.05\):

\[ H_0: b = 1 \quad \text{ versus } \quad H_a: b \ne 1. \]

State the statistical decision clearly. What is the practical implication of the testing result?

The hypotheses of our test are as follows: \[ H_0: b = 1 (Kumaraswamy becomes a Power Distribution) / H_a: b \neq 1 (Data follows another Kumaraswamy Distribution) \]

The following code chunk is for the likelihood ratio test:

# Likelihood Ratio Test For Power vs Kumaraswamy distribution

# MLE Of Power Distribution Parameter from Part A4
n <- length(water)
shape3.mle <- -n / sum(log(water))

# Kumaraswamy Log-Likelihood Function
loglike.kuma <- function(data, a, b) {
  n <- length(data)
 n*log(a) + n*log(b) + (a - 1)*sum(log(data)) + 
            (b - 1)*sum(log(1 - data^a)) 
}

# Power Log-Likelihood Function
loglike.power <- function(data, a) { 
  n <- length(data)
  n*log(a) + (a - 1)*sum(log(data))
}

# Unrestricted and Restricted MLEs for LR Test
loglike.alt1 <- loglike.kuma(water, shape1.est, shape2.est)
loglike.null1 <- loglike.power(water, shape3.mle)

# Likelihood ratio test statistic
LR1 <- 2*(loglike.alt1 - loglike.null1)

# p-value from chi-square(1)
pvalue.LR1 <- 1 - pchisq(LR1, df = 1)

# Test Statistic and P-value
LR1
  shape1 
48.92533 
pvalue.LR1
      shape1 
2.658984e-12 

According to the output, the test statistic is \(\chi^2 = 48.92533\), and the corresponding p-value is \(2.65x10^-12\). Since the p-value is less than the level of significance, we can reject the null hypothesis and conclude that there is sufficient evidence to conclude that this data comes from another Kumaraswamy based distribution. To put it in practical terms, the power distribution is not a good fit for this data, meaning this sample is unlikely to come from a population modeled by a power distribution. This sample more than likely comes from a different Kumaraswamy based distribution.


Problem B3:

Use the procedure and code from Problem B1 to estimate the MLEs of \(a\) and \(b\), and then complete the following analyses:

(1). Obtain the bootstrap sampling distributions of \(\hat{a}\) and \(\hat{b}\) and plot each distribution using Gaussian kernel density curves.

First, let’s get our bootstrap samples:

# Bootstrap Sampling Distributions of Kumaraswamy MLEs

# Set Seed to Keep Same Sample
set.seed(1)

# Choose Number of Bootstrap Samples 
B <- 5000

# Store bootstrap estimates
boot.a <- NULL
boot.b <- NULL

for(i in 1:B) {
  
  # Bootstrap sample
  bootstrap.sample <- sample(water, size = n, replace = TRUE)
  
  # Refit Kumaraswamy model to bootstrap sample
  boot.fit <- optim(
    par = c(shape1.est, shape2.est),
    fn = kuma.loglik,
    gr = kuma.score,
    data = bootstrap.sample,
    method = "L-BFGS-B",
    lower = c(1e-8, 1e-8),
    control = list(
      maxit = 1000,
      fnscale = -1,
      trace = FALSE,
      abstol = 1e-8
    )
  )
  
  # Save bootstrap estimates
  boot.a[i] <- boot.fit$par[1]
  boot.b[i] <- boot.fit$par[2]
}

Let’s plot both of the sampling distributions for the estimates of a

# Plot bootstrap distribution of a_hat
hist(boot.a,
     probability = TRUE,
     breaks = 20, 
     col = "lightblue",
     main = "Bootstrap Sampling Distribution for Parameter a",
     xlab = expression(paste("Estimates for ", hat(a))))
lines(density(boot.a), col = "red", lwd = 2)

# Plot bootstrap distribution of b_hat
hist(boot.b,
     probability = TRUE,
     breaks = 20, 
     col = "lightblue",
     main = "Bootstrap Sampling Distribution for Parameter b",
     xlab = expression(paste("Estimates for ", (hat(b)))))
     lines(density(boot.b), col = "red", lwd = 2)

The plot for \(\hat{a}\) appears to roughly resemble a normal curve. The kernel density curve also does fit relatively well. As for the plot for \(\hat{b}\), it does not resemble a normal curve. There is some very obvious skew.

If we take a look at a summary of the distributions, we can clearly see that there is not too much spread for the distribution of \(\hat{a}\). And the mean is relatively close to the median. But there is much more spread in the distribution for \(\hat{b}\), and mean is farther from the median.

summary(boot.a)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.767   2.387   2.586   2.622   2.820   4.208 
summary(boot.b)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  3.756   6.956   8.412   9.022  10.452  32.424 

(2). Construct both the \(95\%\) bootstrap confidence interval and the Wald confidence interval for \(b\). Do these intervals agree with the results obtained in Problem B2? [Compute the standard error of \(\hat{b}\) using the observed Fisher information matrix, i.e., the inverse of the negative Hessian obtained from optim()]

# Find Bootstrap and Wald Confidence Intervals for b

# 95% Percentile Bootstrap Confidence Interval 
bootci.perc.b <- quantile(boot.b, probs = c(0.025, 0.975))

# Pieces to Build 95% Wald Confidence Interval
hessian <- mle.result.kuma$hessian
fisher <- solve(-hessian)
se.b.est <- sqrt(fisher[2, 2])
z <- qnorm(0.975)
error <- z*se.b.est

# Build Wald Confidence Interval
waldci.b <- c(shape2.est - error, shape2.est + error)


bootci.perc.b
     2.5%     97.5% 
 5.006674 16.188918 
waldci.b
   shape2    shape2 
 3.484033 12.282739 

The 95% Bootstrap Confidence Interval is (5.0066, 16.1889), and the 95% Wald confidence interval is (3,.484, 12.2827). Neither confidence interval contains 1, which suggests that the results agree with what we got in Part B2.

(3). Based on the bootstrap sampling distributions from part (1) of this problem, assess whether the validity of the Wald confidence interval is supported.

Since the wald confidence interval is based on asymptotic normality, the distribution should resemble a normal distribution. However, it did not. There was considerable skew, and the summary pointed out that there is considerable spread in the distribution. Based on this criteria, we can conclude that the Wald confidence interval is not a good confidence interval to use in this case.


Problem B4:

In the introduction to the working model for this exam, the Kumaraswamy distribution reduces to the uniform distribution on (0,1). In this problem, we perform a likelihood ratio test for the following hypothesis to assess whether the data come from the uniform distribution on (0,1):

\[ H_0: a = 1\quad \& \quad b = 1\quad \text{ versus } \quad H_a: a \ne 1 \quad \text{or} \quad b \ne 1 \quad \text{or}\quad (a \ne 1 \quad \& \quad b \ne 1). \]

Provide a practical interpretation of the above test result. [Hint: \(H_a\) basically says that there is no constraints for \(a\) and \(b\). Please review the lecture note for module 11 on the likelihood ratio test before coding.]

# Likelihood Ratio test for Uniform vs Kumaraswamy Distribution

# Using Kumaraswamy Likelihood From Part B2 
loglike.alt2 <- loglike.kuma(water, shape1.est, shape2.est)
loglike.null2 <- loglike.kuma(water, 1, 1)

# Likelihood ratio test statistic
LR2 <- 2*(loglike.alt2 - loglike.null2)

# p-value from Chi-Square(1)
pvalue.LR2 <- 1 - pchisq(LR2, df = 1)

# Test Statistic and P-value
LR2
  shape1 
49.12542 
pvalue.LR2
      shape1 
2.401079e-12 

The test statistic is \(\chi^2 = 49.12542\), and the corresponding p-value is \(2.4x10^{-12}\). Since the p-value is smaller than 0.05, then we can reject the null hypothesis, and can conclude that there is sufficient evidence to conclude that this data comes from another Kumaraswamy based distribution. In other words, this sample is unlikely to have originated from a population modeled by a uniform distribution. To put into practical terms, the measurements are all not equally likely to occur.

LS0tDQp0aXRsZTogIlNUQSA1MDYgRmluYWwgRXhhbWluYXRpb24iDQphdXRob3I6ICJJYW4gVmFuV3JpZ2h0Ig0KZGF0ZTogIiBEdWU6IDA1LzA1LzIwMjYiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQogICAgdGhlbWU6IHNwYWNlbGFiDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgbGlicmFyeShnZ3Bsb3QyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KICBsaWJyYXJ5KHBsb3RseSkNCn0NCiMjIyMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQQ0KICAgICAgICAgICAgICAgICAgICAgICkgIA0KYGBgDQogDQpcDQogDQojIyAqKkZpbmFsIEV4YW0gR3VpZGVsaW5lcyoqIA0KDQoqICoqQ292ZXJhZ2UqKjogVGhlIG1ham9yIGNvbmNlcHRzIGFuZCBpbmZlcmVuY2UgcHJvY2VkdXJlc+KAlHN1Y2ggYXMgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucywgY29uZmlkZW5jZSBpbnRlcnZhbHMsIGFuZCBoeXBvdGhlc2lzIHRlc3RpbmfigJRhcmUgY292ZXJlZCBhbmQgaW1wbGVtZW50ZWQgdXNpbmcgYm90aCBjbGFzc2ljYWwgcGFyYW1ldHJpYyBsaWtlbGlob29kLWJhc2VkIG1ldGhvZHMgYW5kIG1vZGVybiBub24tcGFyYW1ldHJpYyBhcHByb2FjaGVzLCBpbmNsdWRpbmcgdGhlIGJvb3RzdHJhcCBhbmQga2VybmVsIGRlbnNpdHkgZXN0aW1hdGlvbi4NCg0KKiAqKlBhcnQgQSoqIHJlcXVpcmVzIGRlcml2YXRpb24gb2Ygc2VsZWN0ZWQgbGlrZWxpaG9vZC1iYXNlZCBmdW5jdGlvbnMgZm9yIHBlcmZvcm1pbmcgdmFyaW91cyB0eXBlcyBvZiBpbmZlcmVuY2UsIHdpdGggc3VmZmljaWVudCBkZXRhaWwgdG8gZW5hYmxlIHRyYW5zbGF0aW9uIG9mIHRoZXNlIGRlcml2YXRpb25zIGludG8gY29kZSBmb3IgbnVtZXJpY2FsIGFuYWx5c2lzLg0KDQoqIFlvdXIgY29kZSBmb3IgdGhlIHByb2JsZW1zIGluICoqUGFydCBCKiogbXVzdCBhbGlnbiB3aXRoIHlvdXIgZGVyaXZhdGlvbnMgaW4gKipQYXJ0IEEqKiBhbmQgYmUgd2VsbCBjb21tZW50ZWQgd2hlcmUgbmVjZXNzYXJ5Lg0KDQoqIEluICoqUGFydCBCKiosIGFsbCBudW1lcmljYWwgcmVzdWx0cyBtdXN0IGJlIGludGVycHJldGVkIGZyb20gYSBwcmFjdGljYWwgcGVyc3BlY3RpdmUuDQoNCg0KXA0KDQojIyAqKlBvbGljaWVzIG9mIFVzaW5nIEFJIFRvb2xzKioNCg0KKiAqKlBvbGljeSBvbiBBSSBUb29sIFVzZSoqOiBTdHVkZW50cyBtdXN0IGFkaGVyZSB0byB0aGUgQUkgdG9vbCBwb2xpY3kgc3BlY2lmaWVkIGluIHRoZSBjb3Vyc2Ugc3lsbGFidXMuIFRoZSBkaXJlY3QgY29weWluZyBvZiBBSS1nZW5lcmF0ZWQgY29udGVudCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLiBBbGwgc3VibWl0dGVkIHdvcmsgbXVzdCByZWZsZWN0IHlvdXIgb3duIHVuZGVyc3RhbmRpbmc7IHdoZXJlIGV4dGVybmFsIHRvb2xzIGFyZSBjb25zdWx0ZWQsIGNvbnRlbnQgbXVzdCBiZSB0aG9yb3VnaGx5IHJlcGhyYXNlZCBhbmQgc3ludGhlc2l6ZWQgaW4geW91ciBvd24gd29yZHMuDQoNCiogKipDb2RlIEluY2x1c2lvbiBSZXF1aXJlbWVudCoqOiBBbnkgY29kZSBpbmNsdWRlZCBpbiB5b3VyIGVzc2F5IG11c3QgYmUgcHJvcGVybHkgY29tbWVudGVkIHRvIGV4cGxhaW4gdGhlIHB1cnBvc2UgYW5kL29yIGV4cGVjdGVkIG91dHB1dCBvZiBrZXkgY29kZSBsaW5lcy4gU3VibWl0dGluZyBBSS1nZW5lcmF0ZWQgY29kZSB3aXRob3V0IG1lYW5pbmdmdWwsIHN0dWRlbnQtYWRkZWQgY29tbWVudHMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuDQoNClwNCg0KIyMgKipXb3JraW5nIE1vZGVsIGZvciB0aGUgRmluYWwgRXhhbSoqDQoNCjxmb250IGNvbG9yID0gIm9yYW5nZSI+KipDYXV0aW9uKio6ICpQbGVhc2UgZm9sbG93IHRoZSBzdWdnZXN0ZWQgZXhwcmVzc2lvbnMgYW5kIGd1aWRlZCBzdGVwcyB0byBjb21wbGV0ZSB0aGUgZXhhbS4gT3RoZXIgYXBwcm9hY2hlcyBzdWNoIGFzIHRyYW5zZm9ybWF0aW9uIGZvciB0cml2aWFsaXplIHRoZSBwcm9ibGVtcyB0aGF0IHdpbGwgbm90IG1lZXQgdGhlIGV4YW0gb2JqZWN0aXZlcy4qPC9mb250Pg0KDQoNClRoZSAqKkt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbioqIGlzIGEgdHdvLXBhcmFtZXRlciBjb250aW51b3VzIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBkZWZpbmVkIG9uIHRoZSBpbnRlcnZhbCAoMCwgMSkuIEl0IGlzIG9mdGVuIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIEJldGEgZGlzdHJpYnV0aW9uIGR1ZSB0byBpdHMgc2ltcGxlIGNsb3NlZC1mb3JtIGV4cHJlc3Npb25zIGZvciB0aGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gKENERikgYW5kIHF1YW50aWxlIGZ1bmN0aW9uLiBJdCBpcyBjb21tb25seSB1c2VkIGluIA0KDQoqICoqSHlkcm9sb2d5Kio6IE1vZGVsaW5nIHJhaW5mYWxsLCBzdHJlYW1mbG93LCBvciBvdGhlciBib3VuZGVkIG5hdHVyYWwgcGhlbm9tZW5hDQoNCiogKipFY29ub21pY3MqKjogSW5jb21lIHNoYXJlcywgcHJvcG9ydGlvbnMsIG9yIGJvdW5kZWQgaW5kaWNlcw0KDQoqICoqTW9udGUgQ2FybG8gc2ltdWxhdGlvbioqOiBFZmZpY2llbnQgcmFuZG9tIHZhcmlhdGUgZ2VuZXJhdGlvbiAodmlhIGludmVyc2UgdHJhbnNmb3JtKQ0KDQoqICoqTWFjaGluZSBsZWFybmluZyoqOiBPdXRwdXQgbGF5ZXIgZm9yIGJvdW5kZWQgdGFyZ2V0cywgcHJpb3IgZGlzdHJpYnV0aW9ucyBpbiBCYXllc2lhbiBtb2RlbHMNCg0KKiAqKlJlbGlhYmlsaXR5IGVuZ2luZWVyaW5nKio6IE1vZGVsaW5nIGZhaWx1cmUgcmF0ZXMgb2Ygc3lzdGVtcyB3aXRoIGJvdW5kZWQgbGlmZXRpbWVzDQoNClwNCg0KTGV0ICRYJCBiZSB0aGUgS3VtYXJhc3dhbXkgcmFuZG9tIHZhcmlhYmxlIHdpdGggQ3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb24gKENERikgIA0KDQokJA0KRih4OyBhLCBiKSA9IDEgLSAoMSAtIHheYSleYg0KJCQNCg0Kd2hlcmUgJGEgPiAwJCBhbmQgJGIgPiAwJCB1bmtub3duIHBhcmFtZXRlcnMgYW5kICQwIDwgeCA8IDEkLiANCg0KVGhlIGZvbGxvd2luZyBhcmUgdHdvIHNwZWNpYWwgY2FzZSBvZiB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uOg0KDQoxLiAqKlVuaWZvcm0gRGlzdHJpYnV0aW9uKio6IFdoZW4gJGEgPSAxJCBhbmQgJGIgPSAxJCwgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiBiZWNvbWVzIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gb3ZlciAkWzAsIDFdJCB3aXRoIENERiAkRih4KSA9IHgkLg0KDQoNCjIuICoqUG93ZXIgRGlzdHJpYnV0aW9uKio6IHdoZW4gJGIgPSAxJCBhbmQgJGEgPiAwJCwgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiBiZWNvbWVzIGEgcG93ZXIgZGlzdHJpYnV0aW9uIG92ZXIgJFswLCAxXSQgd2l0aCBDREYgJEYoeCkgPSB4XmEkLiANCg0KVGhpcyBmaW5hbCBleGFtIGZvY3VzZXMgb24gaW5mZXJlbmNlcyBvZiBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gYW5kIHJlbGF0ZWQgZGF0YSBhbmFseXNpcy4NCg0KDQojIyBQYXJ0IEE6IE1ldGhvZG9sb2dpY2FsIERlcml2YXRpb25zDQoNClwNCg0KIyMjICoqUHJvYmxlbSBBMSoqOiANClNob3cgdGhhdCB0aGUgZGVuc2l0eSBmdW5jdGlvbiBvZiB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIGlzDQoNCiQkDQpmKHg7IGEsIGIpID0gYWIgXCwgeF57YS0xfSAoMSAtIHheYSlee2ItMX0uDQokJA0KDQpJbiBvcmRlciB0byBnZXQgdGhlIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gKHBkZikgZm9yIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gd2UgbXVzdCB0YWtlIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBjZGY6DQokJA0KZih4OyBhLCBiKSA9IFxmcmFje2R9e2R4fSBGKHg7IGEsIGIpID0gXGZyYWN7ZH17ZHh9IFsxIC0gKDEgLSB4XmEpXmJdIA0KJCQNCg0KVXNpbmcgdGhlIGNoYWluIHJ1bGUsIHdlIG9idGFpbjoNCg0KJCQNCmYoeDsgYSwgYikgPSAtYigxIC0geF5hKV57Yi0xfSBcY2RvdCAtYXhee2EtMX0gDQokJA0KDQpPbmNlIHNpbXBsaWZpZWQsIHRoZSBwZGYgaXM6DQokJA0KZih4OyBhLCBiKSA9IGFieF57YS0xfSgxIC0geF5hKV57Yi0xfSANCiQkDQoNClwNCg0KIyMjICoqUHJvYmxlbSBBMioqOiANCkxldCAkXHt4XzEsIHhfMiwgXGNkb3RzLCB4X24gXH0kIGJlIGFuIGkuaS5kLiByYW5kb20gc2FtcGxlIHRha2VuIGZyb20gYSBwb3B1bGF0aW9uIHRoYXQgZm9sbG93cyB0aGUgYW92ZSAyLXBhcmFtZXRlciBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24uIFdyaXRlIG91dCB0aGUgbG9nbGlrZWxpaG9vZCBmdW5jdGlvbiBvZiAkYSQgYW5kICRiJCwgZGVub3RlZCBieSAkXGVsbChhLGIpJCwgYmFzZWQgb24gdGhlIGFib3ZlIHJhbmRvbSBzYW1wbGUgYW5kICoqZGVyaXZlKiogdGhlIGdyYWRpZW50IHZlY3RvciAkW1xlbGxfYV5ccHJpbWUoYSxiKSwgXGVsbF9iXlxwcmltZShhLGIpXSQsIHRoZSBmaXJzdCBvcmRlciBwYXJ0aWFsIGRlcml2YXRpdmUgb2YgdGhlIGxvZy1saWtlbGlob29kIHdpdGggcmVzcGVjdCB0byBwYXJhbWV0ZXJzICRhJCBhbmQgJGIkLg0KDQpGcm9tIFByb2JsZW0gQTEsIHRoZSBQREYgaXM6DQokJA0KZih4KSA9IGFieF57YS0xfSgxIC0geF5hKV57Yi0xfSwgXHF1YWQgMCA8IHggPCAxLCBhID4gMCwgYiA+IDANCiQkDQoNClRoZSBsaWtlbGlob29kIGZ1bmN0aW9uICRMKGEsIGIpJCBpczoNCiQkDQpMKGEsIGIpID0gXHByb2Rfe2k9MX1ebiBmKHhfaTsgYSwgYikgPSBccHJvZF97aT0xfV5uIGFieF9pXnthLTF9KDEgLSB4X2leYSlee2ItMX0gDQokJA0KDQpSZXdyaXRpbmcgdGhlIGVxdWF0aW9uLCB3ZSBnZXQ6DQokJA0KXHByb2Rfe2k9MX1ebiBhYiBcY2RvdCBccHJvZF97aT0xfV5uIHhfaV57YS0xfSBcY2RvdCBccHJvZF97aT0xfV5uICgxIC0geF9pXmEpXntiLTF9IA0KJCQNCiQkDQo9IGFebiBiXm4gXGNkb3QgXHByb2Rfe2k9MX1ebiB4X2lee2EtMX0gXHByb2Rfe2k9MX1ebiAoMSAtIHhfaV5hKV57Yi0xfSANCiQkDQoNClRvIGdldCB0aGUgbG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24sICRcZWxsKGEsIGIpJCwgd2UgdGFrZSB0aGUgbmF0dXJhbCBsb2cgb2YgdGhlIGxpa2VsaWhvb2QgZnVuY3Rpb24uIFRoZSBsb2ctbGlrZWxpaG9vZCBmdW5jdGlvbiBpczoNCiQkDQpcZWxsKGEsIGIpID0gXGxuIEwoYSwgYikgPSBuIFxsbiBhICsgbiBcbG4gYiArIChhLTEpIFxzdW1fe2k9MX1ebiBcbG4geF9pICsgKGItMSkgXHN1bV97aT0xfV5uIFxsbigxIC0geF9pXmEpDQokJA0KDQpUbyBidWlsZCBvdXIgZ3JhZGllbnQgdmVjdG9yLCB3ZSBuZWVkIHRoZSBmaXJzdC1vcmRlciBwYXJ0aWFsIGRlcml2YXRpdmVzOg0KJCQNClxlbGwnX2EoYSwgYikgPSBcZnJhY3tccGFydGlhbCBcZWxsfXtccGFydGlhbCBhfSA9IFxmcmFje259e2F9ICsgXHN1bSBcbG4geCArIChiLTEpIFxzdW0gXGZyYWN7eF9pXmEgXGxuIHhfaX17MSAtIHhfaV5hfQ0KJCQNCiQkDQpcZWxsJ19iID0gXGZyYWN7XHBhcnRpYWwgXGVsbH17XHBhcnRpYWwgYn0gPSBcZnJhY3tufXtifSArIFxzdW0gXGxuKDEgLSB4X2leYSkNCiQkDQoNClRoZSBncmFkaWVudCB2ZWN0b3IgJFxuYWJsYSBcZWxsJCBpczoNCiQkDQpcbmFibGEgXGVsbCA9IFxsZWZ0WyBcZnJhY3tufXthfSArIFxzdW0gXGxuIHggKyBcc3VtIFxmcmFjeyhiLTEpIHhfaV5hIFxsbiB4X2l9ezEgLSB4X2leYX0sIFxmcmFje259e2J9ICsgXHN1bSBcbG4oMSAtIHhfaV5hKSBccmlnaHRdIA0KJCQNCg0KXA0KDQojIyMgKipQcm9ibGVtIEEzKio6IA0KQmFzZWQgb24gdGhlIGdyYWRpZW50cyBmdW5jdGlvbnMgb2J0YWluZWQgaW4gdGhlIGFib3ZlIHByb2JsZW0gQTIsICoqZGVyaXZlKiogdGhlIG9ic2VydmVkIEZpc2hlciBJbmZvcm1hdGlvbiBtYXRyaXggKGkuZSwgdGhlIG5lZ2F0aXZlIEhlc3NpYW4gTWF0cml4KS4NCg0KSW4gb3JkZXIgdG8gb2J0YWluIHRoZSBGaXNoZXIgbWF0cml4LCB3ZSBuZWVkIHRvIGdldCBvdXIgc2Vjb25kIG9yZGVyIHBhcnRpYWwgZGVyaXZhdGl2ZXMuDQoNClRoZSBzZWNvbmQtb3JkZXIgcGFydGlhbCBkZXJpdmF0aXZlcyBhcmU6DQokJA0KXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhXjJ9ID0gLVxmcmFje259e2FeMn0gKyBcc3VtIFxmcmFjeyhiLTEpIHhfaV5hIChcbG4geF9pKV4yfXsxIC0geF9pXmF9IA0KJCQNCiQkDQpcZnJhY3tccGFydGlhbF4yIFxlbGx9e1xwYXJ0aWFsIGEgXHBhcnRpYWwgYn0gPSBcc3VtIFxmcmFje3hfaV5hIFxsbiB4X2l9ezEgLSB4X2leYX0gDQokJA0KJCQNClxmcmFje1xwYXJ0aWFsXjIgXGVsbH17XHBhcnRpYWwgYiBccGFydGlhbCBhfSA9IFxzdW0gXGZyYWN7eF9pXmEgXGxuIHhfaX17MSAtIHhfaV5hfQ0KJCQNCiQkDQpcZnJhY3tccGFydGlhbF4yIFxlbGx9e1xwYXJ0aWFsIGJeMn0gPSAtXGZyYWN7bn17Yl4yfQ0KJCQNCg0KSWYgd2Ugd2VyZSB0byBidWlsZCB0aGUgbWF0cml4IGFzIGlzLCB3ZSB3b3VsZCBnZXQgdGhlIGhlc3NpYW4gbWF0cml4LiBCdXQgdGhlcmUncyBnb29kIG5ld3M6IHRoZSBGaXNoZXIgaW5mb3JtYXRpb24gbWF0cml4IGlzIGp1c3QgdGhlIGhlc3NpYW4gbWF0cml4IG11bHRpcGxpZWQgYnkgYSBzY2FsYXIgb2YgLTEuIFNvLCB3ZSBjYW4gbXVsdGlwbHkgZWFjaCBwYXJ0aWFsIGRlcml2YXRpdmUgYnkgLTEgYW5kIHRoZW4gYnVpbGQgdGhlIG1hdHJpeC4NCg0KVGhlIEZpc2hlciBNYXRyaXggZW5kcyB1cCBhczoNCiQkDQpcYmVnaW57Ym1hdHJpeH0gXGZyYWN7bn17YV4yfSAtIFxzdW0gXGZyYWN7KGItMSl4XmEoXGxuIHgpXjJ9ezEteF5hfSAmIC1cc3VtIFxmcmFje3heYSBcbG4geH17MS14XmF9IFxcIC1cc3VtIFxmcmFje3heYSBcbG4geH17MS14XmF9ICYgXGZyYWN7bn17Yl4yfSBcZW5ke2JtYXRyaXh9DQokJA0KDQpcIA0KDQojIyMgKipQcm9ibGVtIEE0Kio6IA0KDQpDb25zaWRlciBwb3dlciBkaXN0cmlidXRpb24gJEYoeCkgPSB4XmEsIChhID4wIFxxdWFkIFx0ZXh0eyBhbmQgfVxxdWFkIHggXGluICgwLDEpKSQsIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gd2l0aCAkYiA9IDEkLCBhbmQgYSByYW5kb20gc2FtcGxlIGZyb20gdGhpcyBkaXN0cmlidXRpb24gJFx7IHhfMSwgeF8yLCBcY2RvdHMsIHhfblx9JC4gKipEZXJpdmUqKiB0aGUgTUxFIGFuZCBNTUUgb2YgJGEkIHJlc3BlY3RpdmVseS4gWypIaW50OiBUbyBmaW5kIHRoZSBNTUUsIHlvdSBuZWVkIHRvIGNvbXB1dGUgdGhlIG1vbWVudCBvZiB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uOyB0aGF0IGlzLCAkRVtYXmtdID0gXGludF8wXjEgeF5rIEYnKHgpIGR4JC4gTm90ZSB0aGF0IGJvdGggdGhlIE1MRSBhbmQgdGhlIE1NRSBoYXZlIGNsb3NlZC1mb3JtIGV4cHJlc3Npb25zLipdDQoNCkluIG9yZGVyIHRvIGRlcml2ZSBlaXRoZXIgZXN0aW1hdGUgZm9yIGEsIHdlIG5lZWQgdGhlIHBkZiBvZiB0aGUgZGlzdHJpYnV0aW9uLiBUbyBnZXQgdGhlIHBkZiBmcm9tIHRoZSBjZGYsIHdlIG5lZWQgdG8gdGFrZSB0aGUgZGVyaXZhdGl2ZSBvZiB0aGUgY2RmOg0KJCQNCmYoeDsgYSkgXGZyYWN7ZH17ZHh9IEYoeDsgYSkgPSBcZnJhY3tkfXtkeH0gPSB4XmENCiQkDQokJA0KZih4OyBhKSA9IGF4XnthLTF9LCBccXVhZCAwIDwgeCA8IDEsIFxxdWFkIGEgPiAwDQokJA0KDQpGcm9tIGhlcmUsIGxldCdzIGZpcnN0IGRlcml2ZSB0aGUgTUxFIGZvciBhLiBPbmNlIHRoZSBwZGYgaXMgb2J0YWluZWQsIHdlIGNhbiBnZXQgdGhlIGxpa2VsaWhvb2QgZnVuY3Rpb246DQokJA0KTChhKSA9IFxwcm9kX3tpPTF9Xm4gZih4X2k7IGEpID0gXHByb2Rfe2k9MX1ebiBheF9pXnthLTF9ID0gYV5uIFxwcm9kX3tpPTF9Xm4geF9pXnthLTF9DQokJA0KDQpBbmQgdGhlbiB0aGUgTG9nLWxpa2VsaWhvb2QgZnVuY3Rpb246DQokJA0KXGVsbChhKSA9IFxsbiBMID0gbiBcbG4gYSArIChhLTEpIFxzdW1fe2k9MX1ebiBcbG4geF9pDQokJA0KDQpOZXh0LCB3ZSBjYW4gdGFrZSB0aGUgZGVyaXZhdGl2ZSB3aXRoIHJlc3BlY3QgdG8gYSBhbmQgb2J0YWluIHRoZSBzY29yZSBmdW5jdGlvbjoNCiQkDQpcZnJhY3tkXGVsbH17ZGF9ID0gXGZyYWN7bn17YX0gKyBcc3VtX3tpPTF9Xm4gXGxuIHhfaQ0KJCQNClVubGlrZSBiZWZvcmUsIHdlIGRpZG4ndCBuZWVkIHRvIHNvbHZlIGZvciBhbnkgcGFyYW1ldGVycywgYXMgd2Ugd2VyZSBqdXN0IGJ1aWxkaW5nIGEgdmVjdG9yIG9mIHRoZSBzY29yZSBmdW5jdGlvbnMuIEJ1dCwgbm93IHdlIGRvIG5lZWQgdG8gc29sdmUgZm9yIGEgcGFyYW1ldGVyLg0KDQpUbyBkbyBzbywgd2UgbmVlZCB0byBzZXQgdGhlIGRlcml2YXRpdmUgZXF1YWwgdG8gMCBhbmQgc29sdmUgZm9yIGEuDQokJA0KXGZyYWN7bn17YX0gKyBcc3VtX3tpPTF9Xm4gXGxuIHhfaSA9IDANCiQkDQoNClNvbHZpbmcgZm9yIGEsIHdlIGdldCBvdXIgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRvciBmb3IgYToNCiQkDQpcaGF0e2F9ID0gLVxmcmFje259e1xzdW1fe2k9MX1ebiBcbG4geF9pfQ0KJCQNCg0KTmV4dCwgd2UgY2FuIGdldCB0aGUgbWV0aG9kIG9mIG1vbWVudHMgZXN0aW1hdG9yIGZvciBhLiBUbyBkbyBzbywgd2UgbXVzdCBzZXQgdGhlIHBvcHVsYXRpb24gbW9tZW50IGVxdWFsIHRvIHRoZSBzYW1wbGUgbW9tZW50LiBTaW5jZSB3ZSBhcmUgb25seSBlc3RpbWF0aW5nIG9uZSBwYXJhbWV0ZXIsIHdlIG9ubHkgbmVlZCB0aGUgZmlyc3QgcG9wdWxhdGlvbiBhbmQgc2FtcGxlIG1vbWVudHMuIA0KDQpUaGUgZmlyc3QgbW9tZW50IGZvciBlaXRoZXIgYSBwb3B1bGF0aW9uIG9yIHNhbXBsZSBpcyB0aGUgbWVhbi4gVG8gZ2V0IHRoZSBwb3B1bGF0aW9uIG1lYW4sIHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgeC4gVGhlIGV4cGVjdGVkIHZhbHVlIG9mIHggaXM6DQokJA0KXG11X3ggPSBcaW50XzBeMSB4IFxjZG90IGF4XnthLTF9IFwsIGR4ID0gXGludF8wXjEgYXheYSBcLCBkeCA9IFxsZWZ0WyBcZnJhY3theF57YSsxfX17YSsxfSBccmlnaHRdXzBeMSA9IFxmcmFje2F9e2ErMX0gDQokJA0KDQpPbmNlIHdlIGdldCB0aGUgcG9wdWxhdGlvbiBtZWFuLCB3ZSBjYW4gc2V0IGl0IGVxdWFsIHRvIHRoZSBzYW1wbGUgbWVhbjoNCiQkDQpcbXVfeCA9IFxiYXJ7eH0gXGltcGxpZXMgXGJhcnt4fSA9IFxmcmFje2F9e2ErMX0NCiQkDQoNClNvbHZpbmcgZm9yIGEsIHdlIGdldCB0aGUgbWV0aG9kIG9mIG1vbWVudHMgZXN0aW1hdG9yIGZvciBhOg0KJCQNClxoYXR7YX0gPSBcZnJhY3tcYmFye3h9fXsxIC0gXGJhcnt4fX0NCiQkDQoNClwNCg0KIyMjICoqUHJvYmxlbSBBNSoqOg0KDQpVc2luZyB0aGUgc2FtZSBzZXR0aW5nIGFzIGluICoqUHJvYmxlbSBBNCoqLCBmaW5kIHRoZSBhc3ltcHRvdGljIChXYWxkKSBjb25maWRlbmNlIGludGVydmFsIGZvciAkYSQuIFsqSGludDogQ29tcHV0ZSB0aGUgRmlzaGVyIGluZm9ybWF0aW9uIGZvciAkYSQsIHRoZW4gdGFrZSBpdHMgcmVjaXByb2NhbCB0byBvYnRhaW4gdGhlIHZhcmlhbmNlKi5dDQoNCkEgV2FsZCBjb25maWRlbmNlIGludGVydmFsIGxvb2tzIGxpa2U6DQokJA0KXHRleHR7V2FsZCBDSX0gPSBcaGF0e2F9IFxwbSB6X3sxLVxhbHBoYS8yfSpzZSwgDQokJA0KDQp3aGVyZSAkXGhhdHthfSQgaXMgdGhlIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0ZSBmb3IgYSwgJHpfezEtXGFscGhhLzJ9JCBpcyB0aGUgY3JpdGljYWwgdmFsdWUgb2YgdGhlICQoMSAtIFxhbHBoYSkqMTAwJSQgY29uZmlkZW5jZSBsZXZlbCwgYW5kIHNlIGlzIHRoZSBzdGFuZGFyZCBlcnJvci4NCg0KQXNzdW1pbmcgd2UncmUgYnVpbGRpbmcgYSA5NSUgV2FsZCBDb25maWRlbmNlIEludGVydmFsLCB3aGljaCB3b3VsZCBtZWFuIHRoYXQgJFxhbHBoYSA9IDAuMDUkOg0KDQokJA0KOTVcJSBcdGV4dHsgQ0l9ID0gXGxlZnQoIFxoYXR7YX0gLSB6X3swLjk3NX0qc2UsIFxoYXR7YX0gKyAxLjk2KnNlIFxyaWdodCkNCiQkDQoNCldlIGFscmVhZHkgaGF2ZSB0aGUgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRlIGZyb20gcHJvYmxlbSBBNC4gQnV0IHdoYXQgaXMgdGhlIGNyaXRpY2FsIHogdmFsdWUgYW5kIHRoZSBzdGFuZGFyZCBlcnJvcj8gR2V0dGluZyB0aGUgY3JpdGljYWwgeiB2YWx1ZSBpcyBlYXN5OiB0aGF0IGNhbiBqdXN0IGJlIGxvb2tlZCB1cC4gVGhlIGNyaXRpY2FsIHogdmFsdWUgZm9yIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaXMgMS45Ni4gR2V0dGluZyB0aGUgc3RhbmRhcmQgZXJyb3IgaXMgYSBsaXR0bGUgbW9yZSBkaWZmaWN1bHQgYmVjYXVzZSB0aGF0IHJlcXVpcmVzIHNvbWUgbWF0aC4gDQoNClRvIGdldCB0aGUgc3RhbmRhcmQgZXJyb3IsIHdlIG5lZWQgdG8gZ28gYmFjayB0byB0aGUgbG9nIGxpa2VsaWhvb2QgZnVuY3Rpb24gb2YgYS4gV2Ugd2lsbCBmaXJzdCBvYnRhaW4gdGhlIHZhcmlhbmNlIG9mIGEgYnkgdGFraW5nIHRoZSBzZWNvbmQgZGVyaXZhdGl2ZSBvZiB0aGUgbG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24gKG9yIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBzY29yZSBmdW5jdGlvbiB3ZSBhbHJlYWR5IG9idGFpbmVkIGluIHByb2JsZW0gQTQpLiBSZWdhcmRsZXNzLCB3ZSBzaG91bGQgZ2V0Og0KJCQNClxmcmFje2ReMlxlbGx9e2RhXjJ9ID0gLVxmcmFje259e2FeMn0gDQokJA0KDQpGcm9tIGhlcmUsIHdlIGNhbiBjb21wdXRlIHRoZSBGaXNoZXIgaW5mb3JtYXRpb24sIHdoaWNoIGlzIGp1c3QgdGhlIG5lZ2F0aXZlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBzZWNvbmQgZGVyaXZhdGl2ZS4gU2luY2UgdGhlIHNlY29uZCBkZXJpdmF0aXZlIGlzIGp1c3QgYSBjb25zdGFudCwgdGhlIGV4cGVjdGVkIHZhbHVlIHdpbGwganVzdCBiZSB0aGF0IGRlcml2YXRpdmUuIE11bHRpcGx5IGl0IGJ5IC0xLCB3ZSBnZXQgdGhlIGZpc2hlciBpbmZvcm1hdGlvbi4NCg0KJCQNCkkoYSkgPSAtRVxsZWZ0KFxmcmFje2ReMiBcZWxsfXtkYV4yfVxyaWdodCkgPSBcZnJhY3tufXthXjJ9JA0KJCQNCg0KVG8gZ2V0IHRoZSB2YXJpYW5jZSwgd2UganVzdCB0YWtlIHRoZSByZWNpcHJvY2FsIG9mIHRoZSBmaXNoZXIgaW5mb3JtYXRpb24uIA0KJCQNClZhcihhKSA9IFxmcmFje2FeMn17bn0NCiQkDQoNClRvIGdldCB0aGUgc3RhbmRhcmQgZXJyb3IsIHdlIGp1c3QgdGFrZSB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHZhcmlhbmNlOg0KJCQNCntzZX0oYSkgPSBcZnJhY3thfXtcc3FydHtufX0NCiQkDQoNCkFuZCBub3cgd2UgY2FuIGJ1aWxkIHRoZSA5NSUgV2FsZCBDb25maWRlbmNlIEludGVydmFsOg0KJCQNCjk1XCUgXHRleHR7V2FsZCBDSX0gPSBcbGVmdCggXGhhdHthfSAtIDEuOTYgXGZyYWN7XGhhdHthfX17XHNxcnR7bn19LCBcaGF0e2F9ICsgMS45NiBcZnJhY3tcaGF0e2F9fXtcc3FydHtufX0gXHJpZ2h0KQ0KJCQNCg0KXA0KDQojIyMgKipQcm9ibGVtIEE2Kio6DQoNClVzaW5nIHRoZSBzYW1lIHNldHRpbmcgYXMgaW4gKipQcm9ibGVtIEE0KiosIHBlcmZvcm0gYSBsaWtlbGlob29kIHJhdGlvIHRlc3QgZm9yIHRoZSBoeXBvdGhlc2lzICRIXzAgOmE9MSQgKGkuZS4sIHRoZSBwb3dlciBkaXN0cmlidXRpb24gcmVkdWNlcyB0byBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uKS4gWypIaW50OiBFdmFsdWF0ZSB0aGUgbG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24gYXQgdGhlIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0ZSAkXGhhdHthfSQgYW5kIGF0ICRhPTEkLCB0aGVuIHVzZSB0aGVzZSB2YWx1ZXMgdG8gY29uc3RydWN0IHRoZSBMUlQgdGVzdCBzdGF0aXN0aWMuKl0NCg0KV2hlbiBkb2luZyBhIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCwgd2UgYXJlIGNvbXBhcmluZyB0aGUgZml0bmVzcyBvZiB0d28gbW9kZWxzOiBhIHNpbXBsZXIgcmVzdHJpY3RlZCBtb2RlbCwgb3IgYSBtb3JlIGNvbXBsZXggdW5yZXN0cmljdGVkIG1vZGVsLiBJbiB0aGlzIGNhc2UsIHdlIGFyZSBnb2luZyB0byB0ZXN0IHdoZXRoZXIgb3Igbm90IGEgcG93ZXIgZGlzdHJpYnV0aW9uIG9yIGFub3RoZXIgS3VtYXJhc3dhbXkgYmFzZWQgZGlzdHJpYnV0aW9uIHdpbGwgZml0IHRoZSBkYXRhIGJldHRlci4gSW4gb3RoZXIgd29yZHMsIGlzIHRoaXMgc2FtcGxlIG1vcmUgbGlrZWx5IHRvIGNvbWUgZnJvbSBhIHBvcHVsYXRpb24gdGhhdCBpcyBtb2RlbGVkIHdpdGggYSBwb3dlciBkaXN0cmlidXRpb24gb3IgYW5vdGhlciBLdW1hcmFzd2FteSBiYXNlZCBkaXN0cmlidXRpb24/IA0KDQokJA0KSF8wOiBhID0gMSAoUG93ZXIgRGlzdHJpYnV0aW9uKSANCkhfYTogYSBcbmVxIDEgKEt1bWFyYXN3YW15IERpc3RyaWJ1dGlvbikNCiQkDQoNCg0KVG8gY29uZHVjdCBvdXIgdGVzdCwgd2UgbmVlZCB0byBldmFsdXRlIHRoZSBsb2cgbGlrZWxpaG9vZCBvZiB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIGF0IHR3byBwb2ludHM6IHRoZSBmaXJzdCBpcyB3aGVuIGEgaXMgc2V0IHRvIDEsIHdoaWNoIGdpdmVzIHVzIG91ciByZXN0cmljdGVkIG1vZGVsIGFuZCB0aGUgc2Vjb25kIGlzIHdoZW4gYSBpcyBzZXQgdG8gdGhlIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0b3IsIHdoaWNoIGdpdmVzIHVzIG91ciB1bnJlc3RyaWN0ZWQgbW9kZWwuIA0KDQpUaGUgbnVsbCBoeXBvdGhlc2lzLCAkSF8wJDoNCiQkDQphID0gMSBcaW1wbGllcyBcZWxsKDEpID0gMA0KJCQNCg0KVGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMsICRIX2EkOiANCiQkDQphPVxoYXR7YX0gXGltcGxpZXMgXGVsbChcaGF0e2F9KSA9IG4gXGxuIFxoYXR7YX0gKyAoXGhhdHthfS0xKSBcc3VtX3tpPTF9Xm4gXGxuIHhfaQ0KJCQNCg0KVGhlIHRlc3Qgc3RhdGlzdGljIHdpbGwgYmU6DQokJA0KTFIgPSAyW1xlbGwoXGhhdHthfSkgLSBcZWxsKDEpXSA9IDIgXGxlZnRbIG4gXGxuIFxoYXR7YX0gKyAoXGhhdHthfS0xKSBcc3VtX3tpPTF9Xm4gXGxuIHhfaSBccmlnaHRdDQokJA0KDQpUaGVyZSBhcmUgc2V2ZXJhbCBpbXBvcnRhbnQgdGhpbmdzIHRvIG5vdGUgaGVyZTogVGhlIGZpcnN0IGlzIHRoYXQgdGhpcyB0ZXN0IHdpbGwgd29yayBiZXR0ZXIgaWYgdGhlIHNhbXBsZSBzaXplIGlzIGxhcmdlIGVub3VnaC4gVGhlIHNlY29uZCBpcyB0aGF0IGlmIHRoZSBzYW1wbGUgc2l6ZSBpcyBsYXJnZSBlbm91Z2gsIHRoZW4gdGhlIHRlc3Qgc3RhdGlzdGljIHdpbGwgYXN5bXB0b3RpY2FsbHkgZm9sbG93IGEgJFxjaGleMiQgZGlzdHJpYnV0aW9uIHdpdGggMSBkZWdyZWUgb2YgZnJlZWRvbS4gVGhlIHRoZSB0aGlyZCBpcyB0aGF0IHRoaXMgaXMgYSB0d28gdGFpbGVkIHRlc3QuIFdoaWNoIG1lYW5zIHRoYXQgdGhlcmUgYXJlIHR3byByZWplY3Rpb24gcmVnaW9uczogaWYgdGhlICRcY2hpXjIkIHN0YXRpc3RpYyB5b3Ugb2J0YWluIGlzIGxlc3MgdGhhbiB0aGUgY3JpdGljYWwgdmFsdWUgYXNzb2NpYXRlZCB3aXRoICRcZnJhY3tcYWxwaGF9ezJ9JCBvciBncmVhdGVyIHRoYW4gdGhlIGNyaXRpY2FsIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAkXHtmcmFjezEtXGFscGhhfXsyfSQuDQpJZiAkbiQgaXMgbGFyZ2UgZW5vdWdoICgkbiA+IDMwJCksIHRoZW4gJExSIFxzaW0gXGNoaV8xXjIkLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGxldmVsIG9mIHNpZ25pZmljYW5jZSBpcyAwLjA1LCB0aGVuIHlvdSdkIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGlmIHlvdXIgdGVzdCBzdGF0aXN0aWMgd2FzIGxlc3MgdGhhbiAwLjAwMDk4MiAoYW5kIHNvIG9uKSBvciBncmVhdGVyIHRoYW4gNS4wMjM4ODYuIEJ1dCBhdCBsZWFzdCB0aGUgcC12YWx1ZSBkb2Vzbid0IGNoYW5nZSBmb3IgcmVqZWN0aW9uOyB5b3UgcmVqZWN0IHRoZSBudWxsIGlmIHRoZSBwLXZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlLg0KDQpcDQoNCiMjIFBhcnQgQjogTnVtZXJpY2FsIEFuYWx5c2lzDQoNCioqQWxsIGNvZGUgbXVzdCBiZSB3ZWxsIGNvbW1lbnRlZCBhbmQgYWRoZXJlIHRvIGJlc3QgY29kaW5nIHByYWN0aWNlcyoqDQoNCioqV29ya2luZyBEYXRhc2V0Kio6IEEgc21hbGwgcmVzZXJ2b2lyIHN1cHBsaWVzIHdhdGVyIHRvIGEgdG93bi4gRHVyaW5nIHRoZSBkcnkgc2Vhc29uICg1MCBkYXlzKSwgZW5naW5lZXJzIHJlY29yZCB0aGUgZnJhY3Rpb24gb2YgdXNhYmxlIHN0b3JhZ2UgZmlsbGVkIGVhY2ggbW9ybmluZy4gVmFsdWVzIG5lYXIgMCBtZWFuIHRoZSByZXNlcnZvaXIgaXMgbmVhcmx5IGVtcHR5OyB2YWx1ZXMgbmVhciAxIG1lYW4gaXQncyBmdWxsLiBUaGUgZGlzdHJpYnV0aW9uIHRlbmRzIHRvIGJlIHJpZ2h04oCRc2tld2VkIChtb3N0bHkgbG93IGxldmVscyBkdWUgdG8gZHJvdWdodCkgYnV0IHdpdGggb2NjYXNpb25hbCByZXBsZW5pc2htZW50Lg0KDQpUaGUgZm9sbG93aW5nIDUwIGRhdGEgcG9pbnRzIChvcmRlcmVkIGZvciBjbGFyaXR5KSByZXByZXNlbnQgdGhlIGRhaWx5IHByb3BvcnRpb24gb2YgdXNhYmxlIHN0b3JhZ2U6DQoNCmBgYA0KMC4xMiwgMC4xNCwgMC4xNSwgMC4xNiwgMC4xNywgMC4xOCwgMC4xOSwgMC4yMCwgMC4yMSwgMC4yMiwNCjAuMjMsIDAuMjQsIDAuMjUsIDAuMjYsIDAuMjcsIDAuMjgsIDAuMjksIDAuMzAsIDAuMzEsIDAuMzIsDQowLjMzLCAwLjM0LCAwLjM1LCAwLjM2LCAwLjM3LCAwLjM4LCAwLjM5LCAwLjQwLCAwLjQxLCAwLjQyLA0KMC40MywgMC40NCwgMC40NSwgMC40NiwgMC40NywgMC40OCwgMC40OSwgMC41MCwgMC41MSwgMC41MiwNCjAuNTMsIDAuNTQsIDAuNTUsIDAuNTYsIDAuNTcsIDAuNTgsIDAuNTksIDAuNjAsIDAuNjEsIDAuNzgNCmBgYA0KDQpgYGB7cn0NCiMgUHV0dGluZyBEYXRhIEludG8gQW4gT2JqZWN0DQoNCndhdGVyIDwtIGMoMC4xMiwgMC4xNCwgMC4xNSwgMC4xNiwgMC4xNywgMC4xOCwgMC4xOSwgMC4yMCwgMC4yMSwgMC4yMiwNCjAuMjMsIDAuMjQsIDAuMjUsIDAuMjYsIDAuMjcsIDAuMjgsIDAuMjksIDAuMzAsIDAuMzEsIDAuMzIsDQowLjMzLCAwLjM0LCAwLjM1LCAwLjM2LCAwLjM3LCAwLjM4LCAwLjM5LCAwLjQwLCAwLjQxLCAwLjQyLA0KMC40MywgMC40NCwgMC40NSwgMC40NiwgMC40NywgMC40OCwgMC40OSwgMC41MCwgMC41MSwgMC41MiwNCjAuNTMsIDAuNTQsIDAuNTUsIDAuNTYsIDAuNTcsIDAuNTgsIDAuNTksIDAuNjAsIDAuNjEsIDAuNzgpDQpgYGANCg0KXA0KDQojIyMgKipQcm9ibGVtIEIxKio6DQoNCkZpdCB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIHRvIHRoZSBhYm92ZSBkYXRhLiBVc2UgdGhlIGRlcml2YXRpb25zIGluICoqUHJvYmxlbSBBMioqIHRvIGZpbmQgdGhlIE1MRSBvZiAkYSQgYW5kICRiJC4gUGxlYXNlIGNvcHkgdGhlIGtleSBmb3JtdWxhcyBiZWZvcmUgY29kaW5nLg0KDQpgYGB7cn0NCiMgTWFudWFsIE1MRSBpbXBsZW1lbnRhdGlvbiBmb3IgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uDQoNCiMgS3VtYXJhc3dhbXkgbG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24NCmt1bWEubG9nbGlrIDwtIGZ1bmN0aW9uKHBhcmFtcywgZGF0YSkgew0KICBzaGFwZTEgPC0gcGFyYW1zWzFdICAjIHBhc3NpbmcgdGhlIHBhcmFtZXRlcnMNCiAgc2hhcGUyIDwtIHBhcmFtc1syXQ0KDQpuIDwtIGxlbmd0aChkYXRhKSAgICMgc2FtcGxlIHNpemUNCiAgDQojIExvZy1saWtlbGlob29kIGZvciBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24NCmxvZ2xpayA8LSBuKmxvZyhzaGFwZTEpICsgbipsb2coc2hhcGUyKSArIChzaGFwZTEgLSAxKSpzdW0obG9nKGRhdGEpKSArIA0KICAgICAgICAgICAgKHNoYXBlMiAtIDEpKnN1bShsb2coMSAtIGRhdGFec2hhcGUxKSkgDQogIA0KICByZXR1cm4obG9nbGlrKSAgICAjIFJldHVybiBuZWdhdGl2ZSBmb3IgbWluaW1pemF0aW9uDQp9DQoNCg0KIyMgU2NvcmUgKGdyYWRpZW50KSBlcXVhdGlvbg0Ka3VtYS5zY29yZSA8LSBmdW5jdGlvbihwYXJhbXMsIGRhdGEpIHsNCiAgc2hhcGUxIDwtIHBhcmFtc1sxXQ0KICBzaGFwZTIgPC0gcGFyYW1zWzJdDQogIG4gPC0gbGVuZ3RoKGRhdGEpDQogIA0KIyBHcmFkaWVudCBmb3IgUGFyYW1ldGVyIGENCiAgZ3JhZF9zaGFwZTEgPC0gbi9zaGFwZTEgKyBzdW0obG9nKGRhdGEpKSAtDQogICAgICAgICAgICAgICAgKHNoYXBlMiAtIDEpKnN1bSgobG9nKGRhdGEpKmRhdGFec2hhcGUxKS8oMS1kYXRhXnNoYXBlMSkpDQogIA0KIyBHcmFkaWVudCBmb3IgUGFyYW1ldGVyIGINCiAgZ3JhZF9zaGFwZTIgPC0gKG4vc2hhcGUyKSArIHN1bShsb2coMS1kYXRhXnNoYXBlMSkpDQogICAgICAgICAgICAgICAgDQogIA0KICByZXR1cm4oYyhncmFkX3NoYXBlMSwgZ3JhZF9zaGFwZTIpKQ0KfQ0KDQoNCiMgTmVlZCB0byBwcm92aWRlIGluaXRpYWwgdmFsdWVzIGZvciBwYXJhbWV0ZXJzDQppbml0aWFsLnBhcmFtcyA8LSBjKHNoYXBlMSA9IDIuMiwgc2hhcGUyID0gMS41KSAgIyBSZWFzb25hYmxlIHN0YXJ0aW5nIHZhbHVlcw0KDQojIFVzaW5nIG9wdGltIHdpdGggTmVsZGVyLU1lYWQgbWV0aG9kDQptbGUucmVzdWx0Lmt1bWEgPC0gb3B0aW0oDQogIHBhciA9IGluaXRpYWwucGFyYW1zLA0KICBmbiA9IGt1bWEubG9nbGlrLA0KICBnciA9IGt1bWEuc2NvcmUsDQogIGRhdGEgPSB3YXRlciwNCiAgbWV0aG9kID0gIkwtQkZHUy1CIiwNCiAgaGVzc2lhbiA9IFRSVUUsDQogIGNvbnRyb2wgPSBsaXN0KHRyYWNlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgIGZuc2NhbGUgPSAtMSwNCiAgICAgICAgICAgICAgICAgbWF4aXQgPSA1MDAsDQogICAgICAgICAgICAgICAgIGFic3RvbCA9IDFlLTgpDQopDQojIw0KbWxlLnJlc3VsdC5rdW1hJHBhcg0KYGBgDQoNCkFjY29yZGluZyB0byB0aGUgb3V0cHV0LCB0aGUgZmlyc3Qgc2hhcGUgcGFyYW1ldGVyLCBhLCBpcyBlcXVhbCB0bw0KMi41Mjk2MDIsIGFuZCB0aGUgc2Vjb25kIHNoYXBlIHBhcmFtZXRlciwgYiwgaXMgZXF1YWwgdG8gNy44ODMzODYuDQoNCkZvciBmdXR1cmUgdXNlLCB0aGUgZXN0aW1hdGVzIHdpbGwgYmUgZXh0cmFjdGVkIGFuZCBwdXQgaW50byBvYmplY3RzLg0KDQpgYGB7cn0NCiMgRXh0cmFjdGluZyB0aGUgUGFyYW1ldGVyIEVzdGltYXRlcyBmb3IgRnV0dXJlIFVzZQ0KDQpzaGFwZTEuZXN0IDwtIG1sZS5yZXN1bHQua3VtYSRwYXJbMV0NCnNoYXBlMi5lc3QgPC0gbWxlLnJlc3VsdC5rdW1hJHBhclsyXQ0Ka3VtYS5lc3QgPC0gYyhzaGFwZTEuZXN0LCBzaGFwZTIuZXN0KQ0Ka3VtYS5lc3QNCmBgYA0KDQpcDQoNCiMjIyAqKlByb2JsZW0gQjIqKjoNCg0KRml0IHRoZSAqKnBvd2VyIGRpc3RyaWJ1dGlvbioqIHRvIHRoZSBhYm92ZSBkYXRhIHVzaW5nIHRoZSBkZXJpdmVkICBvZiAkYSQgb2J0YWluZWQgaW4gKipQcm9ibGVtIEE0KiogdG8gdGVzdCB0aGUgZm9sbG93aW5nIGh5cG90aGVzaXMgdXNpbmcgbGlrZWxpaG9vZCByYXRpbyBwcm9jZWR1cmUgYXIgc2lnbmlmaWNhbmNlIGxldmVsICRcYWxwaGEgPSAwLjA1JDoNCg0KJCQNCkhfMDogYiA9IDEgXHF1YWQgXHRleHR7IHZlcnN1cyB9IFxxdWFkIEhfYTogYiBcbmUgMS4NCiQkDQoNClN0YXRlIHRoZSBzdGF0aXN0aWNhbCBkZWNpc2lvbiBjbGVhcmx5LiBXaGF0IGlzIHRoZSBwcmFjdGljYWwgaW1wbGljYXRpb24gb2YgdGhlIHRlc3RpbmcgcmVzdWx0Pw0KDQpUaGUgaHlwb3RoZXNlcyBvZiBvdXIgdGVzdCBhcmUgYXMgZm9sbG93czoNCiQkIA0KSF8wOiBiID0gMSAoS3VtYXJhc3dhbXkgYmVjb21lcyBhIFBvd2VyIERpc3RyaWJ1dGlvbikgLw0KSF9hOiBiIFxuZXEgMSAoRGF0YSBmb2xsb3dzIGFub3RoZXIgS3VtYXJhc3dhbXkgRGlzdHJpYnV0aW9uKQ0KJCQNCg0KVGhlIGZvbGxvd2luZyBjb2RlIGNodW5rIGlzIGZvciB0aGUgbGlrZWxpaG9vZCByYXRpbyB0ZXN0Og0KDQpgYGB7cn0NCiMgTGlrZWxpaG9vZCBSYXRpbyBUZXN0IEZvciBQb3dlciB2cyBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24NCg0KIyBNTEUgT2YgUG93ZXIgRGlzdHJpYnV0aW9uIFBhcmFtZXRlciBmcm9tIFBhcnQgQTQNCm4gPC0gbGVuZ3RoKHdhdGVyKQ0Kc2hhcGUzLm1sZSA8LSAtbiAvIHN1bShsb2cod2F0ZXIpKQ0KDQojIEt1bWFyYXN3YW15IExvZy1MaWtlbGlob29kIEZ1bmN0aW9uDQpsb2dsaWtlLmt1bWEgPC0gZnVuY3Rpb24oZGF0YSwgYSwgYikgew0KICBuIDwtIGxlbmd0aChkYXRhKQ0KIG4qbG9nKGEpICsgbipsb2coYikgKyAoYSAtIDEpKnN1bShsb2coZGF0YSkpICsgDQogICAgICAgICAgICAoYiAtIDEpKnN1bShsb2coMSAtIGRhdGFeYSkpIA0KfQ0KDQojIFBvd2VyIExvZy1MaWtlbGlob29kIEZ1bmN0aW9uDQpsb2dsaWtlLnBvd2VyIDwtIGZ1bmN0aW9uKGRhdGEsIGEpIHsgDQogIG4gPC0gbGVuZ3RoKGRhdGEpDQogIG4qbG9nKGEpICsgKGEgLSAxKSpzdW0obG9nKGRhdGEpKQ0KfQ0KDQojIFVucmVzdHJpY3RlZCBhbmQgUmVzdHJpY3RlZCBNTEVzIGZvciBMUiBUZXN0DQpsb2dsaWtlLmFsdDEgPC0gbG9nbGlrZS5rdW1hKHdhdGVyLCBzaGFwZTEuZXN0LCBzaGFwZTIuZXN0KQ0KbG9nbGlrZS5udWxsMSA8LSBsb2dsaWtlLnBvd2VyKHdhdGVyLCBzaGFwZTMubWxlKQ0KDQojIExpa2VsaWhvb2QgcmF0aW8gdGVzdCBzdGF0aXN0aWMNCkxSMSA8LSAyKihsb2dsaWtlLmFsdDEgLSBsb2dsaWtlLm51bGwxKQ0KDQojIHAtdmFsdWUgZnJvbSBjaGktc3F1YXJlKDEpDQpwdmFsdWUuTFIxIDwtIDEgLSBwY2hpc3EoTFIxLCBkZiA9IDEpDQoNCiMgVGVzdCBTdGF0aXN0aWMgYW5kIFAtdmFsdWUNCkxSMQ0KcHZhbHVlLkxSMQ0KYGBgDQpBY2NvcmRpbmcgdG8gdGhlIG91dHB1dCwgdGhlIHRlc3Qgc3RhdGlzdGljIGlzICRcY2hpXjIgPSA0OC45MjUzMyQsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBwLXZhbHVlIGlzICQyLjY1eDEwXi0xMiQuIFNpbmNlIHRoZSBwLXZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlLCB3ZSBjYW4gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgYW5kIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgc3VmZmljaWVudCBldmlkZW5jZSB0byBjb25jbHVkZSB0aGF0IHRoaXMgZGF0YSBjb21lcyBmcm9tIGFub3RoZXIgS3VtYXJhc3dhbXkgYmFzZWQgZGlzdHJpYnV0aW9uLiBUbyBwdXQgaXQgaW4gcHJhY3RpY2FsIHRlcm1zLCB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIGlzIG5vdCBhIGdvb2QgZml0IGZvciB0aGlzIGRhdGEsIG1lYW5pbmcgdGhpcyBzYW1wbGUgaXMgdW5saWtlbHkgdG8gY29tZSBmcm9tIGEgcG9wdWxhdGlvbiBtb2RlbGVkIGJ5IGEgcG93ZXIgZGlzdHJpYnV0aW9uLiBUaGlzIHNhbXBsZSBtb3JlIHRoYW4gbGlrZWx5IGNvbWVzIGZyb20gYSBkaWZmZXJlbnQgS3VtYXJhc3dhbXkgYmFzZWQgZGlzdHJpYnV0aW9uLg0KDQpcDQoNCiMjIyAqKlByb2JsZW0gQjMqKjoNCg0KVXNlIHRoZSBwcm9jZWR1cmUgYW5kIGNvZGUgZnJvbSAqKlByb2JsZW0gQjEqKiB0byBlc3RpbWF0ZSB0aGUgTUxFcyBvZiAkYSQgYW5kICRiJCwgYW5kIHRoZW4gY29tcGxldGUgdGhlIGZvbGxvd2luZyBhbmFseXNlczoNCg0KKDEpLiBPYnRhaW4gdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb25zIG9mICRcaGF0e2F9JCBhbmQgJFxoYXR7Yn0kIGFuZCBwbG90IGVhY2ggZGlzdHJpYnV0aW9uIHVzaW5nICoqR2F1c3NpYW4ga2VybmVsIGRlbnNpdHkgY3VydmVzKiouDQoNCkZpcnN0LCBsZXQncyBnZXQgb3VyIGJvb3RzdHJhcCBzYW1wbGVzOg0KYGBge3J9DQojIEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb25zIG9mIEt1bWFyYXN3YW15IE1MRXMNCg0KIyBTZXQgU2VlZCB0byBLZWVwIFNhbWUgU2FtcGxlDQpzZXQuc2VlZCgxKQ0KDQojIENob29zZSBOdW1iZXIgb2YgQm9vdHN0cmFwIFNhbXBsZXMgDQpCIDwtIDUwMDANCg0KIyBTdG9yZSBib290c3RyYXAgZXN0aW1hdGVzDQpib290LmEgPC0gTlVMTA0KYm9vdC5iIDwtIE5VTEwNCg0KZm9yKGkgaW4gMTpCKSB7DQogIA0KICAjIEJvb3RzdHJhcCBzYW1wbGUNCiAgYm9vdHN0cmFwLnNhbXBsZSA8LSBzYW1wbGUod2F0ZXIsIHNpemUgPSBuLCByZXBsYWNlID0gVFJVRSkNCiAgDQogICMgUmVmaXQgS3VtYXJhc3dhbXkgbW9kZWwgdG8gYm9vdHN0cmFwIHNhbXBsZQ0KICBib290LmZpdCA8LSBvcHRpbSgNCiAgICBwYXIgPSBjKHNoYXBlMS5lc3QsIHNoYXBlMi5lc3QpLA0KICAgIGZuID0ga3VtYS5sb2dsaWssDQogICAgZ3IgPSBrdW1hLnNjb3JlLA0KICAgIGRhdGEgPSBib290c3RyYXAuc2FtcGxlLA0KICAgIG1ldGhvZCA9ICJMLUJGR1MtQiIsDQogICAgbG93ZXIgPSBjKDFlLTgsIDFlLTgpLA0KICAgIGNvbnRyb2wgPSBsaXN0KA0KICAgICAgbWF4aXQgPSAxMDAwLA0KICAgICAgZm5zY2FsZSA9IC0xLA0KICAgICAgdHJhY2UgPSBGQUxTRSwNCiAgICAgIGFic3RvbCA9IDFlLTgNCiAgICApDQogICkNCiAgDQogICMgU2F2ZSBib290c3RyYXAgZXN0aW1hdGVzDQogIGJvb3QuYVtpXSA8LSBib290LmZpdCRwYXJbMV0NCiAgYm9vdC5iW2ldIDwtIGJvb3QuZml0JHBhclsyXQ0KfQ0KYGBgDQoNCkxldCdzIHBsb3QgYm90aCBvZiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBmb3IgdGhlIGVzdGltYXRlcyBvZiBhDQpgYGB7cn0NCiMgUGxvdCBib290c3RyYXAgZGlzdHJpYnV0aW9uIG9mIGFfaGF0DQpoaXN0KGJvb3QuYSwNCiAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICBicmVha3MgPSAyMCwgDQogICAgIGNvbCA9ICJsaWdodGJsdWUiLA0KICAgICBtYWluID0gIkJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb24gZm9yIFBhcmFtZXRlciBhIiwNCiAgICAgeGxhYiA9IGV4cHJlc3Npb24ocGFzdGUoIkVzdGltYXRlcyBmb3IgIiwgaGF0KGEpKSkpDQpsaW5lcyhkZW5zaXR5KGJvb3QuYSksIGNvbCA9ICJyZWQiLCBsd2QgPSAyKQ0KDQojIFBsb3QgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiBvZiBiX2hhdA0KaGlzdChib290LmIsDQogICAgIHByb2JhYmlsaXR5ID0gVFJVRSwNCiAgICAgYnJlYWtzID0gMjAsIA0KICAgICBjb2wgPSAibGlnaHRibHVlIiwNCiAgICAgbWFpbiA9ICJCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIGZvciBQYXJhbWV0ZXIgYiIsDQogICAgIHhsYWIgPSBleHByZXNzaW9uKHBhc3RlKCJFc3RpbWF0ZXMgZm9yICIsIChoYXQoYikpKSkpDQogICAgIGxpbmVzKGRlbnNpdHkoYm9vdC5iKSwgY29sID0gInJlZCIsIGx3ZCA9IDIpDQpgYGANClRoZSBwbG90IGZvciAkXGhhdHthfSQgYXBwZWFycyB0byByb3VnaGx5IHJlc2VtYmxlIGEgbm9ybWFsIGN1cnZlLiBUaGUga2VybmVsIGRlbnNpdHkgY3VydmUgYWxzbyBkb2VzIGZpdCByZWxhdGl2ZWx5IHdlbGwuIEFzIGZvciB0aGUgcGxvdCBmb3IgJFxoYXR7Yn0kLCBpdCBkb2VzIG5vdCByZXNlbWJsZSBhIG5vcm1hbCBjdXJ2ZS4gVGhlcmUgaXMgc29tZSB2ZXJ5IG9idmlvdXMgc2tldy4NCg0KSWYgd2UgdGFrZSBhIGxvb2sgYXQgYSBzdW1tYXJ5IG9mIHRoZSBkaXN0cmlidXRpb25zLCB3ZSBjYW4gY2xlYXJseSBzZWUgdGhhdCB0aGVyZSBpcyBub3QgdG9vIG11Y2ggc3ByZWFkIGZvciB0aGUgZGlzdHJpYnV0aW9uIG9mICRcaGF0e2F9JC4gQW5kIHRoZSBtZWFuIGlzIHJlbGF0aXZlbHkgY2xvc2UgdG8gdGhlIG1lZGlhbi4gQnV0IHRoZXJlIGlzIG11Y2ggbW9yZSBzcHJlYWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgJFxoYXR7Yn0kLCBhbmQgbWVhbiBpcyBmYXJ0aGVyIGZyb20gdGhlIG1lZGlhbi4NCmBgYHtyfQ0Kc3VtbWFyeShib290LmEpDQpzdW1tYXJ5KGJvb3QuYikNCmBgYA0KDQoNCigyKS4gIENvbnN0cnVjdCBib3RoIHRoZSAkOTVcJSQgKipib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCoqIGFuZCB0aGUgKipXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwqKiBmb3IgJGIkLiBEbyB0aGVzZSBpbnRlcnZhbHMgYWdyZWUgd2l0aCB0aGUgcmVzdWx0cyBvYnRhaW5lZCBpbiAqKlByb2JsZW0gQjIqKj8gWypDb21wdXRlIHRoZSBzdGFuZGFyZCBlcnJvciBvZiAkXGhhdHtifSQgdXNpbmcgdGhlIG9ic2VydmVkIEZpc2hlciBpbmZvcm1hdGlvbiBtYXRyaXgsIGkuZS4sIHRoZSBpbnZlcnNlIG9mIHRoZSBuZWdhdGl2ZSBIZXNzaWFuIG9idGFpbmVkIGZyb20gb3B0aW0oKSpdDQoNCmBgYHtyfQ0KIyBGaW5kIEJvb3RzdHJhcCBhbmQgV2FsZCBDb25maWRlbmNlIEludGVydmFscyBmb3IgYg0KDQojIDk1JSBQZXJjZW50aWxlIEJvb3RzdHJhcCBDb25maWRlbmNlIEludGVydmFsIA0KYm9vdGNpLnBlcmMuYiA8LSBxdWFudGlsZShib290LmIsIHByb2JzID0gYygwLjAyNSwgMC45NzUpKQ0KDQojIFBpZWNlcyB0byBCdWlsZCA5NSUgV2FsZCBDb25maWRlbmNlIEludGVydmFsDQpoZXNzaWFuIDwtIG1sZS5yZXN1bHQua3VtYSRoZXNzaWFuDQpmaXNoZXIgPC0gc29sdmUoLWhlc3NpYW4pDQpzZS5iLmVzdCA8LSBzcXJ0KGZpc2hlclsyLCAyXSkNCnogPC0gcW5vcm0oMC45NzUpDQplcnJvciA8LSB6KnNlLmIuZXN0DQoNCiMgQnVpbGQgV2FsZCBDb25maWRlbmNlIEludGVydmFsDQp3YWxkY2kuYiA8LSBjKHNoYXBlMi5lc3QgLSBlcnJvciwgc2hhcGUyLmVzdCArIGVycm9yKQ0KDQoNCmJvb3RjaS5wZXJjLmINCndhbGRjaS5iDQpgYGANClRoZSA5NSUgQm9vdHN0cmFwIENvbmZpZGVuY2UgSW50ZXJ2YWwgaXMgKDUuMDA2NiwgMTYuMTg4OSksIGFuZCB0aGUgOTUlIFdhbGQgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyAoMywuNDg0LCAxMi4yODI3KS4gTmVpdGhlciBjb25maWRlbmNlIGludGVydmFsIGNvbnRhaW5zIDEsIHdoaWNoIHN1Z2dlc3RzIHRoYXQgdGhlIHJlc3VsdHMgYWdyZWUgd2l0aCB3aGF0IHdlIGdvdCBpbiBQYXJ0IEIyLiANCg0KDQooMykuIEJhc2VkIG9uIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBmcm9tIHBhcnQgKDEpIG9mIHRoaXMgcHJvYmxlbSwgYXNzZXNzIHdoZXRoZXIgdGhlIHZhbGlkaXR5IG9mIHRoZSBXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaXMgc3VwcG9ydGVkLg0KDQpTaW5jZSB0aGUgd2FsZCBjb25maWRlbmNlIGludGVydmFsIGlzIGJhc2VkIG9uIGFzeW1wdG90aWMgbm9ybWFsaXR5LCB0aGUgZGlzdHJpYnV0aW9uIHNob3VsZCByZXNlbWJsZSBhIG5vcm1hbCBkaXN0cmlidXRpb24uIEhvd2V2ZXIsIGl0IGRpZCBub3QuIFRoZXJlIHdhcyBjb25zaWRlcmFibGUgc2tldywgYW5kIHRoZSBzdW1tYXJ5IHBvaW50ZWQgb3V0IHRoYXQgdGhlcmUgaXMgY29uc2lkZXJhYmxlIHNwcmVhZCBpbiB0aGUgZGlzdHJpYnV0aW9uLiBCYXNlZCBvbiB0aGlzIGNyaXRlcmlhLCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCB0aGUgV2FsZCBjb25maWRlbmNlIGludGVydmFsIGlzIG5vdCBhIGdvb2QgY29uZmlkZW5jZSBpbnRlcnZhbCB0byB1c2UgaW4gdGhpcyBjYXNlLg0KDQpcDQoNCiMjIyAqKlByb2JsZW0gQjQqKjoNCg0KSW4gdGhlIGludHJvZHVjdGlvbiB0byB0aGUgd29ya2luZyBtb2RlbCBmb3IgdGhpcyBleGFtLCB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIHJlZHVjZXMgdG8gdGhlIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9uICgwLDEpLiBJbiB0aGlzIHByb2JsZW0sIHdlIHBlcmZvcm0gYSAqKmxpa2VsaWhvb2QgcmF0aW8gdGVzdCoqIGZvciB0aGUgZm9sbG93aW5nIGh5cG90aGVzaXMgdG8gYXNzZXNzIHdoZXRoZXIgdGhlIGRhdGEgY29tZSBmcm9tIHRoZSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvbiAoMCwxKToNCg0KJCQNCkhfMDogYSA9IDFccXVhZCBcJiBccXVhZCBiID0gMVxxdWFkIFx0ZXh0eyB2ZXJzdXMgfSBccXVhZCBIX2E6IGEgXG5lIDEgXHF1YWQgXHRleHR7b3J9IFxxdWFkIGIgXG5lIDEgXHF1YWQgXHRleHR7b3J9XHF1YWQgKGEgXG5lIDEgXHF1YWQgXCYgXHF1YWQgYiBcbmUgMSkuDQokJA0KDQpQcm92aWRlIGEgcHJhY3RpY2FsIGludGVycHJldGF0aW9uIG9mIHRoZSBhYm92ZSB0ZXN0IHJlc3VsdC4gWypIaW50OiAkSF9hJCBiYXNpY2FsbHkgc2F5cyB0aGF0IHRoZXJlIGlzIG5vIGNvbnN0cmFpbnRzIGZvciAkYSQgYW5kICRiJC4gUGxlYXNlIHJldmlldyB0aGUgbGVjdHVyZSBub3RlIGZvciBtb2R1bGUgMTEgIG9uIHRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3QgYmVmb3JlIGNvZGluZy4qXQ0KDQpgYGB7cn0NCiMgTGlrZWxpaG9vZCBSYXRpbyB0ZXN0IGZvciBVbmlmb3JtIHZzIEt1bWFyYXN3YW15IERpc3RyaWJ1dGlvbg0KDQojIFVzaW5nIEt1bWFyYXN3YW15IExpa2VsaWhvb2QgRnJvbSBQYXJ0IEIyIA0KbG9nbGlrZS5hbHQyIDwtIGxvZ2xpa2Uua3VtYSh3YXRlciwgc2hhcGUxLmVzdCwgc2hhcGUyLmVzdCkNCmxvZ2xpa2UubnVsbDIgPC0gbG9nbGlrZS5rdW1hKHdhdGVyLCAxLCAxKQ0KDQojIExpa2VsaWhvb2QgcmF0aW8gdGVzdCBzdGF0aXN0aWMNCkxSMiA8LSAyKihsb2dsaWtlLmFsdDIgLSBsb2dsaWtlLm51bGwyKQ0KDQojIHAtdmFsdWUgZnJvbSBDaGktU3F1YXJlKDEpDQpwdmFsdWUuTFIyIDwtIDEgLSBwY2hpc3EoTFIyLCBkZiA9IDEpDQoNCiMgVGVzdCBTdGF0aXN0aWMgYW5kIFAtdmFsdWUNCkxSMg0KcHZhbHVlLkxSMg0KYGBgDQpUaGUgdGVzdCBzdGF0aXN0aWMgaXMgJFxjaGleMiA9IDQ5LjEyNTQyJCwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHAtdmFsdWUgaXMgJDIuNHgxMF57LTEyfSQuIFNpbmNlIHRoZSBwLXZhbHVlIGlzIHNtYWxsZXIgdGhhbiAwLjA1LCB0aGVuIHdlIGNhbiByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcywgYW5kIGNhbiBjb25jbHVkZSB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gY29uY2x1ZGUgdGhhdCB0aGlzIGRhdGEgY29tZXMgZnJvbSBhbm90aGVyIEt1bWFyYXN3YW15IGJhc2VkIGRpc3RyaWJ1dGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoaXMgc2FtcGxlIGlzIHVubGlrZWx5IHRvIGhhdmUgb3JpZ2luYXRlZCBmcm9tIGEgcG9wdWxhdGlvbiBtb2RlbGVkIGJ5IGEgdW5pZm9ybSBkaXN0cmlidXRpb24uIFRvIHB1dCBpbnRvIHByYWN0aWNhbCB0ZXJtcywgdGhlIG1lYXN1cmVtZW50cyBhcmUgYWxsIG5vdCBlcXVhbGx5IGxpa2VseSB0byBvY2N1ci4NCg0KDQoNCg==