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
#Interpretation
cat("Interpretation", "here goes my interpretation")
Interpretation here goes my interpretation
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.
Quesion 2 (a) What is the probability an
operator can process 20 calls in an hour? Repeat for 30 calls in an
hour?
#Answer 2a
# Define the parameters
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+CmBgYHtyfQojQW5zd2VyIDFjCm4gPC0gMjQgIAprIDwtIDMgICAKcCA8LSAuMSAgCgpwcm9iIDwtIDEgLSBwYmlub20oaywgbiwgcCkKCnByaW50KHByb2IpCgoKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoZCkgV2hhdCBpcyB0aGUgbWVkaWFuIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhlIG1lZGlhbiB2YWx1ZT8gPC9zcGFuPgpgYGB7cn0KI0Fuc3dlciAxZAoKbiA8LSAyNApwIDwtIDAuOQoKCm1lZGlhbl92YWwgPC0gcWJpbm9tKDAuNSwgbiwgcCkKCgpjYXQoIk1lZGlhbiBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM6IiwgbWVkaWFuX3ZhbCwgIlxuIikKCmNhdCgiSXQgaXMgdGhlIG1pZGRsZSB2YWx1ZSBvZiBCaXRzIHJlY2lldmVkIikKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGUpICBXaGF0IGlzIHRoZSA2MHRoIHF1YW50aWxlIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhpcyB2YWx1ZT88L3NwYW4+CmBgYHtyfQojQW5zd2VyIDFlCgpuIDwtIDI0CnAgPC0gMC45CgoKcXVhbnRpbGVfNjAgPC0gcWJpbm9tKDAuNiwgbiwgcCkKCgpjYXQoIjYwdGggcXVhbnRpbGUgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM6IiwgcXVhbnRpbGVfNjAsICJcbiIpCgoKY2F0KCJJdCBtZWFucyB0aGF0IDYwJSBvZiB0aGUgZGF0YSBpcyBiZWxvdyB0aGlzIHBvaW50IikKYGBgCgojIFF1ZXN0aW9uMi4gVGhlIFB1YmxpYyBTZXJ2aWNlIEFuc3dlcmluZyBQb2ludCAoUFNBUCkgaW4gU2FuIEZyYW5jaXNjbyBlbXBsb3lzICQxOSQgb3BlcmF0b3JzIGluICQ4JC1ob3VyIHNoaWZ0cyB0byBwcm9jZXNzICQ5MTEkIGNhbGxzLiBUaGVyZSBhcmUgYXQgbGVhc3QgJDUkIG9wZXJhdG9ycyBhbHdheXMgYW5zd2VyaW5nIGNhbGxzLiBUaGUgbnVtYmVyIG9mIGNhbGxzIHByb2Nlc3NlZCBwZXIgb3BlcmF0b3IgY2FuIGJlIG1vZGVsZWQgd2l0aCBhIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlIHdpdGggcmF0ZSAkXGxhbWJkYV8wID0yMCQgY2FsbHMgcGVyIGhvdXIuCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAyIChhKSBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBhbiBvcGVyYXRvciBjYW4gcHJvY2VzcyAyMCBjYWxscyBpbiBhbiBob3VyPyBSZXBlYXQgZm9yIDMwIGNhbGxzIGluIGFuIGhvdXI/IDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgMmEKCmxhbWJkYV8wIDwtIDIwCgoKcDIwY2FsbHMgPC0gZHBvaXMoMjAsIGxhbWJkYT1sYW1iZGFfMCkKCgpwMzBjYWxscyA8LSBkcG9pcygzMCwgbGFtYmRhPWxhbWJkYV8wKQoKCmNhdCgiMjBjYWxsczoiLHAyMGNhbGxzKQpjYXQoIjMwY2FsbHM6IixwMzBjYWxscykKCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAyIChiKSBHaXZlbiB0aGF0IDI0MCBjYWxscyBvY2N1cnJlZCBpbiBhbiBob3VyLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSB0ZW4gb3BlcmF0b3JzIGNhbiBwcm9jZXNzIHRoZW0gYWxsIGFzc3VtaW5nIHRoZXkgYXJlIHNwbGl0IGVxdWFsbHkgYW1vbmcgdGhlIG9wZXJhdG9ycz88L3NwYW4+CmBgYHtyfQojQW5zd2VyIDJiCmxhbWJkYV8wIDwtIDIwCnByb2Jfb25lX29wZXJhdG9yIDwtIGRwb2lzKDI0LCBsYW1iZGFfMCkKcHJvYl90ZW5fb3BlcmF0b3JzIDwtIHByb2Jfb25lX29wZXJhdG9yCgpjYXQoInByb2JhYmlsaXR5IHRoYXQgdGhlIHRlbiBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgdGhlbSBhbGwiLHByb2JfdGVuX29wZXJhdG9ycykKCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAyIChjKSBOb3csIElmIHRoZSBhZ2dyZWdhdGUgY2FsbCByYXRlIHBlciBob3VyICRcbGFtYmRhX2MkICwgaXMgbWVhc3VyZWQgYnkgJFxsYW1iZGFfYyA9IDg1JCBjYWxscyBwZXIgaG91ciwgd2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuICQxMDAkIGNhbGxzIGluIGFuIGhvdXI8L3NwYW4+CmBgYHtyfQojQW5zd2VyIApsYW1iZGFfYyA8LSA4NQpsZXNzdGhhbiA8LSBwcG9pcygxMDAsIGxhbWJkYT1sYW1iZGFfYykKbW9yZXRoYW4gPC0gMSAtIGxlc3N0aGFuCm1vcmV0aGFuCgoKYGBgCgojIFF1ZXN0aW9uIDMuIEZvciB0aGUgdHdvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGJlbG93IEEgYW5kIEIoZG9u4oCZdCBmb3JnZXQgdG8gYWRkIHlvdXIgUiBjb2RlKQojIyMgLSBbQV0gXChaX2kgPSAoOVpfe2ktMX0gKyAxKSBcbW9kIDE2XCkgd2l0aCBcKFpfMCA9IDVcKS4KIyMjIC0gW0JdIFwoWl9pID0gKDdaX3tpLTF9ICsgMykgXG1vZCAzMlwpIHdpdGggXChaXzAgPSAxMFwpLAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGEpIENvbXB1dGUgJFpfaSQgYW5kICRVX2kkIGZvciB2YWx1ZXMgb2YgJGkkIHVudGlsIGEgbnVtYmVyIGlzIHJlcGVhdGVkLCB3aGF0IGlzIHRoZSBwZXJpb2Qgb2YgYm90aCB0aGUgZ2VuZXJhdG9yPyBQcm92aWRlIHlvdXIgY29tbWVudHMgYWJvdXQgdGhlIHBlcmlvZCBvZiBib3RoIFJHTiA8L3NwYW4+CgpgYGB7cn0KI0Fuc3dlciAzYQojIEdlbmVyYXRvciBBClpfMF9BIDwtIDUKWl92YWx1ZXNfQSA8LSBjKFpfMF9BKQpVX3ZhbHVlc19BIDwtIGMoWl8wX0EgLyAxNikKCndoaWxlKFRSVUUpIHsKICBaX25leHRfQSA8LSAoOSAqIFpfdmFsdWVzX0FbbGVuZ3RoKFpfdmFsdWVzX0EpXSArIDEpICUlIDE2CiAgaWYoWl9uZXh0X0EgJWluJSBaX3ZhbHVlc19BKSBicmVhawogIFpfdmFsdWVzX0EgPC0gYXBwZW5kKFpfdmFsdWVzX0EsIFpfbmV4dF9BKQogIFVfdmFsdWVzX0EgPC0gYXBwZW5kKFVfdmFsdWVzX0EsIFpfbmV4dF9BIC8gMTYpCn0KCgpjYXQoIlBlcmlvZCBvZiBBICIscGVyaW9kX0EpCgojIEdlbmVyYXRvciBCClpfMF9CIDwtIDEwClpfdmFsdWVzX0IgPC0gYyhaXzBfQikKVV92YWx1ZXNfQiA8LSBjKFpfMF9CIC8gMzIpCgp3aGlsZShUUlVFKSB7CiAgWl9uZXh0X0IgPC0gKDcgKiBaX3ZhbHVlc19CW2xlbmd0aChaX3ZhbHVlc19CKV0gKyAzKSAlJSAzMgogIGlmKFpfbmV4dF9CICVpbiUgWl92YWx1ZXNfQikgYnJlYWsKICBaX3ZhbHVlc19CIDwtIGFwcGVuZChaX3ZhbHVlc19CLCBaX25leHRfQikKICBVX3ZhbHVlc19CIDwtIGFwcGVuZChVX3ZhbHVlc19CLCBaX25leHRfQiAvIDMyKQp9CgoKY2F0KCIgLFBlcmlvZCBvZiBCICIscGVyaW9kX0IpCgoKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMyAoYikgV2hpY2ggb2YgdGhlc2UgcGFyYW1ldGVycyBlZmZlY3QgdGhlIHBlcmlvZCBvZiBMQ0cg4oCTICRhJCwgJGIkLCAkWl8wJCA8L3NwYW4+CmBgYHtyfQojQW5zd2VyIApjYXQoIkFuc3dlciBhLGIgYW5kIFoiLCAiIikKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMyAoYykgRm9yIGJvdGggZ2VuZXJhdG9ycyBwbG90IGEgc2NhdHRlciBkaWFncmFtIG9mIHRoZSBaaSB2YWx1ZXMgMSBhcGFydC4gV2hhdCBhcmUgeW91ciBvYnNlcnZhdGlvbnMgZnJvbSB0aGVzZSBwbG90cz8gV2hhdCBkbyB5b3UgdGhpbmsgYWJvdXQgdGhlIHByb3BlcnR5IG9mIHJhbmRvbW5lc3Mgb2YgdGhlc2UgZ2VuZXJhdG9ycz8gPC9zcGFuPgpgYGB7cn0KI0Fuc3dlcgojIFNjYXR0ZXIgZGlhZ3JhbSBmb3IgR2VuZXJhdG9yIEEKcGxvdChaX3ZhbHVlc19BWy1sZW5ndGgoWl92YWx1ZXNfQSldLCBaX3ZhbHVlc19BWy0xXSwgbWFpbj0iU2NhdHRlciBEaWFncmFtIGZvciBHZW5lcmF0b3IgQSIsIHhsYWI9IlppIiwgeWxhYj0iWmkrMSIsIHBjaD0xOSwgY29sPSJibHVlIikKCiMgU2NhdHRlciBkaWFncmFtIGZvciBHZW5lcmF0b3IgQgpwbG90KFpfdmFsdWVzX0JbLWxlbmd0aChaX3ZhbHVlc19CKV0sIFpfdmFsdWVzX0JbLTFdLCBtYWluPSJTY2F0dGVyIERpYWdyYW0gZm9yIEdlbmVyYXRvciBCIiwgeGxhYj0iWmkiLCB5bGFiPSJaaSsxIiwgcGNoPTE5LCBjb2w9InJlZCIpCgpjYXQoIklmIHRoZSBzY2F0dGVyIGRpYWdyYW0gZm9ybXMgYSBkaXN0aW5jdCBwYXR0ZXJuIChsaWtlIGxpbmVzIG9yIGdyaWRzKSwgdGhlbiB0aGUgZ2VuZXJhdG9yIG1pZ2h0IG5vdCBiZSBwcm9kdWNpbmcgdmVyeSByYW5kb20gbnVtYmVycy4gQSBtb3JlIHJhbmRvbSBzY2F0dGVyaW5nLCB3aGVyZSB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSByZWNvZ25pemFibGUgcGF0dGVybiwgaW5kaWNhdGVzIGEgYmV0dGVyIGxldmVsIG9mIHJhbmRvbW5lc3MgZnJvbSB0aGUgZ2VuZXJhdG9yLgpUaGUgcXVhbGl0eSBvZiByYW5kb21uZXNzIGlzIGp1ZGdlZCBiYXNlZCBvbiBob3cgdW5wcmVkaWN0YWJsZSB0aGUgc2VxdWVuY2VzIGFyZS4gVGhlIG1vcmUgZGlzcGVyc2VkIGFuZCBwYXR0ZXJuLWxlc3MgdGhlIHNjYXR0ZXIgZGlhZ3JhbSwgdGhlIGJldHRlciB0aGUgcmFuZG9tbmVzcy4gSWYgdGhlcmUncyBhIGRpc2Nlcm5pYmxlIHBhdHRlcm4gaW4gdGhlIHNjYXR0ZXIgcGxvdCwgdGhlbiB0aGUgc2VxdWVuY2VzIGZyb20gdGhhdCBnZW5lcmF0b3IgYXJlIG1vcmUgcHJlZGljdGFibGUsIHJlZHVjaW5nIGl0cyBxdWFsaXR5IGFzIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuIikKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGQpIFJhbmRvbW5lc3Mgb2YgZGVmYXVsdCByYW5kb20gZ2VuZXJhdG9yIG9mIFIg4oCTIFJ1biBydW5pZiBjb21tYW5kIHRvIGdlbmVyYXRlIDEwMCByYW5kb20gbnVtYmVycyBhbmQgcGxvdCB0aGUgc2NhdHRlciBkaWFncmFtIG9mIHRoZXNlIG51bWJlcnMgKCB2YWx1ZXMgMSBhcGFydCkgYW5kIGRpc2N1c3MgeW91ciBvYnNlcnZhdGlvbnMgYWJvdXQgcmFuZG9tbmVzcyBvZiB0aGlzIHJhbmRvbSBnZW5lcmF0b3IuIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKCnJhbmRvbV9udW1iZXJzIDwtIHJ1bmlmKDEwMCkKCgpwbG90KHJhbmRvbV9udW1iZXJzWy0xMDBdLCByYW5kb21fbnVtYmVyc1stMV0sY29sPSJ5ZWxsb3ciLCB4bGFiPSJWYWx1ZSBhdCBpIiwgeWxhYj0iVmFsdWUgYXQgaSsxIiwgbWFpbj0iU2NhdHRlciBEaWFncmFtIG9mIFJhbmRvbSBOdW1iZXJzICgxIEFwYXJ0KSIpCgoKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGUpIENvbXB1dGUgdGhlIG1lYW4gdmFsdWUgb2YgJFVfaSQgYWNyb3NzIHRoZSBwZXJpb2Q8L3NwYW4+CmBgYHtyfQojQW5zd2VyClogPC0gNSAgClpfdmFsdWVzX0EgPC0gYyhaKQptX0EgPC0gMTYgIAoKCndoaWxlIChUUlVFKSB7CiAgWiA8LSAoOSAqIFogKyAxKSAlJSBtX0EKICBpZiAoWiAlaW4lIFpfdmFsdWVzX0EpIHsKICAgIGJyZWFrCiAgfQogIFpfdmFsdWVzX0EgPC0gYyhaX3ZhbHVlc19BLCBaKQp9CgoKVV92YWx1ZXNfQSA8LSBaX3ZhbHVlc19BIC8gbV9BCm1lYW5fVV9BIDwtIG1lYW4oVV92YWx1ZXNfQSkKCgpjYXQoIk1lYW4gQSIsbWVhbl9VX0EpCgpaIDwtIDEwICAjIFN0YXJ0aW5nIHZhbHVlClpfdmFsdWVzX0IgPC0gYyhaKQptX0IgPC0gMzIgICMgTW9kdWx1cwoKCndoaWxlIChUUlVFKSB7CiAgWiA8LSAoNyAqIFogKyAzKSAlJSBtX0IKICBpZiAoWiAlaW4lIFpfdmFsdWVzX0IpIHsKICAgIGJyZWFrCiAgfQogIFpfdmFsdWVzX0IgPC0gYyhaX3ZhbHVlc19CLCBaKQp9CgojIENvbXB1dGluZyBVX2kgdmFsdWVzIGFuZCBtZWFuIGZvciBHZW5lcmF0b3IgQgpVX3ZhbHVlc19CIDwtIFpfdmFsdWVzX0IgLyBtX0IKbWVhbl9VX0IgPC0gbWVhbihVX3ZhbHVlc19CKQoKCmNhdCgiTWVhbiBCIixtZWFuX1VfQikKCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChmKSBCeSBwcm92aWRpbmcgYSBwbG90IG9mIGRlbnNpdHkgKGhpc3RvZ3JhbSkgZGlzY3VzcyB0aGUgdW5pZm9ybWl0eSBvZiBib3RoIG9mIHRoZSBnZW5lcmF0b3JzIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKIyBQbG90IGhpc3RvZ3JhbSBmb3IgVV92YWx1ZXNfQQpoaXN0KFVfdmFsdWVzX0EsIGJyZWFrcz0yMCwgbWFpbj0iSGlzdG9ncmFtIG9mIFVfaSBWYWx1ZXMgZm9yIEdlbmVyYXRvciBBIiwgeGxhYj0iVV9pIiwgY29sPSJsaWdodGJsdWUiLCBwcm9iYWJpbGl0eT1UUlVFLCBib3JkZXI9ImJsYWNrIikKCiMgQWRkaW5nIGEgZGVuc2l0eSBsaW5lCmxpbmVzKGRlbnNpdHkoVV92YWx1ZXNfQSksIGNvbD0iYmx1ZSIsIGx3ZD0yKQoKIyBQbG90IGhpc3RvZ3JhbSBmb3IgVV92YWx1ZXNfQgpoaXN0KFVfdmFsdWVzX0IsIGJyZWFrcz0yMCwgbWFpbj0iSGlzdG9ncmFtIG9mIFVfaSBWYWx1ZXMgZm9yIEdlbmVyYXRvciBCIiwgeGxhYj0iVV9pIiwgY29sPSJsaWdodGdyZWVuIiwgcHJvYmFiaWxpdHk9VFJVRSwgYm9yZGVyPSJibGFjayIpCgojIEFkZGluZyBhIGRlbnNpdHkgbGluZQpsaW5lcyhkZW5zaXR5KFVfdmFsdWVzX0IpLCBjb2w9ImdyZWVuIiwgbHdkPTIpCgoKYGBgCgojIFF1ZXN0aW9uIDQuIFVzaW5nIHRoZSBpbnZlcnNlIHRyYW5zZm9ybSBtZXRob2QKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzdGlvbiA0LihhKSBEZXZlbG9wIGFuIGFsZ29yaXRobSBmb3IgdGhlIHJhbmRvbSB2YXJpYWJsZSB3aXRoIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIEYoeCkgYmVsb3cuPC9zcGFuPgoKXFsgRih4KSA9IDEgLSBlXnstKHgvXGxhbWJkYSlea30gXF0KCndoZXJlIFwoIHggXGdlcSAwIFwpLCBcKCBcbGFtYmRhIFxnZXEgMCBcKSwgYW5kIFwoIGsgXGdlcSAwIFwpLgoKYGBge3J9CiMgQW5zd2VyIDRhCiMgVGhpcyBtaWdodCBiZSBoYXJkIHRvIHByaW50IHVzaW5nIFIgLSB5b3UgY2FuIHdyaXRlIHRoZSBzdGVwIGluIHlvdXIgbm90ZWJvb2sgYW5kIHRoZW4gaW5jbHVkZSBpbWFnZSBoZXJlIC8gb3IgeW91IGNhbiBpbmNsdWRlIGFzIHNlcGVyYXRlIGZpbGUgd2hlbiB1cGxvYWQKCgppZiAoIXJlcXVpcmUoSVJkaXNwbGF5LCBxdWlldGx5ID0gVFJVRSkpIHsKICAKICBpbnN0YWxsLnBhY2thZ2VzKCJJUmRpc3BsYXkiKQogIAogIAogIGxpYnJhcnkoSVJkaXNwbGF5KQp9IGVsc2UgewogIAogIGxpYnJhcnkoSVJkaXNwbGF5KQp9CgppbnZlcnNlX3RyYW5zZm9ybV9tZXRob2QgPC0gZnVuY3Rpb24obGFtYmRhLCBrLCBuKSB7CiAgIyBuIGlzIHRoZSBudW1iZXIgb2YgcmFuZG9tIG51bWJlcnMgeW91IHdhbnQgdG8gZ2VuZXJhdGUKICAKICAKICBVIDwtIHJ1bmlmKG4pCiAgCiAgIyBBcHBseSB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0KICB4IDwtIGxhbWJkYSAqICgtbG9nKDEgLSBVKSleKDEvaykKICAKICByZXR1cm4oeCkKfQoKCnJhbmRvbV9udW1iZXJzIDwtIGludmVyc2VfdHJhbnNmb3JtX21ldGhvZChsYW1iZGEgPSAxLCBrID0gMiwgbiA9IDEwMDApCmhpc3QocmFuZG9tX251bWJlcnMsIG1haW49Ikhpc3RvZ3JhbSBvZiBHZW5lcmF0ZWQgUmFuZG9tIE51bWJlcnMiLCB4bGFiPSJ4IiwgYnJlYWtzPTUwLCBjb2w9ImxpZ2h0Ymx1ZSIsIGJvcmRlcj0iYmxhY2siKQoKCiMgRW1iZWQgYW4gaW1hZ2UKI2Rpc3BsYXlfcG5nKGZpbGUgPSAiZXhhbXBsZS5wbmciKQoKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDQgKGIpIFVzZSB0aGUgZmlyc3QgdGhyZWUgVWkgdmFsdWVzIGZyb20gcGFydCAoYSkgYW5kIGdlbmVyYXRvciBbQV0gb2YgcHJldmlvdXMgcHJvYmxlbSB0byBjcmVhdGUgMyB2YWx1ZXMgZnJvbSB0aGUgcmFuZG9tIHZhcmlhYmxlIHdoZW4sICRcbGFtYmRhID0gMSQsICTwnZGYID0gNSQ8L3NwYW4+CmBgYHtyfQojQW5zd2VyCgpaIDwtIDUgIApaX3ZhbHVlc19BIDwtIGMoWikKbV9BIDwtIDE2ICAKCmZvcihpIGluIDE6MikgewogIFogPC0gKDkgKiBaICsgMSkgJSUgbV9BCiAgWl92YWx1ZXNfQSA8LSBjKFpfdmFsdWVzX0EsIFopCn0KCgpVX3ZhbHVlc19BIDwtIFpfdmFsdWVzX0EgLyBtX0EKCgpsYW1iZGEgPC0gMQprIDwtIDUKeF92YWx1ZXMgPC0gbGFtYmRhICogKC1sb2coMSAtIFVfdmFsdWVzX0FbMTozXSkpXigxL2spCgpwcmludCh4X3ZhbHVlcykKCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiA0IChjKSBzaW5nIFIgZ2VuZXJhdGUgMTAsMDAwIHZhbHVlcyBmcm9tIHlvdXIgYWxnb3JpdGhtIHdoZW4gIFxsYW1iZGEgPSAxICwg8J2RmCA9IDUgIGFuZCBwbG90IGEgaGlzdG9ncmFtIG9mIHRoZSBkZW5zaXR5LiBEaXNjdXNzIHdoYXQgaW5zaWdodHMgeW91IG9idGFpbiB3aGVuIHlvdSBsb29rIGF0IHRoZSBwbG90IGdlbmVyYXRlZCBoZXJlIHZzIHRoZSBwbG90IHlvdSBnZW5lcmF0ZWQgaW4gcXVlc3Rpb24gMyAoZSkgPC9zcGFuPgpgYGB7cn0KI0Fuc3dlcgoKZ2VuZXJhdGVfdmFsdWVzIDwtIGZ1bmN0aW9uKGxhbWJkYSwgaywgbikgewogIFUgPC0gcnVuaWYobikgICMgR2VuZXJhdGUgbiB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgcmFuZG9tIG51bWJlcnMKICAKIAogIHggPC0gbGFtYmRhICogKC1sb2coMSAtIFUpKV4oMS9rKQogIHJldHVybih4KQp9CgoKbGFtYmRhIDwtIDEKayA8LSA1Cm4gPC0gMTAwMDAKZ2VuZXJhdGVkX3ZhbHVlcyA8LSBnZW5lcmF0ZV92YWx1ZXMobGFtYmRhLCBrLCBuKQoKIyBQbG90IHRoZSBoaXN0b2dyYW0KaGlzdChnZW5lcmF0ZWRfdmFsdWVzLCBtYWluPSJIaXN0b2dyYW0gZm9yIEludmVyc2UgVHJhbnNmb3JtIEdlbmVyYXRlZCBWYWx1ZXMiLCB4bGFiPSJ4IiwgYnJlYWtzPTUwLCBwcm9iYWJpbGl0eT1UUlVFLCBjb2w9ImxpZ2h0Ymx1ZSIsIGJvcmRlcj0iYmxhY2siLCB5bGltPWMoMCwgMC42KSkKCiMgQWRkaW5nIGEgZGVuc2l0eSBsaW5lCmxpbmVzKGRlbnNpdHkoZ2VuZXJhdGVkX3ZhbHVlcyksIGNvbD0iYmx1ZSIsIGx3ZD0yKQpjYXQoIlRoZSBoaXN0b2dyYW0gZnJvbSA0Yywgc2hhcGVkIGJ5IHRoZSBleHBvbmVudGlhbC1saWtlIGRpc3RyaWJ1dGlvbgpGKHgpLCBsaWtlbHkgc2hvd3MgYSBwcm9ub3VuY2VkIHNrZXcgdG93YXJkcyBsb3dlciB2YWx1ZXMsIGRpdmVyZ2luZyBmcm9tIHRoZSBtb3JlIGV2ZW5seSBzcHJlYWQgdmFsdWVzIG9mIHRoZSBnZW5lcmF0b3IgaW4gMyhlKSwgd2hpY2ggYWltZWQgZm9yIHVuaWZvcm1pdHkuSWYgdGhlIGhpc3RvZ3JhbSBmcm9tIDMoZSkgaGFkIHJlbGF0aXZlbHkgY29uc2lzdGVudCBiYXIgaGVpZ2h0cywgaXQnZCBpbmRpY2F0ZSB0aGUgTENHJ3Mgc3VjY2VzcyBhdCBhcHByb3hpbWF0aW5nIGEgdW5pZm9ybSBkaXN0cmlidXRpb247IGluIGNvbnRyYXN0LCB2YXJ5aW5nIGJhciBoZWlnaHRzIGluIDRjJ3MgaGlzdG9ncmFtIGFyZSBleHBlY3RlZCBnaXZlbiBpdHMgbm9uLXVuaWZvcm0gdGFyZ2V0IGRpc3RyaWJ1dGlvbi4iKQoKYGBgCgojIFF1ZXN0aW9uIDUuIERldmVsb3AgYSBNb250ZSBDYXJsbyBzaW11bGF0aW9uIGluIFIgdGhhdCBjb3VudHMgdGhlIG51bWJlciBvZiB1bmlmb3JtIFswLDFdIHJhbmRvbSBudW1iZXJzIHRoYXQgbXVzdCBiZSBzdW1tZWQgdG8gZ2V0IGEgc3VtIGdyZWF0ZXIgdGhhbiAxLiBSdW4gYSBzaW5nbGUgc2ltdWxhdGlvbiB3aXRoIG4gPSAxMCwwMDAgdGltZXMgYW5kIGZpbmQgdGhlIG1lYW4gb2YgdGhlIG51bWJlciBvZiBjb3VudHMuIERvIHlvdSB0aGluayB0aGlzIG51bWJlciBsb29rcyBzb21ld2hhdCBmYW1pbGlhci4gRXZlcnkgc3R1ZGVudCBtaWdodCBnZXQgc2xpZ2h0bHkgZGlmZmVyZW50IHZhbHVlIGFueSBpZGVhcyB3aHk/CmBgYHtyfQojQW5zd2VyCm1vbnRlX2NhcmxvX3NpbXVsYXRpb24gPC0gZnVuY3Rpb24oKSB7CiAgc3VtIDwtIDAKICBjb3VudCA8LSAwCiAgd2hpbGUoc3VtIDw9IDEpIHsKICAgIHN1bSA8LSBzdW0gKyBydW5pZigxKSAjIEdlbmVyYXRlIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEKICAgIGNvdW50IDwtIGNvdW50ICsgMQogIH0KICByZXR1cm4oY291bnQpCn0KCgpuIDwtIDEwMDAwCnJlc3VsdHMgPC0gcmVwbGljYXRlKG4sIG1vbnRlX2NhcmxvX3NpbXVsYXRpb24oKSkKCiMgRmluZGluZyB0aGUgbWVhbiBjb3VudAptZWFuX2NvdW50IDwtIG1lYW4ocmVzdWx0cykKcHJpbnQobWVhbl9jb3VudCkKCmBgYAoKIyBRdWVzdGlvbiA2LiBGb3Igb3VyIHNwZWNpZmljIHJhbmRvbSB2YXJpYWJsZSwgd2Uga25vdyB0aGF0IGl0cyBQREYgaXMgZGVmaW5lZCBieSB0aGUgZnVuY3Rpb24gJGYoeCkgPSAxMHgoMS14KSQuIFV0aWxpemUgdGhlIGFjY2VwdC1yZWplY3QgYWxnb3JpdGhtIHRvIGRyYXcgc2FtcGxlcyBmcm9tIHRoaXMgZGlzdHJpYnV0aW9uLiBUYWtlIGEgbG9vayBhdCBMZWN0dXJlIDEwIHNsaWRlIDggYW5kIDkKCmBgYHtyfQojQW5zd2VyCmYgPC0gZnVuY3Rpb24oeCkgewogIHJldHVybigxMCp4KigxLXgpKQp9CgojIFVzaW5nIHVuaWZvcm0gZGlzdHJpYnV0aW9uIGFzIHByb3Bvc2FsIGRpc3RyaWJ1dGlvbgpnIDwtIGZ1bmN0aW9uKHgpIHsKICByZXR1cm4oMSkKfQoKIyBGaW5kaW5nIGMKeF92YWx1ZXMgPC0gc2VxKDAsIDEsIDAuMDEpCmMgPC0gbWF4KGYoeF92YWx1ZXMpKQoKYWNjZXB0X3JlamVjdF9zYW1wbGluZyA8LSBmdW5jdGlvbihuKSB7CiAgc2FtcGxlcyA8LSBudW1lcmljKG4pCiAgY291bnQgPC0gMAogIHdoaWxlKGNvdW50IDwgbikgewogICAgWCA8LSBydW5pZigxKQogICAgVSA8LSBydW5pZigxKQogICAgaWYoVSA8PSBmKFgpIC8gKGMgKiBnKFgpKSkgewogICAgICBjb3VudCA8LSBjb3VudCArIDEKICAgICAgc2FtcGxlc1tjb3VudF0gPC0gWAogICAgfQogIH0KICByZXR1cm4oc2FtcGxlcykKfQoKIyBEcmF3aW5nIHNhbXBsZXMKc2FtcGxlcyA8LSBhY2NlcHRfcmVqZWN0X3NhbXBsaW5nKDEwMDAwKQpoaXN0KHNhbXBsZXMsIG1haW49Ikhpc3RvZ3JhbSBvZiBTYW1wbGVzIiwgeGxhYj0ieCIsIGJyZWFrcz0xMCwgY29sPSJsaWdodGJsdWUiLCBib3JkZXI9ImJsYWNrIikKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGIpIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKCmBgYAoK