Assignment Objectives
Master the fundamental concepts of point estimation and
performance metrics
Understand the theoretical foundation of the method of moments
estimator (MME)
Implement MME in R, incorporating numerical approximation
methods
Use of 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.
Log-logistic Distribution
The log-logistic distribution (also known as the Fisk distribution)
is a continuous probability distribution that is particularly useful in
contexts where data exhibit non-negative, skewed behavior and where the
hazard rate is unimodal (increases to a peak and then decreases). It has
been widely used in the areas such as survival analysis and reliability
engineering, environmental science, economics, pharmacology, finance and
risk management, etc.
For given shape parameter \(\beta\)
and scale parameter \(\alpha\), the
cumulative distribution function
\[
F(x) = \frac{1}{1+(x/\alpha)^{-\beta}}
\]
As an exercise, you can derive the density in the following form
\[
f(x) =
\frac{(\beta/\alpha)(x/\alpha)^{\beta-1}}{[1+(x/\alpha)^\beta]^2}, \ \
\text{ for } \ \ x > 0.
\]
After some algebra, we can find the \(k\)th moment
\[
\mu_k = E[X^k] = \alpha^k B\left(1+\frac{k}{\beta}, 1 - \frac{k}{\beta}
\right).
\]
This assignment will focus on finding MME of parameters \(\alpha\) and \(\beta\) based on a real-world application
data set.
Question 1: Derive the log-logistic density function
Given the CDF of the two-parameter log-logistic distribution
\[
F(x) = \frac{1}{1+(x/\alpha)^{-\beta}}.
\]
# Install packages
library(Deriv)
# Define the CDF
F_fun <- function(x, alpha, beta){
1/(1 + (x/alpha)^(-beta))
}
# Differentiate to x
f_fun <- Deriv(F_fun, "x")
f_fun
function (x, alpha, beta)
{
.e1 <- x/alpha
beta/(alpha * (1 + 1/.e1^beta)^2 * .e1^(1 + beta))
}
# Define the log-logistic PDF
f_loglogistic <- function(x, alpha, beta){
# Implements simplified formula for the density
(beta/alpha) * (x/alpha)^(beta - 1) /
(1 + (x/alpha)^beta)^2
}
# Parameter choices for illustration
alpha <- 30
beta <- 3
# Create a sequence of x values
x <- seq(0.1, 80, length = 400)
# Plot the density curve
plot(x, f_loglogistic(x, alpha, beta),
type = "l",
lwd = 2,
main = "Log-Logistic Density Function Visualization",
xlab = "x",
ylab = "f(x)")

