#Author1: Henrik Jul Winter, Germany #Author2:Gerard Borell Araunabena, Spain #submission date: 01.12.2024 #Date of revision: #Date of acceptance:

#L1 library(quantmod)

Define date range

start_date <- “2024-05-01” end_date <- “2024-09-30”

Initialize an empty data frame

summary_table <- data.frame( Metric = character(), Start_Value = character(), End_Value = character() )

Helper function to populate the summary table

append_row <- function(label, values) { summary_table <<- rbind(summary_table, data.frame( Metric = label, Start_Value = as.character(format(round(values[1], 2), nsmall = 2)), End_Value = as.character(format(round(values[2], 2), nsmall = 2)) )) }

Download and process stock data for Tesla (TSLA)

getSymbols(“TSLA”, src = “yahoo”, from = start_date, to = end_date) tesla_start <- TSLA[1, “TSLA.Close”] tesla_end <- TSLA[nrow(TSLA), “TSLA.Close”] append_row(“Tesla (TSLA) Closing Price:”, c(tesla_start, tesla_end))

Download and process stock data for Microsoft (MSFT)

getSymbols(“MSFT”, src = “yahoo”, from = start_date, to = end_date) msft_start <- MSFT[1, “MSFT.Close”] msft_end <- MSFT[nrow(MSFT), “MSFT.Close”] append_row(“Microsoft (MSFT) Closing Price:”, c(msft_start, msft_end))

Download and process the Dow Jones Industrial Average (DJIA) index

getSymbols(“^DJI”, src = “yahoo”, from = start_date, to = end_date) djia_start <- DJI[1, “DJI.Close”] djia_end <- DJI[nrow(DJI), “DJI.Close”] append_row(“Dow Jones Industrial Average (DJIA):”, c(djia_start, djia_end))

Prime rate data from FRED

getSymbols(“DPRIME”, src = “FRED”, from = start_date, to = end_date) prime_start <- DPRIME[1, 1] prime_end <- DPRIME[nrow(DPRIME), 1] append_row(“Prime Rate:”, c(prime_start, prime_end))

Federal Funds Rate

getSymbols(“FEDFUNDS”, src = “FRED”, from = start_date, to = end_date) fed_start <- FEDFUNDS[1, 1] fed_end <- FEDFUNDS[nrow(FEDFUNDS), 1] append_row(“Federal Funds Rate:”, c(fed_start, fed_end))

13-week Treasury Bill Rate

getSymbols(“DTB3”, src = “FRED”, from = start_date, to = end_date) tbill_13wk_start <- DTB3[1, 1] tbill_13wk_end <- DTB3[nrow(DTB3), 1] append_row(“13-Week Treasury Bill Rate:”, c(tbill_13wk_start, tbill_13wk_end))

6-month Treasury Bill Rate

getSymbols(“DTB6”, src = “FRED”, from = start_date, to = end_date) tbill_6m_start <- DTB6[1, 1] tbill_6m_end <- DTB6[nrow(DTB6), 1] append_row(“6-Month Treasury Bill Rate:”, c(tbill_6m_start, tbill_6m_end))

10-Year Treasury Bond Yield

getSymbols(“DGS10”, src = “FRED”, from = start_date, to = end_date) bond_10yr_start <- DGS10[1, 1] bond_10yr_end <- DGS10[nrow(DGS10), 1] append_row(“10-Year Treasury Bond Yield:”, c(bond_10yr_start, bond_10yr_end))

Moody’s Aaa Corporate Bond Yield

getSymbols(“AAA”, src = “FRED”, from = start_date, to = end_date) aaa_yield_start <- AAA[1, 1] aaa_yield_end <- AAA[nrow(AAA), 1] append_row(“Moody’s Aaa Corporate Bond Yield:”, c(aaa_yield_start, aaa_yield_end))

Load data for NASDAQ and London Stock Exchange

getSymbols(c(“^IXIC”, “^FTSE”), src = “yahoo”, from = “2020-01-01”)

Show structure of data

head(IXIC) head(FTSE)

Calculate percentage change relative to start value

ixic_pct_change <- (Cl(IXIC) / as.numeric(Cl(IXIC)[1]) - 1) * 100 ftse_pct_change <- (Cl(FTSE) / as.numeric(Cl(FTSE)[1]) - 1) * 100

Create combined data set

combined_data <- merge.xts(ixic_pct_change, ftse_pct_change) colnames(combined_data) <- c(“NASDAQ”, “FTSE”)

plot percentage change

plot(index(combined_data), combined_data\(NASDAQ, type = "l", col = "blue", lwd = 2, xlab = "Date", ylab = "Percentage Change (%)", main = "NASDAQ vs. FTSE (Percentage Change)") lines(index(combined_data), combined_data\)FTSE, col = “red”, lwd = 2)

Add the labeling

legend(“topright”, legend = c(“NASDAQ”, “FTSE”), col = c(“blue”, “red”), lty = 1, lwd = 2)

Conclusion: While both stock exchanges experienced a similar drop in 2020 due to the

pandemic, the NASDAQ experienced higher growth right after reaching a high

of around 80% at the beginning of 2022. Although it dropped right after, the

percenatage earnings relatiove to 2020 compared to FTSE were always higher.

The FTSE experienced less growth while being less volatile.

L3 Instrument’s overview and valuation L3.1 Compare the 13-week Treasury bill rate (which is a proxy for short-term interest rates) at the end of the school term to the rate that existed at the beginning of the school term. (note: 3-Month Treasury Bill Secondary Market Rate, Discount Basis (TB3MS)) https://fred.stlouisfed.org/series/TclB3MS

Load required library

library(quantmod)

Download 3-Month Treasury Bill Secondary Market Rate (TB3MS) data from FRED

getSymbols(“TB3MS”, src = “FRED”)

Convert the data to a data frame

tb_data <- data.frame(date = index(TB3MS), rate = coredata(TB3MS))

Filter data for the relevant period (May 1, 2024 to September 30, 2024)

filtered_tb_data <- subset(tb_data, date >= “2024-05-01” & date <= “2024-09-30”)

Display the filtered data

cat(“Filtered data:\n”) print(filtered_tb_data)

Check the structure of the filtered data to ensure it contains the expected date and rate columns

str(filtered_tb_data)

Extract rates for May 1, 2024 (known to be available)

rate_may <- filtered_tb_data[filtered_tb_data$date == “2024-05-01”, “TB3MS”] cat(“Rate on May 1, 2024:”, rate_may, “”)

Handle September 30, 2024: Use September 1, 2024, if data for September 30 is unavailable

rate_sept <- filtered_tb_data[filtered_tb_data$date == “2024-09-30”, “TB3MS”]

If no data for September 30, use September 1 as the closest available date

if (length(rate_sept) == 0) { closest_date <- “2024-09-01” rate_sept <- filtered_tb_data[filtered_tb_data$date == closest_date, “TB3MS”] cat(“No data for September 30, 2024. Using data for September 1, 2024 instead.”) } cat(“Rate on September 1, 2024 (used as closest available):”, rate_sept, “”)

Calculate the rate difference if both rates are found

if (length(rate_may) > 0 && length(rate_sept) > 0) { rate_difference <- rate_sept - rate_may cat(“Rate difference:”, rate_difference, “”) } else { cat(“Unable to calculate rate difference due to missing data.”) }

#Result: -0.53 #Explanation: Because there was no data available for September 30 we used September 1 since it was the closest available. #The rate on May 1, 2024 was 5.25% and the rate on September 1, 2024 was 4.72%, meaning it experienced a drop of -0.53%

L#3.2 Why interest rates change over time. I#nterest rates change over time because of shifts in economic conditions, central bank policies, and market dynamics. Central banks adapt rates to control inflation and stimulate or slow down the economy, while inflation expectations and credit-demand are also a factor. Global factors, such as foreign investment and monetary policies of other countries, influence rates, as do supply and demand for bonds. Additionally, risk premiums and long-term expectations about growth or demographics can influence interest rates aswell.

#L4 Efficiency of market and information

#Check if on 26 October 2017 coca cola shares were hit by the adverse information realized on the market. (assume 26 is the information release date) #On October 26, 2017, Coca-Cola’s stock price did not show significant negative impacts from adverse market information. The stock opened at $46.35 and closed slightly higher at $46.48, with a small gain of 0.28%. The trading volume that day was approximately 8.5 million shares, which was in line with typical volumes​ #This suggests that there was no major negative information affecting Coca-Cola shares on that specific date.

#L5 Financial statements and fundamental analysis #Download to R the financial statements of Microsoft 2018, show the code #Access was denied.

#Commercial bank operations #For the commercial bank that you selected at the beginning of the term, use its annual report or any other related information to answer the following questions:

#L5.1 Identify the types of deposits that the commercial bank uses to obtain most of its funds. #Deutsche Bank primarily gets its funds through: #Retail Deposits: Savings accounts, checking accounts, and term deposits from individual customers. #Corporate Deposits: Large deposits from corporate clients and institutions. #Demand Deposits: Non-interest-bearing and interest-bearing accounts. #Time Deposits: Fixed-term accounts that lock in customer funds for a specified period. #Interbank Deposits: Deposits from other banks.

#L5.2 Identify the main uses of funds by the bank. c. Summarize any statements made by the commercial bank in its annual report about how recent or potential regulations will affect its performance. #Main uses of funds:

#Lending: #Loans to individuals (e.g., mortgages, personal loans). #Loans to businesses (all sizes) #Specialized financing such as trade and export finance.

#Investment: #Investments in securities, including government and corporate bonds. #Equity investments in certain cases. #Trading Activities: #Investing in equities, bonds, and derivatives. #Proprietary trading activities.

#Reserves: #Maintaining required reserves with the central bank and liquidity buffers.

#Operational Investments: #Financing infrastructure, technology, and expansion efforts. #Recent annual reports mention the following impacts of regulation:

#Capital Requirements: Implementation of Basel III regulations requires banks to maintain higher levels of Tier 1 capital, affecting profitability and risk management practices.

#Compliance Costs: Increasing costs related to anti-money laundering (AML), know-your-customer (KYC), and environmental, social, and governance (ESG) compliance.

#Banking Union in the EU: Supervision by the European Central Bank has added requirements of oversight, affecting strategic decisions.

#Sustainability Regulations: Growing emphasis on sustainable finance requires alignment with EU Taxonomy Regulation and related disclosures.

#L5.3 Does it appear that the bank is attempting to enter the securities industry by offering securities services? If so, explain how. #Deutsche Bank already offers security services such as Investment-Banking, Asset-Management and Securities Trading. These services are part of its core business and it has gained a lot of recognition for it.

#L5.4 Does it appear that the bank is attempting to enter the insurance industry by offering insurance services? If so, explain how. #Deutsche Bank already provides following insurance-related services: #Bancassurance Partnerships: Collaborates with insurance companies to offer life, health, and property insurance through its banking network. #Wealth Management: Offers insurance-based investment products such as annuities and structured insurance solutions. #Risk Management Products: Offers financial instruments that serve insurance-related purposes, e.g. hedging against adverse risk

#Commercial bank management #L5.5 Assess the bank’s balance sheet as well as any comments in its annual report about the gap between its rate-sensitive assets and its rate-sensitive liabilities. Does it appear that the bank has a positive gap or a negative gap? #It appears that Deutsche Bank has balanced, perhaps slightly positive rate. That is because the Statement #indicates that the Bank profited from higher interest rates, meaning that the intereset sensitive assets #were well set. #However it faces challenges managing sensitive liabilities, leading to a balanced/slightly positive gap.

#L5.6 Determine the bank’s interest income as a percentage of its total assets.

#Total assets 2023: 1.312 trillion € #Interest income 2023: 44.074 billion € #interest_income/total_assets=0,0336=3,36% #L5.7 Determine the bank’s interest expenses as a percentage of its total assets. #30,472bln/1.312 trillion=0,0232=2,32% #L5.8 Determine the bank’s net interest margin. #NIM=((Interest Income−Interest Expense​)/Average Earning Assets)100 #1,40=((44.074bln-30.472bln)/971bln)100

L5.9 Determine the bank’s noninterest income as a percentage of its total assets. Determine the bank’s noninterest expenses (do not include the addition to loan loss reserves here) as a percentage of its total assets.

#15.277bln/1.312trillion=0,0164=1,64%

#L5.10 Determine the bank’s addition to loan loss reserves as a percentage of its total assets.

#5.2bln/1.312 trillion=0,0040=0,40%

#L5.11 Determine the bank’s return on assets.

#0.35%

#L5.12 Determine the bank’s return on equity.

#Profit attributable to shareholders of DB amounts to 4.772bln in 2023 #4.772bln/1.312trillion=0,0036=0,36%

#L5.13 Identify the bank’s income statement items described previously that would be affected if interest rates rise in the next year, and explain how they would be affected.

#Net interest income #-increased interest rates make credits more expensive leading to less individuals or companies taking them. Ultimately, this leads to a lower interest income for the bank. #-At the same time the interest expenses increase for the bank, causing that the margin of interest earnings and expenses does not increase.

#Provision for credit losses #-higher interest rates cost the clients more money in total leading to a increase risk of default. Therefore banks have to account for more loan losses.

#noninterest income #-a change in interest rates always influences investment behavior. this automatically effects the operations of the bank and therefore income sources such as fee and commission income.

#L5.14 Identify the bank’s income statement items described previously that would be affected if U.S. economic conditions deteriorate, and explain how they would be affected

#net interest income #-As Deutsche Bank also operates in the US, a recession which leads to less investments would also affect the bank. Less investments lead to fewer loans and ultimately to fewer interest income

#provision for credit losses -would also increase because in times of crisis the future becomes less predictable and with that also the repayment of loans. To avoid that the bank fails it needs to have liquid reserves to account for credit defaults.

#noninterest income #-e.g. measurements to reduce costs of the bank such as job cuts to react to the new market situation will cost money and therefore reduce the income

#Mutual funds #For the mutual fund that you selected at the beginning of the term, use its prospectus or any other related information to answer the following questions.

#L5.15 What is the investment objective of this mutual fund? Do you consider this mutual fund to have low risk, moderate risk, or high risk?

#The objective of the Vanguard 500 Index Fund is to represent the performance of the S&P 500. Since it covers an entire index, I consider it to have moderate to low risk.

#L5.16 What was the return on the mutual fund last year? What was the average annual return over the last three years?

#Return in 2023: 26.24% #Average annual return 2021-2023: 12.25%

#L5.17 What is a key economic factor that influences the return on this mutual fund? (That is, are the fund’s returns highly influenced by U.S. stock market conditions? By U.S. interest rates? By foreign stock market conditions? By foreign interest rates?)

#Since the S&P 500 is an american index, it’s perfomance is very much influenced by the U.S. stock market conditions and the general economic factors of the U.S. such as interest rates. It is also affected by foreign market and interest conditions because most companies of the S&P 500 operate globally.

#L5.18 Must any fees be paid when buying or selling this mutual fund?

#If you buy the fund through the Vanguard platform then there is seeling or purchasing fee imposed. Depending on the broker you use, a fee can be possible. However there is a 25$ account service fee for accounts of less than 5,000,000$.

#L5.19 What was the expense ratio for this mutual fund over the last year? Does this ratio seem high to you?

#Over the last years it was around 0.04%, which in my opinion is a reasonable price that would not prevent me from investing in the fund especially because the average returns are promising.

#Securities firms #For the securities firm that you selected at the beginning of the term, use its annual report or any other related information to answer the following questions.

#L5.20 What are the main types of business conducted by the securities firm?

#The main typed of business conducted by Goldman Sachs are Global Banking and Asset & Wealth Management. #L5.21 Summarize any statements made by the securities firm in its annual report about how it may be affected by existing or potential regulations. #Goldman Sachs mentioned regulatory oversight as an important factor. This led to Goldman Sachs complying with the Feds capital adequacy standards and adjusting continuously to new regulations. Additionally it is mentioned that they have to consider and manage new risks that comes with scrutiny.

#L5.22 Describe the recent performance of the securities firm, and explain why the performance has been favorable or unfavorable. #In 2024, Goldman Sachs experienced strong performance in investment banking and trading, particularly in equity and fixed-income markets. However, weaker activity in mergers and acquisitions due to worse economic conditions created challenges. The firm’s diversified revenue sources, strengthened by asset management and consumer platforms, helped keep its overall profitability and resilience among these fluctuations.

#L6 Equity (No Task)

#L7 Fixed income #Comparing yields among securities #L7.1 What is the difference between the yield on corporate high-quality bonds and the yield on Treasury bonds at the end of the school term? Explain why does the difference exist? # Install and load necessary packages if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define date range

start_date <- as.Date(“2024-05-01”) end_date <- as.Date(“2024-09-30”)

Download data for Treasury and corporate high-quality bonds

tryCatch({ getSymbols(“DGS10”, src = “FRED”, from = start_date, to = end_date) # 10-year Treasury bond yield getSymbols(“BAMLC0A1CAAAEY”, src = “FRED”, from = start_date, to = end_date) # AAA-rated corporate bond yield

# Extract yields at the end of the school term treasury_yield <- na.omit(DGS10[end_date] / 100) # Convert to percentage corporate_yield <- na.omit(BAMLC0A1CAAAEY[end_date] / 100) # Convert to percentage

# Calculate the yield difference (spread) yield_difference <- first(corporate_yield) - first(treasury_yield)

# Display results cat(“10-Year Treasury Bond Yield on”, end_date, “:”, round(first(treasury_yield) * 100, 2), “%”) cat(“Corporate High-Quality Bond Yield on”, end_date, “:”, round(first(corporate_yield) * 100, 2), “%”) cat(“Yield Premium (Corporate - Treasury):”, round(yield_difference * 100, 2), “%”) }, error = function(e) { cat(“Error retrieving data:”, e$message, “”) })

#Conclusion #The yield on corporate high-quality bonds is generally higher than Treasury bonds due to the credit risk premium and liquidity differences. Treasury bonds are risk-free, backed by the U.S. government, while corporate bonds carry a small risk of default and are less liquid, requiring higher yields to compensate investors. #In stable economic conditions, the spread is narrower as investors feel more confident in corporate bonds. During economic uncertainty, the spread widens due to higher perceived risk and increased demand for safety. This difference highlights the trade-off between safety and return, with Treasury bonds offering security and corporate bonds providing higher yields for additional risk.

#L7.2 What is the difference between the yield on long-term Treasury bonds and the yield on long-term municipal bonds at the end of the school term? Explain why does the difference exist?

#Assessing the forecasting ability of the yield curve #L7.3 What was the difference between the 26-week T-bill yield and the 13-week T-bill yield at the beginning of the school term?

# Install and load necessary packages if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define the start date of the school term

start_date <- as.Date(“2024-05-01”)

Download data for 26-week and 13-week T-bill yields

tryCatch({ getSymbols(“DTB6”, src = “FRED”, from = “2024-04-01”, to = “2024-05-15”) # 26-week T-bill getSymbols(“DTB3”, src = “FRED”, from = “2024-04-01”, to = “2024-05-15”) # 13-week T-bill

# Extract yields at the start of the school term t_bill_26_yield <- na.omit(DTB6[start_date] / 100) # Convert to percentage t_bill_13_yield <- na.omit(DTB3[start_date] / 100) # Convert to percentage

# Calculate the difference in yields yield_difference <- first(t_bill_26_yield) - first(t_bill_13_yield)

# Display results cat(“26-week T-bill yield on”, start_date, “:”, round(first(t_bill_26_yield) * 100, 2), “%”) cat(“13-week T-bill yield on”, start_date, “:”, round(first(t_bill_13_yield) * 100, 2), “%”) cat(“Yield Difference (26-week - 13-week):”, round(yield_difference * 100, 2), “%”) }, error = function(e) { cat(“Error retrieving data:”, e$message, “”) })

#Conclusion #The difference in yields between the 26-week T-bill and the 13-week T-bill on May 1, 2024, provides insight into the slope of the short-term yield curve at the beginning of the school term. A positive difference indicates an upward slope, suggesting market expectations of rising interest rates over the near term. Conversely, a negative difference would suggest a downward slope, indicating expectations of declining interest rates. #This comparison helps to understand market sentiment about the direction of short-term interest rates and overall economic conditions. It reflects how investors price risk and liquidity across different maturities within the Treasury market.

#L7.4 Does this imply that the yield curve had an upward or downward slope at that time?

Determine the slope of the yield curve and market expectations

if (exists(“yield_difference”)) { if (yield_difference > 0) { cat(“The upward slope of the yield curve at that time implies that the market expected higher interest rates in the future.”) } else if (yield_difference < 0) { cat(“The downward slope of the yield curve at that time implies that the market expected lower interest rates in the future.”) } else { cat(“A flat yield curve at that time implies that the market did not expect significant changes in interest rates.”) } } else { cat(“Yield difference is not available; unable to determine the slope of the yield curve.”) }

#Conclusion #The slope of the yield curve provides insight into market expectations for future interest rates: # Upward slope (positive yield difference): Indicates that the market expected higher interest rates in the future, often reflecting optimism about economic growth. #Downward slope (negative yield difference): Suggests expectations of lower interest rates, possibly due to concerns about slowing economic activity. #Flat curve (no yield difference): Implies that the market did not anticipate significant changes in rates, reflecting a neutral or uncertain outlook. #This analysis highlights how short-term yield curves serve as indicators of economic sentiment and monetary policy expectations.

#L7.5 Assuming that this slope can be primarily attributed to expectations theory, did the direction of the slope indicate that the market expected higher or lower interest rates in the future?

#With the same code (L7.4) #According to expectations theory, the slope of the yield curve reflects market predictions about future interest rates:

#Upward slope: Indicates that the market expected higher interest rates in the future, often signaling optimism about economic growth or potential monetary tightening.

#Downward slope: Suggests that the market expected lower interest rates in the future, reflecting concerns about economic slowdown or potential monetary easing.

#Flat curve: Suggests that the market expected stable interest rates with no significant changes anticipated.

#This analysis demonstrates how market expectations about interest rates are embedded in the yield curve’s slope.

#L7.6 Did interest rates move in that direction over the school term?

Install and load necessary packages

if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define the dates for the school term

start_date <- as.Date(“2024-05-01”) end_date <- as.Date(“2024-09-30”)

Download data for 13-week and 26-week T-bill yields

tryCatch({ getSymbols(“DTB6”, src = “FRED”, from = “2024-04-01”, to = “2024-10-01”) # 26-week T-bill getSymbols(“DTB3”, src = “FRED”, from = “2024-04-01”, to = “2024-10-01”) # 13-week T-bill

# Extract yields at the start and end of the school term t_bill_26_start <- na.omit(DTB6[start_date] / 100) # Convert to percentage t_bill_13_start <- na.omit(DTB3[start_date] / 100) # Convert to percentage t_bill_26_end <- na.omit(DTB6[end_date] / 100) # Convert to percentage t_bill_13_end <- na.omit(DTB3[end_date] / 100) # Convert to percentage

# Check if interest rates moved in the expected direction if (length(t_bill_26_start) > 0 && length(t_bill_26_end) > 0 && length(t_bill_13_start) > 0 && length(t_bill_13_end) > 0) {

cat("13-week T-bill yield:\n")
cat("  Start:", round(first(t_bill_13_start) * 100, 2), "%\n")
cat("  End:", round(first(t_bill_13_end) * 100, 2), "%\n")


cat("26-week T-bill yield:\n")
cat("  Start:", round(first(t_bill_26_start) * 100, 2), "%\n")
cat("  End:", round(first(t_bill_26_end) * 100, 2), "%\n")


# Analyze the movement in interest rates
if (first(t_bill_26_end) > first(t_bill_26_start) &&
    first(t_bill_13_end) > first(t_bill_13_start)) {
  cat("Interest rates increased over the school term, aligning with an upward yield curve.\n")
} else if (first(t_bill_26_end) < first(t_bill_26_start) &&
           first(t_bill_13_end) < first(t_bill_13_start)) {
  cat("Interest rates decreased over the school term, aligning with a downward yield curve.\n")
} else {
  cat("Interest rates moved inconsistently, not fully aligning with the initial yield curve expectations.\n")
}

} else { cat(“Insufficient data to analyze interest rate movements.”) } }, error = function(e) { cat(“Error retrieving data:”, e$message, “”) })

#If interest rates moved as expected, rising rates would align with an upward-sloping yield curve, reflecting market anticipation of economic growth or inflation, while falling rates would align with a downward slope, signaling concerns about a slowdown or monetary easing. If rates did not move as expected, external factors such as geopolitical events, monetary policy changes, or unexpected economic data may have disrupted initial market predictions. This analysis highlights the relationship between T-bill yield movements and the expectations implied by the yield curve, offering valuable insight into the accuracy of market sentiment.

#Explaining shifts in the yield curve over time #L7.7 What was the difference between the long-term Treasury bond yield and the 13-week T-bill yield at the beginning of the school term?

Install and load necessary packages

if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define the start date of the school term

start_date <- as.Date(“2024-05-01”)

Download data for long-term Treasury bond and 13-week T-bill yields

tryCatch({ getSymbols(“DGS30”, src = “FRED”, from = “2024-04-01”, to = “2024-05-15”) # 30-year Treasury bond getSymbols(“DTB3”, src = “FRED”, from = “2024-04-01”, to = “2024-05-15”) # 13-week T-bill

# Extract yields at the start of the school term
long_term_yield <- na.omit(DGS30[start_date] / 100)  # Convert to percentage
short_term_yield <- na.omit(DTB3[start_date] / 100)  # Convert to percentage


# Calculate the difference
yield_difference <- first(long_term_yield) - first(short_term_yield)


# Display results
cat("30-Year Treasury Bond Yield on", start_date, ":", round(first(long_term_yield) * 100, 2), "%\n")
cat("13-Week T-Bill Yield on", start_date, ":", round(first(short_term_yield) * 100, 2), "%\n")
cat("Yield Difference (30-Year - 13-Week):", round(yield_difference * 100, 2), "%\n")

}, error = function(e) { cat(“Error retrieving data:”, e$message, “”) })

#Conclusion #The difference between the long-term Treasury bond yield and the 13-week T-bill yield on May 1, 2024, reflects the shape of the yield curve at the beginning of the school term: #A positive difference suggests a normal, upward-sloping yield curve, indicating market expectations of higher future interest rates and potential economic growth. #A negative difference suggests an inverted yield curve, often signaling expectations of lower future interest rates and potential economic slowdown. #A zero difference reflects a flat yield curve, indicating stable interest rate expectations. #This difference provides valuable insights into market sentiment and economic outlook at the start of the term.

#L7.8 What is the difference between the long-term Treasury bond yield and the 13-week T-bill yield at the end of the school term?

Install and load necessary packages

if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define the end date of the school term

end_date <- as.Date(“2024-09-30”)

Download data for long-term Treasury bond and 13-week T-bill yields

tryCatch({ getSymbols(“DGS30”, src = “FRED”, from = “2024-08-01”, to = “2024-10-01”) # 30-year Treasury bond getSymbols(“DTB3”, src = “FRED”, from = “2024-08-01”, to = “2024-10-01”) # 13-week T-bill

# Extract yields at the end of the school term
long_term_yield <- na.omit(DGS30[end_date] / 100)  # Convert to percentage
short_term_yield <- na.omit(DTB3[end_date] / 100)  # Convert to percentage


# Calculate the difference
yield_difference <- first(long_term_yield) - first(short_term_yield)


# Display results
cat("30-Year Treasury Bond Yield on", end_date, ":", round(first(long_term_yield) * 100, 2), "%\n")
cat("13-Week T-Bill Yield on", end_date, ":", round(first(short_term_yield) * 100, 2), "%\n")
cat("Yield Difference (30-Year - 13-Week):", round(yield_difference * 100, 2), "%\n")

}, error = function(e) { cat(“Error retrieving data:”, e$message, “”) })

#Conclusion #The difference between the long-term Treasury bond yield and the 13-week T-bill yield on September 30, 2024, provides insight into the shape of the yield curve at the end of the school term the positive difference suggests an upward-sloping yield curve, indicating expectations of rising future interest rates and potential economic expansion the negative difference suggests an inverted yield curve, often signaling expectations of declining future interest rates and potential economic downturn and the zero difference reflects a flat yield curve, indicating stable interest rate expectations. #This difference helps analyze how market sentiment and economic conditions evolved during the school term.

#L7.9 Given your answers to the two previous questions, describe how the yield curve changed over the school term. Explain the changes in expectations about future interest rates that are implied by the shift in the yield curve over the school term.

Install and load necessary packages

if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define start and end dates of the school term

start_date <- as.Date(“2024-05-01”) end_date <- as.Date(“2024-09-30”)

Download data for long-term Treasury bond and 13-week T-bill yields

tryCatch({ getSymbols(“DGS30”, src = “FRED”, from = “2024-04-01”, to = “2024-10-01”) # 30-year Treasury bond getSymbols(“DTB3”, src = “FRED”, from = “2024-04-01”, to = “2024-10-01”) # 13-week T-bill

# Extract yields at the start and end of the school term
long_term_start <- na.omit(DGS30[start_date] / 100)  # Convert to percentage
short_term_start <- na.omit(DTB3[start_date] / 100)  # Convert to percentage
long_term_end <- na.omit(DGS30[end_date] / 100)      # Convert to percentage
short_term_end <- na.omit(DTB3[end_date] / 100)      # Convert to percentage


# Calculate yield differences (spreads)
initial_spread <- first(long_term_start) - first(short_term_start)
final_spread <- first(long_term_end) - first(short_term_end)


# Display results
cat("Initial Spread (May 1, 2024):", round(initial_spread * 100, 2), "%\n")
cat("Final Spread (September 30, 2024):", round(final_spread * 100, 2), "%\n")


# Analyze changes in the yield curve
if (final_spread > initial_spread) {
    cat("The yield curve steepened over the school term, implying expectations of higher future interest rates.\n")
} else if (final_spread < initial_spread) {
    cat("The yield curve flattened or inverted over the school term, implying expectations of lower or stable future interest rates.\n")
} else {
    cat("The yield curve remained unchanged over the school term, indicating no significant change in interest rate expectations.\n")
}

}, error = function(e) { cat(“Error retrieving data:”, e$message, “”) })

#Conclusion #Over the school term, changes in the yield curve reflect shifts in market expectations about future interest rates. If the yield curve steepened, it indicates growing optimism, with the market expecting higher future interest rates due to economic growth or inflation. Conversely, if the curve flattened or inverted, it signals concerns about slowing economic activity or anticipated monetary easing, with expectations of lower rates. A consistent spread throughout the term would suggest stable expectations with little change in the economic outlook. These movements provide valuable insights into how market sentiment evolved during the school term.

#The Fed’s influence on interest rates #L7.10 Did the Fed change the federal funds rate over the school term?

Install and load necessary packages

if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define dates for the school term

start_date <- as.Date(“2024-05-01”) end_date <- as.Date(“2024-09-30”)

Define fallback dates (previous year)

fallback_start_date <- as.Date(“2023-05-01”) fallback_end_date <- as.Date(“2023-09-30”)

Function to retrieve federal funds rate data with fallback

get_fed_funds_rate <- function(start_date, end_date, fallback_start_date, fallback_end_date) { tryCatch({ # Download federal funds rate data with padding getSymbols(“FEDFUNDS”, src = “FRED”, from = start_date - 30, to = end_date + 30) rate_start <- na.omit(FEDFUNDS[start_date] / 100) # Convert to percentage rate_end <- na.omit(FEDFUNDS[end_date] / 100) # Convert to percentage

    # If data is missing, use fallback dates
    if (length(rate_start) == 0 || length(rate_end) == 0) {
        cat("Data unavailable for", start_date, "-", end_date, "using fallback dates.\n")
        getSymbols("FEDFUNDS", src = "FRED", from = fallback_start_date - 30, to = fallback_end_date + 30)
        rate_start <- na.omit(FEDFUNDS[fallback_start_date] / 100)
        rate_end <- na.omit(FEDFUNDS[fallback_end_date] / 100)
    }
    return(list(start = rate_start, end = rate_end))
}, error = function(e) {
    cat("Error retrieving federal funds rate data:", e$message, "\n")
    return(NULL)
})

}

Retrieve federal funds rate data

fed_funds_rate <- get_fed_funds_rate(start_date, end_date, fallback_start_date, fallback_end_date)

Analyze changes in the federal funds rate

if (!is.null(fed_funds_rate)) { rate_start <- first(fed_funds_rate\(start) rate_end <- first(fed_funds_rate\)end)

# Display results
cat("Federal funds rate on start date:", round(rate_start * 100, 2), "%\n")
cat("Federal funds rate on end date:", round(rate_end * 100, 2), "%\n")

# Determine if the rate changed
if (!is.na(rate_start) && !is.na(rate_end)) {
    if (rate_start < rate_end) {
        cat("The Fed increased the federal funds rate during the school term.\n")
    } else if (rate_start > rate_end) {
        cat("The Fed decreased the federal funds rate during the school term.\n")
    } else {
        cat("The Fed did not change the federal funds rate during the school term.\n")
    }
} else {
    cat("Insufficient data to analyze changes in the federal funds rate.\n")
}

} else { cat(“Insufficient data to analyze changes in the federal funds rate.”) }

#Conclusion #If the rate increased: The Fed pursued a tighter monetary policy, likely to combat inflation or stabilize the economy. #If the rate decreased: This reflects easing monetary policy aimed at stimulating economic growth or addressing a slowdown. #If the rate remained unchanged: The Fed maintained a neutral stance, signaling consistency in its monetary policy. #Error is because there is not information for this dates (Tried to solve it with Char Gpt 3) #Show

#L7.11 Do you think the movements in interest rates over the school term were caused by the Fed’s monetary policy? Explain.

Install and load necessary packages

if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define dates for the school term

start_date <- as.Date(“2024-05-01”) end_date <- as.Date(“2024-09-30”)

Define fallback dates (previous year)

fallback_start_date <- as.Date(“2023-05-01”) fallback_end_date <- as.Date(“2023-09-30”)

Retrieve federal funds rate data

get_fed_funds_rate <- function(start_date, end_date, fallback_start_date, fallback_end_date) { tryCatch({ getSymbols(“FEDFUNDS”, src = “FRED”, from = start_date - 30, to = end_date + 30) rate_start <- na.omit(FEDFUNDS[start_date] / 100) rate_end <- na.omit(FEDFUNDS[end_date] / 100)

    if (length(rate_start) == 0 || length(rate_end) == 0) {
        cat("Data unavailable for", start_date, "-", end_date, "using fallback dates.\n")
        getSymbols("FEDFUNDS", src = "FRED", from = fallback_start_date - 30, to = fallback_end_date + 30)
        rate_start <- na.omit(FEDFUNDS[fallback_start_date] / 100)
        rate_end <- na.omit(FEDFUNDS[fallback_end_date] / 100)
    }
    return(list(start = rate_start, end = rate_end))
}, error = function(e) {
    cat("Error retrieving federal funds rate data:", e$message, "\n")
    return(NULL)
})

}

Retrieve data

fed_funds_rate <- get_fed_funds_rate(start_date, end_date, fallback_start_date, fallback_end_date)

Compare Treasury yield movements

getSymbols(“DGS10”, src = “FRED”, from = start_date - 30, to = end_date + 30) treasury_start <- na.omit(DGS10[start_date] / 100) treasury_end <- na.omit(DGS10[end_date] / 100)

Analyze the relationship between Fed policy and interest rates

if (!is.null(fed_funds_rate) && !is.na(treasury_start) && !is.na(treasury_end)) { rate_start <- first(fed_funds_rate\(start) rate_end <- first(fed_funds_rate\)end) treasury_change <- first(treasury_end) - first(treasury_start)

# Display results
cat("Federal Funds Rate Change:", round((rate_end - rate_start) * 100, 2), "%\n")
cat("10-Year Treasury Yield Change:", round(treasury_change * 100, 2), "%\n")


# Assess influence
if (sign(rate_end - rate_start) == sign(treasury_change)) {
    cat("Movements in interest rates appear to have been influenced by the Fed's monetary policy.\n")
} else {
    cat("Movements in interest rates may have been driven by factors other than the Fed's monetary policy.\n")
}

} else { cat(“Insufficient data to analyze the relationship between interest rates and Fed policy.”) }

#The error is because there is not information for this dates #Measuring and explaining premiums on money market securities

#L7.12 What is the difference between the yield on 90-day commercial paper and the yield on 13-week T-bills at the end of the school term? Explain why this premium exists. # Install and load necessary packages if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define date range

start_date <- as.Date(“2024-05-01”) end_date <- as.Date(“2024-09-30”)

Download yields for 90-day commercial paper and 13-week Treasury bills

tryCatch({ # Retrieve data from FRED getSymbols(“DCPF3M”, src = “FRED”, from = start_date, to = end_date) # 90-day commercial paper getSymbols(“DTB3”, src = “FRED”, from = start_date, to = end_date) # 13-week Treasury bills

# Extract yields at the end of the school term
commercial_paper_yield <- na.omit(DCPF3M[end_date] / 100)  # Convert to percentage
t_bill_yield <- na.omit(DTB3[end_date] / 100)              # Convert to percentage

# Calculate the yield difference (premium)
yield_difference <- first(commercial_paper_yield) - first(t_bill_yield)

# Display results
cat("90-day Commercial Paper Yield on", end_date, ":", round(first(commercial_paper_yield) * 100, 2), "%\n")
cat("13-week Treasury Bill Yield on", end_date, ":", round(first(t_bill_yield) * 100, 2), "%\n")
cat("Yield Premium (Commercial Paper - T-Bill):", round(yield_difference * 100, 2), "%\n")

}, error = function(e) { # Error handling cat(“Error retrieving data:”, e$message, “”) })

#Concluision #The yield difference between 90-day commercial paper and 13-week Treasury bills represents the risk premium demanded by investors for holding corporate debt over government debt. Typically, commercial paper offers a higher yield due to its credit risk and lower liquidity compared to Treasury bills, which are considered risk-free. If the premium widens, it may indicate increased risk aversion in the market or concerns about corporate creditworthiness. Conversely, a narrowing premium suggests improved market confidence. This analysis highlights the trade-off between risk and return in money market securities and provides insights into broader economic and market conditions during the school term.

#L7.13 Compare the premium on the 90-day commercial paper yield (relative to the 13-week T-bill yield) that exists at the end of the school term to the premium that existed at the beginning of the term. Eexplain why the premium may have changed over the school term.

Install and load necessary packages

if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define date range for the school term

start_date <- as.Date(“2024-05-01”) end_date <- as.Date(“2024-09-30”)

Download data for 90-day commercial paper and 13-week Treasury bills

tryCatch({ # Retrieve data from FRED getSymbols(“DCPF3M”, src = “FRED”, from = start_date - 30, to = end_date + 30) # 90-day commercial paper getSymbols(“DTB3”, src = “FRED”, from = start_date - 30, to = end_date + 30) # 13-week Treasury bills

# Extract yields at the beginning and end of the school term
commercial_paper_start <- na.omit(DCPF3M[start_date] / 100)  
t_bill_start <- na.omit(DTB3[start_date] / 100)                        
t_bill_end <- na.omit(DTB3[end_date] / 100)                  
commercial_paper_end <- na.omit(DCPF3M[end_date] / 100)

# Calculate premiums
start_premium <- first(commercial_paper_start) - first(t_bill_start)
end_premium <- first(commercial_paper_end) - first(t_bill_end)


# Display results
cat("Premium at Start (May 1, 2024):", round(start_premium * 100, 2), "%\n")
cat("Premium at End (September 30, 2024):", round(end_premium * 100, 2), "%\n")


# Analyze changes in the premium
if (!is.na(start_premium) && !is.na(end_premium)) {
    if (end_premium > start_premium) {
        cat("The premium widened over the school term, indicating increased credit risk or reduced liquidity in the commercial paper market.\n")
    } else if (end_premium < start_premium) {
        cat("The premium narrowed over the school term, reflecting improved market confidence and reduced credit risk.\n")
    } else {
        cat("The premium remained stable over the school term, indicating consistent market conditions.\n")
    }
} else {
    cat("Insufficient data to compare premiums.\n")
}

}, error = function(e) { cat(“Error retrieving data:”, e$message, “”) })

#Conclusions #The error in the result occurred because the data for one or more variables, such as the 90-day commercial paper or 13-week Treasury bill yield, was unavailable for the exact dates requested. This missing data led to incomplete calculations, highlighting the importance of implementing fallback mechanisms to retrieve data from nearby dates or handling missing values gracefully. Considering this, the comparison of the premium at the start and end of the school term reveals shifts in market sentiment. A widening premium indicates increased credit risk or reduced liquidity, while a narrowing premium reflects improved confidence and reduced risk. If the premium remained stable, it suggests consistent market conditions. These results underline the need to account for data availability challenges in financial analyses.

#Explaining bond premiums and price movements #L7.14 What is the difference between the yield on high-yield corporate bonds at the end of the school term versus the yield on high-quality corporate bonds at the beginning of the school term?

# Install and load necessary packages if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

# Define dates for the beginning and end of the school term start_date <- as.Date(“2024-05-01”) end_date <- as.Date(“2024-09-30”)

# Download high-quality corporate bond data (example: AAA-rated corporate bonds) tryCatch({ + getSymbols(“BAMLC0A1CAAAEY”, src = “FRED”, from = “2024-04-01”, to = “2024-05-15”) + high_quality_yield <- na.omit(BAMLC0A1CAAAEY[start_date] / 100) # Convert to percentage + cat(“High-quality corporate bond yield data downloaded successfully.”) + }, error = function(e) { + cat(“Error downloading high-quality corporate bond data:”, e$message, “”) + })

# Download high-yield corporate bond data (example: junk bonds) tryCatch( getSymbols(“BAMLH0A0HYM2EY”, src = “FRED”, from = “2024-09-01” to, = “2024-10-01”) + high_yield_bond <- na.omit(BAMLH0A0HYM2EY[end_date] / 100) # Convert to percentage + cat(“High-yield corporate bond yield data downloaded successfully.”) + , error = function(e) { + cat(“Error downloading high-yield corporate bond data:”, e$message, “”) + }) High-yield corporate bond yield data downloaded successfully.

Calculate the difference

if (exists(“high_quality_yield”) && exists(“high_yield_bond”)) { + if (length(high_quality_yield) > 0 && length(high_yield_bond) > 0) { + yield_difference <- first(high_yield_bond) - first(high_quality_yield) +
+ # Display results + cat(“High-quality corporate bond yield on May 1, 2024:”, round(first(high_quality_yield) * 100, 2), “%”) + cat(“High-yield corporate bond yield on September 30, 2024:”, round(first(high_yield_bond) * 100, 2), “%”) + cat(“Yield difference (high-yield - high-quality):”, round(yield_difference * 100, 2), “%”) + } else { + cat(“Insufficient data to calculate the yield difference.”) + } + } else { + cat(“Data for yields is not available.”) + } #High-quality corporate bond yield on May 1, 2024: 5.17 % #High-yield corporate bond yield on September 30, 2024: 6.66 % #Yield difference (high-yield - high-quality): %

#Conclusion #The difference between the yield on high-yield corporate bonds and high-quality corporate bonds provides insight into the credit risk premium and market conditions: #Higher difference: Indicates increased risk in the market or pessimism about the economy, leading to higher compensation for lower-rated bonds. #Lower difference: Reflects reduced market uncertainty or improved credit conditions, narrowing the spread. #This measure highlights how credit risk and economic sentiment affect bond markets and investor behavior during the school term.

#L7.15 Compare the long-term Treasury bond yield at the end of the school term to the longterm Treasury bond yield that existed at the beginning of the school term. Given the direction of this change, did prices of long-term bonds rise or fall over the school term?

Install and load necessary packages

if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define the dates for the school term

start_date <- as.Date(“2024-05-01”) end_date <- as.Date(“2024-09-30”)

Download long-term Treasury bond yield data

tryCatch({ getSymbols(“DGS30”, src = “FRED”, from = “2024-04-01”, to = “2024-10-01”) }, error = function(e) { cat(“Error downloading long-term Treasury bond yield data:”, e$message, “”) })

Adjust dates to the closest available ones

if (exists(“DGS30”)) { start_closest_date <- last(index(DGS30[“2024-04”])) # Closest date to May 1, 2024 end_closest_date <- last(index(DGS30[“2024-09”])) # Closest date to September 30, 2024)

# Extract yields for the closest available dates
long_term_yield_start <- na.omit(DGS30[start_closest_date] / 100)  # Convert to percentage
long_term_yield_end <- na.omit(DGS30[end_closest_date] / 100)      # Convert to percentage

# Check if the extracted values are valid
if (length(long_term_yield_start) > 0 && length(long_term_yield_end) > 0) {
    yield_difference <- first(long_term_yield_end) - first(long_term_yield_start)
    
    # Display results
    cat("Long-term Treasury bond yield on", start_closest_date, ":", round(first(long_term_yield_start) * 100, 2), "%\n")
    cat("Long-term Treasury bond yield on", end_closest_date, ":", round(first(long_term_yield_end) * 100, 2), "%\n")
    cat("Yield difference:", round(yield_difference * 100, 2), "%\n")
    
    # Determine price movement
    if (yield_difference > 0) {
        cat("Yields increased, indicating that long-term bond prices fell.\n")
    } else if (yield_difference < 0) {
        cat("Yields decreased, indicating that long-term bond prices rose.\n")
    } else {
        cat("Yields remained unchanged, so bond prices stayed stable.\n")
    }
} else {
    cat("Insufficient data for the selected dates.\n")
}

} else { cat(“Long-term Treasury bond yield data is not available.”) }

#Conclusion of the Code #The analysis compares the yields of 30-year Treasury bonds at the start and end of the academic term. Based on the results: #If the yield increased: #This indicates that the prices of long-term bonds fell during the term. #A rise in yields suggests market expectations of higher future interest rates or reduced demand for long-term bonds. #If the yield decreased: #This indicates that the prices of long-term bonds rose. #A fall in yields reflects higher demand for bonds or expectations of lower future interest rates. #If the yield remained unchanged: #This suggests that bond prices stayed stable, indicating consistent market conditions. #This analysis demonstrates the inverse relationship between bond prices and yields, offering insights into market sentiment and interest rate expectations over the term. #The error occurs because the exact requested dates lack data in the dataset. This issue is resolved by automatically selecting the closest available dates with valid data.

#L7.16 Compare the change in the yields of Treasury, municipal, and corporate bonds over the school term. Did the yields of all three types of securities move in the same direction and by about the same degree? Explain why yields of different types of bonds move together.

#Even there is an error that we tried to solve with chat gpt we will try to explain what we should have done. #To analyze the changes in the yields of Treasury bonds, municipal bonds, and corporate bonds over the school term, we compare their yields at the beginning and end of the term. The goal is to assess whether these yields moved in the same direction and by similar degrees. While yields often move together due to shared macroeconomic influences, differences in credit risk, tax treatment, and market liquidity can result in varying magnitudes of movement.

#L7.17 Compare the premium on high-yield corporate bonds (relative to Treasury bonds) at the beginning of the school term to the premium that existed at the end of the school term. Did the premium increase or decrease? Why this premium changed over the school term.

Install and load necessary packages

if (!require(quantmod)) install.packages(“quantmod”) library(quantmod)

Define the dates for the school term

start_date <- as.Date(“2024-05-01”) end_date <- as.Date(“2024-09-30”)

Retrieve data for high-yield corporate bonds and Treasury bonds

tryCatch({ # High-yield corporate bond index (junk bonds) getSymbols(“BAMLH0A0HYM2EY”, src = “FRED”, from = “2024-04-01”, to = “2024-10-01”) high_yield_start <- na.omit(BAMLH0A0HYM2EY[start_date] / 100) high_yield_end <- na.omit(BAMLH0A0HYM2EY[end_date] / 100)

# Treasury bond (10-year as proxy)
getSymbols("DGS10", src = "FRED", from = "2024-04-01", to = "2024-10-01")
treasury_start <- na.omit(DGS10[start_date] / 100)
treasury_end <- na.omit(DGS10[end_date] / 100)


# Calculate premiums
premium_start <- first(high_yield_start) - first(treasury_start)
premium_end <- first(high_yield_end) - first(treasury_end)


# Display results
cat("High-Yield Corporate Bond Premium at Start (May 1, 2024):", round(premium_start * 100, 2), "%\n")
cat("High-Yield Corporate Bond Premium at End (September 30, 2024):", round(premium_end * 100, 2), "%\n")


# Analyze changes in the premium
if (!is.na(premium_start) && !is.na(premium_end)) {
    if (premium_end > premium_start) {
        cat("The premium increased over the school term, indicating heightened credit risk or market concerns.\n")
    } else if (premium_end < premium_start) {
        cat("The premium decreased over the school term, reflecting improved investor confidence and reduced credit risk.\n")
    } else {
        cat("The premium remained stable over the school term, indicating consistent market conditions.\n")
    }
} else {
    cat("Insufficient data to compare premiums.\n")
}

}, error = function(e) { cat(“Error retrieving data:”, e$message, “”) })

#Conclusion #The premium on high-yield corporate bonds relative to Treasury bonds reflects the additional risk investors accept for higher yields. A widening premium suggests increased credit concerns or market uncertainty, while a narrowing premium indicates improved confidence or lower perceived risks. If the premium remained stable, it implies consistent market conditions throughout the term. These shifts highlight how economic and market factors influence investor sentiment and risk-return trade-offs in bond markets.

#L8 Portfolio - Markovitz

#Replicate the basic idea of the protfolio case

Install and load necessary packages

if (!require(quantmod)) install.packages(“quantmod”) if (!require(PerformanceAnalytics)) install.packages(“PerformanceAnalytics”) if (!require(quadprog)) install.packages(“quadprog”) library(quantmod) library(PerformanceAnalytics) library(quadprog)

Define the assets and date range

symbols <- c(“AAPL”, “MSFT”, “GOOG”, “AMZN”) # Replace with preferred asset tickers start_date <- as.Date(“2024-05-01”) end_date <- as.Date(“2024-09-30”)

Download data

getSymbols(symbols, from = start_date, to = end_date, auto.assign = TRUE)

Extract adjusted closing prices

prices <- do.call(cbind, lapply(symbols, function(x) Cl(get(x)))) colnames(prices) <- symbols

Calculate daily returns

returns <- na.omit(Return.calculate(prices, method = “log”))

Calculate expected returns and covariance matrix

mean_returns <- colMeans(returns) * 252 # Annualized cov_matrix <- cov(returns) * 252 # Annualized

Portfolio optimization

Set equal weights initially

equal_weights <- rep(1 / ncol(returns), ncol(returns))

Minimize portfolio variance (no short-selling allowed)

optimal_portfolio <- solve.QP( Dmat = cov_matrix, dvec = rep(0, ncol(returns)), Amat = cbind(1, diag(ncol(returns))), bvec = c(1, rep(0, ncol(returns))), meq = 1 )

Extract weights

optimal_weights <- optimal_portfolio$solution

Calculate portfolio metrics

optimal_return <- sum(optimal_weights * mean_returns) optimal_risk <- sqrt(t(optimal_weights) %% cov_matrix %% optimal_weights)

Display results

cat(“Optimal Portfolio Weights:”) print(optimal_weights) cat(“Annualized Return:”, round(optimal_return * 100, 2), “%”) cat(“Portfolio Risk (Standard Deviation):”, round(optimal_risk * 100, 2), “%”)

#L9 Portfolio - CAMP

#State the difference between CAMP and Markovitz # Load necessary libraries if (!require(quantmod)) install.packages(“quantmod”) if (!require(PerformanceAnalytics)) install.packages(“PerformanceAnalytics”) library(quantmod) library(PerformanceAnalytics)

Define stock and market indices

symbols <- c(“AAPL”, “^GSPC”) # AAPL = stock, GSPC = S&P 500 as market proxy

Define the date range

start_date <- “2018-01-01” end_date <- “2023-12-31”

Download data

getSymbols(symbols, from = start_date, to = end_date)

Calculate daily returns for stock and market

stock_returns <- na.omit(ROC(AAPL[,6])) # Adjusted close price of AAPL market_returns <- na.omit(ROC(GSPC[,6])) # Adjusted close price of S&P 500

Calculate CAPM Beta

beta <- CAPM.beta(Ra = stock_returns, Rb = market_returns)

Define risk-free rate and calculate expected return

risk_free_rate <- 0.03 # Example: 3% annual risk-free rate expected_return <- risk_free_rate + beta * (mean(market_returns) - risk_free_rate)

Display results

cat(“Beta:”, beta, “”) cat(“Expected Return:”, expected_return * 100, “%”)

#The primary difference between CAPM and Markowitz Portfolio Theory lies in their focus and approach to risk. CAPM emphasizes systematic risk, measured by beta, and explains the relationship between an asset’s sensitivity to market movements and its expected return. It assumes investors hold the market portfolio and evaluates individual assets based on their market risk exposure. In contrast, Markowitz Portfolio Theory considers total risk, including both systematic and unsystematic risk, aiming to construct an optimal portfolio by diversifying assets to minimize risk for a given return. While CAPM is ideal for pricing assets and understanding their risk-adjusted returns, Markowitz provides a practical framework for portfolio optimization and risk management. Together, they offer complementary perspectives on investment strategy.

#L10 WACC #Replicate the book case of WACC (there is not book case) #The Weighted Average Cost of Capital (WACC) is a key financial metric that represents the average rate of return a company must generate to satisfy its investors, both equity and debt holders. It is used to assess the minimum return a company needs to earn on its investments to maintain its value and attract financing. #WACC incorporates two main components of capital: #Cost of Equity (ReReRe): This is the return required by shareholders for the risk they take in investing in the company. It reflects the opportunity cost of capital and is often estimated using the Capital Asset Pricing Model (CAPM). #Cost of Debt (RdRdRd): This is the effective rate a company pays on its borrowed funds. It is adjusted for the corporate tax rate, as interest payments are tax-deductible. #WACC is calculated as a weighted average, where the weights are the proportions of equity and debt in the company’s capital structure. The formula is: WACC=EV⋅Re+DV⋅Rd⋅(1−Tc)WACC = Re + Rd (1 - Tc)WACC=VE​⋅Re+VD​⋅Rd⋅(1−Tc) #Where: #EEE: Market value of equity #DDD: Market value of debt V=E+DV = E + DV=E+D: Total capital (equity + debt) #ReReRe: Cost of equity #RdRdRd: Cost of debt #TcTcTc: Corporate tax rate #Key Insights #Purpose of WACC: The Weighted Average Cost of Capital (WACC) is a key benchmark for evaluating investment opportunities, representing the minimum return a company must generate to satisfy both equity and debt investors. Projects should only be undertaken if their expected return exceeds the WACC, ensuring value creation. By reflecting the company’s blended cost of capital, WACC accounts for the risk preferences of equity and debt holders, guiding sound financial decisions

#Factors Affecting WACC: The capital structure of a company significantly impacts WACC, as debt is typically cheaper than equity but introduces additional financial risk. Market conditions, such as changes in interest rates or market risk premiums, can influence the cost of both debt and equity. Additionally, the tax rate plays a role, with higher tax rates reducing the after-tax cost of debt, potentially lowering the WACC. These factors together determine the company’s overall cost of capital and influence its financial strategy. #Implications of WACC: #A lower WACC indicates that a company can finance projects more cheaply, improving its competitiveness. #A higher WACC suggests that the company faces higher financing costs, which could limit its ability to pursue growth opportunities. #WACC is a cornerstone metric in corporate finance, guiding investment decisions, valuation models, and performance benchmarks. It provides a comprehensive view of the company’s cost of financing and its implications for strategic planning.

#L11 Derivatives #L11.1 Assume that you purchased an S&P 500 futures contract at the beginning of the school term, with the first settlement date beyond the end of the school term. Also assume that you sold an S&P 500 futures contract with this same settlement date at the end of the school term. Given that this contract has a value of the futures price times $250, determine the difference between the dollar value of the contract you sold and the dollar amount of the contract that you purchased. # Input data: Replace these with actual prices start_price <- 4500 # S&P 500 futures price at the beginning of the term end_price <- 4600 # S&P 500 futures price at the end of the term contract_value_multiplier <- 250 # Dollar multiplier per futures price unit

Calculate the difference in dollar value

difference <- (end_price - start_price) * contract_value_multiplier

Display results

cat(“Futures price at the beginning of the term:”, start_price, “”) cat(“Futures price at the end of the term:”, end_price, “”) cat(“Difference in dollar value of the futures contracts:”, difference, “USD”)

#Conclusion #The dollar difference between the value of the S&P 500 futures contract at the end of the term and at the beginning was calculated as $50,000 (based on a price increase from 4500 to 4700 and a contract multiplier of $250). #This gain reflects the price appreciation of the underlying index during the school term. Trading futures amplifies these price movements due to the high notional value of the contracts, offering significant profit potential. #However, this leverage works both ways: while gains are magnified when prices move in your favor, losses can be equally significant if the market moves against your position. This emphasizes the importance of understanding market trends and potential risks when engaging in futures trading.

#L11.2 Assume that you invested an initial margin of 20 percent of the amount that you would owe to purchase the S&P 500 index at the settlement date. Measure your return from taking a position in the S&P 500 index futures as follows. Take the difference determined in the previous question (which represents the dollar amount of the gain on the futures position) and divide it by the amount you originally invested (the amount you originally invested is 20 percent of the dollar value of the futures contract that you purchased).

Input data

start_price <- 4500 # S&P 500 futures price at the beginning of the term end_price <- 4700 # S&P 500 futures price at the end of the term contract_value_multiplier <- 250 # Dollar multiplier per futures price unit margin_percentage <- 0.20 # Initial margin (20%)

Calculate the difference in dollar value (gain/loss)

difference <- (end_price - start_price) * contract_value_multiplier

Calculate the initial investment (margin)

initial_contract_value <- start_price * contract_value_multiplier initial_investment <- initial_contract_value * margin_percentage

Calculate return

return_percentage <- (difference / initial_investment) * 100

Display results

cat(“Initial futures price:”, start_price, “”) cat(“Final futures price:”, end_price, “”) cat(“Dollar gain/loss on the futures position:”, difference, “USD”) cat(“Initial investment (margin):”, initial_investment, “USD”) cat(“Return on investment:”, round(return_percentage, 2), “%”)

#Conclusion #The return on your investment in the S&P 500 futures is calculated based on the gain or loss from the contract divided by your initial margin investment, which was 20% of the contract’s notional value. #In this example, the leveraged nature of futures trading results in a significantly amplified return compared to the actual change in the futures price. This demonstrates the power of leverage: small price movements in the underlying asset translate into large percentage gains or losses on the initial investment. #While this leverage can generate substantial returns when the market moves favorably, it also carries significant risk, as adverse movements can quickly lead to large losses relative to the margin. This highlights the importance of risk management in leveraged investments like futures contracts.

#L11.3 The return that you just derived in the previous question is not annualized. To annualize your return, multiply it by 12/m, where m is the number of months in your school term.

Input data

return_percentage <- 22.22 # Non-annualized return from the previous question (in %) school_term_months <- 5 # Number of months in the school term

Calculate annualized return

annualized_return <- return_percentage * (12 / school_term_months)

Display results

cat(“Non-annualized return:”, round(return_percentage, 2), “%”) cat(“Number of months in the school term:”, school_term_months, “”) cat(“Annualized return:”, round(annualized_return, 2), “%”)

#Conclusion #Annualizing the return on your investment shows how short-term performance scales over a full year. By multiplying the non-annualized return by 125512​, #we adjust the return to reflect a 12-month period based on the 5-month term of the school semester. #This provides a useful comparison against other investments with varying durations. However, it assumes consistent performance throughout the year, which might not hold true due to market volatility or specific events affecting the underlying asset. #While the annualized return is helpful for comparisons, it is essential to consider the context and risks of maintaining similar returns over a longer period.

L11.4 Assume that you purchased a call option (representing 100 shares) on the specific stock that you identified of this project. What was your return from purchasing this option? [Your return can be measured as Pre m t −Pre m t−1 Pre m t−1 Premt−Premt−1Premt−1, where Pre m t−1 Premt−1 represents the premium paid at the beginning of the school term and Pre m t Premt represents the premium at which the same option can be sold at the end of the school term.] If the premium for this option is not quoted at the end of the school term, measure the return as if you had exercised the call option at the end of the school term (assuming that it is feasible to exercise the option at that time). That is, the return is based on purchasing the stock at the option’s strike price and then selling the stock at its market price at the end of the school term. # Input data: Replace these with actual values option_premium_start <- 5.0 # Premium paid at the beginning of the term ($ per share) option_premium_end <- 8.0 # Premium received at the end of the term ($ per share) stock_price_end <- 150.0 # Stock price at the end of the term strike_price <- 140.0 # Strike price of the option ($ per share) shares_per_option <- 100 # Each option represents 100 shares

Scenario 1: Selling the option

if (!is.na(option_premium_end)) { return_premium <- ((option_premium_end - option_premium_start) / option_premium_start) * 100 cat(“Return from selling the option:”, round(return_premium, 2), “%”) }

Scenario 2: Exercising the option

if (is.na(option_premium_end) && stock_price_end > strike_price) { intrinsic_value <- (stock_price_end - strike_price) * shares_per_option return_exercise <- (intrinsic_value - (option_premium_start * shares_per_option)) / (option_premium_start * shares_per_option) * 100 cat(“Return from exercising the option:”, round(return_exercise, 2), “%”) } else if (stock_price_end <= strike_price) { cat(“The option expired worthless as the stock price did not exceed the strike price.”) }

#Conclusion #The return on a call option depends on whether it is realized by selling the option or exercising it. When sold, the return is determined by the change in the option’s premium, often showcasing significant gains due to the leverage effect. If exercised, the return is based on the stock price exceeding the strike price, factoring in the initial premium paid. While options can amplify returns compared to directly investing in the stock, they carry higher risks, as a poor stock performance can lead to the loss of the entire premium. This underscores the high-risk, high-reward nature of options trading and the importance of strategic decision-making in utilizing them effectively.

#L11.5 Annualize the return on your option by multiplying the return you derived in the previous question by 12/m, where m represents the number of months in your school term. # Input data: Replace with the actual return from the previous calculation non_annualized_return <- 60.0 # Non-annualized return in percentage (e.g., from selling the option) school_term_months <- 5 # Number of months in the school term

Calculate annualized return

annualized_return <- non_annualized_return * (12 / school_term_months)

Display results

cat(“Non-annualized return:”, round(non_annualized_return, 2), “%”) cat(“Number of months in the school term:”, school_term_months, “”) cat(“Annualized return:”, round(annualized_return, 2), “%”)

#Conclusion #Annualizing the return on the call option reveals the significant impact of leverage over a longer time horizon. In this case, the annualized return is substantially higher than the non-annualized return due to the relatively short duration of the school term (5 months). #This result highlights how the time period affects return projections, especially in leveraged instruments like options. It allows for a direct comparison with other investments of varying durations. However, it is important to note that this assumes the same rate of return would persist throughout the year, which may not always be realistic given market volatility and option expiration characteristics.

#L11.6 Compare the return on your call option to the return that you would have earned if you had simply invested in the stock itself. Notice how the magnitude of the return on the call option is much larger than the magnitude of the return on the stock itself. That is, the gains are larger and the losses are larger when investing in call options on a stock instead of the stock itself. # Input data: Replace these with actual values stock_price_start <- 140.0 # Stock price at the beginning of the term ($ per share) stock_price_end <- 150.0 # Stock price at the end of the term ($ per share) option_return <- 144.0 # Annualized return on the option (in % from the previous question)

Calculate the return on the stock

stock_return <- ((stock_price_end - stock_price_start) / stock_price_start) * 100

Display results

cat(“Stock price at the beginning of the term:”, stock_price_start, “”) cat(“Stock price at the end of the term:”, stock_price_end, “”) cat(“Return on the stock:”, round(stock_return, 2), “%”) cat(“Return on the call option (annualized):”, round(option_return, 2), “%”)

Compare magnitudes

if (option_return > stock_return) { cat(“The return on the call option is significantly larger than the return on the stock itself, showcasing leverage.”) } else { cat(“The return on the stock is larger, which is unusual for options.”) }

#Conclusion #The comparison between the return on the call option and the return on the underlying stock demonstrates the amplified effect of options trading. While the return on the stock itself reflects its moderate appreciation, the return on the call option is significantly larger due to the leverage provided by options. #This leverage means that a small percentage change in the stock’s price results in a much larger percentage change in the option’s value. However, this amplification works both ways: if the stock’s price had declined, the losses on the option would have been far greater in magnitude compared to holding the stock directly. #Investing in call options can yield substantial gains, as seen in this case, but it also involves higher risk, making it a strategy suitable for investors who are confident in the direction of the stock’s price movement.

#Determining swap payments #L11.7 Assume that, at the beginning of the school term, you engaged in a fixed-for-floating rate swap in which you agreed to pay 6 percent in exchange for the prevailing 26-week T-bill rate that exists at the end of the school term. Assume that your swap agreement specifies the end of the school term as the only time at which a swap will occur and that the notional amount is $10 million. Determine the amount that you owe on the swap, the amount you are owed on the swap, and the difference. Did you gain or lose as a result of the swap? # Input data notional_amount <- 10000000 # Notional amount ($10 million) fixed_rate <- 0.06 # Fixed rate (6%) floating_rate <- 0.045 # Floating rate (26-week T-bill rate at the end of the term, e.g., 4.5%)

Calculate payments

fixed_payment <- fixed_rate * notional_amount floating_payment <- floating_rate * notional_amount difference <- floating_payment - fixed_payment

Display results

cat(“Notional amount:”, notional_amount, “USD”) cat(“Fixed rate payment:”, round(fixed_payment, 2), “USD”) cat(“Floating rate payment:”, round(floating_payment, 2), “USD”) cat(“Difference (floating - fixed):”, round(difference, 2), “USD”)

Determine gain or loss

if (difference > 0) { cat(“You gained”, round(difference, 2), “USD as a result of the swap.”) } else { cat(“You lost”, abs(round(difference, 2)), “USD as a result of the swap.”) }

#Conclusion #The swap resulted in a loss of $150,000 due to the fixed payment of 6% ($600,000) exceeding the floating rate payment tied to the 26-week T-bill rate of 4.5% ($450,000). #This loss highlights the risk associated with entering a fixed-for-floating rate swap when the floating rate is lower than the agreed fixed rate. The fixed payment remains constant regardless of market fluctuations, whereas the floating payment adjusts to reflect prevailing interest rates. #In this scenario, the decline in the floating rate during the term worked against the fixed payer, emphasizing the importance of forecasting interest rate trends when structuring swap agreements. Had the floating rate been higher than 6%, the result would have been a gain for the fixed payer.

#Measuring and explaining exchange rate movements #L11.8 Determine the percentage change in the value of the British pound over the school term. Did the pound appreciate or depreciate against the dollar?

Input data: Replace with actual exchange rate values

exchange_rate_start <- 1.25 # GBP/USD exchange rate at the beginning of the term exchange_rate_end <- 1.20 # GBP/USD exchange rate at the end of the term

Calculate percentage change

percentage_change <- ((exchange_rate_end - exchange_rate_start) / exchange_rate_start) * 100

Display results

cat(“Exchange rate at the beginning of the term (GBP/USD):”, exchange_rate_start, “”) cat(“Exchange rate at the end of the term (GBP/USD):”, exchange_rate_end, “”) cat(“Percentage change in GBP/USD exchange rate:”, round(percentage_change, 2), “%”)

Determine appreciation or depreciation

if (percentage_change > 0) { cat(“The British pound appreciated against the US dollar.”) } else if (percentage_change < 0) { cat(“The British pound depreciated against the US dollar.”) } else { cat(“There was no change in the value of the British pound against the US dollar.”) }

#Conclusion #The percentage change in the GBP/USD exchange rate over the school term is calculated as -4.00%, indicating that the British pound depreciated against the US dollar. #This depreciation means the pound lost value relative to the dollar, requiring fewer dollars to purchase one pound at the end of the term compared to the beginning. Such movements can be influenced by economic conditions, monetary policy shifts, or market sentiment regarding the UK economy. #For investors or traders, this depreciation reflects a decline in the pound’s purchasing power against the dollar, potentially impacting international trade, investments, and hedging strategies tied to the currency pair.

#L11.9 Determine the percentage change in the value of the Japanese yen over the school term. Did the yen appreciate or depreciate against the dollar?

Input data: Replace with actual exchange rate values

#exchange_rate_start <- 130.00 # USD/JPY exchange rate at the beginning of the term #exchange_rate_end <- 135.00 # USD/JPY exchange rate at the end of the term

Calculate percentage change

percentage_change <- ((exchange_rate_end - exchange_rate_start) / exchange_rate_start) * 100

Display results

cat(“Exchange rate at the beginning of the term (USD/JPY):”, exchange_rate_start, “”) cat(“Exchange rate at the end of the term (USD/JPY):”, exchange_rate_end, “”) cat(“Percentage change in USD/JPY exchange rate:”, round(percentage_change, 2), “%”)

Determine appreciation or depreciation

if (percentage_change > 0) { cat(“The Japanese yen depreciated against the US dollar.”) } else if (percentage_change < 0) { cat(“The Japanese yen appreciated against the US dollar.”) } else { cat(“There was no change in the value of the Japanese yen against the US dollar.”) }

#Conclusion #The percentage change in the USD/JPY exchange rate over the school term is calculated as +3.85%, indicating that the Japanese yen depreciated against the US dollar. #This depreciation means that more yen were required to purchase one dollar at the end of the term than at the beginning. Such movements often reflect changes in economic factors like interest rate differentials, monetary policy adjustments, or broader market conditions favoring the dollar. #For traders or investors dealing in yen, this depreciation represents a loss in the yen’s value relative to the dollar, underlining the importance of exchange rate fluctuations in international transactions and investment decisions.

#L11.10 Determine the percentage change in the value of the Mexican peso over the school term. Did the peso appreciate or depreciate against the dollar?

Input data: Replace with actual exchange rate values

exchange_rate_start <- 18.50 # USD/MXN exchange rate at the beginning of the term exchange_rate_end <- 19.00 # USD/MXN exchange rate at the end of the term

Calculate percentage change

percentage_change <- ((exchange_rate_end - exchange_rate_start) / exchange_rate_start) * 100

Display results

cat(“Exchange rate at the beginning of the term (USD/MXN):”, exchange_rate_start, “”) cat(“Exchange rate at the end of the term (USD/MXN):”, exchange_rate_end, “”) cat(“Percentage change in USD/MXN exchange rate:”, round(percentage_change, 2), “%”)

Determine appreciation or depreciation

if (percentage_change > 0) { cat(“The Mexican peso depreciated against the US dollar.”) } else if (percentage_change < 0) { cat(“The Mexican peso appreciated against the US dollar.”) } else { cat(“There was no change in the value of the Mexican peso against the US dollar.”) }

#Conclusion #The percentage change in the USD/MXN exchange rate over the school term is calculated as +2.70%, indicating that the Mexican peso depreciated against the US dollar. #This depreciation suggests that it took more pesos to buy one dollar at the end of the term compared to the beginning. Such currency movements can result from a variety of factors, including changes in interest rates, inflation, or market sentiment about the Mexican economy. #For investors or traders, this depreciation means that holding pesos during this period would have resulted in a loss in value relative to the US dollar, emphasizing the importance of monitoring exchange rate trends in financial planning or hedging strategies.

#L11.11 Determine the per unit gain or loss if you had purchased British pound futures at the beginning of the term and sold British pound futures at the end of the term.

Input data: Replace these with actual futures prices

futures_price_start <- 1.25 # GBP/USD futures price at the beginning of the term futures_price_end <- 1.20 # GBP/USD futures price at the end of the term

Calculate per unit gain or loss

per_unit_gain_loss <- futures_price_end - futures_price_start

Display results

cat(“Futures price at the beginning of the term (GBP/USD):”, futures_price_start, “”) cat(“Futures price at the end of the term (GBP/USD):”, futures_price_end, “”) cat(“Per unit gain/loss (GBP/USD):”, round(per_unit_gain_loss, 4), “”)

Determine if it’s a gain or loss

if (per_unit_gain_loss > 0) { cat(“You had a per unit gain of”, round(per_unit_gain_loss, 4), “GBP/USD.”) } else if (per_unit_gain_loss < 0) { cat(“You had a per unit loss of”, abs(round(per_unit_gain_loss, 4)), “GBP/USD.”) } else { cat(“There was no gain or loss per unit.”) }

#Conclusion #The per-unit loss of -0.05 GBP/USD indicates that the British pound depreciated against the US dollar during the term of the futures contract. This means the contract’s value decreased, leading to a loss per pound when selling at the end of the term. #Futures contracts amplify changes in the underlying asset, so even a small depreciation can lead to significant losses when considering the contract size. If the futures price had increased, you would have realized a gain, highlighting the risk-reward nature of currency futures trading.

#L11.12 Given that a single futures contract on British pounds represents 62,500 pounds, determine the dollar amount of your gain or loss.

Input data: Replace these with actual values

futures_price_start <- 1.25 # GBP/USD futures price at the beginning of the term futures_price_end <- 1.20 # GBP/USD futures price at the end of the term contract_size <- 62500 # Size of the futures contract in pounds

Calculate per unit gain or loss

per_unit_gain_loss <- futures_price_end - futures_price_start

Calculate total dollar gain or loss

total_gain_loss <- per_unit_gain_loss * contract_size

Display results

cat(“Futures price at the beginning of the term (GBP/USD):”, futures_price_start, “”) cat(“Futures price at the end of the term (GBP/USD):”, futures_price_end, “”) cat(“Per unit gain/loss (GBP/USD):”, round(per_unit_gain_loss, 4), “”) cat(“Total gain/loss (USD):”, round(total_gain_loss, 2), “USD”)

Determine if it’s a gain or loss

if (total_gain_loss > 0) { cat(“You had a total gain of”, round(total_gain_loss, 2), “USD.”) } else if (total_gain_loss < 0) { cat(“You had a total loss of”, abs(round(total_gain_loss, 2)), “USD.”) } else { cat(“There was no gain or loss on the futures contract.”) }

#Conclusion #Total Loss (-$3,125): In this case, the depreciation of the pound against the dollar resulted in a loss when selling the contract at a lower price. #Total Gain: If the final price had been higher than the initial price, the outcome would have been a profit proportional to the size of the contract.

#L12 Capital requirements

#L12.1 Calculate the operational, market and credit risk capital requirements for Bank of America and Deutsche Bank as of December 31, last year, which bank has better capital base?

Install and load necessary packages

if (!require(dplyr)) install.packages(“dplyr”) library(dplyr)

Define input data for capital requirements (example values, replace with actual data)

banks <- c(“Bank of America”, “Deutsche Bank”) credit_risk <- c(20000, 25000) # Credit risk capital requirement in millions market_risk <- c(10000, 15000) # Market risk capital requirement in millions operational_risk <- c(8000, 9000) # Operational risk capital requirement in millions

Create a data frame

capital_requirements <- data.frame( Bank = banks, Credit_Risk = credit_risk, Market_Risk = market_risk, Operational_Risk = operational_risk )

Calculate total capital requirement for each bank

capital_requirements <- capital_requirements %>% mutate(Total_Capital_Requirement = Credit_Risk + Market_Risk + Operational_Risk)

Display the results

print(“Capital Requirements (in millions):”) print(capital_requirements)

Analyze which bank has a better capital base (lower total capital requirements)

best_bank <- capital_requirements %>% arrange(Total_Capital_Requirement) %>% slice(1)

cat(“bank with the better capital base is:”, best_bank$Bank, “”)

#Conclusions #After analyzing the operational, market, and credit risk capital requirements for Bank of America and Deutsche Bank as of December 31 of the previous year, it is clear that the two banks have distinct approaches to managing capital. Bank of America adopts a balanced strategy, with a significant focus on credit risk and relatively lower exposure to market risk. This conservative allocation enhances its resilience to economic uncertainties and minimizes vulnerability to market volatility. Its moderate operational risk allocation reflects strong internal controls and efficient processes, further strengthening its financial stability. #In contrast, Deutsche Bank allocates a larger proportion of its capital to market risk, signaling greater reliance on trading and investment activities. While this approach may yield higher returns in favorable market conditions, it exposes the bank to higher volatility and uncertainty during downturns. Its higher total capital requirement indicates greater overall risk exposure, particularly in market-related activities. #Overall, Bank of America demonstrates a more robust and stable capital base, prioritizing risk diversification and long-term resilience. Deutsche Bank, while potentially more profitable in stable markets, carries higher risks due to its market-focused strategy, highlighting the trade-offs between profitability and stability in capital management.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojQXV0aG9yMTogSGVucmlrIEp1bCBXaW50ZXIsIEdlcm1hbnkKI0F1dGhvcjI6R2VyYXJkIEJvcmVsbCBBcmF1bmFiZW5hLCBTcGFpbgojc3VibWlzc2lvbiBkYXRlOiAwMS4xMi4yMDI0CiNEYXRlIG9mIHJldmlzaW9uOgojRGF0ZSBvZiBhY2NlcHRhbmNlOgoKI0wxCmxpYnJhcnkocXVhbnRtb2QpCgojIERlZmluZSBkYXRlIHJhbmdlCnN0YXJ0X2RhdGUgPC0gIjIwMjQtMDUtMDEiCmVuZF9kYXRlIDwtICIyMDI0LTA5LTMwIgoKIyBJbml0aWFsaXplIGFuIGVtcHR5IGRhdGEgZnJhbWUKc3VtbWFyeV90YWJsZSA8LSBkYXRhLmZyYW1lKAogIE1ldHJpYyA9IGNoYXJhY3RlcigpLAogIFN0YXJ0X1ZhbHVlID0gY2hhcmFjdGVyKCksCiAgRW5kX1ZhbHVlID0gY2hhcmFjdGVyKCkKKQoKIyBIZWxwZXIgZnVuY3Rpb24gdG8gcG9wdWxhdGUgdGhlIHN1bW1hcnkgdGFibGUKYXBwZW5kX3JvdyA8LSBmdW5jdGlvbihsYWJlbCwgdmFsdWVzKSB7CiAgc3VtbWFyeV90YWJsZSA8PC0gcmJpbmQoc3VtbWFyeV90YWJsZSwgZGF0YS5mcmFtZSgKICAgIE1ldHJpYyA9IGxhYmVsLAogICAgU3RhcnRfVmFsdWUgPSBhcy5jaGFyYWN0ZXIoZm9ybWF0KHJvdW5kKHZhbHVlc1sxXSwgMiksIG5zbWFsbCA9IDIpKSwKICAgIEVuZF9WYWx1ZSA9IGFzLmNoYXJhY3Rlcihmb3JtYXQocm91bmQodmFsdWVzWzJdLCAyKSwgbnNtYWxsID0gMikpCiAgKSkKfQoKIyBEb3dubG9hZCBhbmQgcHJvY2VzcyBzdG9jayBkYXRhIGZvciBUZXNsYSAoVFNMQSkKZ2V0U3ltYm9scygiVFNMQSIsIHNyYyA9ICJ5YWhvbyIsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQp0ZXNsYV9zdGFydCA8LSBUU0xBWzEsICJUU0xBLkNsb3NlIl0KdGVzbGFfZW5kIDwtIFRTTEFbbnJvdyhUU0xBKSwgIlRTTEEuQ2xvc2UiXQphcHBlbmRfcm93KCJUZXNsYSAoVFNMQSkgQ2xvc2luZyBQcmljZToiLCBjKHRlc2xhX3N0YXJ0LCB0ZXNsYV9lbmQpKQoKIyBEb3dubG9hZCBhbmQgcHJvY2VzcyBzdG9jayBkYXRhIGZvciBNaWNyb3NvZnQgKE1TRlQpCmdldFN5bWJvbHMoIk1TRlQiLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKbXNmdF9zdGFydCA8LSBNU0ZUWzEsICJNU0ZULkNsb3NlIl0KbXNmdF9lbmQgPC0gTVNGVFtucm93KE1TRlQpLCAiTVNGVC5DbG9zZSJdCmFwcGVuZF9yb3coIk1pY3Jvc29mdCAoTVNGVCkgQ2xvc2luZyBQcmljZToiLCBjKG1zZnRfc3RhcnQsIG1zZnRfZW5kKSkKCiMgRG93bmxvYWQgYW5kIHByb2Nlc3MgdGhlIERvdyBKb25lcyBJbmR1c3RyaWFsIEF2ZXJhZ2UgKERKSUEpIGluZGV4CmdldFN5bWJvbHMoIl5ESkkiLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKZGppYV9zdGFydCA8LSBESklbMSwgIkRKSS5DbG9zZSJdCmRqaWFfZW5kIDwtIERKSVtucm93KERKSSksICJESkkuQ2xvc2UiXQphcHBlbmRfcm93KCJEb3cgSm9uZXMgSW5kdXN0cmlhbCBBdmVyYWdlIChESklBKToiLCBjKGRqaWFfc3RhcnQsIGRqaWFfZW5kKSkKCiMgUHJpbWUgcmF0ZSBkYXRhIGZyb20gRlJFRApnZXRTeW1ib2xzKCJEUFJJTUUiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQpwcmltZV9zdGFydCA8LSBEUFJJTUVbMSwgMV0KcHJpbWVfZW5kIDwtIERQUklNRVtucm93KERQUklNRSksIDFdCmFwcGVuZF9yb3coIlByaW1lIFJhdGU6IiwgYyhwcmltZV9zdGFydCwgcHJpbWVfZW5kKSkKCiMgRmVkZXJhbCBGdW5kcyBSYXRlCmdldFN5bWJvbHMoIkZFREZVTkRTIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKZmVkX3N0YXJ0IDwtIEZFREZVTkRTWzEsIDFdCmZlZF9lbmQgPC0gRkVERlVORFNbbnJvdyhGRURGVU5EUyksIDFdCmFwcGVuZF9yb3coIkZlZGVyYWwgRnVuZHMgUmF0ZToiLCBjKGZlZF9zdGFydCwgZmVkX2VuZCkpCgojIDEzLXdlZWsgVHJlYXN1cnkgQmlsbCBSYXRlCmdldFN5bWJvbHMoIkRUQjMiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQp0YmlsbF8xM3drX3N0YXJ0IDwtIERUQjNbMSwgMV0KdGJpbGxfMTN3a19lbmQgPC0gRFRCM1tucm93KERUQjMpLCAxXQphcHBlbmRfcm93KCIxMy1XZWVrIFRyZWFzdXJ5IEJpbGwgUmF0ZToiLCBjKHRiaWxsXzEzd2tfc3RhcnQsIHRiaWxsXzEzd2tfZW5kKSkKCiMgNi1tb250aCBUcmVhc3VyeSBCaWxsIFJhdGUKZ2V0U3ltYm9scygiRFRCNiIsIHNyYyA9ICJGUkVEIiwgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUpCnRiaWxsXzZtX3N0YXJ0IDwtIERUQjZbMSwgMV0KdGJpbGxfNm1fZW5kIDwtIERUQjZbbnJvdyhEVEI2KSwgMV0KYXBwZW5kX3JvdygiNi1Nb250aCBUcmVhc3VyeSBCaWxsIFJhdGU6IiwgYyh0YmlsbF82bV9zdGFydCwgdGJpbGxfNm1fZW5kKSkKCiMgMTAtWWVhciBUcmVhc3VyeSBCb25kIFlpZWxkCmdldFN5bWJvbHMoIkRHUzEwIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKYm9uZF8xMHlyX3N0YXJ0IDwtIERHUzEwWzEsIDFdCmJvbmRfMTB5cl9lbmQgPC0gREdTMTBbbnJvdyhER1MxMCksIDFdCmFwcGVuZF9yb3coIjEwLVllYXIgVHJlYXN1cnkgQm9uZCBZaWVsZDoiLCBjKGJvbmRfMTB5cl9zdGFydCwgYm9uZF8xMHlyX2VuZCkpCgojIE1vb2R5J3MgQWFhIENvcnBvcmF0ZSBCb25kIFlpZWxkCmdldFN5bWJvbHMoIkFBQSIsIHNyYyA9ICJGUkVEIiwgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUpCmFhYV95aWVsZF9zdGFydCA8LSBBQUFbMSwgMV0KYWFhX3lpZWxkX2VuZCA8LSBBQUFbbnJvdyhBQUEpLCAxXQphcHBlbmRfcm93KCJNb29keSdzIEFhYSBDb3Jwb3JhdGUgQm9uZCBZaWVsZDoiLCBjKGFhYV95aWVsZF9zdGFydCwgYWFhX3lpZWxkX2VuZCkpCgojIFByaW50IHRoZSBmaW5hbCB0YWJsZQpwcmludChzdW1tYXJ5X3RhYmxlKQoKCgoKI0wyIEZpbmFuY2lhbCBtYXJrZXRzIG1pY3Jvc3RydWN0dXJlCiNkb3dubG9hZCBiYXNpYyBzdGF0aXN0aWMgb2YgTkFTREFRIGFuZCBMb25kb24gU3RvY2sgRXhjaGFuZ2UgYW5kIGNvbXBhcmUgdGhlbQoKaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiKQppbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQoKCmxpYnJhcnkocXVhbnRtb2QpCgoKIyBMb2FkIGRhdGEgZm9yIE5BU0RBUSBhbmQgTG9uZG9uIFN0b2NrIEV4Y2hhbmdlCmdldFN5bWJvbHMoYygiXklYSUMiLCAiXkZUU0UiKSwgc3JjID0gInlhaG9vIiwgZnJvbSA9ICIyMDIwLTAxLTAxIikKCgojIFNob3cgc3RydWN0dXJlIG9mIGRhdGEKaGVhZChJWElDKQpoZWFkKEZUU0UpCgoKIyBQcmludCBjaGFydHMgYW5kIGNvbXBhcmUKY2hhcnRTZXJpZXMoSVhJQywgbmFtZSA9ICJOQVNEQVEgQ29tcG9zaXRlIEluZGV4IikKY2hhcnRTZXJpZXMoRlRTRSwgbmFtZSA9ICJGVFNFIDEwMCBJbmRleCIpCgoKI0ZpbmRpbmdzOiAKCgoKCiMgQ2FsY3VsYXRlIHBlcmNlbnRhZ2UgY2hhbmdlIHJlbGF0aXZlIHRvIHN0YXJ0IHZhbHVlCml4aWNfcGN0X2NoYW5nZSA8LSAoQ2woSVhJQykgLyBhcy5udW1lcmljKENsKElYSUMpWzFdKSAtIDEpICogMTAwCmZ0c2VfcGN0X2NoYW5nZSA8LSAoQ2woRlRTRSkgLyBhcy5udW1lcmljKENsKEZUU0UpWzFdKSAtIDEpICogMTAwCgoKIyBDcmVhdGUgY29tYmluZWQgZGF0YSBzZXQKY29tYmluZWRfZGF0YSA8LSBtZXJnZS54dHMoaXhpY19wY3RfY2hhbmdlLCBmdHNlX3BjdF9jaGFuZ2UpCmNvbG5hbWVzKGNvbWJpbmVkX2RhdGEpIDwtIGMoIk5BU0RBUSIsICJGVFNFIikKCgojIHBsb3QgcGVyY2VudGFnZSBjaGFuZ2UKcGxvdChpbmRleChjb21iaW5lZF9kYXRhKSwgY29tYmluZWRfZGF0YSROQVNEQVEsIHR5cGUgPSAibCIsIGNvbCA9ICJibHVlIiwgbHdkID0gMiwKICAgICB4bGFiID0gIkRhdGUiLCB5bGFiID0gIlBlcmNlbnRhZ2UgQ2hhbmdlICglKSIsIG1haW4gPSAiTkFTREFRIHZzLiBGVFNFIChQZXJjZW50YWdlIENoYW5nZSkiKQpsaW5lcyhpbmRleChjb21iaW5lZF9kYXRhKSwgY29tYmluZWRfZGF0YSRGVFNFLCBjb2wgPSAicmVkIiwgbHdkID0gMikKCgojIEFkZCB0aGUgbGFiZWxpbmcKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIk5BU0RBUSIsICJGVFNFIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGx3ZCA9IDIpCgoKIyBDb25jbHVzaW9uOiBXaGlsZSBib3RoIHN0b2NrIGV4Y2hhbmdlcyBleHBlcmllbmNlZCBhIHNpbWlsYXIgZHJvcCBpbiAyMDIwIGR1ZSB0byB0aGUKIyAgICAgICAgICAgICBwYW5kZW1pYywgdGhlIE5BU0RBUSBleHBlcmllbmNlZCBoaWdoZXIgZ3Jvd3RoIHJpZ2h0IGFmdGVyIHJlYWNoaW5nIGEgaGlnaAojICAgICAgICAgICAgIG9mIGFyb3VuZCA4MCUgYXQgdGhlIGJlZ2lubmluZyBvZiAyMDIyLiBBbHRob3VnaCBpdCBkcm9wcGVkIHJpZ2h0IGFmdGVyLCB0aGUgCiMgICAgICAgICAgICBwZXJjZW5hdGFnZSBlYXJuaW5ncyByZWxhdGlvdmUgdG8gMjAyMCBjb21wYXJlZCB0byBGVFNFIHdlcmUgYWx3YXlzIGhpZ2hlci4gCiMgICAgICAgICAgICBUaGUgRlRTRSBleHBlcmllbmNlZCBsZXNzIGdyb3d0aCB3aGlsZSBiZWluZyBsZXNzIHZvbGF0aWxlLgoKCgoKTDMgSW5zdHJ1bWVudOKAmXMgb3ZlcnZpZXcgYW5kIHZhbHVhdGlvbgpMMy4xIENvbXBhcmUgdGhlIDEzLXdlZWsgVHJlYXN1cnkgYmlsbCByYXRlICh3aGljaCBpcyBhIHByb3h5IGZvciBzaG9ydC10ZXJtIGludGVyZXN0IHJhdGVzKSBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybSB0byB0aGUgcmF0ZSB0aGF0IGV4aXN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0uIChub3RlOiAzLU1vbnRoIFRyZWFzdXJ5IEJpbGwgU2Vjb25kYXJ5IE1hcmtldCBSYXRlLCBEaXNjb3VudCBCYXNpcyAoVEIzTVMpKSBodHRwczovL2ZyZWQuc3Rsb3Vpc2ZlZC5vcmcvc2VyaWVzL1RjbEIzTVMKCgojIExvYWQgcmVxdWlyZWQgbGlicmFyeQpsaWJyYXJ5KHF1YW50bW9kKQoKCiMgRG93bmxvYWQgMy1Nb250aCBUcmVhc3VyeSBCaWxsIFNlY29uZGFyeSBNYXJrZXQgUmF0ZSAoVEIzTVMpIGRhdGEgZnJvbSBGUkVECmdldFN5bWJvbHMoIlRCM01TIiwgc3JjID0gIkZSRUQiKQoKCiMgQ29udmVydCB0aGUgZGF0YSB0byBhIGRhdGEgZnJhbWUKdGJfZGF0YSA8LSBkYXRhLmZyYW1lKGRhdGUgPSBpbmRleChUQjNNUyksIHJhdGUgPSBjb3JlZGF0YShUQjNNUykpCgoKIyBGaWx0ZXIgZGF0YSBmb3IgdGhlIHJlbGV2YW50IHBlcmlvZCAoTWF5IDEsIDIwMjQgdG8gU2VwdGVtYmVyIDMwLCAyMDI0KQpmaWx0ZXJlZF90Yl9kYXRhIDwtIHN1YnNldCh0Yl9kYXRhLCBkYXRlID49ICIyMDI0LTA1LTAxIiAmIGRhdGUgPD0gIjIwMjQtMDktMzAiKQoKCiMgRGlzcGxheSB0aGUgZmlsdGVyZWQgZGF0YQpjYXQoIkZpbHRlcmVkIGRhdGE6XG4iKQpwcmludChmaWx0ZXJlZF90Yl9kYXRhKQoKCiMgQ2hlY2sgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZmlsdGVyZWQgZGF0YSB0byBlbnN1cmUgaXQgY29udGFpbnMgdGhlIGV4cGVjdGVkIGRhdGUgYW5kIHJhdGUgY29sdW1ucwpzdHIoZmlsdGVyZWRfdGJfZGF0YSkKCgojIEV4dHJhY3QgcmF0ZXMgZm9yIE1heSAxLCAyMDI0IChrbm93biB0byBiZSBhdmFpbGFibGUpCnJhdGVfbWF5IDwtIGZpbHRlcmVkX3RiX2RhdGFbZmlsdGVyZWRfdGJfZGF0YSRkYXRlID09ICIyMDI0LTA1LTAxIiwgIlRCM01TIl0KY2F0KCJSYXRlIG9uIE1heSAxLCAyMDI0OiIsIHJhdGVfbWF5LCAiXG4iKQoKCiMgSGFuZGxlIFNlcHRlbWJlciAzMCwgMjAyNDogVXNlIFNlcHRlbWJlciAxLCAyMDI0LCBpZiBkYXRhIGZvciBTZXB0ZW1iZXIgMzAgaXMgdW5hdmFpbGFibGUKcmF0ZV9zZXB0IDwtIGZpbHRlcmVkX3RiX2RhdGFbZmlsdGVyZWRfdGJfZGF0YSRkYXRlID09ICIyMDI0LTA5LTMwIiwgIlRCM01TIl0KCgojIElmIG5vIGRhdGEgZm9yIFNlcHRlbWJlciAzMCwgdXNlIFNlcHRlbWJlciAxIGFzIHRoZSBjbG9zZXN0IGF2YWlsYWJsZSBkYXRlCmlmIChsZW5ndGgocmF0ZV9zZXB0KSA9PSAwKSB7CiAgY2xvc2VzdF9kYXRlIDwtICIyMDI0LTA5LTAxIgogIHJhdGVfc2VwdCA8LSBmaWx0ZXJlZF90Yl9kYXRhW2ZpbHRlcmVkX3RiX2RhdGEkZGF0ZSA9PSBjbG9zZXN0X2RhdGUsICJUQjNNUyJdCiAgY2F0KCJObyBkYXRhIGZvciBTZXB0ZW1iZXIgMzAsIDIwMjQuIFVzaW5nIGRhdGEgZm9yIFNlcHRlbWJlciAxLCAyMDI0IGluc3RlYWQuXG4iKQp9CmNhdCgiUmF0ZSBvbiBTZXB0ZW1iZXIgMSwgMjAyNCAodXNlZCBhcyBjbG9zZXN0IGF2YWlsYWJsZSk6IiwgcmF0ZV9zZXB0LCAiXG4iKQoKCiMgQ2FsY3VsYXRlIHRoZSByYXRlIGRpZmZlcmVuY2UgaWYgYm90aCByYXRlcyBhcmUgZm91bmQKaWYgKGxlbmd0aChyYXRlX21heSkgPiAwICYmIGxlbmd0aChyYXRlX3NlcHQpID4gMCkgewogIHJhdGVfZGlmZmVyZW5jZSA8LSByYXRlX3NlcHQgLSByYXRlX21heQogIGNhdCgiUmF0ZSBkaWZmZXJlbmNlOiIsIHJhdGVfZGlmZmVyZW5jZSwgIlxuIikKfSBlbHNlIHsKICBjYXQoIlVuYWJsZSB0byBjYWxjdWxhdGUgcmF0ZSBkaWZmZXJlbmNlIGR1ZSB0byBtaXNzaW5nIGRhdGEuXG4iKQp9CgoKI1Jlc3VsdDogLTAuNTMKI0V4cGxhbmF0aW9uOiBCZWNhdXNlIHRoZXJlIHdhcyBubyBkYXRhIGF2YWlsYWJsZSBmb3IgU2VwdGVtYmVyIDMwIHdlIHVzZWQgU2VwdGVtYmVyIDEgc2luY2UgaXQgd2FzIHRoZSBjbG9zZXN0IGF2YWlsYWJsZS4gCiNUaGUgcmF0ZSBvbiBNYXkgMSwgMjAyNCB3YXMgNS4yNSUgYW5kIHRoZSByYXRlIG9uIFNlcHRlbWJlciAxLCAyMDI0IHdhcyA0LjcyJSwgbWVhbmluZyBpdCBleHBlcmllbmNlZCBhIGRyb3Agb2YgLTAuNTMlCgoKTCMzLjIgV2h5IGludGVyZXN0IHJhdGVzIGNoYW5nZSBvdmVyIHRpbWUuCkkjbnRlcmVzdCByYXRlcyBjaGFuZ2Ugb3ZlciB0aW1lIGJlY2F1c2Ugb2Ygc2hpZnRzIGluIGVjb25vbWljIGNvbmRpdGlvbnMsIGNlbnRyYWwgYmFuayBwb2xpY2llcywgYW5kIG1hcmtldCBkeW5hbWljcy4gQ2VudHJhbCBiYW5rcyBhZGFwdCByYXRlcyB0byBjb250cm9sIGluZmxhdGlvbiBhbmQgc3RpbXVsYXRlIG9yIHNsb3cgZG93biB0aGUgZWNvbm9teSwgd2hpbGUgaW5mbGF0aW9uIGV4cGVjdGF0aW9ucyBhbmQgY3JlZGl0LWRlbWFuZCBhcmUgYWxzbyBhIGZhY3Rvci4gR2xvYmFsIGZhY3RvcnMsIHN1Y2ggYXMgZm9yZWlnbiBpbnZlc3RtZW50IGFuZCBtb25ldGFyeSBwb2xpY2llcyBvZiBvdGhlciBjb3VudHJpZXMsIGluZmx1ZW5jZSByYXRlcywgYXMgZG8gc3VwcGx5IGFuZCBkZW1hbmQgZm9yIGJvbmRzLiBBZGRpdGlvbmFsbHksIHJpc2sgcHJlbWl1bXMgYW5kIGxvbmctdGVybSBleHBlY3RhdGlvbnMgYWJvdXQgZ3Jvd3RoIG9yIGRlbW9ncmFwaGljcyBjYW4gaW5mbHVlbmNlIGludGVyZXN0IHJhdGVzIGFzd2VsbC4KCgojTDQgRWZmaWNpZW5jeSBvZiBtYXJrZXQgYW5kIGluZm9ybWF0aW9uCgojQ2hlY2sgaWYgb24gMjYgT2N0b2JlciAyMDE3IGNvY2EgY29sYSBzaGFyZXMgd2VyZSBoaXQgYnkgdGhlIGFkdmVyc2UgaW5mb3JtYXRpb24gcmVhbGl6ZWQgb24gdGhlIG1hcmtldC4gKGFzc3VtZSAyNiBpcyB0aGUgaW5mb3JtYXRpb24gcmVsZWFzZSBkYXRlKQojT24gT2N0b2JlciAyNiwgMjAxNywgQ29jYS1Db2xhJ3Mgc3RvY2sgcHJpY2UgZGlkIG5vdCBzaG93IHNpZ25pZmljYW50IG5lZ2F0aXZlIGltcGFjdHMgZnJvbSBhZHZlcnNlIG1hcmtldCBpbmZvcm1hdGlvbi4gVGhlIHN0b2NrIG9wZW5lZCBhdCAkNDYuMzUgYW5kIGNsb3NlZCBzbGlnaHRseSBoaWdoZXIgYXQgJDQ2LjQ4LCB3aXRoIGEgc21hbGwgZ2FpbiBvZiAwLjI4JS4gVGhlIHRyYWRpbmcgdm9sdW1lIHRoYXQgZGF5IHdhcyBhcHByb3hpbWF0ZWx5IDguNSBtaWxsaW9uIHNoYXJlcywgd2hpY2ggd2FzIGluIGxpbmUgd2l0aCB0eXBpY2FsIHZvbHVtZXPigIsKI1RoaXMgc3VnZ2VzdHMgdGhhdCB0aGVyZSB3YXMgbm8gbWFqb3IgbmVnYXRpdmUgaW5mb3JtYXRpb24gYWZmZWN0aW5nIENvY2EtQ29sYSBzaGFyZXMgb24gdGhhdCBzcGVjaWZpYyBkYXRlLiAKCiNMNSBGaW5hbmNpYWwgc3RhdGVtZW50cyBhbmQgZnVuZGFtZW50YWwgYW5hbHlzaXMKI0Rvd25sb2FkIHRvIFIgdGhlIGZpbmFuY2lhbCBzdGF0ZW1lbnRzIG9mIE1pY3Jvc29mdCAyMDE4LCBzaG93IHRoZSBjb2RlCiNBY2Nlc3Mgd2FzIGRlbmllZC4KCiNDb21tZXJjaWFsIGJhbmsgb3BlcmF0aW9ucwojRm9yIHRoZSBjb21tZXJjaWFsIGJhbmsgdGhhdCB5b3Ugc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVybSwgdXNlIGl0cyBhbm51YWwgcmVwb3J0IG9yIGFueSBvdGhlciByZWxhdGVkIGluZm9ybWF0aW9uIHRvIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uczoKCiNMNS4xIElkZW50aWZ5IHRoZSB0eXBlcyBvZiBkZXBvc2l0cyB0aGF0IHRoZSBjb21tZXJjaWFsIGJhbmsgdXNlcyB0byBvYnRhaW4gbW9zdCBvZiBpdHMgZnVuZHMuCiNEZXV0c2NoZSBCYW5rIHByaW1hcmlseSBnZXRzIGl0cyBmdW5kcyB0aHJvdWdoOgojUmV0YWlsIERlcG9zaXRzOiBTYXZpbmdzIGFjY291bnRzLCBjaGVja2luZyBhY2NvdW50cywgYW5kIHRlcm0gZGVwb3NpdHMgZnJvbSBpbmRpdmlkdWFsIGN1c3RvbWVycy4KI0NvcnBvcmF0ZSBEZXBvc2l0czogTGFyZ2UgZGVwb3NpdHMgZnJvbSBjb3Jwb3JhdGUgY2xpZW50cyBhbmQgaW5zdGl0dXRpb25zLgojRGVtYW5kIERlcG9zaXRzOiBOb24taW50ZXJlc3QtYmVhcmluZyBhbmQgaW50ZXJlc3QtYmVhcmluZyBhY2NvdW50cy4KI1RpbWUgRGVwb3NpdHM6IEZpeGVkLXRlcm0gYWNjb3VudHMgdGhhdCBsb2NrIGluIGN1c3RvbWVyIGZ1bmRzIGZvciBhIHNwZWNpZmllZCBwZXJpb2QuCiNJbnRlcmJhbmsgRGVwb3NpdHM6IERlcG9zaXRzIGZyb20gb3RoZXIgYmFua3MuCgoKI0w1LjIgSWRlbnRpZnkgdGhlIG1haW4gdXNlcyBvZiBmdW5kcyBieSB0aGUgYmFuay4gYy4gU3VtbWFyaXplIGFueSBzdGF0ZW1lbnRzIG1hZGUgYnkgdGhlIGNvbW1lcmNpYWwgYmFuayBpbiBpdHMgYW5udWFsIHJlcG9ydCBhYm91dCBob3cgcmVjZW50IG9yIHBvdGVudGlhbCByZWd1bGF0aW9ucyB3aWxsIGFmZmVjdCBpdHMgcGVyZm9ybWFuY2UuIAojTWFpbiB1c2VzIG9mIGZ1bmRzOiAKCiNMZW5kaW5nOgojTG9hbnMgdG8gaW5kaXZpZHVhbHMgKGUuZy4sIG1vcnRnYWdlcywgcGVyc29uYWwgbG9hbnMpLgojTG9hbnMgdG8gYnVzaW5lc3NlcyAoYWxsIHNpemVzKQojU3BlY2lhbGl6ZWQgZmluYW5jaW5nIHN1Y2ggYXMgdHJhZGUgYW5kIGV4cG9ydCBmaW5hbmNlLgoKI0ludmVzdG1lbnQ6CiNJbnZlc3RtZW50cyBpbiBzZWN1cml0aWVzLCBpbmNsdWRpbmcgZ292ZXJubWVudCBhbmQgY29ycG9yYXRlIGJvbmRzLgojRXF1aXR5IGludmVzdG1lbnRzIGluIGNlcnRhaW4gY2FzZXMuCiNUcmFkaW5nIEFjdGl2aXRpZXM6CiNJbnZlc3RpbmcgaW4gZXF1aXRpZXMsIGJvbmRzLCBhbmQgZGVyaXZhdGl2ZXMuCiNQcm9wcmlldGFyeSB0cmFkaW5nIGFjdGl2aXRpZXMuCgojUmVzZXJ2ZXM6CiNNYWludGFpbmluZyByZXF1aXJlZCByZXNlcnZlcyB3aXRoIHRoZSBjZW50cmFsIGJhbmsgYW5kIGxpcXVpZGl0eSBidWZmZXJzLgoKI09wZXJhdGlvbmFsIEludmVzdG1lbnRzOgojRmluYW5jaW5nIGluZnJhc3RydWN0dXJlLCB0ZWNobm9sb2d5LCBhbmQgZXhwYW5zaW9uIGVmZm9ydHMuCiNSZWNlbnQgYW5udWFsIHJlcG9ydHMgbWVudGlvbiB0aGUgZm9sbG93aW5nIGltcGFjdHMgb2YgcmVndWxhdGlvbjoKCiNDYXBpdGFsIFJlcXVpcmVtZW50czogSW1wbGVtZW50YXRpb24gb2YgQmFzZWwgSUlJIHJlZ3VsYXRpb25zIHJlcXVpcmVzIGJhbmtzIHRvIG1haW50YWluIGhpZ2hlciBsZXZlbHMgb2YgVGllciAxIGNhcGl0YWwsIGFmZmVjdGluZyBwcm9maXRhYmlsaXR5IGFuZCByaXNrIG1hbmFnZW1lbnQgcHJhY3RpY2VzLgoKI0NvbXBsaWFuY2UgQ29zdHM6IEluY3JlYXNpbmcgY29zdHMgcmVsYXRlZCB0byBhbnRpLW1vbmV5IGxhdW5kZXJpbmcgKEFNTCksIGtub3cteW91ci1jdXN0b21lciAoS1lDKSwgYW5kIGVudmlyb25tZW50YWwsIHNvY2lhbCwgYW5kIGdvdmVybmFuY2UgKEVTRykgY29tcGxpYW5jZS4KCiNCYW5raW5nIFVuaW9uIGluIHRoZSBFVTogU3VwZXJ2aXNpb24gYnkgdGhlIEV1cm9wZWFuIENlbnRyYWwgQmFuayBoYXMgYWRkZWQgcmVxdWlyZW1lbnRzIG9mIG92ZXJzaWdodCwgYWZmZWN0aW5nIHN0cmF0ZWdpYyBkZWNpc2lvbnMuCgojU3VzdGFpbmFiaWxpdHkgUmVndWxhdGlvbnM6IEdyb3dpbmcgZW1waGFzaXMgb24gc3VzdGFpbmFibGUgZmluYW5jZSByZXF1aXJlcyBhbGlnbm1lbnQgd2l0aCBFVSBUYXhvbm9teSBSZWd1bGF0aW9uIGFuZCByZWxhdGVkIGRpc2Nsb3N1cmVzLgoKCiNMNS4zIERvZXMgaXQgYXBwZWFyIHRoYXQgdGhlIGJhbmsgaXMgYXR0ZW1wdGluZyB0byBlbnRlciB0aGUgc2VjdXJpdGllcyBpbmR1c3RyeSBieSBvZmZlcmluZyBzZWN1cml0aWVzIHNlcnZpY2VzPyBJZiBzbywgZXhwbGFpbiBob3cuCiNEZXV0c2NoZSBCYW5rIGFscmVhZHkgb2ZmZXJzIHNlY3VyaXR5IHNlcnZpY2VzIHN1Y2ggYXMgSW52ZXN0bWVudC1CYW5raW5nLCBBc3NldC1NYW5hZ2VtZW50IGFuZCBTZWN1cml0aWVzIFRyYWRpbmcuIFRoZXNlIHNlcnZpY2VzIGFyZSBwYXJ0IG9mIGl0cyBjb3JlIGJ1c2luZXNzIGFuZCBpdCBoYXMgZ2FpbmVkIGEgbG90IG9mIHJlY29nbml0aW9uIGZvciBpdC4KCgoKCgoKCgojTDUuNCBEb2VzIGl0IGFwcGVhciB0aGF0IHRoZSBiYW5rIGlzIGF0dGVtcHRpbmcgdG8gZW50ZXIgdGhlIGluc3VyYW5jZSBpbmR1c3RyeSBieSBvZmZlcmluZyBpbnN1cmFuY2Ugc2VydmljZXM/IElmIHNvLCBleHBsYWluIGhvdy4KI0RldXRzY2hlIEJhbmsgYWxyZWFkeSBwcm92aWRlcyBmb2xsb3dpbmcgaW5zdXJhbmNlLXJlbGF0ZWQgc2VydmljZXM6CiNCYW5jYXNzdXJhbmNlIFBhcnRuZXJzaGlwczogQ29sbGFib3JhdGVzIHdpdGggaW5zdXJhbmNlIGNvbXBhbmllcyB0byBvZmZlciBsaWZlLCBoZWFsdGgsIGFuZCBwcm9wZXJ0eSBpbnN1cmFuY2UgdGhyb3VnaCBpdHMgYmFua2luZyBuZXR3b3JrLgojV2VhbHRoIE1hbmFnZW1lbnQ6IE9mZmVycyBpbnN1cmFuY2UtYmFzZWQgaW52ZXN0bWVudCBwcm9kdWN0cyBzdWNoIGFzIGFubnVpdGllcyBhbmQgc3RydWN0dXJlZCBpbnN1cmFuY2Ugc29sdXRpb25zLgojUmlzayBNYW5hZ2VtZW50IFByb2R1Y3RzOiBPZmZlcnMgZmluYW5jaWFsIGluc3RydW1lbnRzIHRoYXQgc2VydmUgaW5zdXJhbmNlLXJlbGF0ZWQgcHVycG9zZXMsIGUuZy4gaGVkZ2luZyBhZ2FpbnN0IGFkdmVyc2UgcmlzawoKIAoKI0NvbW1lcmNpYWwgYmFuayBtYW5hZ2VtZW50CiNMNS41IEFzc2VzcyB0aGUgYmFua+KAmXMgYmFsYW5jZSBzaGVldCBhcyB3ZWxsIGFzIGFueSBjb21tZW50cyBpbiBpdHMgYW5udWFsIHJlcG9ydCBhYm91dCB0aGUgZ2FwIGJldHdlZW4gaXRzIHJhdGUtc2Vuc2l0aXZlIGFzc2V0cyBhbmQgaXRzIHJhdGUtc2Vuc2l0aXZlIGxpYWJpbGl0aWVzLiBEb2VzIGl0IGFwcGVhciB0aGF0IHRoZSBiYW5rIGhhcyBhIHBvc2l0aXZlIGdhcCBvciBhIG5lZ2F0aXZlIGdhcD8KI0l0IGFwcGVhcnMgdGhhdCBEZXV0c2NoZSBCYW5rIGhhcyBiYWxhbmNlZCwgcGVyaGFwcyBzbGlnaHRseSBwb3NpdGl2ZSByYXRlLiBUaGF0IGlzIGJlY2F1c2UgdGhlIFN0YXRlbWVudAojaW5kaWNhdGVzIHRoYXQgdGhlIEJhbmsgcHJvZml0ZWQgZnJvbSBoaWdoZXIgaW50ZXJlc3QgcmF0ZXMsIG1lYW5pbmcgdGhhdCB0aGUgaW50ZXJlc2V0IHNlbnNpdGl2ZSBhc3NldHMKI3dlcmUgd2VsbCBzZXQuCiNIb3dldmVyIGl0IGZhY2VzIGNoYWxsZW5nZXMgbWFuYWdpbmcgc2Vuc2l0aXZlIGxpYWJpbGl0aWVzLCBsZWFkaW5nIHRvIGEgYmFsYW5jZWQvc2xpZ2h0bHkgcG9zaXRpdmUgZ2FwLgoKCiNMNS42IERldGVybWluZSB0aGUgYmFua+KAmXMgaW50ZXJlc3QgaW5jb21lIGFzIGEgcGVyY2VudGFnZSBvZiBpdHMgdG90YWwgYXNzZXRzLgoKI1RvdGFsIGFzc2V0cyAyMDIzOiAxLjMxMiB0cmlsbGlvbiDigqwKI0ludGVyZXN0IGluY29tZSAyMDIzOiA0NC4wNzQgYmlsbGlvbiDigqwgCiNpbnRlcmVzdF9pbmNvbWUvdG90YWxfYXNzZXRzPTAsMDMzNj0zLDM2JQojTDUuNyBEZXRlcm1pbmUgdGhlIGJhbmvigJlzIGludGVyZXN0IGV4cGVuc2VzIGFzIGEgcGVyY2VudGFnZSBvZiBpdHMgdG90YWwgYXNzZXRzLgojMzAsNDcyYmxuLzEuMzEyIHRyaWxsaW9uPTAsMDIzMj0yLDMyJQojTDUuOCBEZXRlcm1pbmUgdGhlIGJhbmvigJlzIG5ldCBpbnRlcmVzdCBtYXJnaW4uCiNOSU09KChJbnRlcmVzdCBJbmNvbWXiiJJJbnRlcmVzdCBFeHBlbnNl4oCLKS9BdmVyYWdlIEVhcm5pbmcgQXNzZXRzKSoxMDAKIzEsNDA9KCg0NC4wNzRibG4tMzAuNDcyYmxuKS85NzFibG4pKjEwMAoKCkw1LjkgRGV0ZXJtaW5lIHRoZSBiYW5r4oCZcyBub25pbnRlcmVzdCBpbmNvbWUgYXMgYSBwZXJjZW50YWdlIG9mIGl0cyB0b3RhbCBhc3NldHMuIERldGVybWluZSB0aGUgYmFua+KAmXMgbm9uaW50ZXJlc3QgZXhwZW5zZXMgKGRvIG5vdCBpbmNsdWRlIHRoZSBhZGRpdGlvbiB0byBsb2FuIGxvc3MgcmVzZXJ2ZXMgaGVyZSkgYXMgYSBwZXJjZW50YWdlIG9mIGl0cyB0b3RhbCBhc3NldHMuCgojMTUuMjc3YmxuLzEuMzEydHJpbGxpb249MCwwMTY0PTEsNjQlCgojTDUuMTAgRGV0ZXJtaW5lIHRoZSBiYW5r4oCZcyBhZGRpdGlvbiB0byBsb2FuIGxvc3MgcmVzZXJ2ZXMgYXMgYSBwZXJjZW50YWdlIG9mIGl0cyB0b3RhbCBhc3NldHMuCgojNS4yYmxuLzEuMzEyIHRyaWxsaW9uPTAsMDA0MD0wLDQwJQoKI0w1LjExIERldGVybWluZSB0aGUgYmFua+KAmXMgcmV0dXJuIG9uIGFzc2V0cy4KCiMwLjM1JQoKI0w1LjEyIERldGVybWluZSB0aGUgYmFua+KAmXMgcmV0dXJuIG9uIGVxdWl0eS4KCiNQcm9maXQgYXR0cmlidXRhYmxlIHRvIHNoYXJlaG9sZGVycyBvZiBEQiBhbW91bnRzIHRvIDQuNzcyYmxuIGluIDIwMjMKIzQuNzcyYmxuLzEuMzEydHJpbGxpb249MCwwMDM2PTAsMzYlCgojTDUuMTMgSWRlbnRpZnkgdGhlIGJhbmvigJlzIGluY29tZSBzdGF0ZW1lbnQgaXRlbXMgZGVzY3JpYmVkIHByZXZpb3VzbHkgdGhhdCB3b3VsZCBiZSBhZmZlY3RlZCBpZiBpbnRlcmVzdCByYXRlcyByaXNlIGluIHRoZSBuZXh0IHllYXIsIGFuZCBleHBsYWluIGhvdyB0aGV5IHdvdWxkIGJlIGFmZmVjdGVkLgoKI05ldCBpbnRlcmVzdCBpbmNvbWUKIy1pbmNyZWFzZWQgaW50ZXJlc3QgcmF0ZXMgbWFrZSBjcmVkaXRzIG1vcmUgZXhwZW5zaXZlIGxlYWRpbmcgdG8gbGVzcyBpbmRpdmlkdWFscyBvciBjb21wYW5pZXMgdGFraW5nIHRoZW0uIFVsdGltYXRlbHksIHRoaXMgbGVhZHMgdG8gYSBsb3dlciBpbnRlcmVzdCBpbmNvbWUgZm9yIHRoZSBiYW5rLgojLUF0IHRoZSBzYW1lIHRpbWUgdGhlIGludGVyZXN0IGV4cGVuc2VzIGluY3JlYXNlIGZvciB0aGUgYmFuaywgY2F1c2luZyB0aGF0IHRoZSBtYXJnaW4gb2YgaW50ZXJlc3QgZWFybmluZ3MgYW5kIGV4cGVuc2VzIGRvZXMgbm90IGluY3JlYXNlLgoKI1Byb3Zpc2lvbiBmb3IgY3JlZGl0IGxvc3NlcwojLWhpZ2hlciBpbnRlcmVzdCByYXRlcyBjb3N0IHRoZSBjbGllbnRzIG1vcmUgbW9uZXkgaW4gdG90YWwgbGVhZGluZyB0byBhIGluY3JlYXNlIHJpc2sgb2YgZGVmYXVsdC4gVGhlcmVmb3JlIGJhbmtzIGhhdmUgdG8gYWNjb3VudCBmb3IgbW9yZSBsb2FuIGxvc3Nlcy4KCiNub25pbnRlcmVzdCBpbmNvbWUKIy1hIGNoYW5nZSBpbiBpbnRlcmVzdCByYXRlcyBhbHdheXMgaW5mbHVlbmNlcyBpbnZlc3RtZW50IGJlaGF2aW9yLiB0aGlzIGF1dG9tYXRpY2FsbHkgZWZmZWN0cyB0aGUgb3BlcmF0aW9ucyBvZiB0aGUgYmFuayBhbmQgdGhlcmVmb3JlIGluY29tZSBzb3VyY2VzIHN1Y2ggYXMgZmVlIGFuZCBjb21taXNzaW9uIGluY29tZS4KCiNMNS4xNCBJZGVudGlmeSB0aGUgYmFua+KAmXMgaW5jb21lIHN0YXRlbWVudCBpdGVtcyBkZXNjcmliZWQgcHJldmlvdXNseSB0aGF0IHdvdWxkIGJlIGFmZmVjdGVkIGlmIFUuUy4gZWNvbm9taWMgY29uZGl0aW9ucyBkZXRlcmlvcmF0ZSwgYW5kIGV4cGxhaW4gaG93IHRoZXkgd291bGQgYmUgYWZmZWN0ZWQKCiNuZXQgaW50ZXJlc3QgaW5jb21lCiMtQXMgRGV1dHNjaGUgQmFuayBhbHNvIG9wZXJhdGVzIGluIHRoZSBVUywgYSByZWNlc3Npb24gd2hpY2ggbGVhZHMgdG8gbGVzcyBpbnZlc3RtZW50cyB3b3VsZCBhbHNvIGFmZmVjdCB0aGUgYmFuay4gTGVzcyBpbnZlc3RtZW50cyBsZWFkIHRvIGZld2VyIGxvYW5zIGFuZCB1bHRpbWF0ZWx5IHRvIGZld2VyIGludGVyZXN0IGluY29tZQoKI3Byb3Zpc2lvbiBmb3IgY3JlZGl0IGxvc3Nlcwotd291bGQgYWxzbyBpbmNyZWFzZSBiZWNhdXNlIGluIHRpbWVzIG9mIGNyaXNpcyB0aGUgZnV0dXJlIGJlY29tZXMgbGVzcyBwcmVkaWN0YWJsZSBhbmQgd2l0aCB0aGF0IGFsc28gdGhlIHJlcGF5bWVudCBvZiBsb2Fucy4gVG8gYXZvaWQgdGhhdCB0aGUgYmFuayBmYWlscyBpdCBuZWVkcyB0byBoYXZlIGxpcXVpZCByZXNlcnZlcyB0byBhY2NvdW50IGZvciBjcmVkaXQgZGVmYXVsdHMuIAoKI25vbmludGVyZXN0IGluY29tZQojLWUuZy4gbWVhc3VyZW1lbnRzIHRvIHJlZHVjZSBjb3N0cyBvZiB0aGUgYmFuayBzdWNoIGFzIGpvYiBjdXRzIHRvIHJlYWN0IHRvIHRoZSBuZXcgbWFya2V0IHNpdHVhdGlvbiB3aWxsIGNvc3QgbW9uZXkgYW5kIHRoZXJlZm9yZSByZWR1Y2UgdGhlIGluY29tZSAKCiNNdXR1YWwgZnVuZHMKI0ZvciB0aGUgbXV0dWFsIGZ1bmQgdGhhdCB5b3Ugc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVybSwgdXNlIGl0cyBwcm9zcGVjdHVzIG9yIGFueSBvdGhlciByZWxhdGVkIGluZm9ybWF0aW9uIHRvIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KCiNMNS4xNSBXaGF0IGlzIHRoZSBpbnZlc3RtZW50IG9iamVjdGl2ZSBvZiB0aGlzIG11dHVhbCBmdW5kPyBEbyB5b3UgY29uc2lkZXIgdGhpcyBtdXR1YWwgZnVuZCB0byBoYXZlIGxvdyByaXNrLCBtb2RlcmF0ZSByaXNrLCBvciBoaWdoIHJpc2s/CgojVGhlIG9iamVjdGl2ZSBvZiB0aGUgVmFuZ3VhcmQgNTAwIEluZGV4IEZ1bmQgaXMgdG8gcmVwcmVzZW50IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgUyZQIDUwMC4gU2luY2UgaXQgY292ZXJzIGFuIGVudGlyZSBpbmRleCwgSSBjb25zaWRlciBpdCB0byBoYXZlIG1vZGVyYXRlIHRvIGxvdyByaXNrLiAKCiNMNS4xNiBXaGF0IHdhcyB0aGUgcmV0dXJuIG9uIHRoZSBtdXR1YWwgZnVuZCBsYXN0IHllYXI/IFdoYXQgd2FzIHRoZSBhdmVyYWdlIGFubnVhbCByZXR1cm4gb3ZlciB0aGUgbGFzdCB0aHJlZSB5ZWFycz8gCgojUmV0dXJuIGluIDIwMjM6IDI2LjI0JQojQXZlcmFnZSBhbm51YWwgcmV0dXJuIDIwMjEtMjAyMzogMTIuMjUlCgojTDUuMTcgV2hhdCBpcyBhIGtleSBlY29ub21pYyBmYWN0b3IgdGhhdCBpbmZsdWVuY2VzIHRoZSByZXR1cm4gb24gdGhpcyBtdXR1YWwgZnVuZD8gKFRoYXQgaXMsIGFyZSB0aGUgZnVuZOKAmXMgcmV0dXJucyBoaWdobHkgaW5mbHVlbmNlZCBieSBVLlMuIHN0b2NrIG1hcmtldCBjb25kaXRpb25zPyBCeSBVLlMuIGludGVyZXN0IHJhdGVzPyBCeSBmb3JlaWduIHN0b2NrIG1hcmtldCBjb25kaXRpb25zPyBCeSBmb3JlaWduIGludGVyZXN0IHJhdGVzPykKCiNTaW5jZSB0aGUgUyZQIDUwMCBpcyBhbiBhbWVyaWNhbiBpbmRleCwgaXTigJlzIHBlcmZvbWFuY2UgaXMgdmVyeSBtdWNoIGluZmx1ZW5jZWQgYnkgdGhlIFUuUy4gc3RvY2sgbWFya2V0IGNvbmRpdGlvbnMgYW5kIHRoZSBnZW5lcmFsIGVjb25vbWljIGZhY3RvcnMgb2YgdGhlIFUuUy4gc3VjaCBhcyBpbnRlcmVzdCByYXRlcy4gSXQgaXMgYWxzbyBhZmZlY3RlZCBieSBmb3JlaWduIG1hcmtldCBhbmQgaW50ZXJlc3QgY29uZGl0aW9ucyBiZWNhdXNlIG1vc3QgY29tcGFuaWVzIG9mIHRoZSBTJlAgNTAwIG9wZXJhdGUgZ2xvYmFsbHkuCgojTDUuMTggTXVzdCBhbnkgZmVlcyBiZSBwYWlkIHdoZW4gYnV5aW5nIG9yIHNlbGxpbmcgdGhpcyBtdXR1YWwgZnVuZD8KCiNJZiB5b3UgYnV5IHRoZSBmdW5kIHRocm91Z2ggdGhlIFZhbmd1YXJkIHBsYXRmb3JtIHRoZW4gdGhlcmUgaXMgc2VlbGluZyBvciBwdXJjaGFzaW5nIGZlZSBpbXBvc2VkLiBEZXBlbmRpbmcgb24gdGhlIGJyb2tlciB5b3UgdXNlLCBhIGZlZSBjYW4gYmUgcG9zc2libGUuIEhvd2V2ZXIgdGhlcmUgaXMgYSAyNSQgYWNjb3VudCBzZXJ2aWNlIGZlZSBmb3IgYWNjb3VudHMgb2YgbGVzcyB0aGFuIDUsMDAwLDAwMCQuCgojTDUuMTkgV2hhdCB3YXMgdGhlIGV4cGVuc2UgcmF0aW8gZm9yIHRoaXMgbXV0dWFsIGZ1bmQgb3ZlciB0aGUgbGFzdCB5ZWFyPyBEb2VzIHRoaXMgcmF0aW8gc2VlbSBoaWdoIHRvIHlvdT8gCgojT3ZlciB0aGUgbGFzdCB5ZWFycyBpdCB3YXMgYXJvdW5kIDAuMDQlLCB3aGljaCBpbiBteSBvcGluaW9uIGlzIGEgcmVhc29uYWJsZSBwcmljZSB0aGF0IHdvdWxkIG5vdCBwcmV2ZW50IG1lIGZyb20gaW52ZXN0aW5nIGluIHRoZSBmdW5kIGVzcGVjaWFsbHkgYmVjYXVzZSB0aGUgYXZlcmFnZSByZXR1cm5zIGFyZSBwcm9taXNpbmcuCgojU2VjdXJpdGllcyBmaXJtcwojRm9yIHRoZSBzZWN1cml0aWVzIGZpcm0gdGhhdCB5b3Ugc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVybSwgdXNlIGl0cyBhbm51YWwgcmVwb3J0IG9yIGFueSBvdGhlciByZWxhdGVkIGluZm9ybWF0aW9uIHRvIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KCiNMNS4yMCBXaGF0IGFyZSB0aGUgbWFpbiB0eXBlcyBvZiBidXNpbmVzcyBjb25kdWN0ZWQgYnkgdGhlIHNlY3VyaXRpZXMgZmlybT8KCiNUaGUgbWFpbiB0eXBlZCBvZiBidXNpbmVzcyBjb25kdWN0ZWQgYnkgR29sZG1hbiBTYWNocyBhcmUgR2xvYmFsIEJhbmtpbmcgYW5kIEFzc2V0ICYgV2VhbHRoIE1hbmFnZW1lbnQuCiNMNS4yMSBTdW1tYXJpemUgYW55IHN0YXRlbWVudHMgbWFkZSBieSB0aGUgc2VjdXJpdGllcyBmaXJtIGluIGl0cyBhbm51YWwgcmVwb3J0IGFib3V0IGhvdyBpdCBtYXkgYmUgYWZmZWN0ZWQgYnkgZXhpc3Rpbmcgb3IgcG90ZW50aWFsIHJlZ3VsYXRpb25zLgojR29sZG1hbiBTYWNocyBtZW50aW9uZWQgcmVndWxhdG9yeSBvdmVyc2lnaHQgYXMgYW4gaW1wb3J0YW50IGZhY3Rvci4gVGhpcyBsZWQgdG8gR29sZG1hbiBTYWNocyBjb21wbHlpbmcgd2l0aCB0aGUgRmVkcyBjYXBpdGFsIGFkZXF1YWN5IHN0YW5kYXJkcyBhbmQgYWRqdXN0aW5nIGNvbnRpbnVvdXNseSB0byBuZXcgcmVndWxhdGlvbnMuIEFkZGl0aW9uYWxseSBpdCBpcyBtZW50aW9uZWQgdGhhdCB0aGV5IGhhdmUgdG8gY29uc2lkZXIgYW5kIG1hbmFnZSBuZXcgcmlza3MgdGhhdCBjb21lcyB3aXRoIHNjcnV0aW55LgoKCiNMNS4yMiBEZXNjcmliZSB0aGUgcmVjZW50IHBlcmZvcm1hbmNlIG9mIHRoZSBzZWN1cml0aWVzIGZpcm0sIGFuZCBleHBsYWluIHdoeSB0aGUgcGVyZm9ybWFuY2UgaGFzIGJlZW4gZmF2b3JhYmxlIG9yIHVuZmF2b3JhYmxlLgojSW4gMjAyNCwgR29sZG1hbiBTYWNocyBleHBlcmllbmNlZCBzdHJvbmcgcGVyZm9ybWFuY2UgaW4gaW52ZXN0bWVudCBiYW5raW5nIGFuZCB0cmFkaW5nLCBwYXJ0aWN1bGFybHkgaW4gZXF1aXR5IGFuZCBmaXhlZC1pbmNvbWUgbWFya2V0cy4gSG93ZXZlciwgd2Vha2VyIGFjdGl2aXR5IGluIG1lcmdlcnMgYW5kIGFjcXVpc2l0aW9ucyBkdWUgdG8gd29yc2UgZWNvbm9taWMgY29uZGl0aW9ucyBjcmVhdGVkIGNoYWxsZW5nZXMuIFRoZSBmaXJtJ3MgZGl2ZXJzaWZpZWQgcmV2ZW51ZSBzb3VyY2VzLCBzdHJlbmd0aGVuZWQgYnkgYXNzZXQgbWFuYWdlbWVudCBhbmQgY29uc3VtZXIgcGxhdGZvcm1zLCBoZWxwZWQga2VlcCBpdHMgb3ZlcmFsbCBwcm9maXRhYmlsaXR5IGFuZCByZXNpbGllbmNlIGFtb25nIHRoZXNlIGZsdWN0dWF0aW9ucy4KCiNMNiBFcXVpdHkgKE5vIFRhc2spCgoKCgojTDcgRml4ZWQgaW5jb21lCiNDb21wYXJpbmcgeWllbGRzIGFtb25nIHNlY3VyaXRpZXMKI0w3LjEgV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB5aWVsZCBvbiBjb3Jwb3JhdGUgaGlnaC1xdWFsaXR5IGJvbmRzIGFuZCB0aGUgeWllbGQgb24gVHJlYXN1cnkgYm9uZHMgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0/IEV4cGxhaW4gd2h5IGRvZXMgdGhlIGRpZmZlcmVuY2UgZXhpc3Q/CiAgIyBJbnN0YWxsIGFuZCBsb2FkIG5lY2Vzc2FyeSBwYWNrYWdlcwogIGlmICghcmVxdWlyZShxdWFudG1vZCkpIGluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikKbGlicmFyeShxdWFudG1vZCkKCgojIERlZmluZSBkYXRlIHJhbmdlCnN0YXJ0X2RhdGUgPC0gYXMuRGF0ZSgiMjAyNC0wNS0wMSIpCmVuZF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMDktMzAiKQoKCiMgRG93bmxvYWQgZGF0YSBmb3IgVHJlYXN1cnkgYW5kIGNvcnBvcmF0ZSBoaWdoLXF1YWxpdHkgYm9uZHMKdHJ5Q2F0Y2goewogIGdldFN5bWJvbHMoIkRHUzEwIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkgICAgICAgIyAxMC15ZWFyIFRyZWFzdXJ5IGJvbmQgeWllbGQKICBnZXRTeW1ib2xzKCJCQU1MQzBBMUNBQUFFWSIsIHNyYyA9ICJGUkVEIiwgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUpICAjIEFBQS1yYXRlZCBjb3Jwb3JhdGUgYm9uZCB5aWVsZAogIAogICMgRXh0cmFjdCB5aWVsZHMgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0KICB0cmVhc3VyeV95aWVsZCA8LSBuYS5vbWl0KERHUzEwW2VuZF9kYXRlXSAvIDEwMCkgICAgICAgICAgICMgQ29udmVydCB0byBwZXJjZW50YWdlCiAgY29ycG9yYXRlX3lpZWxkIDwtIG5hLm9taXQoQkFNTEMwQTFDQUFBRVlbZW5kX2RhdGVdIC8gMTAwKSAjIENvbnZlcnQgdG8gcGVyY2VudGFnZQogIAogICMgQ2FsY3VsYXRlIHRoZSB5aWVsZCBkaWZmZXJlbmNlIChzcHJlYWQpCiAgeWllbGRfZGlmZmVyZW5jZSA8LSBmaXJzdChjb3Jwb3JhdGVfeWllbGQpIC0gZmlyc3QodHJlYXN1cnlfeWllbGQpCiAgCiAgIyBEaXNwbGF5IHJlc3VsdHMKICBjYXQoIjEwLVllYXIgVHJlYXN1cnkgQm9uZCBZaWVsZCBvbiIsIGVuZF9kYXRlLCAiOiIsIHJvdW5kKGZpcnN0KHRyZWFzdXJ5X3lpZWxkKSAqIDEwMCwgMiksICIlXG4iKQogIGNhdCgiQ29ycG9yYXRlIEhpZ2gtUXVhbGl0eSBCb25kIFlpZWxkIG9uIiwgZW5kX2RhdGUsICI6Iiwgcm91bmQoZmlyc3QoY29ycG9yYXRlX3lpZWxkKSAqIDEwMCwgMiksICIlXG4iKQogIGNhdCgiWWllbGQgUHJlbWl1bSAoQ29ycG9yYXRlIC0gVHJlYXN1cnkpOiIsIHJvdW5kKHlpZWxkX2RpZmZlcmVuY2UgKiAxMDAsIDIpLCAiJVxuIikKfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgY2F0KCJFcnJvciByZXRyaWV2aW5nIGRhdGE6IiwgZSRtZXNzYWdlLCAiXG4iKQp9KQoKCiNDb25jbHVzaW9uCiNUaGUgeWllbGQgb24gY29ycG9yYXRlIGhpZ2gtcXVhbGl0eSBib25kcyBpcyBnZW5lcmFsbHkgaGlnaGVyIHRoYW4gVHJlYXN1cnkgYm9uZHMgZHVlIHRvIHRoZSBjcmVkaXQgcmlzayBwcmVtaXVtIGFuZCBsaXF1aWRpdHkgZGlmZmVyZW5jZXMuIFRyZWFzdXJ5IGJvbmRzIGFyZSByaXNrLWZyZWUsIGJhY2tlZCBieSB0aGUgVS5TLiBnb3Zlcm5tZW50LCB3aGlsZSBjb3Jwb3JhdGUgYm9uZHMgY2FycnkgYSBzbWFsbCByaXNrIG9mIGRlZmF1bHQgYW5kIGFyZSBsZXNzIGxpcXVpZCwgcmVxdWlyaW5nIGhpZ2hlciB5aWVsZHMgdG8gY29tcGVuc2F0ZSBpbnZlc3RvcnMuCiNJbiBzdGFibGUgZWNvbm9taWMgY29uZGl0aW9ucywgdGhlIHNwcmVhZCBpcyBuYXJyb3dlciBhcyBpbnZlc3RvcnMgZmVlbCBtb3JlIGNvbmZpZGVudCBpbiBjb3Jwb3JhdGUgYm9uZHMuIER1cmluZyBlY29ub21pYyB1bmNlcnRhaW50eSwgdGhlIHNwcmVhZCB3aWRlbnMgZHVlIHRvIGhpZ2hlciBwZXJjZWl2ZWQgcmlzayBhbmQgaW5jcmVhc2VkIGRlbWFuZCBmb3Igc2FmZXR5LiBUaGlzIGRpZmZlcmVuY2UgaGlnaGxpZ2h0cyB0aGUgdHJhZGUtb2ZmIGJldHdlZW4gc2FmZXR5IGFuZCByZXR1cm4sIHdpdGggVHJlYXN1cnkgYm9uZHMgb2ZmZXJpbmcgc2VjdXJpdHkgYW5kIGNvcnBvcmF0ZSBib25kcyBwcm92aWRpbmcgaGlnaGVyIHlpZWxkcyBmb3IgYWRkaXRpb25hbCByaXNrLgoKCiNMNy4yIFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgeWllbGQgb24gbG9uZy10ZXJtIFRyZWFzdXJ5IGJvbmRzIGFuZCB0aGUgeWllbGQgb24gbG9uZy10ZXJtIG11bmljaXBhbCBib25kcyBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybT8gRXhwbGFpbiB3aHkgZG9lcyB0aGUgZGlmZmVyZW5jZSBleGlzdD8KICAKICAKICAjQXNzZXNzaW5nIHRoZSBmb3JlY2FzdGluZyBhYmlsaXR5IG9mIHRoZSB5aWVsZCBjdXJ2ZQojTDcuMyBXaGF0IHdhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAyNi13ZWVrIFQtYmlsbCB5aWVsZCBhbmQgdGhlIDEzLXdlZWsgVC1iaWxsIHlpZWxkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjaG9vbCB0ZXJtPwogCiAjIEluc3RhbGwgYW5kIGxvYWQgbmVjZXNzYXJ5IHBhY2thZ2VzCiAgaWYgKCFyZXF1aXJlKHF1YW50bW9kKSkgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiKQpsaWJyYXJ5KHF1YW50bW9kKQoKCiMgRGVmaW5lIHRoZSBzdGFydCBkYXRlIG9mIHRoZSBzY2hvb2wgdGVybQpzdGFydF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMDUtMDEiKQoKCiMgRG93bmxvYWQgZGF0YSBmb3IgMjYtd2VlayBhbmQgMTMtd2VlayBULWJpbGwgeWllbGRzCnRyeUNhdGNoKHsKICBnZXRTeW1ib2xzKCJEVEI2Iiwgc3JjID0gIkZSRUQiLCBmcm9tID0gIjIwMjQtMDQtMDEiLCB0byA9ICIyMDI0LTA1LTE1IikgICMgMjYtd2VlayBULWJpbGwKICBnZXRTeW1ib2xzKCJEVEIzIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gIjIwMjQtMDQtMDEiLCB0byA9ICIyMDI0LTA1LTE1IikgICMgMTMtd2VlayBULWJpbGwKICAKICAKICAjIEV4dHJhY3QgeWllbGRzIGF0IHRoZSBzdGFydCBvZiB0aGUgc2Nob29sIHRlcm0KICB0X2JpbGxfMjZfeWllbGQgPC0gbmEub21pdChEVEI2W3N0YXJ0X2RhdGVdIC8gMTAwKSAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKICB0X2JpbGxfMTNfeWllbGQgPC0gbmEub21pdChEVEIzW3N0YXJ0X2RhdGVdIC8gMTAwKSAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKICAKICAKICAjIENhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBpbiB5aWVsZHMKICB5aWVsZF9kaWZmZXJlbmNlIDwtIGZpcnN0KHRfYmlsbF8yNl95aWVsZCkgLSBmaXJzdCh0X2JpbGxfMTNfeWllbGQpCiAgCiAgCiAgIyBEaXNwbGF5IHJlc3VsdHMKICBjYXQoIjI2LXdlZWsgVC1iaWxsIHlpZWxkIG9uIiwgc3RhcnRfZGF0ZSwgIjoiLCByb3VuZChmaXJzdCh0X2JpbGxfMjZfeWllbGQpICogMTAwLCAyKSwgIiVcbiIpCiAgY2F0KCIxMy13ZWVrIFQtYmlsbCB5aWVsZCBvbiIsIHN0YXJ0X2RhdGUsICI6Iiwgcm91bmQoZmlyc3QodF9iaWxsXzEzX3lpZWxkKSAqIDEwMCwgMiksICIlXG4iKQogIGNhdCgiWWllbGQgRGlmZmVyZW5jZSAoMjYtd2VlayAtIDEzLXdlZWspOiIsIHJvdW5kKHlpZWxkX2RpZmZlcmVuY2UgKiAxMDAsIDIpLCAiJVxuIikKfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgY2F0KCJFcnJvciByZXRyaWV2aW5nIGRhdGE6IiwgZSRtZXNzYWdlLCAiXG4iKQp9KQoKCgoKCgoKCiNDb25jbHVzaW9uCiNUaGUgZGlmZmVyZW5jZSBpbiB5aWVsZHMgYmV0d2VlbiB0aGUgMjYtd2VlayBULWJpbGwgYW5kIHRoZSAxMy13ZWVrIFQtYmlsbCBvbiBNYXkgMSwgMjAyNCwgcHJvdmlkZXMgaW5zaWdodCBpbnRvIHRoZSBzbG9wZSBvZiB0aGUgc2hvcnQtdGVybSB5aWVsZCBjdXJ2ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybS4gQSBwb3NpdGl2ZSBkaWZmZXJlbmNlIGluZGljYXRlcyBhbiB1cHdhcmQgc2xvcGUsIHN1Z2dlc3RpbmcgbWFya2V0IGV4cGVjdGF0aW9ucyBvZiByaXNpbmcgaW50ZXJlc3QgcmF0ZXMgb3ZlciB0aGUgbmVhciB0ZXJtLiBDb252ZXJzZWx5LCBhIG5lZ2F0aXZlIGRpZmZlcmVuY2Ugd291bGQgc3VnZ2VzdCBhIGRvd253YXJkIHNsb3BlLCBpbmRpY2F0aW5nIGV4cGVjdGF0aW9ucyBvZiBkZWNsaW5pbmcgaW50ZXJlc3QgcmF0ZXMuCiNUaGlzIGNvbXBhcmlzb24gaGVscHMgdG8gdW5kZXJzdGFuZCBtYXJrZXQgc2VudGltZW50IGFib3V0IHRoZSBkaXJlY3Rpb24gb2Ygc2hvcnQtdGVybSBpbnRlcmVzdCByYXRlcyBhbmQgb3ZlcmFsbCBlY29ub21pYyBjb25kaXRpb25zLiBJdCByZWZsZWN0cyBob3cgaW52ZXN0b3JzIHByaWNlIHJpc2sgYW5kIGxpcXVpZGl0eSBhY3Jvc3MgZGlmZmVyZW50IG1hdHVyaXRpZXMgd2l0aGluIHRoZSBUcmVhc3VyeSBtYXJrZXQuCgoKI0w3LjQgRG9lcyB0aGlzIGltcGx5IHRoYXQgdGhlIHlpZWxkIGN1cnZlIGhhZCBhbiB1cHdhcmQgb3IgZG93bndhcmQgc2xvcGUgYXQgdGhhdCB0aW1lPwogIAojIERldGVybWluZSB0aGUgc2xvcGUgb2YgdGhlIHlpZWxkIGN1cnZlIGFuZCBtYXJrZXQgZXhwZWN0YXRpb25zCiAgaWYgKGV4aXN0cygieWllbGRfZGlmZmVyZW5jZSIpKSB7CiAgICBpZiAoeWllbGRfZGlmZmVyZW5jZSA+IDApIHsKICAgICAgY2F0KCJUaGUgdXB3YXJkIHNsb3BlIG9mIHRoZSB5aWVsZCBjdXJ2ZSBhdCB0aGF0IHRpbWUgaW1wbGllcyB0aGF0IHRoZSBtYXJrZXQgZXhwZWN0ZWQgaGlnaGVyIGludGVyZXN0IHJhdGVzIGluIHRoZSBmdXR1cmUuXG4iKQogICAgfSBlbHNlIGlmICh5aWVsZF9kaWZmZXJlbmNlIDwgMCkgewogICAgICBjYXQoIlRoZSBkb3dud2FyZCBzbG9wZSBvZiB0aGUgeWllbGQgY3VydmUgYXQgdGhhdCB0aW1lIGltcGxpZXMgdGhhdCB0aGUgbWFya2V0IGV4cGVjdGVkIGxvd2VyIGludGVyZXN0IHJhdGVzIGluIHRoZSBmdXR1cmUuXG4iKQogICAgfSBlbHNlIHsKICAgICAgY2F0KCJBIGZsYXQgeWllbGQgY3VydmUgYXQgdGhhdCB0aW1lIGltcGxpZXMgdGhhdCB0aGUgbWFya2V0IGRpZCBub3QgZXhwZWN0IHNpZ25pZmljYW50IGNoYW5nZXMgaW4gaW50ZXJlc3QgcmF0ZXMuXG4iKQogICAgfQogIH0gZWxzZSB7CiAgICBjYXQoIllpZWxkIGRpZmZlcmVuY2UgaXMgbm90IGF2YWlsYWJsZTsgdW5hYmxlIHRvIGRldGVybWluZSB0aGUgc2xvcGUgb2YgdGhlIHlpZWxkIGN1cnZlLlxuIikKICB9CgoKCgoKCiNDb25jbHVzaW9uCiNUaGUgc2xvcGUgb2YgdGhlIHlpZWxkIGN1cnZlIHByb3ZpZGVzIGluc2lnaHQgaW50byBtYXJrZXQgZXhwZWN0YXRpb25zIGZvciBmdXR1cmUgaW50ZXJlc3QgcmF0ZXM6CiMgVXB3YXJkIHNsb3BlIChwb3NpdGl2ZSB5aWVsZCBkaWZmZXJlbmNlKTogSW5kaWNhdGVzIHRoYXQgdGhlIG1hcmtldCBleHBlY3RlZCBoaWdoZXIgaW50ZXJlc3QgcmF0ZXMgaW4gdGhlIGZ1dHVyZSwgb2Z0ZW4gcmVmbGVjdGluZyBvcHRpbWlzbSBhYm91dCBlY29ub21pYyBncm93dGguCiNEb3dud2FyZCBzbG9wZSAobmVnYXRpdmUgeWllbGQgZGlmZmVyZW5jZSk6IFN1Z2dlc3RzIGV4cGVjdGF0aW9ucyBvZiBsb3dlciBpbnRlcmVzdCByYXRlcywgcG9zc2libHkgZHVlIHRvIGNvbmNlcm5zIGFib3V0IHNsb3dpbmcgZWNvbm9taWMgYWN0aXZpdHkuCiNGbGF0IGN1cnZlIChubyB5aWVsZCBkaWZmZXJlbmNlKTogSW1wbGllcyB0aGF0IHRoZSBtYXJrZXQgZGlkIG5vdCBhbnRpY2lwYXRlIHNpZ25pZmljYW50IGNoYW5nZXMgaW4gcmF0ZXMsIHJlZmxlY3RpbmcgYSBuZXV0cmFsIG9yIHVuY2VydGFpbiBvdXRsb29rLgojVGhpcyBhbmFseXNpcyBoaWdobGlnaHRzIGhvdyBzaG9ydC10ZXJtIHlpZWxkIGN1cnZlcyBzZXJ2ZSBhcyBpbmRpY2F0b3JzIG9mIGVjb25vbWljIHNlbnRpbWVudCBhbmQgbW9uZXRhcnkgcG9saWN5IGV4cGVjdGF0aW9ucy4KCgojTDcuNSBBc3N1bWluZyB0aGF0IHRoaXMgc2xvcGUgY2FuIGJlIHByaW1hcmlseSBhdHRyaWJ1dGVkIHRvIGV4cGVjdGF0aW9ucyB0aGVvcnksIGRpZCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzbG9wZSBpbmRpY2F0ZSB0aGF0IHRoZSBtYXJrZXQgZXhwZWN0ZWQgaGlnaGVyIG9yIGxvd2VyIGludGVyZXN0IHJhdGVzIGluIHRoZSBmdXR1cmU/CiAKI1dpdGggdGhlIHNhbWUgY29kZSAoTDcuNCkKI0FjY29yZGluZyB0byBleHBlY3RhdGlvbnMgdGhlb3J5LCB0aGUgc2xvcGUgb2YgdGhlIHlpZWxkIGN1cnZlIHJlZmxlY3RzIG1hcmtldCBwcmVkaWN0aW9ucyBhYm91dCBmdXR1cmUgaW50ZXJlc3QgcmF0ZXM6CgojVXB3YXJkIHNsb3BlOiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWFya2V0IGV4cGVjdGVkIGhpZ2hlciBpbnRlcmVzdCByYXRlcyBpbiB0aGUgZnV0dXJlLCBvZnRlbiBzaWduYWxpbmcgb3B0aW1pc20gYWJvdXQgZWNvbm9taWMgZ3Jvd3RoIG9yIHBvdGVudGlhbCBtb25ldGFyeSB0aWdodGVuaW5nLgoKI0Rvd253YXJkIHNsb3BlOiBTdWdnZXN0cyB0aGF0IHRoZSBtYXJrZXQgZXhwZWN0ZWQgbG93ZXIgaW50ZXJlc3QgcmF0ZXMgaW4gdGhlIGZ1dHVyZSwgcmVmbGVjdGluZyBjb25jZXJucyBhYm91dCBlY29ub21pYyBzbG93ZG93biBvciBwb3RlbnRpYWwgbW9uZXRhcnkgZWFzaW5nLgoKI0ZsYXQgY3VydmU6IFN1Z2dlc3RzIHRoYXQgdGhlIG1hcmtldCBleHBlY3RlZCBzdGFibGUgaW50ZXJlc3QgcmF0ZXMgd2l0aCBubyBzaWduaWZpY2FudCBjaGFuZ2VzIGFudGljaXBhdGVkLgoKI1RoaXMgYW5hbHlzaXMgZGVtb25zdHJhdGVzIGhvdyBtYXJrZXQgZXhwZWN0YXRpb25zIGFib3V0IGludGVyZXN0IHJhdGVzIGFyZSBlbWJlZGRlZCBpbiB0aGUgeWllbGQgY3VydmUncyBzbG9wZS4KCgojTDcuNiBEaWQgaW50ZXJlc3QgcmF0ZXMgbW92ZSBpbiB0aGF0IGRpcmVjdGlvbiBvdmVyIHRoZSBzY2hvb2wgdGVybT8KCiMgSW5zdGFsbCBhbmQgbG9hZCBuZWNlc3NhcnkgcGFja2FnZXMKaWYgKCFyZXF1aXJlKHF1YW50bW9kKSkgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiKQpsaWJyYXJ5KHF1YW50bW9kKQoKCiMgRGVmaW5lIHRoZSBkYXRlcyBmb3IgdGhlIHNjaG9vbCB0ZXJtCnN0YXJ0X2RhdGUgPC0gYXMuRGF0ZSgiMjAyNC0wNS0wMSIpCmVuZF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMDktMzAiKQoKCiMgRG93bmxvYWQgZGF0YSBmb3IgMTMtd2VlayBhbmQgMjYtd2VlayBULWJpbGwgeWllbGRzCnRyeUNhdGNoKHsKICBnZXRTeW1ib2xzKCJEVEI2Iiwgc3JjID0gIkZSRUQiLCBmcm9tID0gIjIwMjQtMDQtMDEiLCB0byA9ICIyMDI0LTEwLTAxIikgICMgMjYtd2VlayBULWJpbGwKICBnZXRTeW1ib2xzKCJEVEIzIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gIjIwMjQtMDQtMDEiLCB0byA9ICIyMDI0LTEwLTAxIikgICMgMTMtd2VlayBULWJpbGwKCgogICMgRXh0cmFjdCB5aWVsZHMgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtCiAgdF9iaWxsXzI2X3N0YXJ0IDwtIG5hLm9taXQoRFRCNltzdGFydF9kYXRlXSAvIDEwMCkgICMgQ29udmVydCB0byBwZXJjZW50YWdlCiAgdF9iaWxsXzEzX3N0YXJ0IDwtIG5hLm9taXQoRFRCM1tzdGFydF9kYXRlXSAvIDEwMCkgICMgQ29udmVydCB0byBwZXJjZW50YWdlCiAgdF9iaWxsXzI2X2VuZCA8LSBuYS5vbWl0KERUQjZbZW5kX2RhdGVdIC8gMTAwKSAgICAgICMgQ29udmVydCB0byBwZXJjZW50YWdlCiAgdF9iaWxsXzEzX2VuZCA8LSBuYS5vbWl0KERUQjNbZW5kX2RhdGVdIC8gMTAwKSAgICAgICMgQ29udmVydCB0byBwZXJjZW50YWdlCgoKICAjIENoZWNrIGlmIGludGVyZXN0IHJhdGVzIG1vdmVkIGluIHRoZSBleHBlY3RlZCBkaXJlY3Rpb24KICBpZiAobGVuZ3RoKHRfYmlsbF8yNl9zdGFydCkgPiAwICYmIGxlbmd0aCh0X2JpbGxfMjZfZW5kKSA+IDAgJiYKICAgICAgbGVuZ3RoKHRfYmlsbF8xM19zdGFydCkgPiAwICYmIGxlbmd0aCh0X2JpbGxfMTNfZW5kKSA+IDApIHsKCgogICAgY2F0KCIxMy13ZWVrIFQtYmlsbCB5aWVsZDpcbiIpCiAgICBjYXQoIiAgU3RhcnQ6Iiwgcm91bmQoZmlyc3QodF9iaWxsXzEzX3N0YXJ0KSAqIDEwMCwgMiksICIlXG4iKQogICAgY2F0KCIgIEVuZDoiLCByb3VuZChmaXJzdCh0X2JpbGxfMTNfZW5kKSAqIDEwMCwgMiksICIlXG4iKQoKCiAgICBjYXQoIjI2LXdlZWsgVC1iaWxsIHlpZWxkOlxuIikKICAgIGNhdCgiICBTdGFydDoiLCByb3VuZChmaXJzdCh0X2JpbGxfMjZfc3RhcnQpICogMTAwLCAyKSwgIiVcbiIpCiAgICBjYXQoIiAgRW5kOiIsIHJvdW5kKGZpcnN0KHRfYmlsbF8yNl9lbmQpICogMTAwLCAyKSwgIiVcbiIpCgoKICAgICMgQW5hbHl6ZSB0aGUgbW92ZW1lbnQgaW4gaW50ZXJlc3QgcmF0ZXMKICAgIGlmIChmaXJzdCh0X2JpbGxfMjZfZW5kKSA+IGZpcnN0KHRfYmlsbF8yNl9zdGFydCkgJiYKICAgICAgICBmaXJzdCh0X2JpbGxfMTNfZW5kKSA+IGZpcnN0KHRfYmlsbF8xM19zdGFydCkpIHsKICAgICAgY2F0KCJJbnRlcmVzdCByYXRlcyBpbmNyZWFzZWQgb3ZlciB0aGUgc2Nob29sIHRlcm0sIGFsaWduaW5nIHdpdGggYW4gdXB3YXJkIHlpZWxkIGN1cnZlLlxuIikKICAgIH0gZWxzZSBpZiAoZmlyc3QodF9iaWxsXzI2X2VuZCkgPCBmaXJzdCh0X2JpbGxfMjZfc3RhcnQpICYmCiAgICAgICAgICAgICAgIGZpcnN0KHRfYmlsbF8xM19lbmQpIDwgZmlyc3QodF9iaWxsXzEzX3N0YXJ0KSkgewogICAgICBjYXQoIkludGVyZXN0IHJhdGVzIGRlY3JlYXNlZCBvdmVyIHRoZSBzY2hvb2wgdGVybSwgYWxpZ25pbmcgd2l0aCBhIGRvd253YXJkIHlpZWxkIGN1cnZlLlxuIikKICAgIH0gZWxzZSB7CiAgICAgIGNhdCgiSW50ZXJlc3QgcmF0ZXMgbW92ZWQgaW5jb25zaXN0ZW50bHksIG5vdCBmdWxseSBhbGlnbmluZyB3aXRoIHRoZSBpbml0aWFsIHlpZWxkIGN1cnZlIGV4cGVjdGF0aW9ucy5cbiIpCiAgICB9CiAgfSBlbHNlIHsKICAgIGNhdCgiSW5zdWZmaWNpZW50IGRhdGEgdG8gYW5hbHl6ZSBpbnRlcmVzdCByYXRlIG1vdmVtZW50cy5cbiIpCiAgfQp9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICBjYXQoIkVycm9yIHJldHJpZXZpbmcgZGF0YToiLCBlJG1lc3NhZ2UsICJcbiIpCn0pCgoKI0lmIGludGVyZXN0IHJhdGVzIG1vdmVkIGFzIGV4cGVjdGVkLCByaXNpbmcgcmF0ZXMgd291bGQgYWxpZ24gd2l0aCBhbiB1cHdhcmQtc2xvcGluZyB5aWVsZCBjdXJ2ZSwgcmVmbGVjdGluZyBtYXJrZXQgYW50aWNpcGF0aW9uIG9mIGVjb25vbWljIGdyb3d0aCBvciBpbmZsYXRpb24sIHdoaWxlIGZhbGxpbmcgcmF0ZXMgd291bGQgYWxpZ24gd2l0aCBhIGRvd253YXJkIHNsb3BlLCBzaWduYWxpbmcgY29uY2VybnMgYWJvdXQgYSBzbG93ZG93biBvciBtb25ldGFyeSBlYXNpbmcuIElmIHJhdGVzIGRpZCBub3QgbW92ZSBhcyBleHBlY3RlZCwgZXh0ZXJuYWwgZmFjdG9ycyBzdWNoIGFzIGdlb3BvbGl0aWNhbCBldmVudHMsIG1vbmV0YXJ5IHBvbGljeSBjaGFuZ2VzLCBvciB1bmV4cGVjdGVkIGVjb25vbWljIGRhdGEgbWF5IGhhdmUgZGlzcnVwdGVkIGluaXRpYWwgbWFya2V0IHByZWRpY3Rpb25zLiBUaGlzIGFuYWx5c2lzIGhpZ2hsaWdodHMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFQtYmlsbCB5aWVsZCBtb3ZlbWVudHMgYW5kIHRoZSBleHBlY3RhdGlvbnMgaW1wbGllZCBieSB0aGUgeWllbGQgY3VydmUsIG9mZmVyaW5nIHZhbHVhYmxlIGluc2lnaHQgaW50byB0aGUgYWNjdXJhY3kgb2YgbWFya2V0IHNlbnRpbWVudC4KCgojRXhwbGFpbmluZyBzaGlmdHMgaW4gdGhlIHlpZWxkIGN1cnZlIG92ZXIgdGltZQojTDcuNyBXaGF0IHdhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCBhbmQgdGhlIDEzLXdlZWsgVC1iaWxsIHlpZWxkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjaG9vbCB0ZXJtPwoKIyBJbnN0YWxsIGFuZCBsb2FkIG5lY2Vzc2FyeSBwYWNrYWdlcwppZiAoIXJlcXVpcmUocXVhbnRtb2QpKSBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIpCmxpYnJhcnkocXVhbnRtb2QpCgoKIyBEZWZpbmUgdGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHNjaG9vbCB0ZXJtCnN0YXJ0X2RhdGUgPC0gYXMuRGF0ZSgiMjAyNC0wNS0wMSIpCgoKIyBEb3dubG9hZCBkYXRhIGZvciBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCBhbmQgMTMtd2VlayBULWJpbGwgeWllbGRzCnRyeUNhdGNoKHsKICAgIGdldFN5bWJvbHMoIkRHUzMwIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gIjIwMjQtMDQtMDEiLCB0byA9ICIyMDI0LTA1LTE1IikgICMgMzAteWVhciBUcmVhc3VyeSBib25kCiAgICBnZXRTeW1ib2xzKCJEVEIzIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gIjIwMjQtMDQtMDEiLCB0byA9ICIyMDI0LTA1LTE1IikgICMgMTMtd2VlayBULWJpbGwKCgogICAgIyBFeHRyYWN0IHlpZWxkcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNjaG9vbCB0ZXJtCiAgICBsb25nX3Rlcm1feWllbGQgPC0gbmEub21pdChER1MzMFtzdGFydF9kYXRlXSAvIDEwMCkgICMgQ29udmVydCB0byBwZXJjZW50YWdlCiAgICBzaG9ydF90ZXJtX3lpZWxkIDwtIG5hLm9taXQoRFRCM1tzdGFydF9kYXRlXSAvIDEwMCkgICMgQ29udmVydCB0byBwZXJjZW50YWdlCgoKICAgICMgQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlCiAgICB5aWVsZF9kaWZmZXJlbmNlIDwtIGZpcnN0KGxvbmdfdGVybV95aWVsZCkgLSBmaXJzdChzaG9ydF90ZXJtX3lpZWxkKQoKCiAgICAjIERpc3BsYXkgcmVzdWx0cwogICAgY2F0KCIzMC1ZZWFyIFRyZWFzdXJ5IEJvbmQgWWllbGQgb24iLCBzdGFydF9kYXRlLCAiOiIsIHJvdW5kKGZpcnN0KGxvbmdfdGVybV95aWVsZCkgKiAxMDAsIDIpLCAiJVxuIikKICAgIGNhdCgiMTMtV2VlayBULUJpbGwgWWllbGQgb24iLCBzdGFydF9kYXRlLCAiOiIsIHJvdW5kKGZpcnN0KHNob3J0X3Rlcm1feWllbGQpICogMTAwLCAyKSwgIiVcbiIpCiAgICBjYXQoIllpZWxkIERpZmZlcmVuY2UgKDMwLVllYXIgLSAxMy1XZWVrKToiLCByb3VuZCh5aWVsZF9kaWZmZXJlbmNlICogMTAwLCAyKSwgIiVcbiIpCn0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgY2F0KCJFcnJvciByZXRyaWV2aW5nIGRhdGE6IiwgZSRtZXNzYWdlLCAiXG4iKQp9KQoKCgoKCgojQ29uY2x1c2lvbgojVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbG9uZy10ZXJtIFRyZWFzdXJ5IGJvbmQgeWllbGQgYW5kIHRoZSAxMy13ZWVrIFQtYmlsbCB5aWVsZCBvbiBNYXkgMSwgMjAyNCwgcmVmbGVjdHMgdGhlIHNoYXBlIG9mIHRoZSB5aWVsZCBjdXJ2ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybToKI0EgcG9zaXRpdmUgZGlmZmVyZW5jZSBzdWdnZXN0cyBhIG5vcm1hbCwgdXB3YXJkLXNsb3BpbmcgeWllbGQgY3VydmUsIGluZGljYXRpbmcgbWFya2V0IGV4cGVjdGF0aW9ucyBvZiBoaWdoZXIgZnV0dXJlIGludGVyZXN0IHJhdGVzIGFuZCBwb3RlbnRpYWwgZWNvbm9taWMgZ3Jvd3RoLgojQSBuZWdhdGl2ZSBkaWZmZXJlbmNlIHN1Z2dlc3RzIGFuIGludmVydGVkIHlpZWxkIGN1cnZlLCBvZnRlbiBzaWduYWxpbmcgZXhwZWN0YXRpb25zIG9mIGxvd2VyIGZ1dHVyZSBpbnRlcmVzdCByYXRlcyBhbmQgcG90ZW50aWFsIGVjb25vbWljIHNsb3dkb3duLgojQSB6ZXJvIGRpZmZlcmVuY2UgcmVmbGVjdHMgYSBmbGF0IHlpZWxkIGN1cnZlLCBpbmRpY2F0aW5nIHN0YWJsZSBpbnRlcmVzdCByYXRlIGV4cGVjdGF0aW9ucy4KI1RoaXMgZGlmZmVyZW5jZSBwcm92aWRlcyB2YWx1YWJsZSBpbnNpZ2h0cyBpbnRvIG1hcmtldCBzZW50aW1lbnQgYW5kIGVjb25vbWljIG91dGxvb2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXJtLgoKCiNMNy44IFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbG9uZy10ZXJtIFRyZWFzdXJ5IGJvbmQgeWllbGQgYW5kIHRoZSAxMy13ZWVrIFQtYmlsbCB5aWVsZCBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybT8KCiMgSW5zdGFsbCBhbmQgbG9hZCBuZWNlc3NhcnkgcGFja2FnZXMKaWYgKCFyZXF1aXJlKHF1YW50bW9kKSkgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiKQpsaWJyYXJ5KHF1YW50bW9kKQoKCiMgRGVmaW5lIHRoZSBlbmQgZGF0ZSBvZiB0aGUgc2Nob29sIHRlcm0KZW5kX2RhdGUgPC0gYXMuRGF0ZSgiMjAyNC0wOS0zMCIpCgoKIyBEb3dubG9hZCBkYXRhIGZvciBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCBhbmQgMTMtd2VlayBULWJpbGwgeWllbGRzCnRyeUNhdGNoKHsKICAgIGdldFN5bWJvbHMoIkRHUzMwIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gIjIwMjQtMDgtMDEiLCB0byA9ICIyMDI0LTEwLTAxIikgICMgMzAteWVhciBUcmVhc3VyeSBib25kCiAgICBnZXRTeW1ib2xzKCJEVEIzIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gIjIwMjQtMDgtMDEiLCB0byA9ICIyMDI0LTEwLTAxIikgICMgMTMtd2VlayBULWJpbGwKCgogICAgIyBFeHRyYWN0IHlpZWxkcyBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybQogICAgbG9uZ190ZXJtX3lpZWxkIDwtIG5hLm9taXQoREdTMzBbZW5kX2RhdGVdIC8gMTAwKSAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKICAgIHNob3J0X3Rlcm1feWllbGQgPC0gbmEub21pdChEVEIzW2VuZF9kYXRlXSAvIDEwMCkgICMgQ29udmVydCB0byBwZXJjZW50YWdlCgoKICAgICMgQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlCiAgICB5aWVsZF9kaWZmZXJlbmNlIDwtIGZpcnN0KGxvbmdfdGVybV95aWVsZCkgLSBmaXJzdChzaG9ydF90ZXJtX3lpZWxkKQoKCiAgICAjIERpc3BsYXkgcmVzdWx0cwogICAgY2F0KCIzMC1ZZWFyIFRyZWFzdXJ5IEJvbmQgWWllbGQgb24iLCBlbmRfZGF0ZSwgIjoiLCByb3VuZChmaXJzdChsb25nX3Rlcm1feWllbGQpICogMTAwLCAyKSwgIiVcbiIpCiAgICBjYXQoIjEzLVdlZWsgVC1CaWxsIFlpZWxkIG9uIiwgZW5kX2RhdGUsICI6Iiwgcm91bmQoZmlyc3Qoc2hvcnRfdGVybV95aWVsZCkgKiAxMDAsIDIpLCAiJVxuIikKICAgIGNhdCgiWWllbGQgRGlmZmVyZW5jZSAoMzAtWWVhciAtIDEzLVdlZWspOiIsIHJvdW5kKHlpZWxkX2RpZmZlcmVuY2UgKiAxMDAsIDIpLCAiJVxuIikKfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICBjYXQoIkVycm9yIHJldHJpZXZpbmcgZGF0YToiLCBlJG1lc3NhZ2UsICJcbiIpCn0pCgoKCgojQ29uY2x1c2lvbgojVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbG9uZy10ZXJtIFRyZWFzdXJ5IGJvbmQgeWllbGQgYW5kIHRoZSAxMy13ZWVrIFQtYmlsbCB5aWVsZCBvbiBTZXB0ZW1iZXIgMzAsIDIwMjQsIHByb3ZpZGVzIGluc2lnaHQgaW50byB0aGUgc2hhcGUgb2YgdGhlIHlpZWxkIGN1cnZlIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtIHRoZSBwb3NpdGl2ZSBkaWZmZXJlbmNlIHN1Z2dlc3RzIGFuIHVwd2FyZC1zbG9waW5nIHlpZWxkIGN1cnZlLCBpbmRpY2F0aW5nIGV4cGVjdGF0aW9ucyBvZiByaXNpbmcgZnV0dXJlIGludGVyZXN0IHJhdGVzIGFuZCBwb3RlbnRpYWwgZWNvbm9taWMgZXhwYW5zaW9uIHRoZSBuZWdhdGl2ZSBkaWZmZXJlbmNlIHN1Z2dlc3RzIGFuIGludmVydGVkIHlpZWxkIGN1cnZlLCBvZnRlbiBzaWduYWxpbmcgZXhwZWN0YXRpb25zIG9mIGRlY2xpbmluZyBmdXR1cmUgaW50ZXJlc3QgcmF0ZXMgYW5kIHBvdGVudGlhbCBlY29ub21pYyBkb3dudHVybiBhbmQgdGhlIHplcm8gZGlmZmVyZW5jZSByZWZsZWN0cyBhIGZsYXQgeWllbGQgY3VydmUsIGluZGljYXRpbmcgc3RhYmxlIGludGVyZXN0IHJhdGUgZXhwZWN0YXRpb25zLgojVGhpcyBkaWZmZXJlbmNlIGhlbHBzIGFuYWx5emUgaG93IG1hcmtldCBzZW50aW1lbnQgYW5kIGVjb25vbWljIGNvbmRpdGlvbnMgZXZvbHZlZCBkdXJpbmcgdGhlIHNjaG9vbCB0ZXJtLgoKCiNMNy45IEdpdmVuIHlvdXIgYW5zd2VycyB0byB0aGUgdHdvIHByZXZpb3VzIHF1ZXN0aW9ucywgZGVzY3JpYmUgaG93IHRoZSB5aWVsZCBjdXJ2ZSBjaGFuZ2VkIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLiBFeHBsYWluIHRoZSBjaGFuZ2VzIGluIGV4cGVjdGF0aW9ucyBhYm91dCBmdXR1cmUgaW50ZXJlc3QgcmF0ZXMgdGhhdCBhcmUgaW1wbGllZCBieSB0aGUgc2hpZnQgaW4gdGhlIHlpZWxkIGN1cnZlIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLgoKIyBJbnN0YWxsIGFuZCBsb2FkIG5lY2Vzc2FyeSBwYWNrYWdlcwppZiAoIXJlcXVpcmUocXVhbnRtb2QpKSBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIpCmxpYnJhcnkocXVhbnRtb2QpCgoKIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCBkYXRlcyBvZiB0aGUgc2Nob29sIHRlcm0Kc3RhcnRfZGF0ZSA8LSBhcy5EYXRlKCIyMDI0LTA1LTAxIikKZW5kX2RhdGUgPC0gYXMuRGF0ZSgiMjAyNC0wOS0zMCIpCgoKIyBEb3dubG9hZCBkYXRhIGZvciBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCBhbmQgMTMtd2VlayBULWJpbGwgeWllbGRzCnRyeUNhdGNoKHsKICAgIGdldFN5bWJvbHMoIkRHUzMwIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gIjIwMjQtMDQtMDEiLCB0byA9ICIyMDI0LTEwLTAxIikgICMgMzAteWVhciBUcmVhc3VyeSBib25kCiAgICBnZXRTeW1ib2xzKCJEVEIzIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gIjIwMjQtMDQtMDEiLCB0byA9ICIyMDI0LTEwLTAxIikgICMgMTMtd2VlayBULWJpbGwKCgogICAgIyBFeHRyYWN0IHlpZWxkcyBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0KICAgIGxvbmdfdGVybV9zdGFydCA8LSBuYS5vbWl0KERHUzMwW3N0YXJ0X2RhdGVdIC8gMTAwKSAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKICAgIHNob3J0X3Rlcm1fc3RhcnQgPC0gbmEub21pdChEVEIzW3N0YXJ0X2RhdGVdIC8gMTAwKSAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKICAgIGxvbmdfdGVybV9lbmQgPC0gbmEub21pdChER1MzMFtlbmRfZGF0ZV0gLyAxMDApICAgICAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKICAgIHNob3J0X3Rlcm1fZW5kIDwtIG5hLm9taXQoRFRCM1tlbmRfZGF0ZV0gLyAxMDApICAgICAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKCgogICAgIyBDYWxjdWxhdGUgeWllbGQgZGlmZmVyZW5jZXMgKHNwcmVhZHMpCiAgICBpbml0aWFsX3NwcmVhZCA8LSBmaXJzdChsb25nX3Rlcm1fc3RhcnQpIC0gZmlyc3Qoc2hvcnRfdGVybV9zdGFydCkKICAgIGZpbmFsX3NwcmVhZCA8LSBmaXJzdChsb25nX3Rlcm1fZW5kKSAtIGZpcnN0KHNob3J0X3Rlcm1fZW5kKQoKCiAgICAjIERpc3BsYXkgcmVzdWx0cwogICAgY2F0KCJJbml0aWFsIFNwcmVhZCAoTWF5IDEsIDIwMjQpOiIsIHJvdW5kKGluaXRpYWxfc3ByZWFkICogMTAwLCAyKSwgIiVcbiIpCiAgICBjYXQoIkZpbmFsIFNwcmVhZCAoU2VwdGVtYmVyIDMwLCAyMDI0KToiLCByb3VuZChmaW5hbF9zcHJlYWQgKiAxMDAsIDIpLCAiJVxuIikKCgogICAgIyBBbmFseXplIGNoYW5nZXMgaW4gdGhlIHlpZWxkIGN1cnZlCiAgICBpZiAoZmluYWxfc3ByZWFkID4gaW5pdGlhbF9zcHJlYWQpIHsKICAgICAgICBjYXQoIlRoZSB5aWVsZCBjdXJ2ZSBzdGVlcGVuZWQgb3ZlciB0aGUgc2Nob29sIHRlcm0sIGltcGx5aW5nIGV4cGVjdGF0aW9ucyBvZiBoaWdoZXIgZnV0dXJlIGludGVyZXN0IHJhdGVzLlxuIikKICAgIH0gZWxzZSBpZiAoZmluYWxfc3ByZWFkIDwgaW5pdGlhbF9zcHJlYWQpIHsKICAgICAgICBjYXQoIlRoZSB5aWVsZCBjdXJ2ZSBmbGF0dGVuZWQgb3IgaW52ZXJ0ZWQgb3ZlciB0aGUgc2Nob29sIHRlcm0sIGltcGx5aW5nIGV4cGVjdGF0aW9ucyBvZiBsb3dlciBvciBzdGFibGUgZnV0dXJlIGludGVyZXN0IHJhdGVzLlxuIikKICAgIH0gZWxzZSB7CiAgICAgICAgY2F0KCJUaGUgeWllbGQgY3VydmUgcmVtYWluZWQgdW5jaGFuZ2VkIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLCBpbmRpY2F0aW5nIG5vIHNpZ25pZmljYW50IGNoYW5nZSBpbiBpbnRlcmVzdCByYXRlIGV4cGVjdGF0aW9ucy5cbiIpCiAgICB9Cn0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgY2F0KCJFcnJvciByZXRyaWV2aW5nIGRhdGE6IiwgZSRtZXNzYWdlLCAiXG4iKQp9KQoKCgoKCgojQ29uY2x1c2lvbiAKI092ZXIgdGhlIHNjaG9vbCB0ZXJtLCBjaGFuZ2VzIGluIHRoZSB5aWVsZCBjdXJ2ZSByZWZsZWN0IHNoaWZ0cyBpbiBtYXJrZXQgZXhwZWN0YXRpb25zIGFib3V0IGZ1dHVyZSBpbnRlcmVzdCByYXRlcy4gSWYgdGhlIHlpZWxkIGN1cnZlIHN0ZWVwZW5lZCwgaXQgaW5kaWNhdGVzIGdyb3dpbmcgb3B0aW1pc20sIHdpdGggdGhlIG1hcmtldCBleHBlY3RpbmcgaGlnaGVyIGZ1dHVyZSBpbnRlcmVzdCByYXRlcyBkdWUgdG8gZWNvbm9taWMgZ3Jvd3RoIG9yIGluZmxhdGlvbi4gQ29udmVyc2VseSwgaWYgdGhlIGN1cnZlIGZsYXR0ZW5lZCBvciBpbnZlcnRlZCwgaXQgc2lnbmFscyBjb25jZXJucyBhYm91dCBzbG93aW5nIGVjb25vbWljIGFjdGl2aXR5IG9yIGFudGljaXBhdGVkIG1vbmV0YXJ5IGVhc2luZywgd2l0aCBleHBlY3RhdGlvbnMgb2YgbG93ZXIgcmF0ZXMuIEEgY29uc2lzdGVudCBzcHJlYWQgdGhyb3VnaG91dCB0aGUgdGVybSB3b3VsZCBzdWdnZXN0IHN0YWJsZSBleHBlY3RhdGlvbnMgd2l0aCBsaXR0bGUgY2hhbmdlIGluIHRoZSBlY29ub21pYyBvdXRsb29rLiBUaGVzZSBtb3ZlbWVudHMgcHJvdmlkZSB2YWx1YWJsZSBpbnNpZ2h0cyBpbnRvIGhvdyBtYXJrZXQgc2VudGltZW50IGV2b2x2ZWQgZHVyaW5nIHRoZSBzY2hvb2wgdGVybS4KCgojVGhlIEZlZOKAmXMgaW5mbHVlbmNlIG9uIGludGVyZXN0IHJhdGVzCiNMNy4xMCBEaWQgdGhlIEZlZCBjaGFuZ2UgdGhlIGZlZGVyYWwgZnVuZHMgcmF0ZSBvdmVyIHRoZSBzY2hvb2wgdGVybT8KCiMgSW5zdGFsbCBhbmQgbG9hZCBuZWNlc3NhcnkgcGFja2FnZXMKaWYgKCFyZXF1aXJlKHF1YW50bW9kKSkgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiKQpsaWJyYXJ5KHF1YW50bW9kKQoKCiMgRGVmaW5lIGRhdGVzIGZvciB0aGUgc2Nob29sIHRlcm0Kc3RhcnRfZGF0ZSA8LSBhcy5EYXRlKCIyMDI0LTA1LTAxIikKZW5kX2RhdGUgPC0gYXMuRGF0ZSgiMjAyNC0wOS0zMCIpCgoKIyBEZWZpbmUgZmFsbGJhY2sgZGF0ZXMgKHByZXZpb3VzIHllYXIpCmZhbGxiYWNrX3N0YXJ0X2RhdGUgPC0gYXMuRGF0ZSgiMjAyMy0wNS0wMSIpCmZhbGxiYWNrX2VuZF9kYXRlIDwtIGFzLkRhdGUoIjIwMjMtMDktMzAiKQoKCiMgRnVuY3Rpb24gdG8gcmV0cmlldmUgZmVkZXJhbCBmdW5kcyByYXRlIGRhdGEgd2l0aCBmYWxsYmFjawpnZXRfZmVkX2Z1bmRzX3JhdGUgPC0gZnVuY3Rpb24oc3RhcnRfZGF0ZSwgZW5kX2RhdGUsIGZhbGxiYWNrX3N0YXJ0X2RhdGUsIGZhbGxiYWNrX2VuZF9kYXRlKSB7CiAgICB0cnlDYXRjaCh7CiAgICAgICAgIyBEb3dubG9hZCBmZWRlcmFsIGZ1bmRzIHJhdGUgZGF0YSB3aXRoIHBhZGRpbmcKICAgICAgICBnZXRTeW1ib2xzKCJGRURGVU5EUyIsIHNyYyA9ICJGUkVEIiwgZnJvbSA9IHN0YXJ0X2RhdGUgLSAzMCwgdG8gPSBlbmRfZGF0ZSArIDMwKQogICAgICAgIHJhdGVfc3RhcnQgPC0gbmEub21pdChGRURGVU5EU1tzdGFydF9kYXRlXSAvIDEwMCkgICMgQ29udmVydCB0byBwZXJjZW50YWdlCiAgICAgICAgcmF0ZV9lbmQgPC0gbmEub21pdChGRURGVU5EU1tlbmRfZGF0ZV0gLyAxMDApICAgICAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKICAgICAgICAKICAgICAgICAjIElmIGRhdGEgaXMgbWlzc2luZywgdXNlIGZhbGxiYWNrIGRhdGVzCiAgICAgICAgaWYgKGxlbmd0aChyYXRlX3N0YXJ0KSA9PSAwIHx8IGxlbmd0aChyYXRlX2VuZCkgPT0gMCkgewogICAgICAgICAgICBjYXQoIkRhdGEgdW5hdmFpbGFibGUgZm9yIiwgc3RhcnRfZGF0ZSwgIi0iLCBlbmRfZGF0ZSwgInVzaW5nIGZhbGxiYWNrIGRhdGVzLlxuIikKICAgICAgICAgICAgZ2V0U3ltYm9scygiRkVERlVORFMiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBmYWxsYmFja19zdGFydF9kYXRlIC0gMzAsIHRvID0gZmFsbGJhY2tfZW5kX2RhdGUgKyAzMCkKICAgICAgICAgICAgcmF0ZV9zdGFydCA8LSBuYS5vbWl0KEZFREZVTkRTW2ZhbGxiYWNrX3N0YXJ0X2RhdGVdIC8gMTAwKQogICAgICAgICAgICByYXRlX2VuZCA8LSBuYS5vbWl0KEZFREZVTkRTW2ZhbGxiYWNrX2VuZF9kYXRlXSAvIDEwMCkKICAgICAgICB9CiAgICAgICAgcmV0dXJuKGxpc3Qoc3RhcnQgPSByYXRlX3N0YXJ0LCBlbmQgPSByYXRlX2VuZCkpCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBjYXQoIkVycm9yIHJldHJpZXZpbmcgZmVkZXJhbCBmdW5kcyByYXRlIGRhdGE6IiwgZSRtZXNzYWdlLCAiXG4iKQogICAgICAgIHJldHVybihOVUxMKQogICAgfSkKfQoKCiMgUmV0cmlldmUgZmVkZXJhbCBmdW5kcyByYXRlIGRhdGEKZmVkX2Z1bmRzX3JhdGUgPC0gZ2V0X2ZlZF9mdW5kc19yYXRlKHN0YXJ0X2RhdGUsIGVuZF9kYXRlLCBmYWxsYmFja19zdGFydF9kYXRlLCBmYWxsYmFja19lbmRfZGF0ZSkKCgojIEFuYWx5emUgY2hhbmdlcyBpbiB0aGUgZmVkZXJhbCBmdW5kcyByYXRlCmlmICghaXMubnVsbChmZWRfZnVuZHNfcmF0ZSkpIHsKICAgIHJhdGVfc3RhcnQgPC0gZmlyc3QoZmVkX2Z1bmRzX3JhdGUkc3RhcnQpCiAgICByYXRlX2VuZCA8LSBmaXJzdChmZWRfZnVuZHNfcmF0ZSRlbmQpCiAgICAKICAgICMgRGlzcGxheSByZXN1bHRzCiAgICBjYXQoIkZlZGVyYWwgZnVuZHMgcmF0ZSBvbiBzdGFydCBkYXRlOiIsIHJvdW5kKHJhdGVfc3RhcnQgKiAxMDAsIDIpLCAiJVxuIikKICAgIGNhdCgiRmVkZXJhbCBmdW5kcyByYXRlIG9uIGVuZCBkYXRlOiIsIHJvdW5kKHJhdGVfZW5kICogMTAwLCAyKSwgIiVcbiIpCiAgICAKICAgICMgRGV0ZXJtaW5lIGlmIHRoZSByYXRlIGNoYW5nZWQKICAgIGlmICghaXMubmEocmF0ZV9zdGFydCkgJiYgIWlzLm5hKHJhdGVfZW5kKSkgewogICAgICAgIGlmIChyYXRlX3N0YXJ0IDwgcmF0ZV9lbmQpIHsKICAgICAgICAgICAgY2F0KCJUaGUgRmVkIGluY3JlYXNlZCB0aGUgZmVkZXJhbCBmdW5kcyByYXRlIGR1cmluZyB0aGUgc2Nob29sIHRlcm0uXG4iKQogICAgICAgIH0gZWxzZSBpZiAocmF0ZV9zdGFydCA+IHJhdGVfZW5kKSB7CiAgICAgICAgICAgIGNhdCgiVGhlIEZlZCBkZWNyZWFzZWQgdGhlIGZlZGVyYWwgZnVuZHMgcmF0ZSBkdXJpbmcgdGhlIHNjaG9vbCB0ZXJtLlxuIikKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjYXQoIlRoZSBGZWQgZGlkIG5vdCBjaGFuZ2UgdGhlIGZlZGVyYWwgZnVuZHMgcmF0ZSBkdXJpbmcgdGhlIHNjaG9vbCB0ZXJtLlxuIikKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNhdCgiSW5zdWZmaWNpZW50IGRhdGEgdG8gYW5hbHl6ZSBjaGFuZ2VzIGluIHRoZSBmZWRlcmFsIGZ1bmRzIHJhdGUuXG4iKQogICAgfQp9IGVsc2UgewogICAgY2F0KCJJbnN1ZmZpY2llbnQgZGF0YSB0byBhbmFseXplIGNoYW5nZXMgaW4gdGhlIGZlZGVyYWwgZnVuZHMgcmF0ZS5cbiIpCn0KCgoKCgoKI0NvbmNsdXNpb24KI0lmIHRoZSByYXRlIGluY3JlYXNlZDogVGhlIEZlZCBwdXJzdWVkIGEgdGlnaHRlciBtb25ldGFyeSBwb2xpY3ksIGxpa2VseSB0byBjb21iYXQgaW5mbGF0aW9uIG9yIHN0YWJpbGl6ZSB0aGUgZWNvbm9teS4KI0lmIHRoZSByYXRlIGRlY3JlYXNlZDogVGhpcyByZWZsZWN0cyBlYXNpbmcgbW9uZXRhcnkgcG9saWN5IGFpbWVkIGF0IHN0aW11bGF0aW5nIGVjb25vbWljIGdyb3d0aCBvciBhZGRyZXNzaW5nIGEgc2xvd2Rvd24uCiNJZiB0aGUgcmF0ZSByZW1haW5lZCB1bmNoYW5nZWQ6IFRoZSBGZWQgbWFpbnRhaW5lZCBhIG5ldXRyYWwgc3RhbmNlLCBzaWduYWxpbmcgY29uc2lzdGVuY3kgaW4gaXRzIG1vbmV0YXJ5IHBvbGljeS4KI0Vycm9yIGlzIGJlY2F1c2UgdGhlcmUgaXMgbm90IGluZm9ybWF0aW9uIGZvciB0aGlzIGRhdGVzIChUcmllZCB0byBzb2x2ZSBpdCB3aXRoIENoYXIgR3B0IDMpCiNTaG93CgojTDcuMTEgRG8geW91IHRoaW5rIHRoZSBtb3ZlbWVudHMgaW4gaW50ZXJlc3QgcmF0ZXMgb3ZlciB0aGUgc2Nob29sIHRlcm0gd2VyZSBjYXVzZWQgYnkgdGhlIEZlZOKAmXMgbW9uZXRhcnkgcG9saWN5PyBFeHBsYWluLgoKIyBJbnN0YWxsIGFuZCBsb2FkIG5lY2Vzc2FyeSBwYWNrYWdlcwppZiAoIXJlcXVpcmUocXVhbnRtb2QpKSBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIpCmxpYnJhcnkocXVhbnRtb2QpCgoKIyBEZWZpbmUgZGF0ZXMgZm9yIHRoZSBzY2hvb2wgdGVybQpzdGFydF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMDUtMDEiKQplbmRfZGF0ZSA8LSBhcy5EYXRlKCIyMDI0LTA5LTMwIikKCgojIERlZmluZSBmYWxsYmFjayBkYXRlcyAocHJldmlvdXMgeWVhcikKZmFsbGJhY2tfc3RhcnRfZGF0ZSA8LSBhcy5EYXRlKCIyMDIzLTA1LTAxIikKZmFsbGJhY2tfZW5kX2RhdGUgPC0gYXMuRGF0ZSgiMjAyMy0wOS0zMCIpCgoKIyBSZXRyaWV2ZSBmZWRlcmFsIGZ1bmRzIHJhdGUgZGF0YQpnZXRfZmVkX2Z1bmRzX3JhdGUgPC0gZnVuY3Rpb24oc3RhcnRfZGF0ZSwgZW5kX2RhdGUsIGZhbGxiYWNrX3N0YXJ0X2RhdGUsIGZhbGxiYWNrX2VuZF9kYXRlKSB7CiAgICB0cnlDYXRjaCh7CiAgICAgICAgZ2V0U3ltYm9scygiRkVERlVORFMiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlIC0gMzAsIHRvID0gZW5kX2RhdGUgKyAzMCkKICAgICAgICByYXRlX3N0YXJ0IDwtIG5hLm9taXQoRkVERlVORFNbc3RhcnRfZGF0ZV0gLyAxMDApCiAgICAgICAgcmF0ZV9lbmQgPC0gbmEub21pdChGRURGVU5EU1tlbmRfZGF0ZV0gLyAxMDApCiAgICAgICAgCiAgICAgICAgaWYgKGxlbmd0aChyYXRlX3N0YXJ0KSA9PSAwIHx8IGxlbmd0aChyYXRlX2VuZCkgPT0gMCkgewogICAgICAgICAgICBjYXQoIkRhdGEgdW5hdmFpbGFibGUgZm9yIiwgc3RhcnRfZGF0ZSwgIi0iLCBlbmRfZGF0ZSwgInVzaW5nIGZhbGxiYWNrIGRhdGVzLlxuIikKICAgICAgICAgICAgZ2V0U3ltYm9scygiRkVERlVORFMiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBmYWxsYmFja19zdGFydF9kYXRlIC0gMzAsIHRvID0gZmFsbGJhY2tfZW5kX2RhdGUgKyAzMCkKICAgICAgICAgICAgcmF0ZV9zdGFydCA8LSBuYS5vbWl0KEZFREZVTkRTW2ZhbGxiYWNrX3N0YXJ0X2RhdGVdIC8gMTAwKQogICAgICAgICAgICByYXRlX2VuZCA8LSBuYS5vbWl0KEZFREZVTkRTW2ZhbGxiYWNrX2VuZF9kYXRlXSAvIDEwMCkKICAgICAgICB9CiAgICAgICAgcmV0dXJuKGxpc3Qoc3RhcnQgPSByYXRlX3N0YXJ0LCBlbmQgPSByYXRlX2VuZCkpCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBjYXQoIkVycm9yIHJldHJpZXZpbmcgZmVkZXJhbCBmdW5kcyByYXRlIGRhdGE6IiwgZSRtZXNzYWdlLCAiXG4iKQogICAgICAgIHJldHVybihOVUxMKQogICAgfSkKfQoKCiMgUmV0cmlldmUgZGF0YQpmZWRfZnVuZHNfcmF0ZSA8LSBnZXRfZmVkX2Z1bmRzX3JhdGUoc3RhcnRfZGF0ZSwgZW5kX2RhdGUsIGZhbGxiYWNrX3N0YXJ0X2RhdGUsIGZhbGxiYWNrX2VuZF9kYXRlKQoKCiMgQ29tcGFyZSBUcmVhc3VyeSB5aWVsZCBtb3ZlbWVudHMKZ2V0U3ltYm9scygiREdTMTAiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlIC0gMzAsIHRvID0gZW5kX2RhdGUgKyAzMCkKdHJlYXN1cnlfc3RhcnQgPC0gbmEub21pdChER1MxMFtzdGFydF9kYXRlXSAvIDEwMCkKdHJlYXN1cnlfZW5kIDwtIG5hLm9taXQoREdTMTBbZW5kX2RhdGVdIC8gMTAwKQoKCiMgQW5hbHl6ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gRmVkIHBvbGljeSBhbmQgaW50ZXJlc3QgcmF0ZXMKaWYgKCFpcy5udWxsKGZlZF9mdW5kc19yYXRlKSAmJiAhaXMubmEodHJlYXN1cnlfc3RhcnQpICYmICFpcy5uYSh0cmVhc3VyeV9lbmQpKSB7CiAgICByYXRlX3N0YXJ0IDwtIGZpcnN0KGZlZF9mdW5kc19yYXRlJHN0YXJ0KQogICAgcmF0ZV9lbmQgPC0gZmlyc3QoZmVkX2Z1bmRzX3JhdGUkZW5kKQogICAgdHJlYXN1cnlfY2hhbmdlIDwtIGZpcnN0KHRyZWFzdXJ5X2VuZCkgLSBmaXJzdCh0cmVhc3VyeV9zdGFydCkKCgogICAgIyBEaXNwbGF5IHJlc3VsdHMKICAgIGNhdCgiRmVkZXJhbCBGdW5kcyBSYXRlIENoYW5nZToiLCByb3VuZCgocmF0ZV9lbmQgLSByYXRlX3N0YXJ0KSAqIDEwMCwgMiksICIlXG4iKQogICAgY2F0KCIxMC1ZZWFyIFRyZWFzdXJ5IFlpZWxkIENoYW5nZToiLCByb3VuZCh0cmVhc3VyeV9jaGFuZ2UgKiAxMDAsIDIpLCAiJVxuIikKCgogICAgIyBBc3Nlc3MgaW5mbHVlbmNlCiAgICBpZiAoc2lnbihyYXRlX2VuZCAtIHJhdGVfc3RhcnQpID09IHNpZ24odHJlYXN1cnlfY2hhbmdlKSkgewogICAgICAgIGNhdCgiTW92ZW1lbnRzIGluIGludGVyZXN0IHJhdGVzIGFwcGVhciB0byBoYXZlIGJlZW4gaW5mbHVlbmNlZCBieSB0aGUgRmVkJ3MgbW9uZXRhcnkgcG9saWN5LlxuIikKICAgIH0gZWxzZSB7CiAgICAgICAgY2F0KCJNb3ZlbWVudHMgaW4gaW50ZXJlc3QgcmF0ZXMgbWF5IGhhdmUgYmVlbiBkcml2ZW4gYnkgZmFjdG9ycyBvdGhlciB0aGFuIHRoZSBGZWQncyBtb25ldGFyeSBwb2xpY3kuXG4iKQogICAgfQp9IGVsc2UgewogICAgY2F0KCJJbnN1ZmZpY2llbnQgZGF0YSB0byBhbmFseXplIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbnRlcmVzdCByYXRlcyBhbmQgRmVkIHBvbGljeS5cbiIpCn0KCgojVGhlIGVycm9yIGlzIGJlY2F1c2UgdGhlcmUgaXMgbm90IGluZm9ybWF0aW9uIGZvciB0aGlzIGRhdGVzCiNNZWFzdXJpbmcgYW5kIGV4cGxhaW5pbmcgcHJlbWl1bXMgb24gbW9uZXkgbWFya2V0IHNlY3VyaXRpZXMKCiNMNy4xMiBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHlpZWxkIG9uIDkwLWRheSBjb21tZXJjaWFsIHBhcGVyIGFuZCB0aGUgeWllbGQgb24gMTMtd2VlayBULWJpbGxzIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtPyBFeHBsYWluIHdoeSB0aGlzIHByZW1pdW0gZXhpc3RzLgojIEluc3RhbGwgYW5kIGxvYWQgbmVjZXNzYXJ5IHBhY2thZ2VzCmlmICghcmVxdWlyZShxdWFudG1vZCkpIGluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikKbGlicmFyeShxdWFudG1vZCkKCgojIERlZmluZSBkYXRlIHJhbmdlCnN0YXJ0X2RhdGUgPC0gYXMuRGF0ZSgiMjAyNC0wNS0wMSIpCmVuZF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMDktMzAiKQoKCiMgRG93bmxvYWQgeWllbGRzIGZvciA5MC1kYXkgY29tbWVyY2lhbCBwYXBlciBhbmQgMTMtd2VlayBUcmVhc3VyeSBiaWxscwp0cnlDYXRjaCh7CiAgICAjIFJldHJpZXZlIGRhdGEgZnJvbSBGUkVECiAgICBnZXRTeW1ib2xzKCJEQ1BGM00iLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKSAgIyA5MC1kYXkgY29tbWVyY2lhbCBwYXBlcgogICAgZ2V0U3ltYm9scygiRFRCMyIsIHNyYyA9ICJGUkVEIiwgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUpICAgIyAxMy13ZWVrIFRyZWFzdXJ5IGJpbGxzCiAgICAKICAgICMgRXh0cmFjdCB5aWVsZHMgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0KICAgIGNvbW1lcmNpYWxfcGFwZXJfeWllbGQgPC0gbmEub21pdChEQ1BGM01bZW5kX2RhdGVdIC8gMTAwKSAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKICAgIHRfYmlsbF95aWVsZCA8LSBuYS5vbWl0KERUQjNbZW5kX2RhdGVdIC8gMTAwKSAgICAgICAgICAgICAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIHlpZWxkIGRpZmZlcmVuY2UgKHByZW1pdW0pCiAgICB5aWVsZF9kaWZmZXJlbmNlIDwtIGZpcnN0KGNvbW1lcmNpYWxfcGFwZXJfeWllbGQpIC0gZmlyc3QodF9iaWxsX3lpZWxkKQogICAgCiAgICAjIERpc3BsYXkgcmVzdWx0cwogICAgY2F0KCI5MC1kYXkgQ29tbWVyY2lhbCBQYXBlciBZaWVsZCBvbiIsIGVuZF9kYXRlLCAiOiIsIHJvdW5kKGZpcnN0KGNvbW1lcmNpYWxfcGFwZXJfeWllbGQpICogMTAwLCAyKSwgIiVcbiIpCiAgICBjYXQoIjEzLXdlZWsgVHJlYXN1cnkgQmlsbCBZaWVsZCBvbiIsIGVuZF9kYXRlLCAiOiIsIHJvdW5kKGZpcnN0KHRfYmlsbF95aWVsZCkgKiAxMDAsIDIpLCAiJVxuIikKICAgIGNhdCgiWWllbGQgUHJlbWl1bSAoQ29tbWVyY2lhbCBQYXBlciAtIFQtQmlsbCk6Iiwgcm91bmQoeWllbGRfZGlmZmVyZW5jZSAqIDEwMCwgMiksICIlXG4iKQp9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICMgRXJyb3IgaGFuZGxpbmcKICAgIGNhdCgiRXJyb3IgcmV0cmlldmluZyBkYXRhOiIsIGUkbWVzc2FnZSwgIlxuIikKfSkKCiNDb25jbHVpc2lvbgojVGhlIHlpZWxkIGRpZmZlcmVuY2UgYmV0d2VlbiA5MC1kYXkgY29tbWVyY2lhbCBwYXBlciBhbmQgMTMtd2VlayBUcmVhc3VyeSBiaWxscyByZXByZXNlbnRzIHRoZSByaXNrIHByZW1pdW0gZGVtYW5kZWQgYnkgaW52ZXN0b3JzIGZvciBob2xkaW5nIGNvcnBvcmF0ZSBkZWJ0IG92ZXIgZ292ZXJubWVudCBkZWJ0LiBUeXBpY2FsbHksIGNvbW1lcmNpYWwgcGFwZXIgb2ZmZXJzIGEgaGlnaGVyIHlpZWxkIGR1ZSB0byBpdHMgY3JlZGl0IHJpc2sgYW5kIGxvd2VyIGxpcXVpZGl0eSBjb21wYXJlZCB0byBUcmVhc3VyeSBiaWxscywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgcmlzay1mcmVlLiBJZiB0aGUgcHJlbWl1bSB3aWRlbnMsIGl0IG1heSBpbmRpY2F0ZSBpbmNyZWFzZWQgcmlzayBhdmVyc2lvbiBpbiB0aGUgbWFya2V0IG9yIGNvbmNlcm5zIGFib3V0IGNvcnBvcmF0ZSBjcmVkaXR3b3J0aGluZXNzLiBDb252ZXJzZWx5LCBhIG5hcnJvd2luZyBwcmVtaXVtIHN1Z2dlc3RzIGltcHJvdmVkIG1hcmtldCBjb25maWRlbmNlLiBUaGlzIGFuYWx5c2lzIGhpZ2hsaWdodHMgdGhlIHRyYWRlLW9mZiBiZXR3ZWVuIHJpc2sgYW5kIHJldHVybiBpbiBtb25leSBtYXJrZXQgc2VjdXJpdGllcyBhbmQgcHJvdmlkZXMgaW5zaWdodHMgaW50byBicm9hZGVyIGVjb25vbWljIGFuZCBtYXJrZXQgY29uZGl0aW9ucyBkdXJpbmcgdGhlIHNjaG9vbCB0ZXJtLgoKCiNMNy4xMyBDb21wYXJlIHRoZSBwcmVtaXVtIG9uIHRoZSA5MC1kYXkgY29tbWVyY2lhbCBwYXBlciB5aWVsZCAocmVsYXRpdmUgdG8gdGhlIDEzLXdlZWsgVC1iaWxsIHlpZWxkKSB0aGF0IGV4aXN0cyBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybSB0byB0aGUgcHJlbWl1bSB0aGF0IGV4aXN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVybS4gRWV4cGxhaW4gd2h5IHRoZSBwcmVtaXVtIG1heSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgc2Nob29sIHRlcm0uCgojIEluc3RhbGwgYW5kIGxvYWQgbmVjZXNzYXJ5IHBhY2thZ2VzCmlmICghcmVxdWlyZShxdWFudG1vZCkpIGluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikKbGlicmFyeShxdWFudG1vZCkKCgojIERlZmluZSBkYXRlIHJhbmdlIGZvciB0aGUgc2Nob29sIHRlcm0Kc3RhcnRfZGF0ZSA8LSBhcy5EYXRlKCIyMDI0LTA1LTAxIikKZW5kX2RhdGUgPC0gYXMuRGF0ZSgiMjAyNC0wOS0zMCIpCgoKIyBEb3dubG9hZCBkYXRhIGZvciA5MC1kYXkgY29tbWVyY2lhbCBwYXBlciBhbmQgMTMtd2VlayBUcmVhc3VyeSBiaWxscwp0cnlDYXRjaCh7CiAgICAjIFJldHJpZXZlIGRhdGEgZnJvbSBGUkVECiAgICBnZXRTeW1ib2xzKCJEQ1BGM00iLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlIC0gMzAsIHRvID0gZW5kX2RhdGUgKyAzMCkgICMgOTAtZGF5IGNvbW1lcmNpYWwgcGFwZXIKICAgIGdldFN5bWJvbHMoIkRUQjMiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlIC0gMzAsIHRvID0gZW5kX2RhdGUgKyAzMCkgICAjIDEzLXdlZWsgVHJlYXN1cnkgYmlsbHMKCgogICAgIyBFeHRyYWN0IHlpZWxkcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtCiAgICBjb21tZXJjaWFsX3BhcGVyX3N0YXJ0IDwtIG5hLm9taXQoRENQRjNNW3N0YXJ0X2RhdGVdIC8gMTAwKSAgCiAgICB0X2JpbGxfc3RhcnQgPC0gbmEub21pdChEVEIzW3N0YXJ0X2RhdGVdIC8gMTAwKSAgICAgICAgICAgICAgICAgICAgICAgIAogICAgdF9iaWxsX2VuZCA8LSBuYS5vbWl0KERUQjNbZW5kX2RhdGVdIC8gMTAwKSAgICAgICAgICAgICAgICAgIAogICAgY29tbWVyY2lhbF9wYXBlcl9lbmQgPC0gbmEub21pdChEQ1BGM01bZW5kX2RhdGVdIC8gMTAwKQoKICAgICMgQ2FsY3VsYXRlIHByZW1pdW1zCiAgICBzdGFydF9wcmVtaXVtIDwtIGZpcnN0KGNvbW1lcmNpYWxfcGFwZXJfc3RhcnQpIC0gZmlyc3QodF9iaWxsX3N0YXJ0KQogICAgZW5kX3ByZW1pdW0gPC0gZmlyc3QoY29tbWVyY2lhbF9wYXBlcl9lbmQpIC0gZmlyc3QodF9iaWxsX2VuZCkKCgogICAgIyBEaXNwbGF5IHJlc3VsdHMKICAgIGNhdCgiUHJlbWl1bSBhdCBTdGFydCAoTWF5IDEsIDIwMjQpOiIsIHJvdW5kKHN0YXJ0X3ByZW1pdW0gKiAxMDAsIDIpLCAiJVxuIikKICAgIGNhdCgiUHJlbWl1bSBhdCBFbmQgKFNlcHRlbWJlciAzMCwgMjAyNCk6Iiwgcm91bmQoZW5kX3ByZW1pdW0gKiAxMDAsIDIpLCAiJVxuIikKCgogICAgIyBBbmFseXplIGNoYW5nZXMgaW4gdGhlIHByZW1pdW0KICAgIGlmICghaXMubmEoc3RhcnRfcHJlbWl1bSkgJiYgIWlzLm5hKGVuZF9wcmVtaXVtKSkgewogICAgICAgIGlmIChlbmRfcHJlbWl1bSA+IHN0YXJ0X3ByZW1pdW0pIHsKICAgICAgICAgICAgY2F0KCJUaGUgcHJlbWl1bSB3aWRlbmVkIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLCBpbmRpY2F0aW5nIGluY3JlYXNlZCBjcmVkaXQgcmlzayBvciByZWR1Y2VkIGxpcXVpZGl0eSBpbiB0aGUgY29tbWVyY2lhbCBwYXBlciBtYXJrZXQuXG4iKQogICAgICAgIH0gZWxzZSBpZiAoZW5kX3ByZW1pdW0gPCBzdGFydF9wcmVtaXVtKSB7CiAgICAgICAgICAgIGNhdCgiVGhlIHByZW1pdW0gbmFycm93ZWQgb3ZlciB0aGUgc2Nob29sIHRlcm0sIHJlZmxlY3RpbmcgaW1wcm92ZWQgbWFya2V0IGNvbmZpZGVuY2UgYW5kIHJlZHVjZWQgY3JlZGl0IHJpc2suXG4iKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNhdCgiVGhlIHByZW1pdW0gcmVtYWluZWQgc3RhYmxlIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLCBpbmRpY2F0aW5nIGNvbnNpc3RlbnQgbWFya2V0IGNvbmRpdGlvbnMuXG4iKQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY2F0KCJJbnN1ZmZpY2llbnQgZGF0YSB0byBjb21wYXJlIHByZW1pdW1zLlxuIikKICAgIH0KfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICBjYXQoIkVycm9yIHJldHJpZXZpbmcgZGF0YToiLCBlJG1lc3NhZ2UsICJcbiIpCn0pCgojQ29uY2x1c2lvbnMKI1RoZSBlcnJvciBpbiB0aGUgcmVzdWx0IG9jY3VycmVkIGJlY2F1c2UgdGhlIGRhdGEgZm9yIG9uZSBvciBtb3JlIHZhcmlhYmxlcywgc3VjaCBhcyB0aGUgOTAtZGF5IGNvbW1lcmNpYWwgcGFwZXIgb3IgMTMtd2VlayBUcmVhc3VyeSBiaWxsIHlpZWxkLCB3YXMgdW5hdmFpbGFibGUgZm9yIHRoZSBleGFjdCBkYXRlcyByZXF1ZXN0ZWQuIFRoaXMgbWlzc2luZyBkYXRhIGxlZCB0byBpbmNvbXBsZXRlIGNhbGN1bGF0aW9ucywgaGlnaGxpZ2h0aW5nIHRoZSBpbXBvcnRhbmNlIG9mIGltcGxlbWVudGluZyBmYWxsYmFjayBtZWNoYW5pc21zIHRvIHJldHJpZXZlIGRhdGEgZnJvbSBuZWFyYnkgZGF0ZXMgb3IgaGFuZGxpbmcgbWlzc2luZyB2YWx1ZXMgZ3JhY2VmdWxseS4gQ29uc2lkZXJpbmcgdGhpcywgdGhlIGNvbXBhcmlzb24gb2YgdGhlIHByZW1pdW0gYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtIHJldmVhbHMgc2hpZnRzIGluIG1hcmtldCBzZW50aW1lbnQuIEEgd2lkZW5pbmcgcHJlbWl1bSBpbmRpY2F0ZXMgaW5jcmVhc2VkIGNyZWRpdCByaXNrIG9yIHJlZHVjZWQgbGlxdWlkaXR5LCB3aGlsZSBhIG5hcnJvd2luZyBwcmVtaXVtIHJlZmxlY3RzIGltcHJvdmVkIGNvbmZpZGVuY2UgYW5kIHJlZHVjZWQgcmlzay4gSWYgdGhlIHByZW1pdW0gcmVtYWluZWQgc3RhYmxlLCBpdCBzdWdnZXN0cyBjb25zaXN0ZW50IG1hcmtldCBjb25kaXRpb25zLiBUaGVzZSByZXN1bHRzIHVuZGVybGluZSB0aGUgbmVlZCB0byBhY2NvdW50IGZvciBkYXRhIGF2YWlsYWJpbGl0eSBjaGFsbGVuZ2VzIGluIGZpbmFuY2lhbCBhbmFseXNlcy4KCiNFeHBsYWluaW5nIGJvbmQgcHJlbWl1bXMgYW5kIHByaWNlIG1vdmVtZW50cwojTDcuMTQgV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB5aWVsZCBvbiBoaWdoLXlpZWxkIGNvcnBvcmF0ZSBib25kcyBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybSB2ZXJzdXMgdGhlIHlpZWxkIG9uIGhpZ2gtcXVhbGl0eSBjb3Jwb3JhdGUgYm9uZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0/CgogICMgSW5zdGFsbCBhbmQgbG9hZCBuZWNlc3NhcnkgcGFja2FnZXMKIGlmICghcmVxdWlyZShxdWFudG1vZCkpIGluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikKIGxpYnJhcnkocXVhbnRtb2QpCiAKICMgRGVmaW5lIGRhdGVzIGZvciB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtCiBzdGFydF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMDUtMDEiKQogZW5kX2RhdGUgPC0gYXMuRGF0ZSgiMjAyNC0wOS0zMCIpCiAKICMgRG93bmxvYWQgaGlnaC1xdWFsaXR5IGNvcnBvcmF0ZSBib25kIGRhdGEgKGV4YW1wbGU6IEFBQS1yYXRlZCBjb3Jwb3JhdGUgYm9uZHMpCiB0cnlDYXRjaCh7CisgICAgZ2V0U3ltYm9scygiQkFNTEMwQTFDQUFBRVkiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSAiMjAyNC0wNC0wMSIsIHRvID0gIjIwMjQtMDUtMTUiKQorICAgIGhpZ2hfcXVhbGl0eV95aWVsZCA8LSBuYS5vbWl0KEJBTUxDMEExQ0FBQUVZW3N0YXJ0X2RhdGVdIC8gMTAwKSAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKKyAgICBjYXQoIkhpZ2gtcXVhbGl0eSBjb3Jwb3JhdGUgYm9uZCB5aWVsZCBkYXRhIGRvd25sb2FkZWQgc3VjY2Vzc2Z1bGx5LlxuIikKKyB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKKyAgICBjYXQoIkVycm9yIGRvd25sb2FkaW5nIGhpZ2gtcXVhbGl0eSBjb3Jwb3JhdGUgYm9uZCBkYXRhOiAiLCBlJG1lc3NhZ2UsICJcbiIpCisgfSkKCiAKICMgRG93bmxvYWQgaGlnaC15aWVsZCBjb3Jwb3JhdGUgYm9uZCBkYXRhIChleGFtcGxlOiBqdW5rIGJvbmRzKQogdHJ5Q2F0Y2goCiAgICBnZXRTeW1ib2xzKCJCQU1MSDBBMEhZTTJFWSIsIHNyYyA9ICJGUkVEIiwgZnJvbSA9ICIyMDI0LTA5LTAxIiB0bywgPSAiMjAyNC0xMC0wMSIpCisgICAgaGlnaF95aWVsZF9ib25kIDwtIG5hLm9taXQoQkFNTEgwQTBIWU0yRVlbZW5kX2RhdGVdIC8gMTAwKSAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UKKyAgICBjYXQoIkhpZ2gteWllbGQgY29ycG9yYXRlIGJvbmQgeWllbGQgZGF0YSBkb3dubG9hZGVkIHN1Y2Nlc3NmdWxseS5cbiIpCisgLCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKKyAgICBjYXQoIkVycm9yIGRvd25sb2FkaW5nIGhpZ2gteWllbGQgY29ycG9yYXRlIGJvbmQgZGF0YTogIiwgZSRtZXNzYWdlLCAiXG4iKQorIH0pCkhpZ2gteWllbGQgY29ycG9yYXRlIGJvbmQgeWllbGQgZGF0YSBkb3dubG9hZGVkIHN1Y2Nlc3NmdWxseS4KIAo+ICMgQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlCj4gaWYgKGV4aXN0cygiaGlnaF9xdWFsaXR5X3lpZWxkIikgJiYgZXhpc3RzKCJoaWdoX3lpZWxkX2JvbmQiKSkgeworICAgIGlmIChsZW5ndGgoaGlnaF9xdWFsaXR5X3lpZWxkKSA+IDAgJiYgbGVuZ3RoKGhpZ2hfeWllbGRfYm9uZCkgPiAwKSB7CisgICAgICAgIHlpZWxkX2RpZmZlcmVuY2UgPC0gZmlyc3QoaGlnaF95aWVsZF9ib25kKSAtIGZpcnN0KGhpZ2hfcXVhbGl0eV95aWVsZCkKKyAgICAgICAgCisgICAgICAgICMgRGlzcGxheSByZXN1bHRzCisgICAgICAgIGNhdCgiSGlnaC1xdWFsaXR5IGNvcnBvcmF0ZSBib25kIHlpZWxkIG9uIE1heSAxLCAyMDI0OiIsIHJvdW5kKGZpcnN0KGhpZ2hfcXVhbGl0eV95aWVsZCkgKiAxMDAsIDIpLCAiJVxuIikKKyAgICAgICAgY2F0KCJIaWdoLXlpZWxkIGNvcnBvcmF0ZSBib25kIHlpZWxkIG9uIFNlcHRlbWJlciAzMCwgMjAyNDoiLCByb3VuZChmaXJzdChoaWdoX3lpZWxkX2JvbmQpICogMTAwLCAyKSwgIiVcbiIpCisgICAgICAgIGNhdCgiWWllbGQgZGlmZmVyZW5jZSAoaGlnaC15aWVsZCAtIGhpZ2gtcXVhbGl0eSk6Iiwgcm91bmQoeWllbGRfZGlmZmVyZW5jZSAqIDEwMCwgMiksICIlXG4iKQorICAgIH0gZWxzZSB7CisgICAgICAgIGNhdCgiSW5zdWZmaWNpZW50IGRhdGEgdG8gY2FsY3VsYXRlIHRoZSB5aWVsZCBkaWZmZXJlbmNlLlxuIikKKyAgICB9CisgfSBlbHNlIHsKKyAgICBjYXQoIkRhdGEgZm9yIHlpZWxkcyBpcyBub3QgYXZhaWxhYmxlLlxuIikKKyB9CiNIaWdoLXF1YWxpdHkgY29ycG9yYXRlIGJvbmQgeWllbGQgb24gTWF5IDEsIDIwMjQ6IDUuMTcgJQojSGlnaC15aWVsZCBjb3Jwb3JhdGUgYm9uZCB5aWVsZCBvbiBTZXB0ZW1iZXIgMzAsIDIwMjQ6IDYuNjYgJQojWWllbGQgZGlmZmVyZW5jZSAoaGlnaC15aWVsZCAtIGhpZ2gtcXVhbGl0eSk6ICAlCgojQ29uY2x1c2lvbgojVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgeWllbGQgb24gaGlnaC15aWVsZCBjb3Jwb3JhdGUgYm9uZHMgYW5kIGhpZ2gtcXVhbGl0eSBjb3Jwb3JhdGUgYm9uZHMgcHJvdmlkZXMgaW5zaWdodCBpbnRvIHRoZSBjcmVkaXQgcmlzayBwcmVtaXVtIGFuZCBtYXJrZXQgY29uZGl0aW9uczoKI0hpZ2hlciBkaWZmZXJlbmNlOiBJbmRpY2F0ZXMgaW5jcmVhc2VkIHJpc2sgaW4gdGhlIG1hcmtldCBvciBwZXNzaW1pc20gYWJvdXQgdGhlIGVjb25vbXksIGxlYWRpbmcgdG8gaGlnaGVyIGNvbXBlbnNhdGlvbiBmb3IgbG93ZXItcmF0ZWQgYm9uZHMuCiNMb3dlciBkaWZmZXJlbmNlOiBSZWZsZWN0cyByZWR1Y2VkIG1hcmtldCB1bmNlcnRhaW50eSBvciBpbXByb3ZlZCBjcmVkaXQgY29uZGl0aW9ucywgbmFycm93aW5nIHRoZSBzcHJlYWQuCiNUaGlzIG1lYXN1cmUgaGlnaGxpZ2h0cyBob3cgY3JlZGl0IHJpc2sgYW5kIGVjb25vbWljIHNlbnRpbWVudCBhZmZlY3QgYm9uZCBtYXJrZXRzIGFuZCBpbnZlc3RvciBiZWhhdmlvciBkdXJpbmcgdGhlIHNjaG9vbCB0ZXJtLgoKCgoKCgoKCgoKCgoKCgoKCgojTDcuMTUgQ29tcGFyZSB0aGUgbG9uZy10ZXJtIFRyZWFzdXJ5IGJvbmQgeWllbGQgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0gdG8gdGhlIGxvbmd0ZXJtIFRyZWFzdXJ5IGJvbmQgeWllbGQgdGhhdCBleGlzdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjaG9vbCB0ZXJtLiBHaXZlbiB0aGUgZGlyZWN0aW9uIG9mIHRoaXMgY2hhbmdlLCBkaWQgcHJpY2VzIG9mIGxvbmctdGVybSBib25kcyByaXNlIG9yIGZhbGwgb3ZlciB0aGUgc2Nob29sIHRlcm0/CgojIEluc3RhbGwgYW5kIGxvYWQgbmVjZXNzYXJ5IHBhY2thZ2VzCmlmICghcmVxdWlyZShxdWFudG1vZCkpIGluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikKbGlicmFyeShxdWFudG1vZCkKCgojIERlZmluZSB0aGUgZGF0ZXMgZm9yIHRoZSBzY2hvb2wgdGVybQpzdGFydF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMDUtMDEiKQplbmRfZGF0ZSA8LSBhcy5EYXRlKCIyMDI0LTA5LTMwIikKCgojIERvd25sb2FkIGxvbmctdGVybSBUcmVhc3VyeSBib25kIHlpZWxkIGRhdGEKdHJ5Q2F0Y2goewogICAgZ2V0U3ltYm9scygiREdTMzAiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSAiMjAyNC0wNC0wMSIsIHRvID0gIjIwMjQtMTAtMDEiKQp9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgIGNhdCgiRXJyb3IgZG93bmxvYWRpbmcgbG9uZy10ZXJtIFRyZWFzdXJ5IGJvbmQgeWllbGQgZGF0YTogIiwgZSRtZXNzYWdlLCAiXG4iKQp9KQoKCiMgQWRqdXN0IGRhdGVzIHRvIHRoZSBjbG9zZXN0IGF2YWlsYWJsZSBvbmVzCmlmIChleGlzdHMoIkRHUzMwIikpIHsKICAgIHN0YXJ0X2Nsb3Nlc3RfZGF0ZSA8LSBsYXN0KGluZGV4KERHUzMwWyIyMDI0LTA0Il0pKSAgIyBDbG9zZXN0IGRhdGUgdG8gTWF5IDEsIDIwMjQKICAgIGVuZF9jbG9zZXN0X2RhdGUgPC0gbGFzdChpbmRleChER1MzMFsiMjAyNC0wOSJdKSkgICAgIyBDbG9zZXN0IGRhdGUgdG8gU2VwdGVtYmVyIDMwLCAyMDI0KQogICAgCiAgICAjIEV4dHJhY3QgeWllbGRzIGZvciB0aGUgY2xvc2VzdCBhdmFpbGFibGUgZGF0ZXMKICAgIGxvbmdfdGVybV95aWVsZF9zdGFydCA8LSBuYS5vbWl0KERHUzMwW3N0YXJ0X2Nsb3Nlc3RfZGF0ZV0gLyAxMDApICAjIENvbnZlcnQgdG8gcGVyY2VudGFnZQogICAgbG9uZ190ZXJtX3lpZWxkX2VuZCA8LSBuYS5vbWl0KERHUzMwW2VuZF9jbG9zZXN0X2RhdGVdIC8gMTAwKSAgICAgICMgQ29udmVydCB0byBwZXJjZW50YWdlCiAgICAKICAgICMgQ2hlY2sgaWYgdGhlIGV4dHJhY3RlZCB2YWx1ZXMgYXJlIHZhbGlkCiAgICBpZiAobGVuZ3RoKGxvbmdfdGVybV95aWVsZF9zdGFydCkgPiAwICYmIGxlbmd0aChsb25nX3Rlcm1feWllbGRfZW5kKSA+IDApIHsKICAgICAgICB5aWVsZF9kaWZmZXJlbmNlIDwtIGZpcnN0KGxvbmdfdGVybV95aWVsZF9lbmQpIC0gZmlyc3QobG9uZ190ZXJtX3lpZWxkX3N0YXJ0KQogICAgICAgIAogICAgICAgICMgRGlzcGxheSByZXN1bHRzCiAgICAgICAgY2F0KCJMb25nLXRlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCBvbiIsIHN0YXJ0X2Nsb3Nlc3RfZGF0ZSwgIjoiLCByb3VuZChmaXJzdChsb25nX3Rlcm1feWllbGRfc3RhcnQpICogMTAwLCAyKSwgIiVcbiIpCiAgICAgICAgY2F0KCJMb25nLXRlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCBvbiIsIGVuZF9jbG9zZXN0X2RhdGUsICI6Iiwgcm91bmQoZmlyc3QobG9uZ190ZXJtX3lpZWxkX2VuZCkgKiAxMDAsIDIpLCAiJVxuIikKICAgICAgICBjYXQoIllpZWxkIGRpZmZlcmVuY2U6Iiwgcm91bmQoeWllbGRfZGlmZmVyZW5jZSAqIDEwMCwgMiksICIlXG4iKQogICAgICAgIAogICAgICAgICMgRGV0ZXJtaW5lIHByaWNlIG1vdmVtZW50CiAgICAgICAgaWYgKHlpZWxkX2RpZmZlcmVuY2UgPiAwKSB7CiAgICAgICAgICAgIGNhdCgiWWllbGRzIGluY3JlYXNlZCwgaW5kaWNhdGluZyB0aGF0IGxvbmctdGVybSBib25kIHByaWNlcyBmZWxsLlxuIikKICAgICAgICB9IGVsc2UgaWYgKHlpZWxkX2RpZmZlcmVuY2UgPCAwKSB7CiAgICAgICAgICAgIGNhdCgiWWllbGRzIGRlY3JlYXNlZCwgaW5kaWNhdGluZyB0aGF0IGxvbmctdGVybSBib25kIHByaWNlcyByb3NlLlxuIikKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjYXQoIllpZWxkcyByZW1haW5lZCB1bmNoYW5nZWQsIHNvIGJvbmQgcHJpY2VzIHN0YXllZCBzdGFibGUuXG4iKQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY2F0KCJJbnN1ZmZpY2llbnQgZGF0YSBmb3IgdGhlIHNlbGVjdGVkIGRhdGVzLlxuIikKICAgIH0KfSBlbHNlIHsKICAgIGNhdCgiTG9uZy10ZXJtIFRyZWFzdXJ5IGJvbmQgeWllbGQgZGF0YSBpcyBub3QgYXZhaWxhYmxlLlxuIikKfQoKCgoKI0NvbmNsdXNpb24gb2YgdGhlIENvZGUKI1RoZSBhbmFseXNpcyBjb21wYXJlcyB0aGUgeWllbGRzIG9mIDMwLXllYXIgVHJlYXN1cnkgYm9uZHMgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGFjYWRlbWljIHRlcm0uIEJhc2VkIG9uIHRoZSByZXN1bHRzOgojSWYgdGhlIHlpZWxkIGluY3JlYXNlZDoKI1RoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHByaWNlcyBvZiBsb25nLXRlcm0gYm9uZHMgZmVsbCBkdXJpbmcgdGhlIHRlcm0uCiNBIHJpc2UgaW4geWllbGRzIHN1Z2dlc3RzIG1hcmtldCBleHBlY3RhdGlvbnMgb2YgaGlnaGVyIGZ1dHVyZSBpbnRlcmVzdCByYXRlcyBvciByZWR1Y2VkIGRlbWFuZCBmb3IgbG9uZy10ZXJtIGJvbmRzLgojSWYgdGhlIHlpZWxkIGRlY3JlYXNlZDoKI1RoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHByaWNlcyBvZiBsb25nLXRlcm0gYm9uZHMgcm9zZS4KI0EgZmFsbCBpbiB5aWVsZHMgcmVmbGVjdHMgaGlnaGVyIGRlbWFuZCBmb3IgYm9uZHMgb3IgZXhwZWN0YXRpb25zIG9mIGxvd2VyIGZ1dHVyZSBpbnRlcmVzdCByYXRlcy4KI0lmIHRoZSB5aWVsZCByZW1haW5lZCB1bmNoYW5nZWQ6CiNUaGlzIHN1Z2dlc3RzIHRoYXQgYm9uZCBwcmljZXMgc3RheWVkIHN0YWJsZSwgaW5kaWNhdGluZyBjb25zaXN0ZW50IG1hcmtldCBjb25kaXRpb25zLgojVGhpcyBhbmFseXNpcyBkZW1vbnN0cmF0ZXMgdGhlIGludmVyc2UgcmVsYXRpb25zaGlwIGJldHdlZW4gYm9uZCBwcmljZXMgYW5kIHlpZWxkcywgb2ZmZXJpbmcgaW5zaWdodHMgaW50byBtYXJrZXQgc2VudGltZW50IGFuZCBpbnRlcmVzdCByYXRlIGV4cGVjdGF0aW9ucyBvdmVyIHRoZSB0ZXJtLgojVGhlIGVycm9yIG9jY3VycyBiZWNhdXNlIHRoZSBleGFjdCByZXF1ZXN0ZWQgZGF0ZXMgbGFjayBkYXRhIGluIHRoZSBkYXRhc2V0LiBUaGlzIGlzc3VlIGlzIHJlc29sdmVkIGJ5IGF1dG9tYXRpY2FsbHkgc2VsZWN0aW5nIHRoZSBjbG9zZXN0IGF2YWlsYWJsZSBkYXRlcyB3aXRoIHZhbGlkIGRhdGEuIAoKI0w3LjE2IENvbXBhcmUgdGhlIGNoYW5nZSBpbiB0aGUgeWllbGRzIG9mIFRyZWFzdXJ5LCBtdW5pY2lwYWwsIGFuZCBjb3Jwb3JhdGUgYm9uZHMgb3ZlciB0aGUgc2Nob29sIHRlcm0uIERpZCB0aGUgeWllbGRzIG9mIGFsbCB0aHJlZSB0eXBlcyBvZiBzZWN1cml0aWVzIG1vdmUgaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGFuZCBieSBhYm91dCB0aGUgc2FtZSBkZWdyZWU/IEV4cGxhaW4gd2h5IHlpZWxkcyBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgYm9uZHMgbW92ZSB0b2dldGhlci4KCiNFdmVuIHRoZXJlIGlzIGFuIGVycm9yIHRoYXQgd2UgdHJpZWQgdG8gc29sdmUgd2l0aCBjaGF0IGdwdCB3ZSB3aWxsIHRyeSB0byBleHBsYWluIHdoYXQgd2Ugc2hvdWxkIGhhdmUgZG9uZS4KI1RvIGFuYWx5emUgdGhlIGNoYW5nZXMgaW4gdGhlIHlpZWxkcyBvZiBUcmVhc3VyeSBib25kcywgbXVuaWNpcGFsIGJvbmRzLCBhbmQgY29ycG9yYXRlIGJvbmRzIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLCB3ZSBjb21wYXJlIHRoZWlyIHlpZWxkcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHRlcm0uIFRoZSBnb2FsIGlzIHRvIGFzc2VzcyB3aGV0aGVyIHRoZXNlIHlpZWxkcyBtb3ZlZCBpbiB0aGUgc2FtZSBkaXJlY3Rpb24gYW5kIGJ5IHNpbWlsYXIgZGVncmVlcy4gV2hpbGUgeWllbGRzIG9mdGVuIG1vdmUgdG9nZXRoZXIgZHVlIHRvIHNoYXJlZCBtYWNyb2Vjb25vbWljIGluZmx1ZW5jZXMsIGRpZmZlcmVuY2VzIGluIGNyZWRpdCByaXNrLCB0YXggdHJlYXRtZW50LCBhbmQgbWFya2V0IGxpcXVpZGl0eSBjYW4gcmVzdWx0IGluIHZhcnlpbmcgbWFnbml0dWRlcyBvZiBtb3ZlbWVudC4KCgojTDcuMTcgQ29tcGFyZSB0aGUgcHJlbWl1bSBvbiBoaWdoLXlpZWxkIGNvcnBvcmF0ZSBib25kcyAocmVsYXRpdmUgdG8gVHJlYXN1cnkgYm9uZHMpIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjaG9vbCB0ZXJtIHRvIHRoZSBwcmVtaXVtIHRoYXQgZXhpc3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybS4gRGlkIHRoZSBwcmVtaXVtIGluY3JlYXNlIG9yIGRlY3JlYXNlPyBXaHkgdGhpcyBwcmVtaXVtIGNoYW5nZWQgb3ZlciB0aGUgc2Nob29sIHRlcm0uCgojIEluc3RhbGwgYW5kIGxvYWQgbmVjZXNzYXJ5IHBhY2thZ2VzCmlmICghcmVxdWlyZShxdWFudG1vZCkpIGluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikKbGlicmFyeShxdWFudG1vZCkKCgojIERlZmluZSB0aGUgZGF0ZXMgZm9yIHRoZSBzY2hvb2wgdGVybQpzdGFydF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMDUtMDEiKQplbmRfZGF0ZSA8LSBhcy5EYXRlKCIyMDI0LTA5LTMwIikKCgojIFJldHJpZXZlIGRhdGEgZm9yIGhpZ2gteWllbGQgY29ycG9yYXRlIGJvbmRzIGFuZCBUcmVhc3VyeSBib25kcwp0cnlDYXRjaCh7CiAgICAjIEhpZ2gteWllbGQgY29ycG9yYXRlIGJvbmQgaW5kZXggKGp1bmsgYm9uZHMpCiAgICBnZXRTeW1ib2xzKCJCQU1MSDBBMEhZTTJFWSIsIHNyYyA9ICJGUkVEIiwgZnJvbSA9ICIyMDI0LTA0LTAxIiwgdG8gPSAiMjAyNC0xMC0wMSIpCiAgICBoaWdoX3lpZWxkX3N0YXJ0IDwtIG5hLm9taXQoQkFNTEgwQTBIWU0yRVlbc3RhcnRfZGF0ZV0gLyAxMDApCiAgICBoaWdoX3lpZWxkX2VuZCA8LSBuYS5vbWl0KEJBTUxIMEEwSFlNMkVZW2VuZF9kYXRlXSAvIDEwMCkKCgogICAgIyBUcmVhc3VyeSBib25kICgxMC15ZWFyIGFzIHByb3h5KQogICAgZ2V0U3ltYm9scygiREdTMTAiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSAiMjAyNC0wNC0wMSIsIHRvID0gIjIwMjQtMTAtMDEiKQogICAgdHJlYXN1cnlfc3RhcnQgPC0gbmEub21pdChER1MxMFtzdGFydF9kYXRlXSAvIDEwMCkKICAgIHRyZWFzdXJ5X2VuZCA8LSBuYS5vbWl0KERHUzEwW2VuZF9kYXRlXSAvIDEwMCkKCgogICAgIyBDYWxjdWxhdGUgcHJlbWl1bXMKICAgIHByZW1pdW1fc3RhcnQgPC0gZmlyc3QoaGlnaF95aWVsZF9zdGFydCkgLSBmaXJzdCh0cmVhc3VyeV9zdGFydCkKICAgIHByZW1pdW1fZW5kIDwtIGZpcnN0KGhpZ2hfeWllbGRfZW5kKSAtIGZpcnN0KHRyZWFzdXJ5X2VuZCkKCgogICAgIyBEaXNwbGF5IHJlc3VsdHMKICAgIGNhdCgiSGlnaC1ZaWVsZCBDb3Jwb3JhdGUgQm9uZCBQcmVtaXVtIGF0IFN0YXJ0IChNYXkgMSwgMjAyNCk6Iiwgcm91bmQocHJlbWl1bV9zdGFydCAqIDEwMCwgMiksICIlXG4iKQogICAgY2F0KCJIaWdoLVlpZWxkIENvcnBvcmF0ZSBCb25kIFByZW1pdW0gYXQgRW5kIChTZXB0ZW1iZXIgMzAsIDIwMjQpOiIsIHJvdW5kKHByZW1pdW1fZW5kICogMTAwLCAyKSwgIiVcbiIpCgoKICAgICMgQW5hbHl6ZSBjaGFuZ2VzIGluIHRoZSBwcmVtaXVtCiAgICBpZiAoIWlzLm5hKHByZW1pdW1fc3RhcnQpICYmICFpcy5uYShwcmVtaXVtX2VuZCkpIHsKICAgICAgICBpZiAocHJlbWl1bV9lbmQgPiBwcmVtaXVtX3N0YXJ0KSB7CiAgICAgICAgICAgIGNhdCgiVGhlIHByZW1pdW0gaW5jcmVhc2VkIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLCBpbmRpY2F0aW5nIGhlaWdodGVuZWQgY3JlZGl0IHJpc2sgb3IgbWFya2V0IGNvbmNlcm5zLlxuIikKICAgICAgICB9IGVsc2UgaWYgKHByZW1pdW1fZW5kIDwgcHJlbWl1bV9zdGFydCkgewogICAgICAgICAgICBjYXQoIlRoZSBwcmVtaXVtIGRlY3JlYXNlZCBvdmVyIHRoZSBzY2hvb2wgdGVybSwgcmVmbGVjdGluZyBpbXByb3ZlZCBpbnZlc3RvciBjb25maWRlbmNlIGFuZCByZWR1Y2VkIGNyZWRpdCByaXNrLlxuIikKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjYXQoIlRoZSBwcmVtaXVtIHJlbWFpbmVkIHN0YWJsZSBvdmVyIHRoZSBzY2hvb2wgdGVybSwgaW5kaWNhdGluZyBjb25zaXN0ZW50IG1hcmtldCBjb25kaXRpb25zLlxuIikKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNhdCgiSW5zdWZmaWNpZW50IGRhdGEgdG8gY29tcGFyZSBwcmVtaXVtcy5cbiIpCiAgICB9Cn0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgY2F0KCJFcnJvciByZXRyaWV2aW5nIGRhdGE6IiwgZSRtZXNzYWdlLCAiXG4iKQp9KQoKI0NvbmNsdXNpb24KI1RoZSBwcmVtaXVtIG9uIGhpZ2gteWllbGQgY29ycG9yYXRlIGJvbmRzIHJlbGF0aXZlIHRvIFRyZWFzdXJ5IGJvbmRzIHJlZmxlY3RzIHRoZSBhZGRpdGlvbmFsIHJpc2sgaW52ZXN0b3JzIGFjY2VwdCBmb3IgaGlnaGVyIHlpZWxkcy4gQSB3aWRlbmluZyBwcmVtaXVtIHN1Z2dlc3RzIGluY3JlYXNlZCBjcmVkaXQgY29uY2VybnMgb3IgbWFya2V0IHVuY2VydGFpbnR5LCB3aGlsZSBhIG5hcnJvd2luZyBwcmVtaXVtIGluZGljYXRlcyBpbXByb3ZlZCBjb25maWRlbmNlIG9yIGxvd2VyIHBlcmNlaXZlZCByaXNrcy4gSWYgdGhlIHByZW1pdW0gcmVtYWluZWQgc3RhYmxlLCBpdCBpbXBsaWVzIGNvbnNpc3RlbnQgbWFya2V0IGNvbmRpdGlvbnMgdGhyb3VnaG91dCB0aGUgdGVybS4gVGhlc2Ugc2hpZnRzIGhpZ2hsaWdodCBob3cgZWNvbm9taWMgYW5kIG1hcmtldCBmYWN0b3JzIGluZmx1ZW5jZSBpbnZlc3RvciBzZW50aW1lbnQgYW5kIHJpc2stcmV0dXJuIHRyYWRlLW9mZnMgaW4gYm9uZCBtYXJrZXRzLgoKI0w4IFBvcnRmb2xpbyAtIE1hcmtvdml0egoKI1JlcGxpY2F0ZSB0aGUgYmFzaWMgaWRlYSBvZiB0aGUgcHJvdGZvbGlvIGNhc2UKCiMgSW5zdGFsbCBhbmQgbG9hZCBuZWNlc3NhcnkgcGFja2FnZXMKaWYgKCFyZXF1aXJlKHF1YW50bW9kKSkgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiKQppZiAoIXJlcXVpcmUoUGVyZm9ybWFuY2VBbmFseXRpY3MpKSBpbnN0YWxsLnBhY2thZ2VzKCJQZXJmb3JtYW5jZUFuYWx5dGljcyIpCmlmICghcmVxdWlyZShxdWFkcHJvZykpIGluc3RhbGwucGFja2FnZXMoInF1YWRwcm9nIikKbGlicmFyeShxdWFudG1vZCkKbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykKbGlicmFyeShxdWFkcHJvZykKCgojIERlZmluZSB0aGUgYXNzZXRzIGFuZCBkYXRlIHJhbmdlCnN5bWJvbHMgPC0gYygiQUFQTCIsICJNU0ZUIiwgIkdPT0ciLCAiQU1aTiIpICAjIFJlcGxhY2Ugd2l0aCBwcmVmZXJyZWQgYXNzZXQgdGlja2VycwpzdGFydF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMDUtMDEiKQplbmRfZGF0ZSA8LSBhcy5EYXRlKCIyMDI0LTA5LTMwIikKCgojIERvd25sb2FkIGRhdGEKZ2V0U3ltYm9scyhzeW1ib2xzLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSwgYXV0by5hc3NpZ24gPSBUUlVFKQoKCiMgRXh0cmFjdCBhZGp1c3RlZCBjbG9zaW5nIHByaWNlcwpwcmljZXMgPC0gZG8uY2FsbChjYmluZCwgbGFwcGx5KHN5bWJvbHMsIGZ1bmN0aW9uKHgpIENsKGdldCh4KSkpKQpjb2xuYW1lcyhwcmljZXMpIDwtIHN5bWJvbHMKCgojIENhbGN1bGF0ZSBkYWlseSByZXR1cm5zCnJldHVybnMgPC0gbmEub21pdChSZXR1cm4uY2FsY3VsYXRlKHByaWNlcywgbWV0aG9kID0gImxvZyIpKQoKCiMgQ2FsY3VsYXRlIGV4cGVjdGVkIHJldHVybnMgYW5kIGNvdmFyaWFuY2UgbWF0cml4Cm1lYW5fcmV0dXJucyA8LSBjb2xNZWFucyhyZXR1cm5zKSAqIDI1MiAgIyBBbm51YWxpemVkCmNvdl9tYXRyaXggPC0gY292KHJldHVybnMpICogMjUyICAgICAgICAgIyBBbm51YWxpemVkCgoKIyBQb3J0Zm9saW8gb3B0aW1pemF0aW9uCiMgU2V0IGVxdWFsIHdlaWdodHMgaW5pdGlhbGx5CmVxdWFsX3dlaWdodHMgPC0gcmVwKDEgLyBuY29sKHJldHVybnMpLCBuY29sKHJldHVybnMpKQoKCiMgTWluaW1pemUgcG9ydGZvbGlvIHZhcmlhbmNlIChubyBzaG9ydC1zZWxsaW5nIGFsbG93ZWQpCm9wdGltYWxfcG9ydGZvbGlvIDwtIHNvbHZlLlFQKAogICAgRG1hdCA9IGNvdl9tYXRyaXgsCiAgICBkdmVjID0gcmVwKDAsIG5jb2wocmV0dXJucykpLAogICAgQW1hdCA9IGNiaW5kKDEsIGRpYWcobmNvbChyZXR1cm5zKSkpLAogICAgYnZlYyA9IGMoMSwgcmVwKDAsIG5jb2wocmV0dXJucykpKSwKICAgIG1lcSA9IDEKKQoKCiMgRXh0cmFjdCB3ZWlnaHRzCm9wdGltYWxfd2VpZ2h0cyA8LSBvcHRpbWFsX3BvcnRmb2xpbyRzb2x1dGlvbgoKCiMgQ2FsY3VsYXRlIHBvcnRmb2xpbyBtZXRyaWNzCm9wdGltYWxfcmV0dXJuIDwtIHN1bShvcHRpbWFsX3dlaWdodHMgKiBtZWFuX3JldHVybnMpCm9wdGltYWxfcmlzayA8LSBzcXJ0KHQob3B0aW1hbF93ZWlnaHRzKSAlKiUgY292X21hdHJpeCAlKiUgb3B0aW1hbF93ZWlnaHRzKQoKCiMgRGlzcGxheSByZXN1bHRzCmNhdCgiT3B0aW1hbCBQb3J0Zm9saW8gV2VpZ2h0czpcbiIpCnByaW50KG9wdGltYWxfd2VpZ2h0cykKY2F0KCJcbkV4cGVjdGVkIEFubnVhbGl6ZWQgUmV0dXJuOiIsIHJvdW5kKG9wdGltYWxfcmV0dXJuICogMTAwLCAyKSwgIiVcbiIpCmNhdCgiUG9ydGZvbGlvIFJpc2sgKFN0YW5kYXJkIERldmlhdGlvbik6Iiwgcm91bmQob3B0aW1hbF9yaXNrICogMTAwLCAyKSwgIiVcbiIpCgoKCgojTDkgUG9ydGZvbGlvIC0gQ0FNUAoKI1N0YXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gQ0FNUCBhbmQgTWFya292aXR6CiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzCmlmICghcmVxdWlyZShxdWFudG1vZCkpIGluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikKaWYgKCFyZXF1aXJlKFBlcmZvcm1hbmNlQW5hbHl0aWNzKSkgaW5zdGFsbC5wYWNrYWdlcygiUGVyZm9ybWFuY2VBbmFseXRpY3MiKQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQoKCiMgRGVmaW5lIHN0b2NrIGFuZCBtYXJrZXQgaW5kaWNlcwpzeW1ib2xzIDwtIGMoIkFBUEwiLCAiXkdTUEMiKSAgIyBBQVBMID0gc3RvY2ssIEdTUEMgPSBTJlAgNTAwIGFzIG1hcmtldCBwcm94eQoKCiMgRGVmaW5lIHRoZSBkYXRlIHJhbmdlCnN0YXJ0X2RhdGUgPC0gIjIwMTgtMDEtMDEiCmVuZF9kYXRlIDwtICIyMDIzLTEyLTMxIgoKCiMgRG93bmxvYWQgZGF0YQpnZXRTeW1ib2xzKHN5bWJvbHMsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQoKCiMgQ2FsY3VsYXRlIGRhaWx5IHJldHVybnMgZm9yIHN0b2NrIGFuZCBtYXJrZXQKc3RvY2tfcmV0dXJucyA8LSBuYS5vbWl0KFJPQyhBQVBMWyw2XSkpICAjIEFkanVzdGVkIGNsb3NlIHByaWNlIG9mIEFBUEwKbWFya2V0X3JldHVybnMgPC0gbmEub21pdChST0MoR1NQQ1ssNl0pKSAgIyBBZGp1c3RlZCBjbG9zZSBwcmljZSBvZiBTJlAgNTAwCgoKIyBDYWxjdWxhdGUgQ0FQTSBCZXRhCmJldGEgPC0gQ0FQTS5iZXRhKFJhID0gc3RvY2tfcmV0dXJucywgUmIgPSBtYXJrZXRfcmV0dXJucykKCgojIERlZmluZSByaXNrLWZyZWUgcmF0ZSBhbmQgY2FsY3VsYXRlIGV4cGVjdGVkIHJldHVybgpyaXNrX2ZyZWVfcmF0ZSA8LSAwLjAzICAjIEV4YW1wbGU6IDMlIGFubnVhbCByaXNrLWZyZWUgcmF0ZQpleHBlY3RlZF9yZXR1cm4gPC0gcmlza19mcmVlX3JhdGUgKyBiZXRhICogKG1lYW4obWFya2V0X3JldHVybnMpIC0gcmlza19mcmVlX3JhdGUpCgoKIyBEaXNwbGF5IHJlc3VsdHMKY2F0KCJCZXRhOiIsIGJldGEsICJcbiIpCmNhdCgiRXhwZWN0ZWQgUmV0dXJuOiIsIGV4cGVjdGVkX3JldHVybiAqIDEwMCwgIiUiKQoKCgoKCgojVGhlIHByaW1hcnkgZGlmZmVyZW5jZSBiZXR3ZWVuIENBUE0gYW5kIE1hcmtvd2l0eiBQb3J0Zm9saW8gVGhlb3J5IGxpZXMgaW4gdGhlaXIgZm9jdXMgYW5kIGFwcHJvYWNoIHRvIHJpc2suIENBUE0gZW1waGFzaXplcyBzeXN0ZW1hdGljIHJpc2ssIG1lYXN1cmVkIGJ5IGJldGEsIGFuZCBleHBsYWlucyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYW4gYXNzZXQncyBzZW5zaXRpdml0eSB0byBtYXJrZXQgbW92ZW1lbnRzIGFuZCBpdHMgZXhwZWN0ZWQgcmV0dXJuLiBJdCBhc3N1bWVzIGludmVzdG9ycyBob2xkIHRoZSBtYXJrZXQgcG9ydGZvbGlvIGFuZCBldmFsdWF0ZXMgaW5kaXZpZHVhbCBhc3NldHMgYmFzZWQgb24gdGhlaXIgbWFya2V0IHJpc2sgZXhwb3N1cmUuIEluIGNvbnRyYXN0LCBNYXJrb3dpdHogUG9ydGZvbGlvIFRoZW9yeSBjb25zaWRlcnMgdG90YWwgcmlzaywgaW5jbHVkaW5nIGJvdGggc3lzdGVtYXRpYyBhbmQgdW5zeXN0ZW1hdGljIHJpc2ssIGFpbWluZyB0byBjb25zdHJ1Y3QgYW4gb3B0aW1hbCBwb3J0Zm9saW8gYnkgZGl2ZXJzaWZ5aW5nIGFzc2V0cyB0byBtaW5pbWl6ZSByaXNrIGZvciBhIGdpdmVuIHJldHVybi4gV2hpbGUgQ0FQTSBpcyBpZGVhbCBmb3IgcHJpY2luZyBhc3NldHMgYW5kIHVuZGVyc3RhbmRpbmcgdGhlaXIgcmlzay1hZGp1c3RlZCByZXR1cm5zLCBNYXJrb3dpdHogcHJvdmlkZXMgYSBwcmFjdGljYWwgZnJhbWV3b3JrIGZvciBwb3J0Zm9saW8gb3B0aW1pemF0aW9uIGFuZCByaXNrIG1hbmFnZW1lbnQuIFRvZ2V0aGVyLCB0aGV5IG9mZmVyIGNvbXBsZW1lbnRhcnkgcGVyc3BlY3RpdmVzIG9uIGludmVzdG1lbnQgc3RyYXRlZ3kuCgojTDEwIFdBQ0MKI1JlcGxpY2F0ZSB0aGUgYm9vayBjYXNlIG9mIFdBQ0MgKHRoZXJlIGlzIG5vdCBib29rIGNhc2UpCiNUaGUgV2VpZ2h0ZWQgQXZlcmFnZSBDb3N0IG9mIENhcGl0YWwgKFdBQ0MpIGlzIGEga2V5IGZpbmFuY2lhbCBtZXRyaWMgdGhhdCByZXByZXNlbnRzIHRoZSBhdmVyYWdlIHJhdGUgb2YgcmV0dXJuIGEgY29tcGFueSBtdXN0IGdlbmVyYXRlIHRvIHNhdGlzZnkgaXRzIGludmVzdG9ycywgYm90aCBlcXVpdHkgYW5kIGRlYnQgaG9sZGVycy4gSXQgaXMgdXNlZCB0byBhc3Nlc3MgdGhlIG1pbmltdW0gcmV0dXJuIGEgY29tcGFueSBuZWVkcyB0byBlYXJuIG9uIGl0cyBpbnZlc3RtZW50cyB0byBtYWludGFpbiBpdHMgdmFsdWUgYW5kIGF0dHJhY3QgZmluYW5jaW5nLgojV0FDQyBpbmNvcnBvcmF0ZXMgdHdvIG1haW4gY29tcG9uZW50cyBvZiBjYXBpdGFsOgojQ29zdCBvZiBFcXVpdHkgKFJlUmVSZSk6IFRoaXMgaXMgdGhlIHJldHVybiByZXF1aXJlZCBieSBzaGFyZWhvbGRlcnMgZm9yIHRoZSByaXNrIHRoZXkgdGFrZSBpbiBpbnZlc3RpbmcgaW4gdGhlIGNvbXBhbnkuIEl0IHJlZmxlY3RzIHRoZSBvcHBvcnR1bml0eSBjb3N0IG9mIGNhcGl0YWwgYW5kIGlzIG9mdGVuIGVzdGltYXRlZCB1c2luZyB0aGUgQ2FwaXRhbCBBc3NldCBQcmljaW5nIE1vZGVsIChDQVBNKS4KI0Nvc3Qgb2YgRGVidCAoUmRSZFJkKTogVGhpcyBpcyB0aGUgZWZmZWN0aXZlIHJhdGUgYSBjb21wYW55IHBheXMgb24gaXRzIGJvcnJvd2VkIGZ1bmRzLiBJdCBpcyBhZGp1c3RlZCBmb3IgdGhlIGNvcnBvcmF0ZSB0YXggcmF0ZSwgYXMgaW50ZXJlc3QgcGF5bWVudHMgYXJlIHRheC1kZWR1Y3RpYmxlLgojV0FDQyBpcyBjYWxjdWxhdGVkIGFzIGEgd2VpZ2h0ZWQgYXZlcmFnZSwgd2hlcmUgdGhlIHdlaWdodHMgYXJlIHRoZSBwcm9wb3J0aW9ucyBvZiBlcXVpdHkgYW5kIGRlYnQgaW4gdGhlIGNvbXBhbnnigJlzIGNhcGl0YWwgc3RydWN0dXJlLiBUaGUgZm9ybXVsYSBpczoKICBXQUNDPUVW4ouFUmUrRFbii4VSZOKLhSgx4oiSVGMpV0FDQyA9IFxmcmFje0V9e1Z9IFxjZG90IFJlICsgXGZyYWN7RH17Vn0gXGNkb3QgUmQgXGNkb3QgKDEgLSBUYylXQUNDPVZF4oCL4ouFUmUrVkTigIvii4VSZOKLhSgx4oiSVGMpCiNXaGVyZToKICAjRUVFOiBNYXJrZXQgdmFsdWUgb2YgZXF1aXR5CiNEREQ6IE1hcmtldCB2YWx1ZSBvZiBkZWJ0ClY9RStEViA9IEUgKyBEVj1FK0Q6IFRvdGFsIGNhcGl0YWwgKGVxdWl0eSArIGRlYnQpCiNSZVJlUmU6IENvc3Qgb2YgZXF1aXR5CiNSZFJkUmQ6IENvc3Qgb2YgZGVidAojVGNUY1RjOiBDb3Jwb3JhdGUgdGF4IHJhdGUKI0tleSBJbnNpZ2h0cwojUHVycG9zZSBvZiBXQUNDOiBUaGUgV2VpZ2h0ZWQgQXZlcmFnZSBDb3N0IG9mIENhcGl0YWwgKFdBQ0MpIGlzIGEga2V5IGJlbmNobWFyayBmb3IgZXZhbHVhdGluZyBpbnZlc3RtZW50IG9wcG9ydHVuaXRpZXMsIHJlcHJlc2VudGluZyB0aGUgbWluaW11bSByZXR1cm4gYSBjb21wYW55IG11c3QgZ2VuZXJhdGUgdG8gc2F0aXNmeSBib3RoIGVxdWl0eSBhbmQgZGVidCBpbnZlc3RvcnMuIFByb2plY3RzIHNob3VsZCBvbmx5IGJlIHVuZGVydGFrZW4gaWYgdGhlaXIgZXhwZWN0ZWQgcmV0dXJuIGV4Y2VlZHMgdGhlIFdBQ0MsIGVuc3VyaW5nIHZhbHVlIGNyZWF0aW9uLiBCeSByZWZsZWN0aW5nIHRoZSBjb21wYW554oCZcyBibGVuZGVkIGNvc3Qgb2YgY2FwaXRhbCwgV0FDQyBhY2NvdW50cyBmb3IgdGhlIHJpc2sgcHJlZmVyZW5jZXMgb2YgZXF1aXR5IGFuZCBkZWJ0IGhvbGRlcnMsIGd1aWRpbmcgc291bmQgZmluYW5jaWFsIGRlY2lzaW9ucwoKCiNGYWN0b3JzIEFmZmVjdGluZyBXQUNDOiBUaGUgY2FwaXRhbCBzdHJ1Y3R1cmUgb2YgYSBjb21wYW55IHNpZ25pZmljYW50bHkgaW1wYWN0cyBXQUNDLCBhcyBkZWJ0IGlzIHR5cGljYWxseSBjaGVhcGVyIHRoYW4gZXF1aXR5IGJ1dCBpbnRyb2R1Y2VzIGFkZGl0aW9uYWwgZmluYW5jaWFsIHJpc2suIE1hcmtldCBjb25kaXRpb25zLCBzdWNoIGFzIGNoYW5nZXMgaW4gaW50ZXJlc3QgcmF0ZXMgb3IgbWFya2V0IHJpc2sgcHJlbWl1bXMsIGNhbiBpbmZsdWVuY2UgdGhlIGNvc3Qgb2YgYm90aCBkZWJ0IGFuZCBlcXVpdHkuIEFkZGl0aW9uYWxseSwgdGhlIHRheCByYXRlIHBsYXlzIGEgcm9sZSwgd2l0aCBoaWdoZXIgdGF4IHJhdGVzIHJlZHVjaW5nIHRoZSBhZnRlci10YXggY29zdCBvZiBkZWJ0LCBwb3RlbnRpYWxseSBsb3dlcmluZyB0aGUgV0FDQy4gVGhlc2UgZmFjdG9ycyB0b2dldGhlciBkZXRlcm1pbmUgdGhlIGNvbXBhbnnigJlzIG92ZXJhbGwgY29zdCBvZiBjYXBpdGFsIGFuZCBpbmZsdWVuY2UgaXRzIGZpbmFuY2lhbCBzdHJhdGVneS4KI0ltcGxpY2F0aW9ucyBvZiBXQUNDOgojQSBsb3dlciBXQUNDIGluZGljYXRlcyB0aGF0IGEgY29tcGFueSBjYW4gZmluYW5jZSBwcm9qZWN0cyBtb3JlIGNoZWFwbHksIGltcHJvdmluZyBpdHMgY29tcGV0aXRpdmVuZXNzLgojQSBoaWdoZXIgV0FDQyBzdWdnZXN0cyB0aGF0IHRoZSBjb21wYW55IGZhY2VzIGhpZ2hlciBmaW5hbmNpbmcgY29zdHMsIHdoaWNoIGNvdWxkIGxpbWl0IGl0cyBhYmlsaXR5IHRvIHB1cnN1ZSBncm93dGggb3Bwb3J0dW5pdGllcy4KI1dBQ0MgaXMgYSBjb3JuZXJzdG9uZSBtZXRyaWMgaW4gY29ycG9yYXRlIGZpbmFuY2UsIGd1aWRpbmcgaW52ZXN0bWVudCBkZWNpc2lvbnMsIHZhbHVhdGlvbiBtb2RlbHMsIGFuZCBwZXJmb3JtYW5jZSBiZW5jaG1hcmtzLiBJdCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmlldyBvZiB0aGUgY29tcGFueeKAmXMgY29zdCBvZiBmaW5hbmNpbmcgYW5kIGl0cyBpbXBsaWNhdGlvbnMgZm9yIHN0cmF0ZWdpYyBwbGFubmluZy4KCgoKCiNMMTEgRGVyaXZhdGl2ZXMKI0wxMS4xIEFzc3VtZSB0aGF0IHlvdSBwdXJjaGFzZWQgYW4gUyZQIDUwMCBmdXR1cmVzIGNvbnRyYWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjaG9vbCB0ZXJtLCB3aXRoIHRoZSBmaXJzdCBzZXR0bGVtZW50IGRhdGUgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtLiBBbHNvIGFzc3VtZSB0aGF0IHlvdSBzb2xkIGFuIFMmUCA1MDAgZnV0dXJlcyBjb250cmFjdCB3aXRoIHRoaXMgc2FtZSBzZXR0bGVtZW50IGRhdGUgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0uIEdpdmVuIHRoYXQgdGhpcyBjb250cmFjdCBoYXMgYSB2YWx1ZSBvZiB0aGUgZnV0dXJlcyBwcmljZSB0aW1lcyAkMjUwLCBkZXRlcm1pbmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZG9sbGFyIHZhbHVlIG9mIHRoZSBjb250cmFjdCB5b3Ugc29sZCBhbmQgdGhlIGRvbGxhciBhbW91bnQgb2YgdGhlIGNvbnRyYWN0IHRoYXQgeW91IHB1cmNoYXNlZC4KIyBJbnB1dCBkYXRhOiBSZXBsYWNlIHRoZXNlIHdpdGggYWN0dWFsIHByaWNlcwpzdGFydF9wcmljZSA8LSA0NTAwICAjIFMmUCA1MDAgZnV0dXJlcyBwcmljZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXJtCmVuZF9wcmljZSA8LSA0NjAwICAgICMgUyZQIDUwMCBmdXR1cmVzIHByaWNlIGF0IHRoZSBlbmQgb2YgdGhlIHRlcm0KY29udHJhY3RfdmFsdWVfbXVsdGlwbGllciA8LSAyNTAgICMgRG9sbGFyIG11bHRpcGxpZXIgcGVyIGZ1dHVyZXMgcHJpY2UgdW5pdAoKCiMgQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGluIGRvbGxhciB2YWx1ZQpkaWZmZXJlbmNlIDwtIChlbmRfcHJpY2UgLSBzdGFydF9wcmljZSkgKiBjb250cmFjdF92YWx1ZV9tdWx0aXBsaWVyCgoKIyBEaXNwbGF5IHJlc3VsdHMKY2F0KCJGdXR1cmVzIHByaWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlcm06Iiwgc3RhcnRfcHJpY2UsICJcbiIpCmNhdCgiRnV0dXJlcyBwcmljZSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXJtOiIsIGVuZF9wcmljZSwgIlxuIikKY2F0KCJEaWZmZXJlbmNlIGluIGRvbGxhciB2YWx1ZSBvZiB0aGUgZnV0dXJlcyBjb250cmFjdHM6IiwgZGlmZmVyZW5jZSwgIlVTRFxuIikKCgoKCiNDb25jbHVzaW9uCiNUaGUgZG9sbGFyIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWUgb2YgdGhlIFMmUCA1MDAgZnV0dXJlcyBjb250cmFjdCBhdCB0aGUgZW5kIG9mIHRoZSB0ZXJtIGFuZCBhdCB0aGUgYmVnaW5uaW5nIHdhcyBjYWxjdWxhdGVkIGFzICQ1MCwwMDAgKGJhc2VkIG9uIGEgcHJpY2UgaW5jcmVhc2UgZnJvbSA0NTAwIHRvIDQ3MDAgYW5kIGEgY29udHJhY3QgbXVsdGlwbGllciBvZiAkMjUwKS4KI1RoaXMgZ2FpbiByZWZsZWN0cyB0aGUgcHJpY2UgYXBwcmVjaWF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIGluZGV4IGR1cmluZyB0aGUgc2Nob29sIHRlcm0uIFRyYWRpbmcgZnV0dXJlcyBhbXBsaWZpZXMgdGhlc2UgcHJpY2UgbW92ZW1lbnRzIGR1ZSB0byB0aGUgaGlnaCBub3Rpb25hbCB2YWx1ZSBvZiB0aGUgY29udHJhY3RzLCBvZmZlcmluZyBzaWduaWZpY2FudCBwcm9maXQgcG90ZW50aWFsLgojSG93ZXZlciwgdGhpcyBsZXZlcmFnZSB3b3JrcyBib3RoIHdheXM6IHdoaWxlIGdhaW5zIGFyZSBtYWduaWZpZWQgd2hlbiBwcmljZXMgbW92ZSBpbiB5b3VyIGZhdm9yLCBsb3NzZXMgY2FuIGJlIGVxdWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIG1hcmtldCBtb3ZlcyBhZ2FpbnN0IHlvdXIgcG9zaXRpb24uIFRoaXMgZW1waGFzaXplcyB0aGUgaW1wb3J0YW5jZSBvZiB1bmRlcnN0YW5kaW5nIG1hcmtldCB0cmVuZHMgYW5kIHBvdGVudGlhbCByaXNrcyB3aGVuIGVuZ2FnaW5nIGluIGZ1dHVyZXMgdHJhZGluZy4KCgojTDExLjIgQXNzdW1lIHRoYXQgeW91IGludmVzdGVkIGFuIGluaXRpYWwgbWFyZ2luIG9mIDIwIHBlcmNlbnQgb2YgdGhlIGFtb3VudCB0aGF0IHlvdSB3b3VsZCBvd2UgdG8gcHVyY2hhc2UgdGhlIFMmUCA1MDAgaW5kZXggYXQgdGhlIHNldHRsZW1lbnQgZGF0ZS4gTWVhc3VyZSB5b3VyIHJldHVybiBmcm9tIHRha2luZyBhIHBvc2l0aW9uIGluIHRoZSBTJlAgNTAwIGluZGV4IGZ1dHVyZXMgYXMgZm9sbG93cy4gVGFrZSB0aGUgZGlmZmVyZW5jZSBkZXRlcm1pbmVkIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiAod2hpY2ggcmVwcmVzZW50cyB0aGUgZG9sbGFyIGFtb3VudCBvZiB0aGUgZ2FpbiBvbiB0aGUgZnV0dXJlcyBwb3NpdGlvbikgYW5kIGRpdmlkZSBpdCBieSB0aGUgYW1vdW50IHlvdSBvcmlnaW5hbGx5IGludmVzdGVkICh0aGUgYW1vdW50IHlvdSBvcmlnaW5hbGx5IGludmVzdGVkIGlzIDIwIHBlcmNlbnQgb2YgdGhlIGRvbGxhciB2YWx1ZSBvZiB0aGUgZnV0dXJlcyBjb250cmFjdCB0aGF0IHlvdSBwdXJjaGFzZWQpLgoKCiMgSW5wdXQgZGF0YQpzdGFydF9wcmljZSA8LSA0NTAwICAjIFMmUCA1MDAgZnV0dXJlcyBwcmljZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXJtCmVuZF9wcmljZSA8LSA0NzAwICAgICMgUyZQIDUwMCBmdXR1cmVzIHByaWNlIGF0IHRoZSBlbmQgb2YgdGhlIHRlcm0KY29udHJhY3RfdmFsdWVfbXVsdGlwbGllciA8LSAyNTAgICMgRG9sbGFyIG11bHRpcGxpZXIgcGVyIGZ1dHVyZXMgcHJpY2UgdW5pdAptYXJnaW5fcGVyY2VudGFnZSA8LSAwLjIwICAjIEluaXRpYWwgbWFyZ2luICgyMCUpCgoKIyBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgaW4gZG9sbGFyIHZhbHVlIChnYWluL2xvc3MpCmRpZmZlcmVuY2UgPC0gKGVuZF9wcmljZSAtIHN0YXJ0X3ByaWNlKSAqIGNvbnRyYWN0X3ZhbHVlX211bHRpcGxpZXIKCgojIENhbGN1bGF0ZSB0aGUgaW5pdGlhbCBpbnZlc3RtZW50IChtYXJnaW4pCmluaXRpYWxfY29udHJhY3RfdmFsdWUgPC0gc3RhcnRfcHJpY2UgKiBjb250cmFjdF92YWx1ZV9tdWx0aXBsaWVyCmluaXRpYWxfaW52ZXN0bWVudCA8LSBpbml0aWFsX2NvbnRyYWN0X3ZhbHVlICogbWFyZ2luX3BlcmNlbnRhZ2UKCgojIENhbGN1bGF0ZSByZXR1cm4KcmV0dXJuX3BlcmNlbnRhZ2UgPC0gKGRpZmZlcmVuY2UgLyBpbml0aWFsX2ludmVzdG1lbnQpICogMTAwCgoKIyBEaXNwbGF5IHJlc3VsdHMKY2F0KCJJbml0aWFsIGZ1dHVyZXMgcHJpY2U6Iiwgc3RhcnRfcHJpY2UsICJcbiIpCmNhdCgiRmluYWwgZnV0dXJlcyBwcmljZToiLCBlbmRfcHJpY2UsICJcbiIpCmNhdCgiRG9sbGFyIGdhaW4vbG9zcyBvbiB0aGUgZnV0dXJlcyBwb3NpdGlvbjoiLCBkaWZmZXJlbmNlLCAiVVNEXG4iKQpjYXQoIkluaXRpYWwgaW52ZXN0bWVudCAobWFyZ2luKToiLCBpbml0aWFsX2ludmVzdG1lbnQsICJVU0RcbiIpCmNhdCgiUmV0dXJuIG9uIGludmVzdG1lbnQ6Iiwgcm91bmQocmV0dXJuX3BlcmNlbnRhZ2UsIDIpLCAiJVxuIikKCgoKCgoKI0NvbmNsdXNpb24KI1RoZSByZXR1cm4gb24geW91ciBpbnZlc3RtZW50IGluIHRoZSBTJlAgNTAwIGZ1dHVyZXMgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgZ2FpbiBvciBsb3NzIGZyb20gdGhlIGNvbnRyYWN0IGRpdmlkZWQgYnkgeW91ciBpbml0aWFsIG1hcmdpbiBpbnZlc3RtZW50LCB3aGljaCB3YXMgMjAlIG9mIHRoZSBjb250cmFjdCdzIG5vdGlvbmFsIHZhbHVlLgojSW4gdGhpcyBleGFtcGxlLCB0aGUgbGV2ZXJhZ2VkIG5hdHVyZSBvZiBmdXR1cmVzIHRyYWRpbmcgcmVzdWx0cyBpbiBhIHNpZ25pZmljYW50bHkgYW1wbGlmaWVkIHJldHVybiBjb21wYXJlZCB0byB0aGUgYWN0dWFsIGNoYW5nZSBpbiB0aGUgZnV0dXJlcyBwcmljZS4gVGhpcyBkZW1vbnN0cmF0ZXMgdGhlIHBvd2VyIG9mIGxldmVyYWdlOiBzbWFsbCBwcmljZSBtb3ZlbWVudHMgaW4gdGhlIHVuZGVybHlpbmcgYXNzZXQgdHJhbnNsYXRlIGludG8gbGFyZ2UgcGVyY2VudGFnZSBnYWlucyBvciBsb3NzZXMgb24gdGhlIGluaXRpYWwgaW52ZXN0bWVudC4KI1doaWxlIHRoaXMgbGV2ZXJhZ2UgY2FuIGdlbmVyYXRlIHN1YnN0YW50aWFsIHJldHVybnMgd2hlbiB0aGUgbWFya2V0IG1vdmVzIGZhdm9yYWJseSwgaXQgYWxzbyBjYXJyaWVzIHNpZ25pZmljYW50IHJpc2ssIGFzIGFkdmVyc2UgbW92ZW1lbnRzIGNhbiBxdWlja2x5IGxlYWQgdG8gbGFyZ2UgbG9zc2VzIHJlbGF0aXZlIHRvIHRoZSBtYXJnaW4uIFRoaXMgaGlnaGxpZ2h0cyB0aGUgaW1wb3J0YW5jZSBvZiByaXNrIG1hbmFnZW1lbnQgaW4gbGV2ZXJhZ2VkIGludmVzdG1lbnRzIGxpa2UgZnV0dXJlcyBjb250cmFjdHMuCgoKI0wxMS4zIFRoZSByZXR1cm4gdGhhdCB5b3UganVzdCBkZXJpdmVkIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiBpcyBub3QgYW5udWFsaXplZC4gVG8gYW5udWFsaXplIHlvdXIgcmV0dXJuLCBtdWx0aXBseSBpdCBieSAxMi9tLCB3aGVyZSBtIGlzIHRoZSBudW1iZXIgb2YgbW9udGhzIGluIHlvdXIgc2Nob29sIHRlcm0uCgojIElucHV0IGRhdGEKcmV0dXJuX3BlcmNlbnRhZ2UgPC0gMjIuMjIgICMgTm9uLWFubnVhbGl6ZWQgcmV0dXJuIGZyb20gdGhlIHByZXZpb3VzIHF1ZXN0aW9uIChpbiAlKQpzY2hvb2xfdGVybV9tb250aHMgPC0gNSAgICAgIyBOdW1iZXIgb2YgbW9udGhzIGluIHRoZSBzY2hvb2wgdGVybQoKCiMgQ2FsY3VsYXRlIGFubnVhbGl6ZWQgcmV0dXJuCmFubnVhbGl6ZWRfcmV0dXJuIDwtIHJldHVybl9wZXJjZW50YWdlICogKDEyIC8gc2Nob29sX3Rlcm1fbW9udGhzKQoKCiMgRGlzcGxheSByZXN1bHRzCmNhdCgiTm9uLWFubnVhbGl6ZWQgcmV0dXJuOiIsIHJvdW5kKHJldHVybl9wZXJjZW50YWdlLCAyKSwgIiVcbiIpCmNhdCgiTnVtYmVyIG9mIG1vbnRocyBpbiB0aGUgc2Nob29sIHRlcm06Iiwgc2Nob29sX3Rlcm1fbW9udGhzLCAiXG4iKQpjYXQoIkFubnVhbGl6ZWQgcmV0dXJuOiIsIHJvdW5kKGFubnVhbGl6ZWRfcmV0dXJuLCAyKSwgIiVcbiIpCgoKCgojQ29uY2x1c2lvbgojQW5udWFsaXppbmcgdGhlIHJldHVybiBvbiB5b3VyIGludmVzdG1lbnQgc2hvd3MgaG93IHNob3J0LXRlcm0gcGVyZm9ybWFuY2Ugc2NhbGVzIG92ZXIgYSBmdWxsIHllYXIuIEJ5IG11bHRpcGx5aW5nIHRoZSBub24tYW5udWFsaXplZCByZXR1cm4gYnkgMTI1XGZyYWN7MTJ9ezV9NTEy4oCLLCAKI3dlIGFkanVzdCB0aGUgcmV0dXJuIHRvIHJlZmxlY3QgYSAxMi1tb250aCBwZXJpb2QgYmFzZWQgb24gdGhlIDUtbW9udGggdGVybSBvZiB0aGUgc2Nob29sIHNlbWVzdGVyLgojVGhpcyBwcm92aWRlcyBhIHVzZWZ1bCBjb21wYXJpc29uIGFnYWluc3Qgb3RoZXIgaW52ZXN0bWVudHMgd2l0aCB2YXJ5aW5nIGR1cmF0aW9ucy4gSG93ZXZlciwgaXQgYXNzdW1lcyBjb25zaXN0ZW50IHBlcmZvcm1hbmNlIHRocm91Z2hvdXQgdGhlIHllYXIsIHdoaWNoIG1pZ2h0IG5vdCBob2xkIHRydWUgZHVlIHRvIG1hcmtldCB2b2xhdGlsaXR5IG9yIHNwZWNpZmljIGV2ZW50cyBhZmZlY3RpbmcgdGhlIHVuZGVybHlpbmcgYXNzZXQuIAojV2hpbGUgdGhlIGFubnVhbGl6ZWQgcmV0dXJuIGlzIGhlbHBmdWwgZm9yIGNvbXBhcmlzb25zLCBpdCBpcyBlc3NlbnRpYWwgdG8gY29uc2lkZXIgdGhlIGNvbnRleHQgYW5kIHJpc2tzIG9mIG1haW50YWluaW5nIHNpbWlsYXIgcmV0dXJucyBvdmVyIGEgbG9uZ2VyIHBlcmlvZC4KCgpMMTEuNCBBc3N1bWUgdGhhdCB5b3UgcHVyY2hhc2VkIGEgY2FsbCBvcHRpb24gKHJlcHJlc2VudGluZyAxMDAgc2hhcmVzKSBvbiB0aGUgc3BlY2lmaWMgc3RvY2sgdGhhdCB5b3UgaWRlbnRpZmllZCBvZiB0aGlzIHByb2plY3QuIFdoYXQgd2FzIHlvdXIgcmV0dXJuIGZyb20gcHVyY2hhc2luZyB0aGlzIG9wdGlvbj8gW1lvdXIgcmV0dXJuIGNhbiBiZSBtZWFzdXJlZCBhcyAKUHJlCm0KdAriiJJQcmUKbQp04oiSMQpQcmUKbQp04oiSMQpQcmVtdOKIklByZW104oiSMVByZW104oiSMSwgd2hlcmUgClByZQptCnTiiJIxClByZW104oiSMSByZXByZXNlbnRzIHRoZSBwcmVtaXVtIHBhaWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0gYW5kIApQcmUKbQp0ClByZW10IHJlcHJlc2VudHMgdGhlIHByZW1pdW0gYXQgd2hpY2ggdGhlIHNhbWUgb3B0aW9uIGNhbiBiZSBzb2xkIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtLl0gSWYgdGhlIHByZW1pdW0gZm9yIHRoaXMgb3B0aW9uIGlzIG5vdCBxdW90ZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0sIG1lYXN1cmUgdGhlIHJldHVybiBhcyBpZiB5b3UgaGFkIGV4ZXJjaXNlZCB0aGUgY2FsbCBvcHRpb24gYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0gKGFzc3VtaW5nIHRoYXQgaXQgaXMgZmVhc2libGUgdG8gZXhlcmNpc2UgdGhlIG9wdGlvbiBhdCB0aGF0IHRpbWUpLiBUaGF0IGlzLCB0aGUgcmV0dXJuIGlzIGJhc2VkIG9uIHB1cmNoYXNpbmcgdGhlIHN0b2NrIGF0IHRoZSBvcHRpb27igJlzIHN0cmlrZSBwcmljZSBhbmQgdGhlbiBzZWxsaW5nIHRoZSBzdG9jayBhdCBpdHMgbWFya2V0IHByaWNlIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtLgojIElucHV0IGRhdGE6IFJlcGxhY2UgdGhlc2Ugd2l0aCBhY3R1YWwgdmFsdWVzCm9wdGlvbl9wcmVtaXVtX3N0YXJ0IDwtIDUuMCAgIyBQcmVtaXVtIHBhaWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVybSAoJCBwZXIgc2hhcmUpCm9wdGlvbl9wcmVtaXVtX2VuZCA8LSA4LjAgICAgIyBQcmVtaXVtIHJlY2VpdmVkIGF0IHRoZSBlbmQgb2YgdGhlIHRlcm0gKCQgcGVyIHNoYXJlKQpzdG9ja19wcmljZV9lbmQgPC0gMTUwLjAgICAgICMgU3RvY2sgcHJpY2UgYXQgdGhlIGVuZCBvZiB0aGUgdGVybQpzdHJpa2VfcHJpY2UgPC0gMTQwLjAgICAgICAgICMgU3RyaWtlIHByaWNlIG9mIHRoZSBvcHRpb24gKCQgcGVyIHNoYXJlKQpzaGFyZXNfcGVyX29wdGlvbiA8LSAxMDAgICAgICMgRWFjaCBvcHRpb24gcmVwcmVzZW50cyAxMDAgc2hhcmVzCgoKIyBTY2VuYXJpbyAxOiBTZWxsaW5nIHRoZSBvcHRpb24KaWYgKCFpcy5uYShvcHRpb25fcHJlbWl1bV9lbmQpKSB7CiAgICByZXR1cm5fcHJlbWl1bSA8LSAoKG9wdGlvbl9wcmVtaXVtX2VuZCAtIG9wdGlvbl9wcmVtaXVtX3N0YXJ0KSAvIG9wdGlvbl9wcmVtaXVtX3N0YXJ0KSAqIDEwMAogICAgY2F0KCJSZXR1cm4gZnJvbSBzZWxsaW5nIHRoZSBvcHRpb246Iiwgcm91bmQocmV0dXJuX3ByZW1pdW0sIDIpLCAiJVxuIikKfQoKCiMgU2NlbmFyaW8gMjogRXhlcmNpc2luZyB0aGUgb3B0aW9uCmlmIChpcy5uYShvcHRpb25fcHJlbWl1bV9lbmQpICYmIHN0b2NrX3ByaWNlX2VuZCA+IHN0cmlrZV9wcmljZSkgewogICAgaW50cmluc2ljX3ZhbHVlIDwtIChzdG9ja19wcmljZV9lbmQgLSBzdHJpa2VfcHJpY2UpICogc2hhcmVzX3Blcl9vcHRpb24KICAgIHJldHVybl9leGVyY2lzZSA8LSAoaW50cmluc2ljX3ZhbHVlIC0gKG9wdGlvbl9wcmVtaXVtX3N0YXJ0ICogc2hhcmVzX3Blcl9vcHRpb24pKSAvIAogICAgICAgIChvcHRpb25fcHJlbWl1bV9zdGFydCAqIHNoYXJlc19wZXJfb3B0aW9uKSAqIDEwMAogICAgY2F0KCJSZXR1cm4gZnJvbSBleGVyY2lzaW5nIHRoZSBvcHRpb246Iiwgcm91bmQocmV0dXJuX2V4ZXJjaXNlLCAyKSwgIiVcbiIpCn0gZWxzZSBpZiAoc3RvY2tfcHJpY2VfZW5kIDw9IHN0cmlrZV9wcmljZSkgewogICAgY2F0KCJUaGUgb3B0aW9uIGV4cGlyZWQgd29ydGhsZXNzIGFzIHRoZSBzdG9jayBwcmljZSBkaWQgbm90IGV4Y2VlZCB0aGUgc3RyaWtlIHByaWNlLlxuIikKfQoKCgoKCgojQ29uY2x1c2lvbgojVGhlIHJldHVybiBvbiBhIGNhbGwgb3B0aW9uIGRlcGVuZHMgb24gd2hldGhlciBpdCBpcyByZWFsaXplZCBieSBzZWxsaW5nIHRoZSBvcHRpb24gb3IgZXhlcmNpc2luZyBpdC4gV2hlbiBzb2xkLCB0aGUgcmV0dXJuIGlzIGRldGVybWluZWQgYnkgdGhlIGNoYW5nZSBpbiB0aGUgb3B0aW9u4oCZcyBwcmVtaXVtLCBvZnRlbiBzaG93Y2FzaW5nIHNpZ25pZmljYW50IGdhaW5zIGR1ZSB0byB0aGUgbGV2ZXJhZ2UgZWZmZWN0LiBJZiBleGVyY2lzZWQsIHRoZSByZXR1cm4gaXMgYmFzZWQgb24gdGhlIHN0b2NrIHByaWNlIGV4Y2VlZGluZyB0aGUgc3RyaWtlIHByaWNlLCBmYWN0b3JpbmcgaW4gdGhlIGluaXRpYWwgcHJlbWl1bSBwYWlkLiBXaGlsZSBvcHRpb25zIGNhbiBhbXBsaWZ5IHJldHVybnMgY29tcGFyZWQgdG8gZGlyZWN0bHkgaW52ZXN0aW5nIGluIHRoZSBzdG9jaywgdGhleSBjYXJyeSBoaWdoZXIgcmlza3MsIGFzIGEgcG9vciBzdG9jayBwZXJmb3JtYW5jZSBjYW4gbGVhZCB0byB0aGUgbG9zcyBvZiB0aGUgZW50aXJlIHByZW1pdW0uIFRoaXMgdW5kZXJzY29yZXMgdGhlIGhpZ2gtcmlzaywgaGlnaC1yZXdhcmQgbmF0dXJlIG9mIG9wdGlvbnMgdHJhZGluZyBhbmQgdGhlIGltcG9ydGFuY2Ugb2Ygc3RyYXRlZ2ljIGRlY2lzaW9uLW1ha2luZyBpbiB1dGlsaXppbmcgdGhlbSBlZmZlY3RpdmVseS4KCgojTDExLjUgQW5udWFsaXplIHRoZSByZXR1cm4gb24geW91ciBvcHRpb24gYnkgbXVsdGlwbHlpbmcgdGhlIHJldHVybiB5b3UgZGVyaXZlZCBpbiB0aGUgcHJldmlvdXMgcXVlc3Rpb24gYnkgMTIvbSwgd2hlcmUgbSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgbW9udGhzIGluIHlvdXIgc2Nob29sIHRlcm0uCiMgSW5wdXQgZGF0YTogUmVwbGFjZSB3aXRoIHRoZSBhY3R1YWwgcmV0dXJuIGZyb20gdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uCm5vbl9hbm51YWxpemVkX3JldHVybiA8LSA2MC4wICAjIE5vbi1hbm51YWxpemVkIHJldHVybiBpbiBwZXJjZW50YWdlIChlLmcuLCBmcm9tIHNlbGxpbmcgdGhlIG9wdGlvbikKc2Nob29sX3Rlcm1fbW9udGhzIDwtIDUgICAgICAgICMgTnVtYmVyIG9mIG1vbnRocyBpbiB0aGUgc2Nob29sIHRlcm0KCgojIENhbGN1bGF0ZSBhbm51YWxpemVkIHJldHVybgphbm51YWxpemVkX3JldHVybiA8LSBub25fYW5udWFsaXplZF9yZXR1cm4gKiAoMTIgLyBzY2hvb2xfdGVybV9tb250aHMpCgoKIyBEaXNwbGF5IHJlc3VsdHMKY2F0KCJOb24tYW5udWFsaXplZCByZXR1cm46Iiwgcm91bmQobm9uX2FubnVhbGl6ZWRfcmV0dXJuLCAyKSwgIiVcbiIpCmNhdCgiTnVtYmVyIG9mIG1vbnRocyBpbiB0aGUgc2Nob29sIHRlcm06Iiwgc2Nob29sX3Rlcm1fbW9udGhzLCAiXG4iKQpjYXQoIkFubnVhbGl6ZWQgcmV0dXJuOiIsIHJvdW5kKGFubnVhbGl6ZWRfcmV0dXJuLCAyKSwgIiVcbiIpCgoKCgojQ29uY2x1c2lvbgojQW5udWFsaXppbmcgdGhlIHJldHVybiBvbiB0aGUgY2FsbCBvcHRpb24gcmV2ZWFscyB0aGUgc2lnbmlmaWNhbnQgaW1wYWN0IG9mIGxldmVyYWdlIG92ZXIgYSBsb25nZXIgdGltZSBob3Jpem9uLiBJbiB0aGlzIGNhc2UsIHRoZSBhbm51YWxpemVkIHJldHVybiBpcyBzdWJzdGFudGlhbGx5IGhpZ2hlciB0aGFuIHRoZSBub24tYW5udWFsaXplZCByZXR1cm4gZHVlIHRvIHRoZSByZWxhdGl2ZWx5IHNob3J0IGR1cmF0aW9uIG9mIHRoZSBzY2hvb2wgdGVybSAoNSBtb250aHMpLgojVGhpcyByZXN1bHQgaGlnaGxpZ2h0cyBob3cgdGhlIHRpbWUgcGVyaW9kIGFmZmVjdHMgcmV0dXJuIHByb2plY3Rpb25zLCBlc3BlY2lhbGx5IGluIGxldmVyYWdlZCBpbnN0cnVtZW50cyBsaWtlIG9wdGlvbnMuIEl0IGFsbG93cyBmb3IgYSBkaXJlY3QgY29tcGFyaXNvbiB3aXRoIG90aGVyIGludmVzdG1lbnRzIG9mIHZhcnlpbmcgZHVyYXRpb25zLiBIb3dldmVyLCBpdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoaXMgYXNzdW1lcyB0aGUgc2FtZSByYXRlIG9mIHJldHVybiB3b3VsZCBwZXJzaXN0IHRocm91Z2hvdXQgdGhlIHllYXIsIHdoaWNoIG1heSBub3QgYWx3YXlzIGJlIHJlYWxpc3RpYyBnaXZlbiBtYXJrZXQgdm9sYXRpbGl0eSBhbmQgb3B0aW9uIGV4cGlyYXRpb24gY2hhcmFjdGVyaXN0aWNzLgoKCgoKI0wxMS42IENvbXBhcmUgdGhlIHJldHVybiBvbiB5b3VyIGNhbGwgb3B0aW9uIHRvIHRoZSByZXR1cm4gdGhhdCB5b3Ugd291bGQgaGF2ZSBlYXJuZWQgaWYgeW91IGhhZCBzaW1wbHkgaW52ZXN0ZWQgaW4gdGhlIHN0b2NrIGl0c2VsZi4gTm90aWNlIGhvdyB0aGUgbWFnbml0dWRlIG9mIHRoZSByZXR1cm4gb24gdGhlIGNhbGwgb3B0aW9uIGlzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIG1hZ25pdHVkZSBvZiB0aGUgcmV0dXJuIG9uIHRoZSBzdG9jayBpdHNlbGYuIFRoYXQgaXMsIHRoZSBnYWlucyBhcmUgbGFyZ2VyIGFuZCB0aGUgbG9zc2VzIGFyZSBsYXJnZXIgd2hlbiBpbnZlc3RpbmcgaW4gY2FsbCBvcHRpb25zIG9uIGEgc3RvY2sgaW5zdGVhZCBvZiB0aGUgc3RvY2sgaXRzZWxmLgojIElucHV0IGRhdGE6IFJlcGxhY2UgdGhlc2Ugd2l0aCBhY3R1YWwgdmFsdWVzCnN0b2NrX3ByaWNlX3N0YXJ0IDwtIDE0MC4wICAgICMgU3RvY2sgcHJpY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVybSAoJCBwZXIgc2hhcmUpCnN0b2NrX3ByaWNlX2VuZCA8LSAxNTAuMCAgICAgICMgU3RvY2sgcHJpY2UgYXQgdGhlIGVuZCBvZiB0aGUgdGVybSAoJCBwZXIgc2hhcmUpCm9wdGlvbl9yZXR1cm4gPC0gMTQ0LjAgICAgICAgICMgQW5udWFsaXplZCByZXR1cm4gb24gdGhlIG9wdGlvbiAoaW4gJSBmcm9tIHRoZSBwcmV2aW91cyBxdWVzdGlvbikKCgojIENhbGN1bGF0ZSB0aGUgcmV0dXJuIG9uIHRoZSBzdG9jawpzdG9ja19yZXR1cm4gPC0gKChzdG9ja19wcmljZV9lbmQgLSBzdG9ja19wcmljZV9zdGFydCkgLyBzdG9ja19wcmljZV9zdGFydCkgKiAxMDAKCgojIERpc3BsYXkgcmVzdWx0cwpjYXQoIlN0b2NrIHByaWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlcm06Iiwgc3RvY2tfcHJpY2Vfc3RhcnQsICJcbiIpCmNhdCgiU3RvY2sgcHJpY2UgYXQgdGhlIGVuZCBvZiB0aGUgdGVybToiLCBzdG9ja19wcmljZV9lbmQsICJcbiIpCmNhdCgiUmV0dXJuIG9uIHRoZSBzdG9jazoiLCByb3VuZChzdG9ja19yZXR1cm4sIDIpLCAiJVxuIikKY2F0KCJSZXR1cm4gb24gdGhlIGNhbGwgb3B0aW9uIChhbm51YWxpemVkKToiLCByb3VuZChvcHRpb25fcmV0dXJuLCAyKSwgIiVcbiIpCgoKIyBDb21wYXJlIG1hZ25pdHVkZXMKaWYgKG9wdGlvbl9yZXR1cm4gPiBzdG9ja19yZXR1cm4pIHsKICAgIGNhdCgiVGhlIHJldHVybiBvbiB0aGUgY2FsbCBvcHRpb24gaXMgc2lnbmlmaWNhbnRseSBsYXJnZXIgdGhhbiB0aGUgcmV0dXJuIG9uIHRoZSBzdG9jayBpdHNlbGYsIHNob3djYXNpbmcgbGV2ZXJhZ2UuXG4iKQp9IGVsc2UgewogICAgY2F0KCJUaGUgcmV0dXJuIG9uIHRoZSBzdG9jayBpcyBsYXJnZXIsIHdoaWNoIGlzIHVudXN1YWwgZm9yIG9wdGlvbnMuXG4iKQp9CgoKCgoKCiNDb25jbHVzaW9uCiNUaGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSByZXR1cm4gb24gdGhlIGNhbGwgb3B0aW9uIGFuZCB0aGUgcmV0dXJuIG9uIHRoZSB1bmRlcmx5aW5nIHN0b2NrIGRlbW9uc3RyYXRlcyB0aGUgYW1wbGlmaWVkIGVmZmVjdCBvZiBvcHRpb25zIHRyYWRpbmcuIFdoaWxlIHRoZSByZXR1cm4gb24gdGhlIHN0b2NrIGl0c2VsZiByZWZsZWN0cyBpdHMgbW9kZXJhdGUgYXBwcmVjaWF0aW9uLCB0aGUgcmV0dXJuIG9uIHRoZSBjYWxsIG9wdGlvbiBpcyBzaWduaWZpY2FudGx5IGxhcmdlciBkdWUgdG8gdGhlIGxldmVyYWdlIHByb3ZpZGVkIGJ5IG9wdGlvbnMuCiNUaGlzIGxldmVyYWdlIG1lYW5zIHRoYXQgYSBzbWFsbCBwZXJjZW50YWdlIGNoYW5nZSBpbiB0aGUgc3RvY2vigJlzIHByaWNlIHJlc3VsdHMgaW4gYSBtdWNoIGxhcmdlciBwZXJjZW50YWdlIGNoYW5nZSBpbiB0aGUgb3B0aW9u4oCZcyB2YWx1ZS4gSG93ZXZlciwgdGhpcyBhbXBsaWZpY2F0aW9uIHdvcmtzIGJvdGggd2F5czogaWYgdGhlIHN0b2Nr4oCZcyBwcmljZSBoYWQgZGVjbGluZWQsIHRoZSBsb3NzZXMgb24gdGhlIG9wdGlvbiB3b3VsZCBoYXZlIGJlZW4gZmFyIGdyZWF0ZXIgaW4gbWFnbml0dWRlIGNvbXBhcmVkIHRvIGhvbGRpbmcgdGhlIHN0b2NrIGRpcmVjdGx5LgojSW52ZXN0aW5nIGluIGNhbGwgb3B0aW9ucyBjYW4geWllbGQgc3Vic3RhbnRpYWwgZ2FpbnMsIGFzIHNlZW4gaW4gdGhpcyBjYXNlLCBidXQgaXQgYWxzbyBpbnZvbHZlcyBoaWdoZXIgcmlzaywgbWFraW5nIGl0IGEgc3RyYXRlZ3kgc3VpdGFibGUgZm9yIGludmVzdG9ycyB3aG8gYXJlIGNvbmZpZGVudCBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9ja+KAmXMgcHJpY2UgbW92ZW1lbnQuCgoKI0RldGVybWluaW5nIHN3YXAgcGF5bWVudHMKI0wxMS43IEFzc3VtZSB0aGF0LCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybSwgeW91IGVuZ2FnZWQgaW4gYSBmaXhlZC1mb3ItZmxvYXRpbmcgcmF0ZSBzd2FwIGluIHdoaWNoIHlvdSBhZ3JlZWQgdG8gcGF5IDYgcGVyY2VudCBpbiBleGNoYW5nZSBmb3IgdGhlIHByZXZhaWxpbmcgMjYtd2VlayBULWJpbGwgcmF0ZSB0aGF0IGV4aXN0cyBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybS4gQXNzdW1lIHRoYXQgeW91ciBzd2FwIGFncmVlbWVudCBzcGVjaWZpZXMgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0gYXMgdGhlIG9ubHkgdGltZSBhdCB3aGljaCBhIHN3YXAgd2lsbCBvY2N1ciBhbmQgdGhhdCB0aGUgbm90aW9uYWwgYW1vdW50IGlzICQxMCBtaWxsaW9uLiBEZXRlcm1pbmUgdGhlIGFtb3VudCB0aGF0IHlvdSBvd2Ugb24gdGhlIHN3YXAsIHRoZSBhbW91bnQgeW91IGFyZSBvd2VkIG9uIHRoZSBzd2FwLCBhbmQgdGhlIGRpZmZlcmVuY2UuIERpZCB5b3UgZ2FpbiBvciBsb3NlIGFzIGEgcmVzdWx0IG9mIHRoZSBzd2FwPwojIElucHV0IGRhdGEKbm90aW9uYWxfYW1vdW50IDwtIDEwMDAwMDAwICAgICAgICMgTm90aW9uYWwgYW1vdW50ICgkMTAgbWlsbGlvbikKZml4ZWRfcmF0ZSA8LSAwLjA2ICAgICAgICAgICAgICAgICMgRml4ZWQgcmF0ZSAoNiUpCmZsb2F0aW5nX3JhdGUgPC0gMC4wNDUgICAgICAgICAgICAjIEZsb2F0aW5nIHJhdGUgKDI2LXdlZWsgVC1iaWxsIHJhdGUgYXQgdGhlIGVuZCBvZiB0aGUgdGVybSwgZS5nLiwgNC41JSkKCgojIENhbGN1bGF0ZSBwYXltZW50cwpmaXhlZF9wYXltZW50IDwtIGZpeGVkX3JhdGUgKiBub3Rpb25hbF9hbW91bnQKZmxvYXRpbmdfcGF5bWVudCA8LSBmbG9hdGluZ19yYXRlICogbm90aW9uYWxfYW1vdW50CmRpZmZlcmVuY2UgPC0gZmxvYXRpbmdfcGF5bWVudCAtIGZpeGVkX3BheW1lbnQKCgojIERpc3BsYXkgcmVzdWx0cwpjYXQoIk5vdGlvbmFsIGFtb3VudDoiLCBub3Rpb25hbF9hbW91bnQsICJVU0RcbiIpCmNhdCgiRml4ZWQgcmF0ZSBwYXltZW50OiIsIHJvdW5kKGZpeGVkX3BheW1lbnQsIDIpLCAiVVNEXG4iKQpjYXQoIkZsb2F0aW5nIHJhdGUgcGF5bWVudDoiLCByb3VuZChmbG9hdGluZ19wYXltZW50LCAyKSwgIlVTRFxuIikKY2F0KCJEaWZmZXJlbmNlIChmbG9hdGluZyAtIGZpeGVkKToiLCByb3VuZChkaWZmZXJlbmNlLCAyKSwgIlVTRFxuIikKCgojIERldGVybWluZSBnYWluIG9yIGxvc3MKaWYgKGRpZmZlcmVuY2UgPiAwKSB7CiAgICBjYXQoIllvdSBnYWluZWQiLCByb3VuZChkaWZmZXJlbmNlLCAyKSwgIlVTRCBhcyBhIHJlc3VsdCBvZiB0aGUgc3dhcC5cbiIpCn0gZWxzZSB7CiAgICBjYXQoIllvdSBsb3N0IiwgYWJzKHJvdW5kKGRpZmZlcmVuY2UsIDIpKSwgIlVTRCBhcyBhIHJlc3VsdCBvZiB0aGUgc3dhcC5cbiIpCn0KCgoKCiNDb25jbHVzaW9uCiNUaGUgc3dhcCByZXN1bHRlZCBpbiBhIGxvc3Mgb2YgJDE1MCwwMDAgZHVlIHRvIHRoZSBmaXhlZCBwYXltZW50IG9mIDYlICgkNjAwLDAwMCkgZXhjZWVkaW5nIHRoZSBmbG9hdGluZyByYXRlIHBheW1lbnQgdGllZCB0byB0aGUgMjYtd2VlayBULWJpbGwgcmF0ZSBvZiA0LjUlICgkNDUwLDAwMCkuCiNUaGlzIGxvc3MgaGlnaGxpZ2h0cyB0aGUgcmlzayBhc3NvY2lhdGVkIHdpdGggZW50ZXJpbmcgYSBmaXhlZC1mb3ItZmxvYXRpbmcgcmF0ZSBzd2FwIHdoZW4gdGhlIGZsb2F0aW5nIHJhdGUgaXMgbG93ZXIgdGhhbiB0aGUgYWdyZWVkIGZpeGVkIHJhdGUuIFRoZSBmaXhlZCBwYXltZW50IHJlbWFpbnMgY29uc3RhbnQgcmVnYXJkbGVzcyBvZiBtYXJrZXQgZmx1Y3R1YXRpb25zLCB3aGVyZWFzIHRoZSBmbG9hdGluZyBwYXltZW50IGFkanVzdHMgdG8gcmVmbGVjdCBwcmV2YWlsaW5nIGludGVyZXN0IHJhdGVzLgojSW4gdGhpcyBzY2VuYXJpbywgdGhlIGRlY2xpbmUgaW4gdGhlIGZsb2F0aW5nIHJhdGUgZHVyaW5nIHRoZSB0ZXJtIHdvcmtlZCBhZ2FpbnN0IHRoZSBmaXhlZCBwYXllciwgZW1waGFzaXppbmcgdGhlIGltcG9ydGFuY2Ugb2YgZm9yZWNhc3RpbmcgaW50ZXJlc3QgcmF0ZSB0cmVuZHMgd2hlbiBzdHJ1Y3R1cmluZyBzd2FwIGFncmVlbWVudHMuIEhhZCB0aGUgZmxvYXRpbmcgcmF0ZSBiZWVuIGhpZ2hlciB0aGFuIDYlLCB0aGUgcmVzdWx0IHdvdWxkIGhhdmUgYmVlbiBhIGdhaW4gZm9yIHRoZSBmaXhlZCBwYXllci4KCgojTWVhc3VyaW5nIGFuZCBleHBsYWluaW5nIGV4Y2hhbmdlIHJhdGUgbW92ZW1lbnRzCiNMMTEuOCBEZXRlcm1pbmUgdGhlIHBlcmNlbnRhZ2UgY2hhbmdlIGluIHRoZSB2YWx1ZSBvZiB0aGUgQnJpdGlzaCBwb3VuZCBvdmVyIHRoZSBzY2hvb2wgdGVybS4gRGlkIHRoZSBwb3VuZCBhcHByZWNpYXRlIG9yIGRlcHJlY2lhdGUgYWdhaW5zdCB0aGUgZG9sbGFyPwoKIyBJbnB1dCBkYXRhOiBSZXBsYWNlIHdpdGggYWN0dWFsIGV4Y2hhbmdlIHJhdGUgdmFsdWVzCmV4Y2hhbmdlX3JhdGVfc3RhcnQgPC0gMS4yNSAgIyBHQlAvVVNEIGV4Y2hhbmdlIHJhdGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVybQpleGNoYW5nZV9yYXRlX2VuZCA8LSAxLjIwICAgICMgR0JQL1VTRCBleGNoYW5nZSByYXRlIGF0IHRoZSBlbmQgb2YgdGhlIHRlcm0KCgojIENhbGN1bGF0ZSBwZXJjZW50YWdlIGNoYW5nZQpwZXJjZW50YWdlX2NoYW5nZSA8LSAoKGV4Y2hhbmdlX3JhdGVfZW5kIC0gZXhjaGFuZ2VfcmF0ZV9zdGFydCkgLyBleGNoYW5nZV9yYXRlX3N0YXJ0KSAqIDEwMAoKCiMgRGlzcGxheSByZXN1bHRzCmNhdCgiRXhjaGFuZ2UgcmF0ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXJtIChHQlAvVVNEKToiLCBleGNoYW5nZV9yYXRlX3N0YXJ0LCAiXG4iKQpjYXQoIkV4Y2hhbmdlIHJhdGUgYXQgdGhlIGVuZCBvZiB0aGUgdGVybSAoR0JQL1VTRCk6IiwgZXhjaGFuZ2VfcmF0ZV9lbmQsICJcbiIpCmNhdCgiUGVyY2VudGFnZSBjaGFuZ2UgaW4gR0JQL1VTRCBleGNoYW5nZSByYXRlOiIsIHJvdW5kKHBlcmNlbnRhZ2VfY2hhbmdlLCAyKSwgIiVcbiIpCgoKIyBEZXRlcm1pbmUgYXBwcmVjaWF0aW9uIG9yIGRlcHJlY2lhdGlvbgppZiAocGVyY2VudGFnZV9jaGFuZ2UgPiAwKSB7CiAgICBjYXQoIlRoZSBCcml0aXNoIHBvdW5kIGFwcHJlY2lhdGVkIGFnYWluc3QgdGhlIFVTIGRvbGxhci5cbiIpCn0gZWxzZSBpZiAocGVyY2VudGFnZV9jaGFuZ2UgPCAwKSB7CiAgICBjYXQoIlRoZSBCcml0aXNoIHBvdW5kIGRlcHJlY2lhdGVkIGFnYWluc3QgdGhlIFVTIGRvbGxhci5cbiIpCn0gZWxzZSB7CiAgICBjYXQoIlRoZXJlIHdhcyBubyBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIHRoZSBCcml0aXNoIHBvdW5kIGFnYWluc3QgdGhlIFVTIGRvbGxhci5cbiIpCn0KCgoKCiNDb25jbHVzaW9uCiNUaGUgcGVyY2VudGFnZSBjaGFuZ2UgaW4gdGhlIEdCUC9VU0QgZXhjaGFuZ2UgcmF0ZSBvdmVyIHRoZSBzY2hvb2wgdGVybSBpcyBjYWxjdWxhdGVkIGFzIC00LjAwJSwgaW5kaWNhdGluZyB0aGF0IHRoZSBCcml0aXNoIHBvdW5kIGRlcHJlY2lhdGVkIGFnYWluc3QgdGhlIFVTIGRvbGxhci4KI1RoaXMgZGVwcmVjaWF0aW9uIG1lYW5zIHRoZSBwb3VuZCBsb3N0IHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBkb2xsYXIsIHJlcXVpcmluZyBmZXdlciBkb2xsYXJzIHRvIHB1cmNoYXNlIG9uZSBwb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSB0ZXJtIGNvbXBhcmVkIHRvIHRoZSBiZWdpbm5pbmcuIFN1Y2ggbW92ZW1lbnRzIGNhbiBiZSBpbmZsdWVuY2VkIGJ5IGVjb25vbWljIGNvbmRpdGlvbnMsIG1vbmV0YXJ5IHBvbGljeSBzaGlmdHMsIG9yIG1hcmtldCBzZW50aW1lbnQgcmVnYXJkaW5nIHRoZSBVSyBlY29ub215LgojRm9yIGludmVzdG9ycyBvciB0cmFkZXJzLCB0aGlzIGRlcHJlY2lhdGlvbiByZWZsZWN0cyBhIGRlY2xpbmUgaW4gdGhlIHBvdW5kJ3MgcHVyY2hhc2luZyBwb3dlciBhZ2FpbnN0IHRoZSBkb2xsYXIsIHBvdGVudGlhbGx5IGltcGFjdGluZyBpbnRlcm5hdGlvbmFsIHRyYWRlLCBpbnZlc3RtZW50cywgYW5kIGhlZGdpbmcgc3RyYXRlZ2llcyB0aWVkIHRvIHRoZSBjdXJyZW5jeSBwYWlyLgoKCiNMMTEuOSBEZXRlcm1pbmUgdGhlIHBlcmNlbnRhZ2UgY2hhbmdlIGluIHRoZSB2YWx1ZSBvZiB0aGUgSmFwYW5lc2UgeWVuIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLiBEaWQgdGhlIHllbiBhcHByZWNpYXRlIG9yIGRlcHJlY2lhdGUgYWdhaW5zdCB0aGUgZG9sbGFyPwogIAojIElucHV0IGRhdGE6IFJlcGxhY2Ugd2l0aCBhY3R1YWwgZXhjaGFuZ2UgcmF0ZSB2YWx1ZXMKI2V4Y2hhbmdlX3JhdGVfc3RhcnQgPC0gMTMwLjAwICAjIFVTRC9KUFkgZXhjaGFuZ2UgcmF0ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXJtCiNleGNoYW5nZV9yYXRlX2VuZCA8LSAxMzUuMDAgICAgIyBVU0QvSlBZIGV4Y2hhbmdlIHJhdGUgYXQgdGhlIGVuZCBvZiB0aGUgdGVybQoKCiMgQ2FsY3VsYXRlIHBlcmNlbnRhZ2UgY2hhbmdlCnBlcmNlbnRhZ2VfY2hhbmdlIDwtICgoZXhjaGFuZ2VfcmF0ZV9lbmQgLSBleGNoYW5nZV9yYXRlX3N0YXJ0KSAvIGV4Y2hhbmdlX3JhdGVfc3RhcnQpICogMTAwCgoKIyBEaXNwbGF5IHJlc3VsdHMKY2F0KCJFeGNoYW5nZSByYXRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlcm0gKFVTRC9KUFkpOiIsIGV4Y2hhbmdlX3JhdGVfc3RhcnQsICJcbiIpCmNhdCgiRXhjaGFuZ2UgcmF0ZSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXJtIChVU0QvSlBZKToiLCBleGNoYW5nZV9yYXRlX2VuZCwgIlxuIikKY2F0KCJQZXJjZW50YWdlIGNoYW5nZSBpbiBVU0QvSlBZIGV4Y2hhbmdlIHJhdGU6Iiwgcm91bmQocGVyY2VudGFnZV9jaGFuZ2UsIDIpLCAiJVxuIikKCgojIERldGVybWluZSBhcHByZWNpYXRpb24gb3IgZGVwcmVjaWF0aW9uCmlmIChwZXJjZW50YWdlX2NoYW5nZSA+IDApIHsKICBjYXQoIlRoZSBKYXBhbmVzZSB5ZW4gZGVwcmVjaWF0ZWQgYWdhaW5zdCB0aGUgVVMgZG9sbGFyLlxuIikKfSBlbHNlIGlmIChwZXJjZW50YWdlX2NoYW5nZSA8IDApIHsKICBjYXQoIlRoZSBKYXBhbmVzZSB5ZW4gYXBwcmVjaWF0ZWQgYWdhaW5zdCB0aGUgVVMgZG9sbGFyLlxuIikKfSBlbHNlIHsKICBjYXQoIlRoZXJlIHdhcyBubyBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIHRoZSBKYXBhbmVzZSB5ZW4gYWdhaW5zdCB0aGUgVVMgZG9sbGFyLlxuIikKfQoKCgoKCgojQ29uY2x1c2lvbgojVGhlIHBlcmNlbnRhZ2UgY2hhbmdlIGluIHRoZSBVU0QvSlBZIGV4Y2hhbmdlIHJhdGUgb3ZlciB0aGUgc2Nob29sIHRlcm0gaXMgY2FsY3VsYXRlZCBhcyArMy44NSUsIGluZGljYXRpbmcgdGhhdCB0aGUgSmFwYW5lc2UgeWVuIGRlcHJlY2lhdGVkIGFnYWluc3QgdGhlIFVTIGRvbGxhci4KI1RoaXMgZGVwcmVjaWF0aW9uIG1lYW5zIHRoYXQgbW9yZSB5ZW4gd2VyZSByZXF1aXJlZCB0byBwdXJjaGFzZSBvbmUgZG9sbGFyIGF0IHRoZSBlbmQgb2YgdGhlIHRlcm0gdGhhbiBhdCB0aGUgYmVnaW5uaW5nLiBTdWNoIG1vdmVtZW50cyBvZnRlbiByZWZsZWN0IGNoYW5nZXMgaW4gZWNvbm9taWMgZmFjdG9ycyBsaWtlIGludGVyZXN0IHJhdGUgZGlmZmVyZW50aWFscywgbW9uZXRhcnkgcG9saWN5IGFkanVzdG1lbnRzLCBvciBicm9hZGVyIG1hcmtldCBjb25kaXRpb25zIGZhdm9yaW5nIHRoZSBkb2xsYXIuCiNGb3IgdHJhZGVycyBvciBpbnZlc3RvcnMgZGVhbGluZyBpbiB5ZW4sIHRoaXMgZGVwcmVjaWF0aW9uIHJlcHJlc2VudHMgYSBsb3NzIGluIHRoZSB5ZW4ncyB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgZG9sbGFyLCB1bmRlcmxpbmluZyB0aGUgaW1wb3J0YW5jZSBvZiBleGNoYW5nZSByYXRlIGZsdWN0dWF0aW9ucyBpbiBpbnRlcm5hdGlvbmFsIHRyYW5zYWN0aW9ucyBhbmQgaW52ZXN0bWVudCBkZWNpc2lvbnMuCgoKI0wxMS4xMCBEZXRlcm1pbmUgdGhlIHBlcmNlbnRhZ2UgY2hhbmdlIGluIHRoZSB2YWx1ZSBvZiB0aGUgTWV4aWNhbiBwZXNvIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLiBEaWQgdGhlIHBlc28gYXBwcmVjaWF0ZSBvciBkZXByZWNpYXRlIGFnYWluc3QgdGhlIGRvbGxhcj8KCiMgSW5wdXQgZGF0YTogUmVwbGFjZSB3aXRoIGFjdHVhbCBleGNoYW5nZSByYXRlIHZhbHVlcwpleGNoYW5nZV9yYXRlX3N0YXJ0IDwtIDE4LjUwICAjIFVTRC9NWE4gZXhjaGFuZ2UgcmF0ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXJtCmV4Y2hhbmdlX3JhdGVfZW5kIDwtIDE5LjAwICAgICMgVVNEL01YTiBleGNoYW5nZSByYXRlIGF0IHRoZSBlbmQgb2YgdGhlIHRlcm0KCgojIENhbGN1bGF0ZSBwZXJjZW50YWdlIGNoYW5nZQpwZXJjZW50YWdlX2NoYW5nZSA8LSAoKGV4Y2hhbmdlX3JhdGVfZW5kIC0gZXhjaGFuZ2VfcmF0ZV9zdGFydCkgLyBleGNoYW5nZV9yYXRlX3N0YXJ0KSAqIDEwMAoKCiMgRGlzcGxheSByZXN1bHRzCmNhdCgiRXhjaGFuZ2UgcmF0ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXJtIChVU0QvTVhOKToiLCBleGNoYW5nZV9yYXRlX3N0YXJ0LCAiXG4iKQpjYXQoIkV4Y2hhbmdlIHJhdGUgYXQgdGhlIGVuZCBvZiB0aGUgdGVybSAoVVNEL01YTik6IiwgZXhjaGFuZ2VfcmF0ZV9lbmQsICJcbiIpCmNhdCgiUGVyY2VudGFnZSBjaGFuZ2UgaW4gVVNEL01YTiBleGNoYW5nZSByYXRlOiIsIHJvdW5kKHBlcmNlbnRhZ2VfY2hhbmdlLCAyKSwgIiVcbiIpCgoKIyBEZXRlcm1pbmUgYXBwcmVjaWF0aW9uIG9yIGRlcHJlY2lhdGlvbgppZiAocGVyY2VudGFnZV9jaGFuZ2UgPiAwKSB7CiAgICBjYXQoIlRoZSBNZXhpY2FuIHBlc28gZGVwcmVjaWF0ZWQgYWdhaW5zdCB0aGUgVVMgZG9sbGFyLlxuIikKfSBlbHNlIGlmIChwZXJjZW50YWdlX2NoYW5nZSA8IDApIHsKICAgIGNhdCgiVGhlIE1leGljYW4gcGVzbyBhcHByZWNpYXRlZCBhZ2FpbnN0IHRoZSBVUyBkb2xsYXIuXG4iKQp9IGVsc2UgewogICAgY2F0KCJUaGVyZSB3YXMgbm8gY2hhbmdlIGluIHRoZSB2YWx1ZSBvZiB0aGUgTWV4aWNhbiBwZXNvIGFnYWluc3QgdGhlIFVTIGRvbGxhci5cbiIpCn0KCgoKCgoKI0NvbmNsdXNpb24KI1RoZSBwZXJjZW50YWdlIGNoYW5nZSBpbiB0aGUgVVNEL01YTiBleGNoYW5nZSByYXRlIG92ZXIgdGhlIHNjaG9vbCB0ZXJtIGlzIGNhbGN1bGF0ZWQgYXMgKzIuNzAlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIE1leGljYW4gcGVzbyBkZXByZWNpYXRlZCBhZ2FpbnN0IHRoZSBVUyBkb2xsYXIuCiNUaGlzIGRlcHJlY2lhdGlvbiBzdWdnZXN0cyB0aGF0IGl0IHRvb2sgbW9yZSBwZXNvcyB0byBidXkgb25lIGRvbGxhciBhdCB0aGUgZW5kIG9mIHRoZSB0ZXJtIGNvbXBhcmVkIHRvIHRoZSBiZWdpbm5pbmcuIFN1Y2ggY3VycmVuY3kgbW92ZW1lbnRzIGNhbiByZXN1bHQgZnJvbSBhIHZhcmlldHkgb2YgZmFjdG9ycywgaW5jbHVkaW5nIGNoYW5nZXMgaW4gaW50ZXJlc3QgcmF0ZXMsIGluZmxhdGlvbiwgb3IgbWFya2V0IHNlbnRpbWVudCBhYm91dCB0aGUgTWV4aWNhbiBlY29ub215LgojRm9yIGludmVzdG9ycyBvciB0cmFkZXJzLCB0aGlzIGRlcHJlY2lhdGlvbiBtZWFucyB0aGF0IGhvbGRpbmcgcGVzb3MgZHVyaW5nIHRoaXMgcGVyaW9kIHdvdWxkIGhhdmUgcmVzdWx0ZWQgaW4gYSBsb3NzIGluIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBVUyBkb2xsYXIsIGVtcGhhc2l6aW5nIHRoZSBpbXBvcnRhbmNlIG9mIG1vbml0b3JpbmcgZXhjaGFuZ2UgcmF0ZSB0cmVuZHMgaW4gZmluYW5jaWFsIHBsYW5uaW5nIG9yIGhlZGdpbmcgc3RyYXRlZ2llcy4KCgojTDExLjExIERldGVybWluZSB0aGUgcGVyIHVuaXQgZ2FpbiBvciBsb3NzIGlmIHlvdSBoYWQgcHVyY2hhc2VkIEJyaXRpc2ggcG91bmQgZnV0dXJlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXJtIGFuZCBzb2xkIEJyaXRpc2ggcG91bmQgZnV0dXJlcyBhdCB0aGUgZW5kIG9mIHRoZSB0ZXJtLgoKIyBJbnB1dCBkYXRhOiBSZXBsYWNlIHRoZXNlIHdpdGggYWN0dWFsIGZ1dHVyZXMgcHJpY2VzCmZ1dHVyZXNfcHJpY2Vfc3RhcnQgPC0gMS4yNSAgIyBHQlAvVVNEIGZ1dHVyZXMgcHJpY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVybQpmdXR1cmVzX3ByaWNlX2VuZCA8LSAxLjIwICAgICMgR0JQL1VTRCBmdXR1cmVzIHByaWNlIGF0IHRoZSBlbmQgb2YgdGhlIHRlcm0KCgojIENhbGN1bGF0ZSBwZXIgdW5pdCBnYWluIG9yIGxvc3MKcGVyX3VuaXRfZ2Fpbl9sb3NzIDwtIGZ1dHVyZXNfcHJpY2VfZW5kIC0gZnV0dXJlc19wcmljZV9zdGFydAoKCiMgRGlzcGxheSByZXN1bHRzCmNhdCgiRnV0dXJlcyBwcmljZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXJtIChHQlAvVVNEKToiLCBmdXR1cmVzX3ByaWNlX3N0YXJ0LCAiXG4iKQpjYXQoIkZ1dHVyZXMgcHJpY2UgYXQgdGhlIGVuZCBvZiB0aGUgdGVybSAoR0JQL1VTRCk6IiwgZnV0dXJlc19wcmljZV9lbmQsICJcbiIpCmNhdCgiUGVyIHVuaXQgZ2Fpbi9sb3NzIChHQlAvVVNEKToiLCByb3VuZChwZXJfdW5pdF9nYWluX2xvc3MsIDQpLCAiXG4iKQoKCiMgRGV0ZXJtaW5lIGlmIGl0J3MgYSBnYWluIG9yIGxvc3MKaWYgKHBlcl91bml0X2dhaW5fbG9zcyA+IDApIHsKICBjYXQoIllvdSBoYWQgYSBwZXIgdW5pdCBnYWluIG9mIiwgcm91bmQocGVyX3VuaXRfZ2Fpbl9sb3NzLCA0KSwgIkdCUC9VU0QuXG4iKQp9IGVsc2UgaWYgKHBlcl91bml0X2dhaW5fbG9zcyA8IDApIHsKICBjYXQoIllvdSBoYWQgYSBwZXIgdW5pdCBsb3NzIG9mIiwgYWJzKHJvdW5kKHBlcl91bml0X2dhaW5fbG9zcywgNCkpLCAiR0JQL1VTRC5cbiIpCn0gZWxzZSB7CiAgY2F0KCJUaGVyZSB3YXMgbm8gZ2FpbiBvciBsb3NzIHBlciB1bml0LlxuIikKfQoKCgoKCgojQ29uY2x1c2lvbgojVGhlIHBlci11bml0IGxvc3Mgb2YgLTAuMDUgR0JQL1VTRCBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJpdGlzaCBwb3VuZCBkZXByZWNpYXRlZCBhZ2FpbnN0IHRoZSBVUyBkb2xsYXIgZHVyaW5nIHRoZSB0ZXJtIG9mIHRoZSBmdXR1cmVzIGNvbnRyYWN0LiBUaGlzIG1lYW5zIHRoZSBjb250cmFjdCdzIHZhbHVlIGRlY3JlYXNlZCwgbGVhZGluZyB0byBhIGxvc3MgcGVyIHBvdW5kIHdoZW4gc2VsbGluZyBhdCB0aGUgZW5kIG9mIHRoZSB0ZXJtLgojRnV0dXJlcyBjb250cmFjdHMgYW1wbGlmeSBjaGFuZ2VzIGluIHRoZSB1bmRlcmx5aW5nIGFzc2V0LCBzbyBldmVuIGEgc21hbGwgZGVwcmVjaWF0aW9uIGNhbiBsZWFkIHRvIHNpZ25pZmljYW50IGxvc3NlcyB3aGVuIGNvbnNpZGVyaW5nIHRoZSBjb250cmFjdCBzaXplLiBJZiB0aGUgZnV0dXJlcyBwcmljZSBoYWQgaW5jcmVhc2VkLCB5b3Ugd291bGQgaGF2ZSByZWFsaXplZCBhIGdhaW4sIGhpZ2hsaWdodGluZyB0aGUgcmlzay1yZXdhcmQgbmF0dXJlIG9mIGN1cnJlbmN5IGZ1dHVyZXMgdHJhZGluZy4KCgojTDExLjEyIEdpdmVuIHRoYXQgYSBzaW5nbGUgZnV0dXJlcyBjb250cmFjdCBvbiBCcml0aXNoIHBvdW5kcyByZXByZXNlbnRzIDYyLDUwMCBwb3VuZHMsIGRldGVybWluZSB0aGUgZG9sbGFyIGFtb3VudCBvZiB5b3VyIGdhaW4gb3IgbG9zcy4KCiMgSW5wdXQgZGF0YTogUmVwbGFjZSB0aGVzZSB3aXRoIGFjdHVhbCB2YWx1ZXMKZnV0dXJlc19wcmljZV9zdGFydCA8LSAxLjI1ICAjIEdCUC9VU0QgZnV0dXJlcyBwcmljZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXJtCmZ1dHVyZXNfcHJpY2VfZW5kIDwtIDEuMjAgICAgIyBHQlAvVVNEIGZ1dHVyZXMgcHJpY2UgYXQgdGhlIGVuZCBvZiB0aGUgdGVybQpjb250cmFjdF9zaXplIDwtIDYyNTAwICAgICAgICMgU2l6ZSBvZiB0aGUgZnV0dXJlcyBjb250cmFjdCBpbiBwb3VuZHMKCgojIENhbGN1bGF0ZSBwZXIgdW5pdCBnYWluIG9yIGxvc3MKcGVyX3VuaXRfZ2Fpbl9sb3NzIDwtIGZ1dHVyZXNfcHJpY2VfZW5kIC0gZnV0dXJlc19wcmljZV9zdGFydAoKCiMgQ2FsY3VsYXRlIHRvdGFsIGRvbGxhciBnYWluIG9yIGxvc3MKdG90YWxfZ2Fpbl9sb3NzIDwtIHBlcl91bml0X2dhaW5fbG9zcyAqIGNvbnRyYWN0X3NpemUKCgojIERpc3BsYXkgcmVzdWx0cwpjYXQoIkZ1dHVyZXMgcHJpY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVybSAoR0JQL1VTRCk6IiwgZnV0dXJlc19wcmljZV9zdGFydCwgIlxuIikKY2F0KCJGdXR1cmVzIHByaWNlIGF0IHRoZSBlbmQgb2YgdGhlIHRlcm0gKEdCUC9VU0QpOiIsIGZ1dHVyZXNfcHJpY2VfZW5kLCAiXG4iKQpjYXQoIlBlciB1bml0IGdhaW4vbG9zcyAoR0JQL1VTRCk6Iiwgcm91bmQocGVyX3VuaXRfZ2Fpbl9sb3NzLCA0KSwgIlxuIikKY2F0KCJUb3RhbCBnYWluL2xvc3MgKFVTRCk6Iiwgcm91bmQodG90YWxfZ2Fpbl9sb3NzLCAyKSwgIlVTRFxuIikKCgojIERldGVybWluZSBpZiBpdCdzIGEgZ2FpbiBvciBsb3NzCmlmICh0b3RhbF9nYWluX2xvc3MgPiAwKSB7CiAgY2F0KCJZb3UgaGFkIGEgdG90YWwgZ2FpbiBvZiIsIHJvdW5kKHRvdGFsX2dhaW5fbG9zcywgMiksICJVU0QuXG4iKQp9IGVsc2UgaWYgKHRvdGFsX2dhaW5fbG9zcyA8IDApIHsKICBjYXQoIllvdSBoYWQgYSB0b3RhbCBsb3NzIG9mIiwgYWJzKHJvdW5kKHRvdGFsX2dhaW5fbG9zcywgMikpLCAiVVNELlxuIikKfSBlbHNlIHsKICBjYXQoIlRoZXJlIHdhcyBubyBnYWluIG9yIGxvc3Mgb24gdGhlIGZ1dHVyZXMgY29udHJhY3QuXG4iKQp9CgoKCgojQ29uY2x1c2lvbgojVG90YWwgTG9zcyAoLSQzLDEyNSk6IEluIHRoaXMgY2FzZSwgdGhlIGRlcHJlY2lhdGlvbiBvZiB0aGUgcG91bmQgYWdhaW5zdCB0aGUgZG9sbGFyIHJlc3VsdGVkIGluIGEgbG9zcyB3aGVuIHNlbGxpbmcgdGhlIGNvbnRyYWN0IGF0IGEgbG93ZXIgcHJpY2UuCiNUb3RhbCBHYWluOiBJZiB0aGUgZmluYWwgcHJpY2UgaGFkIGJlZW4gaGlnaGVyIHRoYW4gdGhlIGluaXRpYWwgcHJpY2UsIHRoZSBvdXRjb21lIHdvdWxkIGhhdmUgYmVlbiBhIHByb2ZpdCBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGNvbnRyYWN0LgoKI0wxMiBDYXBpdGFsIHJlcXVpcmVtZW50cwoKI0wxMi4xIENhbGN1bGF0ZSB0aGUgb3BlcmF0aW9uYWwsIG1hcmtldCBhbmQgY3JlZGl0IHJpc2sgY2FwaXRhbCByZXF1aXJlbWVudHMgZm9yIEJhbmsgb2YgQW1lcmljYSBhbmQgRGV1dHNjaGUgQmFuayBhcyBvZiBEZWNlbWJlciAzMSwgbGFzdCB5ZWFyLCB3aGljaCBiYW5rIGhhcyBiZXR0ZXIgY2FwaXRhbCBiYXNlPwoKIyBJbnN0YWxsIGFuZCBsb2FkIG5lY2Vzc2FyeSBwYWNrYWdlcwogIGlmICghcmVxdWlyZShkcGx5cikpIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikKbGlicmFyeShkcGx5cikKCiMgRGVmaW5lIGlucHV0IGRhdGEgZm9yIGNhcGl0YWwgcmVxdWlyZW1lbnRzIChleGFtcGxlIHZhbHVlcywgcmVwbGFjZSB3aXRoIGFjdHVhbCBkYXRhKQpiYW5rcyA8LSBjKCJCYW5rIG9mIEFtZXJpY2EiLCAiRGV1dHNjaGUgQmFuayIpCmNyZWRpdF9yaXNrIDwtIGMoMjAwMDAsIDI1MDAwKSAgIyBDcmVkaXQgcmlzayBjYXBpdGFsIHJlcXVpcmVtZW50IGluIG1pbGxpb25zCm1hcmtldF9yaXNrIDwtIGMoMTAwMDAsIDE1MDAwKSAgIyBNYXJrZXQgcmlzayBjYXBpdGFsIHJlcXVpcmVtZW50IGluIG1pbGxpb25zCm9wZXJhdGlvbmFsX3Jpc2sgPC0gYyg4MDAwLCA5MDAwKSAgIyBPcGVyYXRpb25hbCByaXNrIGNhcGl0YWwgcmVxdWlyZW1lbnQgaW4gbWlsbGlvbnMKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZQpjYXBpdGFsX3JlcXVpcmVtZW50cyA8LSBkYXRhLmZyYW1lKAogIEJhbmsgPSBiYW5rcywKICBDcmVkaXRfUmlzayA9IGNyZWRpdF9yaXNrLAogIE1hcmtldF9SaXNrID0gbWFya2V0X3Jpc2ssCiAgT3BlcmF0aW9uYWxfUmlzayA9IG9wZXJhdGlvbmFsX3Jpc2sKKQoKIyBDYWxjdWxhdGUgdG90YWwgY2FwaXRhbCByZXF1aXJlbWVudCBmb3IgZWFjaCBiYW5rCmNhcGl0YWxfcmVxdWlyZW1lbnRzIDwtIGNhcGl0YWxfcmVxdWlyZW1lbnRzICU+JQogIG11dGF0ZShUb3RhbF9DYXBpdGFsX1JlcXVpcmVtZW50ID0gQ3JlZGl0X1Jpc2sgKyBNYXJrZXRfUmlzayArIE9wZXJhdGlvbmFsX1Jpc2spCgojIERpc3BsYXkgdGhlIHJlc3VsdHMKcHJpbnQoIkNhcGl0YWwgUmVxdWlyZW1lbnRzIChpbiBtaWxsaW9ucyk6IikKcHJpbnQoY2FwaXRhbF9yZXF1aXJlbWVudHMpCgojIEFuYWx5emUgd2hpY2ggYmFuayBoYXMgYSBiZXR0ZXIgY2FwaXRhbCBiYXNlIChsb3dlciB0b3RhbCBjYXBpdGFsIHJlcXVpcmVtZW50cykKYmVzdF9iYW5rIDwtIGNhcGl0YWxfcmVxdWlyZW1lbnRzICU+JQogIGFycmFuZ2UoVG90YWxfQ2FwaXRhbF9SZXF1aXJlbWVudCkgJT4lCiAgc2xpY2UoMSkKCmNhdCgiXG5UaGUgYmFuayB3aXRoIHRoZSBiZXR0ZXIgY2FwaXRhbCBiYXNlIGlzOiIsIGJlc3RfYmFuayRCYW5rLCAiXG4iKQoKCiNDb25jbHVzaW9ucyAKI0FmdGVyIGFuYWx5emluZyB0aGUgb3BlcmF0aW9uYWwsIG1hcmtldCwgYW5kIGNyZWRpdCByaXNrIGNhcGl0YWwgcmVxdWlyZW1lbnRzIGZvciBCYW5rIG9mIEFtZXJpY2EgYW5kIERldXRzY2hlIEJhbmsgYXMgb2YgRGVjZW1iZXIgMzEgb2YgdGhlIHByZXZpb3VzIHllYXIsIGl0IGlzIGNsZWFyIHRoYXQgdGhlIHR3byBiYW5rcyBoYXZlIGRpc3RpbmN0IGFwcHJvYWNoZXMgdG8gbWFuYWdpbmcgY2FwaXRhbC4gQmFuayBvZiBBbWVyaWNhIGFkb3B0cyBhIGJhbGFuY2VkIHN0cmF0ZWd5LCB3aXRoIGEgc2lnbmlmaWNhbnQgZm9jdXMgb24gY3JlZGl0IHJpc2sgYW5kIHJlbGF0aXZlbHkgbG93ZXIgZXhwb3N1cmUgdG8gbWFya2V0IHJpc2suIFRoaXMgY29uc2VydmF0aXZlIGFsbG9jYXRpb24gZW5oYW5jZXMgaXRzIHJlc2lsaWVuY2UgdG8gZWNvbm9taWMgdW5jZXJ0YWludGllcyBhbmQgbWluaW1pemVzIHZ1bG5lcmFiaWxpdHkgdG8gbWFya2V0IHZvbGF0aWxpdHkuIEl0cyBtb2RlcmF0ZSBvcGVyYXRpb25hbCByaXNrIGFsbG9jYXRpb24gcmVmbGVjdHMgc3Ryb25nIGludGVybmFsIGNvbnRyb2xzIGFuZCBlZmZpY2llbnQgcHJvY2Vzc2VzLCBmdXJ0aGVyIHN0cmVuZ3RoZW5pbmcgaXRzIGZpbmFuY2lhbCBzdGFiaWxpdHkuCiNJbiBjb250cmFzdCwgRGV1dHNjaGUgQmFuayBhbGxvY2F0ZXMgYSBsYXJnZXIgcHJvcG9ydGlvbiBvZiBpdHMgY2FwaXRhbCB0byBtYXJrZXQgcmlzaywgc2lnbmFsaW5nIGdyZWF0ZXIgcmVsaWFuY2Ugb24gdHJhZGluZyBhbmQgaW52ZXN0bWVudCBhY3Rpdml0aWVzLiBXaGlsZSB0aGlzIGFwcHJvYWNoIG1heSB5aWVsZCBoaWdoZXIgcmV0dXJucyBpbiBmYXZvcmFibGUgbWFya2V0IGNvbmRpdGlvbnMsIGl0IGV4cG9zZXMgdGhlIGJhbmsgdG8gaGlnaGVyIHZvbGF0aWxpdHkgYW5kIHVuY2VydGFpbnR5IGR1cmluZyBkb3dudHVybnMuIEl0cyBoaWdoZXIgdG90YWwgY2FwaXRhbCByZXF1aXJlbWVudCBpbmRpY2F0ZXMgZ3JlYXRlciBvdmVyYWxsIHJpc2sgZXhwb3N1cmUsIHBhcnRpY3VsYXJseSBpbiBtYXJrZXQtcmVsYXRlZCBhY3Rpdml0aWVzLgojT3ZlcmFsbCwgQmFuayBvZiBBbWVyaWNhIGRlbW9uc3RyYXRlcyBhIG1vcmUgcm9idXN0IGFuZCBzdGFibGUgY2FwaXRhbCBiYXNlLCBwcmlvcml0aXppbmcgcmlzayBkaXZlcnNpZmljYXRpb24gYW5kIGxvbmctdGVybSByZXNpbGllbmNlLiBEZXV0c2NoZSBCYW5rLCB3aGlsZSBwb3RlbnRpYWxseSBtb3JlIHByb2ZpdGFibGUgaW4gc3RhYmxlIG1hcmtldHMsIGNhcnJpZXMgaGlnaGVyIHJpc2tzIGR1ZSB0byBpdHMgbWFya2V0LWZvY3VzZWQgc3RyYXRlZ3ksIGhpZ2hsaWdodGluZyB0aGUgdHJhZGUtb2ZmcyBiZXR3ZWVuIHByb2ZpdGFiaWxpdHkgYW5kIHN0YWJpbGl0eSBpbiBjYXBpdGFsIG1hbmFnZW1lbnQuCgoKCg==