Project title : Hotel Room Pricing Analysis

Name : Roopak Krishna

Email : rupakkrishna28@gmail.com

College: Jaypee University of Engineering & Technology, Guna

1. Introduction

A hotel is an establishment that provides paid lodging on a short-term basis. Facilities provided may range from a modest-quality mattress in a small room to large suites with bigger, higher-quality beds, a dresser, a refrigerator and other kitchen facilities, upholstered chairs, a flatscreen television and en-suite bathrooms. Small, lower-priced hotels may offer only the most basic guest services and facilities. Larger, higher-priced hotels may provide additional guest facilities such as a swimming pool, business centre (with computers, printers and other office equipment), childcare, conference and event facilities, tennis or basketball courts, gymnasium, restaurants, day spa and social function services, Wifi, Breakfast. And also, Price of Hotel room changes occasionally like if the day is a new year, Is it a metro city, Is it a Tourist Destination, Is it a Weekend or like normal days.

2. Overview of the Study

Our study concerns the Strategy of hotel room prices considering various factors. The hotel industry appears to be quite glamorous and exciting to all of us. Top class hospitality, well-equipped rooms, fancy facilities, etc. - all this is done with an aim to create a seamlessly pleasant experience for guests. Needless to say, all this comes at a price which the guest actually has to pay.

A host of technology-driven hotel revenue management systems and processes are required to be put in place, and some good people and procedures need to be employed to ensure that the customer gets the best share of offerings, price being the most important component.

Setting your prices without a thorough grasp of your overall objectives can destroy any brand-building efforts.Well, pricing is certainly critical to the success of all hotels and a well-designed pricing strategy can do wonders by giving a strong push to the hotel revenues. In this Study , we have total of 19 features of hotels and on the basis of these features, we are doing our analysis and trying to find out those features which have significantly effect on the Pricing Strategy of hotel rooms.

Hypothesis :-

H1: Price of hotel room is higher if starraing is high than Price of hotel room if starrating is low.

H2: Price of Hotel Room is higher at tourist destination than Price of Hotel Room at non-tourist destination.

H3: Price of Hotel Room is higher if the hotel Capacity is full than Price of Hotel Room if the hotel capacity is low.

3. Data

The data was collected from https://in.hotels.com/ in October 2016.

Dataset tracks hotel prices on 8 different dates at different hotels across different cities.

Many external factors can potentially influence the RoomRent. The dataset captures 8 external factors, 10 internal factors and ofcourse RoomRent factor.

3.1 Reading all the data

hotel <- read.csv(paste("Cities42.csv"),sep=",")
View(hotel)

3.2 Statistics of Variables

library(psych)
describe(hotel)[,c(3,4,5,8,9)]
                           mean         sd  median      min      max
CityName*                 18.07      11.72      16      1.0       42
Population           4416836.87 4258386.00 3046163   8096.0 12442373
CityRank                  14.83      13.51       9      0.0       44
IsMetroCity                0.28       0.45       0      0.0        1
IsTouristDestination       0.70       0.46       1      0.0        1
IsWeekend                  0.62       0.48       1      0.0        1
IsNewYearEve               0.12       0.33       0      0.0        1
Date*                     14.30       2.69      14      1.0       20
HotelName*               841.19     488.16     827      1.0     1670
RoomRent                5473.99    7333.12    4000    299.0   322500
StarRating                 3.46       0.76       3      0.0        5
Airport                   21.16      22.76      15      0.2      124
HotelAddress*           1202.53     582.17    1261      1.0     2108
HotelPincode          397430.26  259837.50  395003 100025.0  7000157
HotelDescription*        581.34     363.26     567      1.0     1226
FreeWifi                   0.93       0.26       1      0.0        1
FreeBreakfast              0.65       0.48       1      0.0        1
HotelCapacity             62.51      76.66      34      0.0      600
HasSwimmingPool            0.36       0.48       0      0.0        1

3.3 Converting Categoriacal value into meaningful values

#IsMetrocity
hotel$IsMetroCity[hotel$IsMetroCity == 1] <- 'Yes MetroCity'
hotel$IsMetroCity[hotel$IsMetroCity == 0] <- 'No MetroCity'
hotel$IsMetroCity <- as.factor(hotel$IsMetroCity)
#IsWeekend
hotel$IsWeekend[hotel$IsWeekend == 1] <- 'Yes Weekend'
hotel$IsWeekend[hotel$IsWeekend == 0] <- 'No Weekend'
hotel$IsWeekend <- as.factor(hotel$IsWeekend)
#IsTouristDestination
hotel$IsTouristDestination[hotel$IsTouristDestination == 1] <- 'Yes TouristDestination'
hotel$IsTouristDestination[hotel$IsTouristDestination == 0] <- 'No ToursitDestination'
hotel$IsTouristDestination <- as.factor(hotel$IsTouristDestination)
#IsNewYearEve
hotel$IsNewYearEve[hotel$IsNewYearEve == 1] <- 'Yes NewYear'
hotel$IsNewYearEve[hotel$IsNewYearEve == 0] <- 'No NewYear'
hotel$IsNewYearEve <- as.factor(hotel$IsNewYearEve)
#FreeWifi
hotel$FreeWifi[hotel$FreeWifi == 1] <- 'Yes Wifi'
hotel$FreeWifi[hotel$FreeWifi == 0] <- 'No Wifi'
hotel$FreeWifi <- as.factor(hotel$FreeWifi)
#FreeBreakfast
hotel$FreeBreakfast[hotel$FreeBreakfast == 1] <- 'Yes Breakfast'
hotel$FreeBreakfast[hotel$FreeBreakfast == 0] <- 'No Breakfast'
hotel$FreeBreakfast <- as.factor(hotel$FreeBreakfast)
#HasSwimmingPool
hotel$HasSwimmingPool[hotel$HasSwimmingPool == 1] <- 'Yes SwimmingPool'
hotel$HasSwimmingPool[hotel$HasSwimmingPool == 0] <- 'No SwimmingPool'
hotel$HasSwimmingPool <- as.factor(hotel$HasSwimmingPool)

3.4 Structure of variables

str(hotel)
'data.frame':   13232 obs. of  19 variables:
 $ CityName            : Factor w/ 42 levels "Agra","Ahmedabad",..: 26 26 26 26 26 26 26 26 26 26 ...
 $ Population          : int  12442373 12442373 12442373 12442373 12442373 12442373 12442373 12442373 12442373 12442373 ...
 $ CityRank            : int  0 0 0 0 0 0 0 0 0 0 ...
 $ IsMetroCity         : Factor w/ 2 levels "No MetroCity",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ IsTouristDestination: Factor w/ 2 levels "No ToursitDestination",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ IsWeekend           : Factor w/ 2 levels "No Weekend","Yes Weekend": 2 1 2 2 1 2 1 2 2 1 ...
 $ IsNewYearEve        : Factor w/ 2 levels "No NewYear","Yes NewYear": 1 1 1 1 1 2 1 1 1 1 ...
 $ Date                : Factor w/ 20 levels "04-Jan-16","04-Jan-17",..: 11 12 13 14 15 16 17 18 11 12 ...
 $ HotelName           : Factor w/ 1670 levels "14 Square Amanora",..: 1635 1635 1635 1635 1635 1635 1635 1635 1409 1409 ...
 $ RoomRent            : int  12375 10250 9900 10350 12000 11475 11220 9225 6800 9350 ...
 $ StarRating          : num  5 5 5 5 5 5 5 5 4 4 ...
 $ Airport             : num  21 21 21 21 21 21 21 21 20 20 ...
 $ HotelAddress        : Factor w/ 2108 levels " H.P. High Court Mall Road, Shimla",..: 925 928 930 933 935 937 940 941 699 746 ...
 $ HotelPincode        : int  400005 400006 400007 400008 400009 400010 400011 400012 400039 400040 ...
 $ HotelDescription    : Factor w/ 1226 levels "#NAME?","10 star hotel near Queensroad, Amritsar",..: 1030 1030 1030 1030 1030 1030 1030 1030 1006 1006 ...
 $ FreeWifi            : Factor w/ 2 levels "No Wifi","Yes Wifi": 2 2 2 2 2 2 2 2 2 2 ...
 $ FreeBreakfast       : Factor w/ 2 levels "No Breakfast",..: 1 1 1 1 1 1 1 1 2 2 ...
 $ HotelCapacity       : int  287 287 287 287 287 287 287 287 28 28 ...
 $ HasSwimmingPool     : Factor w/ 2 levels "No SwimmingPool",..: 2 2 2 2 2 2 2 2 1 1 ...

4. Analysis

4.1 CityName

table(hotel$CityName)

            Agra        Ahmedabad         Amritsar        Bangalore      Bhubaneswar       Chandigarh          Chennai       Darjeeling 
             432              424              136              656              120              336              416              136 
           Delhi          Gangtok              Goa         Guwahati         Haridwar        Hyderabad           Indore           Jaipur 
            2048              128              624               48               48              536              160              768 
       Jaisalmer          Jodhpur           Kanpur            Kochi          Kolkata          Lucknow          Madurai           Manali 
             264              224               16              608              512              128              112              288 
       Mangalore           Mumbai           Munnar           Mysore         Nainital             Ooty        Panchkula             Pune 
             104              712              328              160              144              136               64              600 
            Puri           Rajkot        Rishikesh           Shimla         Srinagar            Surat Thiruvanthipuram         Thrissur 
              56              128               88              280               40               80              392               32 
         Udaipur         Varanasi 
             456              264 

4.2 Population

count <- aggregate(hotel$Population,by=list(CItyname=hotel$CityName),mean)
min(count$x) #minimum population
[1] 8096
count$CItyname[count$x==8096] # City name with minimum population
[1] Manali
42 Levels: Agra Ahmedabad Amritsar Bangalore Bhubaneswar Chandigarh Chennai Darjeeling Delhi Gangtok Goa Guwahati Haridwar ... Varanasi
max(count$x) #maximum population
[1] 12442373
count$CItyname[count$x==12442373] #city name with maximum population
[1] Mumbai
42 Levels: Agra Ahmedabad Amritsar Bangalore Bhubaneswar Chandigarh Chennai Darjeeling Delhi Gangtok Goa Guwahati Haridwar ... Varanasi

4.4 CityRank by Population

plot(hotel$CityRank,hotel$Population,col="darkblue",main="City rank by population",xlab = "City Rank",ylab = "Population")

4.5 Is Metro City ?

table(hotel$IsMetroCity)

 No MetroCity Yes MetroCity 
         9472          3760 
barplot(table(hotel$IsMetroCity), main="Distribution of IsMetroCity", xlab="Is a Metro City?", col="blue")

4.6 Average Room Rent Of a MetroCity/Not a MetroCity

count <- aggregate(hotel$RoomRent,by=list(Metrocity=hotel$IsMetroCity),mean)
count

4.7 Tourist Destination

table(hotel$IsTouristDestination) #Number of Tourist destination or not

 No ToursitDestination Yes TouristDestination 
                  4007                   9225 
count <- aggregate(hotel$RoomRent,by=list(ToursitDestination = hotel$IsTouristDestination),mean)
count # Room Rent according to tourist destination or not

4.8 Weekend

table(hotel$IsWeekend) #Number of Weekends and week days(No Weekend)

 No Weekend Yes Weekend 
       4991        8241 
