LyoKICogQ29weXJpZ2h0IDIwMDggSmVucyBBbGJyZXRzZW4gPGplbnNAYWxicmV0c2VuLmRrPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAicHNkbGcuaCIKCkxBTkdVQUdFIExBTkdfREFOSVNILCBTVUJMQU5HX0RFRkFVTFQKClBBUEVSIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDUsIDQzLCAyMjcsIDIxNQpTVFlMRSAgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfQ0xJUFNJQkxJTkdTIHwgV1NfVklTSUJMRQpDQVBUSU9OICJQYXBpciIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiBMVEVYVCAiJlBhcGlyc3T4cnJlbHNlOiIsIC0xLCAxMCwgNiwgMTAwLCA4CiBMSVNUQk9YIElERF9QQVBFUlMsIDEwLCAxNSwgMjAwLCA0NSwgTEJTX1NUQU5EQVJEIHwgTEJTX0hBU1NUUklOR1MgfAoJIFdTX1RBQlNUT1AKIEdST1VQQk9YICJSZXRuaW5nIiwgLTEsIDEwLCA4MCwgMjAwLCA1MAogQ09OVFJPTCAiJlBvcnRy5nQiLCBJRERfT1JJRU5UX1BPUlRSQUlULCAiQnV0dG9uIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwKCVdTX1RBQlNUT1AsIDIwLCA5MCwgNjAsIDEwCiBDT05UUk9MICImTGFuZHNrYWIiLCBJRERfT1JJRU5UX0xBTkRTQ0FQRSwgIkJ1dHRvbiIsIEJTX0FVVE9SQURJT0JVVFRPTiwKCSAyMCwgMTEwLCA2MCwgMTAKIExURVhUICJSZXRuaW5nZXI6IiwgSUREX0RVUExFWF9OQU1FLCAxMCwgMTQwLCAxMDAsIDgKIENPTUJPQk9YIElERF9EVVBMRVgsIDEwLCAxNTEsIDIwMCwgMjAsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfSEFTU1RSSU5HUyB8CiAgICAgICAgV1NfVEFCU1RPUAp9Cg==