1 Introduction

For this assignment, we will be estimating the scale parameter of the Lindley distribution, \(\theta\), by using confidence intervals. Specifically, we will build a 95% asymptotic confidence interval and a 95% likelihood ratio confidence interval to estimate \(\theta\).

In order to build the confidence intervals, we will be using a data set consisting of customer service call times (in minutes) from a major telecommunications provider in North America.

calls <- c(3.2, 5.8, 7.1, 4.5, 10.3, 6.2, 8.7, 5.1, 12.5, 6.9,
9.4, 5.7, 11.8, 4.9, 9.1, 6.5, 13.2, 7.8, 10.6, 6.1,
8.9, 5.4, 12.1, 7.3, 9.8, 5.9, 11.4, 6.8, 10.9, 7.5,
4.2, 8.3, 6.4, 14.1, 5.6, 9.7, 7.9, 11.1, 6.7, 10.2,
5.3, 8.6, 7.2, 12.9, 6.3, 9.3, 8.1, 13.7, 7.6, 10.8)

2 Asymptotic Confidence Interval

We will first build the asymptotic confidence interval. In order to build an asymptotic confidence interval, we will need to check if we can use the central limit theorem. According to the central limit theorem, the distribution of a sample mean will approach a normal distribution as the sample size increases, regardless of what the initial distribution looked like. In particular, the central limit theorem can be used if the sample size is greater than or equal to 30.

n <- length(calls) # Sample Size
print(paste("Sample Size:", n))
[1] "Sample Size: 50"

As we can see, our data set has 50 observations, so the central limit can apply. So we can approximate \(\theta\) and construct our asymptotic confidence interval using the normal distribution.

To start, we can find a point estimate for \(\theta\) using the maximum likelihood method. The maximum likelhood estimator for the lindley distribution is:

\[ \hat{\theta} = \frac{1 - \bar{x} + \sqrt{\bar{x}^2 + 6\bar{x} + 1}}{2\bar{x}} \]

Using this formula, we obtain a maximum likelihood estimate of 0.2191.

mean.calls <- mean(calls) # Sample Mean

theta.mle <- (1 - mean.calls + sqrt((mean.calls^2) + 6*mean.calls + 1))/(2*mean.calls) # Maximum Likelihood Estimate for Theta
theta.mle
[1] 0.2190994

Next, we need the margin of error. The margin of error consists of two parts: a critical value and the standard error. The critical value can be obtained via the qnorm function.

# Calculating critical value using alpha = 0.05/2 due to symmetry
critvalue.95 <- qnorm(1 - 0.05/2, mean = 0, sd = 1, lower.tail = TRUE) 
critvalue.95
[1] 1.959964

The standard error in this case will be the sqrt of the inverse of the fisher information. The fisher information of the lindley distribution is: \[ I(\theta) = \frac{2}{\theta^2} - \frac{1}{(1+\theta)^2} \]

Using this formula, we obtain a fisher information of 7.4884.

# Formula for Fisher Information of Lindley Distribution
fish.info <- (2/(theta.mle^2)) - (1/(1 + (theta.mle^2)))

fish.info
[1] 40.70853

Finally, multiplying the critical value and the standard error will give us the margin of error.

var.mle <- 1/n*fish.info

se.mle <- sqrt(var.mle)
se.mle
[1] 0.9023141
moe <- critvalue.95*se.mle
moe
[1] 1.768503
ci.lowlim.asymp <- theta.mle - moe # Lower Limit of Confidence Interval
ci.uplim.asymp <- theta.mle + moe # Upper Limit of Confidence Interval
con.int.asymp = c(ci.lowlim.asymp, ci.uplim.asymp) # Combined Confidence Interval
con.int.asymp
[1] -1.549404  1.987602

3 Likelihood Ratio Confidence Interval

Next, we will build the likelihood ratio confidence interval. The likelihood ratio confidence interval are more versatile and more accurate ways of constructing confidence intervals, especially if the sample size is not sufficiently large.

Our likelihood confidence interval is the range of values that satisfies Wilks’ theorem.