Starting from: \[
F(x) = \frac{1}{1+(x/\alpha)^{-\beta}}.
\] Differentiating with respect to x gives:
\[
f(x) = \frac{(\beta/\alpha)(x/\alpha)^{\beta-1}}{[1+(x/\alpha)^\beta]^2}
\]
which is the log-logistic probability density
function.
Question 2: Distribution of Recovery Time from A
Surgery
Time to recovery (in days) after a specific knee surgery procedure.
This follows a typical log-logistic pattern in medical
survival/recovery analysis:
8.23, 12.74, 14.83, 16.61, 18.16, 19.55, 20.80, 21.94, 23.00, 23.98, 24.89, 25.75, 26.56,
27.34, 28.08, 28.79, 29.48, 30.15, 30.81, 31.45, 32.08, 32.70, 33.31, 33.92, 34.53, 35.13,
35.73, 36.33, 36.93, 37.53, 38.14, 38.75, 39.37, 40.00, 40.64, 41.29, 41.95, 42.63, 43.33,
44.05, 44.79, 45.56, 46.36, 47.20, 48.08, 49.02, 50.03, 51.12, 52.32, 53.65
Based on the above data to perform the following analysis.
- Using method of moment estimation to estimate \(\alpha\) and \(\beta\), denoted by \(\hat{\alpha}\) and \(\hat{\beta}\), respectively.
# Data
x <- c(
8.23, 12.74, 14.83, 16.61, 18.16, 19.55, 20.80, 21.94, 23.00, 23.98,
24.89, 25.75, 26.56, 27.34, 28.08, 28.79, 29.48, 30.15, 30.81, 31.45,
32.08, 32.70, 33.31, 33.92, 34.53, 35.13, 35.73, 36.33, 36.93, 37.53,
38.14, 38.75, 39.37, 40.00, 40.64, 41.29, 41.95, 42.63, 43.33, 44.05,
44.79, 45.56, 46.36, 47.20, 48.08, 49.02, 50.03, 51.12, 52.32, 53.65
)
n <- length(x)
# Compute sample moments
m <- mean(x)
s2 <- var(x)
m
[1] 34.1922
s2
[1] 122.1819
# Beta
moment_eq <- function(beta){
A <- (pi/beta)/sin(pi/beta)
B <- (2*pi/beta)/sin(2*pi/beta)
alpha <- m / A
theoretical_var <- alpha^2 * (B - A^2)
theoretical_var - s2
}
beta_hat <- uniroot(moment_eq, interval = c(2.01, 20))$root
beta_hat
[1] 5.95252
# Alpha
alpha_hat <- m * sin(pi/beta_hat)/(pi/beta_hat)
alpha_hat
[1] 32.62681
- Since the moment estimates \(\hat{\alpha}\) and \(\hat{\beta}\) are random, construct
bootstrap sampling distributions for each. To visualize these
distributions, plot separate bootstrap histograms for \(\hat{\alpha}\) and \(\hat{\beta}\). Then, overlay a smooth
density curve on each histogram using Gaussian kernel density
estimation. Finally, describe the patterns of these density curves.
# Bootstrap Sampling Distributions
set.seed(1)
B <- 2000
alpha_boot <- numeric(B)
beta_boot <- numeric(B)
for(i in 1:B){
xb <- sample(x, n, replace = TRUE)
m_b <- mean(xb)
s2_b <- var(xb)
moment_eq_boot <- function(beta){
A <- (pi/beta)/sin(pi/beta)
Bterm <- (2*pi/beta)/sin(2*pi/beta)
alpha <- m_b / A
theoretical_var <- alpha^2 * (Bterm - A^2)
theoretical_var - s2_b
}
beta_hat_b <- tryCatch(
uniroot(moment_eq_boot, interval = c(2.01, 20))$root,
error = function(e) NA
)
if(!is.na(beta_hat_b)){
alpha_hat_b <- m_b * sin(pi/beta_hat_b)/(pi/beta_hat_b)
} else {
alpha_hat_b <- NA
}
alpha_boot[i] <- alpha_hat_b
beta_boot[i] <- beta_hat_b
}
alpha_boot <- na.omit(alpha_boot)
beta_boot <- na.omit(beta_boot)
# Bootstrap Histogram for Alpha
hist(alpha_boot,
probability = TRUE,
main = expression("Bootstrap Distribution of " * hat(alpha)),
xlab = expression(hat(alpha)))
lines(density(alpha_boot), lwd = 2)

# Bootstrap Histogram for Beta
hist(beta_boot,
probability = TRUE,
main = expression("Bootstrap Distribution of " * hat(beta)),
xlab = expression(hat(beta)))
lines(density(beta_boot), lwd = 2)

