LyoKICogQ29weXJpZ2h0IDIwMDggVml0YWxpeSBNYXJnb2xlbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAibXN2aWRlb19wcml2YXRlLmgiCgpMQU5HVUFHRSBMQU5HX1JVU1NJQU4sIFNVQkxBTkdfREVGQVVMVAoKSUNNX0NIT09TRV9DT01QUkVTU09SIERJQUxPRyBESVNDQVJEQUJMRSAgMzYsIDI0LCAxODcsIDk1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICLR5uDy6OUg4ujk5e4iCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogICAgREVGUFVTSEJVVFRPTiAiT0siLElET0ssMTI5LDIsNDksMTQKICAgIFBVU0hCVVRUT04gIs7y7OXt4CIsSURDQU5DRUwsMTI5LDE4LDQ5LDE0CgogICAgTFRFWFQgIibA6+Pu8Ojy7CDx5uDy6P86IiwtMSw5LDYsMTA1LDgKICAgIENPTUJPQk9YIDg4MCw5LDE2LDExMSw2NyxDQlNfRFJPUERPV05MSVNUfFdTX1ZTQ1JPTEx8V1NfVEFCU1RPUAoKICAgIFBVU0hCVVRUT04gIibN4PHy8O7p6uguLi4iLDg4MiwxMjksMzYsNDksMTQKICAgIFBVU0hCVVRUT04gIibI7fTu8Ozg9uj/Li4uIiw4ODMsMTI5LDUyLDQ5LDE0CgogICAgU0NST0xMQkFSIDg4NCw5LDQ0LDExMSw5LFdTX1RBQlNUT1AKCiAgICBMVEVYVCAiJsrg9+Xx8uLuIPHm4PLo/zoiLDg4Niw5LDM0LDgwLDgKCiAgICBDT05UUk9MICLK6yb+9+Xi7ukg6uDk8CDq4Obk++UiLDg4NywiQnV0dG9uIixCU19BVVRPQ0hFQ0tCT1h8V1NfVEFCU1RPUCw5LDYwLDY2LDEyCiAgICBFRElUVEVYVCA4ODgsNzgsNjAsMjIsMTIKICAgIExURVhUICLq4OTw7uIiLDg4OSwxMDMsNjIsMjYsMTAKCiAgICBDT05UUk9MICImz+7y7uog5ODt7fv1Iiw4OTQsIkJ1dHRvbiIsQlNfQVVUT0NIRUNLQk9YfFdTX1RBQlNUT1AsOSw3Niw2NiwxMgogICAgRURJVFRFWFQgODk1LDc4LDc2LDIyLDEyCiAgICBMVEVYVCAiysEv8eXqIiw4OTYsMTAyLDc4LDI2LDEwCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19GVUxMRlJBTUVTICLK4OTw+yD25evo6u7sICjB5ecg6u7s7/Dl8fHo6CkiCn0K