Please download and load data “Assignment_1.Rdata” from Canvas.

load("Assignment_1.Rdata")
ls()
## [1] "CLV_data"      "Conjoint_data" "lik_bgnbd"     "pred_Y"

Question 1

This question uses “Conjoint_data”:

head(Conjoint_data)
## # A tibble: 6 x 8
##   respondent_id profile form        noapply   disinfect bio   price    choice
##           <dbl>   <dbl> <fct>       <fct>     <fct>     <fct> <fct>     <dbl>
## 1             1       1 Concentrate 200 times Yes       No    35 cents      1
## 2             1       2 Powder      200 times Yes       No    35 cents      0
## 3             1       3 Premix      100 times Yes       Yes   49 cents      1
## 4             1       4 Powder      200 times Yes       Yes   49 cents      0
## 5             1       5 Powder      50 times  Yes       No    79 cents      0
## 6             1       6 Concentrate 200 times No        Yes   79 cents      0

Question 1a

We first have to set the baselines for different attributes, using “relevel(.)”. You may also use “mapply” or other packages for this purpose.

# to set baselines for all attributes
Conjoint_data$form <- relevel(Conjoint_data$form,ref = "Powder")
Conjoint_data$noapply <- relevel(Conjoint_data$noapply,ref = "200 times")
Conjoint_data$disinfect <- relevel(Conjoint_data$disinfect,ref = "No")
Conjoint_data$bio <- relevel(Conjoint_data$bio,ref = "No")
Conjoint_data$price <- relevel(Conjoint_data$price,ref = "35 cents")

# double check if the baselines are set as wanted
lapply(Conjoint_data[,3:7],contrasts)
## $form
##             Concentrate Premix
## Powder                0      0
## Concentrate           1      0
## Premix                0      1
## 
## $noapply
##           100 times 50 times
## 200 times         0        0
## 100 times         1        0
## 50 times          0        1
## 
## $disinfect
##     Yes
## No    0
## Yes   1
## 
## $bio
##     Yes
## No    0
## Yes   1
## 
## $price
##          49 cents 79 cents
## 35 cents        0        0
## 49 cents        1        0
## 79 cents        0        1

We then run a logistic regression with “Conjoint_data” using “choice” as the binary outcome.

mdl <- glm(choice ~ . - respondent_id - profile, family = "binomial", data = Conjoint_data)
summary(mdl)
## 
## Call:
## glm(formula = choice ~ . - respondent_id - profile, family = "binomial", 
##     data = Conjoint_data)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.1680  -0.7913   0.3276   0.8173   2.1374  
## 
## Coefficients:
##                  Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        1.1357     0.4662   2.436 0.014859 *  
## formConcentrate    0.6482     0.3293   1.968 0.049035 *  
## formPremix        -0.2519     0.3347  -0.753 0.451638    
## noapply100 times  -0.2335     0.3457  -0.675 0.499416    
## noapply50 times   -0.5904     0.3601  -1.639 0.101111    
## disinfectYes       1.1143     0.2998   3.717 0.000202 ***
## bioYes             0.2762     0.2862   0.965 0.334477    
## price49 cents     -1.3828     0.3609  -3.831 0.000128 ***
## price79 cents     -3.0606     0.3810  -8.034 9.46e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 449.25  on 329  degrees of freedom
## Residual deviance: 348.95  on 321  degrees of freedom
## AIC: 366.95
## 
## Number of Fisher Scoring iterations: 4

Grading for Question 1a

