ZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9jcHUvc2M1MjAvTWFrZWZpbGUgYi9hcmNoL2kzODYvY3B1L3NjNTIwL01ha2VmaWxlCmluZGV4IDNjMjVjYmEuLjU0MjYwYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9jcHUvc2M1MjAvTWFrZWZpbGUKKysrIGIvYXJjaC9pMzg2L2NwdS9zYzUyMC9NYWtlZmlsZQpAQCAtMzMsMTAgKzMzLDEwIEBACiAKIENPQkpTLSQoQ09ORklHX1NZU19TQzUyMCkgKz0gc2M1MjAubwogQ09CSlMtJChDT05GSUdfUENJKSArPSBzYzUyMF9wY2kubworQ09CSlMtJChDT05GSUdfU1lTX1NDNTIwKSArPSBzYzUyMF9zZHJhbS5vCiBDT0JKUy0kKENPTkZJR19TWVNfU0M1MjBfU1NJKSArPSBzYzUyMF9zc2kubwogQ09CSlMtJChDT05GSUdfU1lTX1NDNTIwX1RJTUVSKSArPSBzYzUyMF90aW1lci5vCiAKLVNPQkpTLSQoQ09ORklHX1NZU19TQzUyMCkgKz0gc2M1MjBfYXNtLm8KIFNPQkpTLSQoQ09ORklHX1NZU19TQzUyMCkgKz0gc2M1MjBfY2FyLm8KIAogU1JDUwk6PSAkKFNPQkpTLXk6Lm89LlMpICQoQ09CSlMteToubz0uYykKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9jcHUvc2M1MjAvc2M1MjAuYyBiL2FyY2gvaTM4Ni9jcHUvc2M1MjAvc2M1MjAuYwppbmRleCA3NmRlNmJlLi5kNTU5N2NhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvY3B1L3NjNTIwL3NjNTIwLmMKKysrIGIvYXJjaC9pMzg2L2NwdS9zYzUyMC9zYzUyMC5jCkBAIC0zMSwxMyArMzEsNiBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotLyoKLSAqIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBib2FyZHMgYmFzZWQgb24gdGhlIEFNRCBzYzUyMAotICoKLSAqIHZvaWQgaW5pdF9zYzUyMCh2b2lkKQotICogdW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKLSAqLwotCiBzYzUyMF9tbWNyX3QgKnNjNTIwX21tY3IgPSAoc2M1MjBfbW1jcl90ICopU0M1MjBfTU1DUl9CQVNFOwogCiBpbnQgY3B1X2luaXRfZih2b2lkKQpAQCAtNjUsMTA5ICs1OCw2IEBACiAJcmV0dXJuIHg4Nl9jcHVfaW5pdF9mKCk7CiB9CiAKLXVuc2lnbmVkIGxvbmcgaW5pdF9zYzUyMF9kcmFtKHZvaWQpCi17Ci0JYmRfdCAqYmQgPSBnZC0+YmQ7Ci0KLQl1MzIgZHJhbV9wcmVzZW50PTA7Ci0JdTMyIGRyYW1fY3RybDsKLQotI2lmZGVmIENPTkZJR19TWVNfU0RSQU1fRFJDVE1DVEwKLQkvKiB0aGVzZSBtZW1vcnkgY29udHJvbCByZWdpc3RlcnMgYXJlIHNldCB1cCBpbiB0aGUgYXNzZW1iZXIgcGFydCwKLQkgKiBpbiBzYzUyMF9hc20uUywgZHVyaW5nICdtZW1faW5pdCcuICBJZiB3ZSBtdWNrIHdpdGggdGhlbSBoZXJlLAotCSAqIGFmdGVyIHdlIGFyZSBydW5uaW5nIGEgc3RhY2sgaW4gUkFNLCB3ZSBoYXZlIHRyb3VibGVzLiAgQmVzaWRlcywKLQkgKiB0aGVzZSByZWZyZXNoIGFuZCBkZWxheSB2YWx1ZXMgYXJlIGJldHRlciA/IHNpbXBseSBzcGVjaWZpZWQKLQkgKiBvdXRyaWdodCBpbiB0aGUgaW5jbHVkZS9jb25maWdzL3tjZmd9IGZpbGUgc2luY2UgdGhlIEhXIGRlc2lnbmVyCi0JICogc2ltcGx5IGRpY3RhdGVzIGl0LgotCSAqLwotI2Vsc2UKLQl1OCB0bXA7Ci0JdTggdmFsOwotCi0JaW50IGNhc19wcmVjaGFyZ2VfZGVsYXkgPSBDT05GSUdfU1lTX1NEUkFNX1BSRUNIQVJHRV9ERUxBWTsKLQlpbnQgcmVmcmVzaF9yYXRlICAgICAgICA9IENPTkZJR19TWVNfU0RSQU1fUkVGUkVTSF9SQVRFOwotCWludCByYXNfY2FzX2RlbGF5ICAgICAgID0gQ09ORklHX1NZU19TRFJBTV9SQVNfQ0FTX0RFTEFZOwotCi0JLyogc2V0IFNEUkFNIHNwZWVkIGhlcmUgKi8KLQotCXJlZnJlc2hfcmF0ZSAvPSA3ODsKLQlpZiAocmVmcmVzaF9yYXRlIDw9IDEpIHsKLQkJdmFsID0gMDsJLyogNy44dXMgKi8KLQl9IGVsc2UgaWYgKHJlZnJlc2hfcmF0ZSA9PSAyKSB7Ci0JCXZhbCA9IDE7CS8qIDE1LjZ1cyAqLwotCX0gZWxzZSBpZiAocmVmcmVzaF9yYXRlID09IDMgfHwgcmVmcmVzaF9yYXRlID09IDQpIHsKLQkJdmFsID0gMjsJLyogMzEuMnVzICovCi0JfSBlbHNlIHsKLQkJdmFsID0gMzsJLyogNjIuNHVzICovCi0JfQotCi0JdG1wID0gKHJlYWRiKCZzYzUyMF9tbWNyLT5kcmNjdGwpICYgMHhjZikgfCAodmFsPDw0KTsKLQl3cml0ZWIodG1wLCAmc2M1MjBfbW1jci0+ZHJjY3RsKTsKLQotCXZhbCA9IHJlYWRiKCZzYzUyMF9tbWNyLT5kcmN0bWN0bCkgJiAweGYwOwotCi0JaWYgKGNhc19wcmVjaGFyZ2VfZGVsYXk9PTMpIHsKLQkJdmFsIHw9IDB4MDQ7CS8qIDNUICovCi0JfSBlbHNlIGlmIChjYXNfcHJlY2hhcmdlX2RlbGF5PT00KSB7Ci0JCXZhbCB8PSAweDA4OwkvKiA0VCAqLwotCX0gZWxzZSBpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT40KSB7Ci0JCXZhbCB8PSAweDBjOwotCX0KLQotCWlmIChyYXNfY2FzX2RlbGF5ID4gMykgewotCQl2YWwgfD0gMjsKLQl9IGVsc2UgewotCQl2YWwgfD0gMTsKLQl9Ci0Jd3JpdGViKHZhbCwgJmM1MjBfbW1jci0+ZHJjdG1jdGwpOwotI2VuZGlmCi0KLQkvKgotCSAqIFdlIHJlYWQtYmFjayB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZHJhbQotCSAqIGNvbnRyb2xsZXIgdGhhdCB0aGUgYXNzZW1ibHkgY29kZSB3cm90ZQotCSAqLwotCWRyYW1fY3RybCA9IHJlYWRsKCZzYzUyMF9tbWNyLT5kcmNiZW5kYWRyKTsKLQotCWJkLT5iaV9kcmFtWzBdLnN0YXJ0ID0gMDsKLQlpZiAoZHJhbV9jdHJsICYgMHg4MCkgewotCQkvKiBiYW5rIDAgZW5hYmxlZCAqLwotCQlkcmFtX3ByZXNlbnQgPSBiZC0+YmlfZHJhbVsxXS5zdGFydCA9IChkcmFtX2N0cmwgJiAweDdmKSA8PCAyMjsKLQkJYmQtPmJpX2RyYW1bMF0uc2l6ZSA9IGJkLT5iaV9kcmFtWzFdLnN0YXJ0OwotCX0gZWxzZSB7Ci0JCWJkLT5iaV9kcmFtWzBdLnNpemUgPSAwOwotCQliZC0+YmlfZHJhbVsxXS5zdGFydCA9IGJkLT5iaV9kcmFtWzBdLnN0YXJ0OwotCX0KLQotCWlmIChkcmFtX2N0cmwgJiAweDgwMDApIHsKLQkJLyogYmFuayAxIGVuYWJsZWQgKi8KLQkJZHJhbV9wcmVzZW50ID0gYmQtPmJpX2RyYW1bMl0uc3RhcnQgPSAoZHJhbV9jdHJsICYgMHg3ZjAwKSA8PCAxNDsKLQkJYmQtPmJpX2RyYW1bMV0uc2l6ZSA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0IC0gIGJkLT5iaV9kcmFtWzFdLnN0YXJ0OwotCX0gZWxzZSB7Ci0JCWJkLT5iaV9kcmFtWzFdLnNpemUgPSAwOwotCQliZC0+YmlfZHJhbVsyXS5zdGFydCA9IGJkLT5iaV9kcmFtWzFdLnN0YXJ0OwotCX0KLQotCWlmIChkcmFtX2N0cmwgJiAweDgwMDAwMCkgewotCQkvKiBiYW5rIDIgZW5hYmxlZCAqLwotCQlkcmFtX3ByZXNlbnQgPSBiZC0+YmlfZHJhbVszXS5zdGFydCA9IChkcmFtX2N0cmwgJiAweDdmMDAwMCkgPDwgNjsKLQkJYmQtPmJpX2RyYW1bMl0uc2l6ZSA9IGJkLT5iaV9kcmFtWzNdLnN0YXJ0IC0gIGJkLT5iaV9kcmFtWzJdLnN0YXJ0OwotCX0gZWxzZSB7Ci0JCWJkLT5iaV9kcmFtWzJdLnNpemUgPSAwOwotCQliZC0+YmlfZHJhbVszXS5zdGFydCA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0OwotCX0KLQotCWlmIChkcmFtX2N0cmwgJiAweDgwMDAwMDAwKSB7Ci0JCS8qIGJhbmsgMyBlbmFibGVkICovCi0JCWRyYW1fcHJlc2VudCAgPSAoZHJhbV9jdHJsICYgMHg3ZjAwMDAwMCkgPj4gMjsKLQkJYmQtPmJpX2RyYW1bM10uc2l6ZSA9IGRyYW1fcHJlc2VudCAtICBiZC0+YmlfZHJhbVszXS5zdGFydDsKLQl9IGVsc2UgewotCQliZC0+YmlfZHJhbVszXS5zaXplID0gMDsKLQl9Ci0JZ2QtPnJhbV9zaXplID0gZHJhbV9wcmVzZW50OwotCi0JcmV0dXJuIGRyYW1fcHJlc2VudDsKLX0KLQogI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfUkVTRVQKIHZvaWQgcmVzZXRfY3B1KHVsb25nIGFkZHIpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvY3B1L3NjNTIwL3NjNTIwX2FzbS5TIGIvYXJjaC9pMzg2L2NwdS9zYzUyMC9zYzUyMF9hc20uUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxYWE2MS4uMDAwMDAwMAotLS0gYS9hcmNoL2kzODYvY3B1L3NjNTIwL3NjNTIwX2FzbS5TCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDIKLSAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotLyogVGhpcyBmaWxlIGlzIGxhcmdlbHkgYmFzZWQgb24gY29kZSBvYnRuZWQgZnJvbSBBTUQuIEFNRCdzIG9yaWdpbmFsCi0gKiBjb3B5cmlnaHQgaXMgaW5jbHVkZWQgYmVsb3cKLSAqLwotCi0vKgkJVElUTEUJU0laRVIgLSBBc3BlbiBEUkFNIFNpemluZyBSb3V0aW5lLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTkgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgotICogWW91IG1heSByZWRpc3RyaWJ1dGUgdGhpcyBwcm9ncmFtIGFuZC9vciBtb2RpZnkgdGhpcyBwcm9ncmFtIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOwotICogZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyBXSVRIT1VUIEVWRU4gVEhFIElNUExJRUQKLSAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgotICoKLSAqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRZCi0gKiBPRiBBTlkgS0lORCBJTkNMVURJTkcgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCBPRgotICogVEhJUkQtUEFSVFkgSU5URUxMRUNUVUFMIFBST1BFUlRZLCBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFLgotICogSU4gTk8gRVZFTlQgU0hBTEwgQU1EIE9SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSCi0gKiAoSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1MgT0YgUFJPRklUUywgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTiwgTE9TUyBPRiBJTkZPUk1BVElPTikgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBPUiBJTkFCSUxJVFkKLSAqIFRPIFVTRSBUSEUgTUFURVJJQUxTLCBFVkVOIElGIEFNRCBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0VTLiAgQkVDQVVTRSBTT01FIEpVUlNJRElDVElPTlMgUFJPSElCSVQgVEhFIEVYQ0xVU0lPTiBPUgotICogTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgRk9SIENPTlNFUVVFTlRJQUwgT1IgSU5DSURFTlRBTCBEQU1BR0VTLCBUSEUgQUJPVkUKLSAqIExJTUlUQVRJT04gTUFZIE5PVCBBUFBMWSBUTyBZT1UuCi0gKgotICogQU1EIGRvZXMgbm90IGFzc3VtZSBhbnkgcmVzcG9uc2liaWxpdHkgZm9yIGFueSBlcnJvcnMgdGhhdCBtYXkgYXBwZWFyIGluCi0gKiB0aGUgTWF0ZXJpYWxzIG5vciBhbnkgcmVzcG9uc2liaWxpdHkgdG8gc3VwcG9ydCBvciB1cGRhdGUgdGhlIE1hdGVyaWFscy4KLSAqIEFNRCByZXRhaW5zIHRoZSByaWdodCB0byBtYWtlIGNoYW5nZXMgdG8gaXRzIHRlc3Qgc3BlY2lmaWNhdGlvbnMgYXQgYW55Ci0gKiB0aW1lLCB3aXRob3V0IG5vdGljZS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZJTEUgICAgICAgIDogc2l6ZXIuYXNtIC0gU0RSQU0gRElNTSBTaXppbmcgQWxnb3JpdGhtCi0gKgotICoKLSAqCi0gKiAgRlVOQ1RJT05TICAgOiBzaXplbWVtKCkgLSBqdW1wZWQgdG8sIG5vdCBjYWxsZWQuICBUbyBiZSBleGVjdXRlZCBhZnRlcgotICogICAgICAgICAgICAgICAgcmVzZXQgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBTRFJBTSBESU1Ncy4gSW5pdGlhbGl6ZXMKLSAqCQkgdGhlIG1lbW9yeSBzdWJzeXN0ZW0uCi0gKgotICoKLSAqICBBVVRIT1IgICAgICA6IEJ1ZGR5IEZleSAtIE9yaWdpbmFsLgotICoKLSAqCi0gKiAgREVTQ1JJUFRJT04gOiBQZXJmb3JtcyBzaXppbmcgb24gU0RSQU0gRElNTXMgb24gQVNQRU4gcHJvY2Vzc29yLgotICogICAgICAgICAgICAgICAgTk9URTogVGhpcyBpcyBhIHNtYWxsIG1lbW9yeSBtb2RlbCB2ZXJzaW9uCi0gKgotICoKLSAqICBJTlBVVFMgICAgICA6IEJQIGNvbnRhaW5zIHJldHVybiBhZGRyZXNzIG9mZnNldAotICoJCSBDQUNIRSBpcyBhc3N1bWVkIHRvIGJlIGRpc2FibGVkLgotICoJCSBUaGUgRlMgc2VnbWVudCBsaW1pdCBoYXMgYWxyZWFkeSBiZWVuIHNldCB0byBiaWcgcmVhbCBtb2RlCi0gKgkJIChmdWxsIDMyLWJpdCBhZGRyZXNzaW5nIGNhcGFiaWxpdHkpCi0gKgotICoKLSAqICBPVVRQVVRTICAgICA6IE5vbmUKLSAqCi0gKgotICogIFJFRyBVU0UgICAgIDogIGF4LGJ4LGN4LGR4LGRpLHNpLGJwLCBmcwotICoKLSAqCi0gKiAgUkVWSVNJT04gICAgOiBTZWUgUFZDUyBpbmZvIGJlbG93Ci0gKgotICoKLSAqICBURVNUIFBMQU4gQ1JPU1MgUkVGRVJFTkNFOgotICoKLSAqCi0gKiAkV29ya2ZpbGU6ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk5LzA5LzIyIDEyOjQ5OjMzICQKLSAqICRBdXRob3I6IGNoaXBmICQKLSAqICRMb2c6IHNpemVyLmFzbSAkCi0gKiBSZXZpc2lvbiAxLjIgIDE5OTkvMDkvMjIgMTI6NDk6MzMgIGNoaXBmCi0gKiBBZGQgbGVnYWwgaGVhZGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICBGVU5DVElPTkFMIERFU0NSSVBUSU9OOgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBhdXRvZGV0ZWN0IHRoZSBnZW9tZXRyeSBvZiB0aGUgRFJBTS4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGNvbHVtbiBiaXRzIGZvciB0aGUgRFJBTQotICogZGV2aWNlcyBpbiB0aGlzIGV4dGVybmFsIGJhbmsuIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIGV4dGVybmFsIGJhbmsKLSAqIGhhcyBiZWVuIGNvbmZpZ3VyZWQgZm9yIGFuIDExLWJpdCBjb2x1bW4gYW5kIGZvciA0IGludGVybmFsIGJhbmtzLiBUaGlzIGdpdmVzCi0gKiB1cyB0aGUgbWF4aW11bSBhZGRyZXNzIHJlYWNoIGluIG1lbW9yeS4gQnkgd3JpdGluZyBhIHRlc3QgdmFsdWUgdG8gdGhlIG1heAotICogYWRkcmVzcyBhbmQgbG9jYXRpbmcgd2hlcmUgaXQgYWxpYXNlcyB0bywgd2UgY2FuIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHZhbGlkCi0gKiBjb2x1bW4gYml0cy4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGludGVybmFsIGJhbmtzIGVhY2ggRFJBTQotICogZGV2aWNlIGhhcy4gVGhlIGV4dGVybmFsIGJhbmsgKHVuZGVyIHRlc3QpIGlzIGNvbmZpZ3VyZWQgZm9yIG1heGltdW0gcmVhY2gKLSAqIHdpdGggMTEtYml0IGNvbHVtbnMgYW5kIDQgaW50ZXJuYWwgYmFua3MuIFRoaXMgcm91dGluZSB3aWxsIHdyaXRlIHRvIGEgbWF4Ci0gKiBhZGRyZXNzIChCQTEgYW5kIEJBMCA9IDEpIGFuZCB0aGVuIHJlYWQgZnJvbSBhbiBhZGRyZXNzIHdpdGggQkExPTAgdG8gc2VlIGlmCi0gKiB0aGF0IGNvbHVtbiBpcyBhICJkb24ndCBjYXJlIi4gSWYgQkExIGRvZXMgbm90IGFmZmVjdCB3cml0ZS9yZWFkIG9mIGRhdGEsCi0gKiB0aGVuIHRoaXMgZGV2aWNlIGhhcyBvbmx5IDIgaW50ZXJuYWwgYmFua3MuCi0gKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIGVuZGluZyBhZGRyZXNzIGZvciB0aGlzIGV4dGVybmFsCi0gKiBiYW5rIG9mIFNEUkFNLiBXZSB3cml0ZSB0byBhIG1heCBhZGRyZXNzIHdpdGggYSBkYXRhIHZhbHVlIGFuZCB0aGVuIGRpc2FibGUKLSAqIHJvdyBhZGRyZXNzIGJpdHMgbG9va2luZyBmb3IgImRvbid0IGNhcmUiIGxvY2F0aW9ucy4gRWFjaCAiZG9uJ3QgY2FyZSIgYml0Ci0gKiByZXByZXNlbnRzIGEgZGl2aWRpbmcgb2YgdGhlIG1heGltdW0gZGVuc2l0eSAoMTI4TSkgYnkgMi4gQnkgZGl2aWRpbmcgdGhlCi0gKiBtYXhpbXVtIG9mIDMyIDRNIGNodW5rcyBpbiBhbiBleHRlcm5hbCBiYW5rIGRvd24gYnkgYWxsIHRoZSAiZG9uJ3QgY2FyZSIgYml0cwotICogZGV0ZXJtaW5lZCBkdXJpbmcgc2l6aW5nLCB3ZSBzZXQgdGhlIHByb3BlciBkZW5zaXR5LgotICoKLSAqIFdBUk5JTkdTLgotICogYnAgbXVzdCBiZSBwcmVzZXJ2ZWQgYmVjYXVzZSBpdCBpcyB1c2VkIGZvciByZXR1cm4gbGlua2FnZS4KLSAqCi0gKiBFWElUCi0gKiBub3RoaW5nIHJldHVybmVkIC0gYnV0IHRoZSBtZW1vcnkgc3Vic3lzdGVtIGlzIGVuYWJsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgotCi0uc2VjdGlvbiAudGV4dAotLmVxdSAgICAgICAgICAgIENBQ0hFTElORVNaLCAweDAwMDAwMDEwICAgLyogc2l6ZSBvZiBvdXIgY2FjaGUgbGluZSAocmVhZCBidWZmZXIpICovCi0uZXF1ICAgICAgICAgICAgQ09MMTFfQURSLCAgMHgwZTAwMWUwMCAgICAvKiAxMSBjb2wgYWRkcnMgKi8KLS5lcXUgICAgICAgICAgICBDT0wxMF9BRFIsICAweDBlMDAwZTAwICAgIC8qIDEwIGNvbCBhZGRycyAqLwotLmVxdSAgICAgICAgICAgIENPTDA5X0FEUiwgIDB4MGUwMDA2MDAgICAgLyogIDkgY29sIGFkZHJzICovCi0uZXF1ICAgICAgICAgICAgQ09MMDhfQURSLCAgMHgwZTAwMDIwMCAgICAvKiAgOCBjb2wgYWRkcnMgKi8KLS5lcXUgICAgICAgICAgICBST1cxNF9BRFIsICAweDBmMDAwMDAwICAgIC8qIDE0IHJvdyBhZGRycyAqLwotLmVxdSAgICAgICAgICAgIFJPVzEzX0FEUiwgIDB4MDcwMDAwMDAgICAgLyogMTMgcm93IGFkZHJzICovCi0uZXF1ICAgICAgICAgICAgUk9XMTJfQURSLCAgMHgwMzAwMDAwMCAgICAvKiAxMiByb3cgYWRkcnMgKi8KLS5lcXUgICAgICAgICAgICBST1cxMV9BRFIsICAweDAxMDAwMDAwICAgIC8qIDExIHJvdyBhZGRycy9hbHNvIGJhbmsgc3dpdGNoICovCi0uZXF1ICAgICAgICAgICAgUk9XMTBfQURSLCAgMHgwMDAwMDAwMCAgICAvKiAxMCByb3cgYWRkcnMvYWxzbyBiYW5rIHN3aXRjaCAqLwotLmVxdSAgICAgICAgICAgIENPTDExX0RBVEEsIDB4MGIwYjBiMGIgICAgLyogMTEgY29sIGFkZHJzICovCi0uZXF1ICAgICAgICAgICAgQ09MMTBfREFUQSwgMHgwYTBhMGEwYSAgICAvKiAxMCBjb2wgZGF0YSAqLwotLmVxdSAgICAgICAgICAgIENPTDA5X0RBVEEsIDB4MDkwOTA5MDkgICAgLyogIDkgY29sIGRhdGEgKi8KLS5lcXUgICAgICAgICAgICBDT0wwOF9EQVRBLCAweDA4MDgwODA4ICAgIC8qICA4IGNvbCBkYXRhICovCi0uZXF1ICAgICAgICAgICAgUk9XMTRfREFUQSwgMHgzZjNmM2YzZiAgICAvKiAxNCByb3cgZGF0YSAoTUFTSykgKi8KLS5lcXUgICAgICAgICAgICBST1cxM19EQVRBLCAweDFmMWYxZjFmICAgIC8qIDEzIHJvdyBkYXRhIChNQVNLKSAqLwotLmVxdSAgICAgICAgICAgIFJPVzEyX0RBVEEsIDB4MGYwZjBmMGYgICAgLyogMTIgcm93IGRhdGEgKE1BU0spICovCi0uZXF1ICAgICAgICAgICAgUk9XMTFfREFUQSwgMHgwNzA3MDcwNyAgICAvKiAxMSByb3cgZGF0YS9hbHNvIGJhbmsgc3dpdGNoIChNQVNLKSAqLwotLmVxdSAgICAgICAgICAgIFJPVzEwX0RBVEEsIDB4YWFhYWFhYWEgICAgLyogMTAgcm93IGRhdGEvYWxzbyBiYW5rIHN3aXRjaCAoTUFTSykgKi8KLQotLmdsb2JsIG1lbV9pbml0Ci1tZW1faW5pdDoKLQkvKiBQcmVzZXJ2ZSBCb290IEZsYWdzICovCi0JbW92bAklZWJ4LCAlZWJwCi0KLQkvKiBpbml0aWFsaXplIGRyYW0gY29udHJvbGxlciByZWdpc3RlcnMgKi8KLQl4b3J3CSVheCwgJWF4Ci0JbW92bAkkU0M1MjBfREJDVEwsICVlZGkKLQltb3ZiCSVhbCwgKCVlZGkpCQkvKiBkaXNhYmxlIHdyaXRlIGJ1ZmZlciAqLwotCi0JbW92bAkkU0M1MjBfRUNDQ1RMLCAlZWRpCi0JbW92YgklYWwsICglZWRpKQkJLyogZGlzYWJsZSBFQ0MgKi8KLQotCW1vdmwJJFNDNTIwX0RSQ1RNQ1RMLCAlZWRpCi0JbW92YgkkMHgxZSwgJWFsCQkvKiBTZXQgU0RSQU0gdGltaW5nIGZvciBzbG93ZXN0ICovCi0JbW92YgklYWwsICglZWRpKQotCi0JLyogc2V0dXAgbG9vcCB0byBkbyA0IGV4dGVybmFsIGJhbmtzIHN0YXJ0aW5nIHdpdGggYmFuayAzICovCi0JbW92bAkkMHhmZjAwMDAwMCwgJWVheAkvKiBlbmFibGUgbGFzdCBiYW5rIGFuZCBzZXR1cCAqLwotCW1vdmwJJFNDNTIwX0RSQ0JFTkRBRFIsICVlZGkJLyogZW5kaW5nIGFkZHJlc3MgcmVnaXN0ZXIgKi8KLQltb3ZsCSVlYXgsICglZWRpKQotCi0JbW92bAkkU0M1MjBfRFJDQ0ZHLCAlZWRpCQkvKiBzZXR1cCAqLwotCW1vdncJJDB4YmJiYiwgJWF4CQkvKiBkcmFtIGNvbmZpZyByZWdpc3RlciBmb3IgICovCi0JbW92dwklYXgsICglZWRpKQotCi0JLyogaXNzdWUgYSBOT1AgdG8gYWxsIERSQU1zICovCi0JbW92bAkkU0M1MjBfRFJDQ1RMLCAlZWRpCS8qIHNldHVwIERSQU0gY29udHJvbCByZWdpc3RlciB3aXRoICovCi0JbW92YgkkMHgwMSwgJWFsCQkvKiBEaXNhYmxlIHJlZnJlc2gsZGlzYWJsZSB3cml0ZSBidWZmZXIgKi8KLQltb3ZiCSVhbCwgKCVlZGkpCi0JbW92bAkkQ0FDSEVMSU5FU1osICVlc2kJLyoganVzdCBhIGR1bW15IGFkZHJlc3MgdG8gd3JpdGUgZm9yICovCi0JbW92dwklYXgsICglZXNpKQotCi0JLyogZGVsYXkgZm9yIDEwMCB1c2VjPyAqLwotCW1vdncJJDEwMCwgJWN4Ci1zaXpkZWxheToKLQlsb29wCXNpemRlbGF5Ci0KLQkvKiBpc3N1ZSBhbGwgYmFua3MgcHJlY2hhcmdlICovCi0JbW92YgkkMHgwMiwgJWFsCi0JbW92YgklYWwsICglZWRpKQotCW1vdncJJWF4LCAoJWVzaSkKLQotCS8qIGlzc3VlIDIgYXV0byByZWZyZXNoZXMgdG8gYWxsIGJhbmtzICovCi0JbW92YgkkMHgwNCwgJWFsCS8qIEF1dG8gcmVmcmVzaCBjbWQgKi8KLQltb3ZiCSVhbCwgKCVlZGkpCi0JbW92dwkkMHgwMiwgJWN4Ci1yZWZyZXNoMToKLQltb3Z3CSVheCwgKCVlc2kpCi0JbG9vcAlyZWZyZXNoMQotCi0JLyogaXNzdWUgTE9BRCBNT0RFIFJFR0lTVEVSIGNvbW1hbmQgKi8KLQltb3ZiCSQweDAzLCAlYWwJLyogTG9hZCBtb2RlIHJlZ2lzdGVyIGNtZCAqLwotCW1vdmIJJWFsLCAoJWVkaSkKLQltb3Z3CSVheCwgKCVlc2kpCi0KLQkvKiBpc3N1ZSA4IG1vcmUgYXV0byByZWZyZXNoZXMgdG8gYWxsIGJhbmtzICovCi0JbW92YgkkMHgwNCwgJWFsCS8qIEF1dG8gcmVmcmVzaCBjbWQgKi8KLQltb3ZiCSVhbCwgKCVlZGkpCi0JbW92dwkkMHgwMDA4LCAlY3gKLXJlZnJlc2gyOgotCW1vdncJJWF4LCAoJWVzaSkKLQlsb29wCXJlZnJlc2gyCi0KLQkvKiBzZXQgY29udHJvbCByZWdpc3RlciB0byBOT1JNQUwgbW9kZSAqLwotCW1vdmIJJDB4MDAsICVhbAkvKiBOb3JtYWwgbW9kZSB2YWx1ZSAqLwotCW1vdmIJJWFsLCAoJWVkaSkKLQotCS8qCi0JICogc2l6ZSBkcmFtIHN0YXJ0aW5nIHdpdGggZXh0ZXJuYWwgYmFuayAzCi0JICogbW92aW5nIHRvIGV4dGVybmFsIGJhbmsgMAotCSAqLwotCW1vdmwJJDB4MywgJWVjeAkvKiBzdGFydCB3aXRoIGV4dGVybmFsIGJhbmsgMyAqLwotCi1uZXh0YmFuazoKLQotCS8qIHdyaXRlIGNvbCAxMSB3cmFwIGFkciAqLwotCW1vdmwJJENPTDExX0FEUiwgJWVzaQkvKiBzZXQgYWRkcmVzcyB0byBtYXggY29sICgxMSkgd3JhcCBhZGRyICovCi0JbW92bAkkQ09MMTFfREFUQSwgJWVheAkvKiBwYXR0ZXJuIGZvciBtYXggc3VwcG9ydGVkIGNvbHVtbnMoMTEpICovCi0JbW92bAklZWF4LCAoJWVzaSkJCS8qIHdyaXRlIG1heCBjb2wgcGF0dGVybiBhdCBtYXggY29sIGFkciAqLwotCW1vdmwJKCVlc2kpLCAlZWJ4CQkvKiBvcHRpb25hbCByZWFkICovCi0JY21wbAklZWJ4LCAlZWF4CQkvKiB0byB2ZXJpZnkgd3JpdGUgKi8KLQlqbnoJYmFkX3JhbQkJCS8qIHRoaXMgcmFtIGlzIGJhZCAqLwotCi0JLyogd3JpdGUgY29sIDEwIHdyYXAgYWRyICovCi0JbW92bAkkQ09MMTBfQURSLCAlZXNpCS8qIHNldCBhZGRyZXNzIHRvIDEwIGNvbCB3cmFwIGFkZHJlc3MgKi8KLQltb3ZsCSRDT0wxMF9EQVRBLCAlZWF4CS8qIHBhdHRlcm4gZm9yIDEwIGNvbCB3cmFwICovCi0JbW92bAklZWF4LCAoJWVzaSkJCS8qIHdyaXRlIDEwIGNvbCBwYXR0ZXJuIEAgMTAgY29sIHdyYXAgYWRyICovCi0JbW92bAkoJWVzaSksICVlYngJCS8qIG9wdGlvbmFsIHJlYWQgKi8KLQljbXBsCSVlYngsICVlYXgJCS8qIHRvIHZlcmlmeSB3cml0ZSAqLwotCWpuegliYWRfcmFtCQkJLyogdGhpcyByYW0gaXMgYmFkICovCi0KLQkvKiB3cml0ZSBjb2wgOSB3cmFwIGFkciAqLwotCW1vdmwJJENPTDA5X0FEUiwgJWVzaQkvKiBzZXQgYWRkcmVzcyB0byA5IGNvbCB3cmFwIGFkZHJlc3MgKi8KLQltb3ZsCSRDT0wwOV9EQVRBLCAlZWF4CS8qIHBhdHRlcm4gZm9yIDkgY29sIHdyYXAgKi8KLQltb3ZsCSVlYXgsICglZXNpKQkJLyogd3JpdGUgOSBjb2wgcGF0dGVybiBAIDkgY29sIHdyYXAgYWRyICovCi0JbW92bAkoJWVzaSksICVlYngJCS8qIG9wdGlvbmFsIHJlYWQgKi8KLQljbXBsCSVlYngsICVlYXgJCS8qIHRvIHZlcmlmeSB3cml0ZSAqLwotCWpuegliYWRfcmFtCQkJLyogdGhpcyByYW0gaXMgYmFkICovCi0KLQkvKiB3cml0ZSBjb2wgOCB3cmFwIGFkciAqLwotCW1vdmwJJENPTDA4X0FEUiwgJWVzaQkvKiBzZXQgYWRkcmVzcyB0byBtaW4oOCkgY29sIHdyYXAgYWRkcmVzcyAqLwotCW1vdmwJJENPTDA4X0RBVEEsICVlYXgJLyogcGF0dGVybiBmb3IgbWluICg4KSBjb2wgd3JhcCAqLwotCW1vdmwJJWVheCwgKCVlc2kpCQkvKiB3cml0ZSBtaW4gY29sIHBhdHRlcm4gQCBtaW4gY29sIGFkciAqLwotCW1vdmwJKCVlc2kpLCAlZWJ4CQkvKiBvcHRpb25hbCByZWFkICovCi0JY21wbAklZWJ4LCAlZWF4CQkvKiB0byB2ZXJpZnkgd3JpdGUgKi8KLQlqbnoJYmFkX3JhbQkJCS8qIHRoaXMgcmFtIGlzIGJhZCAqLwotCi0JLyogd3JpdGUgcm93IDE0IHdyYXAgYWRyICovCi0JbW92bAkkUk9XMTRfQURSLCAlZXNpCS8qIHNldCBhZGRyZXNzIHRvIG1heCByb3cgKDE0KSB3cmFwIGFkZHIgKi8KLQltb3ZsCSRST1cxNF9EQVRBLCAlZWF4CS8qIHBhdHRlcm4gZm9yIG1heCBzdXBwb3J0ZWQgcm93cygxNCkgKi8KLQltb3ZsCSVlYXgsICglZXNpKQkJLyogd3JpdGUgbWF4IHJvdyBwYXR0ZXJuIGF0IG1heCByb3cgYWRyICovCi0JbW92bAkoJWVzaSksICVlYngJCS8qIG9wdGlvbmFsIHJlYWQgKi8KLQljbXBsCSVlYngsICVlYXgJCS8qIHRvIHZlcmlmeSB3cml0ZSAqLwotCWpuegliYWRfcmFtCQkJLyogdGhpcyByYW0gaXMgYmFkICovCi0KLQkvKiB3cml0ZSByb3cgMTMgd3JhcCBhZHIgKi8KLQltb3ZsCSRST1cxM19BRFIsICVlc2kJLyogc2V0IGFkZHJlc3MgdG8gMTMgcm93IHdyYXAgYWRkcmVzcyAqLwotCW1vdmwJJFJPVzEzX0RBVEEsICVlYXgJLyogcGF0dGVybiBmb3IgMTMgcm93IHdyYXAgKi8KLQltb3ZsCSVlYXgsICglZXNpKQkJLyogd3JpdGUgMTMgcm93IHBhdHRlcm4gQCAxMyByb3cgd3JhcCBhZHIgKi8KLQltb3ZsCSglZXNpKSwgJWVieAkJLyogb3B0aW9uYWwgcmVhZCAqLwotCWNtcGwJJWVieCwgJWVheAkJLyogdG8gdmVyaWZ5IHdyaXRlICovCi0Jam56CWJhZF9yYW0JCQkvKiB0aGlzIHJhbSBpcyBiYWQgKi8KLQotCS8qIHdyaXRlIHJvdyAxMiB3cmFwIGFkciAqLwotCW1vdmwJJFJPVzEyX0FEUiwgJWVzaQkvKiBzZXQgYWRkcmVzcyB0byAxMiByb3cgd3JhcCBhZGRyZXNzICovCi0JbW92bAkkUk9XMTJfREFUQSwgJWVheAkvKiBwYXR0ZXJuIGZvciAxMiByb3cgd3JhcCAqLwotCW1vdmwJJWVheCwgKCVlc2kpCQkvKiB3cml0ZSAxMiByb3cgcGF0dGVybiBAIDEyIHJvdyB3cmFwIGFkciAqLwotCW1vdmwJKCVlc2kpLCAlZWJ4CQkvKiBvcHRpb25hbCByZWFkICovCi0JY21wbAklZWJ4LCAlZWF4CQkvKiB0byB2ZXJpZnkgd3JpdGUgKi8KLQlqbnoJYmFkX3JhbQkJCS8qIHRoaXMgcmFtIGlzIGJhZCAqLwotCi0JLyogd3JpdGUgcm93IDExIHdyYXAgYWRyICovCi0JbW92bAkkUk9XMTFfQURSLCAlZWRpCS8qIHNldCBhZGRyZXNzIHRvIDExIHJvdyB3cmFwIGFkZHJlc3MgKi8KLQltb3ZsCSRST1cxMV9EQVRBLCAlZWF4CS8qIHBhdHRlcm4gZm9yIDExIHJvdyB3cmFwICovCi0JbW92bAklZWF4LCAoJWVkaSkJCS8qIHdyaXRlIDExIHJvdyBwYXR0ZXJuIEAgMTEgcm93IHdyYXAgYWRyICovCi0JbW92bAkoJWVkaSksICVlYngJCS8qIG9wdGlvbmFsIHJlYWQgKi8KLQljbXBsCSVlYngsICVlYXgJCS8qIHRvIHZlcmlmeSB3cml0ZSAqLwotCWpuegliYWRfcmFtCQkJLyogdGhpcyByYW0gaXMgYmFkICovCi0KLQkvKgotCSAqIHdyaXRlIHJvdyAxMCB3cmFwIGFkciAtLS0gdGhpcyB3cml0ZSBpcyByZWFsbHkgdG8gZGV0ZXJtaW5lCi0JICogbnVtYmVyIG9mIGJhbmtzCi0JICovCi0JbW92bAkkUk9XMTBfQURSLCAlZWRpCS8qIHNldCBhZGRyZXNzIHRvIDEwIHJvdyB3cmFwIGFkZHJlc3MgKi8KLQltb3ZsCSRST1cxMF9EQVRBLCAlZWF4CS8qIHBhdHRlcm4gZm9yIDEwIHJvdyB3cmFwIChBQSkgKi8KLQltb3ZsCSVlYXgsICglZWRpKQkJLyogd3JpdGUgMTAgcm93IHBhdHRlcm4gQCAxMCByb3cgd3JhcCBhZHIgKi8KLQltb3ZsCSglZWRpKSwgJWVieAkJLyogb3B0aW9uYWwgcmVhZCAqLwotCWNtcGwJJWVieCwgJWVheAkJLyogdG8gdmVyaWZ5IHdyaXRlICovCi0Jam56CWJhZF9yYW0JCQkvKiB0aGlzIHJhbSBpcyBiYWQgKi8KLQotCS8qCi0JICogcmVhZCBkYXRhIEAgcm93IDEyIHdyYXAgYWRyIHRvIGRldGVybWluZSAgKiBiYW5rcywKLQkgKiBhbmQgcmVhZCBkYXRhIEAgcm93IDE0IHdyYXAgYWRyIHRvIGRldGVybWluZSAgKiByb3dzLgotCSAqIGlmIGRhdGEgQCByb3cgMTIgd3JhcCBhZHIgaXMgbm90IEFBLCAxMSBvciAxMiB3ZSBoYXZlIGJhZCBSQU0uCi0JICogaWYgZGF0YSBAIHJvdyAxMiB3cmFwID09IEFBLCB3ZSBvbmx5IGhhdmUgMiBiYW5rcywgTk9UIDQKLQkgKiBpZiBkYXRhIEAgcm93IDEyIHdyYXAgPT0gMTEgb3IgMTIsIHdlIGhhdmUgNCBiYW5rcywKLQkgKi8KLQl4b3J3CSVkaSwgJWRpCQkvKiB2YWx1ZSBmb3IgMiBiYW5rcyBpbiBESSAqLwotCW1vdmwJKCVlc2kpLCAlZWJ4CQkvKiByZWFkIGZyb20gMTIgcm93IHdyYXAgdG8gY2hlY2sgYmFua3MgKi8KLQkJCQkJLyogKGVzaSBpcyBzZXR1cCBmcm9tIHRoZSB3cml0ZSB0byByb3cgMTIgd3JhcCkgKi8KLQljbXBsCSVlYngsICVlYXgJCS8qIGNoZWNrIGZvciBBQSBwYXR0ZXJuICAoZWF4IGhvbGRzIHRoZSBhYSBwYXR0ZXJuKSAqLwotCWp6CW9ubHkyCQkJLyogaWYgcGF0dGVybiA9PSBBQSwgd2Ugb25seSBoYXZlIDIgYmFua3MgKi8KLQotCS8qIDQgYmFua3MgKi8KLQotCW1vdncJJDB4MDA4LCAlZGkJCS8qIHZhbHVlIGZvciA0IGJhbmtzIGluIERJIChCTktfQ05UIGJpdCkgKi8KLQljbXBsCSRST1cxMV9EQVRBLCAlZWJ4CS8qIG9ubHkgb3RoZXIgbGVnaXRpbWF0ZSB2YWx1ZXMgYXJlIDExICovCi0JanoJb25seTIKLQljbXBsCSRST1cxMl9EQVRBLCAlZWJ4CS8qIGFuZCAxMiAqLwotCWpuegliYWRfcmFtCQkJLyogaXRzIGJhZCBpZiBub3QgMTEgb3IgMTIhICovCi0KLQkvKiBmYWxsIHRocm91Z2ggKi8KLW9ubHkyOgotIC8qCi0gICogdmFsaWRhdGUgcm93IG1hc2sKLSAgKi8KLQltb3ZsCSRST1cxNF9BRFIsICVlc2kJLyogc2V0IGFkZHJlc3MgYmFjayB0byBtYXggcm93IHdyYXAgYWRkciAqLwotCW1vdmwJKCVlc2kpLCAlZWF4CQkvKiByZWFkIGFjdHVhbCBudW1iZXIgb2Ygcm93cyBAIHJvdzE0IGFkciAqLwotCi0JY21wbAkkUk9XMTFfREFUQSwgJWVheAkvKiByb3cgbXVzdCBiZSBncmVhdGVyIHRoYW4gMTEgcGF0dGVybiAqLwotCWpiCWJhZF9yYW0KLQotCWNtcGwJJFJPVzE0X0RBVEEsICVlYXgJLyogYW5kIHJvdyBtdXN0IGJlIGxlc3MgdGhhbiAxNCBwYXR0ZXJuICovCi0JamEJYmFkX3JhbQotCi0JY21wYgklYWgsICVhbAkJLyogdmVyaWZ5IGFsbCA0IGJ5dGVzIG9mIGR3b3JkIHNhbWUgKi8KLQlqbnoJYmFkX3JhbQotCW1vdmwJJWVheCwgJWVieAotCXNocmwJJDE2LCAlZWJ4Ci0JY21wdwklYngsICVheAotCWpuegliYWRfcmFtCi0KLQkvKgotCSAqIHJlYWQgY29sIDExIHdyYXAgYWRyIGZvciByZWFsIGNvbHVtbiBkYXRhIHZhbHVlCi0JICovCi0JbW92bAkkQ09MMTFfQURSLCAlZXNpCS8qIHNldCBhZGRyZXNzIHRvIG1heCBjb2wgKDExKSB3cmFwIGFkZHIgKi8KLQltb3ZsCSglZXNpKSwgJWVheAkJLyogcmVhZCByZWFsIGNvbCBudW1iZXIgYXQgbWF4IGNvbCBhZHIgKi8KLQotCS8qCi0JICogdmFsaWRhdGUgY29sdW1uIGRhdGEKLQkgKi8KLQljbXBsCSRDT0wwOF9EQVRBLCAlZWF4CS8qIGNvbCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA4IHBhdHRlcm4gKi8KLQlqYgliYWRfcmFtCi0KLQljbXBsCSRDT0wxMV9EQVRBLCAlZWF4CS8qIGFuZCByb3cgbXVzdCBiZSBsZXNzIHRoYW4gMTEgcGF0dGVybiAqLwotCWphCWJhZF9yYW0KLQotCXN1YmwJJENPTDA4X0RBVEEsICVlYXgJLyogbm9ybWFsaXplIGNvbHVtbiBkYXRhIHRvIHplcm8gKi8KLQlqYwliYWRfcmFtCi0JY21wYgklYWgsICVhbAkJLyogdmVyaWZ5IGFsbCA0IGJ5dGVzIG9mIGR3b3JkIGVxdWFsICovCi0Jam56CWJhZF9yYW0KLQltb3ZsCSVlYXgsICVlZHgKLQlzaHJsCSQxNiwgJWVkeAotCWNtcHcJJWR4LCAlYXgKLQlqbnoJYmFkX3JhbQotCi0JLyoKLQkgKiBtZXJnZSBiYW5rIGFuZCBjb2wgZGF0YSB0b2dldGhlcgotCSAqLwotCWFkZHcJJWRpLCAlZHgJCS8qIG1lcmdlIG9mIGJhbmsgYW5kIGNvbCBpbmZvIGluIGRsICovCi0KLQkvKgotCSAqIGZpeCBlbmRpbmcgYWRkciBtYXNrIGJhc2VkIHVwb24gY29sIGluZm8KLQkgKi8KLQltb3ZiCSQweDAzLCAlYWwKLQlzdWJiCSVkaCwgJWFsCQkvKiBkaCBjb250YWlucyB0aGUgb3ZlcmZsb3cgZnJvbSB0aGUgYmFuay9jb2wgbWVyZ2UgICovCi0JbW92YgklYmwsICVkaAkJLyogYmwgY29udGFpbnMgdGhlIHJvdyBtYXNrIChhYSwgMDcsIDBmLCAxZiBvciAzZikgKi8KLQl4Y2hndwklY3gsICVheAkJLyogY3ggPSBheCA9IDMgb3IgMiBkZXBlbmRpbmcgb24gMiBvciA0IGJhbmsgZGV2aWNlICovCi0Jc2hyYgklY2wsICVkaAotCWluY2IJJWRoCQkJLyogZW5kaW5nIGFkZHIgaXMgMSBncmVhdGVyIHRoYW4gcmVhbCBlbmQgKi8KLQl4Y2hndwklY3gsICVheAkJLyogY3ggaXMgYmFuayBudW1iZXIgYWdhaW4gKi8KLQotYmFkX3JlaW50OgotCS8qCi0JICogaXNzdWUgYWxsIGJhbmtzIHByZWNoYXJnZQotCSAqLwotCW1vdmwJJFNDNTIwX0RSQ0NUTCwgJWVzaQkvKiBzZXR1cCBEUkFNIGNvbnRyb2wgcmVnaXN0ZXIgd2l0aCAqLwotCW1vdmIJJDB4MDIsICVhbAkJLyogQWxsIGJhbmtzIHByZWNoYXJnZSAqLwotCW1vdmIJJWFsLCAoJWVzaSkKLQltb3ZsCSRDQUNIRUxJTkVTWiwgJWVzaQkvKiBhZGRyZXNzIHRvIGluaXQgcmVhZCBidWZmZXIgKi8KLQltb3Z3CSVheCwgKCVlc2kpCi0KLQkvKgotCSAqIHVwZGF0ZSBFTkRJTkcgQUREUkVTUyBSRUdJU1RFUgotCSAqLwotCW1vdmwJJFNDNTIwX0RSQ0JFTkRBRFIsICVlZGkJLyogRFJBTSBlbmRpbmcgYWRkcmVzcyByZWdpc3RlciAqLwotCW1vdmwJJWVjeCwgJWVieAotCWFkZGwJJWVieCwgJWVkaQotCW1vdmIJJWRoLCAoJWVkaSkKLQotCS8qCi0JICogdXBkYXRlIENPTkZJRyBSRUdJU1RFUgotCSAqLwotCXhvcmIJJWRoLCAlZGgKLQltb3Z3CSQweDAwMGYsICVieAotCW1vdncJJWN4LCAlYXgKLQlzaGx3CSQyLCAlYXgKLQl4Y2hndwklY3gsICVheAotCXNobHcJJWNsLCAlZHgKLQlzaGx3CSVjbCwgJWJ4Ci0Jbm90dwklYngKLQl4Y2hndwklY3gsICVheAotCW1vdmwJJFNDNTIwX0RSQ0NGRywgJWVkaQotCW1vdncJKCVlZGkpLCAlYXgKLQlhbmR3CSVieCwgJWF4Ci0Jb3J3CSVkeCwgJWF4Ci0JbW92dwklYXgsICglZWRpKQotCWpjeHoJY2xlYW51cAotCi0JZGVjdwklY3gKLQltb3ZsCSVlY3gsICVlYngKLQltb3ZsCSRTQzUyMF9EUkNCRU5EQURSLCAlZWRpCS8qIERSQU0gZW5kaW5nIGFkZHJlc3MgcmVnaXN0ZXIgKi8KLQltb3ZiCSQweGZmLCAlYWwKLQlhZGRsCSVlYngsICVlZGkKLQltb3ZiCSVhbCwgKCVlZGkpCi0KLQkvKgotCSAqIHNldCBjb250cm9sIHJlZ2lzdGVyIHRvIE5PUk1BTCBtb2RlCi0JICovCi0JbW92bAkkU0M1MjBfRFJDQ1RMLCAlZXNpCS8qIHNldHVwIERSQU0gY29udHJvbCByZWdpc3RlciB3aXRoICovCi0JbW92YgkkMHgwMCwgJWFsCQkvKiBOb3JtYWwgbW9kZSB2YWx1ZSAqLwotCW1vdmIJJWFsLCAoJWVzaSkKLQltb3ZsCSRDQUNIRUxJTkVTWiwgJWVzaQkvKiBhZGRyZXNzIHRvIGluaXQgcmVhZCBidWZmZXIgKi8KLQltb3Z3CSVheCwgKCVlc2kpCi0Jam1wCW5leHRiYW5rCi0KLWNsZWFudXA6Ci0JbW92bAkkU0M1MjBfRFJDQkVOREFEUiwgJWVkaQkvKiBEUkFNIGVuZGluZyBhZGRyZXNzIHJlZ2lzdGVyICAqLwotCW1vdncJJDB4MDQsICVjeAotCXhvcncJJWF4LCAlYXgKLWNsZWFudXBscDoKLQltb3ZiCSglZWRpKSwgJWFsCi0Jb3JiCSVhbCwgJWFsCi0JanoJZW1wdHliYW5rCi0KLQlhZGRiCSVhaCwgJWFsCi0Jam5zCW5vdHRvb211Y2gKLQotCW1vdmIJJDB4N2YsICVhbAotbm90dG9vbXVjaDoKLQltb3ZiCSVhbCwgJWFoCi0Jb3JiCSQweDgwLCAlYWwKLQltb3ZiCSVhbCwgKCVlZGkpCi1lbXB0eWJhbms6Ci0JaW5jbAklZWRpCi0JbG9vcAljbGVhbnVwbHAKLQotI2lmIGRlZmluZWQgQ09ORklHX1NZU19TRFJBTV9EUkNUTUNUTAotCS8qIGp1c3QgaGF2ZSB5b3VyIGhhcmR3YXJlIGRlc2luZ2VyIF9HSVZFXyB5b3Ugd2hhdCB5b3UgbmVlZCBoZXJlISAqLwotCW1vdmwJJFNDNTIwX0RSQ1RNQ1RMLCAlZWRpCi0JbW92YgkkQ09ORklHX1NZU19TRFJBTV9EUkNUTUNUTCwgJWFsCi0JbW92YgklYWwsICglZWRpKQotI2Vsc2UKLSNpZiBkZWZpbmVkKENPTkZJR19TWVNfU0RSQU1fQ0FTX0xBVEVOQ1lfMlQpIHx8IGRlZmluZWQoQ09ORklHX1NZU19TRFJBTV9DQVNfTEFURU5DWV8zVCkKLQkvKgotCSAqIFNldCB0aGUgQ0FTIGxhdGVuY3kgbm93IHNpbmNlIGl0IGlzIGhhcmQgdG8gZG8KLQkgKiB3aGVuIHdlIHJ1biBmcm9tIHRoZSBSQU0KLQkgKi8KLQltb3ZsCSRTQzUyMF9EUkNUTUNUTCwgJWVkaQkvKiBEUkFNIHRpbWluZyByZWdpc3RlciAqLwotCW1vdmIJKCVlZGkpLCAlYWwKLSNpZmRlZiBDT05GSUdfU1lTX1NEUkFNX0NBU19MQVRFTkNZXzJUCi0JYW5kYgkkMHhlZiwgJWFsCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU1lTX1NEUkFNX0NBU19MQVRFTkNZXzNUCi0Jb3JiCSQweDEwLCAlYWwKLSNlbmRpZgotCW1vdmIJJWFsLCAoJWVkaSkKLSNlbmRpZgotI2VuZGlmCi0JbW92bAkkU0M1MjBfRFJDQ1RMLCAlZWRpCS8qIERSQU0gQ29udHJvbCByZWdpc3RlciAqLwotCW1vdmIJJDB4MDMsICVhbAkvKiBMb2FkIG1vZGUgcmVnaXN0ZXIgY21kICovCi0JbW92YgklYWwsICglZWRpKQotCW1vdncJJWF4LCAoJWVzaSkKLQotCi0JbW92bAkkU0M1MjBfRFJDQ1RMLCAlZWRpCS8qIERSQU0gQ29udHJvbCByZWdpc3RlciAqLwotCW1vdmIJJDB4MTgsICVhbAkvKiAgRW5hYmxlIHJlZnJlc2ggYW5kIE5PUk1BTCBtb2RlICovCi0JbW92YgklYWwsICglZWRpKQotCi0Jam1wCWRyYW1fZG9uZQotCi1iYWRfcmFtOgotCXhvcmwJJWVkeCwgJWVkeAotCXhvcmwJJWVkaSwgJWVkaQotCWptcAliYWRfcmVpbnQKLQotZHJhbV9kb25lOgotCS8qIFJlc3RvcmUgQm9vdCBGbGFncyAqLwotCW1vdmwJJWVieCwgJWVicAotCXJldAotCi0jaWYgQ09ORklHX1NZU19TRFJBTV9FQ0NfRU5BQkxFCi0uZ2xvYmwgaW5pdF9lY2MKLWluaXRfZWNjOgotCS8qIEEgbm9taW5hbCBtZW1vcnkgdGVzdDoganVzdCBhIGJ5dGUgYXQgZWFjaCBhZGRyZXNzIGxpbmUgKi8KLQltb3ZsCSVlYXgsICVlY3gKLQlzaHJsCSQweDEsICVlY3gKLQltb3ZsCSQweDEsICVlZGkKLW1lbXRlc3QwOgotCW1vdmIJJDB4YTUsICglZWRpKQotCWNtcGIJJDB4YTUsICglZWRpKQotCWpuZQlvdXQKLQlzaHJsCSQweDEsICVlY3gKLQlhbmRsCSVlY3gsICVlY3gKLQlqeglzZXRfZWNjCi0Jc2hsbAkkMHgxLCAlZWRpCi0Jam1wCW1lbXRlc3QwCi0KLXNldF9lY2M6Ci0JLyogY2xlYXIgYWxsIHJhbSB3aXRoIGEgbWVtc2V0ICovCi0JbW92bAklZWF4LCAlZWN4Ci0JeG9ybAklZXNpLCAlZXNpCi0JeG9ybAklZWRpLCAlZWRpCi0JeG9ybAklZWF4LCAlZWF4Ci0Jc2hybAkkMHgyLCAlZWN4Ci0JY2xkCi0JcmVwCXN0b3NsCi0KLQkvKiBlbmFibGUgcmVhZCwgd3JpdGUgYnVmZmVycyAqLwotCW1vdmIJJDB4MTEsICVhbAotCW1vdmwJJFNDNTIwX0RCQ1RMLCAlZWRpCi0JbW92YgklYWwsICglZWRpKQotCi0JLyogZW5hYmxlIE5NSSBtYXBwaW5nIGZvciBFQ0MgKi8KLQltb3ZsCSRTQzUyMF9FQ0NJTlQsICVlZGkKLQltb3ZiCSQweDEwLCAlYWwKLQltb3ZiCSVhbCwgKCVlZGkpCi0KLQkvKiBUdXJuIG9uIEVDQyAqLwotCW1vdmwJJFNDNTIwX0VDQ0NUTCwgJWVkaQotCW1vdmIJJDB4MDUsICVhbAotCW1vdmIJJWFsLCglZWRpKQotCi1vdXQ6Ci0JcmV0Ci0jZW5kaWYKLQotLyoKLSAqIFJlYWQgYW5kIGRlY29kZSB0aGUgc2M1MjAgRFJDQkVOREFEUiBNTUNSIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZgotICogYXZhaWxhYmxlIHJhbSBieXRlcyBpbiAlZWF4Ci0gKi8KLS5nbG9ibCBnZXRfbWVtX3NpemUKLWdldF9tZW1fc2l6ZToKLQltb3ZsCSRTQzUyMF9EUkNCRU5EQURSLCAlZWRpCS8qIERSQU0gZW5kaW5nIGFkZHJlc3MgcmVnaXN0ZXIgKi8KLQotYmFuazA6CW1vdmwJKCVlZGkpLCAlZWF4Ci0JbW92bAklZWF4LCAlZWN4Ci0JYW5kbAkkMHgwMDAwMDA4MCwgJWVjeAotCWp6CWJhbmsxCi0JYW5kbAkkMHgwMDAwMDA3ZiwgJWVheAotCXNobGwJJDIyLCAlZWF4Ci0JbW92bAklZWF4LCAlZWR4Ci0KLWJhbmsxOgltb3ZsCSglZWRpKSwgJWVheAotCW1vdmwJJWVheCwgJWVjeAotCWFuZGwJJDB4MDAwMDgwMDAsICVlY3gKLQlqegliYW5rMgotCWFuZGwJJDB4MDAwMDdmMDAsICVlYXgKLQlzaGxsCSQxNCwgJWVheAotCW1vdmwJJWVheCwgJWVkeAotCi1iYW5rMjoJbW92bAkoJWVkaSksICVlYXgKLQltb3ZsCSVlYXgsICVlY3gKLQlhbmRsCSQweDAwODAwMDAwLCAlZWN4Ci0JanoJYmFuazMKLQlhbmRsCSQweDAwN2YwMDAwLCAlZWF4Ci0Jc2hsbAkkNiwgJWVheAotCW1vdmwJJWVheCwgJWVkeAotCi1iYW5rMzoJbW92bAkoJWVkaSksICVlYXgKLQltb3ZsCSVlYXgsICVlY3gKLQlhbmRsCSQweDgwMDAwMDAwLCAlZWN4Ci0JanoJZG9uZQotCWFuZGwJJDB4N2YwMDAwMDAsICVlYXgKLQlzaHJsCSQyLCAlZWF4Ci0JbW92bAklZWF4LCAlZWR4Ci0KLWRvbmU6Ci0JbW92bAklZWR4LCAlZWF4Ci0JcmV0CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvY3B1L3NjNTIwL3NjNTIwX3NkcmFtLmMgYi9hcmNoL2kzODYvY3B1L3NjNTIwL3NjNTIwX3NkcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhYjU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9jcHUvc2M1MjAvc2M1MjBfc2RyYW0uYwpAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAxMAorICogR3JhZW1lIFJ1c3MgPGdyYWVtZS5ydXNzQGdtYWlsLmNvbT4uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KKyNpbmNsdWRlIDxhc20vaWMvc2M1MjAuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK3N0cnVjdCBzYzUyMF9zZHJhbV9pbmZvIHsKKwl1OCBiYW5rczsKKwl1OCBjb2x1bW5zOworCXU4IHJvd3M7CisJdTggc2l6ZTsKK307CisKK3N0YXRpYyB2b2lkIHNjNTIwX3NpemVtZW0odm9pZCk7CitzdGF0aWMgdm9pZCBzYzUyMF9zZXRfZHJhbV90aW1pbmcodm9pZCk7CitzdGF0aWMgdm9pZCBzYzUyMF9zZXRfZHJhbV9yZWZyZXNoX3JhdGUodm9pZCk7CitzdGF0aWMgdm9pZCBzYzUyMF9lbmFibGVfZHJhbV9yZWZyZXNoKHZvaWQpOworc3RhdGljIHZvaWQgc2M1MjBfZW5hYmxlX3NkcmFtKHZvaWQpOworI2lmIENPTkZJR19TWVNfU0RSQU1fRUNDX0VOQUJMRQorc3RhdGljIHZvaWQgc2M1MjBfZW5hYmxlX2VjYyh2b2lkKQorI2VuZGlmCisKK2ludCBkcmFtX2luaXRfZih2b2lkKQoreworCXNjNTIwX3NpemVtZW0oKTsKKwlzYzUyMF9zZXRfZHJhbV90aW1pbmcoKTsKKwlzYzUyMF9zZXRfZHJhbV9yZWZyZXNoX3JhdGUoKTsKKwlzYzUyMF9lbmFibGVfZHJhbV9yZWZyZXNoKCk7CisJc2M1MjBfZW5hYmxlX3NkcmFtKCk7CisjaWYgQ09ORklHX1NZU19TRFJBTV9FQ0NfRU5BQkxFCisJc2M1MjBfZW5hYmxlX2VjYygpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjNTIwX2R1bW15X3dyaXRlKHZvaWQpCit7CisJd3JpdGV3KDB4MDAwMCwgQ0FDSEVMSU5FU1opOworfQorc3RhdGljIGlubGluZSB2b2lkIHNjNTIwX2lzc3VlX3NkcmFtX29wX21vZGVfc2VsZWN0KHU4IGNvbW1hbmQpCit7CisJd3JpdGViKGNvbW1hbmQsICZzYzUyMF9tbWNyLT5kcmNjdGwpOworCXNjNTIwX2R1bW15X3dyaXRlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2xvbmcodTMyIHRlc3RfbG9uZykKK3sKKwl1OCBpOworCXU4IHRtcF9ieXRlID0gKHU4KSh0ZXN0X2xvbmcgJiAweDAwMDAwMGZmKTsKKworCWZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKwkJaWYgKCh1OCkoKHRlc3RfbG9uZyA+PiAoaSAqIDgpKSAmIDB4MDAwMDAwZmYpICE9IHRtcF9ieXRlKQorCQkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgd3JpdGVfYW5kX3Rlc3QodTMyIGRhdGEsIHUzMiBhZGRyZXNzKQoreworCXdyaXRlbChkYXRhLCBhZGRyZXNzKTsKKwlpZiAocmVhZGwoYWRkcmVzcykgPT0gZGF0YSkKKwkJcmV0dXJuIDA7IC8qIEdvb2QgKi8KKwllbHNlCisJCXJldHVybiAtMTsgLyogQmFkICovCit9CisKK3N0YXRpYyB2b2lkIHNjNTIwX2VuYWJsZV9zZHJhbSh2b2lkKQoreworCXUzMiBwYXJfY29uZmlnOworCisJLyogRW5hYmxlIFdyaXRlcywgQ2FjaGluZyBhbmQgQ29kZSBFeGVjdXRpb24gdG8gU0RSQU0gKi8KKwlwYXJfY29uZmlnID0gcmVhZGwoJnNjNTIwX21tY3ItPnBhclszXSk7CisJcGFyX2NvbmZpZyAmPSB+KFNDNTIwX1BBUl9FWEVDX0RJUyB8CisJCQlTQzUyMF9QQVJfQ0FDSEVfRElTIHwKKwkJCVNDNTIwX1BBUl9XUklURV9ESVMpOworCXdyaXRlbChwYXJfY29uZmlnLCAmc2M1MjBfbW1jci0+cGFyWzNdKTsKKworCXBhcl9jb25maWcgPSByZWFkbCgmc2M1MjBfbW1jci0+cGFyWzRdKTsKKwlwYXJfY29uZmlnICY9IH4oU0M1MjBfUEFSX0VYRUNfRElTIHwKKwkJCVNDNTIwX1BBUl9DQUNIRV9ESVMgfAorCQkJU0M1MjBfUEFSX1dSSVRFX0RJUyk7CisJd3JpdGVsKHBhcl9jb25maWcsICZzYzUyMF9tbWNyLT5wYXJbNF0pOworfQorCitzdGF0aWMgdm9pZCBzYzUyMF9zZXRfZHJhbV90aW1pbmcodm9pZCkKK3sKKwl1OCBkcmN0bWN0bCA9IDB4MDA7CisKKyNpZiBkZWZpbmVkIENPTkZJR19TWVNfU0RSQU1fRFJDVE1DVEwKKwkvKiBqdXN0IGhhdmUgeW91ciBoYXJkd2FyZSBkZXNpZ25lciBfR0lWRV8geW91IHdoYXQgeW91IG5lZWQgaGVyZSEgKi8KKwlkcmN0bWN0bCA9IENPTkZJR19TWVNfU0RSQU1fRFJDVE1DVEw7CisjZWxzZQorCXN3aXRjaCAoQ09ORklHX1NZU19TRFJBTV9SQVNfQ0FTX0RFTEFZKSB7CisJY2FzZSAyOgorCQlicmVhazsKKwljYXNlIDM6CisJCWRyY3RtY3RsIHw9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgNDoKKwlkZWZhdWx0OgorCQlkcmN0bWN0bCB8PSAweDAyOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKENPTkZJR19TWVNfU0RSQU1fUFJFQ0hBUkdFX0RFTEFZKSB7CisJY2FzZSAyOgorCQlicmVhazsKKwljYXNlIDM6CisJCWRyY3RtY3RsIHw9IDB4MDQ7CisJCWJyZWFrOworCWNhc2UgNDoKKwlkZWZhdWx0OgorCQlkcmN0bWN0bCB8PSAweDA4OworCQlicmVhazsKKworCWNhc2UgNjoKKwkJZHJjdG1jdGwgfD0gMHgwYzsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChDT05GSUdfU1lTX1NEUkFNX0NBU19MQVRFTkNZKSB7CisJY2FzZSAyOgorCQlicmVhazsKKwljYXNlIDM6CisJZGVmYXVsdDoKKwkJZHJjdG1jdGwgfD0gMHgxMDsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisJd3JpdGViKGRyY3RtY3RsLCAmc2M1MjBfbW1jci0+ZHJjdG1jdGwpOworCisJLyogSXNzdWUgbG9hZCBtb2RlIHJlZ2lzdGVyIGNvbW1hbmQgKi8KKwlzYzUyMF9pc3N1ZV9zZHJhbV9vcF9tb2RlX3NlbGVjdCgweDAzKTsKK30KKworc3RhdGljIHZvaWQgc2M1MjBfc2V0X2RyYW1fcmVmcmVzaF9yYXRlKHZvaWQpCit7CisJdTggZHJjdGw7CisKKwlkcmN0bCA9IHJlYWRiKCZzYzUyMF9tbWNyLT5kcmNjdGwpOworCWRyY3RsICY9IDB4Y2Y7CisKKwlzd2l0Y2ggKENPTkZJR19TWVNfU0RSQU1fUkVGUkVTSF9SQVRFKSB7CisJY2FzZSA3ODoKKwkJYnJlYWs7CisJY2FzZSAxNTY6CisJZGVmYXVsdDoKKwkJZHJjdGwgfD0gMHgxMDsKKwkJYnJlYWs7CisJY2FzZSAzMTI6CisJCWRyY3RsIHw9IDB4MjA7CisJCWJyZWFrOworCWNhc2UgNjI0OgorCQlkcmN0bCB8PSAweDMwOworCQlicmVhazsKKwl9CisKKwl3cml0ZWIoZHJjdGwsICZzYzUyMF9tbWNyLT5kcmNjdGwpOworfQorCitzdGF0aWMgdm9pZCBzYzUyMF9lbmFibGVfZHJhbV9yZWZyZXNoKHZvaWQpCit7CisJdTggZHJjdGw7CisKKwlkcmN0bCA9IHJlYWRiKCZzYzUyMF9tbWNyLT5kcmNjdGwpOworCWRyY3RsICY9IDB4MzA7IC8qIGtlZXAgcmVmcmVzaCByYXRlICovCisJZHJjdGwgfD0gMHgwODsgLyogZW5hYmxlIHJlZnJlc2gsIG5vcm1hbCBtb2RlICovCisKKwl3cml0ZWIoZHJjdGwsICZzYzUyMF9tbWNyLT5kcmNjdGwpOworfQorCitzdGF0aWMgdm9pZCBzYzUyMF9nZXRfYmFua19pbmZvKGludCBiYW5rLCBzdHJ1Y3Qgc2M1MjBfc2RyYW1faW5mbyAqYmFua19pbmZvKQoreworCXUzMiBjb2xfZGF0YTsKKwl1MzIgcm93X2RhdGE7CisKKwl1MzIgZHJjYmVuZGFkcjsKKwl1MTYgZHJjY2ZnOworCisJdTggYmFua3MgPSAweDAwOworCXU4IGNvbHVtbnMgPSAweDAwOworCXU4IHJvd3MgPSAweDAwOworCisJYmFua19pbmZvLT5iYW5rcyA9IDB4MDA7CisJYmFua19pbmZvLT5jb2x1bW5zID0gMHgwMDsKKwliYW5rX2luZm8tPnJvd3MgPSAweDAwOworCWJhbmtfaW5mby0+c2l6ZSA9IDB4MDA7CisKKwlpZiAoKGJhbmsgPCAwKSB8fCAoYmFuayA+IDMpKSB7CisJCXByaW50ZigiQmFkIEJhbmsgSURcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogU2F2ZSBjb25maWd1cmF0aW9uICovCisJZHJjYmVuZGFkciA9IHJlYWRsKCZzYzUyMF9tbWNyLT5kcmNiZW5kYWRyKTsKKwlkcmNjZmcgPSByZWFkdygmc2M1MjBfbW1jci0+ZHJjY2ZnKTsKKworCS8qIFNldHVwIFNEUkFNIEJhbmsgdG8gbGFyZ2VzdCBwb3NzaWJsZSBzaXplICovCisJd3JpdGV3KDB4MDAwYiA8PCAoYmFuayAqIDQpLCAmc2M1MjBfbW1jci0+ZHJjY2ZnKTsKKworCS8qIFNldCBlbmRpbmcgYWRkcmVzcyBmb3IgdGhpcyBiYW5rICovCisJd3JpdGVsKDB4MDAwMDAwZmYgPDwgKGJhbmsgKiA4KSwgJnNjNTIwX21tY3ItPmRyY2JlbmRhZHIpOworCisJLyogd3JpdGUgY29sIDExIHdyYXAgYWRyICovCisJaWYgKHdyaXRlX2FuZF90ZXN0KENPTDExX0RBVEEsIENPTDExX0FEUikgIT0gMCkKKwkJZ290byByZXN0b3JlX2FuZF9leGl0OworCisJLyogd3JpdGUgY29sIDEwIHdyYXAgYWRyICovCisJaWYgKHdyaXRlX2FuZF90ZXN0KENPTDEwX0RBVEEsIENPTDEwX0FEUikgIT0gMCkKKwkJZ290byByZXN0b3JlX2FuZF9leGl0OworCisJLyogd3JpdGUgY29sIDkgd3JhcCBhZHIgKi8KKwlpZiAod3JpdGVfYW5kX3Rlc3QoQ09MMDlfREFUQSwgQ09MMDlfQURSKSAhPSAwKQorCQlnb3RvIHJlc3RvcmVfYW5kX2V4aXQ7CisKKwkvKiB3cml0ZSBjb2wgOCB3cmFwIGFkciAqLworCWlmICh3cml0ZV9hbmRfdGVzdChDT0wwOF9EQVRBLCBDT0wwOF9BRFIpICE9IDApCisJCWdvdG8gcmVzdG9yZV9hbmRfZXhpdDsKKworCWNvbF9kYXRhID0gcmVhZGwoQ09MMTFfQURSKTsKKworCS8qIEFsbCBmb3VyIGJ5dGVzIGluIHRoZSByZWFkIGxvbmcgbXVzdCBiZSB0aGUgc2FtZSAqLworCWlmIChjaGVja19sb25nKGNvbF9kYXRhKSA8IDApCisJCWdvdG8gcmVzdG9yZV9hbmRfZXhpdDsKKworCWlmICgoY29sX2RhdGEgPj0gQ09MMDhfREFUQSkgJiYgKGNvbF9kYXRhIDw9IENPTDExX0RBVEEpKQorCQljb2x1bW5zID0gKHU4KShjb2xfZGF0YSAmIDB4MDAwMDAwZmYpOworCWVsc2UKKwkJZ290byByZXN0b3JlX2FuZF9leGl0OworCisJLyogd3JpdGUgcm93IDE0IHdyYXAgYWRyICovCisJaWYgKHdyaXRlX2FuZF90ZXN0KFJPVzE0X0RBVEEsIFJPVzE0X0FEUikgIT0gMCkKKwkJZ290byByZXN0b3JlX2FuZF9leGl0OworCisJLyogd3JpdGUgcm93IDEzIHdyYXAgYWRyICovCisJaWYgKHdyaXRlX2FuZF90ZXN0KFJPVzEzX0RBVEEsIFJPVzEzX0FEUikgIT0gMCkKKwkJZ290byByZXN0b3JlX2FuZF9leGl0OworCisJLyogd3JpdGUgcm93IDEyIHdyYXAgYWRyICovCisJaWYgKHdyaXRlX2FuZF90ZXN0KFJPVzEyX0RBVEEsIFJPVzEyX0FEUikgIT0gMCkKKwkJZ290byByZXN0b3JlX2FuZF9leGl0OworCisJLyogd3JpdGUgcm93IDExIHdyYXAgYWRyICovCisJaWYgKHdyaXRlX2FuZF90ZXN0KFJPVzExX0RBVEEsIFJPVzExX0FEUikgIT0gMCkKKwkJZ290byByZXN0b3JlX2FuZF9leGl0OworCisJaWYgKHdyaXRlX2FuZF90ZXN0KFJPVzEwX0RBVEEsIFJPVzEwX0FEUikgIT0gMCkKKwkJZ290byByZXN0b3JlX2FuZF9leGl0OworCisJLyoKKwkgKiByZWFkIGRhdGEgQCByb3cgMTIgd3JhcCBhZHIgdG8gZGV0ZXJtaW5lIG51bWJlciBvZiBiYW5rcywKKwkgKiBhbmQgcmVhZCBkYXRhIEAgcm93IDE0IHdyYXAgYWRyIHRvIGRldGVybWluZSBudW1iZXIgb2Ygcm93cy4KKwkgKiBpZiBkYXRhIEAgcm93IDEyIHdyYXAgYWRyIGlzIG5vdCBBQSwgMTEgb3IgMTIgd2UgaGF2ZSBiYWQgUkFNLgorCSAqIGlmIGRhdGEgQCByb3cgMTIgd3JhcCA9PSBBQSwgd2Ugb25seSBoYXZlIDIgYmFua3MsIE5PVCA0CisJICogaWYgZGF0YSBAIHJvdyAxMiB3cmFwID09IDExIG9yIDEyLCB3ZSBoYXZlIDQgYmFua3MsCisJICovCisJcm93X2RhdGEgPSByZWFkbChST1cxMl9BRFIpOworCisJLyogQWxsIGZvdXIgYnl0ZXMgaW4gdGhlIHJlYWQgbG9uZyBtdXN0IGJlIHRoZSBzYW1lICovCisJaWYgKGNoZWNrX2xvbmcocm93X2RhdGEpICE9IDApCisJCWdvdG8gcmVzdG9yZV9hbmRfZXhpdDsKKworCXN3aXRjaCAocm93X2RhdGEpIHsKKwljYXNlIFJPVzEwX0RBVEE6CisJCWJhbmtzID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIFJPVzExX0RBVEE6CisJY2FzZSBST1cxMl9EQVRBOgorCQliYW5rcyA9IDQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZ290byByZXN0b3JlX2FuZF9leGl0OworCX0KKworCXJvd19kYXRhID0gcmVhZGwoUk9XMTRfQURSKTsKKworCS8qIEFsbCBmb3VyIGJ5dGVzIGluIHRoZSByZWFkIGxvbmcgbXVzdCBiZSB0aGUgc2FtZSAqLworCWlmIChjaGVja19sb25nKHJvd19kYXRhKSAhPSAwKQorCQlnb3RvIHJlc3RvcmVfYW5kX2V4aXQ7CisKKwlzd2l0Y2ggKHJvd19kYXRhKSB7CisJY2FzZSBST1cxMV9EQVRBOgorCWNhc2UgUk9XMTJfREFUQToKKwljYXNlIFJPVzEzX0RBVEE6CisJY2FzZSBST1cxNF9EQVRBOgorCQlyb3dzID0gKHU4KShyb3dfZGF0YSAmIDB4MDAwMDAwZmYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWdvdG8gcmVzdG9yZV9hbmRfZXhpdDsKKwl9CisKKwliYW5rX2luZm8tPmJhbmtzID0gYmFua3M7CisJYmFua19pbmZvLT5jb2x1bW5zID0gY29sdW1uczsKKwliYW5rX2luZm8tPnJvd3MgPSByb3dzOworCisJaWYgKChiYW5rX2luZm8tPmJhbmtzICE9IDApICYmCisJICAgIChiYW5rX2luZm8tPmNvbHVtbnMgIT0gMCkgJiYKKwkgICAgKGJhbmtfaW5mby0+cm93cyAhPSAwKSkgeworCQliYW5rX2luZm8tPnNpemUgPSBiYW5rX2luZm8tPnJvd3M7CisJCWJhbmtfaW5mby0+c2l6ZSA+Pj0gKDExIC0gYmFua19pbmZvLT5jb2x1bW5zKTsKKwkJYmFua19pbmZvLT5zaXplKys7CisJfQorCityZXN0b3JlX2FuZF9leGl0OgorCS8qIFJlc3RvcmUgY29uZmlndXJhdGlvbiAqLworCXdyaXRlbChkcmNiZW5kYWRyLCAmc2M1MjBfbW1jci0+ZHJjYmVuZGFkcik7CisJd3JpdGV3KGRyY2NmZywgJnNjNTIwX21tY3ItPmRyY2NmZyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjNTIwX3NldHVwX3NpemVtZW0odm9pZCkKK3sKKwl1OCBpOworCisJLyogRGlzYWJsZSB3cml0ZSBidWZmZXIgKi8KKwl3cml0ZWIoMHgwMCwgJnNjNTIwX21tY3ItPmRiY3RsKTsKKworCS8qIERpc2FibGUgRUNDICovCisJd3JpdGViKDB4MDAsICZzYzUyMF9tbWNyLT5lY2NjdGwpOworCisJLyogU2V0IHNsb3dlc3QgU0RSQU0gdGltaW5nICovCisJd3JpdGViKDB4MWUsICZzYzUyMF9tbWNyLT5kcmN0bWN0bCk7CisKKwkvKiBJc3N1ZSBhIE5PUCB0byBhbGwgU0RSQU0gYmFua3MgKi8KKwlzYzUyMF9pc3N1ZV9zZHJhbV9vcF9tb2RlX3NlbGVjdCgweDAxKTsKKworCS8qIERlbGF5IGZvciAxMDAgbWljcm9zZWNvbmRzICovCisJdWRlbGF5KDEwMCk7CisKKwkvKiBJc3N1ZSAnQWxsIEJhbmtzIFByZWNoYXJnZScgY29tbWFuZCAqLworCXNjNTIwX2lzc3VlX3NkcmFtX29wX21vZGVfc2VsZWN0KDB4MDIpOworCisJLyogSXNzdWUgMiAnQXV0byBSZWZyZXNoIEVuYWJsZScgY29tbWFuZCAqLworCXNjNTIwX2lzc3VlX3NkcmFtX29wX21vZGVfc2VsZWN0KDB4MDQpOworCXNjNTIwX2R1bW15X3dyaXRlKCk7CisKKwkvKiBJc3N1ZSAnTG9hZCBNb2RlIFJlZ2lzdGVyJyBjb21tYW5kICovCisJc2M1MjBfaXNzdWVfc2RyYW1fb3BfbW9kZV9zZWxlY3QoMHgwMyk7CisKKwkvKiBJc3N1ZSA4IG1vcmUgJ0F1dG8gUmVmcmVzaCBFbmFibGUnIGNvbW1hbmRzICovCisJc2M1MjBfaXNzdWVfc2RyYW1fb3BfbW9kZV9zZWxlY3QoMHgwNCk7CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwkJc2M1MjBfZHVtbXlfd3JpdGUoKTsKKworCS8qIFNldCBjb250cm9sIHJlZ2lzdGVyIHRvICdOb3JtYWwgTW9kZScgKi8KKwl3cml0ZWIoMHgwMCwgJnNjNTIwX21tY3ItPmRyY2N0bCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjNTIwX3NpemVtZW0odm9pZCkKK3sKKwlzdHJ1Y3Qgc2M1MjBfc2RyYW1faW5mbyBzZHJhbV9pbmZvWzRdOworCXU4IGJhbmtfY29uZmlnID0gMHgwMDsKKwl1OCBlbmRfYWRkciA9IDB4MDA7CisJdTE2IGRyY2NmZyA9IDB4MDAwMDsKKwl1MzIgZHJjYmVuZGFkciA9IDB4MDAwMDAwMDA7CisJdTggaTsKKworCS8qIFVzZSBQQVJzIHRvIGRpc2FibGUgY2FjaGluZyBvZiBtYXhpbXVtIGFsbG93YWJsZSAyNTZNQiBTRFJBTSAqLworCXdyaXRlbChTQzUyMF9TRFJBTTFfUEFSIHwgU0M1MjBfUEFSX0NBQ0hFX0RJUywgJnNjNTIwX21tY3ItPnBhclszXSk7CisJd3JpdGVsKFNDNTIwX1NEUkFNMl9QQVIgfCBTQzUyMF9QQVJfQ0FDSEVfRElTLCAmc2M1MjBfbW1jci0+cGFyWzRdKTsKKworCXNjNTIwX3NldHVwX3NpemVtZW0oKTsKKworCWdkLT5yYW1fc2l6ZSA9IDA7CisKKwkvKiBTaXplIGVhY2ggU0RSQU0gYmFuayAqLworCWZvciAoaSA9IDA7IGkgPD0gMzsgaSsrKSB7CisJCXNjNTIwX2dldF9iYW5rX2luZm8oaSwgJnNkcmFtX2luZm9baV0pOworCisJCWlmIChzZHJhbV9pbmZvW2ldLmJhbmtzICE9IDApIHsKKwkJCS8qIFVwZGF0ZSBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJCQliYW5rX2NvbmZpZyA9IHNkcmFtX2luZm9baV0uY29sdW1ucyAtIDg7CisKKwkJCWlmIChzZHJhbV9pbmZvW2ldLmJhbmtzID09IDQpCisJCQkJYmFua19jb25maWcgfD0gMHgwODsKKworCQkJZHJjY2ZnIHw9IGJhbmtfY29uZmlnIDw8IChpICogNCk7CisKKwkJCS8qIFVwZGF0ZSBFbmQgQWRkcmVzcyByZWdpc3RlciAqLworCQkJZW5kX2FkZHIgKz0gc2RyYW1faW5mb1tpXS5zaXplOworCQkJZHJjYmVuZGFkciB8PSAoZW5kX2FkZHIgfCAweDgwKSA8PCAoaSAqIDgpOworCisJCQlnZC0+cmFtX3NpemUgKz0gc2RyYW1faW5mb1tpXS5zaXplIDw8IDIyOworCQl9CisKKwkJLyogSXNzdWUgJ0FsbCBCYW5rcyBQcmVjaGFyZ2UnIGNvbW1hbmQgKi8KKwkJc2M1MjBfaXNzdWVfc2RyYW1fb3BfbW9kZV9zZWxlY3QoMHgwMik7CisKKwkJLyogU2V0IGNvbnRyb2wgcmVnaXN0ZXIgdG8gJ05vcm1hbCBNb2RlJyAqLworCQl3cml0ZWIoMHgwMCwgJnNjNTIwX21tY3ItPmRyY2N0bCk7CisJfQorCisJd3JpdGVsKGRyY2JlbmRhZHIsICZzYzUyMF9tbWNyLT5kcmNiZW5kYWRyKTsKKwl3cml0ZXcoZHJjY2ZnLCAmc2M1MjBfbW1jci0+ZHJjY2ZnKTsKKworCS8qIENsZWFyIFBBUnMgcHJldmVudGluZyBjYWNoaW5nIG9mIFNEUkFNICovCisJd3JpdGVsKDB4MDAwMDAwMDAsICZzYzUyMF9tbWNyLT5wYXJbM10pOworCXdyaXRlbCgweDAwMDAwMDAwLCAmc2M1MjBfbW1jci0+cGFyWzRdKTsKK30KKworI2lmIENPTkZJR19TWVNfU0RSQU1fRUNDX0VOQUJMRQorc3RhdGljIHZvaWQgc2M1MjBfZW5hYmxlX2VjYyh2b2lkKQorCisJLyogQSBub21pbmFsIG1lbW9yeSB0ZXN0OiBqdXN0IGEgYnl0ZSBhdCBlYWNoIGFkZHJlc3MgbGluZSAqLworCW1vdmwJJWVheCwgJWVjeAorCXNocmwJJDB4MSwgJWVjeAorCW1vdmwJJDB4MSwgJWVkaQorbWVtdGVzdDA6CisJbW92YgkkMHhhNSwgKCVlZGkpCisJY21wYgkkMHhhNSwgKCVlZGkpCisJam5lCW91dAorCXNocmwJJDB4MSwgJWVjeAorCWFuZGwJJWVjeCwgJWVjeAorCWp6CXNldF9lY2MKKwlzaGxsCSQweDEsICVlZGkKKwlqbXAJbWVtdGVzdDAKKworc2V0X2VjYzoKKwkvKiBjbGVhciBhbGwgcmFtIHdpdGggYSBtZW1zZXQgKi8KKwltb3ZsCSVlYXgsICVlY3gKKwl4b3JsCSVlc2ksICVlc2kKKwl4b3JsCSVlZGksICVlZGkKKwl4b3JsCSVlYXgsICVlYXgKKwlzaHJsCSQweDIsICVlY3gKKwljbGQKKwlyZXAJc3Rvc2wKKworCS8qIGVuYWJsZSByZWFkLCB3cml0ZSBidWZmZXJzICovCisJbW92YgkkMHgxMSwgJWFsCisJbW92bAkkREJDVEwsICVlZGkKKwltb3ZiCSVhbCwgKCVlZGkpCisKKwkvKiBlbmFibGUgTk1JIG1hcHBpbmcgZm9yIEVDQyAqLworCW1vdmwJJEVDQ0lOVCwgJWVkaQorCW1vdmIJJDB4MTAsICVhbAorCW1vdmIJJWFsLCAoJWVkaSkKKworCS8qIFR1cm4gb24gRUNDICovCisJbW92bAkkRUNDQ1RMLCAlZWRpCisJbW92YgkkMHgwNSwgJWFsCisJbW92YgklYWwsKCVlZGkpCisKK291dDoKKwlqbXAJaW5pdF9lY2NfcmV0Cit9CisjZW5kaWYKKworaW50IGRyYW1faW5pdCh2b2lkKQoreworCXVsb25nIGRyYW1fY3RybDsKKwl1bG9uZyBkcmFtX3ByZXNlbnQgPSAweDAwMDAwMDAwOworCisJLyoKKwkgKiBXZSByZWFkLWJhY2sgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRyYW0KKwkgKiBjb250cm9sbGVyIHRoYXQgdGhlIGFzc2VtYmx5IGNvZGUgd3JvdGUKKwkgKi8KKwlkcmFtX2N0cmwgPSByZWFkbCgmc2M1MjBfbW1jci0+ZHJjYmVuZGFkcik7CisKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc3RhcnQgPSAwOworCWlmIChkcmFtX2N0cmwgJiAweDgwKSB7CisJCS8qIGJhbmsgMCBlbmFibGVkICovCisJCWdkLT5iZC0+YmlfZHJhbVsxXS5zdGFydCA9IChkcmFtX2N0cmwgJiAweDdmKSA8PCAyMjsKKwkJZHJhbV9wcmVzZW50ID0gZ2QtPmJkLT5iaV9kcmFtWzFdLnN0YXJ0OworCQlnZC0+YmQtPmJpX2RyYW1bMF0uc2l6ZSA9IGdkLT5iZC0+YmlfZHJhbVsxXS5zdGFydDsKKwl9IGVsc2UgeworCQlnZC0+YmQtPmJpX2RyYW1bMF0uc2l6ZSA9IDA7CisJCWdkLT5iZC0+YmlfZHJhbVsxXS5zdGFydCA9IGdkLT5iZC0+YmlfZHJhbVswXS5zdGFydDsKKwl9CisKKwlpZiAoZHJhbV9jdHJsICYgMHg4MDAwKSB7CisJCS8qIGJhbmsgMSBlbmFibGVkICovCisJCWdkLT5iZC0+YmlfZHJhbVsyXS5zdGFydCA9IChkcmFtX2N0cmwgJiAweDdmMDApIDw8IDE0OworCQlkcmFtX3ByZXNlbnQgPSBnZC0+YmQtPmJpX2RyYW1bMl0uc3RhcnQ7CisJCWdkLT5iZC0+YmlfZHJhbVsxXS5zaXplID0gZ2QtPmJkLT5iaV9kcmFtWzJdLnN0YXJ0IC0KKwkJCQlnZC0+YmQtPmJpX2RyYW1bMV0uc3RhcnQ7CisJfSBlbHNlIHsKKwkJZ2QtPmJkLT5iaV9kcmFtWzFdLnNpemUgPSAwOworCQlnZC0+YmQtPmJpX2RyYW1bMl0uc3RhcnQgPSBnZC0+YmQtPmJpX2RyYW1bMV0uc3RhcnQ7CisJfQorCisJaWYgKGRyYW1fY3RybCAmIDB4ODAwMDAwKSB7CisJCS8qIGJhbmsgMiBlbmFibGVkICovCisJCWdkLT5iZC0+YmlfZHJhbVszXS5zdGFydCA9IChkcmFtX2N0cmwgJiAweDdmMDAwMCkgPDwgNjsKKwkJZHJhbV9wcmVzZW50ID0gZ2QtPmJkLT5iaV9kcmFtWzNdLnN0YXJ0OworCQlnZC0+YmQtPmJpX2RyYW1bMl0uc2l6ZSA9IGdkLT5iZC0+YmlfZHJhbVszXS5zdGFydCAtCisJCQkJZ2QtPmJkLT5iaV9kcmFtWzJdLnN0YXJ0OworCX0gZWxzZSB7CisJCWdkLT5iZC0+YmlfZHJhbVsyXS5zaXplID0gMDsKKwkJZ2QtPmJkLT5iaV9kcmFtWzNdLnN0YXJ0ID0gZ2QtPmJkLT5iaV9kcmFtWzJdLnN0YXJ0OworCX0KKworCWlmIChkcmFtX2N0cmwgJiAweDgwMDAwMDAwKSB7CisJCS8qIGJhbmsgMyBlbmFibGVkICovCisJCWRyYW1fcHJlc2VudCAgPSAoZHJhbV9jdHJsICYgMHg3ZjAwMDAwMCkgPj4gMjsKKwkJZ2QtPmJkLT5iaV9kcmFtWzNdLnNpemUgPSBkcmFtX3ByZXNlbnQgLQorCQkJCWdkLT5iZC0+YmlfZHJhbVszXS5zdGFydDsKKwl9IGVsc2UgeworCQlnZC0+YmQtPmJpX2RyYW1bM10uc2l6ZSA9IDA7CisJfQorCisJZ2QtPnJhbV9zaXplID0gZHJhbV9wcmVzZW50OworCisJcmV0dXJuIDA7Cit9Cg==