Question 1. Consider the Binomial distribution with \(n = 24\) and \(p
= .9\) that is used to model the number of correctly received
bits on a satellite link that transmits data in \(24\)-bit blocks.
Quesion 1 (a) Plot the probability
density function and cumulative distribution function for the number of
correctly received bits
#Answer 1a
# Install and load necessary libraries
install.packages("ggplot2")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.3/ggplot2_3.4.3.tgz'
Content type 'application/x-gzip' length 3337790 bytes (3.2 MB)
==================================================
downloaded 3.2 MB
The downloaded binary packages are in
/var/folders/5k/z62m95450wjd282d5sh635lw0000gn/T//Rtmp3XujC8/downloaded_packages
library(ggplot2)
# Define parameters
n <- 24
p <- 0.9
x <- 0:n
# Calculate PDF and CDF
pdf <- dbinom(x, n, p)
cdf <- pbinom(x, n, p)
# Plot PDF
ggplot(data.frame(x=x, y=pdf), aes(x=x, y=y)) +
geom_bar(stat="identity") +
labs(title="Probability Density Function", x="Number of correctly received bits", y="Probability") +
theme_minimal()

# Plot CDF
ggplot(data.frame(x=x, y=cdf), aes(x=x, y=y)) +
geom_line() +
labs(title="Cumulative Distribution Function", x="Number of correctly received bits", y="Cumulative Probability") +
theme_minimal()

Quesion 1 (b) What is the mean number of
correctly received bits? What is the standard deviation?
#Answer 1b
#(make sure that what you print make sense to me) - for example to print mean you can use cat command once you done with the calculation and have value in the variable
#variable_name=10
#cat("Mean number of correctly received bits ", variable_name)
n <- 24
p <- 0.9
mean_val <- n * p
std_dev <- sqrt(n * p * (1 - p))
cat("Mean number of correctly received bits:", mean_val, "\n")
Mean number of correctly received bits: 21.6
cat("Standard deviation of correctly received bits:", std_dev, "\n")
Standard deviation of correctly received bits: 1.469694
Quesion 1 (c) What is the probability of
more than \(3\)-bit errors in the block
of \(24\)?
#Answer 1c
n <- 24
k <- 3
p <- .1
prob <- 1 - pbinom(k, n, p)
print(prob)
[1] 0.2142622
Quesion 1 (e) What is the 60th quantile
of this distribution? What can you interpret from this
value?
#Answer 1e
n <- 24
p <- 0.9
quantile_60 <- qbinom(0.6, n, p)
cat("60th quantile of correctly received bits:", quantile_60, "\n")
60th quantile of correctly received bits: 22
print("It means that 60% of the data is below this point")
[1] "It means that 60% of the data is below this point"
# Question2. The Public Service Answering Point (PSAP) in San Francisco employs $19$ operators in $8$-hour shifts to process $911$ calls. There are at least $5$ operators always answering calls. The number of calls processed per operator can be modeled with a Poisson random variable with rate $\lambda_0 =20$ calls per hour.
### <span style='color: grey;'>Quesion 2 (a) What is the probability an operator can process 20 calls in an hour? Repeat for 30 calls in an hour? </span>
# Question2. The Public Service Answering Point (PSAP) in San Francisco employs $19$ operators in $8$-hour shifts to process $911$ calls. There are at least $5$ operators always answering calls. The number of calls processed per operator can be modeled with a Poisson random variable with rate $\lambda_0 =20$ calls per hour.
### <span style='color: grey;'>Quesion 2 (a) What is the probability an operator can process 20 calls in an hour? Repeat for 30 calls in an hour? </span>
#Answer 2a
lambda_0 <- 20
p20calls <- dpois(20, lambda=lambda_0)
p30calls <- dpois(30, lambda=lambda_0)
cat("20calls:",p20calls)
20calls: 0.08883532
cat("30calls:",p30calls)
30calls: 0.008343536
Quesion 2 (b) Given that 240 calls
occurred in an hour, what is the probability that the ten operators can
process them all assuming they are split equally among the
operators?
#Answer 2b
lambda_0 <- 20
prob_one_operator <- dpois(24, lambda_0)
prob_ten_operators <- prob_one_operator
cat("probability that the ten operators can process them all",prob_ten_operators)
probability that the ten operators can process them all 0.05573456
Quesion 2 (c) Now, If the aggregate call
rate per hour \(\lambda_c\) , is
measured by \(\lambda_c = 85\) calls
per hour, what is the probability of more than \(100\) calls in an hour
#Answer
lambda_c <- 85
lessthan <- ppois(100, lambda=lambda_c)
morethan <- 1 - lessthan
morethan
[1] 0.04934533
Question 3. For the two random number generator below A and B(don’t
forget to add your R code)
- [A] \(Z_i = (9Z_{i-1} + 1) \mod
16\) with \(Z_0 = 5\).
- [B] \(Z_i = (7Z_{i-1} + 3) \mod
32\) with \(Z_0 = 10\),
Quesion 3 (b) Which of these parameters
effect the period of LCG – \(a\), \(b\), \(Z_0\)
#Answer
cat("Answer a,b and Z", "")
Answer a,b and Z
Quesion 3 (c) For both generators plot a
scatter diagram of the Zi values 1 apart. What are your observations
from these plots? What do you think about the property of randomness of
these generators?
#Answer
# Scatter diagram for Generator A
plot(Z_values_A[-length(Z_values_A)], Z_values_A[-1], main="Scatter Diagram for Generator A", xlab="Zi", ylab="Zi+1", pch=19, col="blue")

# Scatter diagram for Generator B
plot(Z_values_B[-length(Z_values_B)], Z_values_B[-1], main="Scatter Diagram for Generator B", xlab="Zi", ylab="Zi+1", pch=19, col="red")

