Chapter One: An Introduction to Recommender Systems
ONE: Introduction
-Basic Idea: using different data sources to infer customer interests.
-Basic principle: significant dependencies exist between user- and item-centric activity
- \(m \times n\) rating matrix denoted by \(R\).
-User: recommendation; \(m\) is the number of users.
-item: product being recommended; \(n\) is the number of items
\(r_{ij}\): the observed rating of user \(i\) for item \(j\).
Note: similar to response matrix in DCM.
| Respondent1/User1 |
1 |
0 |
na |
0 |
na |
1 |
1 |
na |
| Respondent2/User2 |
0 |
1 |
1 |
na |
0 |
na |
1 |
1 |
| Respondent3/User3 |
na |
0 |
0 |
1 |
1 |
1 |
0 |
na |
| Respondent4/User4 |
0 |
1 |
1 |
na |
0 |
1 |
0 |
na |
Note: we have the following \(Q-matrix\) design in DCM, which is pre-defined by content experts. The \(Q-matrix\) can have simple or complex structures.
| Item1 |
1 |
0 |
1 |
1 |
0 |
1 |
| Item2 |
0 |
1 |
1 |
1 |
0 |
1 |
| Item3 |
1 |
0 |
0 |
0 |
0 |
1 |
| Item4 |
0 |
1 |
1 |
0 |
1 |
0 |
| Item5 |
0 |
1 |
0 |
1 |
1 |
0 |
| Item6 |
0 |
1 |
1 |
1 |
0 |
1 |
| Item7 |
1 |
0 |
0 |
0 |
1 |
1 |
| Item8 |
1 |
1 |
1 |
0 |
1 |
0 |
Collaborative filtering: using ratings from multiple users in a collaborative way to predict missing ratings.
DCM: using responses from different respondents to predict attributes and missing attributes.
TWO: Basic Models
a. Collaborative filtering models
Main challenge: underlying ratings matrices are sparse (but can be imputed)
- memory-based methods: neighborhood-based algorithms; regression-based models; similarity-based models.
user-based: similarity functions are computed between rows of rating matrix to discover similar users
respondent-based: to discover similar respondents with same mastery profiles.
item-based: Similarity functions are computed between the columns of the ratings matrix to discover similar items.
attribute-based: to discover similar attributes between the columns.
Advantages: simple to implement; easy to explain.
Disadvantages: not working very well with sparse ratings matrices.
- model-based methods: predictive parameterized models, such as decision trees, rule-based models, Bayesian methods and latent factor models.
Types of Ratings
interval-based: {-2, -1, 0, 1, 2} from extremely dislike to extremely like
ordinal-based: {1, 2, 3, 4, 5} from poor to excellent.
binary: {0, 1} frequently used in psychometric models.
unary: {1} to specify a liking but no disliking. not recommended
| User1 |
1 |
|
|
1 |
|
1 |
| User2 |
|
1 |
|
|
1 |
|
| User3 |
1 |
1 |
|
1 |
|
|
| User4 |
|
|
1 |
|
|
1 |
| User5 |
|
|
|
1 |
1 |
|
| User6 |
1 |
|
1 |
|
|
|
Figure 1.3: Examples of utility matrices: Unary rating (Aggarwal, 2016; p.12)
utility matrix: utility refers to the amount of profit incurred by recommending that item to the particular user.
unique attribute matrix: the most difficult item correctly responded by the particular respondent, which gives the respondent a unique mastery profile??.
Note: substitution of missing entries with any value leads to a significant amount of bias
- Collaborative filtering models with missing value analysis
b. Content-Based Recommender Systems
c. Knowledge-Based Recommender Systems
d. Demographic Recommender Systems
e. Hybrid and Ensemble-Based Recommender Systems
f. Evaluation -orthogonal to each other
THREE: Domain-Specific Challenges
a. Context-Sensitive (multidimensional?? multi-level??)
b. Time-Sensitive(process data??)
c. Location-Based (online vs offline??)
d. Social
FOUR: Advanced Topics and Applications
Chapter Two: Neighborhood-Based Collaborative Filtering
ONE: Introduction *(p. 29-p.31)
Neighborhood-based collaborative filtering algorithms : memory-based algorithm
user-based: the ratings provided by similar users to a target user A to make recommendations for A. The predicted ratings of A are computed as the weighted average values of these “peer group” ratings for each item.
respondent-based: the assumption here: respondents respond to each item independently, no dependency. Independent and identically distributed (IID).
item-based: to determine a set S of similar items to target item B. The weighted average of these ratings is used to compute the predicted rating of user A for item B.
item-based: assumption: IID for items. .
Conclusion: Different assumptions in here and in educational assessments: We assume conditional independence or local independence. i.e., the responses to an item are independent of the responses to any other item conditional on the respondent’s ability \(\theta\). In the cases of interdependency, additional latent variables such as gender, ethnicity, speededness,etc. are needed.
TWO: Key Properties of Rating Matrices *(p. 31-p.33)
Continuous ratings: any values
Interval-based ratings: 5-point or N-point scales, equidistant.
Ordinal rating: similar to interval-based, also ordered categorical; difference between pair of adjacent ratings values.
Binary ratings: two options (0/1) (M/F)
Unary rating: one option only
THREE: Predicting Ratings with Neighborhood-Based Methods *(p. 33-p.45)
- User-based Neighborhood Models : similarity functions are computed between rows of rating matrix to discover similar users
respondent-based: IID assumptions .
Step One: Compute the mean rating \(\mu_u\) for each user \(u\) using her specified ratings:
\(\mu_{u}=\frac{\sum_{k \in I_{u}} r_{u k}}{\left|I_{u}\right|} \quad \forall u \in\{1 \ldots m\}\) (2.1; p. 35)
Cosine Formula is missing??
Step Two: Pearson correlation coefficient between rows(users) \(u\) and \(v\):
\(\operatorname{Sim}(u, v)=\operatorname{Pearson}(u, v)=\frac{\sum_{k \in I_{u} \cap I_{v}}\left(r_{u k}-\mu_{u}\right) \cdot\left(r_{v k}-\mu_{v}\right)}{\sqrt{\sum_{k \in I_{u} \cap I_{v}}\left(r_{u k}-\mu_{u}\right)^{2}} \cdot \sqrt{\sum_{k \in I_{u} \cap I_{v}}\left(r_{v k}-\mu_{v}\right)^{2}}}\) (2.2; p. 35)
covariance by the product of the two variables’ standard deviations.
Step Three: mean-centered rating \(s_{uj}\):
\(s_{u j}=r_{u j}-\mu_{u} \quad \forall u \in\{1 \ldots m\}\) (2.3; p. 35)
Step Four: overall neighborhood-based prediction function:
\(\hat{r}_{u j}=\mu_{u}+\frac{\sum_{v \in P_{u}(j)} \operatorname{Sim}(u, v) \cdot s_{v j}}{\sum_{v \in P_{u}(j)}|\operatorname{Sim}(u, v)|}=\mu_{u}+\frac{\sum_{v \in P_{u}(j)} \operatorname{Sim}(u, v) \cdot\left(r_{v j}-\mu_{v}\right)}{\sum_{v \in P_{u}(j)}|\operatorname{Sim}(u, v)|}\)
Example: (p.36)
- Similarity function variants
- item-based: Similarity functions are computed between the columns of the ratings matrix to discover similar items.
- item-based: IID assumptions .
LS0tCnRpdGxlOiAiQSBSZXZpZXcgb2YgUmVjb21tZW5kZXIgU3lzdGVtIGJ5IEFnZ2Fyd2FsICgyMDE2KSIKYXV0aG9yOiBNaW5neWluZyBaaGVuZwpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPiBDaGFwdGVyIE9uZTogQW4gSW50cm9kdWN0aW9uIHRvIFJlY29tbWVuZGVyIFN5c3RlbXMgPC9zcGFuPgoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4gT05FOiBJbnRyb2R1Y3Rpb24gPC9zcGFuPgoKLSpCYXNpYyBJZGVhKjogdXNpbmcgZGlmZmVyZW50IGRhdGEgc291cmNlcyB0byBpbmZlciBjdXN0b21lciBpbnRlcmVzdHMuIAoKLSpCYXNpYyBwcmluY2lwbGUqOiBzaWduaWZpY2FudCBkZXBlbmRlbmNpZXMgZXhpc3QgYmV0d2VlbiB1c2VyLSBhbmQgaXRlbS1jZW50cmljIGFjdGl2aXR5CgotICRtIFx0aW1lcyBuJCByYXRpbmcgbWF0cml4IGRlbm90ZWQgYnkgJFIkLgogCi0qVXNlcio6IHJlY29tbWVuZGF0aW9uOyAkbSQgaXMgdGhlIG51bWJlciBvZiB1c2Vycy4KCi0qaXRlbSo6IHByb2R1Y3QgYmVpbmcgcmVjb21tZW5kZWQ7ICRuJCBpcyB0aGUgbnVtYmVyIG9mIGl0ZW1zCgokcl97aWp9JDogdGhlIG9ic2VydmVkIHJhdGluZyBvZiB1c2VyICRpJCBmb3IgaXRlbSAkaiQuIAoKPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj4gKipOb3RlKio6IHNpbWlsYXIgdG8gcmVzcG9uc2UgbWF0cml4IGluIERDTS4gPC9zcGFuPgoKfCBSZXNwb25kZW50L1VzZXJ8SXRlbTF8SXRlbTJ8SXRlbTN8SXRlbTR8SXRlbTV8SXRlbTZ8SXRlbTd8SXRlbTh8CnwgOi18Oi06fDotOnw6LTp8Oi06fDotOnw6LTp8Oi06fDotOnwKfCBSZXNwb25kZW50MS9Vc2VyMSB8MSAgIHwwICAgfG5hICAgfDAgICB8bmEgICB8MSAgIHwxICAgfG5hICAgfDAgICB8CnwgUmVzcG9uZGVudDIvVXNlcjIgfDAgICB8MSAgIHwxICAgIHxuYSAgfDAgICAgfG5hICB8MSAgIHwxICAgIHxuYSAgfAp8IFJlc3BvbmRlbnQzL1VzZXIzIHxuYSAgfDAgICB8MCAgICB8MSAgIHwxICAgIHwxICAgfDAgICB8bmEgICB8MCAgIHwKfCBSZXNwb25kZW50NC9Vc2VyNCB8MCAgIHwxICAgfDEgICAgfG5hICB8MCAgICB8MSAgIHwwICAgfG5hICAgfDAgICB8Cgo8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPiAqKk5vdGUqKjogd2UgaGF2ZSB0aGUgZm9sbG93aW5nICRRLW1hdHJpeCQgZGVzaWduIGluIERDTSwgd2hpY2ggaXMgcHJlLWRlZmluZWQgYnkgY29udGVudCBleHBlcnRzLiBUaGUgJFEtbWF0cml4JCBjYW4gaGF2ZSBzaW1wbGUgb3IgY29tcGxleCBzdHJ1Y3R1cmVzLiA8L3NwYW4+Cgp8IEl0ZW0gIHxBdHRyaWJ1dGUxfEF0dHJpYnV0ZTJ8QXR0cmlidXRlM3xBdHRyaWJ1dGU0fEF0dHJpYnV0ZTV8QXR0cmlidXRlNnwKfCA6LXw6LTp8Oi06fDotOnw6LTp8Oi06fDotOnwKfCBJdGVtMSB8IDEgfCAwIHwxIHwgMSB8MCB8IDEgfAp8IEl0ZW0yIHwgMCB8IDEgfDEgfCAxIHwwIHwgMSB8CnwgSXRlbTMgfCAxIHwgMCB8MCB8IDAgfDAgfCAxIHwKfCBJdGVtNCB8IDAgfCAxIHwxIHwgMCB8MSB8IDAgfAp8IEl0ZW01IHwgMCB8IDEgfDAgfCAxIHwxIHwgMCB8CnwgSXRlbTYgfCAwIHwgMSB8MSB8IDEgfDAgfCAxIHwKfCBJdGVtNyB8IDEgfCAwIHwwIHwgMCB8MSB8IDEgfAp8IEl0ZW04IHwgMSB8IDEgfDEgfCAwIHwxIHwgMCB8CgoqQ29sbGFib3JhdGl2ZSBmaWx0ZXJpbmcqOiB1c2luZyByYXRpbmdzIGZyb20gbXVsdGlwbGUgdXNlcnMgaW4gYSBjb2xsYWJvcmF0aXZlIHdheSB0byBwcmVkaWN0IG1pc3NpbmcgcmF0aW5ncy4gCgo8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPipEQ00qOiB1c2luZyByZXNwb25zZXMgZnJvbSBkaWZmZXJlbnQgcmVzcG9uZGVudHMgdG8gcHJlZGljdCBhdHRyaWJ1dGVzIGFuZCAqKm1pc3NpbmcqKiBhdHRyaWJ1dGVzPC9zcGFuPi4KCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+IFRXTzogQmFzaWMgTW9kZWxzIDwvc3Bhbj4KCiMjIyMgIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4gYS4gQ29sbGFib3JhdGl2ZSBmaWx0ZXJpbmcgbW9kZWxzIDwvc3Bhbj4KCipNYWluIGNoYWxsZW5nZSo6IHVuZGVybHlpbmcgcmF0aW5ncyBtYXRyaWNlcyBhcmUgc3BhcnNlIChidXQgY2FuIGJlIGltcHV0ZWQpCgoxLiAqKm1lbW9yeS1iYXNlZCBtZXRob2RzKio6IG5laWdoYm9yaG9vZC1iYXNlZCBhbGdvcml0aG1zOyByZWdyZXNzaW9uLWJhc2VkIG1vZGVsczsgc2ltaWxhcml0eS1iYXNlZCBtb2RlbHMuCgogIC0gICp1c2VyLWJhc2VkKjogc2ltaWxhcml0eSBmdW5jdGlvbnMgYXJlIGNvbXB1dGVkIGJldHdlZW4gcm93cyBvZiByYXRpbmcgbWF0cml4IHRvIGRpc2NvdmVyIHNpbWlsYXIgdXNlcnMKICAgCiAgLSA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPiAqcmVzcG9uZGVudC1iYXNlZCo6IHRvIGRpc2NvdmVyIHNpbWlsYXIgcmVzcG9uZGVudHMgd2l0aCBzYW1lIG1hc3RlcnkgcHJvZmlsZXM8L3NwYW4+LgogICAKICAtICppdGVtLWJhc2VkKjogU2ltaWxhcml0eSBmdW5jdGlvbnMgYXJlIGNvbXB1dGVkIGJldHdlZW4gdGhlICpjb2x1bW5zKiBvZiB0aGUgcmF0aW5ncyBtYXRyaXggdG8gZGlzY292ZXIgc2ltaWxhciBpdGVtcy4gCiAgCiAgLSA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPiAqYXR0cmlidXRlLWJhc2VkKjogdG8gZGlzY292ZXIgc2ltaWxhciBhdHRyaWJ1dGVzIGJldHdlZW4gdGhlICpjb2x1bW5zKjwvc3Bhbj4uCiAgCiAgLSAqKkFkdmFudGFnZXMqKjogc2ltcGxlIHRvIGltcGxlbWVudDsgZWFzeSB0byBleHBsYWluLgogICAKICAtICoqRGlzYWR2YW50YWdlcyoqOiBub3Qgd29ya2luZyB2ZXJ5IHdlbGwgd2l0aCA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5zcGFyc2U8L3NwYW4+IHJhdGluZ3MgbWF0cmljZXMuCiAgCjIuICoqbW9kZWwtYmFzZWQgbWV0aG9kcyoqOiBwcmVkaWN0aXZlIHBhcmFtZXRlcml6ZWQgbW9kZWxzLCBzdWNoIGFzIGRlY2lzaW9uIHRyZWVzLCBydWxlLWJhc2VkIG1vZGVscywgQmF5ZXNpYW4gbWV0aG9kcyBhbmQgbGF0ZW50IGZhY3RvciBtb2RlbHMuICAKICAKICAtICoqQWR2YW50YWdlcyoqOiB3b3JraW5nIHZlcnkgd2VsbCB3aXRoIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPnNwYXJzZTwvc3Bhbj4gcmF0aW5ncyBtYXRyaWNlcy4KICAgIAogIC0gPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj4gKipDb21iaW5hdGlvbnMgb2YgbWVtb3J5LWJhc2VkIGFuZCBtb2RlbC1iYXNlZCBtZXRob2RzIHByb3ZpZGUgdmVyeSBhY2N1cmF0ZSByZXN1bHRzLioqIDwvc3Bhbj4KCipUeXBlcyBvZiBSYXRpbmdzKgoKLSAqKmludGVydmFsLWJhc2VkKio6IHstMiwgLTEsIDAsIDEsIDJ9IGZyb20gZXh0cmVtZWx5IGRpc2xpa2UgdG8gZXh0cmVtZWx5IGxpa2UKCi0gKipvcmRpbmFsLWJhc2VkKio6IHsxLCAyLCAzLCA0LCA1fSBmcm9tIHBvb3IgdG8gZXhjZWxsZW50LgoKLSAqKmJpbmFyeSoqOiB7MCwgMX0gPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj4gZnJlcXVlbnRseSB1c2VkIGluIHBzeWNob21ldHJpYyBtb2RlbHM8L3NwYW4+LgoKLSAqKnVuYXJ5Kio6IHsxfSA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4gdG8gc3BlY2lmeSBhIGxpa2luZyBidXQgbm8gZGlzbGlraW5nLiAqKm5vdCByZWNvbW1lbmRlZCoqIDwvc3Bhbj4KCnwgICB8TW92aWUxfE1vdmllMnxNb3ZpZTN8TW92aWU0fE1vdmllNXxNb3ZpZTZ8CnwgOi18Oi06fDotOnw6LTp8Oi06fDotOnw6LTp8CnwgVXNlcjEgfDEgfCAgfCAgfDEgfCAgfDEgfAp8IFVzZXIyIHwgIHwxIHwgIHwgIHwxIHwgIHwKfCBVc2VyMyB8MSB8MSB8ICB8MSB8ICB8ICB8CnwgVXNlcjQgfCAgfCAgfDEgfCAgfCAgfDEgfAp8IFVzZXI1IHwgIHwgIHwgIHwxIHwxIHwgIHwKfCBVc2VyNiB8MSB8ICB8MSB8ICB8ICB8ICB8Cgo8c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPioqRmlndXJlIDEuMzogRXhhbXBsZXMgb2YgdXRpbGl0eSBtYXRyaWNlczogVW5hcnkgcmF0aW5nKiogKEFnZ2Fyd2FsLCAyMDE2OyBwLjEyKTwvc3Bhbj4KCi0gKnV0aWxpdHkgbWF0cml4KjogdXRpbGl0eSByZWZlcnMgdG8gdGhlIGFtb3VudCBvZiBwcm9maXQgaW5jdXJyZWQgYnkgcmVjb21tZW5kaW5nIHRoYXQgaXRlbSB0byB0aGUgcGFydGljdWxhciB1c2VyLiAKCi0gKnVuaXF1ZSBhdHRyaWJ1dGUgbWF0cml4KjogPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj4gdGhlIG1vc3QgZGlmZmljdWx0IGl0ZW0gY29ycmVjdGx5IHJlc3BvbmRlZCBieSB0aGUgcGFydGljdWxhciByZXNwb25kZW50LCB3aGljaCBnaXZlcyB0aGUgcmVzcG9uZGVudCBhIHVuaXF1ZSBtYXN0ZXJ5IHByb2ZpbGU/Pzwvc3Bhbj4uCgotIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPioqTm90ZTogc3Vic3RpdHV0aW9uIG9mIG1pc3NpbmcgZW50cmllcyB3aXRoIGFueSB2YWx1ZSBsZWFkcyB0byBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBiaWFzKio8L3NwYW4+CgohW0FnZ2Fyd2FsLCAyMDE2OyBwLiAxM10oLi9jaDFfRmlnMS40LnBuZykKCjMuIENvbGxhYm9yYXRpdmUgZmlsdGVyaW5nIG1vZGVscyB3aXRoIG1pc3NpbmcgdmFsdWUgYW5hbHlzaXMKCi0gQ29sbGFib3JhdGl2ZSBmaWx0ZXJpbmcgbW9kZWxzIGFyZSBjbG9zZWx5IHJlbGF0ZWQgdG8gbWlzc2luZyB2YWx1ZSBhbmFseXNpcy4gCgotIDxzcGFuIHN0eWxlPSJjb2xvcjpHcmVlbiI+KipDb2xsYWJvcmF0aXZlIGZpbHRlcmluZyBhcyBhIGdlbmVyYWxpemF0aW9uIG9mIGNsYXNzaWZpY2F0aW9uIGFuZCByZWdyZXNzaW9uIG1vZGVsaW5nLiAqKiA8L3NwYW4+CgoKIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Z3JleSI+IGIuIENvbnRlbnQtQmFzZWQgUmVjb21tZW5kZXIgU3lzdGVtcyA8L3NwYW4+CgojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpncmV5Ij4gYy4gS25vd2xlZGdlLUJhc2VkIFJlY29tbWVuZGVyIFN5c3RlbXMgPC9zcGFuPgoKIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Z3JleSI+IGQuIERlbW9ncmFwaGljIFJlY29tbWVuZGVyIFN5c3RlbXMgPC9zcGFuPgoKIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4gZS4gKipIeWJyaWQgYW5kIEVuc2VtYmxlLUJhc2VkIFJlY29tbWVuZGVyIFN5c3RlbXMqKiA8L3NwYW4+CgohW0FnZ2Fyd2FsLCAyMDE2OyBwLiAxM10oLi9jaDFfRmlnMS41LnBuZykKCgojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4gZi4gRXZhbHVhdGlvbiAtKipvcnRob2dvbmFsIHRvIGVhY2ggb3RoZXIqKiA8L3NwYW4+CgotIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+ICoqQWNjdXJhY3kqKiA8L3NwYW4+CgotIENvdmVyYWdlCgotIENvbmZpZGVuY2UgYW5kIFRydXN0CgotIE5vdmVsdHkg5paw6aKW5bqmCgotIFNlcmVuZGlwaXR5IOaDiuWWnOW6pgoKLSBEaXZlcnNpdHkg5aSa5qC35YyWCgotIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+ICoqUm9idXN0bmVzcyBhbmQgU3RhYmlsaXR5KiogPC9zcGFuPgoKLSBTY2FsYWJpbGl0eQoKLSA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPiAqKkludGVycHJldGFiaWxpdHkgKG15IHRob3VnaHRzKSoqIDwvc3Bhbj4KCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+IFRIUkVFOiBEb21haW4tU3BlY2lmaWMgQ2hhbGxlbmdlcyA8L3NwYW4+CgotIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+IGEuICoqQ29udGV4dC1TZW5zaXRpdmUgKG11bHRpZGltZW5zaW9uYWw/PyBtdWx0aS1sZXZlbD8/KSoqIDwvc3Bhbj4KCi0gPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj4gYi4gKipUaW1lLVNlbnNpdGl2ZShwcm9jZXNzIGRhdGE/PykqKiA8L3NwYW4+CgotIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+IGMuICoqTG9jYXRpb24tQmFzZWQgKG9ubGluZSB2cyBvZmZsaW5lPz8pKiogPC9zcGFuPgoKLSA8c3BhbiBzdHlsZT0iY29sb3I6Z3JleSI+IGQuIFNvY2lhbCA8L3NwYW4+CgoKCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Z3JleSI+IEZPVVI6ICBBZHZhbmNlZCBUb3BpY3MgYW5kIEFwcGxpY2F0aW9ucyA8L3NwYW4+CgojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmdyZXkiPiBGSVZFOiBTdW1tYXJ5IDwvc3Bhbj4KCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPiBDaGFwdGVyIFR3bzogTmVpZ2hib3Job29kLUJhc2VkIENvbGxhYm9yYXRpdmUgRmlsdGVyaW5nIDwvc3Bhbj4KCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+IE9ORTogSW50cm9kdWN0aW9uIDwvc3Bhbj4gKihwLiAyOS1wLjMxKQoKKipOZWlnaGJvcmhvb2QtYmFzZWQgY29sbGFib3JhdGl2ZSBmaWx0ZXJpbmcgYWxnb3JpdGhtcyAqKjogKm1lbW9yeS1iYXNlZCBhbGdvcml0aG0qCgotICAqdXNlci1iYXNlZCo6IHRoZSByYXRpbmdzIHByb3ZpZGVkIGJ5IHNpbWlsYXIgdXNlcnMgdG8gKmEgdGFyZ2V0KiB1c2VyICoqQSoqIHRvIG1ha2UgcmVjb21tZW5kYXRpb25zIGZvciBBLiBUaGUgcHJlZGljdGVkIHJhdGluZ3Mgb2YgKipBKiogYXJlIGNvbXB1dGVkIGFzIHRoZSB3ZWlnaHRlZCBhdmVyYWdlIHZhbHVlcyBvZiB0aGVzZSAicGVlciBncm91cCIgcmF0aW5ncyBmb3IgZWFjaCBpdGVtLiAKICAgCiAgLSA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPiAqcmVzcG9uZGVudC1iYXNlZCo6IHRoZSBhc3N1bXB0aW9uIGhlcmU6IHJlc3BvbmRlbnRzIHJlc3BvbmQgdG8gZWFjaCBpdGVtIGluZGVwZW5kZW50bHksIG5vIGRlcGVuZGVuY3kuIEluZGVwZW5kZW50IGFuZCBpZGVudGljYWxseSBkaXN0cmlidXRlZCAoSUlEKTwvc3Bhbj4uCiAgIAogIC0gKml0ZW0tYmFzZWQqOiB0byBkZXRlcm1pbmUgYSBzZXQgKipTKiogb2Ygc2ltaWxhciBpdGVtcyB0byAqdGFyZ2V0KiBpdGVtICoqQioqLiBUaGUgd2VpZ2h0ZWQgYXZlcmFnZSBvZiB0aGVzZSByYXRpbmdzIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcHJlZGljdGVkIHJhdGluZyBvZiB1c2VyICoqQSoqIGZvciBpdGVtICoqQioqLiAKICAKICAtIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+ICppdGVtLWJhc2VkKjogYXNzdW1wdGlvbjogSUlEIGZvciBpdGVtcy4gPC9zcGFuPi4KICAKICAtIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+ICoqQ29uY2x1c2lvbioqOiBEaWZmZXJlbnQgYXNzdW1wdGlvbnMgaW4gaGVyZSBhbmQgaW4gZWR1Y2F0aW9uYWwgYXNzZXNzbWVudHM6IFdlIGFzc3VtZSBjb25kaXRpb25hbCBpbmRlcGVuZGVuY2Ugb3IgbG9jYWwgaW5kZXBlbmRlbmNlLiBpLmUuLCB0aGUgcmVzcG9uc2VzIHRvIGFuIGl0ZW0gYXJlIGluZGVwZW5kZW50IG9mIHRoZSByZXNwb25zZXMgdG8gYW55IG90aGVyIGl0ZW0gY29uZGl0aW9uYWwgb24gdGhlIHJlc3BvbmRlbnQncyBhYmlsaXR5ICRcdGhldGEkLiBJbiB0aGUgY2FzZXMgb2YgaW50ZXJkZXBlbmRlbmN5LCBhZGRpdGlvbmFsIGxhdGVudCB2YXJpYWJsZXMgc3VjaCBhcyBnZW5kZXIsIGV0aG5pY2l0eSwgc3BlZWRlZG5lc3MsZXRjLiBhcmUgbmVlZGVkLiA8L3NwYW4+CiAgCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+IFRXTzogS2V5IFByb3BlcnRpZXMgb2YgUmF0aW5nIE1hdHJpY2VzIDwvc3Bhbj4gKihwLiAzMS1wLjMzKQogIAogIC0gKkNvbnRpbnVvdXMgcmF0aW5ncyo6IGFueSB2YWx1ZXMgCiAgCiAgLSAqSW50ZXJ2YWwtYmFzZWQgcmF0aW5ncyo6IDUtcG9pbnQgb3IgTi1wb2ludCBzY2FsZXMsIGVxdWlkaXN0YW50LgoKICAtICpPcmRpbmFsIHJhdGluZyo6IHNpbWlsYXIgdG8gaW50ZXJ2YWwtYmFzZWQsIGFsc28gb3JkZXJlZCBjYXRlZ29yaWNhbDsgZGlmZmVyZW5jZSBiZXR3ZWVuIHBhaXIgb2YgYWRqYWNlbnQgcmF0aW5ncyB2YWx1ZXMuIAogIAogIC0gKkJpbmFyeSByYXRpbmdzKjogdHdvIG9wdGlvbnMgKDAvMSkgKE0vRikKICAKICAtICpVbmFyeSByYXRpbmcqOiBvbmUgb3B0aW9uIG9ubHkKICAKCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+VEhSRUU6IFByZWRpY3RpbmcgUmF0aW5ncyB3aXRoIE5laWdoYm9yaG9vZC1CYXNlZCBNZXRob2RzIDwvc3Bhbj4gKihwLiAzMy1wLjQ1KQoKMS4gICpVc2VyLWJhc2VkIE5laWdoYm9yaG9vZCBNb2RlbHMgKjogc2ltaWxhcml0eSBmdW5jdGlvbnMgYXJlIGNvbXB1dGVkIGJldHdlZW4gcm93cyBvZiByYXRpbmcgbWF0cml4IHRvIGRpc2NvdmVyIHNpbWlsYXIgdXNlcnMKICAgCiAgLSA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPiAqcmVzcG9uZGVudC1iYXNlZCo6IElJRCBhc3N1bXB0aW9ucyA8L3NwYW4+LgogIAogIC0gU3RlcCBPbmU6IENvbXB1dGUgdGhlIG1lYW4gcmF0aW5nICRcbXVfdSQgZm9yIGVhY2ggdXNlciAkdSQgdXNpbmcgaGVyIHNwZWNpZmllZCByYXRpbmdzOgogIAogIC0gJFxtdV97dX09XGZyYWN7XHN1bV97ayBcaW4gSV97dX19IHJfe3Uga319e1xsZWZ0fElfe3V9XHJpZ2h0fH0gXHF1YWQgXGZvcmFsbCB1IFxpblx7MSBcbGRvdHMgbVx9JCAgKDIuMTsgcC4gMzUpCiAgCiAgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+ICoqQ29zaW5lIEZvcm11bGEgaXMgbWlzc2luZz8/KiogPC9zcGFuPgogIAogLSBTdGVwIFR3bzogUGVhcnNvbiBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBiZXR3ZWVuIHJvd3ModXNlcnMpICR1JCBhbmQgJHYkOgogICAKLSAkXG9wZXJhdG9ybmFtZXtTaW19KHUsIHYpPVxvcGVyYXRvcm5hbWV7UGVhcnNvbn0odSwgdik9XGZyYWN7XHN1bV97ayBcaW4gSV97dX0gXGNhcCBJX3t2fX1cbGVmdChyX3t1IGt9LVxtdV97dX1ccmlnaHQpIFxjZG90XGxlZnQocl97diBrfS1cbXVfe3Z9XHJpZ2h0KX17XHNxcnR7XHN1bV97ayBcaW4gSV97dX0gXGNhcCBJX3t2fX1cbGVmdChyX3t1IGt9LVxtdV97dX1ccmlnaHQpXnsyfX0gXGNkb3QgXHNxcnR7XHN1bV97ayBcaW4gSV97dX0gXGNhcCBJX3t2fX1cbGVmdChyX3t2IGt9LVxtdV97dn1ccmlnaHQpXnsyfX19JCAoMi4yOyBwLiAzNSkKICAgCiAgPHNwYW4gc3R5bGU9ImNvbG9yOndoaXRlIj4gY292YXJpYW5jZSBieSB0aGUgcHJvZHVjdCBvZiB0aGUgdHdvIHZhcmlhYmxlcycgc3RhbmRhcmQgZGV2aWF0aW9ucy48L3NwYW4+CiAgCiAtIFN0ZXAgVGhyZWU6IG1lYW4tY2VudGVyZWQgcmF0aW5nICRzX3t1an0kOgogCiAtICRzX3t1IGp9PXJfe3Ugan0tXG11X3t1fSBccXVhZCBcZm9yYWxsIHUgXGluXHsxIFxsZG90cyBtXH0kICgyLjM7IHAuIDM1KQogIAogLSBTdGVwIEZvdXI6IG92ZXJhbGwgbmVpZ2hib3Job29kLWJhc2VkIHByZWRpY3Rpb24gZnVuY3Rpb246CiAKICRcaGF0e3J9X3t1IGp9PVxtdV97dX0rXGZyYWN7XHN1bV97diBcaW4gUF97dX0oail9IFxvcGVyYXRvcm5hbWV7U2ltfSh1LCB2KSBcY2RvdCBzX3t2IGp9fXtcc3VtX3t2IFxpbiBQX3t1fShqKX18XG9wZXJhdG9ybmFtZXtTaW19KHUsIHYpfH09XG11X3t1fStcZnJhY3tcc3VtX3t2IFxpbiBQX3t1fShqKX0gXG9wZXJhdG9ybmFtZXtTaW19KHUsIHYpIFxjZG90XGxlZnQocl97diBqfS1cbXVfe3Z9XHJpZ2h0KX17XHN1bV97diBcaW4gUF97dX0oail9fFxvcGVyYXRvcm5hbWV7U2ltfSh1LCB2KXx9JAogCiBFeGFtcGxlOiAocC4zNikKICFbQWdnYXJ3YWwsIDIwMTY7IHAuIDM0XSguL2NoMl9UYWJsZTIuMS5wbmcpCiAtIDxzcGFuIHN0eWxlPSJjb2xvcjpncmV5Ij4gU2ltaWxhcml0eSBmdW5jdGlvbiB2YXJpYW50cyA8L3NwYW4+CiAKIC0gPHNwYW4gc3R5bGU9ImNvbG9yOmdyZXkiPiB2YXJpYW50cyBvZiB0aGUgcHJlZGljdGlvbiBmdW5jdGlvbiA8L3NwYW4+CiAKIC0gPHNwYW4gc3R5bGU9ImNvbG9yOmdyZXkiPiBWYXJpYXRpb25zIGluIEZpbHRlcmluZyBwZWVyIGdyb3VwcyA8L3NwYW4+CiAKIC0gPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+ICoqaW1wYWN0IG9mIHRoZSBsb25nIHRhaWwqKiA8L3NwYW4+CiAKICFbQWdnYXJ3YWwsIDIwMTY7IHAuIDEzXSguL2NoMl9GaWcyLjEucG5nKQogCiAgCjIuICAqaXRlbS1iYXNlZCo6IFNpbWlsYXJpdHkgZnVuY3Rpb25zIGFyZSBjb21wdXRlZCBiZXR3ZWVuIHRoZSAqY29sdW1ucyogb2YgdGhlIHJhdGluZ3MgbWF0cml4IHRvIGRpc2NvdmVyIHNpbWlsYXIgaXRlbXMuIAogIAogIC0gPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj4gKml0ZW0tYmFzZWQqOiBJSUQgYXNzdW1wdGlvbnMgPC9zcGFuPi4KICAKIAogIAoKCgoKCgoKCgoKCgo=