import price data
spotPrice <- read.csv("D:/OilMarketAnalysis/spotPrice.csv")
cannot open file 'D:/OilMarketAnalysis/spotPrice.csv': No such file or directoryError in file(file, "rt") : cannot open the connection
put price data into a dataframe and change the date to the date data format
#simplify date column
priceData <- edit(priceData)
class discarded from column 㤼㸱as.Date.spotPrice.Day....m..d..Y..㤼㸲
plot price data

import production data
oilProduction <- read.csv("~/oilProduction.csv")
convert date to proper data type and save in a dataframe and clean data
#I need to make the date variable column name simpler for later use
productionData <- edit(productionData)
class discarded from column 㤼㸱as.Date.oilProduction.Date....m..d..Y...1.467.㤼㸲
plot production data

this data looks weird. i want to check for weird values
any(is.na(productionData$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.) | is.infinite(productionData$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.))
[1] FALSE
there appears to be no missing or infinite values
I want to match prices with output
head(priceData)
head(productionData)
#i will join my data frames on the date column
library(dplyr)
oilDataBase <- inner_join(productionData, priceData)
Joining, by = "Date"
#just price and quantity
marketOverview <- oilDataBase[order(oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.),]
View(marketOverview)
plot(marketOverview$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.[1:284], marketOverview$spotPrice.Cushing.OK.WTI.Spot.Price.FOB..Dollars.per.Barrel[1:284], type = "l", xlab = "Production (Thousands of barrels)", ylab = "Price (Dollars)", main = "Quantity Supplied and Price of Oil in Oklahoma", col = "blue")

View(oilDataBase)
model <- lm(formula = oilDataBase$spotPrice.Cushing.OK.WTI.Spot.Price.FOB..Dollars.per.Barrel ~ oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.)
plot(oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467., oilDataBase$spotPrice.Cushing.OK.WTI.Spot.Price.FOB..Dollars.per.Barrel)

model
Call:
lm(formula = oilDataBase$spotPrice.Cushing.OK.WTI.Spot.Price.FOB..Dollars.per.Barrel ~
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.)
Coefficients:
(Intercept)
4.085e+01
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.
3.644e-04
plot(model)




bfl <- (3.644e-04 * oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.) + 4.085e+01
demand <- (((1/3.644e-04) * oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.) + 4.085e+01)
plot(oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467., bfl, type = "l", xlab = "Production (Thousands of barrels)", main = "Linear Model of Oil Supply in Oklahoma", ylab = "Price (Dollars)", col = "red")

It appears that higher prices generally lead to a higher production of oil, but recent technological changes make it hard to determine a more realistic supply curve. Production is going up and prices are falling. Currently the market appears oversupplied.
summary(model)
Call:
lm(formula = oilDataBase$spotPrice.Cushing.OK.WTI.Spot.Price.FOB..Dollars.per.Barrel ~
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.)
Residuals:
Min 1Q Median 3Q Max
-33.51 -24.05 -12.20 17.41 95.75
Coefficients:
Estimate
(Intercept) 4.085e+01
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467. 3.644e-04
Std. Error
(Intercept) 4.661e+00
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467. 5.015e-04
t value
(Intercept) 8.765
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467. 0.726
Pr(>|t|)
(Intercept) <2e-16
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467. 0.468
(Intercept) ***
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 29.01 on 282 degrees of freedom
Multiple R-squared: 0.001868, Adjusted R-squared: -0.001671
F-statistic: 0.5278 on 1 and 282 DF, p-value: 0.4681
the model does not appear significant at a 5% significance level.
I want to isolate more recent market data from 2015 - 2020…

summary(recentModel)
Call:
lm(formula = orderedRecentData$Production ~ orderedRecentData$Price)
Residuals:
Min 1Q Median 3Q Max
-3218 -1161 -286 1122 3383
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7320.02 1479.08 4.949 1.47e-05 ***
orderedRecentData$Price 145.06 27.66 5.244 5.78e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1603 on 39 degrees of freedom
Multiple R-squared: 0.4135, Adjusted R-squared: 0.3985
F-statistic: 27.5 on 1 and 39 DF, p-value: 5.783e-06
I want to deseasonalize the data…

now aggrigate, order, and plot the deseasonalized data
deseasonalizedData <- data.frame(deseasonalizedPrice$dspar, deseasonalizedProduction$z)
row names were found from a short variable and have been discarded
now i want to make a cleaner plot of the deseasonalized relationship


okay, that should do it for supply. now i want to do the same for demand… import the data
USCrudeSupplied <- read.csv("~/USCrudeSupplied.csv")
get the data types set up

I cant find oklahoma specific data so I’m going to marginally use this data. moving on…
I want to compare price and quantity from before horizontal drilling and after. Supposedly technical change should shift the supply line to the right. is this correct?
grab the data
oldData <- oilDataBase[35:85]
Error in `[.data.frame`(oilDataBase, 35:85) : undefined columns selected
plot the data

now order the data for price and quantity
plot and compare price and quantity

try to put both lines on one graph…