count <- aggregate(hotel$RoomRent,by=list(Weekend = hotel$IsWeekend),mean)
count #Room Rent according to weekend or not

4.9 Room Rent on the basis of Weekend , MetroCity and Tourist Destination

library(ggplot2)
count <- aggregate(RoomRent~IsWeekend+IsMetroCity+IsTouristDestination,data=hotel,mean)
count
#Graph of difference in Money on Weekend or not
qplot(RoomRent, data = count, geom = "density",color = IsWeekend, linetype = IsWeekend,xlab="Room Rent in Indian rupees",
      ylab="Density", main="RoomRent VS IsWeekend")

#Graph of difference in Money in MetroCity or not
qplot(RoomRent, data = count, geom = "density",color = IsMetroCity, linetype = IsMetroCity,xlab="Room Rent in Indian rupees",
      ylab="Density",main="RoomRent VS IsMetroCity")

#Graph of difference in Money at Tourist Destination or not
qplot(RoomRent, data = count, geom = "density",color = IsTouristDestination, linetype = IsTouristDestination,
      xlab="Room Rent in Indian rupees",ylab="Density",main="RoomRent VS IsTouristDestination")

#Graph of difference in Money on the basis of weekend, metrocity and touristdestination
qplot(RoomRent, data = count, facets = IsWeekend~IsMetroCity+IsTouristDestination)

4.10 NewYearEve

table(hotel$IsNewYearEve) #Number of New Year Eve or not

 No NewYear Yes NewYear 
      11586        1646 
count <- aggregate(hotel$RoomRent,by=list(IsNewYearEve = hotel$IsNewYearEve),mean)
count #Room Rent on the basis of New Year Eve or not
#Graph of difference in Money on New Year or not
qplot(x, data = count, geom = "density",color = IsNewYearEve, linetype = IsNewYearEve,xlab="Room Rent in Indian      rupees",ylab="Density",main="RoomRent VS IsNewYearE")

4.11 RoomRent

min(hotel$RoomRent) # minimum room rent
[1] 299
max(hotel$RoomRent) # maximum room rent
[1] 322500

4.12 Star Rating

library(car)
library(lattice)
table(hotel$StarRating) #Number of hotel on the basis of StarRating

   0    1    2  2.5    3  3.2  3.3  3.4  3.5  3.6  3.7  3.8  3.9    4  4.1  4.3  4.4  4.5  4.7  4.8    5 
  16    8  440  632 5953    8   16    8 1752    8   24   16   32 2463   24   16    8  376    8   16 1408 
count <- aggregate(cbind(Population,RoomRent)~StarRating,data=hotel,mean)
count # StarRating on the basis of population and roomrent
#Scatter plot of Population against Room Rent
scatterplot(count$Population,count$RoomRent , main="Population & RoomRent",labels=row.names(count),xlab="Population",ylab="RoomRent")

#Scatter plot of StarRating against Room Rent
scatterplot(count$StarRating,count$RoomRent , main="StarRating & RoomRent",labels=row.names(count),xlab="StarRating",ylab="RoomRent")

4.13 Airport distance from hotel

count <- aggregate(cbind(Airport,RoomRent)~StarRating,data=hotel,mean)
count # StarRating of Hotels on the basis of Airport distance from hotel and Room Rent
#Scatterplot of Airport distance from hotel against Room Rent
scatterplot(count$Airport,count$RoomRent , main="Airport distance & RoomRent",labels=row.names(count),xlab="Airport distance from hotel",ylab="RoomRent")

#Graph(Combined jitterplot and boxplot) of Airport distance from hotel against StarRating of hotel
qplot(StarRating, Airport, data = count,geom=c("boxplot", "jitter"))

4.14 Free Wifi, Free Breakfast, Has SwimmingPool

count <- xtabs(~FreeWifi+FreeBreakfast+HasSwimmingPool,data=hotel)
ftable(prop.table(count))*100 #Proportion of hotel on the basis of wifi, breakfast and swimmingpool
                       HasSwimmingPool No SwimmingPool Yes SwimmingPool
FreeWifi FreeBreakfast                                                 
No Wifi  No Breakfast                        2.4788392        2.1009674
         Yes Breakfast                       1.9951632        0.8388755
Yes Wifi No Breakfast                       18.7197703       11.7896010
         Yes Breakfast                      41.2258162       20.8509674

4.15 Room Rent on the basis of breakfast, wifi and swimmingpool

count <- aggregate(RoomRent~FreeBreakfast+FreeWifi+HasSwimmingPool,data=hotel,mean)
count
#Graph of difference in money on the basis of breakfast, wifi and swimmingpool
qplot(RoomRent, data = count, facets = FreeBreakfast~FreeWifi+HasSwimmingPool)

#Box and Whisker Plot of Swimming pool or not in hotel according to Room Rent 
bwplot(HasSwimmingPool ~ RoomRent, data=count, horizontal=TRUE, 
xlab = "Room Rent",ylab="Swimming pool",main="Room Rent & Swimming pool")

#Box and Whisker Plot of Free Breakfast or not in hotel according to Room Rent
bwplot(FreeBreakfast ~ RoomRent, data=count, horizontal=TRUE, 
xlab = "Room Rent",ylab="Free Breakfast",main="Room Rent & Free Breakfast")

#Box and Whisker Plot of Free Wifi or not in hotel according to Room Rent
bwplot(FreeWifi ~ RoomRent, data=count, horizontal=TRUE, 
xlab = "Room Rent",ylab="Free Wifi",main="Room Rent & Free Wifi")

4.16 Hotel Capacity

#plot of room rent according to hotel capacity
plot(hotel$HotelCapacity,hotel$RoomRent,xlab="Hotel Capacity",ylab="Room Rent",main="Room Rent according to hotel capacity ") 

#Graph(Histogram + Density) of distribution of Hotel capacity in the data
ggplot(data=hotel) +geom_histogram( aes(HotelCapacity, ..density..) ) + 
  geom_density( aes(HotelCapacity, ..density..) ) + geom_rug( aes(HotelCapacity) )

4.17 Correlations

  1. Room Rent versus other variables
scatterplotMatrix(~RoomRent+IsWeekend+IsMetroCity+IsTouristDestination,data=hotel,cex=0.6,spread=FALSE, smoother.args=list(lty=2)
                  ,main="Room Rent versus other variables")

  1. Room Rent versus other variables
scatterplotMatrix(~RoomRent+IsNewYearEve+Population,data=hotel,cex=0.6,spread=FALSE, smoother.args=list(lty=2)
                  ,main="Room Rent versus other variables")

  1. Room Rent versus other variables
scatterplotMatrix(~RoomRent+StarRating+FreeWifi+FreeBreakfast,data=hotel,cex=0.6,spread=FALSE, smoother.args=list(lty=2)
                  ,main="Room Rent versus other variables")

  1. Room Rent versus other variables
scatterplotMatrix(~RoomRent+HotelCapacity+HasSwimmingPool,data=hotel,cex=0.6,spread=FALSE, smoother.args=list(lty=2)
                  ,main="Room Rent versus other variables")

3.5 Re-Converting the factor variable for calculating correlation

hotel$IsMetroCity = as.integer(hotel$IsMetroCity, levels = c('Yes MetroCity','No MetroCity'),labels = c(1, 0))
hotel$IsWeekend = as.integer(hotel$IsWeekend, levels = c('Yes Weekend','No Weekend'),labels = c(1, 0))
hotel$IsTouristDestination = as.integer(hotel$IsTouristDestination, levels = c('Yes TouristDestination','No TouristDestination'),
                                        labels = c(1, 0))
hotel$IsNewYearEve = as.integer(hotel$IsNewYearEve, levels = c('Yes NewYear','No NewYear'), labels = c(1, 0))
hotel$FreeWifi = as.integer(hotel$FreeWifi, levels = c('Yes Wifi','No Wifi'), labels = c(1, 0))
hotel$FreeBreakfast = as.integer(hotel$FreeBreakfast, levels = c('Yes Breakfast','No Breakfast'), labels = c(1, 0))
hotel$HasSwimmingPool = as.integer(hotel$HasSwimmingPool, levels = c('Yes SwimmingPool','No SwimmingPool'), labels = c(1, 0))

4.18 Correlation Matrix

  1. Correlation matrix 1
library(Hmisc)
colhotel3 <- c("Population","IsMetroCity","IsWeekend","IsTouristDestination","RoomRent")
corMatrix <- rcorr(as.matrix(hotel[,colhotel3]))
corMatrix
                     Population IsMetroCity IsWeekend IsTouristDestination RoomRent
Population                 1.00        0.77      0.01                -0.05    -0.09
IsMetroCity                0.77        1.00      0.00                 0.18    -0.07
IsWeekend                  0.01        0.00      1.00                -0.02     0.00
IsTouristDestination      -0.05        0.18     -0.02                 1.00     0.12
RoomRent                  -0.09       -0.07      0.00                 0.12     1.00

n= 13232 


P
                     Population IsMetroCity IsWeekend IsTouristDestination RoomRent
Population                      0.0000      0.1824    0.0000               0.0000  
IsMetroCity          0.0000                 0.8349    0.0000               0.0000  
IsWeekend            0.1824     0.8349                0.0250               0.5983  
IsTouristDestination 0.0000     0.0000      0.0250                         0.0000  
RoomRent             0.0000     0.0000      0.5983    0.0000                       
  1. Correlation matrix 2
colhotel3 <- c("IsNewYearEve","FreeWifi","FreeBreakfast","HasSwimmingPool","StarRating","RoomRent","HotelCapacity")
corMatrix <- rcorr(as.matrix(hotel[,colhotel3]))
corMatrix
                IsNewYearEve FreeWifi FreeBreakfast HasSwimmingPool StarRating RoomRent HotelCapacity
IsNewYearEve            1.00     0.00          0.00            0.00       0.00     0.04          0.00
FreeWifi                0.00     1.00          0.16           -0.02       0.02     0.00         -0.01
FreeBreakfast           0.00     0.16          1.00           -0.06      -0.03    -0.01         -0.09
HasSwimmingPool         0.00    -0.02         -0.06            1.00       0.62     0.31          0.51
StarRating              0.00     0.02         -0.03            0.62       1.00     0.37          0.64
RoomRent                0.04     0.00         -0.01            0.31       0.37     1.00          0.16
HotelCapacity           0.00    -0.01         -0.09            0.51       0.64     0.16          1.00

n= 13232 


P
                IsNewYearEve FreeWifi FreeBreakfast HasSwimmingPool StarRating RoomRent HotelCapacity
IsNewYearEve                 0.9974   0.7643        0.8973          0.7860     0.0000   0.8764       
FreeWifi        0.9974                0.0000        0.0056          0.0383     0.6765   0.3168       
FreeBreakfast   0.7643       0.0000                 0.0000          0.0002     0.2497   0.0000       
HasSwimmingPool 0.8973       0.0056   0.0000                        0.0000     0.0000   0.0000       
StarRating      0.7860       0.0383   0.0002        0.0000                     0.0000   0.0000       
RoomRent        0.0000       0.6765   0.2497        0.0000          0.0000              0.0000       
HotelCapacity   0.8764       0.3168   0.0000        0.0000          0.0000     0.0000                

4.19 Corrgram of all variables

library(corrgram)
corrgram(hotel, order=TRUE, upper.panel=panel.cor, main="Variables")

