LyoKICogQ29weXJpZ2h0IKkgMjAwOCBDaHJpcyBXaWxzb24KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQogKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQKICogZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCiAqIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCiAqIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mCiAqIHRoZSBhdXRob3Igbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KICogZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yCiAqIHBlcm1pc3Npb24uIFRoZSBhdXRob3IgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQogKiBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcwogKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKICogU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKICogRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUi4gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwKICogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIKICogUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUgogKiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKgogKiBBdXRob3I6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgogKi8KCiNpbmNsdWRlICJjYWlyby10ZXN0LmgiCgpzdGF0aWMgdm9pZApkcmF3X3N5bWJvbCAoY2Fpcm9fdCAqY3IpCnsKICAgIGRvdWJsZSBkYXNoW10gPSB7NiwgM307CgogICAgY2Fpcm9fcmVjdGFuZ2xlIChjciwgLTI1LCAtMjUsIDUwLCA1MCk7CiAgICBjYWlyb19zdHJva2UgKGNyKTsKCiAgICBjYWlyb19tb3ZlX3RvIChjciwgMCwgLTI1KTsKICAgIGNhaXJvX2N1cnZlX3RvIChjciwgMTIuNSwgLTEyLjUsIDEyLjUsIC0xMi41LCAwLCAwKTsKICAgIGNhaXJvX2N1cnZlX3RvIChjciwgLTEyLjUsIDEyLjUsIC0xMi41LCAxMi41LCAwLCAyNSk7CiAgICBjYWlyb19jdXJ2ZV90byAoY3IsIDEyLjUsIDEyLjUsIDEyLjUsIDEyLjUsIDAsIDApOwogICAgY2Fpcm9fc3Ryb2tlIChjcik7CgogICAgY2Fpcm9fc2F2ZSAoY3IpOwogICAgY2Fpcm9fc2V0X2Rhc2ggKGNyLCBkYXNoLCBzaXplb2YgKGRhc2gpIC8gc2l6ZW9mIChkYXNoWzBdKSwgMC4pOwogICAgY2Fpcm9fbW92ZV90byAoY3IsIDAsIDApOwogICAgY2Fpcm9fYXJjIChjciwgMCwgMCwgMTIuNSwgMCwgMyAqIE1fUEkgLyAyKTsKICAgIGNhaXJvX2Nsb3NlX3BhdGggKGNyKTsKICAgIGNhaXJvX3N0cm9rZSAoY3IpOwogICAgY2Fpcm9fcmVzdG9yZSAoY3IpOwp9CgpzdGF0aWMgY2Fpcm9fdGVzdF9zdGF0dXNfdApkcmF3IChjYWlyb190ICpjciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQp7CiAgICBjYWlyb19zZXRfc291cmNlX3JnYiAoY3IsIDEsIDEsIDEpOwogICAgY2Fpcm9fcGFpbnQgKGNyKTsKCiAgICBjYWlyb19zZXRfc291cmNlX3JnYiAoY3IsIDAsIDAsIDApOwoKICAgIGNhaXJvX3NhdmUgKGNyKTsKICAgIGNhaXJvX3RyYW5zbGF0ZSAoY3IsIDUwLCA1MCk7CiAgICBjYWlyb19zY2FsZSAoY3IsIDEsIDEpOwogICAgZHJhd19zeW1ib2wgKGNyKTsKICAgIGNhaXJvX3Jlc3RvcmUgKGNyKTsKCiAgICBjYWlyb19zYXZlIChjcik7CiAgICBjYWlyb190cmFuc2xhdGUgKGNyLCAxNTAsIDUwKTsKICAgIGNhaXJvX3NjYWxlIChjciwgLTEsIDEpOwogICAgZHJhd19zeW1ib2wgKGNyKTsKICAgIGNhaXJvX3Jlc3RvcmUgKGNyKTsKCiAgICBjYWlyb19zYXZlIChjcik7CiAgICBjYWlyb190cmFuc2xhdGUgKGNyLCAxNTAsIDE1MCk7CiAgICBjYWlyb19zY2FsZSAoY3IsIC0xLCAtMSk7CiAgICBkcmF3X3N5bWJvbCAoY3IpOwogICAgY2Fpcm9fcmVzdG9yZSAoY3IpOwoKICAgIGNhaXJvX3NhdmUgKGNyKTsKICAgIGNhaXJvX3RyYW5zbGF0ZSAoY3IsIDUwLCAxNTApOwogICAgY2Fpcm9fc2NhbGUgKGNyLCAxLCAtMSk7CiAgICBkcmF3X3N5bWJvbCAoY3IpOwogICAgY2Fpcm9fcmVzdG9yZSAoY3IpOwoKICAgIHJldHVybiBDQUlST19URVNUX1NVQ0NFU1M7Cn0KCkNBSVJPX1RFU1QgKHJlZmxlY3RlZF9zdHJva2UsCgkgICAgIkV4ZXJjaXNlcyB0aGUgc3Ryb2tlciB3aXRoIGEgcmVmbGVjdGVkIGN0bSIsCgkgICAgInN0cm9rZSwgdHJhbnNmb3JtIiwgLyoga2V5d29yZHMgKi8KCSAgICBOVUxMLCAvKiByZXF1aXJlbWVudHMgKi8KCSAgICAyMDAsIDIwMCwKCSAgICBOVUxMLCBkcmF3KQo=