The bootstrap distribution of the scale estimator of \(\alpha\) and \(\beta\) are both symmetric and unimodal and
shows that bootstrap resampling provides a accurate approximation of the
estimators’ sampling variability.
LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgMzogTWV0aG9kcyBvZiBNb21lbnQgRXN0aW1hdGlvbiINCmF1dGhvcjogIktpZXJhbiBIZWZmZXJhbiAiDQpkYXRlOiAiIER1ZTogMi8yNC8yNiAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQoNCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgbGlicmFyeShwbG90bHkpDQp9DQojIyMjDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkENCiAgICAgICAgICAgICAgICAgICAgICApICANCmBgYA0KIA0KIFwNCiANCiMjICoqQXNzaWdubWVudCBPYmplY3RpdmVzKiogDQoNCiogTWFzdGVyIHRoZSBmdW5kYW1lbnRhbCBjb25jZXB0cyBvZiBwb2ludCBlc3RpbWF0aW9uIGFuZCBwZXJmb3JtYW5jZSBtZXRyaWNzDQoNCiogVW5kZXJzdGFuZCB0aGUgdGhlb3JldGljYWwgZm91bmRhdGlvbiBvZiB0aGUgbWV0aG9kIG9mIG1vbWVudHMgZXN0aW1hdG9yIChNTUUpDQoNCiogSW1wbGVtZW50IE1NRSBpbiBSLCBpbmNvcnBvcmF0aW5nIG51bWVyaWNhbCBhcHByb3hpbWF0aW9uIG1ldGhvZHMNCg0KXA0KDQoqKlVzZSBvZiBBSSBUb29scyoqDQoNCioqUG9saWN5IG9uIEFJIFRvb2wgVXNlKio6IFN0dWRlbnRzIG11c3QgYWRoZXJlIHRvIHRoZSBBSSB0b29sIHBvbGljeSBzcGVjaWZpZWQgaW4gdGhlIGNvdXJzZSBzeWxsYWJ1cy4gVGhlIGRpcmVjdCBjb3B5aW5nIG9mIEFJLWdlbmVyYXRlZCBjb250ZW50IGlzIHN0cmljdGx5IHByb2hpYml0ZWQuIEFsbCBzdWJtaXR0ZWQgd29yayBtdXN0IHJlZmxlY3QgeW91ciBvd24gdW5kZXJzdGFuZGluZzsgd2hlcmUgZXh0ZXJuYWwgdG9vbHMgYXJlIGNvbnN1bHRlZCwgY29udGVudCBtdXN0IGJlIHRob3JvdWdobHkgcmVwaHJhc2VkIGFuZCBzeW50aGVzaXplZCBpbiB5b3VyIG93biB3b3Jkcy4NCg0KKipDb2RlIEluY2x1c2lvbiBSZXF1aXJlbWVudCoqOiBBbnkgY29kZSBpbmNsdWRlZCBpbiB5b3VyIGVzc2F5IG11c3QgYmUgcHJvcGVybHkgY29tbWVudGVkIHRvIGV4cGxhaW4gdGhlIHB1cnBvc2UgYW5kL29yIGV4cGVjdGVkIG91dHB1dCBvZiBrZXkgY29kZSBsaW5lcy4gU3VibWl0dGluZyBBSS1nZW5lcmF0ZWQgY29kZSB3aXRob3V0IG1lYW5pbmdmdWwsIHN0dWRlbnQtYWRkZWQgY29tbWVudHMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuDQoNClwNCg0KKipMb2ctbG9naXN0aWMgRGlzdHJpYnV0aW9uKioNCg0KVGhlIGxvZy1sb2dpc3RpYyBkaXN0cmlidXRpb24gKGFsc28ga25vd24gYXMgdGhlIEZpc2sgZGlzdHJpYnV0aW9uKSBpcyBhIGNvbnRpbnVvdXMgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uIHRoYXQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBpbiBjb250ZXh0cyB3aGVyZSBkYXRhIGV4aGliaXQgbm9uLW5lZ2F0aXZlLCBza2V3ZWQgYmVoYXZpb3IgYW5kIHdoZXJlIHRoZSBoYXphcmQgcmF0ZSBpcyB1bmltb2RhbCAoaW5jcmVhc2VzIHRvIGEgcGVhayBhbmQgdGhlbiBkZWNyZWFzZXMpLiBJdCBoYXMgYmVlbiB3aWRlbHkgdXNlZCBpbiB0aGUgYXJlYXMgc3VjaCBhcyBzdXJ2aXZhbCBhbmFseXNpcyBhbmQgcmVsaWFiaWxpdHkgZW5naW5lZXJpbmcsIGVudmlyb25tZW50YWwgc2NpZW5jZSwgZWNvbm9taWNzLCBwaGFybWFjb2xvZ3ksIGZpbmFuY2UgYW5kIHJpc2sgbWFuYWdlbWVudCwgZXRjLiANCg0KRm9yIGdpdmVuIHNoYXBlIHBhcmFtZXRlciAkXGJldGEkIGFuZCBzY2FsZSBwYXJhbWV0ZXIgJFxhbHBoYSQsIHRoZSBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbg0KDQokJA0KRih4KSA9IFxmcmFjezF9ezErKHgvXGFscGhhKV57LVxiZXRhfX0NCiQkDQoNCkFzIGFuIGV4ZXJjaXNlLCB5b3UgY2FuIGRlcml2ZSB0aGUgZGVuc2l0eSBpbiB0aGUgZm9sbG93aW5nIGZvcm0NCg0KJCQNCmYoeCkgPSBcZnJhY3soXGJldGEvXGFscGhhKSh4L1xhbHBoYSlee1xiZXRhLTF9fXtbMSsoeC9cYWxwaGEpXlxiZXRhXV4yfSwgXCBcIFx0ZXh0eyBmb3IgfSBcIFwgeCA+IDAuDQokJA0KDQpBZnRlciBzb21lIGFsZ2VicmEsIHdlIGNhbiBmaW5kIHRoZSAkayR0aCBtb21lbnQNCg0KJCQNClxtdV9rID0gRVtYXmtdID0gXGFscGhhXmsgQlxsZWZ0KDErXGZyYWN7a317XGJldGF9LCAxIC0gXGZyYWN7a317XGJldGF9IFxyaWdodCkuDQokJA0KDQpUaGlzIGFzc2lnbm1lbnQgd2lsbCBmb2N1cyBvbiBmaW5kaW5nIE1NRSBvZiBwYXJhbWV0ZXJzICRcYWxwaGEkIGFuZCAkXGJldGEkIGJhc2VkIG9uIGEgcmVhbC13b3JsZCBhcHBsaWNhdGlvbiBkYXRhIHNldC4NCg0KDQpcDQoNCiMjICoqUXVlc3Rpb24gMTogRGVyaXZlIHRoZSBsb2ctbG9naXN0aWMgZGVuc2l0eSBmdW5jdGlvbiAqKg0KDQpHaXZlbiB0aGUgQ0RGIG9mIHRoZSB0d28tcGFyYW1ldGVyIGxvZy1sb2dpc3RpYyBkaXN0cmlidXRpb24NCg0KJCQNCkYoeCkgPSBcZnJhY3sxfXsxKyh4L1xhbHBoYSleey1cYmV0YX19Lg0KJCQNClwNCmBgYHtyfQ0KIyBJbnN0YWxsIHBhY2thZ2VzDQoNCmxpYnJhcnkoRGVyaXYpDQoNCiMgRGVmaW5lIHRoZSBDREYNCkZfZnVuIDwtIGZ1bmN0aW9uKHgsIGFscGhhLCBiZXRhKXsNCiAgMS8oMSArICh4L2FscGhhKV4oLWJldGEpKQ0KfQ0KDQojIERpZmZlcmVudGlhdGUgdG8geA0KZl9mdW4gPC0gRGVyaXYoRl9mdW4sICJ4IikNCg0KZl9mdW4NCg0KIyBEZWZpbmUgdGhlIGxvZy1sb2dpc3RpYyBQREYNCmZfbG9nbG9naXN0aWMgPC0gZnVuY3Rpb24oeCwgYWxwaGEsIGJldGEpew0KICANCiAgIyBJbXBsZW1lbnRzIHNpbXBsaWZpZWQgZm9ybXVsYSBmb3IgdGhlIGRlbnNpdHkNCiAgKGJldGEvYWxwaGEpICogKHgvYWxwaGEpXihiZXRhIC0gMSkgLw0KICAgICgxICsgKHgvYWxwaGEpXmJldGEpXjINCn0NCg0KIyBQYXJhbWV0ZXIgY2hvaWNlcyBmb3IgaWxsdXN0cmF0aW9uDQphbHBoYSA8LSAzMA0KYmV0YSAgPC0gMw0KDQojIENyZWF0ZSBhIHNlcXVlbmNlIG9mIHggdmFsdWVzDQp4IDwtIHNlcSgwLjEsIDgwLCBsZW5ndGggPSA0MDApDQoNCiMgUGxvdCB0aGUgZGVuc2l0eSBjdXJ2ZQ0KcGxvdCh4LCBmX2xvZ2xvZ2lzdGljKHgsIGFscGhhLCBiZXRhKSwNCiAgICAgdHlwZSA9ICJsIiwNCiAgICAgbHdkID0gMiwNCiAgICAgbWFpbiA9ICJMb2ctTG9naXN0aWMgRGVuc2l0eSBGdW5jdGlvbiBWaXN1YWxpemF0aW9uIiwNCiAgICAgeGxhYiA9ICJ4IiwNCiAgICAgeWxhYiA9ICJmKHgpIikNCmBgYA0KDQoNCioqU3RhcnRpbmcgZnJvbToqKg0KJCQNCkYoeCkgPSBcZnJhY3sxfXsxKyh4L1xhbHBoYSleey1cYmV0YX19Lg0KJCQgDQoqKkRpZmZlcmVudGlhdGluZyB3aXRoIHJlc3BlY3QgdG8geCBnaXZlczoqKg0KJCQNCmYoeCkgPSBcZnJhY3soXGJldGEvXGFscGhhKSh4L1xhbHBoYSlee1xiZXRhLTF9fXtbMSsoeC9cYWxwaGEpXlxiZXRhXV4yfQ0KJCQNCg0KKip3aGljaCBpcyB0aGUgbG9nLWxvZ2lzdGljIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24uKioNCg0KIyMgKipRdWVzdGlvbiAyOiBEaXN0cmlidXRpb24gb2YgUmVjb3ZlcnkgVGltZSBmcm9tIEEgU3VyZ2VyeSoqDQoNClRpbWUgdG8gcmVjb3ZlcnkgKGluIGRheXMpIGFmdGVyIGEgc3BlY2lmaWMga25lZSBzdXJnZXJ5IHByb2NlZHVyZS4gVGhpcyBmb2xsb3dzIGEgdHlwaWNhbCAqKmxvZy1sb2dpc3RpYyBwYXR0ZXJuKiogaW4gbWVkaWNhbCBzdXJ2aXZhbC9yZWNvdmVyeSBhbmFseXNpczoNCg0KYGBgDQo4LjIzLCAxMi43NCwgMTQuODMsIDE2LjYxLCAxOC4xNiwgMTkuNTUsIDIwLjgwLCAyMS45NCwgMjMuMDAsIDIzLjk4LCAyNC44OSwgMjUuNzUsIDI2LjU2LCANCjI3LjM0LCAyOC4wOCwgMjguNzksIDI5LjQ4LCAzMC4xNSwgMzAuODEsIDMxLjQ1LCAzMi4wOCwgMzIuNzAsIDMzLjMxLCAzMy45MiwgMzQuNTMsIDM1LjEzLCANCjM1LjczLCAzNi4zMywgMzYuOTMsIDM3LjUzLCAzOC4xNCwgMzguNzUsIDM5LjM3LCA0MC4wMCwgNDAuNjQsIDQxLjI5LCA0MS45NSwgNDIuNjMsIDQzLjMzLCANCjQ0LjA1LCA0NC43OSwgNDUuNTYsIDQ2LjM2LCA0Ny4yMCwgNDguMDgsIDQ5LjAyLCA1MC4wMywgNTEuMTIsIDUyLjMyLCA1My42NQ0KYGBgDQpCYXNlZCBvbiB0aGUgYWJvdmUgZGF0YSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYW5hbHlzaXMuDQoNCmEpIFVzaW5nIG1ldGhvZCBvZiBtb21lbnQgZXN0aW1hdGlvbiB0byBlc3RpbWF0ZSAkXGFscGhhJCBhbmQgJFxiZXRhJCwgZGVub3RlZCBieSAkXGhhdHtcYWxwaGF9JCBhbmQgJFxoYXR7XGJldGF9JCwgcmVzcGVjdGl2ZWx5LiANCg0KYGBge3J9DQojIERhdGENCnggPC0gYygNCjguMjMsIDEyLjc0LCAxNC44MywgMTYuNjEsIDE4LjE2LCAxOS41NSwgMjAuODAsIDIxLjk0LCAyMy4wMCwgMjMuOTgsDQoyNC44OSwgMjUuNzUsIDI2LjU2LCAyNy4zNCwgMjguMDgsIDI4Ljc5LCAyOS40OCwgMzAuMTUsIDMwLjgxLCAzMS40NSwNCjMyLjA4LCAzMi43MCwgMzMuMzEsIDMzLjkyLCAzNC41MywgMzUuMTMsIDM1LjczLCAzNi4zMywgMzYuOTMsIDM3LjUzLA0KMzguMTQsIDM4Ljc1LCAzOS4zNywgNDAuMDAsIDQwLjY0LCA0MS4yOSwgNDEuOTUsIDQyLjYzLCA0My4zMywgNDQuMDUsDQo0NC43OSwgNDUuNTYsIDQ2LjM2LCA0Ny4yMCwgNDguMDgsIDQ5LjAyLCA1MC4wMywgNTEuMTIsIDUyLjMyLCA1My42NQ0KKQ0KDQpuIDwtIGxlbmd0aCh4KQ0KDQojIENvbXB1dGUgc2FtcGxlIG1vbWVudHMNCm0gPC0gbWVhbih4KQ0KczIgPC0gdmFyKHgpDQoNCm0NCnMyDQoNCiMgQmV0YQ0KbW9tZW50X2VxIDwtIGZ1bmN0aW9uKGJldGEpew0KICANCiAgQSA8LSAocGkvYmV0YSkvc2luKHBpL2JldGEpDQogIEIgPC0gKDIqcGkvYmV0YSkvc2luKDIqcGkvYmV0YSkNCiAgDQogIGFscGhhIDwtIG0gLyBBDQogIA0KICB0aGVvcmV0aWNhbF92YXIgPC0gYWxwaGFeMiAqIChCIC0gQV4yKQ0KICANCiAgdGhlb3JldGljYWxfdmFyIC0gczINCn0NCg0KYmV0YV9oYXQgPC0gdW5pcm9vdChtb21lbnRfZXEsIGludGVydmFsID0gYygyLjAxLCAyMCkpJHJvb3QNCg0KYmV0YV9oYXQNCg0KIyBBbHBoYSANCmFscGhhX2hhdCA8LSBtICogc2luKHBpL2JldGFfaGF0KS8ocGkvYmV0YV9oYXQpDQoNCmFscGhhX2hhdA0KYGBgDQoNCmIpIFNpbmNlIHRoZSBtb21lbnQgZXN0aW1hdGVzICRcaGF0e1xhbHBoYX0kIGFuZCAkXGhhdHtcYmV0YX0kIGFyZSByYW5kb20sIGNvbnN0cnVjdCBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBmb3IgZWFjaC4gVG8gdmlzdWFsaXplIHRoZXNlIGRpc3RyaWJ1dGlvbnMsIHBsb3Qgc2VwYXJhdGUgYm9vdHN0cmFwIGhpc3RvZ3JhbXMgZm9yICRcaGF0e1xhbHBoYX0kIGFuZCAkXGhhdHtcYmV0YX0kLiAgVGhlbiwgb3ZlcmxheSBhIHNtb290aCBkZW5zaXR5IGN1cnZlIG9uIGVhY2ggaGlzdG9ncmFtIHVzaW5nIEdhdXNzaWFuIGtlcm5lbCBkZW5zaXR5IGVzdGltYXRpb24uIEZpbmFsbHksIGRlc2NyaWJlIHRoZSBwYXR0ZXJucyBvZiB0aGVzZSBkZW5zaXR5IGN1cnZlcy4NCg0KYGBge3J9DQojIEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb25zDQpzZXQuc2VlZCgxKQ0KDQpCIDwtIDIwMDANCg0KYWxwaGFfYm9vdCA8LSBudW1lcmljKEIpDQpiZXRhX2Jvb3QgIDwtIG51bWVyaWMoQikNCg0KZm9yKGkgaW4gMTpCKXsNCiAgDQogIHhiIDwtIHNhbXBsZSh4LCBuLCByZXBsYWNlID0gVFJVRSkNCiAgDQogIG1fYiA8LSBtZWFuKHhiKQ0KICBzMl9iIDwtIHZhcih4YikNCiAgDQogIG1vbWVudF9lcV9ib290IDwtIGZ1bmN0aW9uKGJldGEpew0KICAgIA0KICAgIEEgPC0gKHBpL2JldGEpL3NpbihwaS9iZXRhKQ0KICAgIEJ0ZXJtIDwtICgyKnBpL2JldGEpL3NpbigyKnBpL2JldGEpDQogICAgDQogICAgYWxwaGEgPC0gbV9iIC8gQQ0KICAgIA0KICAgIHRoZW9yZXRpY2FsX3ZhciA8LSBhbHBoYV4yICogKEJ0ZXJtIC0gQV4yKQ0KICAgIA0KICAgIHRoZW9yZXRpY2FsX3ZhciAtIHMyX2INCiAgfQ0KICANCiAgYmV0YV9oYXRfYiA8LSB0cnlDYXRjaCgNCiAgICB1bmlyb290KG1vbWVudF9lcV9ib290LCBpbnRlcnZhbCA9IGMoMi4wMSwgMjApKSRyb290LA0KICAgIGVycm9yID0gZnVuY3Rpb24oZSkgTkENCiAgKQ0KICANCiAgaWYoIWlzLm5hKGJldGFfaGF0X2IpKXsNCiAgICBhbHBoYV9oYXRfYiA8LSBtX2IgKiBzaW4ocGkvYmV0YV9oYXRfYikvKHBpL2JldGFfaGF0X2IpDQogIH0gZWxzZSB7DQogICAgYWxwaGFfaGF0X2IgPC0gTkENCiAgfQ0KICANCiAgYWxwaGFfYm9vdFtpXSA8LSBhbHBoYV9oYXRfYg0KICBiZXRhX2Jvb3RbaV0gIDwtIGJldGFfaGF0X2INCn0NCg0KYWxwaGFfYm9vdCA8LSBuYS5vbWl0KGFscGhhX2Jvb3QpDQpiZXRhX2Jvb3QgIDwtIG5hLm9taXQoYmV0YV9ib290KQ0KDQojIEJvb3RzdHJhcCBIaXN0b2dyYW0gZm9yIEFscGhhDQpoaXN0KGFscGhhX2Jvb3QsDQogICAgIHByb2JhYmlsaXR5ID0gVFJVRSwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24oIkJvb3RzdHJhcCBEaXN0cmlidXRpb24gb2YgIiAqIGhhdChhbHBoYSkpLA0KICAgICB4bGFiID0gZXhwcmVzc2lvbihoYXQoYWxwaGEpKSkNCg0KbGluZXMoZGVuc2l0eShhbHBoYV9ib290KSwgbHdkID0gMikNCg0KIyBCb290c3RyYXAgSGlzdG9ncmFtIGZvciBCZXRhDQpoaXN0KGJldGFfYm9vdCwNCiAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICBtYWluID0gZXhwcmVzc2lvbigiQm9vdHN0cmFwIERpc3RyaWJ1dGlvbiBvZiAiICogaGF0KGJldGEpKSwNCiAgICAgeGxhYiA9IGV4cHJlc3Npb24oaGF0KGJldGEpKSkNCg0KbGluZXMoZGVuc2l0eShiZXRhX2Jvb3QpLCBsd2QgPSAyKQ0KYGBgDQoNCioqVGhlIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gb2YgdGhlIHNjYWxlIGVzdGltYXRvciBvZiAkXGFscGhhJCBhbmQgJFxiZXRhJCBhcmUgYm90aCBzeW1tZXRyaWMgYW5kIHVuaW1vZGFsIGFuZCBzaG93cyB0aGF0IGJvb3RzdHJhcCByZXNhbXBsaW5nIHByb3ZpZGVzIGEgYWNjdXJhdGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgZXN0aW1hdG9yc+KAmSBzYW1wbGluZyB2YXJpYWJpbGl0eS4qKiANCg0KDQoNCg==