4.20 T-tests

  1. T-test on starrating and roomrent

H1: Price of hotel room is higher if starraing is high than Price of hotel room if starrating is low.

t.test(hotel$StarRating,hotel$RoomRent)

    Welch Two Sample t-test

data:  hotel$StarRating and hotel$RoomRent
t = -85.813, df = 13231, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -5595.491 -5345.575
sample estimates:
  mean of x   mean of y 
   3.458933 5473.991838 

AS P-value is less than 0.05, our hypothesis is true.

  1. T-test on IsMetrocity and RoomRent

H2: Price of Hotel Room is higher at tourist destination than Price of Hotel Room at non-tourist destination.

t.test(hotel$IsTouristDestination,hotel$RoomRent)

    Welch Two Sample t-test

data:  hotel$IsTouristDestination and hotel$RoomRent
t = -85.841, df = 13231, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -5597.253 -5347.337
sample estimates:
  mean of x   mean of y 
   1.697174 5473.991838 

As P-value is less than 0.05, our hypothesis is true.

  1. T-test on RoomRent and HotelCapacity

H3: Price of Hotel Room is higher if the hotel Capacity is full than Price of Hotel Room if the hotel capacity is low.

t.test(hotel$RoomRent,hotel$HotelCapacity)

    Welch Two Sample t-test

data:  hotel$RoomRent and hotel$HotelCapacity
t = 84.882, df = 13234, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 5286.515 5536.445
sample estimates:
 mean of x  mean of y 
5473.99184   62.51164 

Our P-Value is less than 0.05. So, our Hypothesis is true.

4.21 Linear Regression model 1

Respnse variable is “RoomRent”

We proposed the following model:

\[RoomRent= \alpha_0 + \alpha_1 Population + \alpha_2 CityRank + \alpha_3 IsMetroCity + \alpha_4 IsTouristDestination + \alpha_5 IsWeekend+\alpha_6 IsNewYearEve \] \[ + \alpha_7 StarRating + \alpha_8 Airport + \alpha_9 FreeWifi + \alpha_10 FreeBreakfast +\alpha_11 HotelCapacity +\alpha_12 HasSwimmingPool+\epsilon\] We are considering all the Predictors in our model. Later, those predictors have not significantally effect on Room Rent, we will remove them for good.

fit <- lm(RoomRent~Population+CityRank+IsMetroCity+IsTouristDestination+IsWeekend+IsNewYearEve+StarRating+Airport+FreeWifi+
            FreeBreakfast+HotelCapacity+HasSwimmingPool, data=hotel)
summary(fit)

Call:
lm(formula = RoomRent ~ Population + CityRank + IsMetroCity + 
    IsTouristDestination + IsWeekend + IsNewYearEve + StarRating + 
    Airport + FreeWifi + FreeBreakfast + HotelCapacity + HasSwimmingPool, 
    data = hotel)

Residuals:
   Min     1Q Median     3Q    Max 
-11845  -2356   -690   1030 309689 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)          -1.353e+04  6.586e+02 -20.542  < 2e-16 ***
Population           -1.188e-04  3.592e-05  -3.307 0.000945 ***
CityRank              1.821e+00  1.035e+01   0.176 0.860302    
IsMetroCity          -6.640e+02  2.164e+02  -3.068 0.002158 ** 
IsTouristDestination  1.925e+03  1.481e+02  13.001  < 2e-16 ***
IsWeekend            -9.076e+01  1.239e+02  -0.733 0.463709    
IsNewYearEve          8.826e+02  1.818e+02   4.855 1.22e-06 ***
StarRating            3.592e+03  1.108e+02  32.434  < 2e-16 ***
Airport               9.510e+00  3.171e+00   2.999 0.002709 ** 
FreeWifi              5.498e+02  2.242e+02   2.452 0.014214 *  
FreeBreakfast         1.688e+02  1.233e+02   1.369 0.171163    
HotelCapacity        -1.028e+01  1.033e+00  -9.945  < 2e-16 ***
HasSwimmingPool       2.153e+03  1.616e+02  13.327  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6601 on 13219 degrees of freedom
Multiple R-squared:  0.1906,    Adjusted R-squared:  0.1898 
F-statistic: 259.3 on 12 and 13219 DF,  p-value: < 2.2e-16

4.22 Best Predictors

library(leaps)
model1 <- RoomRent~Population+CityRank+IsMetroCity+IsTouristDestination+IsWeekend+IsNewYearEve+StarRating+Airport+FreeWifi+
            FreeBreakfast+HotelCapacity+HasSwimmingPool
leap1 <- regsubsets(model1, data = hotel, nbest=1)
plot(leap1, scale="adjr2")

4.23 Regression model 2 on the basis of best predictors

Respnse variable is “RoomRent”

fit1 <- lm(RoomRent~Population+IsMetroCity+IsTouristDestination+IsNewYearEve+StarRating+Airport+HotelCapacity
          +HasSwimmingPool, data=hotel)
summary(fit1)

Call:
lm(formula = RoomRent ~ Population + IsMetroCity + IsTouristDestination + 
    IsNewYearEve + StarRating + Airport + HotelCapacity + HasSwimmingPool, 
    data = hotel)

Residuals:
   Min     1Q Median     3Q    Max 
-11798  -2358   -704   1030 309571 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)          -1.229e+04  4.509e+02 -27.252  < 2e-16 ***
Population           -1.214e-04  2.261e-05  -5.372 7.92e-08 ***
IsMetroCity          -6.274e+02  2.132e+02  -2.943 0.003258 ** 
IsTouristDestination  1.900e+03  1.373e+02  13.843  < 2e-16 ***
IsNewYearEve          8.429e+02  1.739e+02   4.847 1.27e-06 ***
StarRating            3.613e+03  1.103e+02  32.742  < 2e-16 ***
Airport               9.544e+00  2.711e+00   3.520 0.000432 ***
HotelCapacity        -1.055e+01  1.027e+00 -10.268  < 2e-16 ***
HasSwimmingPool       2.133e+03  1.598e+02  13.354  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6602 on 13223 degrees of freedom
Multiple R-squared:   0.19, Adjusted R-squared:  0.1895 
F-statistic: 387.6 on 8 and 13223 DF,  p-value: < 2.2e-16

4.24 Adjusted R-squared and AIC values of both models

summary(fit)$adj.r.squared # model1
[1] 0.1898256
summary(fit1)$adj.r.squared # model 2
[1] 0.1894769
AIC(fit) # model1
[1] 270314.1
AIC(fit1) # model2
[1] 270315.8

Here, Adj. R-Squared value of model 1 is slightly larger then model 2 and also AIC valus of model 1 is slightly lesser then model2. So, model 1 wins.

4.25 Visualizing Beta coefficients from model 1

library(coefplot)
coefplot(fit,intercept= FALSE, outerCI=1.96)

4.26 Logistic Regression model 1

newfit <- glm(RoomRent~Population+CityRank+IsMetroCity+IsTouristDestination+IsWeekend+IsNewYearEve+StarRating+Airport+FreeWifi+
            FreeBreakfast+HotelCapacity+HasSwimmingPool ,data=hotel)
summary(newfit)

Call:
glm(formula = RoomRent ~ Population + CityRank + IsMetroCity + 
    IsTouristDestination + IsWeekend + IsNewYearEve + StarRating + 
    Airport + FreeWifi + FreeBreakfast + HotelCapacity + HasSwimmingPool, 
    data = hotel)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-11845   -2356    -690    1030  309689  

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)          -1.353e+04  6.586e+02 -20.542  < 2e-16 ***
Population           -1.188e-04  3.592e-05  -3.307 0.000945 ***
CityRank              1.821e+00  1.035e+01   0.176 0.860302    
IsMetroCity          -6.640e+02  2.164e+02  -3.068 0.002158 ** 
IsTouristDestination  1.925e+03  1.481e+02  13.001  < 2e-16 ***
IsWeekend            -9.076e+01  1.239e+02  -0.733 0.463709    
IsNewYearEve          8.826e+02  1.818e+02   4.855 1.22e-06 ***
StarRating            3.592e+03  1.108e+02  32.434  < 2e-16 ***
Airport               9.510e+00  3.171e+00   2.999 0.002709 ** 
FreeWifi              5.498e+02  2.242e+02   2.452 0.014214 *  
FreeBreakfast         1.688e+02  1.233e+02   1.369 0.171163    
HotelCapacity        -1.028e+01  1.033e+00  -9.945  < 2e-16 ***
HasSwimmingPool       2.153e+03  1.616e+02  13.327  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 43566804)

    Null deviance: 7.1149e+11  on 13231  degrees of freedom
Residual deviance: 5.7591e+11  on 13219  degrees of freedom
AIC: 270314

Number of Fisher Scoring iterations: 2

Here, we can see that with logistic regression, FreeWifi has significance over Room Rent. Now, Removing variables in logistic regression model2 that have no significance over Room Rent to improve the model.

4.27 Logistic Regression model 2

newfit1 <- glm(RoomRent~Population+IsMetroCity+IsTouristDestination+IsNewYearEve+StarRating+Airport+FreeWifi+
            HotelCapacity+HasSwimmingPool ,data=hotel)
summary(newfit1)

Call:
glm(formula = RoomRent ~ Population + IsMetroCity + IsTouristDestination + 
    IsNewYearEve + StarRating + Airport + FreeWifi + HotelCapacity + 
    HasSwimmingPool, data = hotel)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-11839   -2385    -691    1045  309532  

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)          -1.343e+04  6.187e+02 -21.698  < 2e-16 ***
Population           -1.244e-04  2.263e-05  -5.499 3.88e-08 ***
IsMetroCity          -6.369e+02  2.132e+02  -2.988  0.00282 ** 
IsTouristDestination  1.918e+03  1.374e+02  13.958  < 2e-16 ***
IsNewYearEve          8.430e+02  1.739e+02   4.849 1.26e-06 ***
StarRating            3.598e+03  1.104e+02  32.582  < 2e-16 ***
Airport               1.001e+01  2.716e+00   3.684  0.00023 ***
FreeWifi              5.952e+02  2.217e+02   2.685  0.00726 ** 
HotelCapacity        -1.040e+01  1.029e+00 -10.115  < 2e-16 ***
HasSwimmingPool       2.147e+03  1.598e+02  13.434  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 43565102)

    Null deviance: 7.1149e+11  on 13231  degrees of freedom
Residual deviance: 5.7602e+11  on 13222  degrees of freedom
AIC: 270311

Number of Fisher Scoring iterations: 2
coefplot(newfit1,intercept= FALSE, outerCI=1.96)

Linear Regression model 1 has AIC value = 270314.1 Logisitc Regression model 2 has AIC value = 270311

So, Logistic Regression model 2 is better than Linear Regression model 1.

5. Result

Hypothesis :-

H1: Price of hotel room is higher if starraing is high than Price of hotel room if starrating is low.

H2: Price of Hotel Room is higher at tourist destination than Price of Hotel Room at non-tourist destination.

H3: Price of Hotel Room is higher if the hotel Capacity is full than Price of Hotel Room if the hotel capacity is low.

Running T-Test on these three hypothesis, we found that these hypothesis are true.

6. Conclusion

