LyoKICogUlBDIGRlZmluaXRpb25zCiAqCiAqIENvcHlyaWdodCAyMDAxLTIwMDIgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICogQ29weXJpZ2h0IDIwMDQgRmlsaXAgTmF2YXJhCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX1JQQ19ERUZTX0gKI2RlZmluZSBfX1dJTkVfUlBDX0RFRlNfSAoKdHlwZWRlZiBzdHJ1Y3QKewogIHVuc2lnbmVkIGNoYXIgcnBjX3ZlcjsgICAgICAgICAgLyogUlBDIG1ham9yIHZlcnNpb24gKDUpICovCiAgdW5zaWduZWQgY2hhciBycGNfdmVyX21pbm9yOyAgICAvKiBSUEMgbWlub3IgdmVyc2lvbiAoMCkgKi8KICB1bnNpZ25lZCBjaGFyIHB0eXBlOyAgICAgICAgICAgIC8qIFBhY2tldCB0eXBlIChQS1RfKikgKi8KICB1bnNpZ25lZCBjaGFyIGZsYWdzOwogIHVuc2lnbmVkIGNoYXIgZHJlcFs0XTsgICAgICAgICAgLyogRGF0YSByZXByZXNlbnRhdGlvbiAqLwogIHVuc2lnbmVkIHNob3J0IGZyYWdfbGVuOyAgICAgICAgLyogRGF0YSBzaXplIGluIGJ5dGVzIGluY2x1ZGluZyBoZWFkZXIgYW5kIHRhaWwuICovCiAgdW5zaWduZWQgc2hvcnQgYXV0aF9sZW47ICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBsZW5ndGggICovCiAgdW5zaWduZWQgbG9uZyBjYWxsX2lkOyAgICAgICAgICAvKiBDYWxsIGlkZW50aWZpZXIuICovCn0gUnBjUGt0Q29tbW9uSGRyOwoKdHlwZWRlZiBzdHJ1Y3QKewogIFJwY1BrdENvbW1vbkhkciBjb21tb247CiAgdW5zaWduZWQgbG9uZyBhbGxvY19oaW50OyAgICAgICAvKiBEYXRhIHNpemUgaW4gYnl0ZXMgZXhjbHVkaW5nIGhlYWRlciBhbmQgdGFpbC4gKi8KICB1bnNpZ25lZCBzaG9ydCBjb250ZXh0X2lkOyAgICAgIC8qIFByZXNlbnRhdGlvbiBjb250ZXh0IGlkZW50aWZpZXIgKi8KICB1bnNpZ25lZCBzaG9ydCBvcG51bTsKfSBScGNQa3RSZXF1ZXN0SGRyOwoKdHlwZWRlZiBzdHJ1Y3QKewogIFJwY1BrdENvbW1vbkhkciBjb21tb247CiAgdW5zaWduZWQgbG9uZyBhbGxvY19oaW50OyAgICAgICAvKiBEYXRhIHNpemUgaW4gYnl0ZXMgZXhjbHVkaW5nIGhlYWRlciBhbmQgdGFpbC4gKi8KICB1bnNpZ25lZCBzaG9ydCBjb250ZXh0X2lkOyAgICAgIC8qIFByZXNlbnRhdGlvbiBjb250ZXh0IGlkZW50aWZpZXIgKi8KICB1bnNpZ25lZCBjaGFyIGNhbmNlbF9jb3VudDsKICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkOwp9IFJwY1BrdFJlc3BvbnNlSGRyOwoKdHlwZWRlZiBzdHJ1Y3QKewogIFJwY1BrdENvbW1vbkhkciBjb21tb247CiAgdW5zaWduZWQgbG9uZyBhbGxvY19oaW50OyAgICAgICAvKiBEYXRhIHNpemUgaW4gYnl0ZXMgZXhjbHVkaW5nIGhlYWRlciBhbmQgdGFpbC4gKi8KICB1bnNpZ25lZCBzaG9ydCBjb250ZXh0X2lkOyAgICAgIC8qIFByZXNlbnRhdGlvbiBjb250ZXh0IGlkZW50aWZpZXIgKi8KICB1bnNpZ25lZCBjaGFyIGNhbmNlbF9jb3VudDsgICAgIC8qIFJlY2VpdmVkIGNhbmNlbCBjb3VudCAqLwogIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ7ICAgICAgICAgLyogRm9yY2UgYWxpZ25tZW50ISAqLwogIHVuc2lnbmVkIGxvbmcgc3RhdHVzOyAgICAgICAgICAgLyogUnVudGltZSBmYXVsdCBjb2RlIChSUENfU1RBVFVTKSAqLwogIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQyOwp9IFJwY1BrdEZhdWx0SGRyOwoKdHlwZWRlZiBzdHJ1Y3QKewogIFJwY1BrdENvbW1vbkhkciBjb21tb247CiAgdW5zaWduZWQgc2hvcnQgbWF4X3RzaXplOyAgICAgICAvKiBNYXhpbXVtIHRyYW5zbWlzc2lvbiBmcmFnbWVudCBzaXplICovCiAgdW5zaWduZWQgc2hvcnQgbWF4X3JzaXplOyAgICAgICAvKiBNYXhpbXVtIHJlY2VpdmUgZnJhZ21lbnQgc2l6ZSAqLwogIHVuc2lnbmVkIGxvbmcgYXNzb2NfZ2lkOyAgICAgICAgLyogQXNzb2NpYXRlZCBncm91cCBpZCAqLwogIHVuc2lnbmVkIGNoYXIgbnVtX2VsZW1lbnRzOyAgICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzICovCiAgdW5zaWduZWQgY2hhciBwYWRkaW5nWzNdOyAgICAgICAvKiBGb3JjZSBhbGlnbm1lbnQhICovCiAgdW5zaWduZWQgc2hvcnQgY29udGV4dF9pZDsgICAgICAvKiBQcmVzZW50YXRpb24gY29udGV4dCBpZGVudGlmaWVyICovCiAgdW5zaWduZWQgY2hhciBudW1fc3ludGF4ZXM7ICAgICAvKiBOdW1iZXIgb2Ygc3ludGF4ZXMgKi8KICBSUENfU1lOVEFYX0lERU5USUZJRVIgYWJzdHJhY3Q7CiAgUlBDX1NZTlRBWF9JREVOVElGSUVSIHRyYW5zZmVyOwp9IFJwY1BrdEJpbmRIZHI7CgojaW5jbHVkZSAicHNocGFjazEuaCIKdHlwZWRlZiBzdHJ1Y3QKewogIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsgIC8qIExlbmd0aCBvZiB0aGUgc3RyaW5nIGluY2x1ZGluZyBudWxsIHRlcm1pbmF0b3IgKi8KICBjaGFyIHN0cmluZ1sxXTsgICAgICAgICAvKiBTdHJpbmcgZGF0YSBpbiBzaW5nbGUgYnl0ZSwgbnVsbCB0ZXJtaW5hdGVkIGZvcm0gKi8KfSBScGNBZGRyZXNzU3RyaW5nOwojaW5jbHVkZSAicG9wcGFjay5oIgoKdHlwZWRlZiBzdHJ1Y3QKewogIHVuc2lnbmVkIGNoYXIgbnVtX3Jlc3VsdHM7ICAgICAgIC8qIE51bWJlciBvZiByZXN1bHRzICovCiAgdW5zaWduZWQgY2hhciByZXNlcnZlZFszXTsgICAgICAgLyogRm9yY2UgYWxpZ25tZW50ISAqLwogIHN0cnVjdCB7CiAgICB1bnNpZ25lZCBzaG9ydCByZXN1bHQ7CiAgICB1bnNpZ25lZCBzaG9ydCByZWFzb247CiAgfSByZXN1bHRzWzFdOwp9IFJwY1Jlc3VsdHM7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBzaG9ydCBtYXhfdHNpemU7ICAgICAgIC8qIE1heGltdW0gdHJhbnNtaXNzaW9uIGZyYWdtZW50IHNpemUgKi8KICB1bnNpZ25lZCBzaG9ydCBtYXhfcnNpemU7ICAgICAgIC8qIE1heGltdW0gcmVjZWl2ZSBmcmFnbWVudCBzaXplICovCiAgdW5zaWduZWQgbG9uZyBhc3NvY19naWQ7ICAgICAgICAvKiBBc3NvY2lhdGVkIGdyb3VwIGlkICovCiAgLyogCiAgICogRm9sbG93aW5nIHRoaXMgaGVhZGVyIGFyZSB0aGVzZSBmaWVsZHM6CiAgICogICBScGNBZGRyZXNzU3RyaW5nIHNlcnZlcl9hZGRyZXNzOwogICAqICAgWzAgLSAzIGJ5dGVzIG9mIHBhZGRpbmcgc28gdGhhdCByZXN1bHRzIGlzIDQtYnl0ZSBhbGlnbmVkXQogICAqICAgUnBjUmVzdWx0cyByZXN1bHRzOwogICAqICAgUlBDX1NZTlRBWF9JREVOVElGSUVSIHRyYW5zZmVyOwogICAqLwp9IFJwY1BrdEJpbmRBY2tIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUnBjUGt0Q29tbW9uSGRyIGNvbW1vbjsKICB1bnNpZ25lZCBzaG9ydCByZWplY3RfcmVhc29uOwogIHVuc2lnbmVkIGNoYXIgcHJvdG9jb2xzX2NvdW50OwogIHN0cnVjdCB7CiAgICB1bnNpZ25lZCBjaGFyIHJwY192ZXI7CiAgICB1bnNpZ25lZCBjaGFyIHJwY192ZXJfbWlub3I7CiAgfSBwcm90b2NvbHNbMV07Cn0gUnBjUGt0QmluZE5BY2tIZHI7CgovKiBVbmlvbiByZXByZXNlbnRpbmcgYWxsIHBvc3NpYmxlIHBhY2tldCBoZWFkZXJzICovCnR5cGVkZWYgdW5pb24KewogIFJwY1BrdENvbW1vbkhkciBjb21tb247CiAgUnBjUGt0UmVxdWVzdEhkciByZXF1ZXN0OwogIFJwY1BrdFJlc3BvbnNlSGRyIHJlc3BvbnNlOwogIFJwY1BrdEZhdWx0SGRyIGZhdWx0OwogIFJwY1BrdEJpbmRIZHIgYmluZDsKICBScGNQa3RCaW5kQWNrSGRyIGJpbmRfYWNrOwogIFJwY1BrdEJpbmROQWNrSGRyIGJpbmRfbmFjazsKfSBScGNQa3RIZHI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgdW5zaWduZWQgY2hhciBhdXRoX3R5cGU7ICAgICAgIC8qIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSBpbiB1c2UgKi8KICB1bnNpZ25lZCBjaGFyIGF1dGhfbGV2ZWw7ICAgICAgLyogUlBDX0NfQVVUSE5fTEVWRUwqICovCiAgdW5zaWduZWQgY2hhciBhdXRoX3BhZF9sZW5ndGg7IC8qIGxlbmd0aCBvZiBwYWRkaW5nIHRvIHJlc3RvcmUgbiAlIDQgYWxpZ25tZW50ICovCiAgdW5zaWduZWQgY2hhciBhdXRoX3Jlc2VydmVkOyAgIC8qIHJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KICB1bnNpZ25lZCBsb25nIGF1dGhfY29udGV4dF9pZDsgLyogdW5pcXVlIHZhbHVlIGZvciB0aGUgYXV0aGVudGljYXRlZCBjb25uZWN0aW9uICovCn0gUnBjQXV0aFZlcmlmaWVyOwoKI2RlZmluZSBSUENfQVVUSF9WRVJJRklFUl9MRU4oY29tbW9uX2hkcikgXAogICAgKChjb21tb25faGRyKS0+YXV0aF9sZW4gPyAoY29tbW9uX2hkciktPmF1dGhfbGVuICsgc2l6ZW9mKFJwY0F1dGhWZXJpZmllcikgOiAwKQoKI2RlZmluZSBSUENfVkVSX01BSk9SICAgICAgICAgICAgIDUKI2RlZmluZSBSUENfVkVSX01JTk9SICAgICAgICAgICAgIDAKCiNkZWZpbmUgUlBDX0ZMR19GSVJTVCAgICAgICAgICAgICAxCiNkZWZpbmUgUlBDX0ZMR19MQVNUICAgICAgICAgICAgICAyCiNkZWZpbmUgUlBDX0ZMR19PQkpFQ1RfVVVJRCAgICAweDgwCgojZGVmaW5lIFJQQ19NSU5fUEFDS0VUX1NJWkUgIDB4MTAwMAojZGVmaW5lIFJQQ19NQVhfUEFDS0VUX1NJWkUgIDB4MTZEMAoKI2RlZmluZSBQS1RfUkVRVUVTVCAgICAgICAgICAgICAwCiNkZWZpbmUgUEtUX1BJTkcgICAgICAgICAgICAgICAgMQojZGVmaW5lIFBLVF9SRVNQT05TRSAgICAgICAgICAgIDIKI2RlZmluZSBQS1RfRkFVTFQgICAgICAgICAgICAgICAzCiNkZWZpbmUgUEtUX1dPUktJTkcgICAgICAgICAgICAgNAojZGVmaW5lIFBLVF9OT0NBTEwgICAgICAgICAgICAgIDUKI2RlZmluZSBQS1RfUkVKRUNUICAgICAgICAgICAgICA2CiNkZWZpbmUgUEtUX0FDSyAgICAgICAgICAgICAgICAgNwojZGVmaW5lIFBLVF9DTF9DQU5DRUwgICAgICAgICAgIDgKI2RlZmluZSBQS1RfRkFDSyAgICAgICAgICAgICAgICA5CiNkZWZpbmUgUEtUX0NBTkNFTF9BQ0sgICAgICAgICAxMAojZGVmaW5lIFBLVF9CSU5EICAgICAgICAgICAgICAgMTEKI2RlZmluZSBQS1RfQklORF9BQ0sgICAgICAgICAgIDEyCiNkZWZpbmUgUEtUX0JJTkRfTkFDSyAgICAgICAgICAxMwojZGVmaW5lIFBLVF9BTFRFUl9DT05URVhUICAgICAgMTQKI2RlZmluZSBQS1RfQUxURVJfQ09OVEVYVF9SRVNQIDE1CiNkZWZpbmUgUEtUX0FVVEgzICAgICAgICAgICAgICAxNgojZGVmaW5lIFBLVF9TSFVURE9XTiAgICAgICAgICAgMTcKI2RlZmluZSBQS1RfQ09fQ0FOQ0VMICAgICAgICAgIDE4CiNkZWZpbmUgUEtUX09SUEhBTkVEICAgICAgICAgICAxOQoKI2RlZmluZSBSRVNVTFRfQUNDRVBUICAgICAgICAgICAgICAgMAojZGVmaW5lIFJFU1VMVF9VU0VSX1JFSkVDVElPTiAgICAgICAxCiNkZWZpbmUgUkVTVUxUX1BST1ZJREVSX1JFSkVDVElPTiAgIDIKCiNkZWZpbmUgUkVBU09OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKI2RlZmluZSBSRUFTT05fQUJTVFJBQ1RfU1lOVEFYX05PVF9TVVBQT1JURUQgICAgMQojZGVmaW5lIFJFQVNPTl9UUkFOU0ZFUl9TWU5UQVhFU19OT1RfU1VQUE9SVEVEICAyCiNkZWZpbmUgUkVBU09OX0xPQ0FMX0xJTUlUX0VYQ0VFREVEICAgICAgICAgICAgIDMKCiNkZWZpbmUgUkVKRUNUX1JFQVNPTl9OT1RfU1BFQ0lGSUVEICAgICAgICAgICAgMAojZGVmaW5lIFJFSkVDVF9URU1QT1JBUllfQ09OR0VTVElPTiAgICAgICAgICAgIDEKI2RlZmluZSBSRUpFQ1RfTE9DQUxfTElNSVRfRVhDRUVERUQgICAgICAgICAgICAyCiNkZWZpbmUgUkVKRUNUX0NBTExFRF9QQUREUl9VTktOT1dOICAgICAgICAgICAgMyAvKiBub3QgdXNlZCAqLwojZGVmaW5lIFJFSkVDVF9QUk9UT0NPTF9WRVJTSU9OX05PVF9TVVBQT1JURUQgIDQKI2RlZmluZSBSRUpFQ1RfREVGQVVMVF9DT05URVhUX05PVF9TVVBQT1JURUQgICA1IC8qIG5vdCB1c2VkICovCiNkZWZpbmUgUkVKRUNUX1VTRVJfREFUQV9OT1RfUkVBREFCTEUgICAgICAgICAgNiAvKiBub3QgdXNlZCAqLwojZGVmaW5lIFJFSkVDVF9OT19QU0FQX0FWQUlMQUJMRSAgICAgICAgICAgICAgIDcgLyogbm90IHVzZWQgKi8KI2RlZmluZSBSRUpFQ1RfVU5LTk9XTl9BVVRITl9TRVJWSUNFICAgICAgICAgICA4CiNkZWZpbmUgUkVKRUNUX0lOVkFMSURfQ0hFQ0tTVU0gICAgICAgICAgICAgICAgOQoKI2RlZmluZSBOQ0FER19JUF9VRFAgICAweDA4CiNkZWZpbmUgTkNBQ05fSVBfVENQICAgMHgwNwojZGVmaW5lIE5DQURHX0lQWCAgICAgIDB4MEUKI2RlZmluZSBOQ0FDTl9TUFggICAgICAweDBDCiNkZWZpbmUgTkNBQ05fTkJfTkIgICAgMHgxMgojZGVmaW5lIE5DQUNOX05CX0lQWCAgIDB4MEQKI2RlZmluZSBOQ0FDTl9ETkVUX05TUCAweDA0CiNkZWZpbmUgTkNBQ05fSFRUUCAgICAgMHgxRgoKLyogRnJlZURDRTogVFdSX0NfRkxSX1BST1RfSURfSVAgKi8KI2RlZmluZSBUV1JfSVAgMHgwOQoKI2VuZGlmICAvKiBfX1dJTkVfUlBDX0RFRlNfSCAqLwo=