For this question, the coefficients and stanard errors should be consistent with the suggested solutions. From the results, we have 8 coefficients with {“formConcentrate”, “formPremix”, “noapply100 times”, “noapply50 times”, “disinfectYes”, bioYes“,”price49 cents“,”price79 cents"}, with each coefficient \(0.5\) point and each standard error also \(0.25\) point, so the total is \(8\times0.5+8\times0.25=6\).

Question 1b

To calculate the partworths, we must apply the 3 rules:

  1. Partworths of baselines are zeros;
  2. Partworths of significant levels are the original coefficients;
  3. Partworths of the insignificant levels are zeros.
# create a list of partworths with each attribute as an element
# initialize all values to zeros
partworths <- lapply(mdl$xlevels,function(x){x <- rep(0,length(x))})
change_names <- function (x,y) {
  names(x) <- y
  return(x)
}
partworths <- mapply(change_names,partworths,mdl$xlevels)

# set partworths of significant levels to original coefficients
partworths$form["Concentrate"] <- mdl$coefficients["formConcentrate"]
partworths$disinfect["Yes"] <- mdl$coefficients["disinfectYes"]
partworths$price[c("49 cents","79 cents")] <- mdl$coefficients[c("price49 cents","price79 cents")]
partworths
## $form
##      Powder Concentrate      Premix 
##   0.0000000   0.6481925   0.0000000 
## 
## $noapply
## 200 times 100 times  50 times 
##         0         0         0 
## 
## $disinfect
##       No      Yes 
## 0.000000 1.114257 
## 
## $bio
##  No Yes 
##   0   0 
## 
## $price
##  35 cents  49 cents  79 cents 
##  0.000000 -1.382753 -3.060619

Grading Question 1b

For this question, all partworths should be same as the suggested solutions. We have in total 13 partworths, with each 0.45 point.

Question 1c

The most preferred product should give consumers the highest utility. We focus on levels that have the maximum partworth for different attributes.

Attributes Levels
Form Concentrate
No of Apps Any level
Disinfect Yes
Biodegradable Any level
Price 35 cents


Grading for Question 1c

For this question, there are 5 attributes, the point of each attribute is 0.6, so in total \(5\times0.6=3\). Note for no. of apps and biodegradable, the answer should be “any level is fine” or “consumers do not care about this attribute.”

Question 2

This question uses “CLV_data”, as well as two functions “lik_bgnbd” and “pred_Y” from Case II. You also need to use the library “hypergeo” for prediction of logins.

Question 2a

# to specify the constraint matrix
ui <- diag(4)
ci <- rep(0,4)

# para: the starting values; a vector with 4 elements corresponding to (r,alpha,a,b). 
# you can change this to other values or test different values.
para <- rep(.01,4)

# to run the constrained optimization 
results <- constrOptim(para, lik_bgnbd, NULL, ui, ci)

# to get the estimated parameters in the order of (r,alpha,a,b)
para <- results$par
names(para) <- c("r","alpha","a","b")
para
##         r     alpha         a         b 
## 0.2324974 8.9573195 1.1935137 3.1910102

Grading Question 2a

For this question, each parameter is \(2\) points, so for \({r,\alpha,a,b}\), in total \(2\times4=8\) points. Note: depending on the inital values of para, the estimated values could be somewhat different. For grading, please try to replicate the analysis with the initial values of “para” set in the assignment.

Question 2b

# To predict the future values of Gamer 1-5 in 30 days
Yhat <- rep(0,5)
names(Yhat) <- paste("Gamer",as.character(1:5),sep = "_")
for (i in 1:5) {
  Yhat[i] <- pred_Y(para,CLV_data[i,],30)
}
Yhat
##    Gamer_1    Gamer_2    Gamer_3    Gamer_4    Gamer_5 
## 0.17780954 0.24341699 0.08669631 0.75265953 0.08925523

Grading Question 2b

For this question, each parameter is \(1.2\) points, so for \(5\) gamers, in total \(1.2\times5=6\) points. Note: depending on the estimted values of paras, the predicted consumer values could be somewhat different. For grading, please try to recalculate with the estimated values of paras in Question 2a.

Question 2c

An exemplary answer:
Another source of consumer values is social influence, as gamers’ activities are influenced by other gamers. This is because most online games have some elements which incentivize or exploit social influence between gamers. To measure social influence, we can rely on the social network between gamers and apply social network analysis to identify influencers. For example, we may focus on the degree centrality of gamers (i.e., no. of friends), as previous research (e.g., Chen et al. 2017) finds that degree centrality is a good measure of people’s influence on social networks.

Grading Question 2c

For grading, please consider the following aspects:
1. Clarity of the proposed source of consumer value (1 point): the proposed consumer value should be clearly explained.
2. Validity of the proposed source of consumer value (1.5 point): the proposed consumer value should indirectly influence the active levels of gamers.
3. Clarity of the proposed method (1 point): the proposed method should be clearly described and explained.
4. Validity of the proposed method (1.5 point): the proposed method can measure the proposed source of consumer value, if applied empirically.
5. Feasbility of the proposed method (1 point): the proposed method and the data needed for the method are feasible in practices.

LS0tDQp0aXRsZTogJ0Fzc2lnbm1lbnQgMTogc3VnZ2VzdGVkIHNvbHV0aW9ucyArIHJ1YnJpY3MnDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHRpYmJsZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCiMjIyAqKlBsZWFzZSBkb3dubG9hZCBhbmQgbG9hZCBkYXRhICJBc3NpZ25tZW50XzEuUmRhdGEiIGZyb20gQ2FudmFzLioqDQpgYGB7cn0NCmxvYWQoIkFzc2lnbm1lbnRfMS5SZGF0YSIpDQpscygpDQpgYGANCg0KIyMgKipRdWVzdGlvbiAxKioNCj4gVGhpcyBxdWVzdGlvbiB1c2VzICJDb25qb2ludF9kYXRhIjogDQoNCmBgYHtyfQ0KaGVhZChDb25qb2ludF9kYXRhKQ0KYGBgDQoNCiMjIyAqKlF1ZXN0aW9uIDFhKioNCj4gV2UgZmlyc3QgaGF2ZSB0byBzZXQgdGhlIGJhc2VsaW5lcyBmb3IgZGlmZmVyZW50IGF0dHJpYnV0ZXMsIHVzaW5nICJyZWxldmVsKC4pIi4gWW91IG1heSBhbHNvIHVzZSAibWFwcGx5IiBvciBvdGhlciBwYWNrYWdlcyBmb3IgdGhpcyBwdXJwb3NlLiAgDQoNCmBgYHtyfQ0KIyB0byBzZXQgYmFzZWxpbmVzIGZvciBhbGwgYXR0cmlidXRlcw0KQ29uam9pbnRfZGF0YSRmb3JtIDwtIHJlbGV2ZWwoQ29uam9pbnRfZGF0YSRmb3JtLHJlZiA9ICJQb3dkZXIiKQ0KQ29uam9pbnRfZGF0YSRub2FwcGx5IDwtIHJlbGV2ZWwoQ29uam9pbnRfZGF0YSRub2FwcGx5LHJlZiA9ICIyMDAgdGltZXMiKQ0KQ29uam9pbnRfZGF0YSRkaXNpbmZlY3QgPC0gcmVsZXZlbChDb25qb2ludF9kYXRhJGRpc2luZmVjdCxyZWYgPSAiTm8iKQ0KQ29uam9pbnRfZGF0YSRiaW8gPC0gcmVsZXZlbChDb25qb2ludF9kYXRhJGJpbyxyZWYgPSAiTm8iKQ0KQ29uam9pbnRfZGF0YSRwcmljZSA8LSByZWxldmVsKENvbmpvaW50X2RhdGEkcHJpY2UscmVmID0gIjM1IGNlbnRzIikNCg0KIyBkb3VibGUgY2hlY2sgaWYgdGhlIGJhc2VsaW5lcyBhcmUgc2V0IGFzIHdhbnRlZA0KbGFwcGx5KENvbmpvaW50X2RhdGFbLDM6N10sY29udHJhc3RzKQ0KYGBgDQo+IFdlIHRoZW4gcnVuIGEgbG9naXN0aWMgcmVncmVzc2lvbiB3aXRoICJDb25qb2ludF9kYXRhIiB1c2luZyAiY2hvaWNlIiBhcyB0aGUgYmluYXJ5IG91dGNvbWUuIA0KDQpgYGB7cn0NCm1kbCA8LSBnbG0oY2hvaWNlIH4gLiAtIHJlc3BvbmRlbnRfaWQgLSBwcm9maWxlLCBmYW1pbHkgPSAiYmlub21pYWwiLCBkYXRhID0gQ29uam9pbnRfZGF0YSkNCnN1bW1hcnkobWRsKQ0KYGBgDQoNCiMjIyAqKkdyYWRpbmcgZm9yIFF1ZXN0aW9uIDFhKioNCj4gRm9yIHRoaXMgcXVlc3Rpb24sIHRoZSBjb2VmZmljaWVudHMgYW5kIHN0YW5hcmQgZXJyb3JzIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHN1Z2dlc3RlZCBzb2x1dGlvbnMuIEZyb20gdGhlIHJlc3VsdHMsIHdlIGhhdmUgOCBjb2VmZmljaWVudHMgd2l0aCB7ImZvcm1Db25jZW50cmF0ZSIsICJmb3JtUHJlbWl4IiwgIm5vYXBwbHkxMDAgdGltZXMiLCAibm9hcHBseTUwIHRpbWVzIiwgImRpc2luZmVjdFllcyIsIGJpb1llcyIsICJwcmljZTQ5IGNlbnRzIiwgInByaWNlNzkgY2VudHMifSwgd2l0aCBlYWNoIGNvZWZmaWNpZW50ICQwLjUkIHBvaW50IGFuZCBlYWNoIHN0YW5kYXJkIGVycm9yIGFsc28gJDAuMjUkIHBvaW50LCBzbyB0aGUgdG90YWwgaXMgJDhcdGltZXMwLjUrOFx0aW1lczAuMjU9NiQuIA0KDQojIyMgKipRdWVzdGlvbiAxYioqDQo+VG8gY2FsY3VsYXRlIHRoZSBwYXJ0d29ydGhzLCB3ZSBtdXN0IGFwcGx5IHRoZSAzIHJ1bGVzOiANCg0KMS4gUGFydHdvcnRocyBvZiBiYXNlbGluZXMgYXJlIHplcm9zOyANCjIuIFBhcnR3b3J0aHMgb2Ygc2lnbmlmaWNhbnQgbGV2ZWxzIGFyZSB0aGUgb3JpZ2luYWwgY29lZmZpY2llbnRzOyANCjMuIFBhcnR3b3J0aHMgb2YgdGhlIGluc2lnbmlmaWNhbnQgbGV2ZWxzIGFyZSB6ZXJvcy4gDQoNCmBgYHtyfQ0KIyBjcmVhdGUgYSBsaXN0IG9mIHBhcnR3b3J0aHMgd2l0aCBlYWNoIGF0dHJpYnV0ZSBhcyBhbiBlbGVtZW50DQojIGluaXRpYWxpemUgYWxsIHZhbHVlcyB0byB6ZXJvcw0KcGFydHdvcnRocyA8LSBsYXBwbHkobWRsJHhsZXZlbHMsZnVuY3Rpb24oeCl7eCA8LSByZXAoMCxsZW5ndGgoeCkpfSkNCmNoYW5nZV9uYW1lcyA8LSBmdW5jdGlvbiAoeCx5KSB7DQogIG5hbWVzKHgpIDwtIHkNCiAgcmV0dXJuKHgpDQp9DQpwYXJ0d29ydGhzIDwtIG1hcHBseShjaGFuZ2VfbmFtZXMscGFydHdvcnRocyxtZGwkeGxldmVscykNCg0KIyBzZXQgcGFydHdvcnRocyBvZiBzaWduaWZpY2FudCBsZXZlbHMgdG8gb3JpZ2luYWwgY29lZmZpY2llbnRzDQpwYXJ0d29ydGhzJGZvcm1bIkNvbmNlbnRyYXRlIl0gPC0gbWRsJGNvZWZmaWNpZW50c1siZm9ybUNvbmNlbnRyYXRlIl0NCnBhcnR3b3J0aHMkZGlzaW5mZWN0WyJZZXMiXSA8LSBtZGwkY29lZmZpY2llbnRzWyJkaXNpbmZlY3RZZXMiXQ0KcGFydHdvcnRocyRwcmljZVtjKCI0OSBjZW50cyIsIjc5IGNlbnRzIildIDwtIG1kbCRjb2VmZmljaWVudHNbYygicHJpY2U0OSBjZW50cyIsInByaWNlNzkgY2VudHMiKV0NCnBhcnR3b3J0aHMNCmBgYA0KIyMjICoqR3JhZGluZyBRdWVzdGlvbiAxYioqIA0KPiBGb3IgdGhpcyBxdWVzdGlvbiwgYWxsIHBhcnR3b3J0aHMgc2hvdWxkIGJlIHNhbWUgYXMgdGhlIHN1Z2dlc3RlZCBzb2x1dGlvbnMuIFdlIGhhdmUgaW4gdG90YWwgMTMgcGFydHdvcnRocywgd2l0aCBlYWNoIDAuNDUgcG9pbnQuIA0KDQojIyMgKipRdWVzdGlvbiAxYyoqDQpUaGUgbW9zdCBwcmVmZXJyZWQgcHJvZHVjdCBzaG91bGQgZ2l2ZSBjb25zdW1lcnMgdGhlIGhpZ2hlc3QgdXRpbGl0eS4gV2UgZm9jdXMgb24gbGV2ZWxzIHRoYXQgaGF2ZSB0aGUgbWF4aW11bSBwYXJ0d29ydGggZm9yIGRpZmZlcmVudCBhdHRyaWJ1dGVzLiBcDQoNCkF0dHJpYnV0ZXMgfCBMZXZlbHMNCi0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0NCkZvcm0gICAgICAgfCBDb25jZW50cmF0ZQ0KTm8gb2YgQXBwcyB8IEFueSBsZXZlbA0KRGlzaW5mZWN0ICB8IFllcw0KQmlvZGVncmFkYWJsZSB8IEFueSBsZXZlbA0KUHJpY2UgICAgICB8IDM1IGNlbnRzDQpcDQoNCiMjIyAqKkdyYWRpbmcgZm9yIFF1ZXN0aW9uIDFjKioNCj4gRm9yIHRoaXMgcXVlc3Rpb24sIHRoZXJlIGFyZSA1IGF0dHJpYnV0ZXMsIHRoZSBwb2ludCBvZiBlYWNoIGF0dHJpYnV0ZSBpcyAwLjYsIHNvIGluIHRvdGFsICQ1XHRpbWVzMC42PTMkLiBOb3RlIGZvciBuby4gb2YgYXBwcyBhbmQgYmlvZGVncmFkYWJsZSwgdGhlIGFuc3dlciBzaG91bGQgYmUgImFueSBsZXZlbCBpcyBmaW5lIiBvciAiY29uc3VtZXJzIGRvIG5vdCBjYXJlIGFib3V0IHRoaXMgYXR0cmlidXRlLiINCg0KIyMgKipRdWVzdGlvbiAyKioNCj4gVGhpcyBxdWVzdGlvbiB1c2VzICJDTFZfZGF0YSIsIGFzIHdlbGwgYXMgdHdvIGZ1bmN0aW9ucyAibGlrX2JnbmJkIiBhbmQgInByZWRfWSIgZnJvbSBDYXNlIElJLiBZb3UgYWxzbyBuZWVkIHRvIHVzZSB0aGUgbGlicmFyeSAiaHlwZXJnZW8iIGZvciBwcmVkaWN0aW9uIG9mIGxvZ2lucy4gDQoNCiMjIyAqKlF1ZXN0aW9uIDJhKiogDQpgYGB7cn0NCiMgdG8gc3BlY2lmeSB0aGUgY29uc3RyYWludCBtYXRyaXgNCnVpIDwtIGRpYWcoNCkNCmNpIDwtIHJlcCgwLDQpDQoNCiMgcGFyYTogdGhlIHN0YXJ0aW5nIHZhbHVlczsgYSB2ZWN0b3Igd2l0aCA0IGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gKHIsYWxwaGEsYSxiKS4gDQojIHlvdSBjYW4gY2hhbmdlIHRoaXMgdG8gb3RoZXIgdmFsdWVzIG9yIHRlc3QgZGlmZmVyZW50IHZhbHVlcy4NCnBhcmEgPC0gcmVwKC4wMSw0KQ0KDQojIHRvIHJ1biB0aGUgY29uc3RyYWluZWQgb3B0aW1pemF0aW9uIA0KcmVzdWx0cyA8LSBjb25zdHJPcHRpbShwYXJhLCBsaWtfYmduYmQsIE5VTEwsIHVpLCBjaSkNCg0KIyB0byBnZXQgdGhlIGVzdGltYXRlZCBwYXJhbWV0ZXJzIGluIHRoZSBvcmRlciBvZiAocixhbHBoYSxhLGIpDQpwYXJhIDwtIHJlc3VsdHMkcGFyDQpuYW1lcyhwYXJhKSA8LSBjKCJyIiwiYWxwaGEiLCJhIiwiYiIpDQpwYXJhDQpgYGANCiMjIyAqKkdyYWRpbmcgUXVlc3Rpb24gMmEqKiANCj4gRm9yIHRoaXMgcXVlc3Rpb24sIGVhY2ggcGFyYW1ldGVyIGlzICQyJCBwb2ludHMsIHNvIGZvciAke3IsXGFscGhhLGEsYn0kLCBpbiB0b3RhbCAkMlx0aW1lczQ9OCQgcG9pbnRzLiBOb3RlOiBkZXBlbmRpbmcgb24gdGhlIGluaXRhbCB2YWx1ZXMgb2YgcGFyYSwgdGhlIGVzdGltYXRlZCB2YWx1ZXMgY291bGQgYmUgc29tZXdoYXQgZGlmZmVyZW50LiBGb3IgZ3JhZGluZywgcGxlYXNlIHRyeSB0byByZXBsaWNhdGUgdGhlIGFuYWx5c2lzIHdpdGggdGhlIGluaXRpYWwgdmFsdWVzIG9mICJwYXJhIiBzZXQgaW4gdGhlIGFzc2lnbm1lbnQuICANCg0KIyMjICoqUXVlc3Rpb24gMmIqKiANCmBgYHtyfQ0KIyBUbyBwcmVkaWN0IHRoZSBmdXR1cmUgdmFsdWVzIG9mIEdhbWVyIDEtNSBpbiAzMCBkYXlzDQpZaGF0IDwtIHJlcCgwLDUpDQpuYW1lcyhZaGF0KSA8LSBwYXN0ZSgiR2FtZXIiLGFzLmNoYXJhY3RlcigxOjUpLHNlcCA9ICJfIikNCmZvciAoaSBpbiAxOjUpIHsNCiAgWWhhdFtpXSA8LSBwcmVkX1kocGFyYSxDTFZfZGF0YVtpLF0sMzApDQp9DQpZaGF0DQpgYGANCg0KIyMjICoqR3JhZGluZyBRdWVzdGlvbiAyYioqDQo+IEZvciB0aGlzIHF1ZXN0aW9uLCBlYWNoIHBhcmFtZXRlciBpcyAkMS4yJCBwb2ludHMsIHNvIGZvciAkNSQgZ2FtZXJzLCBpbiB0b3RhbCAkMS4yXHRpbWVzNT02JCBwb2ludHMuIE5vdGU6IGRlcGVuZGluZyBvbiB0aGUgZXN0aW10ZWQgdmFsdWVzIG9mIHBhcmFzLCB0aGUgcHJlZGljdGVkIGNvbnN1bWVyIHZhbHVlcyBjb3VsZCBiZSBzb21ld2hhdCBkaWZmZXJlbnQuIEZvciBncmFkaW5nLCBwbGVhc2UgdHJ5IHRvIHJlY2FsY3VsYXRlIHdpdGggdGhlIGVzdGltYXRlZCB2YWx1ZXMgb2YgcGFyYXMgaW4gUXVlc3Rpb24gMmEuDQoNCiMjIyAqKlF1ZXN0aW9uIDJjKioNCioqQW4gZXhlbXBsYXJ5IGFuc3dlcioqOiBcDQpBbm90aGVyIHNvdXJjZSBvZiBjb25zdW1lciB2YWx1ZXMgaXMgc29jaWFsIGluZmx1ZW5jZSwgYXMgZ2FtZXJzJyBhY3Rpdml0aWVzIGFyZSBpbmZsdWVuY2VkIGJ5IG90aGVyIGdhbWVycy4gVGhpcyBpcyBiZWNhdXNlIG1vc3Qgb25saW5lIGdhbWVzIGhhdmUgc29tZSBlbGVtZW50cyB3aGljaCBpbmNlbnRpdml6ZSBvciBleHBsb2l0IHNvY2lhbCBpbmZsdWVuY2UgYmV0d2VlbiBnYW1lcnMuIFRvIG1lYXN1cmUgc29jaWFsIGluZmx1ZW5jZSwgd2UgY2FuIHJlbHkgb24gdGhlIHNvY2lhbCBuZXR3b3JrIGJldHdlZW4gZ2FtZXJzIGFuZCBhcHBseSBzb2NpYWwgbmV0d29yayBhbmFseXNpcyB0byBpZGVudGlmeSBpbmZsdWVuY2Vycy4gRm9yIGV4YW1wbGUsIHdlIG1heSBmb2N1cyBvbiB0aGUgZGVncmVlIGNlbnRyYWxpdHkgb2YgZ2FtZXJzIChpLmUuLCBuby4gb2YgZnJpZW5kcyksIGFzIHByZXZpb3VzIHJlc2VhcmNoIChlLmcuLCBDaGVuIGV0IGFsLiAyMDE3KSBmaW5kcyB0aGF0IGRlZ3JlZSBjZW50cmFsaXR5IGlzIGEgZ29vZCBtZWFzdXJlIG9mIHBlb3BsZSdzIGluZmx1ZW5jZSBvbiBzb2NpYWwgbmV0d29ya3MuIA0KDQojIyMgKipHcmFkaW5nIFF1ZXN0aW9uIDJjKioNCg0KPiBGb3IgZ3JhZGluZywgcGxlYXNlIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgYXNwZWN0czogXA0KPiAqKjEuIENsYXJpdHkgb2YgdGhlIHByb3Bvc2VkIHNvdXJjZSBvZiBjb25zdW1lciB2YWx1ZSAoMSBwb2ludCkqKjogdGhlIHByb3Bvc2VkIGNvbnN1bWVyIHZhbHVlIHNob3VsZCBiZSBjbGVhcmx5IGV4cGxhaW5lZC4gXA0KPiAqKjIuIFZhbGlkaXR5IG9mIHRoZSBwcm9wb3NlZCBzb3VyY2Ugb2YgY29uc3VtZXIgdmFsdWUgKDEuNSBwb2ludCkqKjogdGhlIHByb3Bvc2VkIGNvbnN1bWVyIHZhbHVlIHNob3VsZCBpbmRpcmVjdGx5IGluZmx1ZW5jZSB0aGUgYWN0aXZlIGxldmVscyBvZiBnYW1lcnMuIFwNCj4gKiozLiBDbGFyaXR5IG9mIHRoZSBwcm9wb3NlZCBtZXRob2QgKDEgcG9pbnQpKio6IHRoZSBwcm9wb3NlZCBtZXRob2Qgc2hvdWxkIGJlIGNsZWFybHkgZGVzY3JpYmVkIGFuZCBleHBsYWluZWQuIFwNCj4gKio0LiBWYWxpZGl0eSBvZiB0aGUgcHJvcG9zZWQgbWV0aG9kICgxLjUgcG9pbnQpKio6IHRoZSBwcm9wb3NlZCBtZXRob2QgY2FuIG1lYXN1cmUgdGhlIHByb3Bvc2VkIHNvdXJjZSBvZiBjb25zdW1lciB2YWx1ZSwgaWYgYXBwbGllZCBlbXBpcmljYWxseS4gXA0KPiAqKjUuIEZlYXNiaWxpdHkgb2YgdGhlIHByb3Bvc2VkIG1ldGhvZCAoMSBwb2ludCkqKjogdGhlIHByb3Bvc2VkIG1ldGhvZCBhbmQgdGhlIGRhdGEgbmVlZGVkIGZvciB0aGUgbWV0aG9kIGFyZSBmZWFzaWJsZSBpbiBwcmFjdGljZXMuIA0KDQoNCg0KDQoNCg==