i need to show change in demand get the data
now plot the data

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KaW1wb3J0IHByaWNlIGRhdGENCmBgYHtyfQ0Kc3BvdFByaWNlIDwtIHJlYWQuY3N2KCJEOi9PaWxNYXJrZXRBbmFseXNpcy9zcG90UHJpY2UuY3N2IikNCmBgYA0KDQpwdXQgcHJpY2UgZGF0YSBpbnRvIGEgZGF0YWZyYW1lIGFuZCBjaGFuZ2UgdGhlIGRhdGUgdG8gdGhlIGRhdGUgZGF0YSBmb3JtYXQNCmBgYHtyfQ0KcHJpY2VEYXRhIDwtIGRhdGEuZnJhbWUoYXMuRGF0ZShzcG90UHJpY2UkRGF5LCAiJW0vJWQvJVkiKSwgc3BvdFByaWNlJEN1c2hpbmcuT0suV1RJLlNwb3QuUHJpY2UuRk9CLi5Eb2xsYXJzLnBlci5CYXJyZWwpDQoNCiNzaW1wbGlmeSBkYXRlIGNvbHVtbiANCnByaWNlRGF0YSA8LSBlZGl0KHByaWNlRGF0YSkNCnByaWNlRGF0YSREYXRlIDwtIGFzLkRhdGUocHJpY2VEYXRhJERhdGUpDQpgYGANCg0KcGxvdCBwcmljZSBkYXRhDQpgYGB7cn0NCnBsb3QocHJpY2VEYXRhJERhdGUsIHByaWNlRGF0YSRzcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbCwgeGxhYiA9ICJEYXRlIiwgeWxhYiA9ICJXVEkgU3BvdCBQcmljZSIsIG1haW4gPSAiQ3VzaGluZyBPa2xhaG9tYSBXVEkgU3BvdCBQcmljZSIsIHR5cGUgPSAiaCIsIGNvbCA9ICJibHVlIikNCmBgYA0KDQppbXBvcnQgcHJvZHVjdGlvbiBkYXRhDQpgYGB7cn0NCm9pbFByb2R1Y3Rpb24gPC0gcmVhZC5jc3YoIn4vb2lsUHJvZHVjdGlvbi5jc3YiKQ0KYGBgDQoNCmNvbnZlcnQgZGF0ZSB0byBwcm9wZXIgZGF0YSB0eXBlIGFuZCBzYXZlIGluIGEgZGF0YWZyYW1lIGFuZCBjbGVhbiBkYXRhDQpgYGB7cn0NCiNjaGFuZ2UgdGhlIGRhdGUgZmllbGQgbmFtZSB0byBEYXRlIHNvIHRoZSBjb21wdXRlciBjYW4gcmVhZCBpdC4uLg0Kb2lsUHJvZHVjdGlvbiA8LSBlZGl0KG9pbFByb2R1Y3Rpb24pDQoNCiNwdXQgcHJvZHVjdGlvbiBkYXRhIGludG8gYSBkYXRhZnJhbWUNCnByb2R1Y3Rpb25EYXRhIDwtIGRhdGEuZnJhbWUoYXMuRGF0ZShvaWxQcm9kdWN0aW9uJERhdGUsICIlbS8lZC8lWSIpWzE6NDY3XSwgb2lsUHJvZHVjdGlvbiRPa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy5bMTo0NjddKQ0KDQojSSBuZWVkIHRvIG1ha2UgdGhlIGRhdGUgdmFyaWFibGUgY29sdW1uIG5hbWUgc2ltcGxlciBmb3IgbGF0ZXIgdXNlDQpwcm9kdWN0aW9uRGF0YSA8LSBlZGl0KHByb2R1Y3Rpb25EYXRhKQ0KcHJvZHVjdGlvbkRhdGEkRGF0ZSA8LSBhcy5EYXRlKHByb2R1Y3Rpb25EYXRhJERhdGUpDQpgYGANCg0KcGxvdCBwcm9kdWN0aW9uIGRhdGENCmBgYHtyfQ0KcGxvdChwcm9kdWN0aW9uRGF0YSREYXRlLCBwcm9kdWN0aW9uRGF0YSRvaWxQcm9kdWN0aW9uLk9rbGFob21hLkZpZWxkLlByb2R1Y3Rpb24ub2YuQ3J1ZGUuT2lsLi5UaG91c2FuZC5CYXJyZWxzLi4xLjQ2Ny4sIHhsYWIgPSAiRGF0ZSIsIHlsYWIgPSAiQmFycmVscyBvZiBPaWwgKFRob3VzYW5kcykiLCBtYWluID0gIk9rbGFob21hIENydWRlIE9pbCBQcm9kdWN0aW9uIiwgdHlwZSA9ICJoIiwgY29sID0gInJlZCIpDQpgYGANCg0KdGhpcyBkYXRhIGxvb2tzIHdlaXJkLiBpIHdhbnQgdG8gY2hlY2sgZm9yIHdlaXJkIHZhbHVlcw0KYGBge3J9DQphbnkoaXMubmEocHJvZHVjdGlvbkRhdGEkb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuKSB8IGlzLmluZmluaXRlKHByb2R1Y3Rpb25EYXRhJG9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3LikpDQpgYGANCg0KdGhlcmUgYXBwZWFycyB0byBiZSBubyBtaXNzaW5nIG9yIGluZmluaXRlIHZhbHVlcw0KDQoNCkkgd2FudCB0byBtYXRjaCBwcmljZXMgd2l0aCBvdXRwdXQNCmBgYHtyfQ0KaGVhZChwcmljZURhdGEpDQpoZWFkKHByb2R1Y3Rpb25EYXRhKQ0KDQojaSB3aWxsIGpvaW4gbXkgZGF0YSBmcmFtZXMgb24gdGhlIGRhdGUgY29sdW1uDQpsaWJyYXJ5KGRwbHlyKQ0KDQoNCm9pbERhdGFCYXNlIDwtIGlubmVyX2pvaW4ocHJvZHVjdGlvbkRhdGEsIHByaWNlRGF0YSkNCg0KDQoNCiNqdXN0IHByaWNlIGFuZCBxdWFudGl0eQ0KbWFya2V0T3ZlcnZpZXcgPC0gb2lsRGF0YUJhc2Vbb3JkZXIob2lsRGF0YUJhc2Ukb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuKSxdDQoNClZpZXcobWFya2V0T3ZlcnZpZXcpDQpwbG90KG1hcmtldE92ZXJ2aWV3JG9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3LlsxOjI4NF0sIG1hcmtldE92ZXJ2aWV3JHNwb3RQcmljZS5DdXNoaW5nLk9LLldUSS5TcG90LlByaWNlLkZPQi4uRG9sbGFycy5wZXIuQmFycmVsWzE6Mjg0XSwgdHlwZSA9ICJsIiwgeGxhYiA9ICJQcm9kdWN0aW9uIChUaG91c2FuZHMgb2YgYmFycmVscykiLCB5bGFiID0gIlByaWNlIChEb2xsYXJzKSIsIG1haW4gPSAiUXVhbnRpdHkgU3VwcGxpZWQgYW5kIFByaWNlIG9mIE9pbCBpbiBPa2xhaG9tYSIsIGNvbCA9ICJibHVlIikNCg0KDQpWaWV3KG9pbERhdGFCYXNlKQ0KDQptb2RlbCA8LSBsbShmb3JtdWxhID0gb2lsRGF0YUJhc2Ukc3BvdFByaWNlLkN1c2hpbmcuT0suV1RJLlNwb3QuUHJpY2UuRk9CLi5Eb2xsYXJzLnBlci5CYXJyZWwgfiBvaWxEYXRhQmFzZSRvaWxQcm9kdWN0aW9uLk9rbGFob21hLkZpZWxkLlByb2R1Y3Rpb24ub2YuQ3J1ZGUuT2lsLi5UaG91c2FuZC5CYXJyZWxzLi4xLjQ2Ny4pDQoNCnBsb3Qob2lsRGF0YUJhc2Ukb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuLCBvaWxEYXRhQmFzZSRzcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbCkNCg0KbW9kZWwNCnBsb3QobW9kZWwpDQoNCmJmbCA8LSAoMy42NDRlLTA0ICogb2lsRGF0YUJhc2Ukb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuKSArIDQuMDg1ZSswMQ0KDQpkZW1hbmQgPC0gKCgoMS8zLjY0NGUtMDQpICogb2lsRGF0YUJhc2Ukb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuKSArIDQuMDg1ZSswMSkNCg0KDQpwbG90KG9pbERhdGFCYXNlJG9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3LiwgYmZsLCB0eXBlID0gImwiLCB4bGFiID0gIlByb2R1Y3Rpb24gKFRob3VzYW5kcyBvZiBiYXJyZWxzKSIsIG1haW4gPSAiTGluZWFyIE1vZGVsIG9mIE9pbCBTdXBwbHkgaW4gT2tsYWhvbWEiLCB5bGFiID0gIlByaWNlIChEb2xsYXJzKSIsIGNvbCA9ICJyZWQiKSANCmBgYA0KDQpJdCBhcHBlYXJzIHRoYXQgaGlnaGVyIHByaWNlcyBnZW5lcmFsbHkgbGVhZCB0byBhIGhpZ2hlciBwcm9kdWN0aW9uIG9mIG9pbCwgYnV0IHJlY2VudCB0ZWNobm9sb2dpY2FsIGNoYW5nZXMgbWFrZSBpdCBoYXJkIHRvIGRldGVybWluZSBhIG1vcmUgcmVhbGlzdGljIHN1cHBseSBjdXJ2ZS4gUHJvZHVjdGlvbiBpcyBnb2luZyB1cCBhbmQgcHJpY2VzIGFyZSBmYWxsaW5nLiBDdXJyZW50bHkgdGhlIG1hcmtldCBhcHBlYXJzIG92ZXJzdXBwbGllZC4NCg0KYGBge3J9DQpzdW1tYXJ5KG1vZGVsKQ0KYGBgDQp0aGUgbW9kZWwgZG9lcyBub3QgYXBwZWFyIHNpZ25pZmljYW50IGF0IGEgNSUgc2lnbmlmaWNhbmNlIGxldmVsLg0KDQoNCg0KSSB3YW50IHRvIGlzb2xhdGUgbW9yZSByZWNlbnQgbWFya2V0IGRhdGEgZnJvbSAyMDE1IC0gMjAyMC4uLg0KYGBge3J9DQpyZWNlbnREYXRhIDwtIGRhdGEuZnJhbWUob2lsRGF0YUJhc2UkRGF0ZVsyNDQ6Mjg0XSwgb2lsRGF0YUJhc2Ukb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuWzI0NDoyODRdLCBvaWxEYXRhQmFzZSRzcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbFsyNDQ6Mjg0XSkNCg0KcmVjZW50RGF0YSA8LSBlZGl0KHJlY2VudERhdGEpDQoNCm9yZGVyZWRSZWNlbnREYXRhIDwtIHJlY2VudERhdGFbb3JkZXIocmVjZW50RGF0YSRQcm9kdWN0aW9uKSwgXQ0KDQpwbG90KG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24sIG9yZGVyZWRSZWNlbnREYXRhJFByaWNlLCB0eXBlID0gImwiLCB4bGFiID0gIlByb2R1Y3Rpb24iLCB5bGFiID0gIlByaWNlIiwgbWFpbiA9ICJPa2xhaG9tYSBPaWwgTWFya2V0IDIwMTUtMjAxOSIpDQoNCnJlY2VudE1vZGVsIDwtIGxtKG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24gfiBvcmRlcmVkUmVjZW50RGF0YSRQcmljZSkNCg0Kc3VtbWFyeShyZWNlbnRNb2RlbCkNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3RoZW1lcykNCg0KZ2dwbG90KG9yZGVyZWRSZWNlbnREYXRhLCBhZXMoeCA9IG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24sIHkgPSBvcmRlcmVkUmVjZW50RGF0YSRQcmljZSkpKw0KICBnZW9tX3BvaW50KCkrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikrDQogIGdlb21fc3RlcChkaXJlY3Rpb24gPSAiaHYiLCBjb2wgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIk1vZGVsIG9mIE9rbGFob21hIE9pbCBQcm9kdWN0aW9uIFxuMjAxNS8wMS8xNSAtIDIwMTkvMTEvMTUiLCB4ID0gIlByb2R1Y3Rpb24gKFRob3VzYW5kcyBvZiBCYXJyZWxzKSIgLCB5ID0gIlByaWNlIChEb2xsYXJzKSIpICsgDQogIHRoZW1lX2Vjb25vbWlzdF93aGl0ZSgpIA0KICANCg0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShyZWNlbnRNb2RlbCkNCmBgYA0KDQpJIHdhbnQgdG8gZGVzZWFzb25hbGl6ZSB0aGUgZGF0YS4uLg0KYGBge3J9DQpsaWJyYXJ5KGRlc2Vhc29uYWxpemUpDQojbWFrZSB0aGUgcmVjZW50RGF0YSBpbnRvIGEgdGltZSBzZXJpZXMNCnRzcmVjZW50RGF0YVByb2R1Y3Rpb24gPC0gdHMoZGF0YSA9IHJlY2VudERhdGEkUHJvZHVjdGlvbiwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDE1LCAxKSkNCnRzcmVjZW50RGF0YVByb2R1Y3Rpb24NCnBsb3QodHNyZWNlbnREYXRhUHJvZHVjdGlvbikNCg0KdHNyZWNlbnREYXRhUHJpY2UgPC0gdHMoZGF0YSA9IHJlY2VudERhdGEkUHJpY2UsIGZyZXF1ZW5jeSA9IDEyLCBzdGFydCA9IGMoMjAxNSwxKSkNCg0KI2Rlc2Vhc29uYWxpemUgcHJvZHVjdGlvbg0KZGVzZWFzb25hbGl6ZWRQcm9kdWN0aW9uIDwtIGRzKHRzcmVjZW50RGF0YVByb2R1Y3Rpb24sIHR5cGUgPSAibW9udGhseSIpDQpkZXNlYXNvbmFsaXplZFByb2R1Y3Rpb24NCnBsb3QoZGVzZWFzb25hbGl6ZWRQcm9kdWN0aW9uJHosIHR5cGUgPSAibCIpDQpwbG90KGRlc2Vhc29uYWxpemVkUHJvZHVjdGlvbiR6ICogdHNyZWNlbnREYXRhUHJvZHVjdGlvbikNCg0KcGxvdCh0c3JlY2VudERhdGFQcm9kdWN0aW9uIC8gZGVzZWFzb25hbGl6ZWRQcm9kdWN0aW9uJHopDQojZGVzZWFzb25hbGl6ZSBwcmljZQ0KZGVzZWFzb25hbGl6ZWRQcmljZSA8LSBkcyh0c3JlY2VudERhdGFQcmljZSwgdHlwZSA9ICJtb250aGx5IikNCnBsb3QoZGVzZWFzb25hbGl6ZWRQcmljZSR6LCB0eXBlID0gImwiKQ0KDQpkYXRhYmFzZSA8LSBkYXRhLmZyYW1lKCh0c3JlY2VudERhdGFQcm9kdWN0aW9uL2Rlc2Vhc29uYWxpemVkUHJvZHVjdGlvbiR6KSwgKHRzcmVjZW50RGF0YVByaWNlL2Rlc2Vhc29uYWxpemVkUHJpY2UkeikpDQoNCmRhdGFiYXNlIDwtIGRhdGFiYXNlW29yZGVyKGRhdGFiYXNlJFgudHNyZWNlbnREYXRhUHJvZHVjdGlvbi5kZXNlYXNvbmFsaXplZFByb2R1Y3Rpb24uei4pLCBdDQoNCnBsb3QoZGF0YWJhc2UkWC50c3JlY2VudERhdGFQcm9kdWN0aW9uLmRlc2Vhc29uYWxpemVkUHJvZHVjdGlvbi56LiwgZGF0YWJhc2UkWC50c3JlY2VudERhdGFQcmljZS5kZXNlYXNvbmFsaXplZFByaWNlLnouLCB0eXBlID0gImwiKQ0KDQoNCg0KYGBgDQoNCg0Kbm93IGFnZ3JpZ2F0ZSwgb3JkZXIsIGFuZCBwbG90IHRoZSBkZXNlYXNvbmFsaXplZCBkYXRhDQpgYGB7cn0NCmRlc2Vhc29uYWxpemVkRGF0YSA8LSBkYXRhLmZyYW1lKGRlc2Vhc29uYWxpemVkUHJpY2UkeiwgZGVzZWFzb25hbGl6ZWRQcm9kdWN0aW9uJHopIA0KDQoNCm9yZGVyZWREZXNlYXNvbmFsaXplZERhdGEgPC0gZGVzZWFzb25hbGl6ZWREYXRhW29yZGVyKGRlc2Vhc29uYWxpemVkRGF0YSksIF0NCg0KcGxvdCgob3JkZXJlZERlc2Vhc29uYWxpemVkRGF0YSRkZXNlYXNvbmFsaXplZFByaWNlLnogKiBvcmRlcmVkUmVjZW50RGF0YSRQcmljZSkgfiAob3JkZXJlZERlc2Vhc29uYWxpemVkRGF0YSRkZXNlYXNvbmFsaXplZFByb2R1Y3Rpb24ueiAqIG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24pLCB0eXBlID0gImwiLCB4bGFiID0gIkRlc2Vhc29uYWxpemVkIFByb2R1Y3Rpb24iLCB5bGFiID0gIkRlc2Vhc29uYWxpemVkIFByaWNlIikNCg0KDQojcGxvdCgob3JkZXJlZERlc2Vhc29uYWxpemVkRGF0YSRkZXNlYXNvbmFsaXplZFByb2R1Y3Rpb24ueiAqIG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24pLCAob3JkZXJlZERlc2Vhc29uYWxpemVkRGF0YSRkZXNlYXNvbmFsaXplZFByaWNlLnogKiBvcmRlcmVkUmVjZW50RGF0YSRQcmljZSksIHR5cGUgPSAibCIpDQpgYGANCg0Kbm93IGkgd2FudCB0byBtYWtlIGEgY2xlYW5lciBwbG90IG9mIHRoZSBkZXNlYXNvbmFsaXplZCByZWxhdGlvbnNoaXANCmBgYHtyfQ0KI2ZpcnN0IGkgd2FudCB0byBjbGVhbiB1cCB0aGUgdmFyaWFibGVzDQojcHJpY2UNCmRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZFByaWNlIDwtIChvcmRlcmVkRGVzZWFzb25hbGl6ZWREYXRhJGRlc2Vhc29uYWxpemVkUHJpY2UueiAqIG9yZGVyZWRSZWNlbnREYXRhJFByaWNlKQ0KDQojcHJvZHVjdGlvbg0KZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkUHJvZHVjdGlvbiA8LSAob3JkZXJlZERlc2Vhc29uYWxpemVkRGF0YSRkZXNlYXNvbmFsaXplZFByb2R1Y3Rpb24ueiAqIG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24pDQoNCiNwdXQgdGhlbSB0b2dldGhlcg0KZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkRGF0YSA8LSBkYXRhLmZyYW1lKGRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZFByaWNlLCBkZXNlYXNvbmFsaXplZEFuZE9yZGVyZWRQcm9kdWN0aW9uKQ0KDQojb3JkZXIgYWdhaW4NCmRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZERhdGEgPC0gZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkRGF0YVtvcmRlcihkZXNlYXNvbmFsaXplZEFuZE9yZGVyZWREYXRhJGRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZFByaWNlKSxdDQoNCm1vZGVsMyA8LSBsbShkZXNlYXNvbmFsaXplZEFuZE9yZGVyZWREYXRhJGRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZFByaWNlIH4gZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkRGF0YSRkZXNlYXNvbmFsaXplZEFuZE9yZGVyZWRQcm9kdWN0aW9uKQ0KDQojcGxvdCB0aGUgZGF0YQ0KZ2dwbG90KG1vZGVsMywgYWVzKHggPSBtb2RlbDMkbW9kZWwkYGRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZERhdGEkZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkUHJvZHVjdGlvbmAsIHkgPSBtb2RlbDMkbW9kZWwkYGRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZERhdGEkZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkUHJpY2VgKSkrDQogIGdlb21fcG9pbnQoKSsNCiAgZ2VvbV9zdGVwKGRpcmVjdGlvbiA9ICJodiIsIGNvbCA9ICJyZWQiKQ0KYGBgDQoNCmBgYHtyfQ0KDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KFdpU0VCb290KQ0KeCA8LSBkZVNlYXNvbmFsaXplKGRhdGVzID0gcmVjZW50RGF0YSREYXRlLCB0eXBlID0gIm1vbnRobHkiLCBYID0gcmVjZW50RGF0YSRQcm9kdWN0aW9uLCBtZXRob2QgPSAiZGVNZWFuIikNCg0KeSA8LSBkZVNlYXNvbmFsaXplKGRhdGVzID0gcmVjZW50RGF0YSREYXRlLCB0eXBlID0gIm1vbnRobHkiLCBYID0gcmVjZW50RGF0YSRQcmljZSwgbWV0aG9kID0gImRlTWVhbiIpDQoNCngNCg0KeHkgPC0gZGF0YS5mcmFtZSh4LHkpDQoNCnh5IDwtIHh5W29yZGVyKHgpLCBdDQoNCnBsb3QoeHkkeSB+IHh5JHgsIHR5cGUgPSAiYiIpDQoNCnBsb3QoeCwgdHlwZSA9ICJsIikNCg0KDQptb2RlbDQgPC0gbG0oeHkkeSB+IHh5JHgpDQpzdW1tYXJ5KG1vZGVsNCkNCg0KDQpnZ3Bsb3QoeHksIGFlcyh4ID0geCwgeSA9IHkpKSAgK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsgZ2VvbV9zdGVwKCkNCg0KDQpnZ3Bsb3QoeHksIGFlcyh4ID0geHkkeCwgeSA9IHh5JHkpKSsNCiAgZ2VvbV9wb2ludCgpK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpKw0KICBnZW9tX3N0ZXAoZGlyZWN0aW9uID0gImh2IiwgY29sID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJMaW5lYXIgTW9kZWwgb2YgT2tsYWhvbWEgT2lsIFByb2R1Y3Rpb24gXG4yMDE1LTIwMTkiLCB4ID0gIlByb2R1Y3Rpb24gKFRob3VzYW5kcyBvZiBCYXJyZWxzKSIgLCB5ID0gIlByaWNlIChEb2xsYXJzKSIpICsgDQogIHRoZW1lX2Vjb25vbWlzdF93aGl0ZSgpIA0KDQpgYGANCg0KDQoNCg0Kb2theSwgdGhhdCBzaG91bGQgZG8gaXQgZm9yIHN1cHBseS4gbm93IGkgd2FudCB0byBkbyB0aGUgc2FtZSBmb3IgZGVtYW5kLi4uDQppbXBvcnQgdGhlIGRhdGENCmBgYHtyfQ0KVVNDcnVkZVN1cHBsaWVkIDwtIHJlYWQuY3N2KCJ+L1VTQ3J1ZGVTdXBwbGllZC5jc3YiKQ0KYGBgDQoNCg0KZ2V0IHRoZSBkYXRhIHR5cGVzIHNldCB1cA0KYGBge3J9DQpVU0NydWRlU3VwcGxpZWQkw68uLkRhdGUgPC0gYXMuRGF0ZShVU0NydWRlU3VwcGxpZWQkw68uLkRhdGUsICIlYiAlZCwgJVkiKQ0KDQpVU0NydWRlU3VwcGxpZWQgPC0gZWRpdChVU0NydWRlU3VwcGxpZWQpDQpVU0NydWRlU3VwcGxpZWQkRGF0ZSA8LSBhcy5EYXRlKFVTQ3J1ZGVTdXBwbGllZCREYXRlKQ0KDQoNCnBsb3QoVVNDcnVkZVN1cHBsaWVkJERhdGUsIFVTQ3J1ZGVTdXBwbGllZCRVUy5DcnVkZS5PaWwuU3VwcGxpZWQsIHR5cGUgPSAiaCIsIHhsYWIgPSAiRGF0ZSIsIHlsYWIgPSAiQ3J1ZGUgT2lsIFN1cHBsaWVkIChUaG91c2FuZHMgb2YgQmFycmVscykiLCBtYWluID0gIlVTIENydWRlIE9pbCBEZW1hbmQgYnkgRGF0ZSIsIGNvbCA9ICJncmVlbiIpDQpgYGANCg0KSSBjYW50IGZpbmQgb2tsYWhvbWEgc3BlY2lmaWMgZGF0YSBzbyBJJ20gZ29pbmcgdG8gbWFyZ2luYWxseSB1c2UgdGhpcyBkYXRhLiBtb3Zpbmcgb24uLi4NCg0KDQoNCkkgd2FudCB0byBjb21wYXJlIHByaWNlIGFuZCBxdWFudGl0eSBmcm9tIGJlZm9yZSBob3Jpem9udGFsIGRyaWxsaW5nIGFuZCBhZnRlci4gU3VwcG9zZWRseSB0ZWNobmljYWwgY2hhbmdlIHNob3VsZCBzaGlmdCB0aGUgc3VwcGx5IGxpbmUgdG8gdGhlIHJpZ2h0LiBpcyB0aGlzIGNvcnJlY3Q/DQoNCmdyYWIgdGhlIGRhdGENCmBgYHtyfQ0Kb2xkRGF0YSA8LSBkYXRhLmZyYW1lKG9pbERhdGFCYXNlJERhdGVbMzU6NzVdLCBvaWxEYXRhQmFzZSRvaWxQcm9kdWN0aW9uLk9rbGFob21hLkZpZWxkLlByb2R1Y3Rpb24ub2YuQ3J1ZGUuT2lsLi5UaG91c2FuZC5CYXJyZWxzLi4xLjQ2Ny5bMzU6NzVdLCBvaWxEYXRhQmFzZSRzcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbFszNTo3NV0pDQpgYGANCg0KcGxvdCB0aGUgZGF0YQ0KYGBge3J9DQpwbG90KG9sZERhdGEkb2lsRGF0YUJhc2UuRGF0ZS4zNS43NS4sIG9sZERhdGEkb2lsRGF0YUJhc2Uub2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuLjM1Ljc1LiwgdHlwZSA9ICJsIiwgeGxhYiA9ICJEYXRlIiwgeWxhYiA9ICJQcm9kdWN0aW9uIikNCg0KcGxvdChvbGREYXRhJG9pbERhdGFCYXNlLkRhdGUuMzUuNzUuLCBvbGREYXRhJG9pbERhdGFCYXNlLnNwb3RQcmljZS5DdXNoaW5nLk9LLldUSS5TcG90LlByaWNlLkZPQi4uRG9sbGFycy5wZXIuQmFycmVsLjM1Ljc1LiwgdHlwZSA9ICJsIiwgeGxhYiA9ICJEYXRlIiwgeWxhYiA9ICJQcmljZSIpDQpgYGANCg0Kbm93IG9yZGVyIHRoZSBkYXRhIGZvciBwcmljZSBhbmQgcXVhbnRpdHkNCmBgYHtyfQ0Kb3JkZXJlZE9sZERhdGEgPC0gb2xkRGF0YVtvcmRlcihvbGREYXRhJG9pbERhdGFCYXNlLnNwb3RQcmljZS5DdXNoaW5nLk9LLldUSS5TcG90LlByaWNlLkZPQi4uRG9sbGFycy5wZXIuQmFycmVsLjM1Ljc1LiksIF0NCmBgYA0KDQpwbG90IGFuZCBjb21wYXJlIHByaWNlIGFuZCBxdWFudGl0eQ0KYGBge3J9DQpnZ3Bsb3Qob3JkZXJlZE9sZERhdGEsIGFlcyh4ID0gb3JkZXJlZE9sZERhdGEkb2lsRGF0YUJhc2Uub2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuLjM1Ljc1LiwgeSA9IG9yZGVyZWRPbGREYXRhJG9pbERhdGFCYXNlLnNwb3RQcmljZS5DdXNoaW5nLk9LLldUSS5TcG90LlByaWNlLkZPQi4uRG9sbGFycy5wZXIuQmFycmVsLjM1Ljc1LikpKw0KICBnZW9tX3BvaW50KCkrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikrDQogIGdlb21fc3RlcChkaXJlY3Rpb24gPSAiaHYiLCBjb2wgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIkxpbmVhciBNb2RlbCBvZiBPa2xhaG9tYSBPaWwgUHJvZHVjdGlvbiBcbjE5OTAvMDEvMTUgLSAxOTk0LzA5LzE1IiwgeCA9ICJQcm9kdWN0aW9uIChUaG91c2FuZHMgb2YgQmFycmVscykiICwgeSA9ICJQcmljZSAoRG9sbGFycykiKSArIA0KICB0aGVtZV9lY29ub21pc3Rfd2hpdGUoKSANCmBgYA0KDQp0cnkgdG8gcHV0IGJvdGggbGluZXMgb24gb25lIGdyYXBoLi4uDQpgYGB7cn0NCm9sZFBsb3QgPC0gZ2dwbG90KG9yZGVyZWRPbGREYXRhLCBhZXMoeCA9IG9yZGVyZWRPbGREYXRhJG9pbERhdGFCYXNlLm9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3Li4zNS43NS4sIHkgPSBvcmRlcmVkT2xkRGF0YSRvaWxEYXRhQmFzZS5zcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbC4zNS43NS4pKSsNCiAgZ2VvbV9wb2ludCgpK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpKw0KICBnZW9tX3N0ZXAoZGlyZWN0aW9uID0gImh2IiwgY29sID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJMaW5lYXIgTW9kZWwgb2YgT2tsYWhvbWEgT2lsIFByb2R1Y3Rpb24gXG4xOTkwLzAxLzE1IC0gMTk5NC8wOS8xNSIsIHggPSAiUHJvZHVjdGlvbiAoVGhvdXNhbmRzIG9mIEJhcnJlbHMpIiAsIHkgPSAiUHJpY2UgKERvbGxhcnMpIikgKyANCiAgdGhlbWVfZWNvbm9taXN0X3doaXRlKCkgDQoNCg0KcmVjZW50UGxvdCA8LSBnZ3Bsb3Qob3JkZXJlZFJlY2VudERhdGEsIGFlcyh4ID0gb3JkZXJlZFJlY2VudERhdGEkUHJvZHVjdGlvbiwgeSA9IG9yZGVyZWRSZWNlbnREYXRhJFByaWNlKSkrDQogIGdlb21fcG9pbnQoKStnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSsNCiAgZ2VvbV9zdGVwKGRpcmVjdGlvbiA9ICJodiIsIGNvbCA9ICJyZWQiKSArDQogIGxhYnModGl0bGUgPSAiTW9kZWwgb2YgT2tsYWhvbWEgT2lsIFByb2R1Y3Rpb24gXG4yMDE1LzAxLzE1IC0gMjAxOS8xMS8xNSIsIHggPSAiUHJvZHVjdGlvbiAoVGhvdXNhbmRzIG9mIEJhcnJlbHMpIiAsIHkgPSAiUHJpY2UgKERvbGxhcnMpIikgKyANCiAgdGhlbWVfZWNvbm9taXN0X3doaXRlKCkgDQoNCmdncGxvdCgpKyANCiAgZ2VvbV9wb2ludChkYXRhID0gb3JkZXJlZE9sZERhdGEsIGFlcyh4ID0gb3JkZXJlZE9sZERhdGEkb2lsRGF0YUJhc2Uub2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuLjM1Ljc1LiwgeSA9IG9yZGVyZWRPbGREYXRhJG9pbERhdGFCYXNlLnNwb3RQcmljZS5DdXNoaW5nLk9LLldUSS5TcG90LlByaWNlLkZPQi4uRG9sbGFycy5wZXIuQmFycmVsLjM1Ljc1LikpICsNCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IG9yZGVyZWRPbGREYXRhLCBhZXMoeCA9IG9yZGVyZWRPbGREYXRhJG9pbERhdGFCYXNlLm9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3Li4zNS43NS4sIHkgPSBvcmRlcmVkT2xkRGF0YSRvaWxEYXRhQmFzZS5zcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbC4zNS43NS4pLCBmaWxsID0gImJsdWUiLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSAxLCBtZXRob2QgPSAibG0iKSArIA0KICBnZW9tX3N0ZXAoZGF0YSA9IG9yZGVyZWRPbGREYXRhLCBhZXMoeCA9IG9yZGVyZWRPbGREYXRhJG9pbERhdGFCYXNlLm9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3Li4zNS43NS4sIHkgPSBvcmRlcmVkT2xkRGF0YSRvaWxEYXRhQmFzZS5zcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbC4zNS43NS4pLCBkaXJlY3Rpb24gPSAiaHYiLCBjb2wgPSAicmVkIikgKw0KICANCiAgZ2VvbV9wb2ludChkYXRhID0gb3JkZXJlZFJlY2VudERhdGEsIGFlcyh4ID0gb3JkZXJlZFJlY2VudERhdGEkUHJvZHVjdGlvbiwgeSA9IG9yZGVyZWRSZWNlbnREYXRhJFByaWNlKSkgKyBnZW9tX3Ntb290aChkYXRhID0gb3JkZXJlZFJlY2VudERhdGEsIGFlcyh4ID0gb3JkZXJlZFJlY2VudERhdGEkUHJvZHVjdGlvbiwgeSA9IG9yZGVyZWRSZWNlbnREYXRhJFByaWNlKSwgbWV0aG9kID0gImxtIikrDQogIGdlb21fc3RlcChkYXRhID0gb3JkZXJlZFJlY2VudERhdGEsIGFlcyh4ID0gb3JkZXJlZFJlY2VudERhdGEkUHJvZHVjdGlvbiwgeSA9IG9yZGVyZWRSZWNlbnREYXRhJFByaWNlKSwgZGlyZWN0aW9uID0gImh2IiwgY29sID0gInJlZCIpKw0KICANCiAgbGFicyh4ID0gIlByb2R1Y3Rpb24gKFRob3VzYW5kcyBvZiBCYXJyZWxzKSIsIHkgPSAiUHJpY2UgKERvbGxhcnMpIiwgdGl0bGUgPSAiT2tsYWhvbWEgT2lsIFByb2R1Y3Rpb24gYW5kIFByaWNlIFxuMTk5MC8wMS8xNSAtIDE5OTQvMDkvMTUgYW5kIDIwMTUvMDEvMTUgLSAyMDE5LzExLzE1IikgKw0KICANCiAgdGhlbWVfZWNvbm9taXN0X3doaXRlKCkNCmBgYA0KDQppIG5lZWQgdG8gc2hvdyBjaGFuZ2UgaW4gZGVtYW5kDQpnZXQgdGhlIGRhdGENCmBgYHtyfQ0Kb2xkQ3J1ZGVTdXBwbGllZCA8LSBkYXRhLmZyYW1lKFVTQ3J1ZGVTdXBwbGllZCRVUy5DcnVkZS5PaWwuU3VwcGxpZWRbMToxNzhdKQ0KcmVjZW50Q3J1ZGVTdXBwbGllZCA8LSBkYXRhLmZyYW1lKFVTQ3J1ZGVTdXBwbGllZCRVUy5DcnVkZS5PaWwuU3VwcGxpZWRbMTMxNDoxNDkxXSkNCmBgYA0KDQpub3cgcGxvdCB0aGUgZGF0YQ0KYGBge3J9DQpnZ3Bsb3QoKSArDQogICNnZW9tX2xpbmUoZGF0YSA9IG9sZENydWRlU3VwcGxpZWQsIGFlcyh4ID0gYygxOjE3OCkgLCB5ID0gb2xkQ3J1ZGVTdXBwbGllZCRVU0NydWRlU3VwcGxpZWQuVVMuQ3J1ZGUuT2lsLlN1cHBsaWVkLjEuMTc4LiksIGNvbCA9ICJyZWQiKSArDQogIA0KICBnZW9tX2xpbmUoZGF0YSA9IHJlY2VudENydWRlU3VwcGxpZWQsIGFlcyh4ID0gYygxOjE3OCksIHkgPSByZWNlbnRDcnVkZVN1cHBsaWVkJFVTQ3J1ZGVTdXBwbGllZC5VUy5DcnVkZS5PaWwuU3VwcGxpZWQuMTMxNC4xNDkxLiksIGNvbCA9ICJibHVlIikgKw0KICANCiAgbGFicyh4ID0gIkluZGV4IiwgeSA9ICJDcnVkZSBEZW1hbmQiLCB0aXRsZSA9ICJDcnVkZSBPaWwgRGVtYW5kIFxuMjAxNi8wNy8wOCAtIDIwMTkvMTEvMjkiKSsgdGhlbWVfZWNvbm9taXN0X3doaXRlKCkNCiANCiAgDQpgYGANCg0K