LyoKICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgogICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDkgU2FtIExhbnRpbmdhCgogICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQoKICAgIFNhbSBMYW50aW5nYQogICAgc2xvdWtlbkBsaWJzZGwub3JnCiovCiNpbmNsdWRlICJTRExfY29uZmlnLmgiCgojaWZkZWYgU0RMX0NEUk9NX01BQ09TCgovKiBNYWNPUyBmdW5jdGlvbnMgZm9yIHN5c3RlbS1sZXZlbCBDRC1ST00gYXVkaW8gY29udHJvbCAqLwoKI2luY2x1ZGUgPERldmljZXMuaD4KI2luY2x1ZGUgPEZpbGVzLmg+CiNpbmNsdWRlIDxMb3dNZW0uaD4gLyogVXNlIGVudHJ5IHRhYmxlIG1hY3Jvcywgbm90IGZ1bmN0aW9ucyBpbiBJbnRlcmZhY2VMaWIgICovCgojaW5jbHVkZSAiU0RMX2Nkcm9tLmgiCiNpbmNsdWRlICIuLi9TRExfc3lzY2Ryb20uaCIKI2luY2x1ZGUgIlNETF9zeXNjZHJvbV9jLmgiCgovKiBBZGRlZCBieSBNYXR0IFNsb3QgKi8KI2lmICFkZWZpbmVkKExNR2V0VW5pdFRhYmxlRW50cnlDb3VudCkKICAjZGVmaW5lIExNR2V0VW5pdFRhYmxlRW50cnlDb3VudCgpICAgKihzaG9ydCAqKTB4MDFEMgojZW5kaWYKCi8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBDRC1ST00gZHJpdmVzIHdlJ2xsIGRldGVjdCAqLwojZGVmaW5lIE1BWF9EUklWRVMJMjYJCgovKiBBIGxpc3Qgb2YgYXZhaWxhYmxlIENELVJPTSBkcml2ZXMgKi8Kc3RhdGljIGxvbmcgU0RMX2NkdmVyc2lvbiA9IDA7CnN0YXRpYyBzdHJ1Y3QgewoJc2hvcnQJCWRSZWZOdW07CglzaG9ydAkJZHJpdmVOdW07Cglsb25nCQlmcmFtZXM7CgljaGFyCQluYW1lWzI1Nl07CglCb29sZWFuCQloYXNBdWRpbzsKCX0gU0RMX2NkbGlzdFtNQVhfRFJJVkVTXTsKc3RhdGljIFN0cmluZ1B0ciBnRHJpdmVyTmFtZSA9ICJccC5BcHBsZUNEIjsKCi8qIFRoZSBzeXN0ZW0tZGVwZW5kZW50IENEIGNvbnRyb2wgZnVuY3Rpb25zICovCnN0YXRpYyBjb25zdCBjaGFyICpTRExfU1lTX0NETmFtZShpbnQgZHJpdmUpOwpzdGF0aWMgaW50IFNETF9TWVNfQ0RPcGVuKGludCBkcml2ZSk7CnN0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKTsKc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbik7CnN0YXRpYyBpbnQgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKc3RhdGljIGludCBTRExfU1lTX0NEUGF1c2UoU0RMX0NEICpjZHJvbSk7CnN0YXRpYyBpbnQgU0RMX1NZU19DRFJlc3VtZShTRExfQ0QgKmNkcm9tKTsKc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKTsKc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSk7CnN0YXRpYyB2b2lkIFNETF9TWVNfQ0RDbG9zZShTRExfQ0QgKmNkcm9tKTsKCnN0YXRpYyBzaG9ydCBTRExfU1lTX1Nob3J0VG9CQ0Qoc2hvcnQgdmFsdWUpCnsKCXJldHVybigodmFsdWUgJSAxMCkgKyAodmFsdWUgLyAxMCkgKiAweDEwKTsgLyogQ29udmVydCB2YWx1ZSB0byBCQ0QgKi8KfQoKc3RhdGljIHNob3J0IFNETF9TWVNfQkNEVG9TaG9ydChzaG9ydCB2YWx1ZSkKewoJcmV0dXJuKCh2YWx1ZSAlIDB4MTApICsgKHZhbHVlIC8gMHgxMCkgKiAxMCk7IC8qIENvbnZlcnQgdmFsdWUgZnJvbSBCQ0QgKi8KfQoKaW50ICBTRExfU1lTX0NESW5pdCh2b2lkKQp7CglTSW50MTYJCQlkUmVmTnVtID0gMDsKCVNJbnQxNgkJCWZpcnN0LCBsYXN0OwoKCVNETF9udW1jZHMgPSAwOwoKCS8qIENoZWNrIHRoYXQgdGhlIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSAqLwoJaWYgKEdlc3RhbHQoa0dlc3RhbHRBdWRpb0NEU2VsZWN0b3IsICZTRExfY2R2ZXJzaW9uKSB8fCAKCQkJIVNETF9jZHZlcnNpb24pIHJldHVybigwKTsKCgkvKiBGaWxsIGluIG91ciBkcml2ZXIgY2FwYWJpbGl0aWVzICovCglTRExfQ0RjYXBzLk5hbWUgPSBTRExfU1lTX0NETmFtZTsKCVNETF9DRGNhcHMuT3BlbiA9IFNETF9TWVNfQ0RPcGVuOwoJU0RMX0NEY2Fwcy5HZXRUT0MgPSBTRExfU1lTX0NER2V0VE9DOwoJU0RMX0NEY2Fwcy5TdGF0dXMgPSBTRExfU1lTX0NEU3RhdHVzOwoJU0RMX0NEY2Fwcy5QbGF5ID0gU0RMX1NZU19DRFBsYXk7CglTRExfQ0RjYXBzLlBhdXNlID0gU0RMX1NZU19DRFBhdXNlOwoJU0RMX0NEY2Fwcy5SZXN1bWUgPSBTRExfU1lTX0NEUmVzdW1lOwoJU0RMX0NEY2Fwcy5TdG9wID0gU0RMX1NZU19DRFN0b3A7CglTRExfQ0RjYXBzLkVqZWN0ID0gU0RMX1NZU19DREVqZWN0OwoJU0RMX0NEY2Fwcy5DbG9zZSA9IFNETF9TWVNfQ0RDbG9zZTsKCgkvKiBXYWxrIHRoZSBsaXN0LCBjb3VudCBlYWNoIEF1ZGlvQ0QgZHJpdmVyLCBhbmQgc2F2ZSB0aGUgcmVmbnVtcyAqLwoJZmlyc3QgPSAtMTsKCWxhc3QgPSAwIC0gTE1HZXRVbml0VGFibGVFbnRyeUNvdW50KCk7Cglmb3IoZFJlZk51bSA9IGZpcnN0OyBkUmVmTnVtID49IGxhc3Q7IGRSZWZOdW0tLSkgewoJCVN0cjI1NQkJZHJpdmVyTmFtZTsKCQlTdHJpbmdQdHIJbmFtZVB0cjsKCQlEQ3RsSGFuZGxlCWRldmljZUVudHJ5OwoKCQlkZXZpY2VFbnRyeSA9IEdldERDdGxFbnRyeShkUmVmTnVtKTsKCQlpZiAoISBkZXZpY2VFbnRyeSkgY29udGludWU7CgkJCgkJLyogSXMgdGhpcyBhbiAuQXBwbGVDRCA/ICovCgkJbmFtZVB0ciA9ICgqZGV2aWNlRW50cnkpLT5kQ3RsRmxhZ3MgJiAoMUwgPDwgZFJBTUJhc2VkKSA/CgkJCQkoKFN0cmluZ1B0cikgKChEQ3RsUHRyKSBkZXZpY2VFbnRyeSktPmRDdGxEcml2ZXIgKyAxOCkgOgoJCQkJKChTdHJpbmdQdHIpICgqZGV2aWNlRW50cnkpLT5kQ3RsRHJpdmVyICsgMTgpOwoJCUJsb2NrTW92ZURhdGEobmFtZVB0ciwgZHJpdmVyTmFtZSwgbmFtZVB0clswXSsxKTsKCQlpZiAoZHJpdmVyTmFtZVswXSA+IGdEcml2ZXJOYW1lWzBdKSBkcml2ZXJOYW1lWzBdID0gZ0RyaXZlck5hbWVbMF07CgkJaWYgKCEgRXF1YWxTdHJpbmcoZHJpdmVyTmFtZSwgZ0RyaXZlck5hbWUsIGZhbHNlLCBmYWxzZSkpIGNvbnRpbnVlOwoKCQkvKiBSZWNvcmQgdGhlIGJhc2ljIGluZm8gZm9yIGVhY2ggZHJpdmUgKi8KCQlTRExfY2RsaXN0W1NETF9udW1jZHNdLmRSZWZOdW0gPSBkUmVmTnVtOwoJCUJsb2NrTW92ZURhdGEobmFtZVB0ciArIDEsIFNETF9jZGxpc3RbU0RMX251bWNkc10ubmFtZSwgbmFtZVB0clswXSk7CgkJU0RMX2NkbGlzdFtTRExfbnVtY2RzXS5uYW1lW25hbWVQdHJbMF1dID0gMDsKCQlTRExfY2RsaXN0W1NETF9udW1jZHNdLmhhc0F1ZGlvID0gZmFsc2U7CgkJU0RMX251bWNkcysrOwoJfQoJcmV0dXJuKDApOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqU0RMX1NZU19DRE5hbWUoaW50IGRyaXZlKQp7CglyZXR1cm4oU0RMX2NkbGlzdFtkcml2ZV0ubmFtZSk7Cn0KCnN0YXRpYyBpbnQgZ2V0X2RyaXZlbnVtKGludCBkcml2ZSkKewoJUUhkciAqZHJpdmVRID0gR2V0RHJ2UUhkcigpOwoJRHJ2UUVsICpkcml2ZUVsZW07CgoJLyogVXBkYXRlIHRoZSBkcml2ZSBudW1iZXIgKi8KCVNETF9jZGxpc3RbZHJpdmVdLmRyaXZlTnVtID0gMDsKCWlmICggZHJpdmVRLT5xVGFpbCApIHsKCQlkcml2ZVEtPnFUYWlsLT5xTGluayA9IDA7Cgl9Cglmb3IgKCBkcml2ZUVsZW09KERydlFFbCAqKWRyaXZlUS0+cUhlYWQ7IGRyaXZlRWxlbTsKCSAgICAgIGRyaXZlRWxlbSA9IChEcnZRRWwgKilkcml2ZUVsZW0tPnFMaW5rICkgewoJCWlmICggZHJpdmVFbGVtLT5kUVJlZk51bSA9PSBTRExfY2RsaXN0W2RyaXZlXS5kUmVmTnVtICkgewoJCQlTRExfY2RsaXN0W2RyaXZlXS5kcml2ZU51bSA9IGRyaXZlRWxlbS0+ZFFEcml2ZTsKCQkJYnJlYWs7CgkJfQoJfQoJcmV0dXJuKFNETF9jZGxpc3RbZHJpdmVdLmRyaXZlTnVtKTsKfQoKc3RhdGljIGludCBTRExfU1lTX0NET3BlbihpbnQgZHJpdmUpCnsKCXJldHVybihkcml2ZSk7Cn0KCnN0YXRpYyBpbnQgU0RMX1NZU19DREdldFRPQyhTRExfQ0QgKmNkcm9tKQp7CglDRENudHJsUGFyYW0JCWNkcGI7CglDRFRyYWNrRGF0YQkJCXRyYWNrc1tTRExfTUFYX1RSQUNLU107Cglsb25nCQkJCWksIGxlYWRvdXQ7CgoJLyogR2V0IHRoZSBudW1iZXIgb2YgdHJhY2tzIG9uIHRoZSBDRCBieSBleGFtaW5pbmcgdGhlIFRPQyAqLwoJU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOwoJY2RwYi5pb0NSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bTsKCWNkcGIuY3NDb2RlID0ga1JlYWRUT0M7CgljZHBiLmNzUGFyYW0ud29yZHNbMF0gPSBrR2V0VHJhY2tSYW5nZTsKCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY2RwYikgIT0gbm9FcnIgKSB7CgkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7CgkJcmV0dXJuKC0xKTsKCX0KCgljZHJvbS0+bnVtdHJhY2tzID0gCgkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uYnl0ZXNbMV0pIC0gCgkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uYnl0ZXNbMF0pICsgMTsKCWlmICggY2Ryb20tPm51bXRyYWNrcyA+IFNETF9NQVhfVFJBQ0tTICkKCQljZHJvbS0+bnVtdHJhY2tzID0gU0RMX01BWF9UUkFDS1M7CgljZHJvbS0+c3RhdHVzID0gQ0RfU1RPUFBFRDsKCWNkcm9tLT5jdXJfdHJhY2sgPSAwOyAvKiBBcHBhcmVudGx5IHRoZXNlIGFyZSBzZXQgZWxzZXdoZXJlICovCgljZHJvbS0+Y3VyX2ZyYW1lID0gMDsgLyogQXBwYXJlbnRseSB0aGVzZSBhcmUgc2V0IGVsc2V3aGVyZSAqLwoKCgkvKiBHZXQgdGhlIGxlYWQgb3V0IGFyZWEgb2YgdGhlIENEIGJ5IGV4YW1pbmluZyB0aGUgVE9DICovCglTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOwoJY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07CgljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwoJY2RwYi5jc0NvZGUgPSBrUmVhZFRPQzsKCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IGtHZXRMZWFkT3V0QXJlYTsKCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY2RwYikgIT0gbm9FcnIgKSB7CgkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7CgkJcmV0dXJuKC0xKTsKCX0KCglsZWFkb3V0ID0gTVNGX1RPX0ZSQU1FUygKCQkJU0RMX1NZU19CQ0RUb1Nob3J0KGNkcGIuY3NQYXJhbS5ieXRlc1swXSksCgkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uYnl0ZXNbMV0pLAoJCQlTRExfU1lTX0JDRFRvU2hvcnQoY2RwYi5jc1BhcmFtLmJ5dGVzWzJdKSk7CgoJLyogR2V0IGFuIGFycmF5IG9mIHRyYWNrIGxvY2F0aW9ucyBieSBleGFtaW5pbmcgdGhlIFRPQyAqLwoJU0RMX21lbXNldCh0cmFja3MsIDAsIHNpemVvZih0cmFja3MpKTsKCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7CgljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKCWNkcGIuaW9DUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRSZWZOdW07CgljZHBiLmNzQ29kZSA9IGtSZWFkVE9DOwoJY2RwYi5jc1BhcmFtLndvcmRzWzBdID0ga0dldFRyYWNrRW50cmllczsJLyogVHlwZSBvZiBRdWVyeSAqLwoJKiAoKGxvbmcgKikgKGNkcGIuY3NQYXJhbS53b3JkcysxKSkgPSAobG9uZykgdHJhY2tzOwkJCQkKCWNkcGIuY3NQYXJhbS53b3Jkc1szXSA9IGNkcm9tLT5udW10cmFja3MgKiBzaXplb2YodHJhY2tzWzBdKTsJCQoJKiAoKGNoYXIgKikgKGNkcGIuY3NQYXJhbS53b3Jkcys0KSkgPSAxOwkvKiBGaXJzdCB0cmFjayAqLwoJaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKCQlyZXR1cm4oLTEpOwoJfQoKCS8qIFJlYWQgYWxsIHRoZSB0cmFjayBUT0MgZW50cmllcyAqLwoJU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmhhc0F1ZGlvID0gZmFsc2U7Cglmb3IgKCBpPTA7IGk8Y2Ryb20tPm51bXRyYWNrczsgKytpICkgCgkJewoJCWNkcm9tLT50cmFja1tpXS5pZCA9IGkrMTsKCQlpZiAodHJhY2tzW2ldLmVudHJ5LmNvbnRyb2wgJiBrRGF0YVRyYWNrTWFzaykKCQkJY2Ryb20tPnRyYWNrW2ldLnR5cGUgPSBTRExfREFUQV9UUkFDSzsKCQllbHNlCgkJCXsKCQkJY2Ryb20tPnRyYWNrW2ldLnR5cGUgPSBTRExfQVVESU9fVFJBQ0s7CgkJCVNETF9jZGxpc3RbU0RMX251bWNkc10uaGFzQXVkaW8gPSB0cnVlOwoJCQl9CgkJCgkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldCA9IE1TRl9UT19GUkFNRVMoCgkJCQlTRExfU1lTX0JDRFRvU2hvcnQodHJhY2tzW2ldLmVudHJ5Lm1pbiksCgkJCQlTRExfU1lTX0JDRFRvU2hvcnQodHJhY2tzW2ldLmVudHJ5Lm1pbiksCgkJCQlTRExfU1lTX0JDRFRvU2hvcnQodHJhY2tzW2ldLmVudHJ5LmZyYW1lKSk7CgkJY2Ryb20tPnRyYWNrW2ldLmxlbmd0aCA9IE1TRl9UT19GUkFNRVMoCgkJCQlTRExfU1lTX0JDRFRvU2hvcnQodHJhY2tzW2krMV0uZW50cnkubWluKSwKCQkJCVNETF9TWVNfQkNEVG9TaG9ydCh0cmFja3NbaSsxXS5lbnRyeS5taW4pLAoJCQkJU0RMX1NZU19CQ0RUb1Nob3J0KHRyYWNrc1tpKzFdLmVudHJ5LmZyYW1lKSkgLQoJCQkJY2Ryb20tPnRyYWNrW2ldLm9mZnNldDsKCQl9CgkKCS8qIEFwcGFyZW50bHkgU0RMIHdhbnRzIGEgZmFrZSBsYXN0IGVudHJ5ICovCgljZHJvbS0+dHJhY2tbaV0ub2Zmc2V0ID0gbGVhZG91dDsKCWNkcm9tLT50cmFja1tpXS5sZW5ndGggPSAwOwoKCXJldHVybigwKTsKfQoKLyogR2V0IENELVJPTSBzdGF0dXMgKi8Kc3RhdGljIENEc3RhdHVzIFNETF9TWVNfQ0RTdGF0dXMoU0RMX0NEICpjZHJvbSwgaW50ICpwb3NpdGlvbikKewoJQ0RDbnRybFBhcmFtIGNkcGI7CglDRHN0YXR1cyBzdGF0dXMgPSBDRF9FUlJPUjsKCUJvb2xlYW4gc3Bpbm5pbmcgPSBmYWxzZTsKCglpZiAocG9zaXRpb24pICpwb3NpdGlvbiA9IDA7CgoJLyogR2V0IHRoZSBudW1iZXIgb2YgdHJhY2tzIG9uIHRoZSBDRCBieSBleGFtaW5pbmcgdGhlIFRPQyAqLwoJaWYgKCAhIGdldF9kcml2ZW51bShjZHJvbS0+aWQpICkgewoJCXJldHVybihDRF9UUkFZRU1QVFkpOwoJfQoJU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOwoJY2RwYi5pb0NSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bTsKCWNkcGIuY3NDb2RlID0ga1JlYWRUT0M7CgljZHBiLmNzUGFyYW0ud29yZHNbMF0gPSBrR2V0VHJhY2tSYW5nZTsKCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY2RwYikgIT0gbm9FcnIgKSB7CgkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7CgkJcmV0dXJuKENEX0VSUk9SKTsKCX0KCgljZHJvbS0+bnVtdHJhY2tzID0gCgkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uYnl0ZXNbMV0pIC0gCgkJCVNETF9TWVNfQkNEVG9TaG9ydChjZHBiLmNzUGFyYW0uYnl0ZXNbMF0pICsgMTsKCWlmICggY2Ryb20tPm51bXRyYWNrcyA+IFNETF9NQVhfVFJBQ0tTICkKCQljZHJvbS0+bnVtdHJhY2tzID0gU0RMX01BWF9UUkFDS1M7CgljZHJvbS0+Y3VyX3RyYWNrID0gMDsgLyogQXBwYXJlbnRseSB0aGVzZSBhcmUgc2V0IGVsc2V3aGVyZSAqLwoJY2Ryb20tPmN1cl9mcmFtZSA9IDA7IC8qIEFwcGFyZW50bHkgdGhlc2UgYXJlIHNldCBlbHNld2hlcmUgKi8KCgoJaWYgKDEgfHwgU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmhhc0F1ZGlvKSB7CgkJLyogR2V0IHRoZSBjdXJyZW50IHBsYXliYWNrIHN0YXR1cyAqLwoJCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7CgkJY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07CgkJY2RwYi5pb0NSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bTsKCQljZHBiLmNzQ29kZSA9IGtBdWRpb1N0YXR1czsKCQlpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNkcGIpICE9IG5vRXJyICkgewoJCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKCQkJcmV0dXJuKC0xKTsKCQl9CgkKCQlzd2l0Y2goY2RwYi5jc1BhcmFtLmNkLnN0YXR1cykgewoJCQljYXNlIGtTdGF0dXNQbGF5aW5nOgoJCQkJc3RhdHVzID0gQ0RfUExBWUlORzsKCQkJCXNwaW5uaW5nID0gdHJ1ZTsKCQkJCWJyZWFrOwoJCQljYXNlIGtTdGF0dXNQYXVzZWQ6CgkJCQlzdGF0dXMgPSBDRF9QQVVTRUQ7CgkJCQlzcGlubmluZyA9IHRydWU7CgkJCQlicmVhazsKCQkJY2FzZSBrU3RhdHVzTXV0ZWQ6CgkJCQlzdGF0dXMgPSBDRF9QTEFZSU5HOyAvKiBXaGF0IHNob3VsZCBJIGRvIGhlcmU/ICovCgkJCQlzcGlubmluZyA9IHRydWU7CgkJCQlicmVhazsKCQkJY2FzZSBrU3RhdHVzRG9uZToKCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7CgkJCQlzcGlubmluZyA9IHRydWU7CgkJCQlicmVhazsKCQkJY2FzZSBrU3RhdHVzU3RvcHBlZDoKCQkJCXN0YXR1cyA9IENEX1NUT1BQRUQ7CgkJCQlzcGlubmluZyA9IGZhbHNlOwoJCQkJYnJlYWs7CgkJCWNhc2Uga1N0YXR1c0Vycm9yOgoJCQlkZWZhdWx0OgoJCQkJc3RhdHVzID0gQ0RfRVJST1I7CgkJCQlzcGlubmluZyA9IGZhbHNlOwoJCQkJYnJlYWs7CgkJCX0KCgkJaWYgKHNwaW5uaW5nICYmIHBvc2l0aW9uKSAqcG9zaXRpb24gPSBNU0ZfVE9fRlJBTUVTKAoJCQkJU0RMX1NZU19CQ0RUb1Nob3J0KGNkcGIuY3NQYXJhbS5jZC5taW51dGUpLAoJCQkJU0RMX1NZU19CQ0RUb1Nob3J0KGNkcGIuY3NQYXJhbS5jZC5zZWNvbmQpLAoJCQkJU0RMX1NZU19CQ0RUb1Nob3J0KGNkcGIuY3NQYXJhbS5jZC5mcmFtZSkpOwoJCX0KCWVsc2UKCQlzdGF0dXMgPSBDRF9FUlJPUjsgLyogV2hhdCBzaG91bGQgSSBkbyBoZXJlPyAqLwoKCXJldHVybihzdGF0dXMpOwp9CgovKiBTdGFydCBwbGF5ICovCnN0YXRpYyBpbnQgU0RMX1NZU19DRFBsYXkoU0RMX0NEICpjZHJvbSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQp7CglDRENudHJsUGFyYW0gY2RwYjsKCgkvKiBQYXVzZSB0aGUgY3VycmVudCBhdWRpbyBwbGF5YmFjayB0byBhdm9pZCBhdWRpYmxlIGFydGlmYWN0cyAqLwoJaWYgKCBTRExfU1lTX0NEUGF1c2UoY2Ryb20pIDwgMCApIHsKCQlyZXR1cm4oLTEpOwoJfQoKCS8qIFNwZWNpZnkgdGhlIEF1ZGlvQ0QgcGxheWJhY2sgbW9kZSAqLwoJU0RMX21lbXNldCgmY2RwYiwgMCwgc2l6ZW9mKGNkcGIpKTsKCWNkcGIuaW9WUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRyaXZlTnVtOwoJY2RwYi5pb0NSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bTsKCWNkcGIuY3NDb2RlID0ga1NldFBsYXlNb2RlOwoJY2RwYi5jc1BhcmFtLmJ5dGVzWzBdID0gZmFsc2U7CQkJLyogUmVwZWF0PyAqLwoJY2RwYi5jc1BhcmFtLmJ5dGVzWzFdID0ga1BsYXlNb2RlU2VxdWVudGlhbDsJLyogUGxheSBtb2RlICovCgkvKiClpaXKVHJlYXQgYXMgc29mdCBlcnJvciwgTkVDIERyaXZlIGRvZXNudCBzdXBwb3J0IHRoaXMgY2FsbCClpaUgKi8KCVBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpICZjZHBiKTsKCiNpZiAxCgkvKiBTcGVjaWZ5IHRoZSBlbmQgb2YgYXVkaW8gcGxheWJhY2sgKi8KCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7CgljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKCWNkcGIuaW9DUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRSZWZOdW07CgljZHBiLmNzQ29kZSA9IGtBdWRpb1N0b3A7CgljZHBiLmNzUGFyYW0ud29yZHNbMF0gPSBrQmxvY2tQb3NpdGlvbjsJCS8qIFBvc2l0aW9uIE1vZGUgKi8KCSoobG9uZyAqKSAoY2RwYi5jc1BhcmFtLndvcmRzICsgMSkgPSBzdGFydCtsZW5ndGgtMTsgLyogU2VhcmNoIEFkZHJlc3MgKi8KCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY2RwYikgIT0gbm9FcnIgKSB7CgkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7CgkJcmV0dXJuKC0xKTsKCX0KCgkvKiBTcGVjaWZ5IHRoZSBzdGFydCBvZiBhdWRpbyBwbGF5YmFjaywgYW5kIHN0YXJ0IGl0ICovCglTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOwoJY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07CgljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwoJY2RwYi5jc0NvZGUgPSBrQXVkaW9QbGF5OwoJY2RwYi5jc1BhcmFtLndvcmRzWzBdID0ga0Jsb2NrUG9zaXRpb247CQkJLyogUG9zaXRpb24gTW9kZSAqLwoJKihsb25nICopIChjZHBiLmNzUGFyYW0ud29yZHMgKyAxKSA9IHN0YXJ0KzE7CS8qIFNlYXJjaCBBZGRyZXNzICovCgljZHBiLmNzUGFyYW0ud29yZHNbM10gPSBmYWxzZTsJCQkJCS8qIFN0b3AgYWRkcmVzcz8gKi8KCWNkcGIuY3NQYXJhbS53b3Jkc1s0XSA9IGtTdGVyZW9QbGF5TW9kZTsJCS8qIEF1ZGlvIFBsYXkgTW9kZSAqLwoJaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKCQlyZXR1cm4oLTEpOwoJfQojZWxzZQoJLyogU3BlY2lmeSB0aGUgZW5kIG9mIGF1ZGlvIHBsYXliYWNrICovCglGUkFNRVNfVE9fTVNGKHN0YXJ0K2xlbmd0aCwgJm0sICZzLCAmZik7CglTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOwoJY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07CgljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwoJY2RwYi5jc0NvZGUgPSBrQXVkaW9TdG9wOwoJY2RwYi5jc1BhcmFtLndvcmRzWzBdID0ga1RyYWNrUG9zaXRpb247CQkJLyogUG9zaXRpb24gTW9kZSAqLwoJY2RwYi5jc1BhcmFtLndvcmRzWzFdID0gMDsJCQkJCQkvKiBTZWFyY2ggQWRkcmVzcyAoaGl3b3JkKSovCgljZHBiLmNzUGFyYW0ud29yZHNbMl0gPSAJCQkJCQkvKiBTZWFyY2ggQWRkcmVzcyAobG93b3JkKSovCgkJCVNETF9TWVNfU2hvcnRUb0JDRChjZHJvbS0+bnVtdHJhY2tzKTsJCglpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNkcGIpICE9IG5vRXJyICkgewoJCVNETF9TZXRFcnJvcigiUEJDb250cm9sU3luYygpIGZhaWxlZCIpOwoJCXJldHVybigtMSk7Cgl9CgoJLyogU3BlY2lmeSB0aGUgc3RhcnQgb2YgYXVkaW8gcGxheWJhY2ssIGFuZCBzdGFydCBpdCAqLwoJRlJBTUVTX1RPX01TRihzdGFydCwgJm0sICZzLCAmZik7CglTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOwoJY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07CgljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwoJY2RwYi5jc0NvZGUgPSBrQXVkaW9QbGF5OwoJY2RwYi5jc1BhcmFtLndvcmRzWzBdID0ga1RyYWNrUG9zaXRpb247CQkJLyogUG9zaXRpb24gTW9kZSAqLwoJY2RwYi5jc1BhcmFtLndvcmRzWzFdID0gMDsJCQkJCQkvKiBTZWFyY2ggQWRkcmVzcyAoaGl3b3JkKSovCgljZHBiLmNzUGFyYW0ud29yZHNbMl0gPSBTRExfU1lTX1Nob3J0VG9CQ0QoMSk7CS8qIFNlYXJjaCBBZGRyZXNzIChsb3dvcmQpKi8KCWNkcGIuY3NQYXJhbS53b3Jkc1szXSA9IGZhbHNlOwkJCQkJLyogU3RvcCBhZGRyZXNzPyAqLwoJY2RwYi5jc1BhcmFtLndvcmRzWzRdID0ga1N0ZXJlb1BsYXlNb2RlOwkJLyogQXVkaW8gUGxheSBNb2RlICovCglpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNkcGIpICE9IG5vRXJyICkgewoJCVNETF9TZXRFcnJvcigiUEJDb250cm9sU3luYygpIGZhaWxlZCIpOwoJCXJldHVybigtMSk7Cgl9CiNlbmRpZgoKCXJldHVybigwKTsKfQoKLyogUGF1c2UgcGxheSAqLwpzdGF0aWMgaW50IFNETF9TWVNfQ0RQYXVzZShTRExfQ0QgKmNkcm9tKQp7CglDRENudHJsUGFyYW0gY2RwYjsKCglTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOwoJY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07CgljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwoJY2RwYi5jc0NvZGUgPSBrQXVkaW9QYXVzZTsKCWNkcGIuY3NQYXJhbS53b3Jkc1swXSA9IDA7CS8qIFBhdXNlL0NvbnRpbnVlIEZsYWcgKGhpd29yZCkgKi8KCWNkcGIuY3NQYXJhbS53b3Jkc1sxXSA9IDE7CS8qIFBhdXNlL0NvbnRpbnVlIEZsYWcgKGxvd29yZCkgKi8KCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY2RwYikgIT0gbm9FcnIgKSB7CgkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7CgkJcmV0dXJuKC0xKTsKCX0KCXJldHVybigwKTsKfQoKLyogUmVzdW1lIHBsYXkgKi8Kc3RhdGljIGludCBTRExfU1lTX0NEUmVzdW1lKFNETF9DRCAqY2Ryb20pCnsKCUNEQ250cmxQYXJhbSBjZHBiOwoKCVNETF9tZW1zZXQoJmNkcGIsIDAsIHNpemVvZihjZHBiKSk7CgljZHBiLmlvVlJlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kcml2ZU51bTsKCWNkcGIuaW9DUmVmTnVtID0gU0RMX2NkbGlzdFtjZHJvbS0+aWRdLmRSZWZOdW07CgljZHBiLmNzQ29kZSA9IGtBdWRpb1BhdXNlOwoJY2RwYi5jc1BhcmFtLndvcmRzWzBdID0gMDsJLyogUGF1c2UvQ29udGludWUgRmxhZyAoaGl3b3JkKSAqLwoJY2RwYi5jc1BhcmFtLndvcmRzWzFdID0gMDsJLyogUGF1c2UvQ29udGludWUgRmxhZyAobG93b3JkKSAqLwoJaWYgKCBQQkNvbnRyb2xTeW5jKChQYXJtQmxrUHRyKSZjZHBiKSAhPSBub0VyciApIHsKCQlTRExfU2V0RXJyb3IoIlBCQ29udHJvbFN5bmMoKSBmYWlsZWQiKTsKCQlyZXR1cm4oLTEpOwoJfQoJcmV0dXJuKDApOwp9CgovKiBTdG9wIHBsYXkgKi8Kc3RhdGljIGludCBTRExfU1lTX0NEU3RvcChTRExfQ0QgKmNkcm9tKQp7CglDRENudHJsUGFyYW0gY2RwYjsKCglTRExfbWVtc2V0KCZjZHBiLCAwLCBzaXplb2YoY2RwYikpOwoJY2RwYi5pb1ZSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZHJpdmVOdW07CgljZHBiLmlvQ1JlZk51bSA9IFNETF9jZGxpc3RbY2Ryb20tPmlkXS5kUmVmTnVtOwoJY2RwYi5jc0NvZGUgPSBrQXVkaW9TdG9wOwoJY2RwYi5jc1BhcmFtLndvcmRzWzBdID0gMDsJCS8qIFBvc2l0aW9uIE1vZGUgKi8KCWNkcGIuY3NQYXJhbS53b3Jkc1sxXSA9IDA7CQkvKiBTZWFyY2ggQWRkcmVzcyAoaGl3b3JkKSAqLwoJY2RwYi5jc1BhcmFtLndvcmRzWzJdID0gMDsJCS8qIFNlYXJjaCBBZGRyZXNzIChsb3dvcmQpICovCglpZiAoIFBCQ29udHJvbFN5bmMoKFBhcm1CbGtQdHIpJmNkcGIpICE9IG5vRXJyICkgewoJCVNETF9TZXRFcnJvcigiUEJDb250cm9sU3luYygpIGZhaWxlZCIpOwoJCXJldHVybigtMSk7Cgl9CglyZXR1cm4oMCk7Cn0KCi8qIEVqZWN0IHRoZSBDRC1ST00gKi8Kc3RhdGljIGludCBTRExfU1lTX0NERWplY3QoU0RMX0NEICpjZHJvbSkKewoJQm9vbGVhbglkaXNrID0gZmFsc2U7CglRSGRyICpkcml2ZVEgPSBHZXREcnZRSGRyKCk7CglEcnZRRWwgKmRyaXZlRWxlbTsKCUhQYXJhbUJsb2NrUmVjIGhwYjsKCVBhcmFtQmxvY2tSZWMgY3BiOwoKCWZvciAoIGRyaXZlRWxlbSA9IChEcnZRRWwgKikgZHJpdmVRLT5xSGVhZDsgZHJpdmVFbGVtOyBkcml2ZUVsZW0gPSAKCQkJICAoZHJpdmVFbGVtKSA/ICgoRHJ2UUVsICopIGRyaXZlRWxlbS0+cUxpbmspIDogCgkJCSAgKChEcnZRRWwgKikgZHJpdmVRLT5xSGVhZCkgKSB7CgkJaWYgKCBkcml2ZVEtPnFUYWlsICkgewoJCQlkcml2ZVEtPnFUYWlsLT5xTGluayA9IDA7CgkJfQoJCWlmICggZHJpdmVFbGVtLT5kUVJlZk51bSAhPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bSApIHsKCQkJY29udGludWU7CgkJfQoJCgkJLyogRG9lcyBkcml2ZSBjb250YWluIG1vdW50ZWQgdm9sdW1lPyBJZiBub3QsIHNraXAgKi8KCQlTRExfbWVtc2V0KCZocGIsIDAsIHNpemVvZihocGIpKTsKCQlocGIudm9sdW1lUGFyYW0uaW9WUmVmTnVtID0gZHJpdmVFbGVtLT5kUURyaXZlOwoJCWlmICggUEJIR2V0VkluZm9TeW5jKCZocGIpICE9IG5vRXJyICkgewoJCQljb250aW51ZTsKCQl9CgkJaWYgKCAoVW5tb3VudFZvbCgwLCBkcml2ZUVsZW0tPmRRRHJpdmUpID09IG5vRXJyKSAmJiAKCQkgICAgIChFamVjdCgwLCBkcml2ZUVsZW0tPmRRRHJpdmUpID09IG5vRXJyKSApIHsKCQkJZHJpdmVFbGVtID0gMDsgLyogQ2xlYXIgcG9pbnRlciB0byByZXNldCBvdXIgbG9vcCAqLwoJCQlkaXNrID0gdHJ1ZTsKCQl9Cgl9CgoJLyogSWYgbm8gZGlzayBpcyBwcmVzZW50LCBqdXN0IGVqZWN0IHRoZSB0cmF5ICovCglpZiAoISBkaXNrKSB7CgkJU0RMX21lbXNldCgmY3BiLCAwLCBzaXplb2YoY3BiKSk7CgkJY3BiLmNudHJsUGFyYW0uaW9WUmVmTnVtID0gMDsgLyogTm8gRHJpdmUgKi8KCQljcGIuY250cmxQYXJhbS5pb0NSZWZOdW0gPSBTRExfY2RsaXN0W2Nkcm9tLT5pZF0uZFJlZk51bTsKCQljcGIuY250cmxQYXJhbS5jc0NvZGUgPSBrRWplY3RUaGVEaXNjOwoJCWlmICggUEJDb250cm9sU3luYygoUGFybUJsa1B0cikmY3BiKSAhPSBub0VyciApIHsKCQkJU0RMX1NldEVycm9yKCJQQkNvbnRyb2xTeW5jKCkgZmFpbGVkIik7CgkJCXJldHVybigtMSk7CgkJfQoJfQoJcmV0dXJuKDApOwp9CgovKiBDbG9zZSB0aGUgQ0QtUk9NIGhhbmRsZSAqLwpzdGF0aWMgdm9pZCBTRExfU1lTX0NEQ2xvc2UoU0RMX0NEICpjZHJvbSkKewoJcmV0dXJuOwp9Cgp2b2lkIFNETF9TWVNfQ0RRdWl0KHZvaWQpCnsKCXdoaWxlKFNETF9udW1jZHMtLSkgCgkJU0RMX21lbXNldChTRExfY2RsaXN0ICsgU0RMX251bWNkcywgMCwgc2l6ZW9mKFNETF9jZGxpc3RbMF0pKTsKfQoKI2VuZGlmIC8qIFNETF9DRFJPTV9NQUNPUyAqLwo=