cat("If the scatter diagram forms a distinct pattern (like lines or grids), then the generator might not be producing very random numbers. A more random scattering, where there doesn't seem to be a recognizable pattern, indicates a better level of randomness from the generator.
The quality of randomness is judged based on how unpredictable the sequences are. The more dispersed and pattern-less the scatter diagram, the better the randomness. If there's a discernible pattern in the scatter plot, then the sequences from that generator are more predictable, reducing its quality as a random number generator.")
If the scatter diagram forms a distinct pattern (like lines or grids), then the generator might not be producing very random numbers. A more random scattering, where there doesn't seem to be a recognizable pattern, indicates a better level of randomness from the generator.
The quality of randomness is judged based on how unpredictable the sequences are. The more dispersed and pattern-less the scatter diagram, the better the randomness. If there's a discernible pattern in the scatter plot, then the sequences from that generator are more predictable, reducing its quality as a random number generator.
Quesion 3 (d) Randomness of default
random generator of R – Run runif command to generate 100 random numbers
and plot the scatter diagram of these numbers ( values 1 apart) and
discuss your observations about randomness of this random generator.
#Answer
random_numbers <- runif(100)
plot(random_numbers[-100], random_numbers[-1],col="yellow", xlab="Value at i", ylab="Value at i+1", main="Scatter Diagram of Random Numbers (1 Apart)")

NA
NA
NA
Quesion 3 (e) Compute the mean value of
\(U_i\) across the period
#Answer
Z <- 5 # Starting value
Z_values_A <- c(Z)
m_A <- 16 # Modulus
# Generate sequence until a repetition is found
while (TRUE) {
Z <- (9 * Z + 1) %% m_A
if (Z %in% Z_values_A) {
break
}
Z_values_A <- c(Z_values_A, Z)
}
# Computing U_i values and mean for Generator A
U_values_A <- Z_values_A / m_A
mean_U_A <- mean(U_values_A)
cat("Mean A",mean_U_A)
Mean A 0.46875
Z <- 10 # Starting value
Z_values_B <- c(Z)
m_B <- 32 # Modulus
# Generate sequence until a repetition is found
while (TRUE) {
Z <- (7 * Z + 3) %% m_B
if (Z %in% Z_values_B) {
break
}
Z_values_B <- c(Z_values_B, Z)
}
# Computing U_i values and mean for Generator B
U_values_B <- Z_values_B / m_B
mean_U_B <- mean(U_values_B)
cat("Mean B",mean_U_B)
Mean B 0.421875
Question 6. For our specific random variable, we know that its PDF
is defined by the function \(f(x) =
10x(1-x)\). Utilize the accept-reject algorithm to draw samples
from this distribution. Take a look at Lecture 10 slide 8 and 9
#Answer
f <- function(x) {
return(10*x*(1-x))
}
# Using uniform distribution as proposal distribution
g <- function(x) {
return(1)
}
# Finding c
x_values <- seq(0, 1, 0.01)
c <- max(f(x_values))
accept_reject_sampling <- function(n) {
samples <- numeric(n)
count <- 0
while(count < n) {
X <- runif(1)
U <- runif(1)
if(U <= f(X) / (c * g(X))) {
count <- count + 1
samples[count] <- X
}
}
return(samples)
}
# Drawing samples
samples <- accept_reject_sampling(10000)
hist(samples, main="Histogram of Samples", xlab="x", breaks=10, col="lightblue", border="black")

LS0tCnRpdGxlOiAiIDxjZW50ZXI+PHNwYW4gc3R5bGU9J2NvbG9yOiBibHVlOyc+IEhvbWV3b3JrIDMgPC9zcGFuPjwvY2VudGVyPiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCiMgUXVlc3Rpb24gMS4gIENvbnNpZGVyIHRoZSBCaW5vbWlhbCBkaXN0cmlidXRpb24gd2l0aCAkbiA9IDI0JCBhbmQgJHAgPSAuOSQgdGhhdCBpcyB1c2VkIHRvIG1vZGVsIHRoZSBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHMgb24gYSBzYXRlbGxpdGUgbGluayB0aGF0IHRyYW5zbWl0cyBkYXRhIGluICQyNCQtYml0IGJsb2Nrcy4KCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGEpIFBsb3QgdGhlIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gYW5kIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzPC9zcGFuPgoKYGBge3J9CiNBbnN3ZXIgMWEKCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQpsaWJyYXJ5KGdncGxvdDIpCgojIERlZmluZSBwYXJhbWV0ZXJzCm4gPC0gMjQKcCA8LSAwLjkKeCA8LSAwOm4KCiMgQ2FsY3VsYXRlIFBERiBhbmQgQ0RGCnBkZiA8LSBkYmlub20oeCwgbiwgcCkKY2RmIDwtIHBiaW5vbSh4LCBuLCBwKQoKIyBQbG90IFBERgpnZ3Bsb3QoZGF0YS5mcmFtZSh4PXgsIHk9cGRmKSwgYWVzKHg9eCwgeT15KSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGxhYnModGl0bGU9IlByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb24iLCB4PSJOdW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHMiLCB5PSJQcm9iYWJpbGl0eSIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgUGxvdCBDREYKZ2dwbG90KGRhdGEuZnJhbWUoeD14LCB5PWNkZiksIGFlcyh4PXgsIHk9eSkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZT0iQ3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb24iLCB4PSJOdW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHMiLCB5PSJDdW11bGF0aXZlIFByb2JhYmlsaXR5IikgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAxIChiKSBXaGF0IGlzIHRoZSBtZWFuIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0cz8gV2hhdCBpcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uPzwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgMWIKIyhtYWtlIHN1cmUgdGhhdCB3aGF0IHlvdSBwcmludCBtYWtlIHNlbnNlIHRvIG1lKSAtIGZvciBleGFtcGxlIHRvIHByaW50IG1lYW4geW91IGNhbiB1c2UgY2F0IGNvbW1hbmQgb25jZSB5b3UgZG9uZSB3aXRoIHRoZSBjYWxjdWxhdGlvbiBhbmQgaGF2ZSB2YWx1ZSBpbiB0aGUgdmFyaWFibGUKI3ZhcmlhYmxlX25hbWU9MTAgCiNjYXQoIk1lYW4gbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzICIsICB2YXJpYWJsZV9uYW1lKQoKbiA8LSAyNApwIDwtIDAuOQoKCm1lYW5fdmFsIDwtIG4gKiBwCnN0ZF9kZXYgPC0gc3FydChuICogcCAqICgxIC0gcCkpCgoKY2F0KCJNZWFuIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0czoiLCBtZWFuX3ZhbCwgIlxuIikKY2F0KCJTdGFuZGFyZCBkZXZpYXRpb24gb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM6Iiwgc3RkX2RldiwgIlxuIikKCgpgYGAKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGMpIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAkMyQtYml0IGVycm9ycyBpbiB0aGUgYmxvY2sgb2YgJDI0JD88L3NwYW4+CmBgYHtyfQojQW5zd2VyIDFjCm4gPC0gMjQgIAprIDwtIDMgICAKcCA8LSAuMSAgCgpwcm9iIDwtIDEgLSBwYmlub20oaywgbiwgcCkKCnByaW50KHByb2IpCgoKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoZCkgV2hhdCBpcyB0aGUgbWVkaWFuIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhlIG1lZGlhbiB2YWx1ZT8gPC9zcGFuPgpgYGB7cn0KI0Fuc3dlciAxZAoKbiA8LSAyNApwIDwtIDAuOQoKCm1lZGlhbl92YWwgPC0gcWJpbm9tKDAuNSwgbiwgcCkKCgpjYXQoIk1lZGlhbiBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM6IiwgbWVkaWFuX3ZhbCwgIlxuIikKCnByaW50KCJJdCBpcyB0aGUgbWlkZGxlIHZhbHVlIG9mIEJpdHMgcmVjaWV2ZWQiKQoKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoZSkgIFdoYXQgaXMgdGhlIDYwdGggcXVhbnRpbGUgb2YgdGhpcyBkaXN0cmlidXRpb24/IFdoYXQgY2FuIHlvdSBpbnRlcnByZXQgZnJvbSB0aGlzIHZhbHVlPzwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgMWUKCm4gPC0gMjQKcCA8LSAwLjkKCgpxdWFudGlsZV82MCA8LSBxYmlub20oMC42LCBuLCBwKQoKCmNhdCgiNjB0aCBxdWFudGlsZSBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0czoiLCBxdWFudGlsZV82MCwgIlxuIikKCgpwcmludCgiSXQgbWVhbnMgdGhhdCA2MCUgb2YgdGhlIGRhdGEgaXMgYmVsb3cgdGhpcyBwb2ludCIpCgoKIyBRdWVzdGlvbjIuIFRoZSBQdWJsaWMgU2VydmljZSBBbnN3ZXJpbmcgUG9pbnQgKFBTQVApIGluIFNhbiBGcmFuY2lzY28gZW1wbG95cyAkMTkkIG9wZXJhdG9ycyBpbiAkOCQtaG91ciBzaGlmdHMgdG8gcHJvY2VzcyAkOTExJCBjYWxscy4gVGhlcmUgYXJlIGF0IGxlYXN0ICQ1JCBvcGVyYXRvcnMgYWx3YXlzIGFuc3dlcmluZyBjYWxscy4gVGhlIG51bWJlciBvZiBjYWxscyBwcm9jZXNzZWQgcGVyIG9wZXJhdG9yIGNhbiBiZSBtb2RlbGVkIHdpdGggYSBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZSB3aXRoIHJhdGUgJFxsYW1iZGFfMCA9MjAkIGNhbGxzIHBlciBob3VyLgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMiAoYSkgV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgYW4gb3BlcmF0b3IgY2FuIHByb2Nlc3MgMjAgY2FsbHMgaW4gYW4gaG91cj8gUmVwZWF0IGZvciAzMCBjYWxscyBpbiBhbiBob3VyPyA8L3NwYW4+CmBgYAoKYGBge3J9CiMgUXVlc3Rpb24yLiBUaGUgUHVibGljIFNlcnZpY2UgQW5zd2VyaW5nIFBvaW50IChQU0FQKSBpbiBTYW4gRnJhbmNpc2NvIGVtcGxveXMgJDE5JCBvcGVyYXRvcnMgaW4gJDgkLWhvdXIgc2hpZnRzIHRvIHByb2Nlc3MgJDkxMSQgY2FsbHMuIFRoZXJlIGFyZSBhdCBsZWFzdCAkNSQgb3BlcmF0b3JzIGFsd2F5cyBhbnN3ZXJpbmcgY2FsbHMuIFRoZSBudW1iZXIgb2YgY2FsbHMgcHJvY2Vzc2VkIHBlciBvcGVyYXRvciBjYW4gYmUgbW9kZWxlZCB3aXRoIGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgd2l0aCByYXRlICRcbGFtYmRhXzAgPTIwJCBjYWxscyBwZXIgaG91ci4KCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDIgKGEpIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IGFuIG9wZXJhdG9yIGNhbiBwcm9jZXNzIDIwIGNhbGxzIGluIGFuIGhvdXI/IFJlcGVhdCBmb3IgMzAgY2FsbHMgaW4gYW4gaG91cj8gPC9zcGFuPgojQW5zd2VyIDJhCgpsYW1iZGFfMCA8LSAyMAoKCnAyMGNhbGxzIDwtIGRwb2lzKDIwLCBsYW1iZGE9bGFtYmRhXzApCgoKcDMwY2FsbHMgPC0gZHBvaXMoMzAsIGxhbWJkYT1sYW1iZGFfMCkKCgpjYXQoIjIwY2FsbHM6IixwMjBjYWxscykKY2F0KCIzMGNhbGxzOiIscDMwY2FsbHMpCgoKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMiAoYikgR2l2ZW4gdGhhdCAyNDAgY2FsbHMgb2NjdXJyZWQgaW4gYW4gaG91ciwgd2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgdGVuIG9wZXJhdG9ycyBjYW4gcHJvY2VzcyB0aGVtIGFsbCBhc3N1bWluZyB0aGV5IGFyZSBzcGxpdCBlcXVhbGx5IGFtb25nIHRoZSBvcGVyYXRvcnM/PC9zcGFuPgpgYGB7cn0KI0Fuc3dlciAyYgpsYW1iZGFfMCA8LSAyMApwcm9iX29uZV9vcGVyYXRvciA8LSBkcG9pcygyNCwgbGFtYmRhXzApCnByb2JfdGVuX29wZXJhdG9ycyA8LSBwcm9iX29uZV9vcGVyYXRvcgoKY2F0KCJwcm9iYWJpbGl0eSB0aGF0IHRoZSB0ZW4gb3BlcmF0b3JzIGNhbiBwcm9jZXNzIHRoZW0gYWxsIixwcm9iX3Rlbl9vcGVyYXRvcnMpCgoKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMiAoYykgTm93LCBJZiB0aGUgYWdncmVnYXRlIGNhbGwgcmF0ZSBwZXIgaG91ciAkXGxhbWJkYV9jJCAsIGlzIG1lYXN1cmVkIGJ5ICRcbGFtYmRhX2MgPSA4NSQgY2FsbHMgcGVyIGhvdXIsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAkMTAwJCBjYWxscyBpbiBhbiBob3VyPC9zcGFuPgpgYGB7cn0KI0Fuc3dlciAKbGFtYmRhX2MgPC0gODUKbGVzc3RoYW4gPC0gcHBvaXMoMTAwLCBsYW1iZGE9bGFtYmRhX2MpCm1vcmV0aGFuIDwtIDEgLSBsZXNzdGhhbgptb3JldGhhbgoKCmBgYAoKIyBRdWVzdGlvbiAzLiBGb3IgdGhlIHR3byByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBiZWxvdyBBIGFuZCBCKGRvbuKAmXQgZm9yZ2V0IHRvIGFkZCB5b3VyIFIgY29kZSkKIyMjIC0gW0FdIFwoWl9pID0gKDlaX3tpLTF9ICsgMSkgXG1vZCAxNlwpIHdpdGggXChaXzAgPSA1XCkuCiMjIyAtIFtCXSBcKFpfaSA9ICg3Wl97aS0xfSArIDMpIFxtb2QgMzJcKSB3aXRoIFwoWl8wID0gMTBcKSwKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChhKSBDb21wdXRlICRaX2kkIGFuZCAkVV9pJCBmb3IgdmFsdWVzIG9mICRpJCB1bnRpbCBhIG51bWJlciBpcyByZXBlYXRlZCwgd2hhdCBpcyB0aGUgcGVyaW9kIG9mIGJvdGggdGhlIGdlbmVyYXRvcj8gUHJvdmlkZSB5b3VyIGNvbW1lbnRzIGFib3V0IHRoZSBwZXJpb2Qgb2YgYm90aCBSR04gPC9zcGFuPgoKYGBge3J9CiNBbnN3ZXIgM2EKIyBHZW5lcmF0b3IgQQpaXzBfQSA8LSA1ClpfdmFsdWVzX0EgPC0gYyhaXzBfQSkKVV92YWx1ZXNfQSA8LSBjKFpfMF9BIC8gMTYpCgp3aGlsZShUUlVFKSB7CiAgWl9uZXh0X0EgPC0gKDkgKiBaX3ZhbHVlc19BW2xlbmd0aChaX3ZhbHVlc19BKV0gKyAxKSAlJSAxNgogIGlmKFpfbmV4dF9BICVpbiUgWl92YWx1ZXNfQSkgYnJlYWsKICBaX3ZhbHVlc19BIDwtIGFwcGVuZChaX3ZhbHVlc19BLCBaX25leHRfQSkKICBVX3ZhbHVlc19BIDwtIGFwcGVuZChVX3ZhbHVlc19BLCBaX25leHRfQSAvIDE2KQp9CgoKY2F0KCJQZXJpb2Qgb2YgQSAiLHBlcmlvZF9BKQoKIyBHZW5lcmF0b3IgQgpaXzBfQiA8LSAxMApaX3ZhbHVlc19CIDwtIGMoWl8wX0IpClVfdmFsdWVzX0IgPC0gYyhaXzBfQiAvIDMyKQoKd2hpbGUoVFJVRSkgewogIFpfbmV4dF9CIDwtICg3ICogWl92YWx1ZXNfQltsZW5ndGgoWl92YWx1ZXNfQildICsgMykgJSUgMzIKICBpZihaX25leHRfQiAlaW4lIFpfdmFsdWVzX0IpIGJyZWFrCiAgWl92YWx1ZXNfQiA8LSBhcHBlbmQoWl92YWx1ZXNfQiwgWl9uZXh0X0IpCiAgVV92YWx1ZXNfQiA8LSBhcHBlbmQoVV92YWx1ZXNfQiwgWl9uZXh0X0IgLyAzMikKfQoKCmNhdCgiICxQZXJpb2Qgb2YgQiAiLHBlcmlvZF9CKQoKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGIpIFdoaWNoIG9mIHRoZXNlIHBhcmFtZXRlcnMgZWZmZWN0IHRoZSBwZXJpb2Qgb2YgTENHIOKAkyAkYSQsICRiJCwgJFpfMCQgPC9zcGFuPgpgYGB7cn0KI0Fuc3dlciAKY2F0KCJBbnN3ZXIgYSxiIGFuZCBaIiwgIiIpCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGMpIEZvciBib3RoIGdlbmVyYXRvcnMgcGxvdCBhIHNjYXR0ZXIgZGlhZ3JhbSBvZiB0aGUgWmkgdmFsdWVzIDEgYXBhcnQuIFdoYXQgYXJlIHlvdXIgb2JzZXJ2YXRpb25zIGZyb20gdGhlc2UgcGxvdHM/IFdoYXQgZG8geW91IHRoaW5rIGFib3V0IHRoZSBwcm9wZXJ0eSBvZiByYW5kb21uZXNzIG9mIHRoZXNlIGdlbmVyYXRvcnM/IDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKIyBTY2F0dGVyIGRpYWdyYW0gZm9yIEdlbmVyYXRvciBBCnBsb3QoWl92YWx1ZXNfQVstbGVuZ3RoKFpfdmFsdWVzX0EpXSwgWl92YWx1ZXNfQVstMV0sIG1haW49IlNjYXR0ZXIgRGlhZ3JhbSBmb3IgR2VuZXJhdG9yIEEiLCB4bGFiPSJaaSIsIHlsYWI9IlppKzEiLCBwY2g9MTksIGNvbD0iYmx1ZSIpCgojIFNjYXR0ZXIgZGlhZ3JhbSBmb3IgR2VuZXJhdG9yIEIKcGxvdChaX3ZhbHVlc19CWy1sZW5ndGgoWl92YWx1ZXNfQildLCBaX3ZhbHVlc19CWy0xXSwgbWFpbj0iU2NhdHRlciBEaWFncmFtIGZvciBHZW5lcmF0b3IgQiIsIHhsYWI9IlppIiwgeWxhYj0iWmkrMSIsIHBjaD0xOSwgY29sPSJyZWQiKQoKY2F0KCJJZiB0aGUgc2NhdHRlciBkaWFncmFtIGZvcm1zIGEgZGlzdGluY3QgcGF0dGVybiAobGlrZSBsaW5lcyBvciBncmlkcyksIHRoZW4gdGhlIGdlbmVyYXRvciBtaWdodCBub3QgYmUgcHJvZHVjaW5nIHZlcnkgcmFuZG9tIG51bWJlcnMuIEEgbW9yZSByYW5kb20gc2NhdHRlcmluZywgd2hlcmUgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgcmVjb2duaXphYmxlIHBhdHRlcm4sIGluZGljYXRlcyBhIGJldHRlciBsZXZlbCBvZiByYW5kb21uZXNzIGZyb20gdGhlIGdlbmVyYXRvci4KVGhlIHF1YWxpdHkgb2YgcmFuZG9tbmVzcyBpcyBqdWRnZWQgYmFzZWQgb24gaG93IHVucHJlZGljdGFibGUgdGhlIHNlcXVlbmNlcyBhcmUuIFRoZSBtb3JlIGRpc3BlcnNlZCBhbmQgcGF0dGVybi1sZXNzIHRoZSBzY2F0dGVyIGRpYWdyYW0sIHRoZSBiZXR0ZXIgdGhlIHJhbmRvbW5lc3MuIElmIHRoZXJlJ3MgYSBkaXNjZXJuaWJsZSBwYXR0ZXJuIGluIHRoZSBzY2F0dGVyIHBsb3QsIHRoZW4gdGhlIHNlcXVlbmNlcyBmcm9tIHRoYXQgZ2VuZXJhdG9yIGFyZSBtb3JlIHByZWRpY3RhYmxlLCByZWR1Y2luZyBpdHMgcXVhbGl0eSBhcyBhIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiIpCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChkKSBSYW5kb21uZXNzIG9mIGRlZmF1bHQgcmFuZG9tIGdlbmVyYXRvciBvZiBSIOKAkyBSdW4gcnVuaWYgY29tbWFuZCB0byBnZW5lcmF0ZSAxMDAgcmFuZG9tIG51bWJlcnMgYW5kIHBsb3QgdGhlIHNjYXR0ZXIgZGlhZ3JhbSBvZiB0aGVzZSBudW1iZXJzICggdmFsdWVzIDEgYXBhcnQpIGFuZCBkaXNjdXNzIHlvdXIgb2JzZXJ2YXRpb25zIGFib3V0IHJhbmRvbW5lc3Mgb2YgdGhpcyByYW5kb20gZ2VuZXJhdG9yLiA8L3NwYW4+CmBgYHtyfQojQW5zd2VyCgpyYW5kb21fbnVtYmVycyA8LSBydW5pZigxMDApCgoKcGxvdChyYW5kb21fbnVtYmVyc1stMTAwXSwgcmFuZG9tX251bWJlcnNbLTFdLGNvbD0ieWVsbG93IiwgeGxhYj0iVmFsdWUgYXQgaSIsIHlsYWI9IlZhbHVlIGF0IGkrMSIsIG1haW49IlNjYXR0ZXIgRGlhZ3JhbSBvZiBSYW5kb20gTnVtYmVycyAoMSBBcGFydCkiKQoKCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChlKSBDb21wdXRlIHRoZSBtZWFuIHZhbHVlIG9mICRVX2kkIGFjcm9zcyB0aGUgcGVyaW9kPC9zcGFuPgpgYGB7cn0KI0Fuc3dlcgpaIDwtIDUgIApaX3ZhbHVlc19BIDwtIGMoWikKbV9BIDwtIDE2ICAKCgp3aGlsZSAoVFJVRSkgewogIFogPC0gKDkgKiBaICsgMSkgJSUgbV9BCiAgaWYgKFogJWluJSBaX3ZhbHVlc19BKSB7CiAgICBicmVhawogIH0KICBaX3ZhbHVlc19BIDwtIGMoWl92YWx1ZXNfQSwgWikKfQoKClVfdmFsdWVzX0EgPC0gWl92YWx1ZXNfQSAvIG1fQQptZWFuX1VfQSA8LSBtZWFuKFVfdmFsdWVzX0EpCgoKY2F0KCJNZWFuIEEiLG1lYW5fVV9BKQoKWiA8LSAxMCAgIyBTdGFydGluZyB2YWx1ZQpaX3ZhbHVlc19CIDwtIGMoWikKbV9CIDwtIDMyICAjIE1vZHVsdXMKCgp3aGlsZSAoVFJVRSkgewogIFogPC0gKDcgKiBaICsgMykgJSUgbV9CCiAgaWYgKFogJWluJSBaX3ZhbHVlc19CKSB7CiAgICBicmVhawogIH0KICBaX3ZhbHVlc19CIDwtIGMoWl92YWx1ZXNfQiwgWikKfQoKIyBDb21wdXRpbmcgVV9pIHZhbHVlcyBhbmQgbWVhbiBmb3IgR2VuZXJhdG9yIEIKVV92YWx1ZXNfQiA8LSBaX3ZhbHVlc19CIC8gbV9CCm1lYW5fVV9CIDwtIG1lYW4oVV92YWx1ZXNfQikKCgpjYXQoIk1lYW4gQiIsbWVhbl9VX0IpCgoKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMyAoZikgQnkgcHJvdmlkaW5nIGEgcGxvdCBvZiBkZW5zaXR5IChoaXN0b2dyYW0pIGRpc2N1c3MgdGhlIHVuaWZvcm1pdHkgb2YgYm90aCBvZiB0aGUgZ2VuZXJhdG9ycyA8L3NwYW4+CmBgYHtyfQojQW5zd2VyCiMgUGxvdCBoaXN0b2dyYW0gZm9yIFVfdmFsdWVzX0EKaGlzdChVX3ZhbHVlc19BLCBicmVha3M9MjAsIG1haW49Ikhpc3RvZ3JhbSBvZiBVX2kgVmFsdWVzIGZvciBHZW5lcmF0b3IgQSIsIHhsYWI9IlVfaSIsIGNvbD0ibGlnaHRibHVlIiwgcHJvYmFiaWxpdHk9VFJVRSwgYm9yZGVyPSJibGFjayIpCgojIEFkZGluZyBhIGRlbnNpdHkgbGluZQpsaW5lcyhkZW5zaXR5KFVfdmFsdWVzX0EpLCBjb2w9ImJsdWUiLCBsd2Q9MikKCiMgUGxvdCBoaXN0b2dyYW0gZm9yIFVfdmFsdWVzX0IKaGlzdChVX3ZhbHVlc19CLCBicmVha3M9MjAsIG1haW49Ikhpc3RvZ3JhbSBvZiBVX2kgVmFsdWVzIGZvciBHZW5lcmF0b3IgQiIsIHhsYWI9IlVfaSIsIGNvbD0ibGlnaHRncmVlbiIsIHByb2JhYmlsaXR5PVRSVUUsIGJvcmRlcj0iYmxhY2siKQoKIyBBZGRpbmcgYSBkZW5zaXR5IGxpbmUKbGluZXMoZGVuc2l0eShVX3ZhbHVlc19CKSwgY29sPSJncmVlbiIsIGx3ZD0yKQoKCmBgYAoKIyBRdWVzdGlvbiA0LiBVc2luZyB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0gbWV0aG9kCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc3Rpb24gNC4oYSkgRGV2ZWxvcCBhbiBhbGdvcml0aG0gZm9yIHRoZSByYW5kb20gdmFyaWFibGUgd2l0aCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiBGKHgpIGJlbG93Ljwvc3Bhbj4KClxbIEYoeCkgPSAxIC0gZV57LSh4L1xsYW1iZGEpXmt9IFxdCgp3aGVyZSBcKCB4IFxnZXEgMCBcKSwgXCggXGxhbWJkYSBcZ2VxIDAgXCksIGFuZCBcKCBrIFxnZXEgMCBcKS4KCmBgYHtyfQojIEFuc3dlciA0YQojIFRoaXMgbWlnaHQgYmUgaGFyZCB0byBwcmludCB1c2luZyBSIC0geW91IGNhbiB3cml0ZSB0aGUgc3RlcCBpbiB5b3VyIG5vdGVib29rIGFuZCB0aGVuIGluY2x1ZGUgaW1hZ2UgaGVyZSAvIG9yIHlvdSBjYW4gaW5jbHVkZSBhcyBzZXBlcmF0ZSBmaWxlIHdoZW4gdXBsb2FkCgoKaWYgKCFyZXF1aXJlKElSZGlzcGxheSwgcXVpZXRseSA9IFRSVUUpKSB7CiAgCiAgaW5zdGFsbC5wYWNrYWdlcygiSVJkaXNwbGF5IikKICAKICAKICBsaWJyYXJ5KElSZGlzcGxheSkKfSBlbHNlIHsKICAKICBsaWJyYXJ5KElSZGlzcGxheSkKfQoKaW52ZXJzZV90cmFuc2Zvcm1fbWV0aG9kIDwtIGZ1bmN0aW9uKGxhbWJkYSwgaywgbikgewogICMgbiBpcyB0aGUgbnVtYmVyIG9mIHJhbmRvbSBudW1iZXJzIHlvdSB3YW50IHRvIGdlbmVyYXRlCiAgCiAgCiAgVSA8LSBydW5pZihuKQogIAogICMgQXBwbHkgdGhlIGludmVyc2UgdHJhbnNmb3JtCiAgeCA8LSBsYW1iZGEgKiAoLWxvZygxIC0gVSkpXigxL2spCiAgCiAgcmV0dXJuKHgpCn0KCgpyYW5kb21fbnVtYmVycyA8LSBpbnZlcnNlX3RyYW5zZm9ybV9tZXRob2QobGFtYmRhID0gMSwgayA9IDIsIG4gPSAxMDAwKQpoaXN0KHJhbmRvbV9udW1iZXJzLCBtYWluPSJIaXN0b2dyYW0gb2YgR2VuZXJhdGVkIFJhbmRvbSBOdW1iZXJzIiwgeGxhYj0ieCIsIGJyZWFrcz01MCwgY29sPSJsaWdodGJsdWUiLCBib3JkZXI9ImJsYWNrIikKCgojIEVtYmVkIGFuIGltYWdlCiNkaXNwbGF5X3BuZyhmaWxlID0gImV4YW1wbGUucG5nIikKCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiA0IChiKSBVc2UgdGhlIGZpcnN0IHRocmVlIFVpIHZhbHVlcyBmcm9tIHBhcnQgKGEpIGFuZCBnZW5lcmF0b3IgW0FdIG9mIHByZXZpb3VzIHByb2JsZW0gdG8gY3JlYXRlIDMgdmFsdWVzIGZyb20gdGhlIHJhbmRvbSB2YXJpYWJsZSB3aGVuLCAkXGxhbWJkYSA9IDEkLCAk8J2RmCA9IDUkPC9zcGFuPgpgYGB7cn0KI0Fuc3dlcgoKWiA8LSA1ICAKWl92YWx1ZXNfQSA8LSBjKFopCm1fQSA8LSAxNiAgCgpmb3IoaSBpbiAxOjIpIHsKICBaIDwtICg5ICogWiArIDEpICUlIG1fQQogIFpfdmFsdWVzX0EgPC0gYyhaX3ZhbHVlc19BLCBaKQp9CgoKVV92YWx1ZXNfQSA8LSBaX3ZhbHVlc19BIC8gbV9BCgoKbGFtYmRhIDwtIDEKayA8LSA1CnhfdmFsdWVzIDwtIGxhbWJkYSAqICgtbG9nKDEgLSBVX3ZhbHVlc19BWzE6M10pKV4oMS9rKQoKcHJpbnQoeF92YWx1ZXMpCgoKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gNCAoYykgc2luZyBSIGdlbmVyYXRlIDEwLDAwMCB2YWx1ZXMgZnJvbSB5b3VyIGFsZ29yaXRobSB3aGVuICBcbGFtYmRhID0gMSAsIPCdkZggPSA1ICBhbmQgcGxvdCBhIGhpc3RvZ3JhbSBvZiB0aGUgZGVuc2l0eS4gRGlzY3VzcyB3aGF0IGluc2lnaHRzIHlvdSBvYnRhaW4gd2hlbiB5b3UgbG9vayBhdCB0aGUgcGxvdCBnZW5lcmF0ZWQgaGVyZSB2cyB0aGUgcGxvdCB5b3UgZ2VuZXJhdGVkIGluIHF1ZXN0aW9uIDMgKGUpIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKCmdlbmVyYXRlX3ZhbHVlcyA8LSBmdW5jdGlvbihsYW1iZGEsIGssIG4pIHsKICBVIDwtIHJ1bmlmKG4pICAjIEdlbmVyYXRlIG4gdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHJhbmRvbSBudW1iZXJzCiAgCiAKICB4IDwtIGxhbWJkYSAqICgtbG9nKDEgLSBVKSleKDEvaykKICByZXR1cm4oeCkKfQoKCmxhbWJkYSA8LSAxCmsgPC0gNQpuIDwtIDEwMDAwCmdlbmVyYXRlZF92YWx1ZXMgPC0gZ2VuZXJhdGVfdmFsdWVzKGxhbWJkYSwgaywgbikKCiMgUGxvdCB0aGUgaGlzdG9ncmFtCmhpc3QoZ2VuZXJhdGVkX3ZhbHVlcywgbWFpbj0iSGlzdG9ncmFtIGZvciBJbnZlcnNlIFRyYW5zZm9ybSBHZW5lcmF0ZWQgVmFsdWVzIiwgeGxhYj0ieCIsIGJyZWFrcz01MCwgcHJvYmFiaWxpdHk9VFJVRSwgY29sPSJsaWdodGJsdWUiLCBib3JkZXI9ImJsYWNrIiwgeWxpbT1jKDAsIDAuNikpCgojIEFkZGluZyBhIGRlbnNpdHkgbGluZQpsaW5lcyhkZW5zaXR5KGdlbmVyYXRlZF92YWx1ZXMpLCBjb2w9ImJsdWUiLCBsd2Q9MikKY2F0KCJUaGUgaGlzdG9ncmFtIGZyb20gNGMsIHNoYXBlZCBieSB0aGUgZXhwb25lbnRpYWwtbGlrZSBkaXN0cmlidXRpb24KRih4KSwgbGlrZWx5IHNob3dzIGEgcHJvbm91bmNlZCBza2V3IHRvd2FyZHMgbG93ZXIgdmFsdWVzLCBkaXZlcmdpbmcgZnJvbSB0aGUgbW9yZSBldmVubHkgc3ByZWFkIHZhbHVlcyBvZiB0aGUgZ2VuZXJhdG9yIGluIDMoZSksIHdoaWNoIGFpbWVkIGZvciB1bmlmb3JtaXR5LklmIHRoZSBoaXN0b2dyYW0gZnJvbSAzKGUpIGhhZCByZWxhdGl2ZWx5IGNvbnNpc3RlbnQgYmFyIGhlaWdodHMsIGl0J2QgaW5kaWNhdGUgdGhlIExDRydzIHN1Y2Nlc3MgYXQgYXBwcm94aW1hdGluZyBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uOyBpbiBjb250cmFzdCwgdmFyeWluZyBiYXIgaGVpZ2h0cyBpbiA0YydzIGhpc3RvZ3JhbSBhcmUgZXhwZWN0ZWQgZ2l2ZW4gaXRzIG5vbi11bmlmb3JtIHRhcmdldCBkaXN0cmlidXRpb24uIikKCmBgYAoKIyBRdWVzdGlvbiA1LiBEZXZlbG9wIGEgTW9udGUgQ2FybG8gc2ltdWxhdGlvbiBpbiBSIHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgdW5pZm9ybSBbMCwxXSByYW5kb20gbnVtYmVycyB0aGF0IG11c3QgYmUgc3VtbWVkIHRvIGdldCBhIHN1bSBncmVhdGVyIHRoYW4gMS4gUnVuIGEgc2luZ2xlIHNpbXVsYXRpb24gd2l0aCBuID0gMTAsMDAwIHRpbWVzIGFuZCBmaW5kIHRoZSBtZWFuIG9mIHRoZSBudW1iZXIgb2YgY291bnRzLiBEbyB5b3UgdGhpbmsgdGhpcyBudW1iZXIgbG9va3Mgc29tZXdoYXQgZmFtaWxpYXIuIEV2ZXJ5IHN0dWRlbnQgbWlnaHQgZ2V0IHNsaWdodGx5IGRpZmZlcmVudCB2YWx1ZSBhbnkgaWRlYXMgd2h5PwpgYGB7cn0KI0Fuc3dlcgptb250ZV9jYXJsb19zaW11bGF0aW9uIDwtIGZ1bmN0aW9uKCkgewogIHN1bSA8LSAwCiAgY291bnQgPC0gMAogIHdoaWxlKHN1bSA8PSAxKSB7CiAgICBzdW0gPC0gc3VtICsgcnVuaWYoMSkgIyBHZW5lcmF0ZSBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxCiAgICBjb3VudCA8LSBjb3VudCArIDEKICB9CiAgcmV0dXJuKGNvdW50KQp9CgoKbiA8LSAxMDAwMApyZXN1bHRzIDwtIHJlcGxpY2F0ZShuLCBtb250ZV9jYXJsb19zaW11bGF0aW9uKCkpCgojIEZpbmRpbmcgdGhlIG1lYW4gY291bnQKbWVhbl9jb3VudCA8LSBtZWFuKHJlc3VsdHMpCnByaW50KG1lYW5fY291bnQpCgpgYGAKCiMgUXVlc3Rpb24gNi4gRm9yIG91ciBzcGVjaWZpYyByYW5kb20gdmFyaWFibGUsIHdlIGtub3cgdGhhdCBpdHMgUERGIGlzIGRlZmluZWQgYnkgdGhlIGZ1bmN0aW9uICRmKHgpID0gMTB4KDEteCkkLiBVdGlsaXplIHRoZSBhY2NlcHQtcmVqZWN0IGFsZ29yaXRobSB0byBkcmF3IHNhbXBsZXMgZnJvbSB0aGlzIGRpc3RyaWJ1dGlvbi4gVGFrZSBhIGxvb2sgYXQgTGVjdHVyZSAxMCBzbGlkZSA4IGFuZCA5CgpgYGB7cn0KI0Fuc3dlcgpmIDwtIGZ1bmN0aW9uKHgpIHsKICByZXR1cm4oMTAqeCooMS14KSkKfQoKIyBVc2luZyB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBhcyBwcm9wb3NhbCBkaXN0cmlidXRpb24KZyA8LSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuKDEpCn0KCiMgRmluZGluZyBjCnhfdmFsdWVzIDwtIHNlcSgwLCAxLCAwLjAxKQpjIDwtIG1heChmKHhfdmFsdWVzKSkKCmFjY2VwdF9yZWplY3Rfc2FtcGxpbmcgPC0gZnVuY3Rpb24obikgewogIHNhbXBsZXMgPC0gbnVtZXJpYyhuKQogIGNvdW50IDwtIDAKICB3aGlsZShjb3VudCA8IG4pIHsKICAgIFggPC0gcnVuaWYoMSkKICAgIFUgPC0gcnVuaWYoMSkKICAgIGlmKFUgPD0gZihYKSAvIChjICogZyhYKSkpIHsKICAgICAgY291bnQgPC0gY291bnQgKyAxCiAgICAgIHNhbXBsZXNbY291bnRdIDwtIFgKICAgIH0KICB9CiAgcmV0dXJuKHNhbXBsZXMpCn0KCiMgRHJhd2luZyBzYW1wbGVzCnNhbXBsZXMgPC0gYWNjZXB0X3JlamVjdF9zYW1wbGluZygxMDAwMCkKaGlzdChzYW1wbGVzLCBtYWluPSJIaXN0b2dyYW0gb2YgU2FtcGxlcyIsIHhsYWI9IngiLCBicmVha3M9MTAsIGNvbD0ibGlnaHRibHVlIiwgYm9yZGVyPSJibGFjayIpCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAxIChiKSA8L3NwYW4+CmBgYHtyfQojQW5zd2VyCgpgYGAKCg==