LyoKICogQ29weXJpZ2h0IChDKSAyMDAyIEFsZXhhbmRyZSBKdWxsaWFyZAogKiBDb3B5cmlnaHQgKEMpIDIwMDQgVmluY2VudCBC6XJvbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpjcHBfcXVvdGUoIiNpZm5kZWYgQ09NX05PX1dJTkRPV1NfSCIpCmNwcF9xdW90ZSgiI2luY2x1ZGUgPHdpbmRvd3MuaD4iKQpjcHBfcXVvdGUoIiNpbmNsdWRlIDxvbGUyLmg+IikKY3BwX3F1b3RlKCIjZW5kaWYiKQoKaW1wb3J0ICJ1bmtud24uaWRsIjsKaW1wb3J0ICJvYmppZGwuaWRsIjsKCmludGVyZmFjZSBJRE1PUXVhbGl0eUNvbnRyb2w7CmludGVyZmFjZSBJRE1PVmlkZW9PdXRwdXRPcHRpbWl6YXRpb25zOwppbnRlcmZhY2UgSU1lZGlhQnVmZmVyOwppbnRlcmZhY2UgSU1lZGlhT2JqZWN0OwppbnRlcmZhY2UgSU1lZGlhT2JqZWN0SW5QbGFjZTsKCnR5cGVkZWYgc3RydWN0IF9ETU9NZWRpYVR5cGUKewogICAgR1VJRCBtYWpvcnR5cGU7CiAgICBHVUlEIHN1YnR5cGU7CiAgICBCT09MIGJGaXhlZFNpemVTYW1wbGVzOwogICAgQk9PTCBiVGVtcG9yYWxDb21wcmVzc2lvbjsKICAgIFVMT05HIGxTYW1wbGVTaXplOwogICAgR1VJRCBmb3JtYXR0eXBlOwogICAgSVVua25vd24gKnBVbms7CiAgICBVTE9ORyBjYkZvcm1hdDsKICAgIEJZVEUgKnBiRm9ybWF0Owp9IERNT19NRURJQV9UWVBFOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElFbnVtRE1PIGludGVyZmFjZQogKi8KWwogICAgb2JqZWN0LAogICAgdXVpZCgyQzNDRDk4QS0yQkZBLTRBNTMtOUMyNy01MjQ5QkE2NEJBMEYpLAogICAgcG9pbnRlcl9kZWZhdWx0KHVuaXF1ZSkKXQppbnRlcmZhY2UgSUVudW1ETU8gOiBJVW5rbm93bgp7CiAgICBbbG9jYWxdCiAgICBIUkVTVUxUIE5leHQoCiAgICAgICAgW2luXSBEV09SRCBjSXRlbXNUb0ZldGNoLAogICAgICAgIFtvdXRdIENMU0lEICpwQ0xTSUQsCiAgICAgICAgW291dF0gV0NIQVIgKipOYW1lcywKICAgICAgICBbb3V0XSBEV09SRCAqcGNJdGVtc0ZldGNoZWQKICAgICk7CgogICAgSFJFU1VMVCBTa2lwKAogICAgICAgIFtpbl0gRFdPUkQgY0l0ZW1zVG9Ta2lwCiAgICApOwoKICAgIEhSRVNVTFQgUmVzZXQoKTsKCiAgICBIUkVTVUxUIENsb25lKAogICAgICAgIFtvdXRdIElFbnVtRE1PICoqcHBFbnVtCiAgICApOwp9Cg==