Ci8qCiAqIGFyY2gvYXJtL2luY2x1ZGUvYXNtL2FyY2gtdHhsL2NwdV9zZGlvLmgKICoKICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgoqLwoKI2lmbmRlZiBfX0NQVV9TRElPX0hfXwojZGVmaW5lIF9fQ1BVX1NESU9fSF9fCgojZGVmaW5lIFNEX0VNTUNfQkFTRV9BIDB4RkZFMDMwMDAKI2RlZmluZSBTRF9FTU1DX0JBU0VfQiAweEZGRTA1MDAwCiNkZWZpbmUgU0RfRU1NQ19CQVNFX0MgMHhGRkUwNzAwMAoKI2RlZmluZSBTRElPX1BPUlRfQSAwCiNkZWZpbmUgU0RJT19QT1JUX0IgMQojZGVmaW5lIFNESU9fUE9SVF9DIDIKCiNpZiAwCiNkZWZpbmUJU0RfRU1NQ19SWERfRVJST1IJCQkJMQojZGVmaW5lCVNEX0VNTUNfVFhEX0VSUk9SCQkJCTE8PDEKI2RlZmluZQlTRF9FTU1DX0RFU0NfRVJST1IJCQkJMTw8MgojZGVmaW5lCVNEX0VNTUNfUkVTUF9DUkNfRVJST1IJCQkxPDwzCiNkZWZpbmUJU0RfRU1NQ19SRVNQX1RJTUVPVVRfRVJST1IJCTE8PDQKI2RlZmluZQlTRF9FTU1DX0RFU0NfVElNRU9VVF9FUlJPUgkJMTw8NQojZW5kaWYKCnN0cnVjdCBzZF9lbW1jX2dsb2JhbF9yZWdzIHsKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjbG9jazsgICAgIC8vIDB4MDAKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdkZWxheTsgICAgIC8vIDB4MDQKCXZvbGF0aWxlIHVpbnQzMl90IGdkZWxheTE7ICAgIC8vMHgwOAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2FkanVzdDsgICAgLy8gMHgwYwogICAgdm9sYXRpbGUgdWludDMyX3QgZ2NhbG91dDsgICAgLy8gMHgxMAogICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWRfMTRbMTFdOyAgIC8vIDB4MTR+MHgzYwogICAgdm9sYXRpbGUgdWludDMyX3QgZ3N0YXJ0OyAgICAgLy8gMHg0MAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2NmZzsgICAgICAgLy8gMHg0NAogICAgdm9sYXRpbGUgdWludDMyX3QgZ3N0YXR1czsgICAgLy8gMHg0OAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2lycV9lbjsgICAgLy8gMHg0YwogICAgdm9sYXRpbGUgdWludDMyX3QgZ2NtZF9jZmc7ICAgLy8gMHg1MAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2NtZF9hcmc7ICAgLy8gMHg1NAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2NtZF9kYXQ7ICAgLy8gMHg1OAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2NtZF9yc3AwOyAgIC8vIDB4NWMKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjbWRfcnNwMTsgIC8vIDB4NjAKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjbWRfcnNwMjsgIC8vIDB4NjQKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjbWRfcnNwMzsgIC8vIDB4NjgKICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkXzZjOyAgICAgICAvLyAweDZjCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY3Vycl9jZmc7ICAvLyAweDcwCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY3Vycl9hcmc7ICAvLyAweDc0CiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY3Vycl9kYXQ7ICAvLyAweDc4CiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY3Vycl9yc3A7ICAvLyAweDdjCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnbmV4dF9jZmc7ICAvLyAweDgwCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnbmV4dF9hcmc7ICAvLyAweDg0CiAgICB2b2xhdGlsZSB1aW50MzJfdCBnbmV4dF9kYXQ7ICAvLyAweDg4CiAgICB2b2xhdGlsZSB1aW50MzJfdCBnbmV4dF9yc3A7ICAvLyAweDhjCiAgICB2b2xhdGlsZSB1aW50MzJfdCBncnhkOyAgICAgICAvLyAweDkwCiAgICB2b2xhdGlsZSB1aW50MzJfdCBndHhkOyAgICAgICAvLyAweDk0CiAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZF85OFs5MF07ICAgLy8gMHg5OH4weDFmYwogICAgdm9sYXRpbGUgdWludDMyX3QgZ2Rlc2NbMTI4XTsgLy8gMHgyMDAKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdwaW5nWzEyOF07IC8vIDB4NDAwCiAgICB2b2xhdGlsZSB1aW50MzJfdCBncG9uZ1sxMjhdOyAvLyAweDgwMAp9OwoKdW5pb24gc2RfZW1tY19zZXR1cCB7CiAgICB1aW50MzJfdCBkMzI7CiAgICBzdHJ1Y3QgewogICAgICAgIHVuc2lnbmVkIGJ3OjM7CiAgICAgICAgdW5zaWduZWQgZmFzdDoxOwogICAgICAgIHVuc2lnbmVkIHBhcjozOwogICAgICAgIHVuc2lnbmVkIGhjczoxOwogICAgICAgIHVuc2lnbmVkIHNkOjE7CiAgICAgICAgdW5zaWduZWQgc2RoYzoxOwogICAgICAgIHVuc2lnbmVkIHR5cGU6NjsKICAgICAgICB1bnNpZ25lZCByY2E6MTY7CiAgICB9IGI7Cn07CgpzdHJ1Y3Qgc2RfZW1tY19kZXNjX2luZm97CiAgICB1aW50MzJfdCBjbWRfaW5mbzsKICAgIHVpbnQzMl90IGNtZF9hcmc7CiAgICB1aW50MzJfdCBkYXRhX2FkZHI7CiAgICB1aW50MzJfdCByZXNwX2FkZHI7Cn07CgpzdHJ1Y3QgY21kX2NmZ3sKICAgIHVpbnQzMl90IGxlbmd0aDo5OwogICAgdWludDMyX3QgYmxvY2tfbW9kZToxOwogICAgdWludDMyX3QgcjFiOjE7CiAgICB1aW50MzJfdCBlbmRfb2ZfY2hhaW46MTsKICAgIHVpbnQzMl90IHRpbWVvdXQ6NDsKICAgIHVpbnQzMl90IG5vX3Jlc3A6MTsKICAgIHVpbnQzMl90IG5vX2NtZDoxOwogICAgdWludDMyX3QgZGF0YV9pbzoxOwogICAgdWludDMyX3QgZGF0YV93cjoxOwogICAgdWludDMyX3QgcmVzcF9ub2NyYzoxOwogICAgdWludDMyX3QgcmVzcF8xMjg6MTsKICAgIHVpbnQzMl90IHJlc3BfbnVtOjE7CiAgICB1aW50MzJfdCBkYXRhX251bToxOwogICAgdWludDMyX3QgY21kX2luZGV4OjY7CiAgICB1aW50MzJfdCBlcnJvcjoxOwogICAgdWludDMyX3Qgb3duZXI6MTsKfTsKCnN0cnVjdCBzZF9lbW1jX3N0YXR1c3sKCXVpbnQzMl90IHJ4ZF9lcnI6ODsgICAgICAvKls3OjBdICAgICBSWCBkYXRhIENSQyBlcnJvciBwZXIgd2lyZSwgZm9yIG11bHRpcGxlIGJsb2NrIHJlYWQsIHRoZSBDUkMgZXJyb3JzIGFyZSBPUmVkIHRvZ2V0aGVyLiovCgl1aW50MzJfdCB0eGRfZXJyOjE7ICAgICAgLypbOF0gICAgICAgVFggZGF0YSBDUkMgZXJyb3IsIGZvciBtdWx0aXBsZSBibG9jayB3cml0ZSwgYW55IG9uZSBvZiBibG9ja3MgQ1JDIGVycm9yLiAqLwoJdWludDMyX3QgZGVzY19lcnI6MTsgICAgIC8qWzldICAgICAgIFNEL2VNTUMgY29udHJvbGxlciBkb2VzbqGvdCBvd24gZGVzY3JpcHRvci4gVGhlIG93bmVyIGJpdCBpcyChsDChsSwgc2V0IGNmZ19pZ25vcmVfb3duZXIgdG8gaWdub3JlIHRoaXMgZXJyb3IuKi8KCXVpbnQzMl90IHJlc3BfZXJyOjE7ICAgICAvKlsxMF0gICAgICBSZXNwb25zZSBDUkMgZXJyb3IuKi8KCXVpbnQzMl90IHJlc3BfdGltZW91dDoxOyAvKlsxMV0gICAgICBObyByZXNwb25zZSByZWNlaXZlZCBiZWZvcmUgdGltZSBsaW1pdC4gVGhlIHRpbWVvdXQgbGltaXQgaXMgc2V0IGJ5IGNmZ19yZXNwX3RpbWVvdXQuKi8KCXVpbnQzMl90IGRlc2NfdGltZW91dDoxOyAvKlsxMl0gICAgICBEZXNjcmlwdG9yIGV4ZWN1dGlvbiB0aW1lIG92ZXIgdGltZSBsaW1pdC4gVGhlIHRpbWVvdXQgbGltaXQgaXMgc2V0IGJ5IGRlc2NyaXB0b3IgaXRzZWxmLiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIENvbnNpZGVyIHRoZSBtdWx0aXBsZSBibG9jayByZWFkL3dyaXRlLCBzZXQgdGhlIHByb3BlciB0aW1lb3V0IGxpbWl0cy4qLwoJdWludDMyX3QgZW5kX29mX2NoYWluOjE7IC8qWzEzXSAgICAgIEVuZCBvZiBDaGFpbiBJUlEsIE5vcm1hbCBJUlEuICovCgl1aW50MzJfdCBkZXNjX2lycToxOyAgICAgLypbMTRdICAgICAgVGhpcyBkZXNjcmlwdG9yIHJlcXVlc3RzIGFuIElSUSwgTm9ybWFsIElSUSwgdGhlIGRlc2NyaXB0b3IgY2hhaW4gZXhlY3V0aW9uIGtlZXBzIGdvaW5nIG9uLiovCgl1aW50MzJfdCBpcnFfc2RpbzoxOyAgICAgLypbMTVdICAgICAgU0RJTyBkZXZpY2UgdXNlcyBEQVRbMV0gdG8gcmVxdWVzdCBJUlEuICovCgl1aW50MzJfdCBkYXRfaTo4OyAgICAgICAgLypbMjM6MTZdICAgSW5wdXQgZGF0YSBzaWduYWxzLiAqLwoJdWludDMyX3QgY21kX2k6MTsgICAgICAgIC8qWzI0XSAgICAgIG5wdXQgcmVzcG9uc2Ugc2lnbmFsLiAqLwoJdWludDMyX3QgZHM6MTsgICAgICAgICAgIC8qWzI1XSAgICAgIElucHV0IGRhdGEgc3Ryb2JlLiAqLwoJdWludDMyX3QgYnVzX2ZzbTo0OyAgICAgIC8qWzI5OjI2XSAgIEJVUyBmc20gKi8KICAgIHVpbnQzMl90IGRlc2Nfd3JfcmR5OjE7ICAvKlszMF0gICAgICBEZXNjcmlwdG9yIHdyaXRlIGJhY2sgcHJvY2VzcyBpcyBkb25lIGFuZCBpdCBpcyByZWFkeSBmb3IgQ1BVIHRvIHJlYWQuKi8KCXVpbnQzMl90IGNvcmVfcmR5OjE7CSAvKlszMV0gICAgICAgZGVzY19idXN5IG9yIHNkX2VtbWNfaXJxIG9yIGJ1c19mc20gaXMgbm90IGlkbGUuKi8KfTsvL19fYXR0cmlidXRlX18oKF9fbWF5X2FsaWFzX18pKTsKCgpzdHJ1Y3Qgc2RfZW1tY19jbG9ja3sKICAgIHVpbnQzMl90IGRpdjo2OyAgICAgICAgICAvKls1OjBdICAgICBDbG9jayBkaXZpZGVyLiBGcmVxdWVuY3kgPSBjbG9jayBzb3VyY2UvY2ZnX2RpdiwgTWF4aW11bSBkaXZpZGVyIDYzLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDbG9jayBvZmY6IGNmZ19kaXY9PTAsIHRoZSBjbG9jayBpcyBkaXNhYmxlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLypEaXZpZGVyIGJ5cGFzczogY2ZnX2Rpdj09MSwgY2xvY2sgc291cmNlIGlzIHVzZWQgYXMgY29yZSBjbG9jayB3aXRob3V0IGRpdmlkZXIuICovCiAgICB1aW50MzJfdCBzcmM6MjsgICAgICAgICAgLypbNzo2XSAgICAgQ2xvY2sgc291cmNlLCAwOiBDcnlzdGFsIDI0TUh6LCAxOiBGaXggUExMLCA4NTBNSHoqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjogTVBMTCwgPDYzN01IeiwgdXNlZCBmb3IgNDAwTUh6IGV4YWN0bHkuIDM6IGRpZmZlcmVudCBQTEwgKi8KICAgIHVpbnQzMl90IGNvcmVfcGhhc2U6MjsgICAvKls5OjhdICAgICBDb3JlIGNsb2NrIHBoYXNlLiAwOiAwIHBoYXNlLCAxOiA5MCBwaGFzZSwgMjogMTgwIHBoYXNlLCAzOiAyNzAgcGhhc2UuKi8KICAgIHVpbnQzMl90IHR4X3BoYXNlOjI7ICAgICAvKlsxMToxMF0gICBUWCBjbG9jayBwaGFzZS4gMDogMCBwaGFzZSwgMTogOTAgcGhhc2UsIDI6IDE4MCBwaGFzZSwgMzogMjcwIHBoYXNlLiovCiAgICB1aW50MzJfdCByeF9waGFzZToyOyAgICAgLypbMTM6MTJdICAgUlggY2xvY2sgcGhhc2UuIDA6IDAgcGhhc2UsIDE6IDkwIHBoYXNlLCAyOiAxODAgcGhhc2UsIDM6IDI3MCBwaGFzZS4qLwogICAgdWludDMyX3QgcmVzZXJ2ZWQxNDoyOwogICAgdWludDMyX3QgdHhfZGVsYXk6NjsgICAgIC8qWzIxOjE2XSAgIFRYIGNsb2NrIGRlbGF5IGxpbmUuIDA6IG5vIGRlbGF5LCBuOiBkZWxheSBuKjIwMHBzLiBNYXhpbXVtIGRlbGF5IDNucy4qLwogICAgdWludDMyX3QgcnhfZGVsYXk6NjsgICAgIC8qWzI3OjIyXSAgIFJYIGNsb2NrIGRlbGF5IGxpbmUuIDA6IG5vIGRlbGF5LCBuOiBkZWxheSBuKjIwMHBzLiBNYXhpbXVtIGRlbGF5IDNucy4qLwogICAgdWludDMyX3QgYWx3YXlzX29uOjE7ICAgIC8qWzI4XSAgICAgIDE6IEtlZXAgY2xvY2sgYWx3YXlzIG9uLiAwOiBDbG9jayBvbi9vZmYgY29udHJvbGxlZCBieSBhY3Rpdml0aWVzLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLypBbnkgQVBCMyBhY2Nlc3Mgb3IgZGVzY3JpcHRvciBleGVjdXRpb24gd2lsbCBrZWVwIGNsb2NrIG9uLiovCiAgICB1aW50MzJfdCBpcnFfc2Rpb19zbGVlcDoxOyAvKlsyOV0gICAgMTogZW5hYmxlIElSUSBzZGlvIHdoZW4gaW4gc2xlZXAgbW9kZS4gKi8KCXVpbnQzMl90IGlycV9zZGlvX3NsZWVwX2RzOjE7LypbMzBdIDE6ZW5hYmxlIGRzIGFzIGlycSovCiAgICB1aW50MzJfdCByZXNlcnZlZDI2OjE7Cn07CgpzdHJ1Y3Qgc2RfZW1tY19kZWxheXsKICAgIHVpbnQzMl90IGRhdDA6NjsgICAgICAgICAvKlszOjBdICAgICAgIERhdGEgMCBkZWxheSBsaW5lLiAqLwogICAgdWludDMyX3QgZGF0MTo2OyAgICAgICAgIC8qWzc6NF0gICAgICAgRGF0YSAxIGRlbGF5IGxpbmUuICovCiAgICB1aW50MzJfdCBkYXQyOjY7ICAgICAgICAgLypbMTE6OF0gICAgICBEYXRhIDIgZGVsYXkgbGluZS4gKi8KICAgIHVpbnQzMl90IGRhdDM6NjsgICAgICAgICAvKlsxNToxMl0gICAgIERhdGEgMyBkZWxheSBsaW5lLiAqLwogICAgdWludDMyX3QgZGF0NDo2OyAgICAgICAgIC8qWzE5OjE2XSAgICAgRGF0YSA0IGRlbGF5IGxpbmUuICovCgl1aW50MzJfdCBzcGFyZToyOwp9OwoKc3RydWN0IHNkX2VtbWNfZGVsYXkxewogICAgdWludDMyX3QgZGF0NTo2OyAgICAgICAgIC8qWzIzOjIwXSAgICAgRGF0YSA1IGRlbGF5IGxpbmUuICovCiAgICB1aW50MzJfdCBkYXQ2OjY7ICAgICAgICAgLypbMjc6MjRdICAgICBEYXRhIDYgZGVsYXkgbGluZS4gKi8KICAgIHVpbnQzMl90IGRhdDc6NjsgICAgICAgICAvKlszMToyOF0gICAgIERhdGEgNyBkZWxheSBsaW5lLiAqLwoJdWludDMyX3QgZGF0ODo2OyAgICAgICAgIC8qWzMxOjI4XSAgICAgRGF0YSA3IGRlbGF5IGxpbmUuICovCgl1aW50MzJfdCBkYXQ5OjY7ICAgICAgICAgLypbMzE6MjhdICAgICBEYXRhIDcgZGVsYXkgbGluZS4gKi8KCXVpbnQzMl90IHNwYXJlOjI7Cn07CgpzdHJ1Y3Qgc2RfZW1tY19hZGp1c3R7CiAgICB1aW50MzJfdCBjbWRfZGVsYXk6NDsgICAgICAgICAgIC8qWzM6MF0gICAgICAgQ29tbWFuZCBkZWxheSBsaW5lLiAqLwogICAgdWludDMyX3QgZHNfZGVsYXk6NDsgICAgICAgICAgICAvKls3OjRdICAgICAgIERTIGRlbGF5IGxpbmUuICovCiAgICB1aW50MzJfdCBjYWxpX3NlbDo0OyAgICAgICAgICAgIC8qWzExOjhdICAgICAgU2VsZWN0IG9uZSBzaWduYWwgdG8gYmUgdGVzdGVkLiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlNpZ25hbHMgYXJlIGxhYmVsZWQgZnJvbSAwIHRvIDkgdGhlIHNhbWUgYXMgZGVsYXkgbGluZXMuICovCiAgICB1aW50MzJfdCBjYWxpX2VuYWJsZToxOyAgICAgICAgIC8qWzEyXSAgICAgICAgRW5hYmxlIGNhbGlicmF0aW9uLiAqLwogICAgdWludDMyX3QgYWRqX2VuYWJsZToxOyAgICAgICAgICAvKlsxM10gICAgICAgQWRqdXN0IGludGVyZmFjZSB0aW1pbmcgYnkgcmVzYW1wbGluZyB0aGUgaW5wdXQgc2lnbmFscy4gKi8KICAgIHVpbnQzMl90IGNhbGlfcmlzZToxOyAgICAgICAgICAgLypbMTRdICAgICAgIDE6IHRlc3QgdGhlIHJpc2luZyBlZGdlLiAwOiB0ZXN0IHRoZSBmYWxsaW5nIGVkZ2UuICovCiAgICB1aW50MzJfdCBkc19lbmFibGU6MTsJCQkvKlsxNV0JCVNhbXBsaW5nIHRoZSBEQVQgYmFzZWQgb24gRFMgaW4gSFM0MDAgbW9kZSovCiAgICB1aW50MzJfdCBhZGpfZGVsYXk6NjsgICAgICAgICAgIC8qWzIxOjE2XSAgICAgICBSZXNhbXBsZSB0aGUgaW5wdXQgc2lnbmFscyB3aGVuIGNsb2NrIGluZGV4PT1hZGpfZGVsYXkuICovCiAgICB1aW50MzJfdCBhZGpfYXV0bzoxOwkJCS8qWzIyXQkJCVVzZSBjYWxpX2R1dCBmaXJzdCBmYWxsaW5nIGVkZ2UgdG8gYWRqdXN0IHRoZSB0aW1pbmcgKi8KCQkJCQkJCQkJCS8qc2V0IGNhbGlfZW5hYmxlIHRvIDEgdG8gdXNlIHRoaXMgZnVuY3Rpb24qLwoJdWludDMyX3QgcmVzZXJ2ZWQyMzo5Owp9OwoKCnN0cnVjdCBzZF9lbW1jX2NhbG91dHsKICAgIHVpbnQzMl90IGNhbGlfaWR4OjY7ICAgICAgICAgLypbNTowXSAgICAgICBDYWxpYnJhdGlvbiByZWFkaW5nLiBUaGUgZXZlbnQgaGFwcGVucyBhdCB0aGlzIGluZGV4LiAqLwogICAgdWludDMyX3QgcmVzZXJ2ZWQ2OjE7CiAgICB1aW50MzJfdCBjYWxpX3ZsZDoxOyAgICAgICAgIC8qWzddICAgICAgICAgVGhlIHJlYWRpbmcgaXMgdmFsaWQuICovCiAgICB1aW50MzJfdCBjYWxpX3NldHVwOjg7ICAgICAgIC8qWzE1OjhdICAgICAgQ29waWVkIGZyb20gQkFTRSsweDggWzE1OjhdIGluY2x1ZGUgY2FsaV9zZWwsIGNhbGlfZW5hYmxlLCBhZGpfZW5hYmxlLCBjYWxpX3Jpc2UuICovCiAgICB1aW50MzJfdCByZXNlcnZlZDE2OjE2Owp9OwoKCnN0cnVjdCBzZF9lbW1jX3N0YXJ0ewoJdWludDMyX3QgaW5pdDoxOyAgICAgICAgIC8qWzBdICAgMTogUmVhZCBkZXNjcmlwdG9yIGZyb20gaW50ZXJuYWwgU1JBTSwgbGltaXRlZCB0byAzMiBkZXNjcmlwdG9ycy4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAwOiBSZWFkIGRlc2NyaXB0b3IgZnJvbSBleHRlcm5hbCBERFIgKi8KCXVpbnQzMl90IGJ1c3k6MTsgICAgICAgICAvKlsxXSAgIDE6IFN0YXJ0IGNvbW1hbmQgY2hhaW4gZXhlY3V0aW9uIHByb2Nlc3MuIDA6IFN0b3AgKi8KCXVpbnQzMl90IGFkZHI6MzA7ICAgICAgICAvKlszMToyXSBEZXNjcmlwdG9yIGFkZHJlc3MsIHRoZSBsYXN0IDIgYml0cyBhcmUgMCwgNCBieXRlcyBhbGlnbmVkLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIFdoZW4gaW50ZXJuYWwgU1JBTSBpcyB1c2VkLCB0aGUgdmFsaWQgYWRkcmVzcyByYW5nZSBpcyBmcm9tIDB4MjAwfjB4M2ZmICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgV2hlbiBleHRlcm5hbCBERFIgaXMgdXNlZCwgdGhlIHZhbGlkIGFkZHJlc3MgaXMgYW55d2hlcmUgaW4gRERSLCB0aGUgbGVuZ3RoIG9mIGNoYWluIGlzIHVubGltaXRlZC4qLwp9Oy8vX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpOwoKCnN0cnVjdCBzZF9lbW1jX2NvbmZpZ3sKCXVpbnQzMl90IGJ1c193aWR0aDoyOyAgICAvKlsxOjBdICAgICAwOiAxIGJpdCwgMTogNCBiaXRzLCAyOiA4IGJpdHMsIDM6IDIgYml0cyAobm90IHN1cHBvcnRlZCkqLwoJdWludDMyX3QgZGRyOjE7ICAgICAgICAgIC8qWzJdICAgICAgIDE6IEREUiBtb2RlLCAwOiBTRFIgbW9kZSAqLwoJdWludDMyX3QgZGNfdWd0OjE7ICAgICAgIC8qWzNdICAgICAgIDE6IEREUiBhY2Nlc3MgdXJnZW50LCAwOiBERFIgYWNjZXNzIG5vcm1hbC4gKi8KCXVpbnQzMl90IGJsX2xlbjo0OyAgICAgICAvKls3OjRdICAgICBCbG9jayBsZW5ndGggMl5jZmdfYmxfbGVuLCBiZWNhdXNlIGludGVybmFsIGJ1ZmZlciBzaXplIGlzIGxpbWl0ZWQgdG8gNTEyIGJ5dGVzLCB0aGUgY2ZnX2JsX2xlbiA8PTkuICovCgl1aW50MzJfdCByZXNwX3RpbWVvdXQ6NDsgLypbMTE6OF0gICAgV2FpdCByZXNwb25zZSB0aWxsIDJeY2ZnX3Jlc3BfdGltZW91dCBjb3JlIGNsb2NrIGN5Y2xlcy4gTWF4aW11bSAzMjc2OCBjb3JlIGN5Y2xlcy4gKi8KCXVpbnQzMl90IHJjX2NjOjQ7ICAgICAgICAvKlsxNToxMl0gICBXYWl0IHJlc3BvbnNlLWNvbW1hbmQsIGNvbW1hbmQtY29tbWFuZCBnYXAgYmVmb3JlIG5leHQgY29tbWFuZCwgMl5jZmdfcmNfY2MgY29yZSBjbG9jayBjeWNsZXMuICovCgl1aW50MzJfdCBvdXRfZmFsbDoxOyAgICAgLypbMTZdICAgICAgRERSIG1vZGUgb25seS4gVGhlIGNvbW1hbmQgYW5kIFRYRCBzdGFydCBmcm9tIHJpc2luZyBlZGdlLiBTZXQgMSB0byBzdGFydCBmcm9tIGZhbGxpbmcgZWRnZS4gKi8KCXVpbnQzMl90IGJsa19nYXBfaXA6MTsgICAvKlsxN10gICAgICAxOiBFbmFibGUgU0RJTyBkYXRhIGJsb2NrIGdhcCBpbnRlcnJ1cHQgcGVyaW9kLiAwOiBEaXNhYmxlZC4qLwoJdWludDMyX3Qgc3BhcmU6MTsgICAgICAgIC8qWzE4XSAgICAgIFNwYXJlLCAgPz8/IG5lZWQgY2hlY2sqLwoJdWludDMyX3QgaWdub3JlX293bmVyOjE7IC8qWzE5XSAgICAgIFVzZSB0aGlzIGRlc2NyaXB0b3IgZXZlbiBpZiBpdHMgb3duZXIgYml0IGlzIKGwMKGxLiovCgl1aW50MzJfdCBjaGtfZHM6MTsgICAgICAgLypbMjBdICAgICAgQ2hlY2sgZGF0YSBzdHJvYmUgaW4gSFM0MDAuKi8KCXVpbnQzMl90IGNtZF9sb3c6MTsgICAgICAvKlsyMV0gICAgICBIb2xkIENNRCBhcyBvdXRwdXQgTG93LCBlTU1DIGJvb3QgbW9kZS4qLwoJdWludDMyX3Qgc3RvcF9jbGs6MTsgICAgIC8qWzIyXSAgICAgIDE6IHN0b3AgY2xvY2suIDA6IG5vcm1hbCBjbG9jay4qLwoJICAgICAgICAgICAgICAgICAgICAgICAgLypJbiBub3JtYWwgbW9kZSwgdGhlIGNsb2NrIGlzIGF1dG9tYXRpY2FsbHkgb24vb2ZmIGR1cmluZyByZWFkaW5nIG1vZGUgdG8gYmFjayBvZmYgcmVhZGluZyBpbiBjYXNlIG9mKi8KCSAgICAgICAgICAgICAgICAgICAgICAgIC8qRERSIHNsb3cgcmVzcG9uc2UsIHN0b3AgY2xvY2sgaXMgdXNlZCBpbiB2b2x0YWdlIHN3aXRjaC4qLwoJdWludDMyX3QgYXV0b19jbGs6MTsgICAgIC8qWzIzXSAgICAgIDE6IHdoZW4gQlVTIGlzIGlkbGUgYW5kIG5vIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlLCB0dXJuIG9mZiBjbG9jaywgdG8gc2F2ZSBwb3dlci4qLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAwOiBjb3JlIGNsb2NrIGlzIGFsd2F5cyBvbi4qLwogICAgdWludDMyX3QgdHhkX2FkZF9lcnI6MTsJLypbMjRdICAgCVRYRCBhZGQgZXJyb3IgdGVzdCovCgkJCQkJCQkvKlRlc3QgZmVhdHVyZSwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIG5vcm1hbCBjb25kaXRpb24uKi8KCQkJCQkJCS8qSXQgd2lsbCBpbnZlcnRlZCB0aGUgZmlyc3QgQ1JDIGJpdHMgb2YgdGhlIDNyZCBibG9jay4qLwoJCQkJCQkJLypCbG9jayBpbmRleCBzdGFydHMgZnJvbSAwLCAxLCAyLCChrSovCiAgICB1aW50MzJfdCB0eGRfcmV0cnk6MTsJLypbMjVdICAgCVdoZW4gVFhEIENSQyBlcnJvciwgaG9zdCBzZW5kcyB0aGUgYmxvY2sgYWdhaW4uKi8KCQkJCQkJCS8qVGhlIHRvdGFsIG51bWJlciBvZiByZXRyaWVzIG9mIG9uZSBkZXNjcmlwdG9yIGlzIGxpbWl0ZWQgdG8gMTUsICovCgkJCQkJCQkvKmFmdGVyIDE1IHJldHJpZXMsIHRoZSBUWERfZXJyIGlzIHNldCB0byBoaWdoLiovCiAgICB1aW50MzJfdCByZXZkOjg7CSAgICAgICAgLypbMzE6MjZdICAgcmV2ZWQqLwp9Oy8vX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpOwoKCnN0cnVjdCBzZF9lbW1jX2lycV9lbnsKCXVpbnQzMl90IHJ4ZF9lcnI6ODsgICAgICAvKls3OjBdICAgICBSWCBkYXRhIENSQyBlcnJvciBwZXIgd2lyZS4qLwoJdWludDMyX3QgdHhkX2VycjoxOyAgICAgIC8qWzhdICAgICAgIFRYIGRhdGEgQ1JDIGVycm9yLiAqLwoJdWludDMyX3QgZGVzY19lcnI6MTsgICAgIC8qWzldICAgICAgIFNEL2VNTUMgY29udHJvbGxlciBkb2VzbqGvdCBvd24gZGVzY3JpcHRvci4gKi8KCXVpbnQzMl90IHJlc3BfZXJyOjE7ICAgICAvKlsxMF0gICAgICBSZXNwb25zZSBDUkMgZXJyb3IuKi8KCXVpbnQzMl90IHJlc3BfdGltZW91dDoxOyAvKlsxMV0gICAgICBObyByZXNwb25zZSByZWNlaXZlZCBiZWZvcmUgdGltZSBsaW1pdC4gKi8KCXVpbnQzMl90IGRlc2NfdGltZW91dDoxOyAvKlsxMl0gICAgICBEZXNjcmlwdG9yIGV4ZWN1dGlvbiB0aW1lIG92ZXIgdGltZSBsaW1pdC4gKi8KCXVpbnQzMl90IGVuZF9vZl9jaGFpbjoxOyAvKlsxM10gICAgICBFbmQgb2YgQ2hhaW4gSVJRLiAqLwoJdWludDMyX3QgZGVzY19pcnE6MTsgICAgIC8qWzE0XSAgICAgIFRoaXMgZGVzY3JpcHRvciByZXF1ZXN0cyBhbiBJUlEuICovCgl1aW50MzJfdCBpcnFfc2RpbzoxOyAgICAgLypbMTVdICAgICAgRW5hYmxlIHNkaW8gaW50ZXJydXB0LiAqLwogICAgdWludDMyX3QgcmV2ZDoxNjsJICAgIC8qWzMxOjE2XSAgIHJldmVkKi8KfTsKCnN0cnVjdCBzZF9lbW1jX2RhdGFfaW5mb3sKCXVpbnQzMl90IGNudDoxMDsgICAgICAgICAvKls5OjBdICAgICBSeGQgd29yZHMgcmVjZWl2ZWQgZnJvbSBCVVMuIFR4ZCB3b3JkcyByZWNlaXZlZCBmcm9tIEREUi4qLwoJdWludDMyX3QgYmxrOjk7ICAgICAgICAgIC8qWzI0OjE2XSAgIFJ4ZCBCbG9ja3MgcmVjZWl2ZWQgZnJvbSBCVVMuIFR4ZCBibG9ja3MgcmVjZWl2ZWQgZnJvbSBERFIuKi8KCXVpbnQzMl90IHJldmQ6MzA7ICAgICAgICAvKlszMToxN10gICBSZXZlZC4gKi8KfTsKCgpzdHJ1Y3Qgc2RfZW1tY19jYXJkX2luZm97Cgl1aW50MzJfdCB0eGRfY250OjEwOyAgICAgLypbOTowXSAgICAgVHhkIEJVUyBjeWNsZSBjb3VudGVyLiAqLwoJdWludDMyX3QgdHhkX2Jsazo5OyAgICAgIC8qWzI0OjE2XSAgIFR4ZCBCVVMgYmxvY2sgY291bnRlci4qLwoJdWludDMyX3QgcmV2ZDozMDsgICAgICAgIC8qWzMxOjE3XSAgIFJldmVkLiAqLwp9OwoKI2VuZGlmCg==