Wilks’ Theorem: Assume that \(\theta\) is the true unknown population parameter If sample size \(n\) is large, we have

\[ LR(\theta)=-2\log\Lambda(\theta) = 2\left[ \log L(\hat{\theta}_{MLE}; x) -\log L(\theta; x)\right]\xrightarrow{d} \chi^2_1 \]

For simplicity of calculations, instead of using the standard likelihood function, we will use the log-likelihood function.

\[ L(\theta) = \prod_{i=1}^n f(x_i;\theta) = \prod_{i=1}^n \left[ \frac{\theta^2}{1+\theta} (1 + x_i) e^{-\theta x_i} \right]. \]

Let \(S = \sum_{i=1}^n x_i\), \(\bar{x} = S/n\), and \(C = \sum_{i=1}^n \ln(1 + x_i)\) (constant with respect to \(\theta\)):

\[ \ell(\theta) = \ln L(\theta) = n \ln\left( \frac{\theta^2}{1+\theta} \right) + C - \theta S. \]

To start, we need a point estimate for theta. Since this is a likelihood ratio confidence interval, we will need the maximum likelihood estimator. We already established when constructing the asymptotic interval that our mle is \(\hat{theta}\) = 0.2191.

theta.mle # Our Maximum Likelihood Estimate from Before
[1] 0.2190994

Next, we can obtain our critical value via the qchisq() function.

# Critical Chi-Square Value for Confidence Interval
crit.chisqr <- qchisq(0.95, df = 1, lower.tail = TRUE) 
crit.chisqr
[1] 3.841459

Next we can obtain our maximum log-likelihood estimate:

# Defining Log-Likelihood Function
log.lik <- function(theta, data){
n = length(data)
c = sum(log(1 + data))
s = sum(data)
  
  return(n*log(theta^2/(1+theta)) + c - (theta * s)) 
  # Returns log likelihood estimate
}

log.mle <- log.lik(theta.mle, calls) # function evaulated at MLE
log.mle
[1] -143.3101

We can now utitlize Wilks’ Theorem to find our bounds for our confidence interval:

# Utilizing Wilks' Theorem
Wilks <-  function(theta, data){
  2*(log.mle - log.lik(theta, data))
}

