LyoKICogU3RhcnQgKFJ1c3NpYW4gcmVzb3VyY2VzKQogKgogKiBDb3B5cmlnaHQgMjAwMyBJZ29yIFN0ZXBpbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX1JVU1NJQU4sIFNVQkxBTkdfREVGQVVMVAojcHJhZ21hIGNvZGVfcGFnZSg4NjYpCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX1JVU1NJQU4sIFNVQkxBTkdfREVGQVVMVAp7ClNUUklOR19VU0FHRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFydCBhIHByb2dyYW0sIG9yIG9wZW4gYSBkb2N1bWVudCBpbiB0aGUgcHJvZ3JhbSBub3JtYWxseSB1c2VkIGZvciBmaWxlcyB3aXRoIHRoYXQgc3VmZml4LiBcblwKVXNhZ2U6IFxuXApzdGFydCBbb3B0aW9uc10gcHJvZ3JhbV9maWxlbmFtZSBbLi4uXSBcblwKc3RhcnQgW29wdGlvbnNdIGRvY3VtZW50X2ZpbGVuYW1lIFxuXAogXG5cCk9wdGlvbnM6IFxuXAovTVtpbmltaXplZF0gU3RhcnQgdGhlIHByb2dyYW0gbWluaW1pemVkLiBcblwKL01BWFtpbWl6ZWRdIFN0YXJ0IHRoZSBwcm9ncmFtIG1heGltaXplZC4gXG5cCi9SW2VzdG9yZWRdICBTdGFydCB0aGUgcHJvZ3JhbSBub3JtYWxseSAobmVpdGhlciBtaW5pbWl6ZWQgbm9yIG1heGltaXplZCkuIFxuXAovV1thaXRdICAgICAgV2FpdCBmb3Igc3RhcnRlZCBwcm9ncmFtIHRvIGZpbmlzaCwgdGhlbiBleGl0IHdpdGggaXRzIGV4aXQgY29kZS4gXG5cCi9MICAgICAgICAgICBTaG93IGVuZC11c2VyIGxpY2Vuc2UuIFxuXAogXG5cCnN0YXJ0LmV4ZSB2ZXJzaW9uIDAuMiBDb3B5cmlnaHQgKEMpIDIwMDMsIERhbiBLZWdlbCBcblwKU3RhcnQgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyBydW4gd2l0aCAvTCBvcHRpb24uIFxuXApUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0IFxuXAp1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHJ1biAnc3RhcnQgL0wnIGZvciBkZXRhaWxzLiBcblwKIgoKU1RSSU5HX0xJQ0VOU0UsICJzdGFydC5leGUg4uXw8ej/IDAuMiBDb3B5cmlnaHQgKEMpIDIwMDMsIERhbiBLZWdlbCBcblwK3fLuIO/w7uPw4Ozs4CDw4PHv8O7x8vDg7f/l8vH/IO/uIOvo9uXt5+joIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCugg/+Lr/+Xy8f8g4eXx7+vg8u377CDv8O7j8ODs7O377CDv8O7k8+ry7uwuIFxuXApUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIFxuXAptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIFxuXAphcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIFxuXApvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gXG5cCiBcblwKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIFxuXApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBcblwKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBcblwKR05VIExlc3NlciBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiBcblwKIFxuXApZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIFxuXAphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBcblwKRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuIFxuXAogXG5cClNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4gXG5cCiIKClNUUklOR19FWEVDRkFJTCAiQXBwbGljYXRpb24gY291bGQgbm90IGJlIHN0YXJ0ZWQsIG9yIG5vIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGZpbGUuXG5TaGVsbEV4ZWN1dGVFeCBmYWlsZWQiCn0K