LyogdGZtLmgKICoKICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTUgd29sZlNTTCBJbmMuCiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHdvbGZTU0wuIChmb3JtZXJseSBrbm93biBhcyBDeWFTU0wpCiAqCiAqIHdvbGZTU0wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiB3b2xmU1NMIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgoKLyoKICogQmFzZWQgb24gcHVibGljIGRvbWFpbiBUb21zRmFzdE1hdGggMC4xMCBieSBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwKICogaHR0cDovL21hdGgubGlidG9tY3J5cHQuY29tCiAqLwoKCi8qKgogKiAgRWRpdGVkIGJ5IE1vaXPpcyBHdWltYXLjZXMgKG1vaXNlcy5ndWltYXJhZXNAcGhvZWJ1cy5jb20uYnIpCiAqICB0byBmaXQgQ3lhU1NMJ3MgbmVlZHMuCiAqLwoKCiNpZm5kZWYgV09MRl9DUllQVF9URk1fSAojZGVmaW5lIFdPTEZfQ1JZUFRfVEZNX0gKCiNpbmNsdWRlIDx3b2xmc3NsL3dvbGZjcnlwdC90eXBlcy5oPgojaWZuZGVmIENIQVJfQklUCiAgICAjaW5jbHVkZSA8bGltaXRzLmg+CiNlbmRpZgoKCiNpZmRlZiBfX2NwbHVzcGx1cwogICAgZXh0ZXJuICJDIiB7CiNlbmRpZgoKI2lmbmRlZiBNSU4KICAgI2RlZmluZSBNSU4oeCx5KSAoKHgpPCh5KT8oeCk6KHkpKQojZW5kaWYKCiNpZm5kZWYgTUFYCiAgICNkZWZpbmUgTUFYKHgseSkgKCh4KT4oeSk/KHgpOih5KSkKI2VuZGlmCgoKI2lmbmRlZiBOT182NEJJVAovKiBhdXRvZGV0ZWN0IHg4Ni02NCBhbmQgbWFrZSBzdXJlIHdlIGFyZSB1c2luZyA2NC1iaXQgZGlnaXRzIHdpdGggeDg2LTY0IGFzbSAqLwojaWYgZGVmaW5lZChfX3g4Nl82NF9fKQogICAjaWYgZGVmaW5lZChURk1fWDg2KSB8fCBkZWZpbmVkKFRGTV9TU0UyKSB8fCBkZWZpbmVkKFRGTV9BUk0pCiAgICAgICAjZXJyb3IgeDg2LTY0IGRldGVjdGVkLCB4ODYtMzIvU1NFMi9BUk0gb3B0aW1pemF0aW9ucyBhcmUgbm90IHZhbGlkIQogICAjZW5kaWYKICAgI2lmICFkZWZpbmVkKFRGTV9YODZfNjQpICYmICFkZWZpbmVkKFRGTV9OT19BU00pCiAgICAgICNkZWZpbmUgVEZNX1g4Nl82NAogICAjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKFRGTV9YODZfNjQpCiAgICAjaWYgIWRlZmluZWQoRlBfNjRCSVQpCiAgICAgICAjZGVmaW5lIEZQXzY0QklUCiAgICAjZW5kaWYKI2VuZGlmCi8qIHVzZSA2NC1iaXQgZGlnaXQgZXZlbiBpZiBub3QgdXNpbmcgYXNtIG9uIHg4Nl82NCAqLwojaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChGUF82NEJJVCkKICAgICNkZWZpbmUgRlBfNjRCSVQKI2VuZGlmCi8qIGlmIGludGVsIGNvbXBpbGVyIGRvZXNuJ3QgcHJvdmlkZSAxMjggYml0IHR5cGUgZG9uJ3QgdHVybiBvbiA2NGJpdCAqLwojaWYgZGVmaW5lZChGUF82NEJJVCkgJiYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAhZGVmaW5lZChIQVZFX19fVUlOVDEyOF9UKQogICAgI3VuZGVmIEZQXzY0QklUCiAgICAjdW5kZWYgVEZNX1g4Nl82NAojZW5kaWYKI2VuZGlmIC8qIE5PXzY0QklUICovCgovKiB0cnkgdG8gZGV0ZWN0IHg4Ni0zMiAqLwojaWYgZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoVEZNX1NTRTIpCiAgICNpZiBkZWZpbmVkKFRGTV9YODZfNjQpIHx8IGRlZmluZWQoVEZNX0FSTSkKICAgICAgICNlcnJvciB4ODYtMzIgZGV0ZWN0ZWQsIHg4Ni02NC9BUk0gb3B0aW1pemF0aW9ucyBhcmUgbm90IHZhbGlkIQogICAjZW5kaWYKICAgI2lmICFkZWZpbmVkKFRGTV9YODYpICYmICFkZWZpbmVkKFRGTV9OT19BU00pCiAgICAgICNkZWZpbmUgVEZNX1g4NgogICAjZW5kaWYKI2VuZGlmCgovKiBtYWtlIHN1cmUgd2UncmUgMzItYml0IGZvciB4ODYtMzIvc3NlL2FybS9wcGMzMiAqLwojaWYgKGRlZmluZWQoVEZNX1g4NikgfHwgZGVmaW5lZChURk1fU1NFMikgfHwgZGVmaW5lZChURk1fQVJNKSB8fCBkZWZpbmVkKFRGTV9QUEMzMikpICYmIGRlZmluZWQoRlBfNjRCSVQpCiAgICN3YXJuaW5nIHg4Ni0zMiwgU1NFMiBhbmQgQVJNLCBQUEMzMiBvcHRpbWl6YXRpb25zIHJlcXVpcmUgMzItYml0IGRpZ2l0cyAodW5kZWZpbmluZykKICAgI3VuZGVmIEZQXzY0QklUCiNlbmRpZgoKLyogbXVsdGkgYXNtcz8gKi8KI2lmZGVmIFRGTV9YODYKICAgI2RlZmluZSBURk1fQVNNCiNlbmRpZgojaWZkZWYgVEZNX1g4Nl82NAogICAjaWZkZWYgVEZNX0FTTQogICAgICAjZXJyb3IgVEZNX0FTTSBhbHJlYWR5IGRlZmluZWQhCiAgICNlbmRpZgogICAjZGVmaW5lIFRGTV9BU00KI2VuZGlmCiNpZmRlZiBURk1fU1NFMgogICAjaWZkZWYgVEZNX0FTTQogICAgICAjZXJyb3IgVEZNX0FTTSBhbHJlYWR5IGRlZmluZWQhCiAgICNlbmRpZgogICAjZGVmaW5lIFRGTV9BU00KI2VuZGlmCiNpZmRlZiBURk1fQVJNCiAgICNpZmRlZiBURk1fQVNNCiAgICAgICNlcnJvciBURk1fQVNNIGFscmVhZHkgZGVmaW5lZCEKICAgI2VuZGlmCiAgICNkZWZpbmUgVEZNX0FTTQojZW5kaWYKI2lmZGVmIFRGTV9QUEMzMgogICAjaWZkZWYgVEZNX0FTTQogICAgICAjZXJyb3IgVEZNX0FTTSBhbHJlYWR5IGRlZmluZWQhCiAgICNlbmRpZgogICAjZGVmaW5lIFRGTV9BU00KI2VuZGlmCiNpZmRlZiBURk1fUFBDNjQKICAgI2lmZGVmIFRGTV9BU00KICAgICAgI2Vycm9yIFRGTV9BU00gYWxyZWFkeSBkZWZpbmVkIQogICAjZW5kaWYKICAgI2RlZmluZSBURk1fQVNNCiNlbmRpZgojaWZkZWYgVEZNX0FWUjMyCiAgICNpZmRlZiBURk1fQVNNCiAgICAgICNlcnJvciBURk1fQVNNIGFscmVhZHkgZGVmaW5lZCEKICAgI2VuZGlmCiAgICNkZWZpbmUgVEZNX0FTTQojZW5kaWYKCi8qIHdlIHdhbnQgbm8gYXNtPyAqLwojaWZkZWYgVEZNX05PX0FTTQogICAjdW5kZWYgVEZNX1g4NgogICAjdW5kZWYgVEZNX1g4Nl82NAogICAjdW5kZWYgVEZNX1NTRTIKICAgI3VuZGVmIFRGTV9BUk0KICAgI3VuZGVmIFRGTV9QUEMzMgogICAjdW5kZWYgVEZNX1BQQzY0CiAgICN1bmRlZiBURk1fQVZSMzIKICAgI3VuZGVmIFRGTV9BU00KI2VuZGlmCgovKiBFQ0MgaGVscGVycyAqLwojaWZkZWYgVEZNX0VDQzE5MgogICAjaWZkZWYgRlBfNjRCSVQKICAgICAgICNkZWZpbmUgVEZNX01VTDMKICAgICAgICNkZWZpbmUgVEZNX1NRUjMKICAgI2Vsc2UKICAgICAgICNkZWZpbmUgVEZNX01VTDYKICAgICAgICNkZWZpbmUgVEZNX1NRUjYKICAgI2VuZGlmCiNlbmRpZgoKI2lmZGVmIFRGTV9FQ0MyMjQKICAgI2lmZGVmIEZQXzY0QklUCiAgICAgICAjZGVmaW5lIFRGTV9NVUw0CiAgICAgICAjZGVmaW5lIFRGTV9TUVI0CiAgICNlbHNlCiAgICAgICAjZGVmaW5lIFRGTV9NVUw3CiAgICAgICAjZGVmaW5lIFRGTV9TUVI3CiAgICNlbmRpZgojZW5kaWYKCiNpZmRlZiBURk1fRUNDMjU2CiAgICNpZmRlZiBGUF82NEJJVAogICAgICAgI2RlZmluZSBURk1fTVVMNAogICAgICAgI2RlZmluZSBURk1fU1FSNAogICAjZWxzZQogICAgICAgI2RlZmluZSBURk1fTVVMOAogICAgICAgI2RlZmluZSBURk1fU1FSOAogICAjZW5kaWYKI2VuZGlmCgojaWZkZWYgVEZNX0VDQzM4NAogICAjaWZkZWYgRlBfNjRCSVQKICAgICAgICNkZWZpbmUgVEZNX01VTDYKICAgICAgICNkZWZpbmUgVEZNX1NRUjYKICAgI2Vsc2UKICAgICAgICNkZWZpbmUgVEZNX01VTDEyCiAgICAgICAjZGVmaW5lIFRGTV9TUVIxMgogICAjZW5kaWYKI2VuZGlmCgojaWZkZWYgVEZNX0VDQzUyMQogICAjaWZkZWYgRlBfNjRCSVQKICAgICAgICNkZWZpbmUgVEZNX01VTDkKICAgICAgICNkZWZpbmUgVEZNX1NRUjkKICAgI2Vsc2UKICAgICAgICNkZWZpbmUgVEZNX01VTDE3CiAgICAgICAjZGVmaW5lIFRGTV9TUVIxNwogICAjZW5kaWYKI2VuZGlmCgoKLyogc29tZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zLgogKi8KI2lmIGRlZmluZWQoRlBfNjRCSVQpCiAgIC8qIGZvciBHQ0Mgb25seSBvbiBzdXBwb3J0ZWQgcGxhdGZvcm1zICovCiAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGZwX2RpZ2l0OyAgIC8qIDY0Yml0LCAxMjggdXNlcyBtb2RlKFRJKSBiZWxvdyAqLwogICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICBmcF93b3JkIF9fYXR0cmlidXRlX18gKChtb2RlKFRJKSkpOwojZWxzZQogICAjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCiAgICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgIHVsb25nNjQ7CiAgICNlbHNlCiAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVsb25nNjQ7CiAgICNlbmRpZgoKICAgI2lmbmRlZiBOT182NEJJVAogICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICBmcF9kaWdpdDsKICAgICAgdHlwZWRlZiB1bG9uZzY0ICAgICAgICAgICAgZnBfd29yZDsKICAgICAgI2RlZmluZSBGUF8zMkJJVAogICAjZWxzZQogICAgICAvKiBzb21lIHByb2NzIGxpa2UgY29sZGZpcmUgcHJlZmVyIG5vdCB0byBwbGFjZSBtdWx0aXBseSBpbnRvIDY0Yml0IHR5cGUKICAgICAgICAgZXZlbiB0aG91Z2ggaXQgZXhpc3RzICovCiAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgIGZwX2RpZ2l0OwogICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICBmcF93b3JkOwogICAjZW5kaWYKI2VuZGlmCgovKiAjIG9mIGRpZ2l0cyB0aGlzIGlzICovCiNkZWZpbmUgRElHSVRfQklUICAoaW50KSgoQ0hBUl9CSVQpICogc2l6ZW9mKGZwX2RpZ2l0KSkKCi8qIE1heCBzaXplIG9mIGFueSBudW1iZXIgaW4gYml0cy4gIEJhc2ljYWxseSB0aGUgbGFyZ2VzdCBzaXplIHlvdSB3aWxsIGJlCiAqIG11bHRpcGx5aW5nIHNob3VsZCBiZSBoYWxmIFtvciBzbWFsbGVyXSBvZiBGUF9NQVhfU0laRS1mb3VyX2RpZ2l0CiAqCiAqIEl0IGRlZmF1bHRzIHRvIDQwOTYtYml0cyBbYWxsb3dpbmcgbXVsdGlwbGljYXRpb25zIHVwdG8gMjA0OHgyMDQ4IGJpdHMgXQogKi8KI2lmbmRlZiBGUF9NQVhfQklUUwogICAgI2RlZmluZSBGUF9NQVhfQklUUyAgICAgICAgICAgNDA5NgojZW5kaWYKI2RlZmluZSBGUF9NQVhfU0laRSAgICAgICAgICAgKEZQX01BWF9CSVRTKyg4KkRJR0lUX0JJVCkpCgovKiB3aWxsIHRoaXMgbGliIHdvcms/ICovCiNpZiAoQ0hBUl9CSVQgJiA3KQogICAjZXJyb3IgQ0hBUl9CSVQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGVpZ2h0LgojZW5kaWYKI2lmIEZQX01BWF9CSVRTICUgQ0hBUl9CSVQKICAgI2Vycm9yIEZQX01BWF9CSVRTIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBDSEFSX0JJVAojZW5kaWYKCiNkZWZpbmUgRlBfTUFTSyAgICAoZnBfZGlnaXQpKC0xKQojZGVmaW5lIEZQX1NJWkUgICAgKEZQX01BWF9TSVpFL0RJR0lUX0JJVCkKCi8qIHNpZ25zICovCiNkZWZpbmUgRlBfWlBPUyAgICAgMAojZGVmaW5lIEZQX05FRyAgICAgIDEKCi8qIHJldHVybiBjb2RlcyAqLwojZGVmaW5lIEZQX09LQVkgICAgIDAKI2RlZmluZSBGUF9WQUwgICAgICAxCiNkZWZpbmUgRlBfTUVNICAgICAgMgoKLyogZXF1YWxpdGllcyAqLwojZGVmaW5lIEZQX0xUICAgICAgICAtMSAgIC8qIGxlc3MgdGhhbiAqLwojZGVmaW5lIEZQX0VRICAgICAgICAgMCAgIC8qIGVxdWFsIHRvICovCiNkZWZpbmUgRlBfR1QgICAgICAgICAxICAgLyogZ3JlYXRlciB0aGFuICovCgovKiByZXBsaWVzICovCiNkZWZpbmUgRlBfWUVTICAgICAgICAxICAgLyogeWVzIHJlc3BvbnNlICovCiNkZWZpbmUgRlBfTk8gICAgICAgICAwICAgLyogbm8gcmVzcG9uc2UgKi8KCi8qIGEgRlAgdHlwZSAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgICAgICB1c2VkLAogICAgICAgICAgICAgc2lnbjsKI2lmZGVmIEFMVF9FQ0NfU0laRQogICAgaW50ICAgICAgc2l6ZTsKI2VuZGlmCiAgICBmcF9kaWdpdCBkcFtGUF9TSVpFXTsKfSBmcF9pbnQ7CgovKiBleHRlcm5hbGx5IGRlZmluZSB0aGlzIHN5bWJvbCB0byBpZ25vcmUgdGhlIGRlZmF1bHQgc2V0dGluZ3MsIHVzZWZ1bCBmb3IgY2hhbmdpbmcgdGhlIGJ1aWxkIGZyb20gdGhlIG1ha2UgcHJvY2VzcyAqLwojaWZuZGVmIFRGTV9BTFJFQURZX1NFVAoKLyogZG8gd2Ugd2FudCB0aGUgbGFyZ2Ugc2V0IG9mIHNtYWxsIG11bHRpcGxpY2F0aW9ucyA/CiAgIEVuYWJsZSB0aGVzZSBpZiB5b3UgYXJlIGdvaW5nIHRvIGJlIGRvaW5nIGEgbG90IG9mIHNtYWxsICg8PSAxNiBkaWdpdCkgbXVsdGlwbGljYXRpb25zIHNheSBpbiBFQ0MKICAgT3IgaWYgeW91J3JlIG9uIGEgNjQtYml0IG1hY2hpbmUgZG9pbmcgUlNBIGFzIGEgMTAyNC1iaXQgaW50ZWdlciA9PSAxNiBkaWdpdHMgOy0pCiAqLwovKiBuZWVkIHRvIHJlZmFjdG9yIHRoZSBmdW5jdGlvbiAqLwovKiNkZWZpbmUgVEZNX1NNQUxMX1NFVCAqLwoKLyogZG8gd2Ugd2FudCBodWdlIGNvZGUKICAgRW5hYmxlIHRoZXNlIGlmIHlvdSBhcmUgZG9pbmcgMjAsIDI0LCAyOCwgMzIsIDQ4LCA2NCBkaWdpdCBtdWx0aXBsaWNhdGlvbnMgKHVzZWZ1bCBmb3IgUlNBKQogICBMZXNzIGltcG9ydGFudCBvbiA2NC1iaXQgbWFjaGluZXMgYXMgMzIgZGlnaXRzID09IDIwNDggYml0cwogKi8KI2lmIDAKI2RlZmluZSBURk1fTVVMMwojZGVmaW5lIFRGTV9NVUw0CiNkZWZpbmUgVEZNX01VTDYKI2RlZmluZSBURk1fTVVMNwojZGVmaW5lIFRGTV9NVUw4CiNkZWZpbmUgVEZNX01VTDkKI2RlZmluZSBURk1fTVVMMTIKI2RlZmluZSBURk1fTVVMMTcKI2VuZGlmCiNpZmRlZiBURk1fSFVHRV9TRVQKI2RlZmluZSBURk1fTVVMMjAKI2RlZmluZSBURk1fTVVMMjQKI2RlZmluZSBURk1fTVVMMjgKI2RlZmluZSBURk1fTVVMMzIKI2lmIChGUF9NQVhfQklUUyA+PSA2MTQ0KSAmJiBkZWZpbmVkKEZQXzY0QklUKQogICAgI2RlZmluZSBURk1fTVVMNDgKI2VuZGlmCiNpZiAoRlBfTUFYX0JJVFMgPj0gODE5MikgJiYgZGVmaW5lZChGUF82NEJJVCkKICAgICNkZWZpbmUgVEZNX01VTDY0CiNlbmRpZgojZW5kaWYKCiNpZiAwCiNkZWZpbmUgVEZNX1NRUjMKI2RlZmluZSBURk1fU1FSNAojZGVmaW5lIFRGTV9TUVI2CiNkZWZpbmUgVEZNX1NRUjcKI2RlZmluZSBURk1fU1FSOAojZGVmaW5lIFRGTV9TUVI5CiNkZWZpbmUgVEZNX1NRUjEyCiNkZWZpbmUgVEZNX1NRUjE3CiNlbmRpZgojaWZkZWYgVEZNX0hVR0VfU0VUCiNkZWZpbmUgVEZNX1NRUjIwCiNkZWZpbmUgVEZNX1NRUjI0CiNkZWZpbmUgVEZNX1NRUjI4CiNkZWZpbmUgVEZNX1NRUjMyCiNkZWZpbmUgVEZNX1NRUjQ4CiNkZWZpbmUgVEZNX1NRUjY0CiNlbmRpZgoKLyogZG8gd2Ugd2FudCBzb21lIG92ZXJmbG93IGNoZWNrcwogICBOb3QgcmVxdWlyZWQgaWYgeW91IG1ha2Ugc3VyZSB5b3VyIG51bWJlcnMgYXJlIHdpdGhpbiByYW5nZSAoZS5nLiBieSBkZWZhdWx0IGEgbW9kdWx1cyBmb3IgZnBfZXhwdG1vZCgpIGNhbiBvbmx5IGJlIHVwdG8gMjA0OCBiaXRzIGxvbmcpCiAqLwovKiAjZGVmaW5lIFRGTV9DSEVDSyAqLwoKLyogSXMgdGhlIHRhcmdldCBhIFA0IFByZXNjb3R0CiAqLwovKiAjZGVmaW5lIFRGTV9QUkVTQ09UVCAqLwoKLyogRG8gd2Ugd2FudCB0aW1pbmcgcmVzaXN0YW50IGZwX2V4cHRtb2QoKSA/CiAqIFRoaXMgbWFrZXMgaXQgc2xvd2VyIGJ1dCBhbHNvIHRpbWluZyBpbnZhcmlhbnQgd2l0aCByZXNwZWN0IHRvIHRoZSBleHBvbmVudCAKICovCi8qICNkZWZpbmUgVEZNX1RJTUlOR19SRVNJU1RBTlQgKi8KCiNlbmRpZiAvKiBURk1fQUxSRUFEWV9TRVQgKi8KCi8qIGZ1bmN0aW9ucyAqLwoKLyogcmV0dXJucyBhIFRGTSBpZGVudCBzdHJpbmcgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuLi4gKi8KLypjb25zdCBjaGFyICpmcF9pZGVudCh2b2lkKTsqLwoKLyogaW5pdGlhbGl6ZSBbb3IgemVyb10gYW4gZnAgaW50ICovCiNpZmRlZiBBTFRfRUNDX1NJWkUKICAgIHZvaWQgZnBfaW5pdChmcF9pbnQgKmEpOwogICAgdm9pZCBmcF96ZXJvKGZwX2ludCAqYSk7CiNlbHNlCiAgICAjZGVmaW5lIGZwX2luaXQoYSkgICh2b2lkKVhNRU1TRVQoKGEpLCAwLCBzaXplb2YoZnBfaW50KSkKICAgICNkZWZpbmUgZnBfemVybyhhKSAgZnBfaW5pdChhKQojZW5kaWYKCi8qIHplcm8vZXZlbi9vZGQgPyAqLwojZGVmaW5lIGZwX2lzemVybyhhKSAoKChhKS0+dXNlZCA9PSAwKSA/IEZQX1lFUyA6IEZQX05PKQojZGVmaW5lIGZwX2lzZXZlbihhKSAoKChhKS0+dXNlZCA+IDAgJiYgKCgoYSktPmRwWzBdICYgMSkgPT0gMCkpID8gRlBfWUVTIDogRlBfTk8pCiNkZWZpbmUgZnBfaXNvZGQoYSkgICgoKGEpLT51c2VkID4gMCAgJiYgKCgoYSktPmRwWzBdICYgMSkgPT0gMSkpID8gRlBfWUVTIDogRlBfTk8pCgovKiBzZXQgdG8gYSBzbWFsbCBkaWdpdCAqLwp2b2lkIGZwX3NldChmcF9pbnQgKmEsIGZwX2RpZ2l0IGIpOwoKLyogY29weSBmcm9tIGEgdG8gYiAqLwojaWZuZGVmIEFMVF9FQ0NfU0laRQogICAgI2RlZmluZSBmcF9jb3B5KGEsIGIpICAodm9pZCkoKChhKSAhPSAoYikpID8gKCh2b2lkKVhNRU1DUFkoKGIpLCAoYSksIHNpemVvZihmcF9pbnQpKSkgOiAodm9pZCkwKQogICAgI2RlZmluZSBmcF9pbml0X2NvcHkoYSwgYikgZnBfY29weShiLCBhKQojZWxzZQogICAgdm9pZCBmcF9jb3B5KGZwX2ludCAqYSwgZnBfaW50ICpiKTsKICAgIHZvaWQgZnBfaW5pdF9jb3B5KGZwX2ludCAqYSwgZnBfaW50ICpiKTsKI2VuZGlmCgovKiBjbGFtcCBkaWdpdHMgKi8KI2RlZmluZSBmcF9jbGFtcChhKSAgIHsgd2hpbGUgKChhKS0+dXNlZCAmJiAoYSktPmRwWyhhKS0+dXNlZC0xXSA9PSAwKSAtLSgoYSktPnVzZWQpOyAoYSktPnNpZ24gPSAoYSktPnVzZWQgPyAoYSktPnNpZ24gOiBGUF9aUE9TOyB9CgovKiBuZWdhdGUgYW5kIGFic29sdXRlICovCiNkZWZpbmUgZnBfbmVnKGEsIGIpICB7IGZwX2NvcHkoYSwgYik7IChiKS0+c2lnbiBePSAxOyBmcF9jbGFtcChiKTsgfQojZGVmaW5lIGZwX2FicyhhLCBiKSAgeyBmcF9jb3B5KGEsIGIpOyAoYiktPnNpZ24gID0gMDsgfQoKLyogcmlnaHQgc2hpZnQgeCBkaWdpdHMgKi8Kdm9pZCBmcF9yc2hkKGZwX2ludCAqYSwgaW50IHgpOwoKLyogcmlnaHQgc2hpZnQgeCBiaXRzICovCnZvaWQgZnBfcnNoYihmcF9pbnQgKmEsIGludCB4KTsKCi8qIGxlZnQgc2hpZnQgeCBkaWdpdHMgKi8Kdm9pZCBmcF9sc2hkKGZwX2ludCAqYSwgaW50IHgpOwoKLyogc2lnbmVkIGNvbXBhcmlzb24gKi8KaW50IGZwX2NtcChmcF9pbnQgKmEsIGZwX2ludCAqYik7CgovKiB1bnNpZ25lZCBjb21wYXJpc29uICovCmludCBmcF9jbXBfbWFnKGZwX2ludCAqYSwgZnBfaW50ICpiKTsKCi8qIHBvd2VyIG9mIDIgb3BlcmF0aW9ucyAqLwp2b2lkIGZwX2Rpdl8yZChmcF9pbnQgKmEsIGludCBiLCBmcF9pbnQgKmMsIGZwX2ludCAqZCk7CnZvaWQgZnBfbW9kXzJkKGZwX2ludCAqYSwgaW50IGIsIGZwX2ludCAqYyk7CnZvaWQgZnBfbXVsXzJkKGZwX2ludCAqYSwgaW50IGIsIGZwX2ludCAqYyk7CnZvaWQgZnBfMmV4cHQgKGZwX2ludCAqYSwgaW50IGIpOwp2b2lkIGZwX211bF8yKGZwX2ludCAqYSwgZnBfaW50ICpjKTsKdm9pZCBmcF9kaXZfMihmcF9pbnQgKmEsIGZwX2ludCAqYyk7CgovKiBDb3VudHMgdGhlIG51bWJlciBvZiBsc2JzIHdoaWNoIGFyZSB6ZXJvIGJlZm9yZSB0aGUgZmlyc3QgemVybyBiaXQgKi8KaW50IGZwX2NudF9sc2IoZnBfaW50ICphKTsKCi8qIGMgPSBhICsgYiAqLwp2b2lkIGZwX2FkZChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKCi8qIGMgPSBhIC0gYiAqLwp2b2lkIGZwX3N1YihmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKCi8qIGMgPSBhICogYiAqLwp2b2lkIGZwX211bChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKCi8qIGIgPSBhKmEgICovCnZvaWQgZnBfc3FyKGZwX2ludCAqYSwgZnBfaW50ICpiKTsKCi8qIGEvYiA9PiBjYiArIGQgPT0gYSAqLwppbnQgZnBfZGl2KGZwX2ludCAqYSwgZnBfaW50ICpiLCBmcF9pbnQgKmMsIGZwX2ludCAqZCk7CgovKiBjID0gYSBtb2QgYiwgMCA8PSBjIDwgYiAgKi8KaW50IGZwX21vZChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKCi8qIGNvbXBhcmUgYWdhaW5zdCBhIHNpbmdsZSBkaWdpdCAqLwppbnQgZnBfY21wX2QoZnBfaW50ICphLCBmcF9kaWdpdCBiKTsKCi8qIGMgPSBhICsgYiAqLwp2b2lkIGZwX2FkZF9kKGZwX2ludCAqYSwgZnBfZGlnaXQgYiwgZnBfaW50ICpjKTsKCi8qIGMgPSBhIC0gYiAqLwp2b2lkIGZwX3N1Yl9kKGZwX2ludCAqYSwgZnBfZGlnaXQgYiwgZnBfaW50ICpjKTsKCi8qIGMgPSBhICogYiAqLwp2b2lkIGZwX211bF9kKGZwX2ludCAqYSwgZnBfZGlnaXQgYiwgZnBfaW50ICpjKTsKCi8qIGEvYiA9PiBjYiArIGQgPT0gYSAqLwovKmludCBmcF9kaXZfZChmcF9pbnQgKmEsIGZwX2RpZ2l0IGIsIGZwX2ludCAqYywgZnBfZGlnaXQgKmQpOyovCgovKiBjID0gYSBtb2QgYiwgMCA8PSBjIDwgYiAgKi8KLyppbnQgZnBfbW9kX2QoZnBfaW50ICphLCBmcF9kaWdpdCBiLCBmcF9kaWdpdCAqYyk7Ki8KCi8qIC0tLT4gbnVtYmVyIHRoZW9yeSA8LS0tICovCi8qIGQgPSBhICsgYiAobW9kIGMpICovCi8qaW50IGZwX2FkZG1vZChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjLCBmcF9pbnQgKmQpOyovCgovKiBkID0gYSAtIGIgKG1vZCBjKSAqLwovKmludCBmcF9zdWJtb2QoZnBfaW50ICphLCBmcF9pbnQgKmIsIGZwX2ludCAqYywgZnBfaW50ICpkKTsqLwoKLyogZCA9IGEgKiBiIChtb2QgYykgKi8KaW50IGZwX211bG1vZChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjLCBmcF9pbnQgKmQpOwoKLyogYyA9IGEgKiBhIChtb2QgYikgKi8KaW50IGZwX3Nxcm1vZChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKCi8qIGMgPSAxL2EgKG1vZCBiKSAqLwppbnQgZnBfaW52bW9kKGZwX2ludCAqYSwgZnBfaW50ICpiLCBmcF9pbnQgKmMpOwoKLyogYyA9IChhLCBiKSAqLwovKnZvaWQgZnBfZ2NkKGZwX2ludCAqYSwgZnBfaW50ICpiLCBmcF9pbnQgKmMpOyovCgovKiBjID0gW2EsIGJdICovCi8qdm9pZCBmcF9sY20oZnBfaW50ICphLCBmcF9pbnQgKmIsIGZwX2ludCAqYyk7Ki8KCi8qIHNldHVwcyB0aGUgbW9udGdvbWVyeSByZWR1Y3Rpb24gKi8KaW50IGZwX21vbnRnb21lcnlfc2V0dXAoZnBfaW50ICphLCBmcF9kaWdpdCAqbXApOwoKLyogY29tcHV0ZXMgYSA9IEIqKm4gbW9kIGIgd2l0aG91dCBkaXZpc2lvbiBvciBtdWx0aXBsaWNhdGlvbiB1c2VmdWwgZm9yCiAqIG5vcm1hbGl6aW5nIG51bWJlcnMgaW4gYSBNb250Z29tZXJ5IHN5c3RlbS4KICovCnZvaWQgZnBfbW9udGdvbWVyeV9jYWxjX25vcm1hbGl6YXRpb24oZnBfaW50ICphLCBmcF9pbnQgKmIpOwoKLyogY29tcHV0ZXMgeC9SID09IHggKG1vZCBOKSB2aWEgTW9udGdvbWVyeSBSZWR1Y3Rpb24gKi8Kdm9pZCBmcF9tb250Z29tZXJ5X3JlZHVjZShmcF9pbnQgKmEsIGZwX2ludCAqbSwgZnBfZGlnaXQgbXApOwoKLyogZCA9IGEqKmIgKG1vZCBjKSAqLwppbnQgZnBfZXhwdG1vZChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjLCBmcF9pbnQgKmQpOwoKLyogcHJpbWFsaXR5IHN0dWZmICovCgovKiBwZXJmb3JtIGEgTWlsbGVyLVJhYmluIHRlc3Qgb2YgYSB0byB0aGUgYmFzZSBiIGFuZCBzdG9yZSByZXN1bHQgaW4gInJlc3VsdCIgKi8KLyp2b2lkIGZwX3ByaW1lX21pbGxlcl9yYWJpbiAoZnBfaW50ICogYSwgZnBfaW50ICogYiwgaW50ICpyZXN1bHQpOyovCgovKiAyNTYgdHJpYWwgZGl2aXNpb25zICsgOCBNaWxsZXItUmFiaW5zLCByZXR1cm5zIEZQX1lFUyBpZiBwcm9iYWJsZSBwcmltZSAgKi8KLyppbnQgZnBfaXNwcmltZShmcF9pbnQgKmEpOyovCgovKiBQcmltYWxpdHkgZ2VuZXJhdGlvbiBmbGFncyAqLwovKiNkZWZpbmUgVEZNX1BSSU1FX0JCUyAgICAgIDB4MDAwMSAqLyAvKiBCQlMgc3R5bGUgcHJpbWUgKi8KLyojZGVmaW5lIFRGTV9QUklNRV9TQUZFICAgICAweDAwMDIgKi8gLyogU2FmZSBwcmltZSAocC0xKS8yID09IHByaW1lICovCi8qI2RlZmluZSBURk1fUFJJTUVfMk1TQl9PRkYgMHgwMDA0ICovIC8qIGZvcmNlIDJuZCBNU0IgdG8gMCAqLwovKiNkZWZpbmUgVEZNX1BSSU1FXzJNU0JfT04gIDB4MDAwOCAqLyAvKiBmb3JjZSAybmQgTVNCIHRvIDEgKi8KCi8qIGNhbGxiYWNrIGZvciBmcF9wcmltZV9yYW5kb20sIHNob3VsZCBmaWxsIGRzdCB3aXRoIHJhbmRvbSBieXRlcyBhbmQgcmV0dXJuIGhvdyBtYW55IHJlYWQgW3VwdG8gbGVuXSAqLwovKnR5cGVkZWYgaW50IHRmbV9wcmltZV9jYWxsYmFjayh1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sIHZvaWQgKmRhdCk7Ki8KCi8qI2RlZmluZSBmcF9wcmltZV9yYW5kb20oYSwgdCwgc2l6ZSwgYmJzLCBjYiwgZGF0KSBmcF9wcmltZV9yYW5kb21fZXgoYSwgdCwgKChzaXplKSAqIDgpICsgMSwgKGJicz09MSk/VEZNX1BSSU1FX0JCUzowLCBjYiwgZGF0KSovCgovKmludCBmcF9wcmltZV9yYW5kb21fZXgoZnBfaW50ICphLCBpbnQgdCwgaW50IHNpemUsIGludCBmbGFncywgdGZtX3ByaW1lX2NhbGxiYWNrIGNiLCB2b2lkICpkYXQpOyovCgovKiByYWRpeCBjb25lcnNpb25zICovCmludCBmcF9jb3VudF9iaXRzKGZwX2ludCAqYSk7CmludCBmcF9sZWFkaW5nX2JpdChmcF9pbnQgKmEpOwoKaW50IGZwX3Vuc2lnbmVkX2Jpbl9zaXplKGZwX2ludCAqYSk7CnZvaWQgZnBfcmVhZF91bnNpZ25lZF9iaW4oZnBfaW50ICphLCB1bnNpZ25lZCBjaGFyICpiLCBpbnQgYyk7CnZvaWQgZnBfdG9fdW5zaWduZWRfYmluKGZwX2ludCAqYSwgdW5zaWduZWQgY2hhciAqYik7CgovKmludCBmcF9zaWduZWRfYmluX3NpemUoZnBfaW50ICphKTsqLwovKnZvaWQgZnBfcmVhZF9zaWduZWRfYmluKGZwX2ludCAqYSwgdW5zaWduZWQgY2hhciAqYiwgaW50IGMpOyovCi8qdm9pZCBmcF90b19zaWduZWRfYmluKGZwX2ludCAqYSwgdW5zaWduZWQgY2hhciAqYik7Ki8KCi8qaW50IGZwX3JlYWRfcmFkaXgoZnBfaW50ICphLCBjaGFyICpzdHIsIGludCByYWRpeCk7Ki8KLyppbnQgZnBfdG9yYWRpeChmcF9pbnQgKmEsIGNoYXIgKnN0ciwgaW50IHJhZGl4KTsqLwovKmludCBmcF90b3JhZGl4X24oZnBfaW50ICogYSwgY2hhciAqc3RyLCBpbnQgcmFkaXgsIGludCBtYXhsZW4pOyovCgoKLyogVkFSSU9VUyBMT1cgTEVWRUwgU1RVRkZTICovCnZvaWQgc19mcF9hZGQoZnBfaW50ICphLCBmcF9pbnQgKmIsIGZwX2ludCAqYyk7CnZvaWQgc19mcF9zdWIoZnBfaW50ICphLCBmcF9pbnQgKmIsIGZwX2ludCAqYyk7CnZvaWQgZnBfcmV2ZXJzZSh1bnNpZ25lZCBjaGFyICpzLCBpbnQgbGVuKTsKCnZvaWQgZnBfbXVsX2NvbWJhKGZwX2ludCAqYSwgZnBfaW50ICpiLCBmcF9pbnQgKmMpOwoKI2lmZGVmIFRGTV9TTUFMTF9TRVQKdm9pZCBmcF9tdWxfY29tYmFfc21hbGwoZnBfaW50ICphLCBmcF9pbnQgKmIsIGZwX2ludCAqYyk7CiNlbmRpZgoKI2lmZGVmIFRGTV9NVUwzCnZvaWQgZnBfbXVsX2NvbWJhMyhmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKI2VuZGlmCiNpZmRlZiBURk1fTVVMNAp2b2lkIGZwX211bF9jb21iYTQoZnBfaW50ICphLCBmcF9pbnQgKmIsIGZwX2ludCAqYyk7CiNlbmRpZgojaWZkZWYgVEZNX01VTDYKdm9pZCBmcF9tdWxfY29tYmE2KGZwX2ludCAqYSwgZnBfaW50ICpiLCBmcF9pbnQgKmMpOwojZW5kaWYKI2lmZGVmIFRGTV9NVUw3CnZvaWQgZnBfbXVsX2NvbWJhNyhmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKI2VuZGlmCiNpZmRlZiBURk1fTVVMOAp2b2lkIGZwX211bF9jb21iYTgoZnBfaW50ICphLCBmcF9pbnQgKmIsIGZwX2ludCAqYyk7CiNlbmRpZgojaWZkZWYgVEZNX01VTDkKdm9pZCBmcF9tdWxfY29tYmE5KGZwX2ludCAqYSwgZnBfaW50ICpiLCBmcF9pbnQgKmMpOwojZW5kaWYKI2lmZGVmIFRGTV9NVUwxMgp2b2lkIGZwX211bF9jb21iYTEyKGZwX2ludCAqYSwgZnBfaW50ICpiLCBmcF9pbnQgKmMpOwojZW5kaWYKI2lmZGVmIFRGTV9NVUwxNwp2b2lkIGZwX211bF9jb21iYTE3KGZwX2ludCAqYSwgZnBfaW50ICpiLCBmcF9pbnQgKmMpOwojZW5kaWYKCiNpZmRlZiBURk1fTVVMMjAKdm9pZCBmcF9tdWxfY29tYmEyMChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKI2VuZGlmCiNpZmRlZiBURk1fTVVMMjQKdm9pZCBmcF9tdWxfY29tYmEyNChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKI2VuZGlmCiNpZmRlZiBURk1fTVVMMjgKdm9pZCBmcF9tdWxfY29tYmEyOChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKI2VuZGlmCiNpZmRlZiBURk1fTVVMMzIKdm9pZCBmcF9tdWxfY29tYmEzMihmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKI2VuZGlmCiNpZmRlZiBURk1fTVVMNDgKdm9pZCBmcF9tdWxfY29tYmE0OChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKI2VuZGlmCiNpZmRlZiBURk1fTVVMNjQKdm9pZCBmcF9tdWxfY29tYmE2NChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKI2VuZGlmCgp2b2lkIGZwX3Nxcl9jb21iYShmcF9pbnQgKmEsIGZwX2ludCAqYik7CgojaWZkZWYgVEZNX1NNQUxMX1NFVAp2b2lkIGZwX3Nxcl9jb21iYV9zbWFsbChmcF9pbnQgKmEsIGZwX2ludCAqYik7CiNlbmRpZgoKI2lmZGVmIFRGTV9TUVIzCnZvaWQgZnBfc3FyX2NvbWJhMyhmcF9pbnQgKmEsIGZwX2ludCAqYik7CiNlbmRpZgojaWZkZWYgVEZNX1NRUjQKdm9pZCBmcF9zcXJfY29tYmE0KGZwX2ludCAqYSwgZnBfaW50ICpiKTsKI2VuZGlmCiNpZmRlZiBURk1fU1FSNgp2b2lkIGZwX3Nxcl9jb21iYTYoZnBfaW50ICphLCBmcF9pbnQgKmIpOwojZW5kaWYKI2lmZGVmIFRGTV9TUVI3CnZvaWQgZnBfc3FyX2NvbWJhNyhmcF9pbnQgKmEsIGZwX2ludCAqYik7CiNlbmRpZgojaWZkZWYgVEZNX1NRUjgKdm9pZCBmcF9zcXJfY29tYmE4KGZwX2ludCAqYSwgZnBfaW50ICpiKTsKI2VuZGlmCiNpZmRlZiBURk1fU1FSOQp2b2lkIGZwX3Nxcl9jb21iYTkoZnBfaW50ICphLCBmcF9pbnQgKmIpOwojZW5kaWYKI2lmZGVmIFRGTV9TUVIxMgp2b2lkIGZwX3Nxcl9jb21iYTEyKGZwX2ludCAqYSwgZnBfaW50ICpiKTsKI2VuZGlmCiNpZmRlZiBURk1fU1FSMTcKdm9pZCBmcF9zcXJfY29tYmExNyhmcF9pbnQgKmEsIGZwX2ludCAqYik7CiNlbmRpZgoKI2lmZGVmIFRGTV9TUVIyMAp2b2lkIGZwX3Nxcl9jb21iYTIwKGZwX2ludCAqYSwgZnBfaW50ICpiKTsKI2VuZGlmCiNpZmRlZiBURk1fU1FSMjQKdm9pZCBmcF9zcXJfY29tYmEyNChmcF9pbnQgKmEsIGZwX2ludCAqYik7CiNlbmRpZgojaWZkZWYgVEZNX1NRUjI4CnZvaWQgZnBfc3FyX2NvbWJhMjgoZnBfaW50ICphLCBmcF9pbnQgKmIpOwojZW5kaWYKI2lmZGVmIFRGTV9TUVIzMgp2b2lkIGZwX3Nxcl9jb21iYTMyKGZwX2ludCAqYSwgZnBfaW50ICpiKTsKI2VuZGlmCiNpZmRlZiBURk1fU1FSNDgKdm9pZCBmcF9zcXJfY29tYmE0OChmcF9pbnQgKmEsIGZwX2ludCAqYik7CiNlbmRpZgojaWZkZWYgVEZNX1NRUjY0CnZvaWQgZnBfc3FyX2NvbWJhNjQoZnBfaW50ICphLCBmcF9pbnQgKmIpOwojZW5kaWYKLypleHRlcm4gY29uc3QgY2hhciAqZnBfc19ybWFwOyovCgoKLyoqCiAqIFVzZWQgYnkgd29sZlNTTAogKi8KCi8qIFR5cGVzICovCiAgICB0eXBlZGVmIGZwX2RpZ2l0IG1wX2RpZ2l0OwogICAgdHlwZWRlZiBmcF93b3JkICBtcF93b3JkOwogICAgdHlwZWRlZiBmcF9pbnQgbXBfaW50OwoKLyogQ29uc3RhbnRzICovCiAgICAjZGVmaW5lIE1QX0xUICAgRlBfTFQgICAvKiBsZXNzIHRoYW4gICAgKi8KICAgICNkZWZpbmUgTVBfRVEgICBGUF9FUSAgIC8qIGVxdWFsIHRvICAgICAqLwogICAgI2RlZmluZSBNUF9HVCAgIEZQX0dUICAgLyogZ3JlYXRlciB0aGFuICovCiAgICAjZGVmaW5lIE1QX1ZBTCAgRlBfVkFMICAvKiBpbnZhbGlkICovCiAgICAjZGVmaW5lIE1QX09LQVkgRlBfT0tBWSAvKiBvayByZXN1bHQgICAgKi8KICAgICNkZWZpbmUgTVBfTk8gICBGUF9OTyAgIC8qIHllcy9ubyByZXN1bHQgKi8KICAgICNkZWZpbmUgTVBfWUVTICBGUF9ZRVMgIC8qIHllcy9ubyByZXN1bHQgKi8KCi8qIFByb3RvdHlwZXMgKi8KI2RlZmluZSBtcF96ZXJvKGEpICBmcF96ZXJvKGEpCiNkZWZpbmUgbXBfaXNldmVuKGEpICBmcF9pc2V2ZW4oYSkKaW50ICBtcF9pbml0IChtcF9pbnQgKiBhKTsKdm9pZCBtcF9jbGVhciAobXBfaW50ICogYSk7CmludCBtcF9pbml0X211bHRpKG1wX2ludCogYSwgbXBfaW50KiBiLCBtcF9pbnQqIGMsIG1wX2ludCogZCwgbXBfaW50KiBlLCBtcF9pbnQqIGYpOwoKaW50ICBtcF9hZGQgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIsIG1wX2ludCAqIGMpOwppbnQgIG1wX3N1YiAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYyk7CmludCAgbXBfYWRkX2QgKG1wX2ludCAqIGEsIG1wX2RpZ2l0IGIsIG1wX2ludCAqIGMpOwoKaW50ICBtcF9tdWwgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIsIG1wX2ludCAqIGMpOwppbnQgIG1wX211bG1vZCAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYywgbXBfaW50ICogZCk7CmludCAgbXBfbW9kKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMpOwppbnQgIG1wX2ludm1vZChtcF9pbnQgKmEsIG1wX2ludCAqYiwgbXBfaW50ICpjKTsKaW50ICBtcF9leHB0bW9kIChtcF9pbnQgKiBnLCBtcF9pbnQgKiB4LCBtcF9pbnQgKiBwLCBtcF9pbnQgKiB5KTsKCmludCAgbXBfY21wKG1wX2ludCAqYSwgbXBfaW50ICpiKTsKaW50ICBtcF9jbXBfZChtcF9pbnQgKmEsIG1wX2RpZ2l0IGIpOwoKaW50ICBtcF91bnNpZ25lZF9iaW5fc2l6ZShtcF9pbnQgKiBhKTsKaW50ICBtcF9yZWFkX3Vuc2lnbmVkX2JpbiAobXBfaW50ICogYSwgY29uc3QgdW5zaWduZWQgY2hhciAqYiwgaW50IGMpOwppbnQgIG1wX3RvX3Vuc2lnbmVkX2JpbiAobXBfaW50ICogYSwgdW5zaWduZWQgY2hhciAqYik7CgppbnQgIG1wX3N1Yl9kKGZwX2ludCAqYSwgZnBfZGlnaXQgYiwgZnBfaW50ICpjKTsKaW50ICBtcF9jb3B5KGZwX2ludCogYSwgZnBfaW50KiBiKTsKaW50ICBtcF9pc29kZChtcF9pbnQqIGEpOwppbnQgIG1wX2lzemVybyhtcF9pbnQqIGEpOwppbnQgIG1wX2NvdW50X2JpdHMobXBfaW50ICphKTsKaW50ICBtcF9sZWFkaW5nX2JpdChtcF9pbnQgKmEpOwppbnQgIG1wX3NldF9pbnQoZnBfaW50ICphLCBmcF9kaWdpdCBiKTsKdm9pZCBtcF9yc2hiKG1wX2ludCAqYSwgaW50IHgpOwoKI2lmZGVmIEhBVkVfRUNDCiAgICBpbnQgbXBfcmVhZF9yYWRpeChtcF9pbnQqIGEsIGNvbnN0IGNoYXIqIHN0ciwgaW50IHJhZGl4KTsKICAgIHZvaWQgbXBfc2V0KGZwX2ludCAqYSwgZnBfZGlnaXQgYik7CiAgICBpbnQgbXBfc3FyKGZwX2ludCAqYSwgZnBfaW50ICpiKTsKICAgIGludCBtcF9tb250Z29tZXJ5X3JlZHVjZShmcF9pbnQgKmEsIGZwX2ludCAqbSwgZnBfZGlnaXQgbXApOwogICAgaW50IG1wX21vbnRnb21lcnlfc2V0dXAoZnBfaW50ICphLCBmcF9kaWdpdCAqcmhvKTsKICAgIGludCBtcF9kaXZfMihmcF9pbnQgKiBhLCBmcF9pbnQgKiBiKTsKICAgIGludCBtcF9pbml0X2NvcHkoZnBfaW50ICogYSwgZnBfaW50ICogYik7CiNlbmRpZgoKI2lmIGRlZmluZWQoSEFWRV9FQ0MpIHx8IGRlZmluZWQoV09MRlNTTF9LRVlfR0VOKQogICAgaW50IG1wX3Nxcm1vZChtcF9pbnQqIGEsIG1wX2ludCogYiwgbXBfaW50KiBjKTsKICAgIGludCBtcF9tb250Z29tZXJ5X2NhbGNfbm9ybWFsaXphdGlvbihtcF9pbnQgKmEsIG1wX2ludCAqYik7CiNlbmRpZgoKI2lmZGVmIFdPTEZTU0xfS0VZX0dFTgppbnQgIG1wX2djZChmcF9pbnQgKmEsIGZwX2ludCAqYiwgZnBfaW50ICpjKTsKaW50ICBtcF9sY20oZnBfaW50ICphLCBmcF9pbnQgKmIsIGZwX2ludCAqYyk7CmludCAgbXBfcHJpbWVfaXNfcHJpbWUobXBfaW50KiBhLCBpbnQgdCwgaW50KiByZXN1bHQpOwojZW5kaWYgLyogV09MRlNTTF9LRVlfR0VOICovCgppbnQgIG1wX2NudF9sc2IoZnBfaW50ICphKTsKaW50ICBtcF9kaXZfMmQoZnBfaW50ICphLCBpbnQgYiwgZnBfaW50ICpjLCBmcF9pbnQgKmQpOwppbnQgIG1wX21vZF9kKGZwX2ludCogYSwgZnBfZGlnaXQgYiwgZnBfZGlnaXQqIGMpOwoKV09MRlNTTF9BUEkgd29yZDMyIENoZWNrUnVuVGltZUZhc3RNYXRoKHZvaWQpOwoKLyogSWYgdXNlciB1c2VzIFJTQSwgREgsIERTQSwgb3IgRUNDIG1hdGggbGliIGRpcmVjdGx5IHRoZW4gZmFzdCBtYXRoIEZQX1NJWkUKICAgbXVzdCBtYXRjaCwgcmV0dXJuIDEgaWYgYSBtYXRjaCBvdGhlcndpc2UgMCAqLwojZGVmaW5lIENoZWNrRmFzdE1hdGhTZXR0aW5ncygpIChGUF9TSVpFID09IENoZWNrUnVuVGltZUZhc3RNYXRoKCkpCiNpZmRlZiBfX2NwbHVzcGx1cwogICB9CiNlbmRpZgoKI2VuZGlmICAvKiBXT0xGX0NSWVBUX1RGTV9IICovCgo=