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.

Respondent/User Item1 Item2 Item3 Item4 Item5 Item6 Item7 Item8
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.

Item Attribute1 Attribute2 Attribute3 Attribute4 Attribute5 Attribute6
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)

  1. 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.

  1. model-based methods: predictive parameterized models, such as decision trees, rule-based models, Bayesian methods and latent factor models.
  • Advantages: working very well with sparse ratings matrices.

  • Combinations of memory-based and model-based methods provide very accurate results.

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

Movie1 Movie2 Movie3 Movie4 Movie5 Movie6
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

Aggarwal, 2016; p. 13

  1. Collaborative filtering models with missing value analysis
  • Collaborative filtering models are closely related to missing value analysis.

  • Collaborative filtering as a generalization of classification and regression modeling.

b. Content-Based Recommender Systems

c. Knowledge-Based Recommender Systems

d. Demographic Recommender Systems

e. Hybrid and Ensemble-Based Recommender Systems

Aggarwal, 2016; p. 13

f. Evaluation -orthogonal to each other

  • Accuracy

  • Coverage

  • Confidence and Trust

  • Novelty 新颖度

  • Serendipity 惊喜度

  • Diversity 多样化

  • Robustness and Stability

  • Scalability

  • Interpretability (my thoughts)

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

FIVE: Summary

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)

  1. 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) Aggarwal, 2016; p. 34 - Similarity function variants

  • variants of the prediction function

  • Variations in Filtering peer groups

  • impact of the long tail

Aggarwal, 2016; p. 13

  1. 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=