LyogY29tcGxleC9nc2xfY29tcGxleF9tYXRoLmgKICogCiAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwNCBKb3JtYSBPbGF2aSBU5Gh0aW5lbiwgQnJpYW4gR291Z2gKICogCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAogKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqIAogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKiAKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCiAqLwoKI2lmbmRlZiBfX0dTTF9DT01QTEVYX01BVEhfSF9fCiNkZWZpbmUgX19HU0xfQ09NUExFWF9NQVRIX0hfXwojaW5jbHVkZSA8Z3NsL2dzbF9jb21wbGV4Lmg+CgojdW5kZWYgX19CRUdJTl9ERUNMUwojdW5kZWYgX19FTkRfREVDTFMKI2lmZGVmIF9fY3BsdXNwbHVzCiNkZWZpbmUgX19CRUdJTl9ERUNMUyBleHRlcm4gIkMiIHsKI2RlZmluZSBfX0VORF9ERUNMUyB9CiNlbHNlCiNkZWZpbmUgX19CRUdJTl9ERUNMUyAgICAgICAgICAgLyogZW1wdHkgKi8KI2RlZmluZSBfX0VORF9ERUNMUyAgICAgICAgICAgICAvKiBlbXB0eSAqLwojZW5kaWYKCl9fQkVHSU5fREVDTFMKCi8qIENvbXBsZXggbnVtYmVycyAqLwoKZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfcmVjdCAoZG91YmxlIHgsIGRvdWJsZSB5KTsgIC8qIHI9IHJlYWwraSppbWFnICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X3BvbGFyIChkb3VibGUgciwgZG91YmxlIHRoZXRhKTsgLyogcj0gciBlXihpIHRoZXRhKSAqLwoKI2lmZGVmIEhBVkVfSU5MSU5FCmV4dGVybiBpbmxpbmUgZ3NsX2NvbXBsZXgKZ3NsX2NvbXBsZXhfcmVjdCAoZG91YmxlIHgsIGRvdWJsZSB5KQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB6ID0geCArIGkgeSAqLwogIGdzbF9jb21wbGV4IHo7CiAgR1NMX1NFVF9DT01QTEVYICgmeiwgeCwgeSk7CiAgcmV0dXJuIHo7Cn0KI2VuZGlmCgojZGVmaW5lIEdTTF9DT01QTEVYX09ORSAoZ3NsX2NvbXBsZXhfcmVjdCgxLjAsMC4wKSkKI2RlZmluZSBHU0xfQ09NUExFWF9aRVJPIChnc2xfY29tcGxleF9yZWN0KDAuMCwwLjApKQojZGVmaW5lIEdTTF9DT01QTEVYX05FR09ORSAoZ3NsX2NvbXBsZXhfcmVjdCgtMS4wLDAuMCkpCgovKiBQcm9wZXJ0aWVzIG9mIGNvbXBsZXggbnVtYmVycyAqLwoKZG91YmxlIGdzbF9jb21wbGV4X2FyZyAoZ3NsX2NvbXBsZXggeik7IC8qIHJldHVybiBhcmcoeiksIC1waTwgYXJnKHopIDw9K3BpICovCmRvdWJsZSBnc2xfY29tcGxleF9hYnMgKGdzbF9jb21wbGV4IHopOyAgIC8qIHJldHVybiB8enwgICAqLwpkb3VibGUgZ3NsX2NvbXBsZXhfYWJzMiAoZ3NsX2NvbXBsZXggeik7ICAvKiByZXR1cm4gfHp8XjIgKi8KZG91YmxlIGdzbF9jb21wbGV4X2xvZ2FicyAoZ3NsX2NvbXBsZXggeik7IC8qIHJldHVybiBsb2d8enwgKi8KCi8qIENvbXBsZXggYXJpdGhtZXRpYyBvcGVyYXRvcnMgKi8KCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2FkZCAoZ3NsX2NvbXBsZXggYSwgZ3NsX2NvbXBsZXggYik7ICAvKiByPWErYiAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9zdWIgKGdzbF9jb21wbGV4IGEsIGdzbF9jb21wbGV4IGIpOyAgLyogcj1hLWIgKi8KZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfbXVsIChnc2xfY29tcGxleCBhLCBnc2xfY29tcGxleCBiKTsgIC8qIHI9YSpiICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2RpdiAoZ3NsX2NvbXBsZXggYSwgZ3NsX2NvbXBsZXggYik7ICAvKiByPWEvYiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApnc2xfY29tcGxleCBnc2xfY29tcGxleF9hZGRfcmVhbCAoZ3NsX2NvbXBsZXggYSwgZG91YmxlIHgpOyAgLyogcj1hK3ggKi8KZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfc3ViX3JlYWwgKGdzbF9jb21wbGV4IGEsIGRvdWJsZSB4KTsgIC8qIHI9YS14ICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X211bF9yZWFsIChnc2xfY29tcGxleCBhLCBkb3VibGUgeCk7ICAvKiByPWEqeCAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9kaXZfcmVhbCAoZ3NsX2NvbXBsZXggYSwgZG91YmxlIHgpOyAgLyogcj1hL3ggKi8KCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2FkZF9pbWFnIChnc2xfY29tcGxleCBhLCBkb3VibGUgeSk7ICAvKiByPWEraXkgKi8KZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfc3ViX2ltYWcgKGdzbF9jb21wbGV4IGEsIGRvdWJsZSB5KTsgIC8qIHI9YS1peSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9tdWxfaW1hZyAoZ3NsX2NvbXBsZXggYSwgZG91YmxlIHkpOyAgLyogcj1hKml5ICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2Rpdl9pbWFnIChnc2xfY29tcGxleCBhLCBkb3VibGUgeSk7ICAvKiByPWEvaXkgKi8KCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2Nvbmp1Z2F0ZSAoZ3NsX2NvbXBsZXggeik7ICAvKiByPWNvbmooeikgKi8KZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfaW52ZXJzZSAoZ3NsX2NvbXBsZXggYSk7ICAgIC8qIHI9MS9hICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X25lZ2F0aXZlIChnc2xfY29tcGxleCBhKTsgICAgLyogcj0tYSAqLwoKLyogRWxlbWVudGFyeSBDb21wbGV4IEZ1bmN0aW9ucyAqLwoKZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfc3FydCAoZ3NsX2NvbXBsZXggeik7ICAvKiByPXNxcnQoeikgKi8KZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfc3FydF9yZWFsIChkb3VibGUgeCk7ICAvKiByPXNxcnQoeCkgKHg8MCBvaykgKi8KCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X3BvdyAoZ3NsX2NvbXBsZXggYSwgZ3NsX2NvbXBsZXggYik7ICAvKiByPWFeYiAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9wb3dfcmVhbCAoZ3NsX2NvbXBsZXggYSwgZG91YmxlIGIpOyAgLyogcj1hXmIgKi8KCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2V4cCAoZ3NsX2NvbXBsZXggYSk7ICAgIC8qIHI9ZXhwKGEpICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2xvZyAoZ3NsX2NvbXBsZXggYSk7ICAgIC8qIHI9bG9nKGEpIChiYXNlIGUpICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2xvZzEwIChnc2xfY29tcGxleCBhKTsgIC8qIHI9bG9nMTAoYSkgKGJhc2UgMTApICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2xvZ19iIChnc2xfY29tcGxleCBhLCBnc2xfY29tcGxleCBiKTsgICAvKiByPWxvZ19iKGEpIChiYXNlPWIpICovCgovKiBDb21wbGV4IFRyaWdvbm9tZXRyaWMgRnVuY3Rpb25zICovCgpnc2xfY29tcGxleCBnc2xfY29tcGxleF9zaW4gKGdzbF9jb21wbGV4IGEpOyAgLyogcj1zaW4oYSkgKi8KZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfY29zIChnc2xfY29tcGxleCBhKTsgIC8qIHI9Y29zKGEpICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X3NlYyAoZ3NsX2NvbXBsZXggYSk7ICAvKiByPXNlYyhhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9jc2MgKGdzbF9jb21wbGV4IGEpOyAgLyogcj1jc2MoYSkgKi8KZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfdGFuIChnc2xfY29tcGxleCBhKTsgIC8qIHI9dGFuKGEpICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2NvdCAoZ3NsX2NvbXBsZXggYSk7ICAvKiByPWNvdChhKSAqLwoKLyogSW52ZXJzZSBDb21wbGV4IFRyaWdvbm9tZXRyaWMgRnVuY3Rpb25zICovCgpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmNzaW4gKGdzbF9jb21wbGV4IGEpOyAgLyogcj1hcmNzaW4oYSkgKi8KZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfYXJjc2luX3JlYWwgKGRvdWJsZSBhKTsgIC8qIHI9YXJjc2luKGEpICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2FyY2NvcyAoZ3NsX2NvbXBsZXggYSk7ICAvKiByPWFyY2NvcyhhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmNjb3NfcmVhbCAoZG91YmxlIGEpOyAgLyogcj1hcmNjb3MoYSkgKi8KZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfYXJjc2VjIChnc2xfY29tcGxleCBhKTsgIC8qIHI9YXJjc2VjKGEpICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2FyY3NlY19yZWFsIChkb3VibGUgYSk7ICAvKiByPWFyY3NlYyhhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmNjc2MgKGdzbF9jb21wbGV4IGEpOyAgLyogcj1hcmNjc2MoYSkgKi8KZ3NsX2NvbXBsZXggZ3NsX2NvbXBsZXhfYXJjY3NjX3JlYWwgKGRvdWJsZSBhKTsgIC8qIHI9YXJjY3NjKGEpICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2FyY3RhbiAoZ3NsX2NvbXBsZXggYSk7ICAvKiByPWFyY3RhbihhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmNjb3QgKGdzbF9jb21wbGV4IGEpOyAgLyogcj1hcmNjb3QoYSkgKi8KCi8qIENvbXBsZXggSHlwZXJib2xpYyBGdW5jdGlvbnMgKi8KCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X3NpbmggKGdzbF9jb21wbGV4IGEpOyAgLyogcj1zaW5oKGEpICovCmdzbF9jb21wbGV4IGdzbF9jb21wbGV4X2Nvc2ggKGdzbF9jb21wbGV4IGEpOyAgLyogcj1jb3NoaChhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9zZWNoIChnc2xfY29tcGxleCBhKTsgIC8qIHI9c2VjaChhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9jc2NoIChnc2xfY29tcGxleCBhKTsgIC8qIHI9Y3NjaChhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF90YW5oIChnc2xfY29tcGxleCBhKTsgIC8qIHI9dGFuaChhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9jb3RoIChnc2xfY29tcGxleCBhKTsgIC8qIHI9Y290aChhKSAqLwoKLyogSW52ZXJzZSBDb21wbGV4IEh5cGVyYm9saWMgRnVuY3Rpb25zICovCgpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmNzaW5oIChnc2xfY29tcGxleCBhKTsgIC8qIHI9YXJjc2luaChhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmNjb3NoIChnc2xfY29tcGxleCBhKTsgIC8qIHI9YXJjY29zaChhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmNjb3NoX3JlYWwgKGRvdWJsZSBhKTsgIC8qIHI9YXJjY29zaChhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmNzZWNoIChnc2xfY29tcGxleCBhKTsgIC8qIHI9YXJjc2VjaChhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmNjc2NoIChnc2xfY29tcGxleCBhKTsgIC8qIHI9YXJjY3NjaChhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmN0YW5oIChnc2xfY29tcGxleCBhKTsgIC8qIHI9YXJjdGFuaChhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmN0YW5oX3JlYWwgKGRvdWJsZSBhKTsgIC8qIHI9YXJjdGFuaChhKSAqLwpnc2xfY29tcGxleCBnc2xfY29tcGxleF9hcmNjb3RoIChnc2xfY29tcGxleCBhKTsgIC8qIHI9YXJjY290aChhKSAqLwoKX19FTkRfREVDTFMKCiNlbmRpZiAvKiBfX0dTTF9DT01QTEVYX01BVEhfSF9fICovCg==