roots <- function(theta, data, theta.mle){
  log.mle - crit.chisqr
}
LS0tDQp0aXRsZTogIlNUQSA1MDYgSG9tZXdvcmsgNjogQ29uY2VwdHMgYW5kIENvbnN0cnVjdGlvbiBvZiBDb25maWRlbmNlIEludGVydmFscyINCmF1dGhvcjogIklhbiBWYW5XcmlnaHQiDQpkYXRlOiAiMDMvMjMvMjAyNiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQogICAgdGhlbWU6IHNwYWNlbGFiDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQoNCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgbGlicmFyeShwbG90bHkpDQp9DQppZiAoIXJlcXVpcmUoImZpdGRpc3RycGx1cyIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImZpdGRpc3RycGx1cyIpDQogIGxpYnJhcnkoZml0ZGlzdHJwbHVzKQ0KfQ0KIyMgDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkENCiAgICAgICAgICAgICAgICAgICAgICApICANCmBgYA0KDQpcDQoNCiMgSW50cm9kdWN0aW9uDQpGb3IgdGhpcyBhc3NpZ25tZW50LCB3ZSB3aWxsIGJlIGVzdGltYXRpbmcgdGhlIHNjYWxlIHBhcmFtZXRlciBvZiB0aGUgTGluZGxleSBkaXN0cmlidXRpb24sICRcdGhldGEkLCBieSB1c2luZyBjb25maWRlbmNlIGludGVydmFscy4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGJ1aWxkIGEgOTUlIGFzeW1wdG90aWMgY29uZmlkZW5jZSBpbnRlcnZhbCBhbmQgYSA5NSUgbGlrZWxpaG9vZCByYXRpbyBjb25maWRlbmNlIGludGVydmFsIHRvIGVzdGltYXRlICRcdGhldGEkLg0KDQpJbiBvcmRlciB0byBidWlsZCB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMsIHdlIHdpbGwgYmUgdXNpbmcgYSBkYXRhIHNldCBjb25zaXN0aW5nIG9mIGN1c3RvbWVyIHNlcnZpY2UgY2FsbCB0aW1lcyAoaW4gbWludXRlcykgZnJvbSBhIG1ham9yIHRlbGVjb21tdW5pY2F0aW9ucyBwcm92aWRlciBpbiBOb3J0aCBBbWVyaWNhLg0KDQpgYGB7cn0NCmNhbGxzIDwtIGMoMy4yLCA1LjgsIDcuMSwgNC41LCAxMC4zLCA2LjIsIDguNywgNS4xLCAxMi41LCA2LjksDQo5LjQsIDUuNywgMTEuOCwgNC45LCA5LjEsIDYuNSwgMTMuMiwgNy44LCAxMC42LCA2LjEsDQo4LjksIDUuNCwgMTIuMSwgNy4zLCA5LjgsIDUuOSwgMTEuNCwgNi44LCAxMC45LCA3LjUsDQo0LjIsIDguMywgNi40LCAxNC4xLCA1LjYsIDkuNywgNy45LCAxMS4xLCA2LjcsIDEwLjIsDQo1LjMsIDguNiwgNy4yLCAxMi45LCA2LjMsIDkuMywgOC4xLCAxMy43LCA3LjYsIDEwLjgpDQpgYGANCg0KIyBBc3ltcHRvdGljIENvbmZpZGVuY2UgSW50ZXJ2YWwNCldlIHdpbGwgZmlyc3QgYnVpbGQgdGhlIGFzeW1wdG90aWMgY29uZmlkZW5jZSBpbnRlcnZhbC4gSW4gb3JkZXIgdG8gYnVpbGQgYW4gYXN5bXB0b3RpYyBjb25maWRlbmNlIGludGVydmFsLCB3ZSB3aWxsIG5lZWQgdG8gY2hlY2sgaWYgd2UgY2FuIHVzZSB0aGUgY2VudHJhbCBsaW1pdCB0aGVvcmVtLiANCkFjY29yZGluZyB0byB0aGUgY2VudHJhbCBsaW1pdCB0aGVvcmVtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIGEgc2FtcGxlIG1lYW4gd2lsbCBhcHByb2FjaCBhIG5vcm1hbCBkaXN0cmlidXRpb24gYXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcywgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBpbml0aWFsIGRpc3RyaWJ1dGlvbiBsb29rZWQgbGlrZS4gSW4gcGFydGljdWxhciwgdGhlIGNlbnRyYWwgbGltaXQgdGhlb3JlbSBjYW4gYmUgdXNlZCBpZiB0aGUgc2FtcGxlIHNpemUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMwLiANCmBgYHtyfQ0KbiA8LSBsZW5ndGgoY2FsbHMpICMgU2FtcGxlIFNpemUNCnByaW50KHBhc3RlKCJTYW1wbGUgU2l6ZToiLCBuKSkNCmBgYA0KDQpBcyB3ZSBjYW4gc2VlLCBvdXIgZGF0YSBzZXQgaGFzIDUwIG9ic2VydmF0aW9ucywgc28gdGhlIGNlbnRyYWwgbGltaXQgY2FuIGFwcGx5LiBTbyB3ZSBjYW4gYXBwcm94aW1hdGUgJFx0aGV0YSQgYW5kIGNvbnN0cnVjdCBvdXIgYXN5bXB0b3RpYyBjb25maWRlbmNlIGludGVydmFsIHVzaW5nIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLiANCg0KVG8gc3RhcnQsIHdlIGNhbiBmaW5kIGEgcG9pbnQgZXN0aW1hdGUgZm9yICRcdGhldGEkIHVzaW5nIHRoZSBtYXhpbXVtIGxpa2VsaWhvb2QgbWV0aG9kLiBUaGUgbWF4aW11bSBsaWtlbGhvb2QgZXN0aW1hdG9yIGZvciB0aGUgbGluZGxleSBkaXN0cmlidXRpb24gaXM6DQoNCiQkDQpcaGF0e1x0aGV0YX0gPSBcZnJhY3sxIC0gXGJhcnt4fSArIFxzcXJ0e1xiYXJ7eH1eMiArIDZcYmFye3h9ICsgMX19ezJcYmFye3h9fQ0KJCQNCg0KVXNpbmcgdGhpcyBmb3JtdWxhLCB3ZSBvYnRhaW4gYSBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGUgb2YgMC4yMTkxLg0KYGBge3J9DQptZWFuLmNhbGxzIDwtIG1lYW4oY2FsbHMpICMgU2FtcGxlIE1lYW4NCg0KdGhldGEubWxlIDwtICgxIC0gbWVhbi5jYWxscyArIHNxcnQoKG1lYW4uY2FsbHNeMikgKyA2Km1lYW4uY2FsbHMgKyAxKSkvKDIqbWVhbi5jYWxscykgIyBNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGUgZm9yIFRoZXRhDQp0aGV0YS5tbGUNCmBgYA0KDQpOZXh0LCB3ZSBuZWVkIHRoZSBtYXJnaW4gb2YgZXJyb3IuIFRoZSBtYXJnaW4gb2YgZXJyb3IgY29uc2lzdHMgb2YgdHdvIHBhcnRzOiBhIGNyaXRpY2FsIHZhbHVlIGFuZCB0aGUgc3RhbmRhcmQgZXJyb3IuIFRoZSBjcml0aWNhbCB2YWx1ZSBjYW4gYmUgb2J0YWluZWQgdmlhIHRoZSBxbm9ybSBmdW5jdGlvbi4gDQpgYGB7cn0NCiMgQ2FsY3VsYXRpbmcgY3JpdGljYWwgdmFsdWUgdXNpbmcgYWxwaGEgPSAwLjA1LzIgZHVlIHRvIHN5bW1ldHJ5DQpjcml0dmFsdWUuOTUgPC0gcW5vcm0oMSAtIDAuMDUvMiwgbWVhbiA9IDAsIHNkID0gMSwgbG93ZXIudGFpbCA9IFRSVUUpIA0KY3JpdHZhbHVlLjk1DQpgYGANCg0KVGhlIHN0YW5kYXJkIGVycm9yIGluIHRoaXMgY2FzZSB3aWxsIGJlIHRoZSBzcXJ0IG9mIHRoZSBpbnZlcnNlIG9mIHRoZSBmaXNoZXIgaW5mb3JtYXRpb24uIFRoZSBmaXNoZXIgaW5mb3JtYXRpb24gb2YgdGhlIGxpbmRsZXkgZGlzdHJpYnV0aW9uIGlzOiANCiQkDQpJKFx0aGV0YSkgPSBcZnJhY3syfXtcdGhldGFeMn0gLSBcZnJhY3sxfXsoMStcdGhldGEpXjJ9DQokJA0KDQpVc2luZyB0aGlzIGZvcm11bGEsIHdlIG9idGFpbiBhIGZpc2hlciBpbmZvcm1hdGlvbiBvZiA3LjQ4ODQuDQpgYGB7cn0NCiMgRm9ybXVsYSBmb3IgRmlzaGVyIEluZm9ybWF0aW9uIG9mIExpbmRsZXkgRGlzdHJpYnV0aW9uDQpmaXNoLmluZm8gPC0gKDIvKHRoZXRhLm1sZV4yKSkgLSAoMS8oMSArICh0aGV0YS5tbGVeMikpKQ0KDQpmaXNoLmluZm8NCmBgYA0KDQpGaW5hbGx5LCBtdWx0aXBseWluZyB0aGUgY3JpdGljYWwgdmFsdWUgYW5kIHRoZSBzdGFuZGFyZCBlcnJvciB3aWxsIGdpdmUgdXMgdGhlIG1hcmdpbiBvZiBlcnJvci4NCg0KYGBge3J9DQp2YXIubWxlIDwtIDEvbipmaXNoLmluZm8NCg0Kc2UubWxlIDwtIHNxcnQodmFyLm1sZSkNCnNlLm1sZQ0KDQptb2UgPC0gY3JpdHZhbHVlLjk1KnNlLm1sZQ0KbW9lDQpgYGANCmBgYHtyfQ0KY2kubG93bGltLmFzeW1wIDwtIHRoZXRhLm1sZSAtIG1vZSAjIExvd2VyIExpbWl0IG9mIENvbmZpZGVuY2UgSW50ZXJ2YWwNCmNpLnVwbGltLmFzeW1wIDwtIHRoZXRhLm1sZSArIG1vZSAjIFVwcGVyIExpbWl0IG9mIENvbmZpZGVuY2UgSW50ZXJ2YWwNCmNvbi5pbnQuYXN5bXAgPSBjKGNpLmxvd2xpbS5hc3ltcCwgY2kudXBsaW0uYXN5bXApICMgQ29tYmluZWQgQ29uZmlkZW5jZSBJbnRlcnZhbA0KY29uLmludC5hc3ltcA0KYGBgDQoNCiMgTGlrZWxpaG9vZCBSYXRpbyBDb25maWRlbmNlIEludGVydmFsDQpOZXh0LCB3ZSB3aWxsIGJ1aWxkIHRoZSBsaWtlbGlob29kIHJhdGlvIGNvbmZpZGVuY2UgaW50ZXJ2YWwuIFRoZSBsaWtlbGlob29kIHJhdGlvIGNvbmZpZGVuY2UgaW50ZXJ2YWwgYXJlIG1vcmUgdmVyc2F0aWxlIGFuZCBtb3JlIGFjY3VyYXRlIHdheXMgb2YgY29uc3RydWN0aW5nIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCBlc3BlY2lhbGx5IGlmIHRoZSBzYW1wbGUgc2l6ZSBpcyBub3Qgc3VmZmljaWVudGx5IGxhcmdlLg0KDQpPdXIgbGlrZWxpaG9vZCBjb25maWRlbmNlIGludGVydmFsIGlzIHRoZSByYW5nZSBvZiB2YWx1ZXMgdGhhdCBzYXRpc2ZpZXMgV2lsa3MnIHRoZW9yZW0uIA0KDQoqKldpbGtzJyBUaGVvcmVtKio6IEFzc3VtZSB0aGF0ICRcdGhldGEkIGlzIHRoZSB0cnVlIHVua25vd24gcG9wdWxhdGlvbiBwYXJhbWV0ZXIgSWYgc2FtcGxlIHNpemUgJG4kIGlzIGxhcmdlLCB3ZSBoYXZlICANCg0KJCQNCkxSKFx0aGV0YSk9LTJcbG9nXExhbWJkYShcdGhldGEpID0gMlxsZWZ0WyBcbG9nIEwoXGhhdHtcdGhldGF9X3tNTEV9OyB4KSAtXGxvZyBMKFx0aGV0YTsgeClccmlnaHRdXHhyaWdodGFycm93e2R9IFxjaGleMl8xDQokJA0KDQpGb3Igc2ltcGxpY2l0eSBvZiBjYWxjdWxhdGlvbnMsIGluc3RlYWQgb2YgdXNpbmcgdGhlIHN0YW5kYXJkIGxpa2VsaWhvb2QgZnVuY3Rpb24sIHdlIHdpbGwgdXNlIHRoZSBsb2ctbGlrZWxpaG9vZCBmdW5jdGlvbi4NCg0KJCQNCkwoXHRoZXRhKSA9IFxwcm9kX3tpPTF9Xm4gZih4X2k7XHRoZXRhKSA9IFxwcm9kX3tpPTF9Xm4gXGxlZnRbIFxmcmFje1x0aGV0YV4yfXsxK1x0aGV0YX0gKDEgKyB4X2kpIGVeey1cdGhldGEgeF9pfSBccmlnaHRdLg0KJCQNCg0KTGV0ICRTID0gXHN1bV97aT0xfV5uIHhfaSQsICRcYmFye3h9ID0gUy9uJCwgIGFuZCAkQyA9IFxzdW1fe2k9MX1ebiBcbG4oMSArIHhfaSkkIChjb25zdGFudCB3aXRoIHJlc3BlY3QgdG8gJFx0aGV0YSQpOg0KDQokJA0KXGVsbChcdGhldGEpID0gXGxuIEwoXHRoZXRhKSA9IG4gXGxuXGxlZnQoIFxmcmFje1x0aGV0YV4yfXsxK1x0aGV0YX0gXHJpZ2h0KSArIEMgLSBcdGhldGEgUy4NCiQkDQoNClRvIHN0YXJ0LCB3ZSBuZWVkIGEgcG9pbnQgZXN0aW1hdGUgZm9yIHRoZXRhLiBTaW5jZSB0aGlzIGlzIGEgbGlrZWxpaG9vZCByYXRpbyBjb25maWRlbmNlIGludGVydmFsLCB3ZSB3aWxsIG5lZWQgdGhlIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0b3IuIFdlIGFscmVhZHkgZXN0YWJsaXNoZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGFzeW1wdG90aWMgaW50ZXJ2YWwgdGhhdCBvdXIgbWxlIGlzICRcaGF0e3RoZXRhfSQgPSAwLjIxOTEuIA0KYGBge3J9DQp0aGV0YS5tbGUgIyBPdXIgTWF4aW11bSBMaWtlbGlob29kIEVzdGltYXRlIGZyb20gQmVmb3JlDQpgYGANCg0KTmV4dCwgd2UgY2FuIG9idGFpbiBvdXIgY3JpdGljYWwgdmFsdWUgdmlhIHRoZSBxY2hpc3EoKSBmdW5jdGlvbi4NCmBgYHtyfQ0KIyBDcml0aWNhbCBDaGktU3F1YXJlIFZhbHVlIGZvciBDb25maWRlbmNlIEludGVydmFsDQpjcml0LmNoaXNxciA8LSBxY2hpc3EoMC45NSwgZGYgPSAxLCBsb3dlci50YWlsID0gVFJVRSkgDQpjcml0LmNoaXNxcg0KYGBgDQpOZXh0IHdlIGNhbiBvYnRhaW4gb3VyIG1heGltdW0gbG9nLWxpa2VsaWhvb2QgZXN0aW1hdGU6DQpgYGB7cn0NCiMgRGVmaW5pbmcgTG9nLUxpa2VsaWhvb2QgRnVuY3Rpb24NCmxvZy5saWsgPC0gZnVuY3Rpb24odGhldGEsIGRhdGEpew0KbiA9IGxlbmd0aChkYXRhKQ0KYyA9IHN1bShsb2coMSArIGRhdGEpKQ0KcyA9IHN1bShkYXRhKQ0KICANCiAgcmV0dXJuKG4qbG9nKHRoZXRhXjIvKDErdGhldGEpKSArIGMgLSAodGhldGEgKiBzKSkgDQogICMgUmV0dXJucyBsb2cgbGlrZWxpaG9vZCBlc3RpbWF0ZQ0KfQ0KDQpsb2cubWxlIDwtIGxvZy5saWsodGhldGEubWxlLCBjYWxscykgIyBmdW5jdGlvbiBldmF1bGF0ZWQgYXQgTUxFDQpsb2cubWxlDQpgYGANCg0KV2UgY2FuIG5vdyB1dGl0bGl6ZSBXaWxrcycgVGhlb3JlbSB0byBmaW5kIG91ciBib3VuZHMgZm9yIG91ciBjb25maWRlbmNlIGludGVydmFsOg0KYGBge3J9DQojIFV0aWxpemluZyBXaWxrcycgVGhlb3JlbQ0KV2lsa3MgPC0gIGZ1bmN0aW9uKHRoZXRhLCBkYXRhKXsNCiAgMioobG9nLm1sZSAtIGxvZy5saWsodGhldGEsIGRhdGEpKQ0KfQ0KDQpyb290cyA8LSBmdW5jdGlvbih0aGV0YSwgZGF0YSwgdGhldGEubWxlKXsNCiAgbG9nLm1sZSAtIGNyaXQuY2hpc3FyDQp9DQpgYGANCg0KDQo=