LyoKICogV3JpdHRlbiBieSBKb3PpIEZvbnNlY2EgPGpfcl9mb25zZWNhQHlhaG9vLmNvLnVrPgogKi8KCgovKgogKiB2b2lkIF9tZXNhX21teF9ibGVuZCggR0xjb250ZXh0ICpjdHgsCiAqICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbiwgCiAqICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHVieXRlIG1hc2tbXSwKICogICAgICAgICAgICAgICAgICAgICAgIEdMY2hhbiByZ2JhW11bNF0sIAogKiAgICAgICAgICAgICAgICAgICAgICAgQ09OU1QgR0xjaGFuIGRlc3RbXVs0XSApCiAqIAogKi8KQUxJR05URVhUMTYKR0xPQkwgR0xOQU1FKCBUQUcoX21lc2FfbW14X2JsZW5kKSApCkhJRERFTiggVEFHKF9tZXNhX21teF9ibGVuZCkgKQpHTE5BTUUoIFRBRyhfbWVzYV9tbXhfYmxlbmQpICk6CgogICAgUFVTSF9MICAgICAoIEVCUCApCiAgICBNT1ZfTCAgICAgICggRVNQLCBFQlAgKQogICAgUFVTSF9MICAgICAoIEVTSSApCiAgICBQVVNIX0wgICAgICggRURJICkKICAgIFBVU0hfTCAgICAgKCBFQlggKQoKICAgIE1PVl9MICAgICAgKCBSRUdPRkYoMTIsIEVCUCksIEVDWCApCQkvKiBuICovCiAgICBDTVBfTCAgICAgICggQ09OU1QoMCksIEVDWCkKICAgIEpFICAgICAgICAgKCBMTFRBRyhHTUJfcmV0dXJuKSApCgogICAgTU9WX0wgICAgICAoIFJFR09GRigxNiwgRUJQKSwgRUJYICkJCS8qIG1hc2sgKi8KICAgIE1PVl9MICAgICAgKCBSRUdPRkYoMjAsIEVCUCksIEVESSApICAgICAgICAgLyogcmdiYSAqLwogICAgTU9WX0wgICAgICAoIFJFR09GRigyNCwgRUJQKSwgRVNJICkgICAgICAgICAvKiBkZXN0ICovCgogICAgSU5JVAogICAgCiAgICBURVNUX0wgICAgICggQ09OU1QoNCksIEVESSApCQkvKiBhbGlnbiByZ2JhIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAqLwogICAgSlogICAgICAgICAoIExMVEFHKEdNQl9hbGlnbl9lbmQpICkKCiAgICBDTVBfQiAgICAgICggQ09OU1QoMCksIFJFR0lORChFQlgpICkJLyogKm1hc2sgPT0gMCAqLwogICAgSkUgICAgICAgICAoIExMVEFHKEdNQl9hbGlnbl9jb250aW51ZSkgKQoKICAgIC8qIHJ1bmluICovCiNkZWZpbmUgT05FKHgpCXgKI2RlZmluZSBUV08oeCkgIAogICAgTUFJTiAgICAgICAoIEVESSwgRVNJICkKI3VuZGVmIE9ORQojdW5kZWYgVFdPCgpMTFRBRyhHTUJfYWxpZ25fY29udGludWUpOgoKICAgIERFQ19MICAgICAgKCBFQ1ggKQkJCQkvKiBuIC09IDEgKi8KICAgIElOQ19MICAgICAgKCBFQlggKQkJICAgICAgICAgICAgICAgIC8qIG1hc2sgKz0gMSAqLwogICAgQUREX0wgICAgICAoIENPTlNUKDQpLCBFREkgKQkJLyogcmdiYSArPSAxICovCiAgICBBRERfTCAgICAgICggQ09OU1QoNCksIEVTSSApCQkvKiBkZXN0ICs9IDEgKi8gCgpMTFRBRyhHTUJfYWxpZ25fZW5kKToKCiAgICBDTVBfTCAgICAgICggQ09OU1QoMiksIEVDWCkKICAgIEpCICAgICAgICAgKCBMTFRBRyhHTUJfbG9vcF9lbmQpICkKCkFMSUdOVEVYVDE2CkxMVEFHKEdNQl9sb29wX2JlZ2luKToKCiAgICBDTVBfVyAgICAgICggQ09OU1QoMCksIFJFR0lORChFQlgpICkJLyogKm1hc2sgPT0gMCAmJiAqKG1hc2sgKyAxKSA9PSAwICovCiAgICBKRSAgICAgICAgICggTExUQUcoR01CX2xvb3BfY29udGludWUpICkKCiAgICAvKiBtYWluIGxvb3AgKi8KI2RlZmluZSBPTkUoeCkKI2RlZmluZSBUV08oeCkJeAogICAgTUFJTiAgICAgICAoIEVESSwgRVNJICkKI3VuZGVmIE9ORQojdW5kZWYgVFdPCgpMTFRBRyhHTUJfbG9vcF9jb250aW51ZSk6CgogICAgREVDX0wgICAgICAoIEVDWCApCiAgICBERUNfTCAgICAgICggRUNYICkJCQkJLyogbiAtPSAyICovCiAgICBBRERfTCAgICAgICggQ09OU1QoMiksIEVCWCApCQkvKiBtYXNrICs9IDIgKi8KICAgIEFERF9MICAgICAgKCBDT05TVCg4KSwgRURJICkJCS8qIHJnYmEgKz0gMiAqLwogICAgQUREX0wgICAgICAoIENPTlNUKDgpLCBFU0kgKQkJLyogZGVzdCArPSAyICovIAogICAgQ01QX0wgICAgICAoIENPTlNUKDIpLCBFQ1ggKQogICAgSkFFICAgICAgICAoIExMVEFHKEdNQl9sb29wX2JlZ2luKSApCgpMTFRBRyhHTUJfbG9vcF9lbmQpOgoKICAgIENNUF9MICAgICAgKCBDT05TVCgxKSwgRUNYICkKICAgIEpCICAgICAgICAgKCBMTFRBRyhHTUJfZG9uZSkgKQoKICAgIENNUF9CICAgICAgKCBDT05TVCgwKSwgUkVHSU5EKEVCWCkgKQkvKiAqbWFzayA9PSAwICovCiAgICBKRSAgICAgICAgICggTExUQUcoR01CX2RvbmUpICkKCiAgICAvKiBydW5vdXQgKi8KI2RlZmluZSBPTkUoeCkJeAojZGVmaW5lIFRXTyh4KQogICAgTUFJTiAgICAgICAoIEVESSwgRVNJICkKI3VuZGVmIE9ORQojdW5kZWYgVFdPCgpMTFRBRyhHTUJfZG9uZSk6CgogICAgRU1NUwoKTExUQUcoR01CX3JldHVybik6CgogICAgUE9QX0wgICAgICAoIEVCWCApCiAgICBQT1BfTCAgICAgICggRURJICkKICAgIFBPUF9MICAgICAgKCBFU0kgKQogICAgTU9WX0wgICAgICAoIEVCUCwgRVNQICkKICAgIFBPUF9MICAgICAgKCBFQlAgKQogICAgUkVUCgojdW5kZWYgVEFHCiN1bmRlZiBMTFRBRwojdW5kZWYgSU5JVAojdW5kZWYgTUFJTgo=