We have considered all 18 factors on room rent(response variable) to see how the pricing strategy of hotel room changes and we found that not all these 18 factors have significance effect on pricing strategy of hotel rooms. Pricing Startegy of a hotel room changes positvely if it has a Swimming Pool, Free Wifi, Star Rating of hotel is high, on new year eve, at tourist destination and negatively related with metro city means if it is a metro city, there might be some possible chances of price of a hotel room is low and also population factor, Airport distance from hotel and hotel capacity has also a significance effect over the pricing strategy of hotel room. Overall, these are the factors which effect the pricing starategy of a hotel room.

LS0tDQp0aXRsZTogIkhvdGVsIFJvb20gUHJpY2luZyBBbmFseXNpcyINCmF1dGhvcjogIlJvb3BhayBLcmlzaG5hIg0KZGF0ZTogIjI2IEphbnVhcnkgMjAxOCINCm91dHB1dDoNCiAgDQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KICAgIA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQojI1Byb2plY3QgdGl0bGUgOiBIb3RlbCBSb29tIFByaWNpbmcgQW5hbHlzaXMNCg0KIyNOYW1lIDogUm9vcGFrIEtyaXNobmENCg0KIyNFbWFpbCA6IHJ1cGFra3Jpc2huYTI4QGdtYWlsLmNvbQ0KDQojI0NvbGxlZ2U6IEpheXBlZSBVbml2ZXJzaXR5IG9mIEVuZ2luZWVyaW5nICYgVGVjaG5vbG9neSwgR3VuYQ0KDQojIzEuIEludHJvZHVjdGlvbg0KQSBob3RlbCBpcyBhbiBlc3RhYmxpc2htZW50IHRoYXQgcHJvdmlkZXMgcGFpZCBsb2RnaW5nIG9uIGEgc2hvcnQtdGVybSBiYXNpcy4gRmFjaWxpdGllcyBwcm92aWRlZCBtYXkgcmFuZ2UgZnJvbSBhIG1vZGVzdC1xdWFsaXR5IG1hdHRyZXNzIGluIGEgc21hbGwgcm9vbSB0byBsYXJnZSBzdWl0ZXMgd2l0aCBiaWdnZXIsIGhpZ2hlci1xdWFsaXR5IGJlZHMsIGEgZHJlc3NlciwgYSByZWZyaWdlcmF0b3IgYW5kIG90aGVyIGtpdGNoZW4gZmFjaWxpdGllcywgdXBob2xzdGVyZWQgY2hhaXJzLCBhIGZsYXRzY3JlZW4gdGVsZXZpc2lvbiBhbmQgZW4tc3VpdGUgYmF0aHJvb21zLiBTbWFsbCwgbG93ZXItcHJpY2VkIGhvdGVscyBtYXkgb2ZmZXIgb25seSB0aGUgbW9zdCBiYXNpYyBndWVzdCBzZXJ2aWNlcyBhbmQgZmFjaWxpdGllcy4gTGFyZ2VyLCBoaWdoZXItcHJpY2VkIGhvdGVscyBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIGd1ZXN0IGZhY2lsaXRpZXMgc3VjaCBhcyBhIHN3aW1taW5nIHBvb2wsIGJ1c2luZXNzIGNlbnRyZSAod2l0aCBjb21wdXRlcnMsIHByaW50ZXJzIGFuZCBvdGhlciBvZmZpY2UgZXF1aXBtZW50KSwgY2hpbGRjYXJlLCBjb25mZXJlbmNlIGFuZCBldmVudCBmYWNpbGl0aWVzLCB0ZW5uaXMgb3IgYmFza2V0YmFsbCBjb3VydHMsIGd5bW5hc2l1bSwgcmVzdGF1cmFudHMsIGRheSBzcGEgYW5kIHNvY2lhbCBmdW5jdGlvbiBzZXJ2aWNlcywgV2lmaSwgQnJlYWtmYXN0LiBBbmQgYWxzbywgUHJpY2Ugb2YgSG90ZWwgcm9vbSBjaGFuZ2VzIG9jY2FzaW9uYWxseSBsaWtlIGlmIHRoZSBkYXkgaXMgYSBuZXcgeWVhciwgSXMgaXQgYSBtZXRybyBjaXR5LCBJcyBpdCBhIFRvdXJpc3QgRGVzdGluYXRpb24sIElzIGl0IGEgV2Vla2VuZCBvciBsaWtlIG5vcm1hbCBkYXlzLg0KDQojIzIuIE92ZXJ2aWV3IG9mIHRoZSBTdHVkeQ0KT3VyIHN0dWR5IGNvbmNlcm5zIHRoZSBTdHJhdGVneSBvZiBob3RlbCByb29tIHByaWNlcyBjb25zaWRlcmluZyB2YXJpb3VzIGZhY3RvcnMuIFRoZSBob3RlbCBpbmR1c3RyeSBhcHBlYXJzIHRvIGJlIHF1aXRlIGdsYW1vcm91cyBhbmQgZXhjaXRpbmcgdG8gYWxsIG9mIHVzLiBUb3AgY2xhc3MgaG9zcGl0YWxpdHksIHdlbGwtZXF1aXBwZWQgcm9vbXMsIGZhbmN5IGZhY2lsaXRpZXMsIGV0Yy4gLSBhbGwgdGhpcyBpcyBkb25lIHdpdGggYW4gYWltIHRvIGNyZWF0ZSBhIHNlYW1sZXNzbHkgcGxlYXNhbnQgZXhwZXJpZW5jZSBmb3IgZ3Vlc3RzLiBOZWVkbGVzcyB0byBzYXksIGFsbCB0aGlzIGNvbWVzIGF0IGEgcHJpY2Ugd2hpY2ggdGhlIGd1ZXN0IGFjdHVhbGx5IGhhcyB0byBwYXkuDQoNCkEgaG9zdCBvZiB0ZWNobm9sb2d5LWRyaXZlbiBob3RlbCByZXZlbnVlIG1hbmFnZW1lbnQgc3lzdGVtcyBhbmQgcHJvY2Vzc2VzIGFyZSByZXF1aXJlZCB0byBiZSBwdXQgaW4gcGxhY2UsIGFuZCBzb21lIGdvb2QgcGVvcGxlIGFuZCBwcm9jZWR1cmVzIG5lZWQgdG8gYmUgZW1wbG95ZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGN1c3RvbWVyIGdldHMgdGhlIGJlc3Qgc2hhcmUgb2Ygb2ZmZXJpbmdzLCBwcmljZSBiZWluZyB0aGUgbW9zdCBpbXBvcnRhbnQgY29tcG9uZW50Lg0KDQpTZXR0aW5nIHlvdXIgcHJpY2VzIHdpdGhvdXQgYSB0aG9yb3VnaCBncmFzcCBvZiB5b3VyIG92ZXJhbGwgb2JqZWN0aXZlcyBjYW4gZGVzdHJveSBhbnkgYnJhbmQtYnVpbGRpbmcgZWZmb3J0cy5XZWxsLCBwcmljaW5nIGlzIGNlcnRhaW5seSBjcml0aWNhbCB0byB0aGUgc3VjY2VzcyBvZiBhbGwgaG90ZWxzIGFuZCBhIHdlbGwtZGVzaWduZWQgcHJpY2luZyBzdHJhdGVneSBjYW4gZG8gd29uZGVycyBieSBnaXZpbmcgYSBzdHJvbmcgcHVzaCB0byB0aGUgaG90ZWwgcmV2ZW51ZXMuIA0KSW4gdGhpcyBTdHVkeSAsIHdlIGhhdmUgdG90YWwgb2YgMTkgZmVhdHVyZXMgb2YgaG90ZWxzIGFuZCBvbiB0aGUgYmFzaXMgb2YgdGhlc2UgZmVhdHVyZXMsIHdlIGFyZSBkb2luZyBvdXIgYW5hbHlzaXMgYW5kIHRyeWluZyB0byBmaW5kIG91dCB0aG9zZSBmZWF0dXJlcyB3aGljaCBoYXZlIHNpZ25pZmljYW50bHkgZWZmZWN0IG9uIHRoZSBQcmljaW5nIFN0cmF0ZWd5IG9mIGhvdGVsIHJvb21zLg0KDQoqKkh5cG90aGVzaXMgOi0gKioNCg0KKipIMSoqKjogUHJpY2Ugb2YgaG90ZWwgcm9vbSBpcyBoaWdoZXIgaWYgc3RhcnJhaW5nIGlzIGhpZ2ggdGhhbiBQcmljZSBvZiBob3RlbCByb29tIGlmIHN0YXJyYXRpbmcgaXMgbG93LioNCg0KKipIMioqKjogUHJpY2Ugb2YgSG90ZWwgUm9vbSBpcyBoaWdoZXIgYXQgdG91cmlzdCBkZXN0aW5hdGlvbiB0aGFuIFByaWNlIG9mIEhvdGVsIFJvb20gYXQgbm9uLXRvdXJpc3QgZGVzdGluYXRpb24uKg0KDQoqKkgzKioqOiBQcmljZSBvZiBIb3RlbCBSb29tICBpcyBoaWdoZXIgaWYgdGhlIGhvdGVsIENhcGFjaXR5IGlzIGZ1bGwgdGhhbiBQcmljZSBvZiBIb3RlbCBSb29tIGlmIHRoZSBob3RlbCBjYXBhY2l0eSBpcyBsb3cuKg0KDQojIzMuIERhdGENClRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgZnJvbSBodHRwczovL2luLmhvdGVscy5jb20vIGluIE9jdG9iZXIgMjAxNi4NCg0KRGF0YXNldCB0cmFja3MgaG90ZWwgcHJpY2VzIG9uIDggZGlmZmVyZW50IGRhdGVzIGF0IGRpZmZlcmVudCBob3RlbHMgYWNyb3NzIGRpZmZlcmVudCBjaXRpZXMuDQoNCk1hbnkgZXh0ZXJuYWwgZmFjdG9ycyBjYW4gcG90ZW50aWFsbHkgaW5mbHVlbmNlIHRoZSBSb29tUmVudC4gVGhlIGRhdGFzZXQgY2FwdHVyZXMgOCBleHRlcm5hbCBmYWN0b3JzLCAxMCBpbnRlcm5hbCBmYWN0b3JzIGFuZCBvZmNvdXJzZSBSb29tUmVudCBmYWN0b3IuDQoNCg0KIyMzLjEgUmVhZGluZyBhbGwgdGhlIGRhdGENCg0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KaG90ZWwgPC0gcmVhZC5jc3YocGFzdGUoIkNpdGllczQyLmNzdiIpLHNlcD0iLCIpDQpWaWV3KGhvdGVsKQ0KYGBgDQoNCiMjMy4yIFN0YXRpc3RpY3Mgb2YgVmFyaWFibGVzDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkocHN5Y2gpDQpkZXNjcmliZShob3RlbClbLGMoMyw0LDUsOCw5KV0NCmBgYA0KDQojIzMuMyBDb252ZXJ0aW5nIENhdGVnb3JpYWNhbCB2YWx1ZSBpbnRvIG1lYW5pbmdmdWwgdmFsdWVzDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCiNJc01ldHJvY2l0eQ0KaG90ZWwkSXNNZXRyb0NpdHlbaG90ZWwkSXNNZXRyb0NpdHkgPT0gMV0gPC0gJ1llcyBNZXRyb0NpdHknDQpob3RlbCRJc01ldHJvQ2l0eVtob3RlbCRJc01ldHJvQ2l0eSA9PSAwXSA8LSAnTm8gTWV0cm9DaXR5Jw0KDQpob3RlbCRJc01ldHJvQ2l0eSA8LSBhcy5mYWN0b3IoaG90ZWwkSXNNZXRyb0NpdHkpDQoNCiNJc1dlZWtlbmQNCmhvdGVsJElzV2Vla2VuZFtob3RlbCRJc1dlZWtlbmQgPT0gMV0gPC0gJ1llcyBXZWVrZW5kJw0KaG90ZWwkSXNXZWVrZW5kW2hvdGVsJElzV2Vla2VuZCA9PSAwXSA8LSAnTm8gV2Vla2VuZCcNCg0KaG90ZWwkSXNXZWVrZW5kIDwtIGFzLmZhY3Rvcihob3RlbCRJc1dlZWtlbmQpDQoNCiNJc1RvdXJpc3REZXN0aW5hdGlvbg0KaG90ZWwkSXNUb3VyaXN0RGVzdGluYXRpb25baG90ZWwkSXNUb3VyaXN0RGVzdGluYXRpb24gPT0gMV0gPC0gJ1llcyBUb3VyaXN0RGVzdGluYXRpb24nDQpob3RlbCRJc1RvdXJpc3REZXN0aW5hdGlvbltob3RlbCRJc1RvdXJpc3REZXN0aW5hdGlvbiA9PSAwXSA8LSAnTm8gVG91cnNpdERlc3RpbmF0aW9uJw0KDQpob3RlbCRJc1RvdXJpc3REZXN0aW5hdGlvbiA8LSBhcy5mYWN0b3IoaG90ZWwkSXNUb3VyaXN0RGVzdGluYXRpb24pDQoNCiNJc05ld1llYXJFdmUNCmhvdGVsJElzTmV3WWVhckV2ZVtob3RlbCRJc05ld1llYXJFdmUgPT0gMV0gPC0gJ1llcyBOZXdZZWFyJw0KaG90ZWwkSXNOZXdZZWFyRXZlW2hvdGVsJElzTmV3WWVhckV2ZSA9PSAwXSA8LSAnTm8gTmV3WWVhcicNCg0KaG90ZWwkSXNOZXdZZWFyRXZlIDwtIGFzLmZhY3Rvcihob3RlbCRJc05ld1llYXJFdmUpDQoNCiNGcmVlV2lmaQ0KaG90ZWwkRnJlZVdpZmlbaG90ZWwkRnJlZVdpZmkgPT0gMV0gPC0gJ1llcyBXaWZpJw0KaG90ZWwkRnJlZVdpZmlbaG90ZWwkRnJlZVdpZmkgPT0gMF0gPC0gJ05vIFdpZmknDQoNCmhvdGVsJEZyZWVXaWZpIDwtIGFzLmZhY3Rvcihob3RlbCRGcmVlV2lmaSkNCg0KI0ZyZWVCcmVha2Zhc3QNCmhvdGVsJEZyZWVCcmVha2Zhc3RbaG90ZWwkRnJlZUJyZWFrZmFzdCA9PSAxXSA8LSAnWWVzIEJyZWFrZmFzdCcNCmhvdGVsJEZyZWVCcmVha2Zhc3RbaG90ZWwkRnJlZUJyZWFrZmFzdCA9PSAwXSA8LSAnTm8gQnJlYWtmYXN0Jw0KDQpob3RlbCRGcmVlQnJlYWtmYXN0IDwtIGFzLmZhY3Rvcihob3RlbCRGcmVlQnJlYWtmYXN0KQ0KDQojSGFzU3dpbW1pbmdQb29sDQpob3RlbCRIYXNTd2ltbWluZ1Bvb2xbaG90ZWwkSGFzU3dpbW1pbmdQb29sID09IDFdIDwtICdZZXMgU3dpbW1pbmdQb29sJw0KaG90ZWwkSGFzU3dpbW1pbmdQb29sW2hvdGVsJEhhc1N3aW1taW5nUG9vbCA9PSAwXSA8LSAnTm8gU3dpbW1pbmdQb29sJw0KDQpob3RlbCRIYXNTd2ltbWluZ1Bvb2wgPC0gYXMuZmFjdG9yKGhvdGVsJEhhc1N3aW1taW5nUG9vbCkNCmBgYA0KDQojIzMuNCBTdHJ1Y3R1cmUgb2YgdmFyaWFibGVzDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCnN0cihob3RlbCkNCmBgYA0KDQojIzQuIEFuYWx5c2lzIA0KDQojNC4xIENpdHlOYW1lDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCnRhYmxlKGhvdGVsJENpdHlOYW1lKQ0KYGBgDQoNCiM0LjIgUG9wdWxhdGlvbg0KDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpjb3VudCA8LSBhZ2dyZWdhdGUoaG90ZWwkUG9wdWxhdGlvbixieT1saXN0KENJdHluYW1lPWhvdGVsJENpdHlOYW1lKSxtZWFuKQ0KbWluKGNvdW50JHgpICNtaW5pbXVtIHBvcHVsYXRpb24NCmNvdW50JENJdHluYW1lW2NvdW50JHg9PTgwOTZdICMgQ2l0eSBuYW1lIHdpdGggbWluaW11bSBwb3B1bGF0aW9uDQptYXgoY291bnQkeCkgI21heGltdW0gcG9wdWxhdGlvbg0KY291bnQkQ0l0eW5hbWVbY291bnQkeD09MTI0NDIzNzNdICNjaXR5IG5hbWUgd2l0aCBtYXhpbXVtIHBvcHVsYXRpb24NCmBgYA0KDQojNC40IENpdHlSYW5rIGJ5IFBvcHVsYXRpb24NCg0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KcGxvdChob3RlbCRDaXR5UmFuayxob3RlbCRQb3B1bGF0aW9uLGNvbD0iZGFya2JsdWUiLG1haW49IkNpdHkgcmFuayBieSBwb3B1bGF0aW9uIix4bGFiID0gIkNpdHkgUmFuayIseWxhYiA9ICJQb3B1bGF0aW9uIikNCmBgYA0KDQojIzQuNSBJcyBNZXRybyBDaXR5ID8NCg0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KdGFibGUoaG90ZWwkSXNNZXRyb0NpdHkpDQpiYXJwbG90KHRhYmxlKGhvdGVsJElzTWV0cm9DaXR5KSwgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIElzTWV0cm9DaXR5IiwgeGxhYj0iSXMgYSBNZXRybyBDaXR5PyIsIGNvbD0iYmx1ZSIpDQpgYGANCg0KIyM0LjYgQXZlcmFnZSBSb29tIFJlbnQgT2YgYSBNZXRyb0NpdHkvTm90IGEgTWV0cm9DaXR5DQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmNvdW50IDwtIGFnZ3JlZ2F0ZShob3RlbCRSb29tUmVudCxieT1saXN0KE1ldHJvY2l0eT1ob3RlbCRJc01ldHJvQ2l0eSksbWVhbikNCmNvdW50DQpgYGANCg0KIyM0LjcgVG91cmlzdCBEZXN0aW5hdGlvbiANCg0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KdGFibGUoaG90ZWwkSXNUb3VyaXN0RGVzdGluYXRpb24pICNOdW1iZXIgb2YgVG91cmlzdCBkZXN0aW5hdGlvbiBvciBub3QNCmNvdW50IDwtIGFnZ3JlZ2F0ZShob3RlbCRSb29tUmVudCxieT1saXN0KFRvdXJzaXREZXN0aW5hdGlvbiA9IGhvdGVsJElzVG91cmlzdERlc3RpbmF0aW9uKSxtZWFuKQ0KY291bnQgIyBSb29tIFJlbnQgYWNjb3JkaW5nIHRvIHRvdXJpc3QgZGVzdGluYXRpb24gb3Igbm90DQpgYGANCg0KIyM0LjggV2Vla2VuZCANCg0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KdGFibGUoaG90ZWwkSXNXZWVrZW5kKSAjTnVtYmVyIG9mIFdlZWtlbmRzIGFuZCB3ZWVrIGRheXMoTm8gV2Vla2VuZCkNCmNvdW50IDwtIGFnZ3JlZ2F0ZShob3RlbCRSb29tUmVudCxieT1saXN0KFdlZWtlbmQgPSBob3RlbCRJc1dlZWtlbmQpLG1lYW4pDQpjb3VudCAjUm9vbSBSZW50IGFjY29yZGluZyB0byB3ZWVrZW5kIG9yIG5vdA0KYGBgDQoNCiMjNC45IFJvb20gUmVudCBvbiB0aGUgYmFzaXMgb2YgV2Vla2VuZCAsIE1ldHJvQ2l0eSBhbmQgVG91cmlzdCBEZXN0aW5hdGlvbg0KDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQpjb3VudCA8LSBhZ2dyZWdhdGUoUm9vbVJlbnR+SXNXZWVrZW5kK0lzTWV0cm9DaXR5K0lzVG91cmlzdERlc3RpbmF0aW9uLGRhdGE9aG90ZWwsbWVhbikNCmNvdW50DQoNCiNHcmFwaCBvZiBkaWZmZXJlbmNlIGluIE1vbmV5IG9uIFdlZWtlbmQgb3Igbm90DQpxcGxvdChSb29tUmVudCwgZGF0YSA9IGNvdW50LCBnZW9tID0gImRlbnNpdHkiLGNvbG9yID0gSXNXZWVrZW5kLCBsaW5ldHlwZSA9IElzV2Vla2VuZCx4bGFiPSJSb29tIFJlbnQgaW4gSW5kaWFuIHJ1cGVlcyIsDQogICAgICB5bGFiPSJEZW5zaXR5IiwgbWFpbj0iUm9vbVJlbnQgVlMgSXNXZWVrZW5kIikNCg0KI0dyYXBoIG9mIGRpZmZlcmVuY2UgaW4gTW9uZXkgaW4gTWV0cm9DaXR5IG9yIG5vdA0KcXBsb3QoUm9vbVJlbnQsIGRhdGEgPSBjb3VudCwgZ2VvbSA9ICJkZW5zaXR5Iixjb2xvciA9IElzTWV0cm9DaXR5LCBsaW5ldHlwZSA9IElzTWV0cm9DaXR5LHhsYWI9IlJvb20gUmVudCBpbiBJbmRpYW4gcnVwZWVzIiwNCiAgICAgIHlsYWI9IkRlbnNpdHkiLG1haW49IlJvb21SZW50IFZTIElzTWV0cm9DaXR5IikNCg0KI0dyYXBoIG9mIGRpZmZlcmVuY2UgaW4gTW9uZXkgYXQgVG91cmlzdCBEZXN0aW5hdGlvbiBvciBub3QNCnFwbG90KFJvb21SZW50LCBkYXRhID0gY291bnQsIGdlb20gPSAiZGVuc2l0eSIsY29sb3IgPSBJc1RvdXJpc3REZXN0aW5hdGlvbiwgbGluZXR5cGUgPSBJc1RvdXJpc3REZXN0aW5hdGlvbiwNCiAgICAgIHhsYWI9IlJvb20gUmVudCBpbiBJbmRpYW4gcnVwZWVzIix5bGFiPSJEZW5zaXR5IixtYWluPSJSb29tUmVudCBWUyBJc1RvdXJpc3REZXN0aW5hdGlvbiIpDQoNCiNHcmFwaCBvZiBkaWZmZXJlbmNlIGluIE1vbmV5IG9uIHRoZSBiYXNpcyBvZiB3ZWVrZW5kLCBtZXRyb2NpdHkgYW5kIHRvdXJpc3RkZXN0aW5hdGlvbg0KcXBsb3QoUm9vbVJlbnQsIGRhdGEgPSBjb3VudCwgZmFjZXRzID0gSXNXZWVrZW5kfklzTWV0cm9DaXR5K0lzVG91cmlzdERlc3RpbmF0aW9uKQ0KDQpgYGANCg0KDQojIzQuMTAgTmV3WWVhckV2ZQ0KDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQp0YWJsZShob3RlbCRJc05ld1llYXJFdmUpICNOdW1iZXIgb2YgTmV3IFllYXIgRXZlIG9yIG5vdA0KY291bnQgPC0gYWdncmVnYXRlKGhvdGVsJFJvb21SZW50LGJ5PWxpc3QoSXNOZXdZZWFyRXZlID0gaG90ZWwkSXNOZXdZZWFyRXZlKSxtZWFuKQ0KY291bnQgI1Jvb20gUmVudCBvbiB0aGUgYmFzaXMgb2YgTmV3IFllYXIgRXZlIG9yIG5vdA0KDQojR3JhcGggb2YgZGlmZmVyZW5jZSBpbiBNb25leSBvbiBOZXcgWWVhciBvciBub3QNCnFwbG90KHgsIGRhdGEgPSBjb3VudCwgZ2VvbSA9ICJkZW5zaXR5Iixjb2xvciA9IElzTmV3WWVhckV2ZSwgbGluZXR5cGUgPSBJc05ld1llYXJFdmUseGxhYj0iUm9vbSBSZW50IGluIEluZGlhbiAgICAgIHJ1cGVlcyIseWxhYj0iRGVuc2l0eSIsbWFpbj0iUm9vbVJlbnQgVlMgSXNOZXdZZWFyRSIpDQpgYGANCg0KIyM0LjExIFJvb21SZW50DQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCm1pbihob3RlbCRSb29tUmVudCkgIyBtaW5pbXVtIHJvb20gcmVudA0KbWF4KGhvdGVsJFJvb21SZW50KSAjIG1heGltdW0gcm9vbSByZW50DQpgYGANCg0KIyM0LjEyIFN0YXIgUmF0aW5nDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShsYXR0aWNlKQ0KdGFibGUoaG90ZWwkU3RhclJhdGluZykgI051bWJlciBvZiBob3RlbCBvbiB0aGUgYmFzaXMgb2YgU3RhclJhdGluZw0KY291bnQgPC0gYWdncmVnYXRlKGNiaW5kKFBvcHVsYXRpb24sUm9vbVJlbnQpflN0YXJSYXRpbmcsZGF0YT1ob3RlbCxtZWFuKQ0KY291bnQgIyBTdGFyUmF0aW5nIG9uIHRoZSBiYXNpcyBvZiBwb3B1bGF0aW9uIGFuZCByb29tcmVudA0KDQojU2NhdHRlciBwbG90IG9mIFBvcHVsYXRpb24gYWdhaW5zdCBSb29tIFJlbnQNCnNjYXR0ZXJwbG90KGNvdW50JFBvcHVsYXRpb24sY291bnQkUm9vbVJlbnQgLCBtYWluPSJQb3B1bGF0aW9uICYgUm9vbVJlbnQiLGxhYmVscz1yb3cubmFtZXMoY291bnQpLHhsYWI9IlBvcHVsYXRpb24iLHlsYWI9IlJvb21SZW50IikNCiNTY2F0dGVyIHBsb3Qgb2YgU3RhclJhdGluZyBhZ2FpbnN0IFJvb20gUmVudA0Kc2NhdHRlcnBsb3QoY291bnQkU3RhclJhdGluZyxjb3VudCRSb29tUmVudCAsIG1haW49IlN0YXJSYXRpbmcgJiBSb29tUmVudCIsbGFiZWxzPXJvdy5uYW1lcyhjb3VudCkseGxhYj0iU3RhclJhdGluZyIseWxhYj0iUm9vbVJlbnQiKQ0KDQpgYGANCg0KIyM0LjEzIEFpcnBvcnQgZGlzdGFuY2UgZnJvbSBob3RlbA0KDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpjb3VudCA8LSBhZ2dyZWdhdGUoY2JpbmQoQWlycG9ydCxSb29tUmVudCl+U3RhclJhdGluZyxkYXRhPWhvdGVsLG1lYW4pDQpjb3VudCAjIFN0YXJSYXRpbmcgb2YgSG90ZWxzIG9uIHRoZSBiYXNpcyBvZiBBaXJwb3J0IGRpc3RhbmNlIGZyb20gaG90ZWwgYW5kIFJvb20gUmVudA0KDQojU2NhdHRlcnBsb3Qgb2YgQWlycG9ydCBkaXN0YW5jZSBmcm9tIGhvdGVsIGFnYWluc3QgUm9vbSBSZW50DQpzY2F0dGVycGxvdChjb3VudCRBaXJwb3J0LGNvdW50JFJvb21SZW50ICwgbWFpbj0iQWlycG9ydCBkaXN0YW5jZSAmIFJvb21SZW50IixsYWJlbHM9cm93Lm5hbWVzKGNvdW50KSx4bGFiPSJBaXJwb3J0IGRpc3RhbmNlIGZyb20gaG90ZWwiLHlsYWI9IlJvb21SZW50IikNCg0KI0dyYXBoKENvbWJpbmVkIGppdHRlcnBsb3QgYW5kIGJveHBsb3QpIG9mIEFpcnBvcnQgZGlzdGFuY2UgZnJvbSBob3RlbCBhZ2FpbnN0IFN0YXJSYXRpbmcgb2YgaG90ZWwNCnFwbG90KFN0YXJSYXRpbmcsIEFpcnBvcnQsIGRhdGEgPSBjb3VudCxnZW9tPWMoImJveHBsb3QiLCAiaml0dGVyIikpDQpgYGANCg0KIyM0LjE0IEZyZWUgV2lmaSwgRnJlZSBCcmVha2Zhc3QsIEhhcyBTd2ltbWluZ1Bvb2wNCg0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KY291bnQgPC0geHRhYnMofkZyZWVXaWZpK0ZyZWVCcmVha2Zhc3QrSGFzU3dpbW1pbmdQb29sLGRhdGE9aG90ZWwpDQpmdGFibGUocHJvcC50YWJsZShjb3VudCkpKjEwMCAjUHJvcG9ydGlvbiBvZiBob3RlbCBvbiB0aGUgYmFzaXMgb2Ygd2lmaSwgYnJlYWtmYXN0IGFuZCBzd2ltbWluZ3Bvb2wNCmBgYA0KDQojIzQuMTUgUm9vbSBSZW50IG9uIHRoZSBiYXNpcyBvZiBicmVha2Zhc3QsIHdpZmkgYW5kIHN3aW1taW5ncG9vbA0KDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpjb3VudCA8LSBhZ2dyZWdhdGUoUm9vbVJlbnR+RnJlZUJyZWFrZmFzdCtGcmVlV2lmaStIYXNTd2ltbWluZ1Bvb2wsZGF0YT1ob3RlbCxtZWFuKQ0KY291bnQNCg0KI0dyYXBoIG9mIGRpZmZlcmVuY2UgaW4gbW9uZXkgb24gdGhlIGJhc2lzIG9mIGJyZWFrZmFzdCwgd2lmaSBhbmQgc3dpbW1pbmdwb29sDQpxcGxvdChSb29tUmVudCwgZGF0YSA9IGNvdW50LCBmYWNldHMgPSBGcmVlQnJlYWtmYXN0fkZyZWVXaWZpK0hhc1N3aW1taW5nUG9vbCkNCg0KI0JveCBhbmQgV2hpc2tlciBQbG90IG9mIFN3aW1taW5nIHBvb2wgb3Igbm90IGluIGhvdGVsIGFjY29yZGluZyB0byBSb29tIFJlbnQgDQpid3Bsb3QoSGFzU3dpbW1pbmdQb29sIH4gUm9vbVJlbnQsIGRhdGE9Y291bnQsIGhvcml6b250YWw9VFJVRSwgDQp4bGFiID0gIlJvb20gUmVudCIseWxhYj0iU3dpbW1pbmcgcG9vbCIsbWFpbj0iUm9vbSBSZW50ICYgU3dpbW1pbmcgcG9vbCIpDQoNCiNCb3ggYW5kIFdoaXNrZXIgUGxvdCBvZiBGcmVlIEJyZWFrZmFzdCBvciBub3QgaW4gaG90ZWwgYWNjb3JkaW5nIHRvIFJvb20gUmVudA0KYndwbG90KEZyZWVCcmVha2Zhc3QgfiBSb29tUmVudCwgZGF0YT1jb3VudCwgaG9yaXpvbnRhbD1UUlVFLCANCnhsYWIgPSAiUm9vbSBSZW50Iix5bGFiPSJGcmVlIEJyZWFrZmFzdCIsbWFpbj0iUm9vbSBSZW50ICYgRnJlZSBCcmVha2Zhc3QiKQ0KDQojQm94IGFuZCBXaGlza2VyIFBsb3Qgb2YgRnJlZSBXaWZpIG9yIG5vdCBpbiBob3RlbCBhY2NvcmRpbmcgdG8gUm9vbSBSZW50DQpid3Bsb3QoRnJlZVdpZmkgfiBSb29tUmVudCwgZGF0YT1jb3VudCwgaG9yaXpvbnRhbD1UUlVFLCANCnhsYWIgPSAiUm9vbSBSZW50Iix5bGFiPSJGcmVlIFdpZmkiLG1haW49IlJvb20gUmVudCAmIEZyZWUgV2lmaSIpDQpgYGANCg0KIyM0LjE2IEhvdGVsIENhcGFjaXR5DQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCiNwbG90IG9mIHJvb20gcmVudCBhY2NvcmRpbmcgdG8gaG90ZWwgY2FwYWNpdHkNCnBsb3QoaG90ZWwkSG90ZWxDYXBhY2l0eSxob3RlbCRSb29tUmVudCx4bGFiPSJIb3RlbCBDYXBhY2l0eSIseWxhYj0iUm9vbSBSZW50IixtYWluPSJSb29tIFJlbnQgYWNjb3JkaW5nIHRvIGhvdGVsIGNhcGFjaXR5ICIpIA0KDQojR3JhcGgoSGlzdG9ncmFtICsgRGVuc2l0eSkgb2YgZGlzdHJpYnV0aW9uIG9mIEhvdGVsIGNhcGFjaXR5IGluIHRoZSBkYXRhDQpnZ3Bsb3QoZGF0YT1ob3RlbCkgK2dlb21faGlzdG9ncmFtKCBhZXMoSG90ZWxDYXBhY2l0eSwgLi5kZW5zaXR5Li4pICkgKyANCiAgZ2VvbV9kZW5zaXR5KCBhZXMoSG90ZWxDYXBhY2l0eSwgLi5kZW5zaXR5Li4pICkgKyBnZW9tX3J1ZyggYWVzKEhvdGVsQ2FwYWNpdHkpICkNCmBgYA0KDQojIzQuMTcgQ29ycmVsYXRpb25zDQoNCkEpICBSb29tIFJlbnQgdmVyc3VzIG90aGVyIHZhcmlhYmxlcw0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0Kc2NhdHRlcnBsb3RNYXRyaXgoflJvb21SZW50K0lzV2Vla2VuZCtJc01ldHJvQ2l0eStJc1RvdXJpc3REZXN0aW5hdGlvbixkYXRhPWhvdGVsLGNleD0wLjYsc3ByZWFkPUZBTFNFLCBzbW9vdGhlci5hcmdzPWxpc3QobHR5PTIpDQogICAgICAgICAgICAgICAgICAsbWFpbj0iUm9vbSBSZW50IHZlcnN1cyBvdGhlciB2YXJpYWJsZXMiKQ0KYGBgDQoNCkIpICBSb29tIFJlbnQgdmVyc3VzIG90aGVyIHZhcmlhYmxlcw0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0Kc2NhdHRlcnBsb3RNYXRyaXgoflJvb21SZW50K0lzTmV3WWVhckV2ZStQb3B1bGF0aW9uLGRhdGE9aG90ZWwsY2V4PTAuNixzcHJlYWQ9RkFMU0UsIHNtb290aGVyLmFyZ3M9bGlzdChsdHk9MikNCiAgICAgICAgICAgICAgICAgICxtYWluPSJSb29tIFJlbnQgdmVyc3VzIG90aGVyIHZhcmlhYmxlcyIpDQpgYGANCg0KQykgIFJvb20gUmVudCB2ZXJzdXMgb3RoZXIgdmFyaWFibGVzDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpzY2F0dGVycGxvdE1hdHJpeCh+Um9vbVJlbnQrU3RhclJhdGluZytGcmVlV2lmaStGcmVlQnJlYWtmYXN0LGRhdGE9aG90ZWwsY2V4PTAuNixzcHJlYWQ9RkFMU0UsIHNtb290aGVyLmFyZ3M9bGlzdChsdHk9MikNCiAgICAgICAgICAgICAgICAgICxtYWluPSJSb29tIFJlbnQgdmVyc3VzIG90aGVyIHZhcmlhYmxlcyIpDQpgYGANCg0KRCkgIFJvb20gUmVudCB2ZXJzdXMgb3RoZXIgdmFyaWFibGVzDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpzY2F0dGVycGxvdE1hdHJpeCh+Um9vbVJlbnQrSG90ZWxDYXBhY2l0eStIYXNTd2ltbWluZ1Bvb2wsZGF0YT1ob3RlbCxjZXg9MC42LHNwcmVhZD1GQUxTRSwgc21vb3RoZXIuYXJncz1saXN0KGx0eT0yKQ0KICAgICAgICAgICAgICAgICAgLG1haW49IlJvb20gUmVudCB2ZXJzdXMgb3RoZXIgdmFyaWFibGVzIikNCmBgYA0KDQojIzMuNSBSZS1Db252ZXJ0aW5nIHRoZSBmYWN0b3IgdmFyaWFibGUgZm9yIGNhbGN1bGF0aW5nIGNvcnJlbGF0aW9uDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmhvdGVsJElzTWV0cm9DaXR5ID0gYXMuaW50ZWdlcihob3RlbCRJc01ldHJvQ2l0eSwgbGV2ZWxzID0gYygnWWVzIE1ldHJvQ2l0eScsJ05vIE1ldHJvQ2l0eScpLGxhYmVscyA9IGMoMSwgMCkpDQoNCmhvdGVsJElzV2Vla2VuZCA9IGFzLmludGVnZXIoaG90ZWwkSXNXZWVrZW5kLCBsZXZlbHMgPSBjKCdZZXMgV2Vla2VuZCcsJ05vIFdlZWtlbmQnKSxsYWJlbHMgPSBjKDEsIDApKQ0KDQpob3RlbCRJc1RvdXJpc3REZXN0aW5hdGlvbiA9IGFzLmludGVnZXIoaG90ZWwkSXNUb3VyaXN0RGVzdGluYXRpb24sIGxldmVscyA9IGMoJ1llcyBUb3VyaXN0RGVzdGluYXRpb24nLCdObyBUb3VyaXN0RGVzdGluYXRpb24nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKDEsIDApKQ0KDQpob3RlbCRJc05ld1llYXJFdmUgPSBhcy5pbnRlZ2VyKGhvdGVsJElzTmV3WWVhckV2ZSwgbGV2ZWxzID0gYygnWWVzIE5ld1llYXInLCdObyBOZXdZZWFyJyksIGxhYmVscyA9IGMoMSwgMCkpDQoNCmhvdGVsJEZyZWVXaWZpID0gYXMuaW50ZWdlcihob3RlbCRGcmVlV2lmaSwgbGV2ZWxzID0gYygnWWVzIFdpZmknLCdObyBXaWZpJyksIGxhYmVscyA9IGMoMSwgMCkpDQoNCmhvdGVsJEZyZWVCcmVha2Zhc3QgPSBhcy5pbnRlZ2VyKGhvdGVsJEZyZWVCcmVha2Zhc3QsIGxldmVscyA9IGMoJ1llcyBCcmVha2Zhc3QnLCdObyBCcmVha2Zhc3QnKSwgbGFiZWxzID0gYygxLCAwKSkNCg0KaG90ZWwkSGFzU3dpbW1pbmdQb29sID0gYXMuaW50ZWdlcihob3RlbCRIYXNTd2ltbWluZ1Bvb2wsIGxldmVscyA9IGMoJ1llcyBTd2ltbWluZ1Bvb2wnLCdObyBTd2ltbWluZ1Bvb2wnKSwgbGFiZWxzID0gYygxLCAwKSkNCg0KYGBgDQoNCg0KIyM0LjE4IENvcnJlbGF0aW9uIE1hdHJpeA0KDQpBKSAgQ29ycmVsYXRpb24gbWF0cml4IDEgDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KEhtaXNjKQ0KY29saG90ZWwzIDwtIGMoIlBvcHVsYXRpb24iLCJJc01ldHJvQ2l0eSIsIklzV2Vla2VuZCIsIklzVG91cmlzdERlc3RpbmF0aW9uIiwiUm9vbVJlbnQiKQ0KY29yTWF0cml4IDwtIHJjb3JyKGFzLm1hdHJpeChob3RlbFssY29saG90ZWwzXSkpDQpjb3JNYXRyaXgNCmBgYA0KDQpCKSAgQ29ycmVsYXRpb24gbWF0cml4IDINCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmNvbGhvdGVsMyA8LSBjKCJJc05ld1llYXJFdmUiLCJGcmVlV2lmaSIsIkZyZWVCcmVha2Zhc3QiLCJIYXNTd2ltbWluZ1Bvb2wiLCJTdGFyUmF0aW5nIiwiUm9vbVJlbnQiLCJIb3RlbENhcGFjaXR5IikNCmNvck1hdHJpeCA8LSByY29ycihhcy5tYXRyaXgoaG90ZWxbLGNvbGhvdGVsM10pKQ0KY29yTWF0cml4DQpgYGANCg0KDQojIzQuMTkgQ29ycmdyYW0gb2YgYWxsIHZhcmlhYmxlcw0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShjb3JyZ3JhbSkNCmNvcnJncmFtKGhvdGVsLCBvcmRlcj1UUlVFLCB1cHBlci5wYW5lbD1wYW5lbC5jb3IsIG1haW49IlZhcmlhYmxlcyIpDQpgYGANCg0KIyM0LjIwIFQtdGVzdHMNCg0KQSkgIFQtdGVzdCBvbiBzdGFycmF0aW5nIGFuZCByb29tcmVudA0KDQpIMTogUHJpY2Ugb2YgaG90ZWwgcm9vbSBpcyBoaWdoZXIgaWYgc3RhcnJhaW5nIGlzIGhpZ2ggdGhhbiBQcmljZSBvZiBob3RlbCByb29tIGlmIHN0YXJyYXRpbmcgaXMgbG93Lg0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KdC50ZXN0KGhvdGVsJFN0YXJSYXRpbmcsaG90ZWwkUm9vbVJlbnQpDQpgYGANCkFTIFAtdmFsdWUgaXMgbGVzcyB0aGFuIDAuMDUsIG91ciBoeXBvdGhlc2lzIGlzIHRydWUuDQoNCkIpICBULXRlc3Qgb24gSXNNZXRyb2NpdHkgYW5kIFJvb21SZW50DQoNCkgyOiBQcmljZSBvZiBIb3RlbCBSb29tIGlzIGhpZ2hlciBhdCB0b3VyaXN0IGRlc3RpbmF0aW9uIHRoYW4gUHJpY2Ugb2YgSG90ZWwgUm9vbSBhdCBub24tdG91cmlzdCBkZXN0aW5hdGlvbi4NCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCnQudGVzdChob3RlbCRJc1RvdXJpc3REZXN0aW5hdGlvbixob3RlbCRSb29tUmVudCkNCmBgYA0KQXMgUC12YWx1ZSBpcyBsZXNzIHRoYW4gMC4wNSwgb3VyIGh5cG90aGVzaXMgaXMgdHJ1ZS4NCg0KQykgIFQtdGVzdCBvbiBSb29tUmVudCBhbmQgSG90ZWxDYXBhY2l0eQ0KDQpIMzogUHJpY2Ugb2YgSG90ZWwgUm9vbSAgaXMgaGlnaGVyIGlmIHRoZSBob3RlbCBDYXBhY2l0eSBpcyBmdWxsIHRoYW4gUHJpY2Ugb2YgSG90ZWwgUm9vbSBpZiB0aGUgaG90ZWwgY2FwYWNpdHkgaXMgbG93Lg0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KdC50ZXN0KGhvdGVsJFJvb21SZW50LGhvdGVsJEhvdGVsQ2FwYWNpdHkpDQpgYGANCk91ciBQLVZhbHVlIGlzIGxlc3MgdGhhbiAwLjA1LiBTbywgb3VyIEh5cG90aGVzaXMgaXMgdHJ1ZS4NCg0KIyM0LjIxIExpbmVhciBSZWdyZXNzaW9uIG1vZGVsIDENCg0KUmVzcG5zZSB2YXJpYWJsZSBpcyAiUm9vbVJlbnQiDQoNCldlIHByb3Bvc2VkIHRoZSBmb2xsb3dpbmcgbW9kZWw6DQoNCiQkUm9vbVJlbnQ9IFxhbHBoYV8wICsgXGFscGhhXzEgIFBvcHVsYXRpb24gKyBcYWxwaGFfMiAgQ2l0eVJhbmsgKyBcYWxwaGFfMyAgSXNNZXRyb0NpdHkgKyBcYWxwaGFfNCBJc1RvdXJpc3REZXN0aW5hdGlvbiArIFxhbHBoYV81IElzV2Vla2VuZCtcYWxwaGFfNiBJc05ld1llYXJFdmUgJCQNCiQkICsgXGFscGhhXzcgU3RhclJhdGluZyArIFxhbHBoYV84IEFpcnBvcnQgKyBcYWxwaGFfOSBGcmVlV2lmaSArIFxhbHBoYV8xMCBGcmVlQnJlYWtmYXN0ICtcYWxwaGFfMTEgSG90ZWxDYXBhY2l0eSArXGFscGhhXzEyIEhhc1N3aW1taW5nUG9vbCtcZXBzaWxvbiQkDQpXZSBhcmUgY29uc2lkZXJpbmcgYWxsIHRoZSBQcmVkaWN0b3JzIGluIG91ciBtb2RlbC4gTGF0ZXIsIHRob3NlIHByZWRpY3RvcnMgaGF2ZSBub3Qgc2lnbmlmaWNhbnRhbGx5IGVmZmVjdCBvbiBSb29tIFJlbnQsIHdlIHdpbGwgcmVtb3ZlIHRoZW0gZm9yIGdvb2QuDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmZpdCA8LSBsbShSb29tUmVudH5Qb3B1bGF0aW9uK0NpdHlSYW5rK0lzTWV0cm9DaXR5K0lzVG91cmlzdERlc3RpbmF0aW9uK0lzV2Vla2VuZCtJc05ld1llYXJFdmUrU3RhclJhdGluZytBaXJwb3J0K0ZyZWVXaWZpKw0KICAgICAgICAgICAgRnJlZUJyZWFrZmFzdCtIb3RlbENhcGFjaXR5K0hhc1N3aW1taW5nUG9vbCwgZGF0YT1ob3RlbCkNCnN1bW1hcnkoZml0KQ0KYGBgDQoNCiMjNC4yMiBCZXN0IFByZWRpY3RvcnMNCg0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShsZWFwcykNCm1vZGVsMSA8LSBSb29tUmVudH5Qb3B1bGF0aW9uK0NpdHlSYW5rK0lzTWV0cm9DaXR5K0lzVG91cmlzdERlc3RpbmF0aW9uK0lzV2Vla2VuZCtJc05ld1llYXJFdmUrU3RhclJhdGluZytBaXJwb3J0K0ZyZWVXaWZpKw0KICAgICAgICAgICAgRnJlZUJyZWFrZmFzdCtIb3RlbENhcGFjaXR5K0hhc1N3aW1taW5nUG9vbA0KbGVhcDEgPC0gcmVnc3Vic2V0cyhtb2RlbDEsIGRhdGEgPSBob3RlbCwgbmJlc3Q9MSkNCnBsb3QobGVhcDEsIHNjYWxlPSJhZGpyMiIpDQpgYGANCg0KIyM0LjIzIFJlZ3Jlc3Npb24gbW9kZWwgMiBvbiB0aGUgYmFzaXMgb2YgYmVzdCBwcmVkaWN0b3JzDQoNClJlc3Buc2UgdmFyaWFibGUgaXMgIlJvb21SZW50IiANCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmZpdDEgPC0gbG0oUm9vbVJlbnR+UG9wdWxhdGlvbitJc01ldHJvQ2l0eStJc1RvdXJpc3REZXN0aW5hdGlvbitJc05ld1llYXJFdmUrU3RhclJhdGluZytBaXJwb3J0K0hvdGVsQ2FwYWNpdHkNCiAgICAgICAgICArSGFzU3dpbW1pbmdQb29sLCBkYXRhPWhvdGVsKQ0Kc3VtbWFyeShmaXQxKQ0KYGBgDQoNCiMjNC4yNCBBZGp1c3RlZCBSLXNxdWFyZWQgYW5kIEFJQyB2YWx1ZXMgb2YgYm90aCBtb2RlbHMNCg0KYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0Kc3VtbWFyeShmaXQpJGFkai5yLnNxdWFyZWQgIyBtb2RlbDENCg0Kc3VtbWFyeShmaXQxKSRhZGouci5zcXVhcmVkICMgbW9kZWwgMg0KDQpBSUMoZml0KSAjIG1vZGVsMQ0KDQpBSUMoZml0MSkgIyBtb2RlbDINCmBgYA0KDQpIZXJlLCBBZGouIFItU3F1YXJlZCB2YWx1ZSBvZiBtb2RlbCAxIGlzIHNsaWdodGx5IGxhcmdlciB0aGVuIG1vZGVsIDIgYW5kIGFsc28gQUlDIHZhbHVzIG9mIG1vZGVsIDEgaXMgc2xpZ2h0bHkgbGVzc2VyIHRoZW4gbW9kZWwyLg0KU28sIG1vZGVsIDEgd2lucy4NCg0KIyM0LjI1IFZpc3VhbGl6aW5nIEJldGEgY29lZmZpY2llbnRzIGZyb20gbW9kZWwgMQ0KDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGNvZWZwbG90KQ0KY29lZnBsb3QoZml0LGludGVyY2VwdD0gRkFMU0UsIG91dGVyQ0k9MS45NikNCmBgYA0KDQojIzQuMjYgTG9naXN0aWMgUmVncmVzc2lvbiBtb2RlbCAxDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCm5ld2ZpdCA8LSBnbG0oUm9vbVJlbnR+UG9wdWxhdGlvbitDaXR5UmFuaytJc01ldHJvQ2l0eStJc1RvdXJpc3REZXN0aW5hdGlvbitJc1dlZWtlbmQrSXNOZXdZZWFyRXZlK1N0YXJSYXRpbmcrQWlycG9ydCtGcmVlV2lmaSsNCiAgICAgICAgICAgIEZyZWVCcmVha2Zhc3QrSG90ZWxDYXBhY2l0eStIYXNTd2ltbWluZ1Bvb2wgLGRhdGE9aG90ZWwpDQpzdW1tYXJ5KG5ld2ZpdCkNCmBgYA0KDQpIZXJlLCB3ZSBjYW4gc2VlIHRoYXQgd2l0aCBsb2dpc3RpYyByZWdyZXNzaW9uLCBGcmVlV2lmaSBoYXMgc2lnbmlmaWNhbmNlIG92ZXIgUm9vbSBSZW50Lg0KTm93LCBSZW1vdmluZyB2YXJpYWJsZXMgaW4gbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbDIgdGhhdCBoYXZlIG5vIHNpZ25pZmljYW5jZSBvdmVyIFJvb20gUmVudCB0byBpbXByb3ZlIHRoZSBtb2RlbC4NCg0KIyM0LjI3IExvZ2lzdGljIFJlZ3Jlc3Npb24gbW9kZWwgMg0KDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpuZXdmaXQxIDwtIGdsbShSb29tUmVudH5Qb3B1bGF0aW9uK0lzTWV0cm9DaXR5K0lzVG91cmlzdERlc3RpbmF0aW9uK0lzTmV3WWVhckV2ZStTdGFyUmF0aW5nK0FpcnBvcnQrRnJlZVdpZmkrDQogICAgICAgICAgICBIb3RlbENhcGFjaXR5K0hhc1N3aW1taW5nUG9vbCAsZGF0YT1ob3RlbCkNCnN1bW1hcnkobmV3Zml0MSkNCmNvZWZwbG90KG5ld2ZpdDEsaW50ZXJjZXB0PSBGQUxTRSwgb3V0ZXJDST0xLjk2KQ0KYGBgDQoNCkxpbmVhciBSZWdyZXNzaW9uIG1vZGVsIDEgaGFzIEFJQyB2YWx1ZSA9IDI3MDMxNC4xDQpMb2dpc2l0YyBSZWdyZXNzaW9uIG1vZGVsIDIgaGFzIEFJQyB2YWx1ZSA9IDI3MDMxMQ0KDQpTbywgTG9naXN0aWMgUmVncmVzc2lvbiBtb2RlbCAyIGlzIGJldHRlciB0aGFuIExpbmVhciBSZWdyZXNzaW9uIG1vZGVsIDEuDQoNCiMjNS4gUmVzdWx0DQoNCioqSHlwb3RoZXNpcyA6LSAqKg0KDQoqKkgxKioqOiBQcmljZSBvZiBob3RlbCByb29tIGlzIGhpZ2hlciBpZiBzdGFycmFpbmcgaXMgaGlnaCB0aGFuIFByaWNlIG9mIGhvdGVsIHJvb20gaWYgc3RhcnJhdGluZyBpcyBsb3cuKg0KDQoqKkgyKioqOiBQcmljZSBvZiBIb3RlbCBSb29tIGlzIGhpZ2hlciBhdCB0b3VyaXN0IGRlc3RpbmF0aW9uIHRoYW4gUHJpY2Ugb2YgSG90ZWwgUm9vbSBhdCBub24tdG91cmlzdCBkZXN0aW5hdGlvbi4qDQoNCioqSDMqKio6IFByaWNlIG9mIEhvdGVsIFJvb20gIGlzIGhpZ2hlciBpZiB0aGUgaG90ZWwgQ2FwYWNpdHkgaXMgZnVsbCB0aGFuIFByaWNlIG9mIEhvdGVsIFJvb20gaWYgdGhlIGhvdGVsIGNhcGFjaXR5IGlzIGxvdy4qDQoNClJ1bm5pbmcgVC1UZXN0IG9uIHRoZXNlIHRocmVlIGh5cG90aGVzaXMsIHdlIGZvdW5kIHRoYXQgdGhlc2UgaHlwb3RoZXNpcyBhcmUgdHJ1ZS4NCg0KIyM2LiBDb25jbHVzaW9uDQoNCldlIGhhdmUgY29uc2lkZXJlZCBhbGwgMTggZmFjdG9ycyBvbiByb29tIHJlbnQocmVzcG9uc2UgdmFyaWFibGUpIHRvIHNlZSBob3cgdGhlIHByaWNpbmcgc3RyYXRlZ3kgb2YgaG90ZWwgcm9vbSBjaGFuZ2VzIGFuZCB3ZSBmb3VuZCB0aGF0IG5vdCBhbGwgdGhlc2UgMTggZmFjdG9ycyBoYXZlIHNpZ25pZmljYW5jZSBlZmZlY3Qgb24gcHJpY2luZyBzdHJhdGVneSBvZiBob3RlbCByb29tcy4NClByaWNpbmcgU3RhcnRlZ3kgb2YgYSBob3RlbCByb29tIGNoYW5nZXMgcG9zaXR2ZWx5IGlmIGl0IGhhcyBhIFN3aW1taW5nIFBvb2wsIEZyZWUgV2lmaSwgU3RhciBSYXRpbmcgb2YgaG90ZWwgaXMgaGlnaCwgb24gbmV3IHllYXIgZXZlLCBhdCB0b3VyaXN0IGRlc3RpbmF0aW9uIGFuZCBuZWdhdGl2ZWx5IHJlbGF0ZWQgd2l0aCBtZXRybyBjaXR5IG1lYW5zIGlmIGl0IGlzIGEgbWV0cm8gY2l0eSwgdGhlcmUgbWlnaHQgYmUgc29tZSBwb3NzaWJsZSBjaGFuY2VzIG9mIHByaWNlIG9mIGEgaG90ZWwgcm9vbSBpcyBsb3cgYW5kIGFsc28gcG9wdWxhdGlvbiBmYWN0b3IsIEFpcnBvcnQgZGlzdGFuY2UgZnJvbSBob3RlbCBhbmQgaG90ZWwgY2FwYWNpdHkgaGFzIGFsc28gYSBzaWduaWZpY2FuY2UgZWZmZWN0IG92ZXIgdGhlIHByaWNpbmcgc3RyYXRlZ3kgb2YgaG90ZWwgcm9vbS4NCk92ZXJhbGwsIHRoZXNlIGFyZSB0aGUgZmFjdG9ycyB3aGljaCBlZmZlY3QgdGhlIHByaWNpbmcgc3RhcmF0ZWd5IG9mIGEgaG90ZWwgcm9vbS4NCg0KDQo=