LyoKICogQ29weXJpZ2h0IDE5OTcgSm9obiBaZXJvCiAqIENvcHlyaWdodCAyMDAyIFpvbHkgTmFneQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAicmVzb3VyY2VzLmgiCgpMQU5HVUFHRSBMQU5HX0hVTkdBUklBTiwgU1VCTEFOR19ERUZBVUxUCgpTWVNNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQpCRUdJTgogTUVOVUlURU0gIiZFbPV69SBt6XJldCIsIDYxNzI4CiBNRU5VSVRFTSAiwXQmaGVseXrpcyIsIDYxNDU2CiBNRU5VSVRFTSAiJk3pcmV0IiwgNjE0NDAKIE1FTlVJVEVNICImS2lzIG3pcmV0IiwgNjE0NzIKIE1FTlVJVEVNICImVGVsamVzIG3pcmV0IiwgNjE0ODgKIE1FTlVJVEVNIFNFUEFSQVRPUgogTUVOVUlURU0gIiZCZXrhcuFzXHRBbHQtRjQiLCA2MTUzNgogTUVOVUlURU0gU0VQQVJBVE9SCiBNRU5VSVRFTSAiQSAmV2luZS1y82wuLi4iLCA2MTc2MQpFTkQKCkVESVRNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQpCRUdJTgogICAgICAgIFBPUFVQICIiCiAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgIE1FTlVJVEVNICImVmlzc3phdm9u4XMiLCBFTV9VTkRPCiAgICAgICAgICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICAgICAgICAgIE1FTlVJVEVNICImS2l24WfhcyIsIFdNX0NVVAogICAgICAgICAgICAgICAgTUVOVUlURU0gIiZN4XNvbOFzIiwgV01fQ09QWQogICAgICAgICAgICAgICAgTUVOVUlURU0gIiZCZWlsbGVzenTpcyIsIFdNX1BBU1RFCiAgICAgICAgICAgICAgICBNRU5VSVRFTSAiJlT2cmzpcyIsIFdNX0NMRUFSCiAgICAgICAgICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICAgICAgICAgIE1FTlVJVEVNICImQXog9nNzemVzIGtpamVs9mzpc2UiLCBFTV9TRVRTRUwKICAgICAgICBFTkQKRU5ECgpNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4ClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19OT0lETEVNU0cgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpCRUdJTgogICAgICAgIElDT04gIiIsIDEwODgsIDgsIDIwLCAxNiwgMTYsIFdTX0NISUxEIHwgV1NfVklTSUJMRQogICAgICAgIExURVhUICIiLCAxMDAsIDMyLCA0LCAxNzYsIDQ4LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFNTX05PUFJFRklYCiAgICAgICAgUFVTSEJVVFRPTiAiJk9LIiwgMSwgMTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICBQVVNIQlVUVE9OICImTelnc2UiLCAyLCA2NCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgIFBVU0hCVVRUT04gIiZMZeFsbO104XMiLCAzLCAxMTIsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICBQVVNIQlVUVE9OICImSXNt6XQiLCA0LCAxNjAsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICBQVVNIQlVUVE9OICImS2loYWd54XMiLCA1LCAyMDgsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICBQVVNIQlVUVE9OICImSWdlbiIsIDYsIDI1NiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgIFBVU0hCVVRUT04gIiZOZW0iLCA3LCAzMDQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICBQVVNIQlVUVE9OICImVHJ5IEFnYWluIiwgMTAsIDM1MiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgIFBVU0hCVVRUT04gIiZDb250aW51ZSIsIDExLCA0MDAsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICBQVVNIQlVUVE9OICJIZWxwIiwgOSwgNDQ4LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCkVORAoKTURJX01PUkVXSU5ET1dTIERJQUxPRyBGSVhFRCBJTVBVUkUgMjAsIDIwLCAyMzIsIDEyMgpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJBYmxhayBraXbhbGFzenThc2EiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExJU1RCT1ggICAgICAgICBNRElfSURDX0xJU1RCT1gsIDUsIDcsIDIyMiwgOTAsIFdTX1ZTQ1JPTEwgfCBXU19IU0NST0xMIC8qIGRlZmluZWQgaW4gbWRpLmggKi8KICAgIERFRlBVU0hCVVRUT04gICAiT0siLCBJRE9LLCA3NSwgMTAwLCAzNSwgMTQKICAgIFBVU0hCVVRUT04gICAgICAiTelnc2UiLCBJRENBTkNFTCwgMTIwLCAxMDAsIDM1LCAxNApFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19FUlJPUiAiSGliYSIKICAgIElEU19NRElfTU9SRVdJTkRPV1MgICImVG924WJiaSBhYmxha29rLi4uIiAvKiBkZWZpbmVkIGluIG1kaS5oICovCn0K