LyoKICAgICRJZDogYnR0di1jYXJkcy5jLHYgMS40NyAyMDA1LzAyLzIyIDE0OjA2OjMyIGtyYXhlbCBFeHAgJAoKICAgIGJ0dHYtY2FyZHMuYwoKICAgIHRoaXMgZmlsZSBoYXMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbnMgLSBjYXJkLXNwZWNpZmljIHN0dWZmCiAgICBsaWtlIHRoZSBiaWcgdHZjYXJkcyBhcnJheSBmb3IgdGhlIG1vc3QgcGFydAoKICAgIENvcHlyaWdodCAoQykgMTk5Niw5Nyw5OCBSYWxwaCAgTWV0emxlciAocmprbUB0aHAudW5pLWtvZWxuLmRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIChtb2NtQHRocC51bmkta29lbG4uZGUpCiAgICAoYykgMTk5OS0yMDAxIEdlcmQgS25vcnIgPGtyYXhlbEBnb2xkYmFjaC5pbi1iZXJsaW4uZGU+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCgoqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgojaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KCiNpbmNsdWRlIDxhc20vaW8uaD4KCiNpbmNsdWRlICJidHR2cC5oIgojaWYgMCAvKiBub3Qgd29ya2luZyB5ZXQgKi8KI2luY2x1ZGUgImJ0ODMyLmgiCiNlbmRpZgoKLyogZndkIGRlY2wgKi8Kc3RhdGljIHZvaWQgYm9vdF9tc3AzNHh4KHN0cnVjdCBidHR2ICpidHYsIGludCBwaW4pOwpzdGF0aWMgdm9pZCBib290X2J0ODMyKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBoYXVwcGF1Z2VfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBhdmVybWVkaWFfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBvc3ByZXlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBtb2R0ZWNfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBpbml0X1BYQzIwMChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIHdpbnZpZXdfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgbHQ5NDE1X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGF2ZXJtZWRpYV90dnBob25lX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwKCQkJCSAgICBpbnQgc2V0KTsKc3RhdGljIHZvaWQgYXZlcm1lZGlhX3R2X3N0ZXJlb19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsCgkJCQkgICAgICBpbnQgc2V0KTsKc3RhdGljIHZvaWQgdGVycmF0dl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBndmJjdHYzcGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGd2YmN0djVwY2lfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgd2luZmFzdDIwMDBfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgcHZidDg3OHA5Yl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBmdjIwMDBzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHdpbmR2cl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBhZHR2azUwM19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBydjYwNV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgZWFnbGVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHhndWFyZF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgaXZjMTIwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBndmMxMTAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwoKc3RhdGljIHZvaWQgUFhDMjAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwoKc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgdGliZXRDUzE2X2luaXQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl9pbml0KHN0cnVjdCBidHR2ICpidHYpOwoKc3RhdGljIHZvaWQgc2lnbWFTTENfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHNpZ21hU1FfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CgpzdGF0aWMgaW50IHRlcnJhdGVjX2FjdGl2ZV9yYWRpb191cGdyYWRlKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgaW50IHRlYTU3NTdfcmVhZChzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIGludCB0ZWE1NzU3X3dyaXRlKHN0cnVjdCBidHR2ICpidHYsIGludCB2YWx1ZSk7CnN0YXRpYyB2b2lkIGlkZW50aWZ5X2J5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2LAoJCQkgICAgICAgdW5zaWduZWQgY2hhciBlZXByb21fZGF0YVsyNTZdKTsKc3RhdGljIGludCBfX2RldmluaXQgcHZyX2Jvb3Qoc3RydWN0IGJ0dHYgKmJ0dik7CgovKiBjb25maWcgdmFyaWFibGVzICovCnN0YXRpYyB1bnNpZ25lZCBpbnQgdHJpdG9uMT0wOwpzdGF0aWMgdW5zaWduZWQgaW50IHZzZng9MDsKc3RhdGljIHVuc2lnbmVkIGludCBsYXRlbmN5ID0gVU5TRVQ7CnN0YXRpYyB1bnNpZ25lZCBpbnQgbm9fb3ZlcmxheT0tMTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZFtCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcGxsW0JUVFZfTUFYXSAgICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgdHVuZXJbQlRUVl9NQVhdICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgc3Zoc1tCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcmVtb3RlW0JUVFZfTUFYXSA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyBzdHJ1Y3QgYnR0diAgKm1hc3RlcltCVFRWX01BWF0gPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBOVUxMIH07CiNpZmRlZiBNT0RVTEUKc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbG9hZCA9IDE7CiNlbHNlCnN0YXRpYyB1bnNpZ25lZCBpbnQgYXV0b2xvYWQgPSAwOwojZW5kaWYKc3RhdGljIHVuc2lnbmVkIGludCBncGlvbWFzayA9IFVOU0VUOwpzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvYWxsID0gVU5TRVQ7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYXVkaW9tdXhbNV0gPSB7IFsgMCAuLi4gNCBdID0gVU5TRVQgfTsKCi8qIGluc21vZCBvcHRpb25zICovCm1vZHVsZV9wYXJhbSh0cml0b24xLCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0odnNmeCwgICAgICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKG5vX292ZXJsYXksIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShsYXRlbmN5LCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0oZ3Bpb21hc2ssICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKGF1ZGlvYWxsLCAgIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShhdXRvbG9hZCwgICBpbnQsIDA0NDQpOwoKbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocGxsLCAgICAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheSh0dW5lciwgICAgaW50LCBOVUxMLCAwNDQ0KTsKbW9kdWxlX3BhcmFtX2FycmF5KHN2aHMsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocmVtb3RlLCAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheShhdWRpb211eCwgaW50LCBOVUxMLCAwNDQ0KTsKCk1PRFVMRV9QQVJNX0RFU0ModHJpdG9uMSwic2V0IEVUQkYgcGNpIGNvbmZpZyBiaXQgIgoJCSAiW2VuYWJsZSBidWcgY29tcGF0aWJpbGl0eSBmb3IgdHJpdG9uMSArIG90aGVyc10iKTsKTU9EVUxFX1BBUk1fREVTQyh2c2Z4LCJzZXQgVlNGWCBwY2kgY29uZmlnIGJpdCAiCgkJICJbeWV0IGFub3RoZXIgY2hpcHNldCBmbGF3IHdvcmthcm91bmRdIik7Ck1PRFVMRV9QQVJNX0RFU0MobGF0ZW5jeSwicGNpIGxhdGVuY3kgdGltZXIiKTsKTU9EVUxFX1BBUk1fREVTQyhjYXJkLCJzcGVjaWZ5IFRWL2dyYWJiZXIgY2FyZCBtb2RlbCwgc2VlIENBUkRMSVNUIGZpbGUgZm9yIGEgbGlzdCIpOwpNT0RVTEVfUEFSTV9ERVNDKHBsbCwic3BlY2lmeSBpbnN0YWxsZWQgY3J5c3RhbCAoMD1ub25lLCAyOD0yOCBNSHosIDM1PTM1IE1IeikiKTsKTU9EVUxFX1BBUk1fREVTQyh0dW5lciwic3BlY2lmeSBpbnN0YWxsZWQgdHVuZXIgdHlwZSIpOwpNT0RVTEVfUEFSTV9ERVNDKGF1dG9sb2FkLCJhdXRvbWF0aWNhbGx5IGxvYWQgaTJjIG1vZHVsZXMgbGlrZSB0dW5lci5vLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIGxpc3Qgb2YgY2FyZCBJRHMgZm9yIGJ0ODc4KyBjYXJkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgc3RydWN0IENBUkQgewoJdW5zaWduZWQgaWQ7CglpbnQgY2FyZG5yOwoJY2hhciAqbmFtZTsKfSBjYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Cgl7IDB4MTNlYjAwNzAsIEJUVFZfSEFVUFBBVUdFODc4LCAgIkhhdXBwYXVnZSBXaW5UViIgfSwKCXsgMHgzOTAwMDA3MCwgQlRUVl9IQVVQUEFVR0U4NzgsICAiSGF1cHBhdWdlIFdpblRWLUQiIH0sCgl7IDB4NDUwMDAwNzAsIEJUVFZfSEFVUFBBVUdFUFZSLCAgIkhhdXBwYXVnZSBXaW5UVi9QVlIiIH0sCgl7IDB4ZmYwMDAwNzAsIEJUVFZfT1NQUkVZMXgwLCAgICAgIk9zcHJleS0xMDAiIH0sCgl7IDB4ZmYwMTAwNzAsIEJUVFZfT1NQUkVZMngwX1NWSUQsIk9zcHJleS0yMDAiIH0sCgl7IDB4ZmYwMjAwNzAsIEJUVFZfT1NQUkVZNTAwLCAgICAgIk9zcHJleS01MDAiIH0sCgl7IDB4ZmYwMzAwNzAsIEJUVFZfT1NQUkVZMjAwMCwgICAgIk9zcHJleS0yMDAwIiB9LAoJeyAweGZmMDQwMDcwLCBCVFRWX09TUFJFWTU0MCwgICAgICJPc3ByZXktNTQwIiB9LAoKCXsgMHgwMDAxMTAwMiwgQlRUVl9BVElfVFZXT05ERVIsICAiQVRJIFRWIFdvbmRlciIgfSwKCXsgMHgwMDAzMTAwMiwgQlRUVl9BVElfVFZXT05ERVJWRSwiQVRJIFRWIFdvbmRlci9WRSIgfSwKCgl7IDB4NjYwNjEwN2QsIEJUVFZfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAoJeyAweDY2MDcxMDdkLCBCVFRWX1dJTkZBU1RWQzEwMCwgICJMZWFkdGVrIFdpbkZhc3QgVkMgMTAwIiB9LAoJeyAweDY2MDkxMDdkLCBCVFRWX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFRWIDIwMDAgWFAiIH0sCgl7IDB4MjYzNjEwYjQsIEJUVFZfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCgl7IDB4MjY0NTEwYjQsIEJUVFZfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCiAJeyAweDQwMjAxMGZjLCBCVFRWX0dWQkNUVjNQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjMvUENJIiB9LAoJeyAweDQwNTAxMGZjLCBCVFRWX0dWQkNUVjRQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjQvUENJIiB9LAoJeyAweDQwNzAxMGZjLCBCVFRWX0dWQkNUVjVQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjUvUENJIiB9LAogCXsgMHhkMDE4MTBmYywgQlRUVl9HVkJDVFY1UENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFY1L1BDSSIgfSwKCgl7IDB4MDAxMjExYmQsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYiIH0sCgkvLyBzb21lIGNhcmRzIHNoaXAgd2l0aCBieXRlc3dhcHBlZCBJRHMgLi4uCgl7IDB4MTIwMGJkMTEsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKCXsgMHhmZjAwYmQxMSwgQlRUVl9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViBbYnN3YXBdIiB9LAoJLy8gdGhpcyBzZWVtcyB0byBoYXBwZW4gYXMgd2VsbCAuLi4KCXsgMHhmZjEyMTFiZCwgQlRUVl9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViIgfSwKCgl7IDB4MzAwMDEyMWEsIEJUVFZfVk9PRE9PVFZfRk0sICAgIjNEZnggVm9vZG9vVFYgRk0vIFZvb2Rvb1RWIDIwMCIgfSwKCXsgMHgyNjM3MTBiNCwgQlRUVl9WT09ET09UVl9GTSwgICAiM0RmeCBWb29kb29UViBGTS8gVm9vZG9vVFYgMjAwIiB9LAoJeyAweDMwNjAxMjFhLCBCVFRWX1NUQjIsCSAgIjNEZnggVm9vZG9vVFYgMTAwLyBTVEIgT0VNIiB9LAoKCXsgMHgzMDAwMTQ0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYzLCAiKEFza2V5IE1hZ2ljL290aGVycykgVFZpZXc5OSBDUEgwNngiIH0sCgl7IDB4YTAwNTE0NGYsIEJUVFZfTUFHSUNUVklFVzA2MywgIkNQSDA2WCBUVmlldzk5LUNhcmQiIH0sCgl7IDB4MzAwMjE0NGYsIEJUVFZfTUFHSUNUVklFVzA2MSwgIihBc2tleSBNYWdpYy9vdGhlcnMpIFRWaWV3OTkgQ1BIMDV4IiB9LAoJeyAweDMwMDUxNDRmLCBCVFRWX01BR0lDVFZJRVcwNjEsICIoQXNrZXkgTWFnaWMvb3RoZXJzKSBUVmlldzk5IENQSDA2MS8wNkwgKFQxL0xDKSIgfSwKCXsgMHg1MDAwMTQ0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYxLCAiQXNrZXkgQ1BIMDUwIiB9LAoJeyAweDMwMDAxNGZmLCBCVFRWX01BR0lDVFZJRVcwNjEsICJUVmlldyA5OSAoQ1BIMDYxKSIgfSwKCXsgMHgzMDAyMTRmZiwgQlRUVl9QSE9FQkVfVFZNQVMsICAiUGhvZWJlIFRWIE1hc3RlciAoQ1BIMDYwKSIgfSwKCgl7IDB4MDAwMTE0NjEsIEJUVFZfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwMjE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIkFWZXJtZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDAwMzE0NjEsIEJUVFZfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwNDE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDMwMDE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIlZET01BVEUgVFYgVFVORVIgQ0FSRCIgfSwKCgl7IDB4MTExNzE1M2IsIEJUVFZfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoUGhpbGlwcyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE4MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE5MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChQaGlsaXBzIFBBTCBJKSIgfSwKCXsgMHgxMTFhMTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgSSkiIH0sCgoJeyAweDExMjMxNTNiLCBCVFRWX1RFUlJBVFZSQURJTywgICJUZXJyYXRlYyBUViBSYWRpbysiIH0sCgl7IDB4MTEyNzE1M2IsIEJUVFZfVEVSUkFUViwgICAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMDUpIiAgICB9LAoJLy8gY2xhc2hlcyB3aXRoIEZseVZpZGVvCgkvL3sgMHgxODUyMTg1MiwgQlRUVl9URVJSQVRWLCAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMTApIiAgICB9LAoJeyAweDExMzQxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKExSMTAyKSIgfSwKCXsgMHgxMTM1MTUzYiwgQlRUVl9URVJSQVRWQUxVRVIsICAiVGVycmF0ZWMgVFZhbHVlIFJhZGlvIiB9LCAvLyBMUjEwMgoJeyAweDUwMTgxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUiIH0sICAgICAgIC8vID8/Cgl7IDB4ZmYzYjE1M2IsIEJUVFZfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLy8gPz8KCgl7IDB4NDAwMDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwYTE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwZDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKCXsgMHg0MDEwMTViMCwgQlRUVl9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViAvIFJhZGlvIiB9LAoJeyAweDQwMTYxNWIwLCBCVFRWX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIC8gUmFkaW8iIH0sCgoJeyAweDE0MzBhYTAwLCBCVFRWX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0EiIH0sCgl7IDB4MTQzMWFhMDAsIEJUVFZfUFYxNDMsICAgICAgICAgIlByb3ZpZGVvIFBWMTQzQiIgfSwKCXsgMHgxNDMyYWEwMCwgQlRUVl9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNDIiB9LAoJeyAweDE0MzNhYTAwLCBCVFRWX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0QiIH0sCgl7IDB4MTQzM2FhMDMsIEJUVFZfUFYxNDMsICAgICAgICAgIlNlY3VyaXR5IEV5ZXMiIH0sCgoJeyAweDE0NjBhYTAwLCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtMSIgfSwKCXsgMHgxNDYxYWEwMSwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTIiIH0sCgl7IDB4MTQ2MmFhMDIsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQS0zIiB9LAoJeyAweDE0NjNhYTAzLCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtNCIgfSwKCgl7IDB4MTQ2NGFhMDQsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi0xIiB9LAoJeyAweDE0NjVhYTA1LCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItMiIgfSwKCXsgMHgxNDY2YWEwNiwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBCLTMiIH0sCgl7IDB4MTQ2N2FhMDcsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi00IiB9LAoKCXsgMHhhMTMyZmYwMCwgQlRUVl9JVkMxMDAsICAgICAgICAiSVZDLTEwMCIgIH0sCgl7IDB4YTE1NTAwMDAsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMDAxLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKCXsgMHhhMTU1MDAwMiwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMCIgIH0sCgl7IDB4YTE1NTAwMDMsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMTAwLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTU1MDEwMSwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCgl7IDB4YTE1NTAxMDIsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDBHIiB9LAoJeyAweGExNTUwMTAzLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTgyZmYwMCwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDEsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjAyLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwMywgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDQsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA1LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwNiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDcsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA4LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwOSwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGEsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBiLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwYywgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGQsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBlLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwZiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgoJeyAweDQxNDI0MzQ0LCBCVFRWX0dSQU5EVEVDLCAgICAgICJHcmFuZFRlYyBNdWx0aSBDYXB0dXJlIiB9LAoJeyAweDAxMDIwMzA0LCBCVFRWX1hHVUFSRCwgICAgICAgICJHcmFuZHRlYyBHcmFuZCBYLUd1YXJkIiB9LAoKCXsgMHgxODUwMTg1MSwgQlRUVl9DSFJPTk9TX1ZTMiwgICAiRmx5VmlkZW8gOTggKExSNTApLyBDaHJvbm9zIFZpZGVvIFNodXR0bGUgSUkiIH0sCgl7IDB4YTA1MDE4NTEsIEJUVFZfQ0hST05PU19WUzIsICAgIkZseVZpZGVvIDk4IChMUjUwKS8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiB9LAoJeyAweDE4NTExODUxLCBCVFRWX0ZMWVZJREVPOThFWiwgICJGbHlWaWRlbyA5OEVaIChMUjUxKS8gQ3liZXJNYWlsIEFWIiB9LAoJeyAweDE4NTIxODUyLCBCVFRWX1RZUEhPT05fVFZJRVcsICJGbHlWaWRlbyA5OEZNIChMUjUwKS8gVHlwaG9vbiBUVmlldyBUVi9GTSBUdW5lciIgfSwKCXsgMHg0MWEwYTA1MSwgQlRUVl9GTFlWSURFT185OEZNLCAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCBSZXYgUSIgfSwKCXsgMHgxODUwMWY3ZiwgQlRUVl9GTFlWSURFT185OCwgICAiTGlmZXZpZXcgRmx5dmlkZW8gOTgiIH0sCgogICAgCXsgMHgwMTAxMTVjYiwgQlRUVl9HTVYxLCAgICAgICAgICAiQUcgR01WMSIgfSwKCXsgMHgwMTAxMTRjNywgQlRUVl9NT0RURUNfMjA1LCAgICAiTW9kdWxhciBUZWNobm9sb2d5IE1NMjAxL01NMjAyL01NMjA1L01NMjEwL01NMjE1IFBDVFYiIH0sCgoJeyAweDEwYjQyNjM2LCBCVFRWX0hBVVBQQVVHRTg3OCwgICJTVEIgPz8/IiB9LAoJeyAweDIxN2Q2NjA2LCBCVFRWX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFdpbkZhc3QgVFYgMjAwMCIgfSwKCXsgMHhmZmY2ZjZmZiwgQlRUVl9XSU5GQVNUMjAwMCwgICAiTGVhZHRlayBXaW5GYXN0IFRWIDIwMDAiIH0sCgl7IDB4MDMxMTYwMDAsIEJUVFZfU0VOU09SQVkzMTEsICAgIlNlbnNvcmF5IDMxMSIgfSwKCXsgMHgwMDc5MGUxMSwgQlRUVl9XSU5EVlIsICAgICAgICAiQ2Fub3B1cyBXaW5EVlIgUENJIiB9LAoJeyAweGEwZmNhMWEwLCBCVFRWX1pPTFRSSVgsICAgICAgICJGYWNlIHRvIEZhY2UgVHZtYXgiIH0sCgl7IDB4MjAwMDcwNjMsIEJUVFZfUENfSERUViwgICAgICAgInBjSERUViBIRC0yMDAwIFRWIn0sCgl7IDB4ODJiMmFhNmEsIEJUVFZfU0lNVVNfR1ZDMTEwMCwgIlNJTVVTIEdWQzExMDAiIH0sCgl7IDB4MTQ2Y2FhMGMsIEJUVFZfUFY5NTEsICAgICAgICAgIml0dW5lciBzcGVjdHJhOCIgfSwKIAl7IDB4MjAwYTEyOTUsIEJUVFZfUFhDMjAwLCAgICAgICAgIkltYWdlTmF0aW9uIFBYQzIwMEEiIH0sCgoJeyAweDQwMTExNTU0LCBCVFRWX1BWX0JUODc4UF85QiwgICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVCIgfSwKCXsgMHgxN2RlMGEwMSwgQlRUVl9LV09STEQsICAgICAgICAiTWVjZXIgVFYvRk0vVmlkZW8gVHVuZXIiIH0sCgoJeyAweDAxMDUxODA1LCBCVFRWX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzEiIH0sCgl7IDB4MDEwNjE4MDUsIEJUVFZfUElDT0xPX1RFVFJBX0NISVAsICJQaWNvbG8gVGV0cmEgQ2hpcCAjMiIgfSwKCXsgMHgwMTA3MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMzIiB9LAoJeyAweDAxMDgxODA1LCBCVFRWX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzQiIH0sCgoJLy8gbGlrZWx5IGJyb2tlbiwgdmVuZG9yIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIG90aGVyIG1hZ2ljIHZpZXdzIC4uLgoJLy97IDB4YTBmY2EwNGYsIEJUVFZfTUFHSUNUVklFVzA2MywgIkd1aWxsZW1vdCBNYXhpIFRWIFZpZGVvIDMiIH0sCgoJLy8gRFZCIGNhcmRzICh1c2luZyBwY2kgZnVuY3Rpb24gLjEgZm9yIG1wZWcgZGF0YSB4ZmVyKQoJeyAweDAxMDEwMDcxLCBCVFRWX05FQlVMQV9ESUdJVFYsICJOZWJ1bGEgRWxlY3Ryb25pY3MgRGlnaVRWIiB9LAoJeyAweDA3NjExNDYxLCBCVFRWX0FWRFZCVF83NjEsICAgICJBdmVyTWVkaWEgQXZlclRWIERWQi1UIDc2MSIgfSwKCXsgMHgwMDFjMTFiZCwgQlRUVl9QSU5OQUNMRVNBVCwgICAiUGlubmFjbGUgUENUViBTYXQiIH0sCgl7IDB4MDAyNjExYmQsIEJUVFZfVFdJTkhBTl9EU1QsICAgIlBpbm5hY2xlIFBDVFYgU0FUIENJIiB9LAoJeyAweDAwMDExODIyLCBCVFRWX1RXSU5IQU5fRFNULCAgICJUd2luaGFuIFZpc2lvblBsdXMgRFZCIiB9LAoJeyAweGZjMDAyNzBmLCBCVFRWX1RXSU5IQU5fRFNULCAgICJDaGFpblRlY2ggZGlnaXRvcCBEU1QtMTAwMCBEVkItUyIgfSwKCXsgMHgwNzcxMTQ2MSwgQlRUVl9BVkRWQlRfNzcxLCAgICAiQVZlcm1lZGlhIEF2ZXJUViBEVkItVCA3NzEiIH0sCgl7IDB4ZGIxMDE4YWMsIEJUVFZfRFZJQ09fRFZCVF9MSVRFLCAgICAiRFZJQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiB9LAoKCXsgMCwgLTEsIE5VTEwgfQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogYXJyYXkgd2l0aCBkZXNjcmlwdGlvbiBmb3IgYnQ4NDggLyBidDg3OCB0di9ncmFiYmVyIGNhcmRzICAgICAgICAgICAgICAgKi8KCnN0cnVjdCB0dmNhcmQgYnR0dl90dmNhcmRzW10gPSB7CnsKLyogLS0tLSBjYXJkIDB4MDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIiAqKiogVU5LTk9XTi9HRU5FUklDICoqKiAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIk1JUk8gUENUViIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMTUsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDIsIDAsIDAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIkhhdXBwYXVnZSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIlNUQiwgR2F0ZXdheSBQL04gNjAwMDY5OSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyA0LCAwLCAyLCAzLCAxfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5oYXNfcmFkaW8gICAgICA9IDEsCn0sewoKLyogLS0tLSBjYXJkIDB4MDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkludGVsIENyZWF0ZSBhbmQgU2hhcmUgUENJLyBTbWFydCBWaWRlbyBSZWNvcmRlciBJSUkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMCwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDAsCgkudHVuZXJfdHlwZQk9IDQsCn0sewoJLm5hbWUJCT0gIkRpYW1vbmQgRFRWMjAwMCIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eAk9IHsgMCwgMSwgMCwgMSwgM30sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZQaG9uZSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAzLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmdwaW9tYXNrCT0gMHgwZiwKCS5hdWRpb211eAk9IHsgMHgwYywgMHgwNCwgMHgwOCwgMHgwNCwgMH0sCgkvKiAgICAgICAgICAgICAgICAweDA0IGZvciBzb21lIGNhcmRzID8/ICovCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLmF1ZGlvX2hvb2sJPSBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbywKCS5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLm5hbWUJCT0gIk1BVFJJWC1WaXNpb24gTVYtRGVsdGEiLAoJLnZpZGVvX2lucHV0cwk9IDUsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4CT0gezAgfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MDggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIElJIChCdDg0OCkgTFIyNiAvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjI2IiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGMwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHhjMDAsIDB4ODAwLCAweDQwMCwgMHhjMDAsIDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJJTVMvSVhtaWNybyBUdXJib1RWIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAzLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxLCAxLCAyLCAzLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9URU1JQ19QQUwsCn0sewoJLm5hbWUJCT0gIkhhdXBwYXVnZSAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDBmLCAvKiBvbGQ6IDcgKi8KCS5tdXhzZWwJCT0geyAyLCAwLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIk1JUk8gUENUViBwcm8iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MzAxNGYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDB4MjAwMDEsMHgxMDAwMSwgMCwgMCwxMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCi8qIC0tLS0gY2FyZCAweDBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJBRFMgVGVjaG5vbG9naWVzIENoYW5uZWwgU3VyZmVyIFRWIChidDg0OCkiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDE1LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gNCwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDE1LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5tc3AzNHh4X2FsdCAgICA9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkuYXVkaW9faG9vayAgICAgPSBhdmVybWVkaWFfdHZfc3RlcmVvX2F1ZGlvLAp9LHsKCS5uYW1lCQk9ICJBaW1zbGFiIFZpZGVvIEhpZ2h3YXkgWHRyZW1lIChWSFgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAyLCAxLCAzLCA0fSwgLyogb2xkOiB7IDAsIDEsIDIsIDMsIDR9ICovCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIlpvbHRyaXggVFYtTWF4IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAxNSwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHswICwgMCwgMSAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWx2aWV3IFBsYXlUViAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKI2lmIDAKCS8vIG9sZAoJLmF1ZGlvbXV4CT0geyAweDAxYzAwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAojZWxzZQoJLy8gMjAwMy0xMC0yMCBieSAiQW50b24gQS4gQXJhcG92IiA8YXJhcG92QG1haWwucnU+CgkuYXVkaW9tdXggICAgICAgPSB7IDB4MDAxZTAwLCAwLCAweDAxODAwMCwgMHgwMTQwMDAsIDB4MDAyMDAwLCAwIH0sCiNlbmRpZgoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJMZWFkdGVrIFdpblZpZXcgNjAxIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDgzMDBmOCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLDB9LAoJLmF1ZGlvbXV4CT0geyAweDRmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwN30sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLmF1ZGlvX2hvb2sJPSB3aW52aWV3X2F1ZGlvLAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLm5hbWUJCT0gIkFWRUMgSW50ZXJjYXB0dXJlIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDIsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MSwgMCwgMCwgMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyBJSSBFWiAvRmx5S2l0IExSMzggQnQ4NDggKGNhcHR1cmUgb25seSkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrCT0gMHg4ZGZmMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAgfSwKCS5ub19tc3AzNHh4CT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkNFSSBSYWZmbGVzIENhcmQiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMywKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIEx1Y2t5IFN0YXIgSW1hZ2UgV29ybGQgQ29uZmVyZW5jZVRWIExSNTAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMiwgIC8vIHR1bmVyLCBsaW5lIGluCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDE4MDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAp9LHsKCS5uYW1lCQk9ICJBc2tleSBDUEgwNTAvIFBob2ViZSBUdiBNYXN0ZXIgKyBGTSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhjMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MCwgMSwgMHg4MDAsIDB4NDAwLCAweGMwMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIk1vZHVsYXIgVGVjaG5vbG9neSBNTTIwMS9NTTIwMi9NTTIwNS9NTTIxMC9NTTIxNSBQQ1RWLCBidDg3OCIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzawk9IDcsCgkubXV4c2VsCQk9IHsgMiwgMywgLTEgfSwKICAgICAgICAuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLAoJLmF1ZGlvbXV4CT0geyAwLCAwLCAwLCAwLCAwIH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkI1X1BBTF9JLAp9LHsKCi8qIC0tLS0gY2FyZCAweDE4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJBc2tleSBDUEgwNVgvMDZYIChidDg3OCkgW21hbnkgdmVuZG9yc10iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZTAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0gezB4NDAwLCAweDQwMCwgMHg0MDAsIDB4NDAwLCAweGMwMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCgkuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWKyBWZXJzaW9uIDEuMCAoQnQ4NDgpLyBUZXJyYSBUVmFsdWUgVmVyc2lvbiAxLjAvIFZvYmlzIFRWLUJvb3N0YXIiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MWYwZmZmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkuYXVkaW9faG9vayAgICAgPSB0ZXJyYXR2X2F1ZGlvLAp9LHsKCS5uYW1lCQk9ICJIYXVwcGF1Z2UgV2luQ2FtIG5ld2VyIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMywKCS5ncGlvbWFzawk9IDcsCgkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDEsIDIsIDMsIDR9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjUwIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDIsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDE4MDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19TRUNBTSwKfSx7CgovKiAtLS0tIGNhcmQgMHgxYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVisgVmVyc2lvbiAxLjEgKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxZjBmZmYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDB4MjAwMDAsIDB4MzAwMDAsIDB4MTAwMDAsIDB4MDAwMDAsIDB4NDAwMDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5hdWRpb19ob29rCT0gdGVycmF0dl9hdWRpbywKCS8qIEdQSU8gd2lyaW5nOgogICAgICAgICAgICAgICBFeHRlcm5hbCAyMCBwaW4gY29ubmVjdG9yIChmb3IgQWN0aXZlIFJhZGlvIFVwZ3JhZGUgYm9hcmQpCiAgICAgICAgICAgICAgIGdwaW8wMDogaTJjLXNkYQogICAgICAgICAgICAgICBncGlvMDE6IGkyYy1zY2wKICAgICAgICAgICAgICAgZ3BpbzAyOiBvbTU2MTAtZGF0YQogICAgICAgICAgICAgICBncGlvMDM6IG9tNTYxMC1jbGsKICAgICAgICAgICAgICAgZ3BpbzA0OiBvbTU2MTAtd3JlCiAgICAgICAgICAgICAgIGdwaW8wNTogb201NjEwLXN0ZXJlbwogICAgICAgICAgICAgICBncGlvMDY6IHJkczY1ODgtZGF2bgogICAgICAgICAgICAgICBncGlvMDc6IFBpbiA3IG4uYy4KICAgICAgICAgICAgICAgZ3BpbzA4OiBuSU9XCiAgICAgICAgICAgICAgIGdwaW8wOSsxMDogbklPUiwgblNFTCA/PyAoYnQ4NzgpCiAgICAgICAgICAgICAgICBncGlvMDk6IG5JT1IgKGJ0ODQ4KQogICAgICAgICAgICAgICAgZ3BpbzEwOiBuU0VMIChidDg0OCkKICAgICAgICAgICAgICBTb3VuZCBSb3V0aW5nOgogICAgICAgICAgICAgICBncGlvMTY6IHUyLUEwICgxc3QgNDA1MmJ0KQogICAgICAgICAgICAgICBncGlvMTc6IHUyLUExCiAgICAgICAgICAgICAgIGdwaW8xODogdTItbkVOCiAgICAgICAgICAgICAgIGdwaW8xOTogdTQtQTAgKDJuZCA0MDUyKQogICAgICAgICAgICAgICBncGlvMjA6IHU0LUExCiAgICAgICAgICAgICAgICAgICAgICAgdTQtbkVOIC0gR05ECgkgICAgQnRzcHk6CgkgIAkwMDAwMCA6IENkcm9tIChpbnRlcm5hbCBhdWRpbyBpbnB1dCkKCQkxMDAwMCA6IGV4dC4gVmlkZW8gYXVkaW8gaW5wdXQKCQkyMDAwMCA6IFRWIE1vbm8KCQlhMDAwMCA6IFRWIE1vbm8vMgoJICAgICAgIDFhMDAwMCA6IFRWIFN0ZXJlbwoJCTMwMDAwIDogUmFkaW8KCQk0MDAwMCA6IE11dGUKICAgICAgICovCgp9LHsKCS8qIEphbm5payBGcml0c2NoIDxqYW5uaWtAdGVjaGZhay51bmktYmllbGVmZWxkLmRlPiAqLwoJLm5hbWUJCT0gIkltYWdlbmF0aW9uIFBYQzIwMCIsCgkudmlkZW9faW5wdXRzCT0gNSwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IC0xLAoJLnN2aHMJCT0gMSwgLyogd2FzOiA0ICovCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4CT0geyAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLm11eHNlbF9ob29rICAgID0gUFhDMjAwX211eHNlbCwKCn0sewoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4IExSNTAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MTgwMCwgIC8vMHg4ZGZlMDAKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHgwODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJGb3JtYWMgaVByb1RWLCBGb3JtYWMgUHJvVFYgSSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSAxLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxLCAwLCAwLCAwLCAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAp9LHsKCi8qIC0tLS0gY2FyZCAweDIwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJJbnRlbCBDcmVhdGUgYW5kIFNoYXJlIFBDSS8gU21hcnQgVmlkZW8gUmVjb3JkZXIgSUlJIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDAsCgkudHVuZXIJCT0gLTEsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnR1bmVyX3R5cGUJPSA0LAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWYWx1ZSBWZXJzaW9uIEJ0ODc4IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHg1MDAsIDAsIDB4MzAwLCAweDkwMCwgMHg5MDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAp9LHsKCS5uYW1lCQk9ICJMZWFkdGVrIFdpbkZhc3QgMjAwMC8gV2luRmFzdCAyMDAwIFhQIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSwgMH0sIC8vIFRWLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IKI2lmIDAKCS5ncGlvbWFzawk9IDB4YzMzMDAwLAoJLmF1ZGlvbXV4CT0geyAweDQyMjAwMCwweDEwMDAsMHgwMDAwLDB4NjIwMDAwLDB4ODAwMDAwIH0sCiNlbHNlCgkvKiBBbGV4YW5kZXIgVmFyYWtpbiA8YXZhcmFraW5AaG90bWFpbC5jb20+IFtzdGVyZW8gdmVyc2lvbl0gKi8KCS5ncGlvbWFzawk9IDB4YjMzMDAwLAoJLmF1ZGlvbXV4CT0geyAweDEyMjAwMCwweDEwMDAsMHgwMDAwLDB4NjIwMDAwLDB4ODAwMDAwIH0sCiNlbmRpZgoJLyogQXVkaW8gUm91dGluZyBmb3IgIldpbkZhc3QgMjAwMCBYUCIgKG5vIHR2IHN0ZXJlbyAhKQoJCWdwaW8yMyAtLSBoZWY0MDUyOm5FbmFibGUgKDB4ODAwMDAwKQoJCWdwaW8xMiAtLSBoZWY0MDUyOkExCgkgICAgICAgIGdwaW8xMyAtLSBoZWY0MDUyOkEwCgkgICAgMHgwMDAwOiBleHRlcm5hbCBhdWRpbwoJICAgIDB4MTAwMDogRk0KCSAgICAweDIwMDA6IFRWCgkgICAgMHgzMDAwOiBuLmMuCiAgICAgICAgICBOb3RlOiBUaGVyZSBleGlzdHMgYW5vdGhlciB2YXJpYW50ICJXaW5mYXN0IDIwMDAiIHdpdGggdHYgc3RlcmVvICE/CgkgIE5vdGU6IGVlcHJvbSBvbmx5IGNvbnRhaW5zIEZGIGFuZCBwY2kgc3Vic3lzdGVtIGlkIDEwN2Q6NjYwNgoJICovCgkubmVlZHNfdHZhdWRpbwk9IDAsCgkucGxsCQk9IFBMTF8yOCwKCS5oYXNfcmFkaW8JPSAxLAoJLnR1bmVyX3R5cGUJPSA1LCAvLyBkZWZhdWx0IGZvciBub3csIGdwaW8gcmVhZHMgQkZGRjA2IGZvciBQYWwgYmcrZGsKCS5hdWRpb19ob29rCT0gd2luZmFzdDIwMDBfYXVkaW8sCgkuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OCBMUjUwIC8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDMsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDE4MDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgovKiAtLS0tIGNhcmQgMHgyNCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThGTSBMUjUwIC8gVHlwaG9vbiBUVmlldyBUVi9GTSBUdW5lciIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAzLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxODAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWxWaWV3IFBsYXlUViBwcm8iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZmYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJLmF1ZGlvbXV4CT0geyAweDIxLCAweDIwLCAweDI0LCAweDJjLCAweDI5LCAweDI5IH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIkFza2V5IENQSDA2WCBUVmlldzk5IiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDU1MWUwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eAk9IHsgMHg1NTE0MDAsIDB4NTUxMjAwLCAwLCAwLCAweDU1MWMwMCwgMHg1NTEyMDAgfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAxLAoJLmhhc19yZW1vdGUgICAgID0gMSwKfSx7CgkubmFtZQkJPSAiUGlubmFjbGUgUENUViBTdHVkaW8vUmF2ZSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgwMzAwMEYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDIsIDB4ZDAwMDEsIDAsIDAsIDF9LAoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCi8qIC0tLS0gY2FyZCAweDI4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJTVEIgVFYgUENJIEZNLCBHYXRld2F5IFAvTiA2MDAwNzA0IChidDg3OCksIDNEZnggVm9vZG9vVFYgMTAwIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyA0LCAwLCAyLCAzLCAxfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5oYXNfcmFkaW8gICAgICA9IDEsCn0sewoJLm5hbWUJCT0gIkFWZXJNZWRpYSBUVlBob25lIDk4IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDQsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAxNSwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMTMsIDQsIDExLCA3LCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKCS5oYXNfcmFkaW8JPSAxLAoJLmF1ZGlvX2hvb2sJPSBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbywKfSx7CgkubmFtZQkJPSAiUHJvVmlkZW8gUFY5NTEiLCAvKiBwaWMxNmM1NCAqLwoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDAsIDAsIDAsIDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IDEsCn0sewoJLm5hbWUJCT0gIkxpdHRsZSBPbkFpciBUViIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhlMDBiLAoJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MHhmZjlmZjYsIDB4ZmY5ZmY2LCAweGZmMWZmNywgMCwgMHhmZjNmZmN9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgovKiAtLS0tIGNhcmQgMHgyYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZQkJPSAiU2lnbWEgVFZJSS1GTSIsCgkudmlkZW9faW5wdXRzCT0gMiwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzawk9IDMsCgkubXV4c2VsCQk9IHsyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsxLCAxLCAwLCAyLCAzfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMX05PTkUsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJNQVRSSVgtVmlzaW9uIE1WLURlbHRhIDIiLAoJLnZpZGVvX2lucHV0cwk9IDUsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4CT0gezAgfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiWm9sdHJpeCBHZW5pZSBUVi9GTSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhiY2YwM2YsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDB4YmM4MDNmLCAweGJjOTAzZiwgMHhiY2IwM2YsIDAsIDB4YmNiMDNmfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAyMSwKfSx7CgkubmFtZQkJPSAiVGVycmF0ZWMgVFYvUmFkaW8rIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDcwMDAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwLCAweDIwMDAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8zNSwKCS50dW5lcl90eXBlCT0gMSwKCS5oYXNfcmFkaW8JPSAxLAp9LHsKCi8qIC0tLS0gY2FyZCAweDMwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJBc2tleSBDUEgwM3gvIER5bmFsaW5rIE1hZ2ljIFRWaWV3IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAxNSwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsyLDAsMCwwLDF9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJJT0RBVEEgR1YtQkNUVjMvUENJIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDAxMGYwMCwKCS5tdXhzZWwJCT0gezIsIDMsIDAsIDB9LAoJLmF1ZGlvbXV4CT0gezB4MTAwMDAsIDAsIDB4MTAwMDAsIDAsIDAsIDB9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX0FMUFNfVFNIQzZfTlRTQywKCS5hdWRpb19ob29rCT0gZ3ZiY3R2M3BjaV9hdWRpbywKfSx7CgkubmFtZQkJPSAiUHJvbGluayBQVi1CVDg3OFArNEUgLyBQaXhlbFZpZXcgUGxheVRWIFBBSyAvIExlbmNvIE1YVFYtOTU3OCBDUCIsCgkudmlkZW9faW5wdXRzCT0gNSwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAzLAoJLmdwaW9tYXNrCT0gMHhBQTAwMDAsCgkubXV4c2VsCQk9IHsgMiwzLDEsMSwtMSB9LAoJLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwKCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMCwgMHg4MDAwMCwgMHg4MDAwMCwgMHhhODAwMCwgMHg0NjAwMCAgfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAoJLmhhc19yZW1vdGUJPSAxLAoJLyogR1BJTyB3aXJpbmc6IChkaWZmZXJlbnQgZnJvbSBSZXYuNEMgISkKCQlHUElPMTc6IFU0LkEwIChmaXJzdCBoZWY0MDUyYnQpCgkJR1BJTzE5OiBVNC5BMQoJCUdQSU8yMDogVTUuQTEgKHNlY29uZCBoZWY0MDUyYnQpCgkJR1BJTzIxOiBVNC5uRU4KCQlHUElPMjI6IEJUODMyIFJlc2V0IExpbmUKCQlHUElPMjM6IEE1LEEwLCBVNSxuRU4KCSAgIE5vdGU6IEF0IGkyYz0weDhhIGlzIGEgQnQ4MzIgY2hpcCwgd2hpY2ggY2hhbmdlcyB0byAweDg4IGFmdGVyIGJlaW5nIHJlc2V0IHZpYSBHUElPMjIKCSAqLwp9LHsKCS5uYW1lICAgICAgICAgICA9ICJFYWdsZSBXaXJlbGVzcyBDYXByaWNvcm4yIChidDg3OEEpIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSA3LAoJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxLCAxfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSAvKiBUVU5FUl9BTFBTX1RNREgyX05UU0MgKi8sCn0sewoKLyogLS0tLSBjYXJkIDB4MzQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRGF2aWQgSORyZGVtYW4gPGRhdmlkQDJnZW4uY29tPiAqLwoJLm5hbWUgICAgICAgICAgID0gIlBpbm5hY2xlIFBDVFYgU3R1ZGlvIFBybyIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAzLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDEsIDB4ZDAwMDEsIDAsIDAsIDEwfSwKCQkJLyogc291bmQgcGF0aCAoNSBzb3VyY2VzKToKCQkJICAgTVVYMSAobWFzayAweDAzKSwgRW5hYmxlIFBpbiAweDA4ICgwPWVuYWJsZSwgMT1kaXNhYmxlKQoJCQkJMD0gZXh0LiBBdWRpbyBJTgoJCQkJMT0gZnJvbSBNVVgyCgkJCQkyPSBNb25vIFRWIHNvdW5kIGZyb20gVHVuZXIKCQkJCTM9IG5vdCBjb25uZWN0ZWQKCQkJICAgTVVYMiAobWFzayAweDMwMDAwKToKCQkJCTAsMiwzPSBmcm9tIE1TUDM0eHgKCQkJCTE9IEZNIHN0ZXJlbyBSYWRpbyBmcm9tIFR1bmVyICovCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLyogQ2xhYXMgTGFuZ2JlaG4gPGNsYWFzQGJpZ2Zvb3QuY29tPiwKCSAgIFN2ZW4gR3JvdGhrbGFncyA8c3ZlbkB1cGIuZGU+ICovCgkubmFtZQkJPSAiVHlwaG9vbiBUVmlldyBSRFMgKyBGTSBTdGVyZW8gLyBLTkMxIFRWIFN0YXRpb24gUkRTIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDMsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDFjLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAwLCAweDEwLCA4LCA0IH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkuaGFzX3JhZGlvCT0gMSwKfSx7CgkvKiBUaW0gUvZzdGVybXVuZHQgPHJvc3Rlcm1AdW5pLW11ZW5zdGVyLmRlPgoJICAgaW4gZGUuY29tcC5vcy51bml4LmxpbnV4LmhhcmR3YXJlOgoJCW9wdGlvbnMgYnR0diBjYXJkPTAgcGxsPTEgcmFkaW89MSBncGlvbWFzaz0weDE4ZTAKCQlhdWRpb211eD0weDQ0YzcxZiwweDQ0ZDcxZiwwLDB4NDRkNzFmLDB4NDRkZmZmCgkJb3B0aW9ucyB0dW5lciB0eXBlPTUgKi8KCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyAyMDAwIC9GbHlWaWRlbyBBMi8gTGlmZXRlYyBMVCA5NDE1IFRWIFtMUjkwXSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxOGUwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAweDAwMDAsMHgwODAwLDB4MTAwMCwweDEwMDAsMHgxOGUwIH0sCgkJICAgICAgIC8qIEZvciBjYXJkcyB3aXRoIHRkYTk4MjAvdGRhOTgyMToKCQkJICAweDAwMDA6IFR1bmVyIG5vcm1hbCBzdGVyZW8KCQkJICAweDAwODA6IFR1bmVyIEEyIFNBUCAoc2Vjb25kIGF1ZGlvIHByb2dyYW0gPSBad2Vpa2FuYWx0b24pCgkJCSAgMHgwODgwOiBUdW5lciBBMiBzdGVyZW8gKi8KCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkvKiBNaWd1ZWwgQW5nZWwgQWx2YXJleiA8bWFhY3J1ekBuYXZlZ2FsaWEuY29tPgoJICAgb2xkIEVhc3kgVFYgQlQ4NDggdmVyc2lvbiAobW9kZWwgQ1BIMDMxKSAqLwoJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDAzMS8gQkVTVEJVWSBFYXN5IFRWIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHhGLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsgMiwgMCwgMCwgMCwgMTB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9URU1JQ19QQUwsCn0sewoKLyogLS0tLSBjYXJkIDB4MzggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogR29yZG9uIEhleWRvbiA8Z2poZXlkb25AYmlnZm9vdC5jb20gKCc5OCkgKi8KCS5uYW1lICAgICAgICAgICA9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDMsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MTgwMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSA1LAp9LHsKCS8qIFRoaXMgaXMgdGhlIHVsdGltYXRlIGNoZWFwbyBjYXB0dXJlIGNhcmQKCSAqIGp1c3QgYSBCVDg0OEEgb24gYSBzbWFsbCBQQ0IhCgkgKiBTdGV2ZSBIb3Nnb29kIDxzdGV2ZUBlcXVpaW5ldC5jb20+ICovCgkubmFtZSAgICAgICAgICAgPSAiR3JhbmRUZWMgJ0dyYW5kIFZpZGVvIENhcHR1cmUnIChCdDg0OCkiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm11eHNlbCAgICAgICAgID0geyAzLCAxIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewogICAgICAgIC8qIERhbmllbCBIZXJyaW5ndG9uIDxkYW5pZWwuaGVycmluZ3RvbkBob21lLmNvbT4gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQXNrZXkgQ1BIMDYwLyBQaG9lYmUgVFYgTWFzdGVyIE9ubHkgKE5vIEZNKSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGUwMCwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4ODAwLCAweDQwMCB9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDXzQwMzZGWTVfTlRTQywKfSx7CgkvKiBNYXR0aSBNb3R0dXMgPG1vdHR1c0BwaHlzaWMudXQuZWU+ICovCgkubmFtZQkJPSAiQXNrZXkgQ1BIMDN4IFRWIENhcHR1cmVyIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCiAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAyLDAsMCwwLDEgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gMCwKfSx7CgovKiAtLS0tIGNhcmQgMHgzYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+ICovCgkubmFtZSAgICAgICAgICAgPSAiTW9kdWxhciBUZWNobm9sb2d5IE1NMTAwUENUViIsCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMiwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAxMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDEsIDh9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfUEFMLAoKfSx7CgkvKiBBZHJpYW4gQ294IDxhZHJpYW5AaHVtYm9sZHQuY28udWsgKi8KCS5uYW1lCSAgICAgICAgPSAiQUcgRWxlY3Ryb25pY3MgR01WMSIsCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lcgkgICAgICAgID0gLTEsCgkuc3ZocwkgICAgICAgID0gMSwKCS5ncGlvbWFzayAgICAgICA9IDB4RiwKCS5tdXhzZWwJICAgICAgICA9IHsgMiwgMn0sCgkuYXVkaW9tdXggICAgICAgPSB7IH0sCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwJICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCS8qIE1pZ3VlbCBBbmdlbCBBbHZhcmV6IDxtYWFjcnV6QG5hdmVnYWxpYS5jb20+CgkgICBuZXcgRWFzeSBUViBCVDg3OCB2ZXJzaW9uIChtb2RlbCBDUEgwNjEpCgkgICBzcGVjaWFsIHRoYW5rcyB0byBJbmZvcm1hdGljYSBNaWVyZXMgZm9yIHByb3ZpZGluZyB0aGUgY2FyZCAqLwoJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MS8gQkVTVEJVWSBFYXN5IFRWIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAyLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweEZGLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsgMSwgMCwgNCwgNCwgOX0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAp9LHsKCS8qIEx1a2FzIEdlYmF1ZXIgPGdlYnlAdm9sbnkuY3o+ICovCgkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhmMDNmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAgfSwKCS5hdWRpb211eAk9IHsgMHhiZmZlLCAwLCAweGJmZmYsIDAsIDB4YmZmZX0sCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfNDAwNkZONV9NVUxUSV9QQUwsCn0sewoKLyogLS0tLSBjYXJkIDB4NDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogTHVrYXMgR2ViYXVlciA8Z2VieUB2b2xueS5jej4gKi8KCS5uYW1lCQk9ICJBVEkgVFYtV29uZGVyIFZFIiwKCS52aWRlb19pbnB1dHMJPSAyLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrCT0gMSwKCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMCwgMSwgMCwgMH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfNDAwNkZONV9NVUxUSV9QQUwsCn0sewoJLyogRGVlSmF5IDxkZWVqYXlAd2VzdGVsOTAwLm5ldCAoMjAwMFMpICovCgkubmFtZSAgICAgICAgICAgPSAiTGlmZXZpZXcgRmx5VmlkZW8gMjAwMFMgTFI5MCIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMywKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrCT0gMHgxOGUwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDAsIDF9LAoJCQkvKiBSYWRpbyBjaGFuZ2VkIGZyb20gMWU4MCB0byAweDgwMCB0byBtYWtlCgkJCSAgIEZseVZpZGVvMjAwMFMgaW4gLmh1IGhhcHB5IChnbSkqLwoJCQkvKiAtZGstPz8/OiBzZXQgbXV0ZT0weDE4MDAgZm9yIHRkYTk4NzRoIGRhdWdodGVyYm9hcmQgKi8KCS5hdWRpb211eAk9IHsgMHgwMDAwLDB4MDgwMCwweDEwMDAsMHgxMDAwLDB4MTgwMCwgMHgxMDgwIH0sCgkuYXVkaW9faG9vawk9IGZ2MjAwMHNfYXVkaW8sCgkubm9fbXNwMzR4eAk9IDEsCgkubm9fdGRhOTg3NQk9IDEsCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gNSwKfSx7CgkubmFtZQkJPSAiVGVycmF0ZWMgVFZhbHVlUmFkaW8iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZmZmZjAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAweDUwMCwgMHg1MDAsIDB4MzAwLCAweDkwMCwgMHg5MDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLyogVEFOQUtBIEtlaSA8cGVnMDA2MjVAbmlmdHkuY29tPiAqLwoJLm5hbWUgICAgICAgICAgID0gIklPREFUQSBHVi1CQ1RWNC9QQ0kiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MDEwZjAwLAoJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDAsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0gezB4MTAwMDAsIDAsIDB4MTAwMDAsIDAsIDAsIDB9LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1NIQVJQXzJVNUpGNTU0MF9OVFNDLAoJLmF1ZGlvX2hvb2sgICAgID0gZ3ZiY3R2M3BjaV9hdWRpbywKfSx7CgovKiAtLS0tIGNhcmQgMHg0NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIjNEZnggVm9vZG9vVFYgRk0gKEV1cm8pLCBWb29kb29UViAyMDAgKFVTQSkiLAoJLy8gdHJ5ICJpbnNtb2QgbXNwMzQwMCBzaW1wbGU9MCIgaWYgeW91IGhhdmUKCS8vIHNvdW5kIHByb2JsZW1zIHdpdGggdGhpcyBjYXJkLgogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4NGY4YTAwLAoJLy8gMHgxMDAwMDA6IDE9TVNQIGVuYWJsZWQgKDA9ZGlzYWJsZSBhZ2FpbikKCS8vIDB4MDEwMDAwOiBDb25uZWN0ZWQgdG8gIlMwIiBvbiB0ZGE5ODgwICgwPVBhbC9CRywgMT1OVFNDKQogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsweDk0N2ZmZiwgMHg5ODdmZmYsMHg5NDdmZmYsMHg5NDdmZmYsIDB4OTQ3ZmZmfSwKCS8vIHR2dHVuZXIsIHJhZGlvLCAgIGV4dGVybmFsLGludGVybmFsLCBtdXRlLCAgc3RlcmVvCgkvKiB0dW5lciwgQ29tcG9zaXQsIFNWaWQsIENvbXBvc2l0LW9uLVN2aWQtYWRhcHRlciovCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzICwwICwxfSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCgkucGxsCQk9IFBMTF8yOCwKCS5oYXNfcmFkaW8JPSAxLAp9LHsKCS8qIFBoaWxpcCBCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+ICovCgkubmFtZSAgICAgICAgICAgPSAiQWN0aXZlIEltYWdpbmcgQUlNTVMiLAoJLnZpZGVvX2lucHV0cyAgID0gMSwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm11eHNlbCAgICAgICAgID0geyAyIH0sCgkuZ3Bpb21hc2sgICAgICAgPSAwCn0sewogICAgICAgIC8qIFRvbWFzeiBQeXJhIDxoZWxsZmlyZUBzZWRlei5pcS5wbD4gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQ4NzhQKyAoUmV2LjRDLDhFKSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSA0LAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAxNSwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMTEsIDcsIDEzLCAwfSwgLy8gVFYgYW5kIFJhZGlvIHdpdGggc2FtZSBHUElPICEKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAyNSwKCS5oYXNfcmVtb3RlICAgICA9IDEsCgkvKiBHUElPIHdpcmluZzoKCQlHUElPMDogVTQuQTAgKGhlZjQwNTJidCkKCQlHUElPMTogVTQuQTEKCQlHUElPMjogVTQuQTEgKHNlY29uZCBoZWY0MDUyYnQpCgkJR1BJTzM6IFU0Lm5FTiwgVTUuQTAsIEE1Lm5FTgoJCUdQSU84LTE1OiB2cmQ4NjZiID8KCSAqLwp9LHsKCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OEVaIChjYXB0dXJlIG9ubHkpIExSNTEiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyCQk9IC0xLAoJLnN2aHMJCT0gMiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwgLy8gQVYxLCBBVjIsIFNWSFMsIENWaWQgYWRhcHRlciBvbiBTVkhTCgkucGxsCQk9IFBMTF8yOCwKCS5ub19tc3AzNHh4CT0gMSwKfSx7CgovKiAtLS0tIGNhcmQgMHg0OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBEYXJpdXN6IEtvd2FsZXdza2kgPGRhcmVra0BhdXRvbWV4LnBsPiAqLwoJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCs5QiAoUGxheVRWIFBybyByZXYuOUIgRk0rTklDQU0pIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDNmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCS5hdWRpb211eAk9IHsgMHgwMSwgMHgwMCwgMHgwMywgMHgwMywgMHgwOSwgMHgwMiB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5ub19tc3AzNHh4CT0gMSwKCS5ub190ZGE5ODc1CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSA1LAoJLmF1ZGlvX2hvb2sJPSBwdmJ0ODc4cDliX2F1ZGlvLCAvLyBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgc3RlcmVvCgkuaGFzX3JhZGlvCT0gMSwgIC8vIE5vdGU6IG5vdCBhbGwgY2FyZHMgaGF2ZSByYWRpbwoJLmhhc19yZW1vdGUgICAgID0gMSwKCS8qIEdQSU8gd2lyaW5nOgoJCUdQSU8wOiBBMCBoZWY0MDUyCgkJR1BJTzE6IEExIGhlZjQwNTIKCQlHUElPMzogbkVOIGhlZjQwNTIKCQlHUElPOC0xNTogdnJkODY2YgoJCUdQSU8yMCwyMiwyMzogUjMwLFIyOSxSMjgKCSAqLwp9LHsKCS8qIENsYXkgS3VueiA8Y2t1bnpAbWFpbC5hcmMubmFzYS5nb3Y+ICovCgkvKiB5b3UgbXVzdCBqdW1wZXIgSlA1IGZvciB0aGUgY2FyZCB0byB3b3JrICovCgkubmFtZSAgICAgICAgICAgPSAiU2Vuc29yYXkgMzExIiwKCS52aWRlb19pbnB1dHMgICA9IDUsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSA0LAoJLmdwaW9tYXNrICAgICAgID0gMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CgkvKiBNaWd1ZWwgRnJlaXRhcyA8bWlndWVsQGNldHVjLnB1Yy1yaW8uYnI+ICovCgkubmFtZSAgICAgICAgICAgPSAiUmVtb3RlVmlzaW9uIE1YIChSVjYwNSkiLAoJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkuZ3Bpb21hc2syICAgICAgPSAweDA3ZmYsCgkubXV4c2VsICAgICAgICAgPSB7IDB4MzMsIDB4MTMsIDB4MjMsIDB4NDMsIDB4ZjMsIDB4NzMsIDB4ZTMsIDB4MDMsCgkJCSAgMHhkMywgMHhiMywgMHhjMywgMHg2MywgMHg5MywgMHg1MywgMHg4MywgMHhhMyB9LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS5tdXhzZWxfaG9vayAgICA9IHJ2NjA1X211eHNlbCwKfSx7CiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlBvd2VyY29sb3IgTVRWODc4LyBNVFY4NzhSLyBNVFY4NzhGIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSAzLAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDIsCgkudHVuZXIJCT0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MUM4MDBGLCAgLy8gQml0MC0yOiBBdWRpbyBzZWxlY3QsIDgtMTI6cmVtb3RlIGNvbnRyb2wgMTQ6cmVtb3RlIHZhbGlkIDE1OnJlbW90ZSByZXNldAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMSwgMSwgfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDIsIDQgfSwKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAwLAogICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJLnBsbAkJPSBQTExfMjgsCgkuaGFzX3JhZGlvCT0gMSwKfSx7CgovKiAtLS0tIGNhcmQgMHg0YyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLyogTWFzYWtpIFN1enVraSA8bWFzYWtpQGJ0cmVlLm9yZz4gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQ2Fub3B1cyBXaW5EVlIgUENJIChDT01QQVEgUHJlc2FyaW8gMzUyNEpQLCA1MTEySlApIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSAzLAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MTQwMDA3LAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNCwgMCB9LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKICAgICAgICAuYXVkaW9faG9vayAgICAgPSB3aW5kdnJfYXVkaW8sCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJHcmFuZFRlYyBNdWx0aSBDYXB0dXJlIENhcmQgKEJ0ODc4KSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAogICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDAsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCiAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMCwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkpldHdheSBUVi9DYXB0dXJlIEpXLVRWODc4LUZCSywgS3dvcmxkIEtXLVRWODc4UkYiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMywKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gNywKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwgICAvLyBUdW5lciwgU1ZpZCwgU1ZIUywgU1ZpZCB0byBTVkhTIGNvbm5lY3RvcgogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCAsMCAsNCwgNCw0LDR9LC8vIFllcywgdGhpcyB0dW5lciB1c2VzIHRoZSBzYW1lIGF1ZGlvIG91dHB1dCBmb3IgVFYgYW5kIEZNIHJhZGlvIQoJCQkJCSAgLy8gVGhpcyBjYXJkIGxhY2tzIGV4dGVybmFsIEF1ZGlvIEluLCBzbyB3ZSBtdXRlIGl0IG9uIEV4dC4gJiBJbnQuCgkJCQkJICAvLyBUaGUgUENCIGNhbiB0YWtlIGEgc2J4MTYzNy9zYngxNjczLCB3aXJpbmcgdW5rbm93bi4KCQkJCQkgIC8vIFRoaXMgY2FyZCBsYWNrcyBQQ0kgc3Vic3lzdGVtIElELCBzaWdoLgoJCQkJCSAgLy8gYXVkaW9tdXg9MTogbG93ZXIgdm9sdW1lLCAyKzM6IG11dGUKCQkJCQkgIC8vIGJ0d2luY2FwIHVzZXMgMHg4MDAwMC8weDgwMDAzCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMCwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSA1LCAvLyBTYW1zdW5nIFRDUEE5MDk1UEMyN0EgKEJHK0RLKSwgcGhpbGlwcyBjb21wYXRpYmxlLCB3L0ZNLCBzdGVyZW8gYW5kCgkJCSAgIC8vIHJhZGlvIHNpZ25hbCBzdHJlbmd0aCBpbmRpY2F0b3JzIHdvcmsgZmluZS4KCS5oYXNfcmFkaW8JCT0gMSwKCS8qIEdQSU8gSW5mbzoKCQlHUElPMCwxOiAgIEhFRjQwNTIgQTAsQTEKCQlHUElPMjogICAgIEhFRjQwNTIgbkVOQUJMRQoJCUdQSU8zLTc6ICAgbi5jLgoJCUdQSU84LTEzOiAgSVJEQzM1NyBkYXRhMC01IChkYXRhNiBuLmMuID8pIFtjaGlwIG5vdCBwcmVzZW50IG9uIG15IGNhcmRdCgkJR1BJTzE0LDE1OiA/PwoJCUdQSU8xNi0yMTogbi5jLgoJCUdQSU8yMiwyMzogPz8KCQk/PyAgICAgICA6IG10dThiNTZlcCBtaWNyb2NvbnRyb2xsZXIgZm9yIElSIChHUElPIHdpcmluZyB1bmtub3duKSovCn0sewogICAgICAgIC8qIEFydGh1ciBUZXR6bGFmZi1EZWFzLCBEU1AgRGVzaWduIEx0ZCA8c29mdHdhcmVAZHNwZGVzaWduLmNvbT4gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiRFNQIERlc2lnbiBUQ1ZJREVPIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCiAgICAgICAgLyogLS0tLSBjYXJkIDB4NTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBQVlIiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxLCAxfSwKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKCgkuZ3Bpb21hc2sgICAgICAgPSA3LAoJLmF1ZGlvbXV4ICAgICAgID0gezd9LAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJJT0RBVEEgR1YtQkNUVjUvUENJIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDBmMGY4MCwKCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAxLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsweDAzMDAwMCwgMHgwMTAwMDAsIDAsIDAsIDB4MDIwMDAwLCAwfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKCS5hdWRpb19ob29rICAgICA9IGd2YmN0djVwY2lfYXVkaW8sCgkuaGFzX3JhZGlvICAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAwLzE1MCAoODc4KSIsIC8qIDB4MSgyfDMpLTQ1QzYtQzEgKi8KCS52aWRlb19pbnB1dHMgICA9IDQsICAgICAgICAgICAgICAgICAgLyogaWQtaW5wdXRzLWNsb2NrICovCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAzLAoJLm11eHNlbCAgICAgICAgID0geyAzLCAyLCAwLCAxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMC8xNTAgKDg0OCkiLCAvKiAweDA0LTU0QzAtQzEgJiBvbGRlciBib2FyZHMgKi8KCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgoJLyogLS0tLSBjYXJkIDB4NTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEgKDg0OCkiLCAvKiAweDA1LTQwQzAtQzEgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAzLCAxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMS8xNTEiLCAgICAgICAvKiAweDEoNHw1KS0wMDA0LUM0ICovCgkudmlkZW9faW5wdXRzICAgPSAxLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkubXV4c2VsICAgICAgICAgPSB7IDAgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAxLzE1MSB3LyBzdmlkIiwgIC8qIDB4KDE2fDE3fDIwKS0wMEM0LUMxICovCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMCwgMSB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMDAvMjAxLzI1MC8yNTEiLCAgLyogMHgxKDh8OXxFfEYpLTAwMDQtQzQgKi8KCS52aWRlb19pbnB1dHMgICA9IDEsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMCB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewoKCS8qIC0tLS0gY2FyZCAweDU4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjAwLzI1MCIsICAgLyogMHgxKEF8QiktMDBDNC1DMSAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDAsIDEgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjEwLzIyMCIsICAgLyogMHgxKEF8QiktMDRDMC1DMSAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgNTAwIiwgICAvKiA1MDAgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CiAgICAgICAubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDU0MCIsICAgLyogNTQwICovCiAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAojaWYgMCAvKiBUT0RPIC4uLiAqLwogICAgICAgLnN2aHMgICAgICAgICAgID0gT1NQUkVZNTQwX1NWSURfQU5BTE9HLAogICAgICAgLm11eHNlbCAgICAgICAgID0geyAgICAgICBbT1NQUkVZNTQwX0NPTVBfQU5BTE9HXSA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbT1NQUkVZNTQwX1NWSURfQU5BTE9HXSA9IDMsIH0sCiNlbmRpZgogICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCiNpZiAwIC8qIFRPRE8gLi4uICovCiAgICAgICAubXV4c2VsX2hvb2sgICAgPSBvc3ByZXlfNTQwX211eHNlbCwKICAgICAgIC5waWN0dXJlX2hvb2sgICA9IG9zcHJleV81NDBfc2V0X3BpY3R1cmUsCiNlbmRpZgp9LHsKCgkvKiAtLS0tIGNhcmQgMHg1QyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMDAiLCAgLyogMjAwMCAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLCAgICAgIC8qIG11c3QgYXZvaWQsIGNvbmZsaWN0cyB3aXRoIHRoZSBidDg2MCAqLwp9LHsKCS8qIE0gRyBCZXJiZXJpY2ggPGJlcmJlcmljQGZvcndpc3MudW5pLXBhc3NhdS5kZT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJJRFMgRWFnbGUiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm11eHNlbCAgICAgICAgID0geyAwLCAxLCAyLCAzIH0sCgkubXV4c2VsX2hvb2sgICAgPSBlYWdsZV9tdXhzZWwsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgUENUViBTYXQiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5ncGlvbWFzayAgICAgICA9IDB4MDEsCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDEgfSwKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMCwgMSwgMn0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm5vX2dwaW9pcnEgICAgID0gMSwKCS5oYXNfZHZiICAgICAgICA9IDEsCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJGb3JtYWMgUHJvVFYgSUkgKGJ0ODc4KSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMywKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAyLAoJLy8gVFYsIENvbXAxLCBDb21wb3NpdGUgb3ZlciBTVklEIGNvbiwgU1ZJRAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCiAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAyLCAyLCAwLCAwLCAwIH0sCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLmhhc19yYWRpbyAgICAgID0gMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKICAgICAgLyogc291bmQgcm91dGluZzoKICAgICAgICAgICBHUElPPTB4MDAsMHgwMSwweDAzOiBtdXRlICg/KQogICAgICAgICAgICAgIDB4MDI6IGJvdGggVFYgYW5kIHJhZGlvICh0dW5lcjogRk0xMjE2L0kpCiAgICAgICAgIFRoZSBjYXJkIGhhcyBvbmJvYXJkIGF1ZGlvIGNvbm5lY3RvcnMgbGFiZWxlZCAiY2Ryb20iIGFuZCAiYm9hcmQiLAoJIG5vdCBzb2xkZXJlZCBoZXJlLCB0aG91Z2ggdW5rbm93biB3aXJpbmcuCiAgICAgICAgIENhcmQgbGFja3M6IGV4dGVybmFsIGF1ZGlvIGluLCBwY2kgc3Vic3lzdGVtIGlkLgogICAgICAgKi8KfSx7CgoJLyogLS0tLSBjYXJkIDB4NjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIk1hY2hUViIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gNywKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNH0sCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSA1LAoJLnBsbCAgICAgICAgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8iLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkvKiBMdWMgVmFuIEhvZXlsYW5kdCA8bHVjQGUtbWFnaWMuYmU+ICovCgkubmFtZSAgICAgICAgICAgPSAiUHJvVmlkZW8gUFYxNTAiLCAvKiAweDRmICovCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLyogSGlyb3NoaSBUYWtla2F3YSA8c2lhbkBiaWcub3IuanA+ICovCgkvKiBUaGlzIGNhcmQgbGFja3Mgc3Vic3lzdGVtIElEICovCgkubmFtZSAgICAgICAgICAgPSAiQUQtVFZLNTAzIiwgLyogMHg2MyAqLwoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MDAxZTgwMDcsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCS8qICAgICAgICAgICAgICAgICAgVHVuZXIsIFJhZGlvLCBleHRlcm5hbCwgaW50ZXJuYWwsIG9mZiwgIG9uICovCgkuYXVkaW9tdXggICAgICAgPSB7IDB4MDgsICAweDBmLCAgMHgwYSwgICAgIDB4MDgsICAgICAweDBmLCAweDA4IH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IDIsCgkuYXVkaW9faG9vawk9IGFkdHZrNTAzX2F1ZGlvLAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg2NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkhlcmN1bGVzIFNtYXJ0IFRWIFN0ZXJlbyIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDAwLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNSwKCS8qIE5vdGVzOgoJICAgLSBjYXJkIGxhY2tzIHN1YnN5c3RlbSBJRAoJICAgLSBzdGVyZW8gdmFyaWFudCB3LyBkYXVnaHRlciBib2FyZCB3aXRoIHRkYTk4NzRhIEAweGIwCgkgICAtIEF1ZGlvIFJvdXRpbmc6CgkJYWx3YXlzIGZyb20gdGRhOTg3NCBpbmRlcGVuZGVudCBvZiBHUElPICg/KQoJCWV4dGVybmFsIGxpbmUgaW46IHVua25vd24KCSAgIC0gT3RoZXIgY2hpcHM6IGVtNzhwMTU2ZWxwIEAgMHg5NiAocHJvYmFibHkgSVIgcmVtb3RlIGNvbnRyb2wpCgkgICAgICAgICAgICAgIGhlZjQwNTMgKGluc3RlYWQgNDA1MikgZm9yIHVua25vd24gZnVuY3Rpb24KCSovCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJQYWNlIFRWICYgUmFkaW8gQ2FyZCIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LCAvLyBUdW5lciwgQ1ZpZCwgU1ZpZCwgQ1ZpZCBvdmVyIFNWaWQgY29ubmVjdG9yCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMCwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gMSwKICAgICAgICAuaGFzX3JhZGlvICAgICAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAvKiBCdDg3OCwgQnQ4MzIsIEZJMTI0NiB0dW5lcjsgbm8gcGNpIHN1YnN5c3RlbSBpZAogICAgICAgICAgIG9ubHkgaW50ZXJuYWwgbGluZSBvdXQ6ICg0cGluIGhlYWRlcikgUkdHTAogICAgICAgICAgIFJhZGlvIG11c3QgYmUgZGVjb2RlZCBieSBtc3AzNDEwZCAobm90IHJvdXRlZCB0aHJvdWdoKSovCiAgICAgICAgLy8gICAgICAgICAuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLCAvLyB0b2RvIQp9LHsKICAgICAgICAvKiBDaHJpcyBXaWxsaW5nIDxjaHJpc0B2aXNsYWIudXN5ZC5lZHUuYXU+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIklWQy0yMDAiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDEsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGRmLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiB9LAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiR3JhbmQgWC1HdWFyZCAvIFRydXN0IDgxNFBDSSIsCgkudmlkZW9faW5wdXRzICAgPSAxNiwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAogICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAoJLnR1bmVyX3R5cGUgICAgID0gNCwKICAgICAgICAuZ3Bpb21hc2syICAgICAgPSAweGZmLAoJLm11eHNlbCAgICAgICAgID0geyAyLDIsMiwyLCAzLDMsMywzLCAxLDEsMSwxLCAwLDAsMCwwIH0sCgkubXV4c2VsX2hvb2sgICAgPSB4Z3VhcmRfbXV4c2VsLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgoJLyogLS0tLSBjYXJkIDB4NjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIk5lYnVsYSBFbGVjdHJvbmljcyBEaWdpVFYiLAoJLnZpZGVvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLmhhc19kdmIgICAgICAgID0gMSwKCS5ub19ncGlvaXJxICAgICA9IDEsCn0sewoJLyogSm9yZ2UgQm9uY29tcHRlIC0gRFRJMiA8am9yZ2VAZHRpMi5uZXQ+ICovCgkubmFtZSAgICAgICAgICAgPSAiUHJvVmlkZW8gUFYxNDMiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAwLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCB9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLyogTS5LbGFockBwaHl0ZWMuZGUgKi8KCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5LVgxIE1pbmlESU4gKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJLnN2aHMgICAgICAgICAgID0gMywKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDktWDEgQ29tYmkgKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJLnN2aHMgICAgICAgICAgID0gMywKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoKCS8qIC0tLS0gY2FyZCAweDZjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5IE1pbmlESU4gKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzICAgPSAxMCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCS5zdmhzICAgICAgICAgICA9IDksCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJLmdwaW9tYXNrMiAgICAgID0gMHgwMywgLyogZ3Bpb21hc2syIGRlZmluZXMgdGhlIGJpdHMgdXNlZCB0byBzd2l0Y2ggYXVkaW8KCQkJCSAgIHZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKCQkJCSAgIHh0ZXJuYWwgdmlkZW8tbXV4ICovCgkubXV4c2VsICAgICAgICAgPSB7IDB4MDIsIDB4MTIsIDB4MjIsIDB4MzIsIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4MDEsIDB4MDAgfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5IENvbWJpIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cyAgID0gMTAsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkuc3ZocyAgICAgICAgICAgPSA5LAoJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCS5ncGlvbWFzazIgICAgICA9IDB4MDMsIC8qIGdwaW9tYXNrMiBkZWZpbmVzIHRoZSBiaXRzIHVzZWQgdG8gc3dpdGNoIGF1ZGlvCgkJCQkgICB2aWEgdGhlIHVwcGVyIG5pYmJsZSBvZiBtdXhzZWwuIGhlcmU6IHVzZWQgZm9yCgkJCQkgICB4dGVybmFsIHZpZGVvLW11eCAqLwoJLm11eHNlbCAgICAgICAgID0geyAweDAyLCAweDEyLCAweDIyLCAweDMyLCAweDAzLCAweDEzLCAweDIzLCAweDMzLCAweDAxLCAweDAxIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCS5uZWVkc190dmF1ZGlvICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIklWQy0xMDAiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGRmLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkvKiBJVkMtMTIwRyAtIEFsYW4gR2FyZmllbGQgPGFsYW5AZnJvbW9yYml0LmNvbT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJJVkMtMTIwRyIsCgkudmlkZW9faW5wdXRzICAgPSAxNiwKCS5hdWRpb19pbnB1dHMgICA9IDAsICAgIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkudHVuZXIgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyBzdmhzICovCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKCQkJICAgIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAgfSwKCS5tdXhzZWxfaG9vayAgICA9IGl2YzEyMF9tdXhzZWwsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoKCS8qIC0tLS0gY2FyZCAweDcwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJwY0hEVFYgSEQtMjAwMCBUViIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfQVRTQywKCS5oYXNfZHZiICAgICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIlR3aW5oYW4gRFNUICsgY2xvbmVzIiwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKCS5ub192aWRlbyAgICAgICA9IDEsCgkuaGFzX2R2YiAgICAgICAgPSAxLAp9LHsKICAgICAgICAubmFtZSAgICAgICAgICAgPSAiV2luZmFzdCBWQzEwMCIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwgLy8gbm8gdHVuZXIKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSwgMSwgM30sIC8vIFZpZCBJbiwgU1ZpZCBJbiwgVmlkIG92ZXIgU1ZpZCBpbiBjb25uZWN0b3IKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCiAgICAgICAgLm5vX3ZpZGVvICAgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiVGVwcHJvIFRFVi01NjAvSW50ZXJWaXNpb24gSVYtNTYwIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAzLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eCAgICAgICA9IHsgMSwgMSwgMSwgMSwgMH0sCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkucGxsICAgICAgICAgICAgPSBQTExfMzUsCn0sewoKCS8qIC0tLS0gY2FyZCAweDc0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiU0lNVVMgR1ZDMTEwMCIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAogICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAogICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDJ9LAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4M0YsCgkubXV4c2VsX2hvb2sgICAgPSBndmMxMTAwX211eHNlbCwKfSx7CiAgICAgICAgLyogQ2FybG9zIFNpbHZhIHIzcGVrQHIzcGVrLmhvbWVsaW51eC5vcmcgfHwgY2FyZCAweDc1ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIk5HUyBOR1NUVisiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7MCwgMCwgMCwgMCwgMHgwMDAwMDMsIDB9LAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKICAgICAgICAuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKICAgICAgICAvKiBodHRwOi8vbGludXhtZWRpYWxhYnMuY29tICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkxNTEJUNCIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwgLyogSU4xLElOMixJTjMsSU40ICovCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAwLAp9LHsKCS8qIEhlbG1yb29zIEhhcnJpIDxoYXJyaS5oZWxtcm9vc0BwcC5pbmV0LmZpPiAqLwoJLm5hbWUgICAgICAgICAgID0gIlRla3JhbSBNMjA1IFBSTyIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLmdwaW9tYXNrICAgICAgID0gMHg2OCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDB4NjgsIDB4NjgsIDB4NjEsIDB4NjEsIDB4MDAgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgoJLyogLS0tLSBjYXJkIDB4NzggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogSmF2aWVyIENlbmRhbiBBcmVzIDxqY2VuZGFuQGx5Y29zLmVzPiAqLwoJLyogYnQ4NzggVFYgKyBGTSB3aXRob3V0IHN1YnN5c3RlbSBJRCAqLwoJLm5hbWUgICAgICAgICAgID0gIkNvbmNlcHRyb25pYyBDT05UVkZNaSIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMiwgMyB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJLmhhc19yZW1vdGUgICAgID0gMSwKCS5oYXNfcmFkaW8gICAgICA9IDEsCn0sewoJLypFcmljIERFQklFRiA8ZGViaWVmQHRlbGVtc2EuY29tPiovCgkvKkVVUkVTWVMgUGljb2xvIFRldHJhIDogNCBDb25leGFudCBGdXNpb24gODc4QSwgbm8gYXVkaW8sIHZpZGVvIGlucHV0IHNldCB3aXRoIGFuYWxvZyBtdWx0aXBsZXhlcnMgR1BJTyBjb250cm9sZWQqLwoJLyogYWRkcyBwaWNvbG9fdGV0cmFfbXV4c2VsKCksIHBpY29sb190ZXRyYV9pbml0KCksIHRoZSBmb2xvd2luZyBkZWNsYXJhdGlvbiBzdHJ1Y3VyZSwgYW5kICNkZWZpbmUgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCovCgkvKjB4NzkgaW4gYnR0di5oKi8KCS5uYW1lICAgICAgICAgICA9ICJFdXJlc3lzIFBpY29sbyBUZXRyYSIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLmdwaW9tYXNrMiAgICAgID0gMHgzQzw8MTYsLypTZXQgdGhlIEdQSU9bMThdLT5HUElPWzIxXSBhcyBvdXRwdXQgcGluLj09PiBkcml2ZSB0aGUgdmlkZW8gaW5wdXRzIHRocm91Z2ggYW5hbG9nIG11bHRpcGxleGVycyovCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7MiwyLDIsMn0sLyo4NzhBIGlucHV0IGlzIGFsd2F5cyBNVVgwLCBzZWUgYWJvdmUuKi8KCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5tdXhzZWxfaG9vayAgICA9IHBpY29sb190ZXRyYV9tdXhzZWwsLypSZXF1aXJlZCBhcyBpdCBkb2Vzbid0IGZvbGxvdyB0aGUgY2xhc3NpYyBpbnB1dCBzZWxlY3Rpb24gcG9saWN5Ki8KfSx7CgkvKiBTcGlyaXQgVFYgVHVuZXIgZnJvbSBodHRwOi8vc3Bpcml0bW9kZW1zLmNvbS5hdSAqLwoJLyogU3RhZmZvcmQgR29vZHNlbGwgPHN1cmdlQGdvbGlhdGguaG9tZXVuaXgub3JnPiAqLwoJLm5hbWUgICAgICAgICAgID0gIlNwaXJpdCBUViBUdW5lciIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMDAwMDAwZiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMSwgMSB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAp9LHsKCS8qIFdvbGZyYW0gSm9vc3QgPHdvam9AZnJva2FzY2h3ZWkuZGU+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFWZXJNZWRpYSBBVmVyVFYgRFZCLVQgNzcxIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSAyLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDEsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMyAsIDMgfSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLmhhc19kdmIgICAgICAgID0gMSwKICAgICAgICAubm9fZ3Bpb2lycSAgICAgPSAxLAogICAgICAgIC5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLyogLS0tLSBjYXJkIDB4N2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogTWF0dCBKZXNzb24gPGR2YkBqZXNzb24uZWNsaXBzZS5jby51az4gKi8KCS8qIEJhc2VkIG9uIHRoZSBOZWJ1bGEgY2FyZCBkYXRhIC0gYWRkZWQgcmVtb3RlIGFuZCBuZXcgY2FyZCBudW1iZXIgLSBCVFRWX0FWRFZCVF83NjEsIHNlZSBhbHNvIGlyLWtiZC1ncGlvLmMgKi8KCS5uYW1lICAgICAgICAgICA9ICJBdmVyTWVkaWEgQXZlclRWIERWQi1UIDc2MSIsCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAzLCAxLCAyLCAwfSwgLyogQ29tcDAsIFMtVmlkZW8sID8sID8gKi8KCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLmhhc19kdmIgICAgICAgID0gMSwKCS5ub19ncGlvaXJxICAgICA9IDEsCgkuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKCS8qIGFuZHJlLnNjaHdhcnpAbWF0cml4LXZpc2lvbi5kZSAqLwoJLm5hbWUgICAgICAgICAgICAgPSAiTUFUUklYIFZpc2lvbiBTaWdtYS1TUSIsCgkudmlkZW9faW5wdXRzICAgICA9IDE2LAoJLmF1ZGlvX2lucHV0cyAgICAgPSAwLAoJLnR1bmVyICAgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgICA9IDB4MCwKCS5tdXhzZWwgICAgICAgICAgID0geyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAoJCQkgICAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCgkubXV4c2VsX2hvb2sgICAgICA9IHNpZ21hU1FfbXV4c2VsLAoJLmF1ZGlvbXV4ICAgICAgICAgPSB7IDAgfSwKCS5ub19tc3AzNHh4ICAgICAgID0gMSwKCS5wbGwgICAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgICAgPSAtMSwKfSx7CgkvKiBhbmRyZS5zY2h3YXJ6QG1hdHJpeC12aXNpb24uZGUgKi8KCS5uYW1lICAgICAgICAgICAgID0gIk1BVFJJWCBWaXNpb24gU2lnbWEtU0xDIiwKCS52aWRlb19pbnB1dHMgICAgID0gNCwKCS5hdWRpb19pbnB1dHMgICAgID0gMCwKCS50dW5lciAgICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgICA9IC0xLAoJLmdwaW9tYXNrICAgICAgICAgPSAweDAsCgkubXV4c2VsICAgICAgICAgICA9IHsgMiwgMiwgMiwgMiB9LAoJLm11eHNlbF9ob29rICAgICAgPSBzaWdtYVNMQ19tdXhzZWwsCgkuYXVkaW9tdXggICAgICAgICA9IHsgMCB9LAoJLm5vX21zcDM0eHggICAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgICA9IC0xLAp9LHsKCS8qIEJUVFZfQVBBQ19WSUVXQ09NUCAqLwoJLyogQXR0aWxhIEtvbmRvcm9zIDxhdHRpbGEua29uZG9yb3NAY2hlbGxvLmh1PiAqLwoJLyogYnQ4NzggVFYgKyBGTSAweDAwMDAwMDAwIHN1YnN5c3RlbSBJRCAqLwoJLm5hbWUgICAgICAgICAgID0gIkFQQUMgVmlld2NvbXAgODc4KEFNQVgpIiwKCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLmdwaW9tYXNrICAgICAgID0gMHhGRiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5oYXNfcmVtb3RlICAgICA9IDEsICAgLyogbWluaXJlbW90ZSB3b3Jrcywgc2VlIGlyLWtiZC1ncGlvLmMgKi8KCS5oYXNfcmFkaW8gICAgICA9IDEsICAgLyogbm90IGV2ZXJ5IGNhcmQgaGFzIHJhZGlvICovCn0sewoKCS8qIC0tLS0gY2FyZCAweDgwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIENocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+ICovCgkubmFtZSAgICAgICAgICAgPSAiRFZJQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm5vX3ZpZGVvICAgICAgID0gMSwKCS5oYXNfZHZiICAgICAgICA9IDEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CgkvKiBTdGV2ZW4gPHBob3RvbjM4QHBjaG9tZS5jb20udHc+ICovCgkubmFtZSAgICAgICAgICAgPSAiVi1HZWFyIE15VkNEIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDNmLAoJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDEsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0gezB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzF9LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAoJLmhhc19yYWRpbyAgICAgID0gMCwKCS8vIC5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLyogUmljayBDIDxjcnlwdGRyYWdvb25AZ21haWwuY29tPiAqLwogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJTdXBlciBUViBUdW5lciIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDB4MDAwMDAxLDAsMCwgMH0sCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKICAgICAgICAuaGFzX3JhZGlvICAgICAgPSAxLAp9LHsKCQkvKiBDaHJpcyBGYW5uaW5nIDx2aWRlbzRsaW51eEBoYXlkb24ubmV0PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJUaWJldCBTeXN0ZW1zICdQcm9ncmVzcyBEVlInIENTMTYiLAoJCS52aWRlb19pbnB1dHMgICA9IDE2LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyIH0sCgkJLnBsbAkJPSBQTExfMjgsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyCT0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkubXV4c2VsX2hvb2sgICAgPSB0aWJldENTMTZfbXV4c2VsLAp9LAp7CgkvKiBCaWxsIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4gKi8KCS8qCgkgKiBOb3RlIHRoYXQsIGJlY2F1c2Ugb2YgdGhlIGNhcmQncyB3aXJpbmcsIHRoZSAibWFzdGVyIgoJICogQlQ4NzhBIGNoaXAgKGkuZS4gdGhlIG9uZSB3aGljaCBjb250cm9scyB0aGUgYW5hbG9nIHN3aXRjaAoJICogYW5kIG11c3QgdXNlIHRoaXMgY2FyZCB0eXBlKSBpcyB0aGUgMm5kIG9uZSBkZXRlY3RlZC4gIFRoZQoJICogb3RoZXIgMyBjaGlwcyBzaG91bGQgdXNlIGNhcmQgdHlwZSAweDg1LCB3aG9zZSBkZXNjcmlwdGlvbgoJICogZm9sbG93cyB0aGlzIG9uZS4gIFRoZXJlIGlzIGEgRUVQUk9NIG9uIHRoZSBjYXJkICh3aGljaCBpcwoJICogY29ubmVjdGVkIHRvIHRoZSBJMkMgb2Ygb25lIG9mIHRob3NlIG90aGVyIGNoaXBzKSwgYnV0IGlzCgkgKiBub3QgY3VycmVudGx5IGhhbmRsZWQuICBUaGVyZSBpcyBhbHNvIGEgZmFjaWxpdHkgZm9yIGEKCSAqICJtb25pdG9yIiwgd2hpY2ggaXMgYWxzbyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgoJICovCgkubmFtZQkJPSAiS29kaWNvbSA0NDAwUiAobWFzdGVyKSIsCgkudmlkZW9faW5wdXRzCT0gMTYsCgkuYXVkaW9faW5wdXRzCT0gMCwKCS50dW5lcgkJPSAtMSwKCS50dW5lcl90eXBlCT0gLTEsCgkuc3ZocwkJPSAtMSwKCS8qIEdQSU8gYml0cyAwLTkgdXNlZCBmb3IgYW5hbG9nIHN3aXRjaDoKCSAqICAgMDAgLSAwMzoJY2FtZXJhIHNlbGVjdG9yCgkgKiAgIDA0IC0gMDY6CWNoYW5uZWwgKGNvbnRyb2xsZXIpIHNlbGVjdG9yCgkgKiAgIDA3OglkYXRhICgxLT5vbiwgMC0+b2ZmKQoJICogICAwODoJc3Ryb2JlCgkgKiAgIDA5OglyZXNldAoJICogYml0IDE2IGlzIGlucHV0IGZyb20gc3luYyBzZXBhcmF0b3IgZm9yIHRoZSBjaGFubmVsCgkgKi8KCS5ncGlvbWFzawk9IDB4MDAwM2ZmLAoJLm5vX2dwaW9pcnEgICAgID0gMSwKCS5tdXhzZWwJCT0geyAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCgkucGxsCQk9IFBMTF8yOCwKCS5ub19tc3AzNHh4CT0gMSwKCS5ub190ZGE3NDMyCT0gMSwKCS5ub190ZGE5ODc1CT0gMSwKCS5tdXhzZWxfaG9vawk9IGtvZGljb200NDAwcl9tdXhzZWwsCn0sCnsKCS8qIEJpbGwgQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPiAqLwoJLyogTm90ZSB0aGF0LCBmb3IgcmVhc29ucyB1bmtub3duLCB0aGUgIm1hc3RlciIgQlQ4NzhBIGNoaXAgKGkuZS4gdGhlCgkgKiBvbmUgd2hpY2ggY29udHJvbHMgdGhlIGFuYWxvZyBzd2l0Y2gsIGFuZCBtdXN0IHVzZSB0aGUgY2FyZCB0eXBlKQoJICogaXMgdGhlIDJuZCBvbmUgZGV0ZWN0ZWQuICBUaGUgb3RoZXIgMyBjaGlwcyBzaG91bGQgdXNlIHRoaXMgY2FyZAoJICogdHlwZQoJICovCgkubmFtZQkJPSAiS29kaWNvbSA0NDAwUiAoc2xhdmUpIiwKCS52aWRlb19pbnB1dHMJPSAxNiwKCS5hdWRpb19pbnB1dHMJPSAwLAoJLnR1bmVyCQk9IC0xLAoJLnR1bmVyX3R5cGUJPSAtMSwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrCT0gMHgwMTAwMDAsCgkubm9fZ3Bpb2lycSAgICAgPSAxLAoJLm11eHNlbAkJPSB7IDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKCS5wbGwJCT0gUExMXzI4LAoJLm5vX21zcDM0eHgJPSAxLAoJLm5vX3RkYTc0MzIJPSAxLAoJLm5vX3RkYTk4NzUJPSAxLAoJLm11eHNlbF9ob29rCT0ga29kaWNvbTQ0MDByX211eHNlbCwKfX07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGJ0dHZfbnVtX3R2Y2FyZHMgPSBBUlJBWV9TSVpFKGJ0dHZfdHZjYXJkcyk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XTsKCi8qCiAqIGlkZW50aWZ5IGNhcmQKICovCnZvaWQgX19kZXZpbml0IGJ0dHZfaWRjYXJkKHN0cnVjdCBidHR2ICpidHYpCnsKCXVuc2lnbmVkIGludCBncGlvYml0czsKCWludCBpLHR5cGU7Cgl1bnNpZ25lZCBzaG9ydCB0bXA7CgoJLyogcmVhZCBQQ0kgc3Vic3lzdGVtIElEICovCglwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmdG1wKTsKCWJ0di0+Y2FyZGlkID0gdG1wIDw8IDE2OwoJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnR2LT5jLnBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZ0bXApOwoJYnR2LT5jYXJkaWQgfD0gdG1wOwoKCWlmICgwICE9IGJ0di0+Y2FyZGlkICYmIDB4ZmZmZmZmZmYgIT0gYnR2LT5jYXJkaWQpIHsKCQkvKiBsb29rIGZvciB0aGUgY2FyZCAqLwoJCWZvciAodHlwZSA9IC0xLCBpID0gMDsgY2FyZHNbaV0uaWQgIT0gMDsgaSsrKQoJCQlpZiAoY2FyZHNbaV0uaWQgID09IGJ0di0+Y2FyZGlkKQoJCQkJdHlwZSA9IGk7CgoJCWlmICh0eXBlICE9IC0xKSB7CgkJCS8qIGZvdW5kIGl0ICovCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZGV0ZWN0ZWQ6ICVzIFtjYXJkPSVkXSwgIgoJCQkgICAgICAgIlBDSSBzdWJzeXN0ZW0gSUQgaXMgJTA0eDolMDR4XG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLGNhcmRzW3R5cGVdLm5hbWUsY2FyZHNbdHlwZV0uY2FyZG5yLAoJCQkgICAgICAgYnR2LT5jYXJkaWQgJiAweGZmZmYsCgkJCSAgICAgICAoYnR2LT5jYXJkaWQgPj4gMTYpICYgMHhmZmZmKTsKCQkJYnR2LT5jLnR5cGUgPSBjYXJkc1t0eXBlXS5jYXJkbnI7CgkJfSBlbHNlIHsKCQkJLyogNDA0ICovCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogc3Vic3lzdGVtOiAlMDR4OiUwNHggKFVOS05PV04pXG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLCBidHYtPmNhcmRpZCAmIDB4ZmZmZiwKCQkJICAgICAgIChidHYtPmNhcmRpZCA+PiAxNikgJiAweGZmZmYpOwoJCQlwcmludGsoS0VSTl9ERUJVRyAicGxlYXNlIG1haWwgaWQsIGJvYXJkIG5hbWUgYW5kICIKCQkJICAgICAgICJ0aGUgY29ycmVjdCBjYXJkPSBpbnNtb2Qgb3B0aW9uIHRvIGtyYXhlbEBieXRlc2V4Lm9yZ1xuIik7CgkJfQoJfQoKCS8qIGxldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgYXV0b2RldGVjdGVkIHR5cGUgKi8KCWlmIChjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzKQoJCWJ0di0+Yy50eXBlPWNhcmRbYnR2LT5jLm5yXTsKCgkvKiBwcmludCB3aGljaCBjYXJkIGNvbmZpZyB3ZSBhcmUgdXNpbmcgKi8KCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogdXNpbmc6ICVzIFtjYXJkPSVkLCVzXVxuIixidHYtPmMubnIsCgkgICAgICAgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLCBidHYtPmMudHlwZSwKCSAgICAgICBjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzCgkgICAgICAgPyAiaW5zbW9kIG9wdGlvbiIgOiAiYXV0b2RldGVjdGVkIik7CgoJLyogb3ZlcndyaXRlIGdwaW8gc3R1ZmYgPz8gKi8KCWlmIChVTlNFVCA9PSBhdWRpb2FsbCAmJiBVTlNFVCA9PSBhdWRpb211eFswXSkKCQlyZXR1cm47CgoJaWYgKFVOU0VUICE9IGF1ZGlvbXV4WzBdKSB7CgkJZ3Bpb2JpdHMgPSAwOwoJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKCQkJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb211eFtpXSA9IGF1ZGlvbXV4W2ldOwoJCQlncGlvYml0cyB8PSBhdWRpb211eFtpXTsKCQl9Cgl9IGVsc2UgewoJCWdwaW9iaXRzID0gYXVkaW9hbGw7CgkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2ldID0gYXVkaW9hbGw7CgkJfQoJfQoJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayA9IChVTlNFVCAhPSBncGlvbWFzaykgPyBncGlvbWFzayA6IGdwaW9iaXRzOwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBncGlvIGNvbmZpZyBvdmVycmlkZTogbWFzaz0weCV4LCBtdXg9IiwKCSAgICAgICBidHYtPmMubnIsYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayk7Cglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CgkJcHJpbnRrKCIlczB4JXgiLCBpID8gIiwiIDogIiIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbaV0pOwoJfQoJcHJpbnRrKCJcbiIpOwp9CgovKgogKiAobW9zdCkgYm9hcmQgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb25zIGdvZXMgaGVyZQogKi8KCi8qIFNvbWUgTW9kdWxhciBUZWNobm9sb2d5IGNhcmRzIGhhdmUgYW4gZWVwcm9tLCBidXQgbm8gc3Vic3lzdGVtIElEICovCnZvaWQgaWRlbnRpZnlfYnlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XSkKewoJaW50IHR5cGUgPSAtMTsKCglpZiAoMCA9PSBzdHJuY21wKGVlcHJvbV9kYXRhLCJHRVQgTU0yMHhQQ1RWIiwxMykpCgkJdHlwZSA9IEJUVFZfTU9EVEVDXzIwNTsKCWVsc2UgaWYgKDAgPT0gc3RybmNtcChlZXByb21fZGF0YSsyMCwiUGljb2xvIiw3KSkKCQl0eXBlID0gQlRUVl9FVVJFU1lTX1BJQ09MTzsKCWVsc2UgaWYgKGVlcHJvbV9kYXRhWzBdID09IDB4ODQgJiYgZWVwcm9tX2RhdGFbMl09PSAwKQogICAgICAgICAgICAgICAgdHlwZSA9IEJUVFZfSEFVUFBBVUdFOyAvKiBvbGQgYnQ4NDggKi8KCglpZiAoLTEgIT0gdHlwZSkgewoJCWJ0di0+Yy50eXBlID0gdHlwZTsKCQlwcmludGsoImJ0dHYlZDogZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlcyBbY2FyZD0lZF1cbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLCBidHYtPmMudHlwZSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGZseXZpZGVvX2dwaW8oc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IGdwaW8saGFzX3JlbW90ZSxoYXNfcmFkaW8saXNfY2FwdHVyZV9vbmx5LGlzX2xyOTAsaGFzX3RkYTk4MjBfdGRhOTgyMTsKCWludCB0dW5lcj0tMSx0dHlwZTsKCglncGlvX2lub3V0KDB4ZmZmZmZmLCAwKTsKCXVkZWxheSg4KTsgIC8vIHdpdGhvdXQgdGhpcyB3ZSB3b3VsZCBzZWUgdGhlIDB4MTgwMCBtYXNrCglncGlvID0gZ3Bpb19yZWFkKCk7CgkvKiBGSVhNRTogbXVzdCByZXN0b3JlIE9VUl9FTiA/Pz8gKi8KCgkvLyBhbGwgY2FyZHMgcHJvdmlkZSBHUElPIGluZm8sIHNvbWUgaGF2ZSBhbiBhZGRpdGlvbmFsIGVlcHJvbQoJLy8gTFI1MDogR1BJTyBjb2RpbmcgY2FuIGJlIGZvdW5kIGxvd2VyIHJpZ2h0IENQMSAuLiBDUDkKCS8vICAgICAgIENQOT1HUElPMjMgLi4gQ1AxPUdQSU8xNTsgd2hlbiBPUEVOLCB0aGUgY29ycmVzcG9uZGluZyBHUElPIHJlYWRzIDEuCgkvLyAgICAgICBHUElPMTQtMTI6IG4uYy4KCS8vIExSOTA6IEdQOT1HUElPMjMgLi4gR1AxPUdQSU8xNSAocmlnaHQgYWJvdmUgdGhlIGJ0ODc4KQoKCS8vIGxvd2VzdCAzIGJ5dGVzIGFyZSByZW1vdGUgY29udHJvbCBjb2RlcyAobm8gaGFuZHNoYWtlIG5lZWRlZCkKICAgICAgICAvLyB4eHhGRkY6IE5vIHJlbW90ZSBjb250cm9sIGNoaXAgc29sZGVyZWQKICAgICAgICAvLyB4eHhGMDAoTFIyNi9MUjUwKSwgeHh4RkUwKExSOTApOiBSZW1vdGUgY29udHJvbCBjaGlwIChMVkEwMDEgb3IgQ0Y0NSkgc29sZGVyZWQKCS8vIE5vdGU6IFNvbWUgYml0cyBhcmUgQXVkaW9fTWFzayAhCgoJdHR5cGU9KGdwaW8mMHgwZjAwMDApPj4xNjsKCXN3aXRjaCh0dHlwZSkgewoJY2FzZSAweDA6IHR1bmVyPTI7IC8vIE5UU0MsIGUuZy4gVFBJOE5TUjExUAoJCWJyZWFrOwogICAgICAgIGNhc2UgMHgyOiB0dW5lcj0zOTsvLyBMRyBOVFNDIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1INzAxUAoJCWJyZWFrOwoJY2FzZSAweDQ6IHR1bmVyPTU7IC8vIFBoaWxpcHMgUEFMIFRQSThQU0IwMlAsIFRQSThQU0IxMlAsIFRQSThQU0IxMkQgb3IgRkkxMjE2LCBGTTEyMTYKCQlicmVhazsKCWNhc2UgMHg2OiB0dW5lcj0zNzsgLy8gTEcgUEFMIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1HNzAyUAoJCWJyZWFrOwoJY2FzZSAweEM6IHR1bmVyPTM7IC8vIFBoaWxpcHMgU0VDQU0oK1BBTCkgRlExMjE2TUUgb3IgRkkxMjE2TUYKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlb19ncGlvOiB1bmtub3duIHR1bmVyIHR5cGUuXG4iLCBidHYtPmMubnIpOwoJfQoKCWhhc19yZW1vdGUgICAgICAgICAgPSAgIGdwaW8gJiAweDgwMDAwMDsKCWhhc19yYWRpbwkgICAgPSAgIGdwaW8gJiAweDQwMDAwMDsKCS8vICAgdW5rbm93biAgICAgICAgICAgICAgICAgICAweDIwMDAwMDsKCS8vICAgdW5rbm93bjIgICAgICAgICAgICAgICAgICAweDEwMDAwMDsKICAgICAgICBpc19jYXB0dXJlX29ubHkgICAgID0gIShncGlvICYgMHgwMDgwMDApOyAvL0dQSU8xNQoJaGFzX3RkYTk4MjBfdGRhOTgyMSA9ICEoZ3BpbyAmIDB4MDA0MDAwKTsKCWlzX2xyOTAgICAgICAgICAgICAgPSAhKGdwaW8gJiAweDAwMjAwMCk7IC8vIGVsc2UgTFIyNi9MUjUwIChMUjM4L0xSNTEgZi4gY2FwdHVyZSBvbmx5KQogICAgICAgIC8vCQkgICAgICAgIGdwaW8gJiAweDAwMTAwMCAvLyBvdXRwdXQgYml0IGZvciBhdWRpbyByb3V0aW5nCgoJaWYoaXNfY2FwdHVyZV9vbmx5KQoJCXR1bmVyPTQ7IC8vIE5vIHR1bmVyIHByZXNlbnQKCglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvIFJhZGlvPSVzIFJlbW90ZUNvbnRyb2w9JXMgVHVuZXI9JWQgZ3Bpbz0weCUwNnhcbiIsCgkgICAgICAgYnR2LT5jLm5yLCBoYXNfcmFkaW8/ICJ5ZXMiOiJubyAiLCBoYXNfcmVtb3RlPyAieWVzIjoibm8gIiwgdHVuZXIsIGdwaW8pOwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlbyAgTFI5MD0lcyB0ZGE5ODIxL3RkYTk4MjA9JXMgY2FwdHVyZV9vbmx5PSVzXG4iLAoJCWJ0di0+Yy5uciwgaXNfbHI5MD8ieWVzIjoibm8gIiwgaGFzX3RkYTk4MjBfdGRhOTgyMT8ieWVzIjoibm8gIiwKCQlpc19jYXB0dXJlX29ubHk/InllcyI6Im5vICIpOwoKCWlmKHR1bmVyIT0gLTEpIC8vIG9ubHkgc2V0IGlmIGtub3duIHR1bmVyIGF1dG9kZXRlY3RlZCwgZWxzZSBsZXQgaW5zbW9kIG9wdGlvbiB0aHJvdWdoCgkJYnR2LT50dW5lcl90eXBlID0gdHVuZXI7CglidHYtPmhhc19yYWRpbyA9IGhhc19yYWRpbzsKCgkvLyBMUjkwIEF1ZGlvIFJvdXRpbmcgaXMgZG9uZSBieSAyIGhlZjQwNTIsIHNvIEF1ZGlvX01hc2sgaGFzIDQgYml0czogMHgwMDFjODAKICAgICAgICAvLyBMUjI2L0xSNTAgb25seSBoYXMgMSBoZWY0MDUyLCBBdWRpb19NYXNrIDB4MDAwYzAwCgkvLyBBdWRpbyBvcHRpb25zOiBmcm9tIHR1bmVyLCBmcm9tIHRkYTk4MjEvdGRhOTgyMShtb25vLHN0ZXJlbyxzYXApLCBmcm9tIHRkYTk4NzQsIGV4dC4sIG11dGUKCWlmKGhhc190ZGE5ODIwX3RkYTk4MjEpIGJ0di0+YXVkaW9faG9vayA9IGx0OTQxNV9hdWRpbzsKCS8vdG9kbzogaWYoaGFzX3RkYTk4NzQpIGJ0di0+YXVkaW9faG9vayA9IGZ2MjAwMHNfYXVkaW87Cn0KCnN0YXRpYyBpbnQgbWlyb190dW5lcm1hcFtdID0geyAwLDYsMiwzLCAgIDQsNSw2LDAsICAzLDAsNCw1LCAgNSwyLDE2LDEsCgkJCSAgICAgICAxNCwyLDE3LDEsIDQsMSw0LDMsICAxLDIsMTYsMSwgNCw0LDQsNCB9OwpzdGF0aWMgaW50IG1pcm9fZm10dW5lcltdICA9IHsgMCwwLDAsMCwgICAwLDAsMCwwLCAgMCwwLDAsMCwgIDAsMCwwLDEsCgkJCSAgICAgICAxLDEsMSwxLCAgIDEsMSwxLDAsICAwLDAsMCwwLCAgMCwxLDAsMCB9OwoKc3RhdGljIHZvaWQgbWlyb19waW5uYWNsZV9ncGlvKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCBpZCxtc3AsZ3BpbzsKCWNoYXIgKmluZm87CgoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMCk7CiAgICAgICAgZ3BpbyA9IGdwaW9fcmVhZCgpOwoJaWQgICA9ICgoZ3Bpbz4+MTApICYgNjMpIC0xOwoJbXNwICA9IGJ0dHZfSTJDUmVhZChidHYsIEkyQ19NU1AzNDAwLCAiTVNQMzR4eCIpOwoJaWYgKGlkIDwgMzIpIHsKCQlidHYtPnR1bmVyX3R5cGUgPSBtaXJvX3R1bmVybWFwW2lkXTsKCQlpZiAoMCA9PSAoZ3BpbyAmIDB4MjApKSB7CgkJCWJ0di0+aGFzX3JhZGlvID0gMTsKCQkJaWYgKCFtaXJvX2ZtdHVuZXJbaWRdKSB7CgkJCQlidHYtPmhhc19tYXRjaGJveCA9IDE7CgkJCQlidHYtPm1ib3hfd2UgICAgPSAoMTw8Nik7CgkJCQlidHYtPm1ib3hfbW9zdCAgPSAoMTw8Nyk7CgkJCQlidHYtPm1ib3hfY2xrICAgPSAoMTw8OCk7CgkJCQlidHYtPm1ib3hfZGF0YSAgPSAoMTw8OSk7CgkJCQlidHYtPm1ib3hfbWFzayAgPSAoMTw8Nil8KDE8PDcpfCgxPDw4KXwoMTw8OSk7CgkJCX0KCQl9IGVsc2UgewoJCQlidHYtPmhhc19yYWRpbyA9IDA7CgkJfQoJCWlmICgtMSAhPSBtc3ApIHsKCQkJaWYgKGJ0di0+Yy50eXBlID09IEJUVFZfTUlSTykKCQkJCWJ0di0+Yy50eXBlID0gQlRUVl9NSVJPUFJPOwoJCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9QSU5OQUNMRSkKCQkJCWJ0di0+Yy50eXBlID0gQlRUVl9QSU5OQUNMRVBSTzsKCQl9CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAiYnR0diVkOiBtaXJvOiBpZD0lZCB0dW5lcj0lZCByYWRpbz0lcyBzdGVyZW89JXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgaWQrMSwgYnR2LT50dW5lcl90eXBlLAoJCSAgICAgICAhYnR2LT5oYXNfcmFkaW8gPyAibm8iIDoKCQkgICAgICAgKGJ0di0+aGFzX21hdGNoYm94ID8gIm1hdGNoYm94IiA6ICJmbXR1bmVyIiksCgkJICAgICAgICgtMSA9PSBtc3ApID8gIm5vIiA6ICJ5ZXMiKTsKCX0gZWxzZSB7CgkJLyogbmV3IGNhcmRzIHdpdGggbWljcm90dW5lIHR1bmVyICovCgkJaWQgPSA2MyAtIGlkOwoJCWJ0di0+aGFzX3JhZGlvID0gMDsKCQlzd2l0Y2ggKGlkKSB7CgkJY2FzZSAxOgoJCQlpbmZvID0gIlBBTCAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDI6CgkJCWluZm8gPSAiUEFMK1NFQ0FNIC8gc3RlcmVvIjsKCQkJYnR2LT5oYXNfcmFkaW8gPSAxOwoJCQlicmVhazsKCQljYXNlIDM6CgkJCWluZm8gPSAiTlRTQyAvIHN0ZXJlbyI7CgkJCWJ0di0+aGFzX3JhZGlvID0gMTsKCQkJYnJlYWs7CgkJY2FzZSA0OgoJCQlpbmZvID0gIlBBTCtTRUNBTSAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDU6CgkJCWluZm8gPSAiTlRTQyAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDY6CgkJCWluZm8gPSAiTlRTQyAvIHN0ZXJlbyI7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJaW5mbyA9ICJQQUwgLyBzdGVyZW8iOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlpbmZvID0gIm9vcHM6IHVua25vd24gY2FyZCI7CgkJCWJyZWFrOwoJCX0KCQlpZiAoLTEgIT0gbXNwKQoJCQlidHYtPmMudHlwZSA9IEJUVFZfUElOTkFDTEVQUk87CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAiYnR0diVkOiBwaW5uYWNsZS9tdDogaWQ9JWQgaW5mbz1cIiVzXCIgcmFkaW89JXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgaWQsIGluZm8sIGJ0di0+aGFzX3JhZGlvID8gInllcyIgOiAibm8iKTsKCQlidHYtPnR1bmVyX3R5cGUgID0gMzM7CgkJYnR2LT5waW5uYWNsZV9pZCA9IGlkOwoJfQp9CgovKiBHUElPMjEgICBMOiBCdWZmZXIgYWt0aXYsIEg6IEJ1ZmZlciBpbmFrdGl2ICovCiNkZWZpbmUgTE0xODgyX1NZTkNfRFJJVkUgICAgIDB4MjAwMDAwTAoKc3RhdGljIHZvaWQgaW5pdF9pZHNfZWFnbGUoc3RydWN0IGJ0dHYgKmJ0dikKewoJZ3Bpb19pbm91dCgweGZmZmZmZiwweEZGRkYzNyk7CglncGlvX3dyaXRlKDB4MjAwMDIwKTsKCgkvKiBmbGFzaCBzdHJvYmUgaW52ZXJ0ZXIgPyEgKi8KCWdwaW9fd3JpdGUoMHgyMDAwMjQpOwoKCS8qIHN3aXRjaCBzeW5jIGRyaXZlIG9mZiAqLwoJZ3Bpb19iaXRzKExNMTg4Ml9TWU5DX0RSSVZFLExNMTg4Ml9TWU5DX0RSSVZFKTsKCgkvKiBzZXQgQlQ4NDggbXV4ZWwgdG8gMiAqLwoJYnRhb3IoKDIpPDw1LCB+KDI8PDUpLCBCVDg0OF9JRk9STSk7Cn0KCi8qIE11eHNlbCBoZWxwZXIgZm9yIHRoZSBJRFMgRWFnbGUuCiAqIHRoZSBlYWdsZXMgZG9lcyBub3QgdXNlIHRoZSBzdGFuZGFyZCBtdXhzZWwtYml0cyBidXQKICogaGFzIGl0cyBvd24gbXVsdGlwbGV4ZXIgKi8Kc3RhdGljIHZvaWQgZWFnbGVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJYnRhb3IoKDIpPDw1LCB+KDM8PDUpLCBCVDg0OF9JRk9STSk7CglncGlvX2JpdHMoMyxidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm11eHNlbFtpbnB1dCY3XSk7CgojaWYgMAogICAgICAgLyogc3ZocyAqLwogICAgICAgLyogd2FrZSBjaHJvbWEgQURDICovCiAgICAgICBidGFuZCh+QlQ4NDhfQURDX0NfU0xFRVAsIEJUODQ4X0FEQyk7CiAgICAgICAvKiBzZXQgdG8gWUMgdmlkZW8gKi8KICAgICAgIGJ0b3IoQlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9FX0NPTlRST0wpOwogICAgICAgYnRvcihCVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X09fQ09OVFJPTCk7CiNlbHNlCiAgICAgICAvKiBjb21wb3NpdGUgKi8KICAgICAgIC8qIHNldCBjaHJvbWEgQURDIHRvIHNsZWVwICovCiAgICAgICBidG9yKEJUODQ4X0FEQ19DX1NMRUVQLCBCVDg0OF9BREMpOwogICAgICAgLyogc2V0IHRvIGNvbXBvc2l0ZSB2aWRlbyAqLwogICAgICAgYnRhbmQofkJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfRV9DT05UUk9MKTsKICAgICAgIGJ0YW5kKH5CVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X09fQ09OVFJPTCk7CiNlbmRpZgoKICAgICAgIC8qIHN3aXRjaCBzeW5jIGRyaXZlIG9mZiAqLwogICAgICAgZ3Bpb19iaXRzKExNMTg4Ml9TWU5DX0RSSVZFLExNMTg4Ml9TWU5DX0RSSVZFKTsKfQoKc3RhdGljIHZvaWQgZ3ZjMTEwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYXNrc1tdID0gezB4MzAsIDB4MDEsIDB4MTIsIDB4MjN9OwoJZ3Bpb193cml0ZShtYXNrc1tpbnB1dCU0XSk7Cn0KCi8qIExNTEJUNHggaW5pdGlhbGl6YXRpb24gLSB0byBhbGxvdyBhY2Nlc3MgdG8gR1BJTyBiaXRzIGZvciBzZW5zb3JzIGlucHV0IGFuZAogICBhbGFybXMgb3V0cHV0CgogICBHUElPYml0ICAgIHwgMTAgfCA5IHwgOCB8IDcgfCA2IHwgNSB8IDQgfCAzIHwgMiB8IDEgfCAwIHwKICAgYXNzaWdubWVudCB8IFRJIHwgTzN8SU54fCBPMnwgTzF8SU40fElOM3xJTjJ8SU4xfCAgIHwgICB8CgogICBJTiAtIHNlbnNvciBpbnB1dHMsIElOeCAtIHNlbnNvciBpbnB1dHMgYW5kIFRJIFhPUmVkIHRvZ2V0aGVyCiAgIE8xLE8yLE8zIC0gYWxhcm0gb3V0cHV0cyAocmVsYXlzKQoKICAgT1VUIEVOQUJMRSAgIDEgICAgMSAgIDAgIC4gMSAgMSAgIDAgICAwIC4gMCAgIDAgICAwICAgIDAgICA9IDB4NkMwCgoqLwoKc3RhdGljIHZvaWQgaW5pdF9sbWxidDR4KHN0cnVjdCBidHR2ICpidHYpCnsKCXByaW50ayhLRVJOX0RFQlVHICJMTUxCVDR4IGluaXRcbiIpOwoJYnR3cml0ZSgweDAwMDAwMCwgQlQ4NDhfR1BJT19SRUdfSU5QKTsKCWdwaW9faW5vdXQoMHhmZmZmZmYsIDB4MDAwNkMwKTsKCWdwaW9fd3JpdGUoMHgwMDAwMDApOwp9CgpzdGF0aWMgdm9pZCBzaWdtYVNRX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCXVuc2lnbmVkIGludCBpbm11eCA9IGlucHV0ICUgODsKCWdwaW9faW5vdXQoIDB4ZiwgMHhmICk7CglncGlvX2JpdHMoIDB4ZiwgaW5tdXggKTsKfQoKc3RhdGljIHZvaWQgc2lnbWFTTENfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJdW5zaWduZWQgaW50IGlubXV4ID0gaW5wdXQgJSA0OwoJZ3Bpb19pbm91dCggMzw8OSwgMzw8OSApOwoJZ3Bpb19iaXRzKCAzPDw5LCBpbm11eDw8OSApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgYnR0dl9yZXNldF9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKgoJICogQlQ4NzhBIGhhcyBhIGF1ZGlvLXJlc2V0IHJlZ2lzdGVyLgoJICogMS4gVGhpcyByZWdpc3RlciBpcyBhbiBhdWRpbyByZXNldCBmdW5jdGlvbiBidXQgaXQgaXMgaW4KCSAqICAgIGZ1bmN0aW9uLTAgKHZpZGVvIGNhcHR1cmUpIGFkZHJlc3Mgc3BhY2UuCgkgKiAyLiBJdCBpcyBlbm91Z2ggdG8gZG8gdGhpcyBvbmNlIHBlciBwb3dlci11cCBvZiB0aGUgY2FyZC4KCSAqIDMuIFRoZXJlIGlzIGEgdHlwbyBpbiB0aGUgQ29uZXhhbnQgZG9jIC0tIGl0IGlzIG5vdCBhdAoJICogICAgMHg1QiwgYnV0IGF0IDB4MDU4LiAoQiBpcyBhbiBvZGQtbnVtYmVyLCBvYnZpb3VzbHkgYSB0eXBvISkuCgkgKiAtLS8vU2hyaWt1bWFyIDAzMDYwOQoJICovCglpZiAoYnR2LT5pZCAhPSA4NzgpCgkJcmV0dXJuOwoKCWlmIChidHR2X2RlYnVnKQoJCXByaW50aygiYnR0diVkOiBCVDg3OEEgQVJFU0VUXG4iLGJ0di0+Yy5ucik7CglidHdyaXRlKCgxPDw3KSwgMHgwNTgpOwoJdWRlbGF5KDEwKTsKCWJ0d3JpdGUoICAgICAwLCAweDA1OCk7Cn0KCi8qIGluaXRpYWxpemF0aW9uIHBhcnQgb25lIC0tIGJlZm9yZSByZWdpc3RlcmluZyBpMmMgYnVzICovCnZvaWQgX19kZXZpbml0IGJ0dHZfaW5pdF9jYXJkMShzdHJ1Y3QgYnR0diAqYnR2KQp7Cglzd2l0Y2ggKGJ0di0+Yy50eXBlKSB7CgljYXNlIEJUVFZfSEFVUFBBVUdFOgoJY2FzZSBCVFRWX0hBVVBQQVVHRTg3ODoKICAgICAgICAgICAgICAgIGJvb3RfbXNwMzR4eChidHYsNSk7CgkJYnJlYWs7CgljYXNlIEJUVFZfVk9PRE9PVFZfRk06CiAgICAgICAgICAgICAgICBib290X21zcDM0eHgoYnR2LDIwKTsKCQlicmVhazsKCWNhc2UgQlRUVl9BVkVSTUVESUE5ODoKCQlib290X21zcDM0eHgoYnR2LDExKTsKCQlicmVhazsKCWNhc2UgQlRUVl9IQVVQUEFVR0VQVlI6CgkJcHZyX2Jvb3QoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9UV0lOSEFOX0RTVDoKCWNhc2UgQlRUVl9BVkRWQlRfNzcxOgoJCWJ0di0+dXNlX2kyY19odyA9IDE7CgkJYnJlYWs7Cgl9CglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKCQlidHR2X3Jlc2V0X2F1ZGlvKGJ0dik7Cn0KCi8qIGluaXRpYWxpemF0aW9uIHBhcnQgdHdvIC0tIGFmdGVyIHJlZ2lzdGVyaW5nIGkyYyBidXMgKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pbml0X2NhcmQyKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCB0ZGE5ODg3OwogICAgICAgIGJ0di0+dHVuZXJfdHlwZSA9IC0xOwoKCWlmIChCVFRWX1VOS05PV04gPT0gYnR2LT5jLnR5cGUpIHsKCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CgkJaWRlbnRpZnlfYnlfZWVwcm9tKGJ0dixlZXByb21fZGF0YSk7Cgl9CgoJc3dpdGNoIChidHYtPmMudHlwZSkgewoJY2FzZSBCVFRWX01JUk86CgljYXNlIEJUVFZfTUlST1BSTzoKCWNhc2UgQlRUVl9QSU5OQUNMRToKCWNhc2UgQlRUVl9QSU5OQUNMRVBSTzoKCQkvKiBtaXJvL3Bpbm5hY2xlICovCgkJbWlyb19waW5uYWNsZV9ncGlvKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfRkxZVklERU9fOTg6CgljYXNlIEJUVFZfTUFYSToKCWNhc2UgQlRUVl9MSUZFX0ZMWUtJVDoKCWNhc2UgQlRUVl9GTFlWSURFTzoKCWNhc2UgQlRUVl9UWVBIT09OX1RWSUVXOgoJY2FzZSBCVFRWX0NIUk9OT1NfVlMyOgoJY2FzZSBCVFRWX0ZMWVZJREVPXzk4Rk06CgljYXNlIEJUVFZfRkxZVklERU8yMDAwOgoJY2FzZSBCVFRWX0ZMWVZJREVPOThFWjoKCWNhc2UgQlRUVl9DT05GRVJFTkNFVFY6CgljYXNlIEJUVFZfTElGRVRFQ185NDE1OgoJCWZseXZpZGVvX2dwaW8oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9IQVVQUEFVR0U6CgljYXNlIEJUVFZfSEFVUFBBVUdFODc4OgoJY2FzZSBCVFRWX0hBVVBQQVVHRVBWUjoKCQkvKiBwaWNrIHVwIHNvbWUgY29uZmlnIGluZm9zIGZyb20gdGhlIGVlcHJvbSAqLwoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKICAgICAgICAgICAgICAgIGhhdXBwYXVnZV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9BVkVSTUVESUE5ODoKCWNhc2UgQlRUVl9BVlBIT05FOTg6CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwoJCWF2ZXJtZWRpYV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9QWEMyMDA6CgkJaW5pdF9QWEMyMDAoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUDoKCQlwaWNvbG9fdGV0cmFfaW5pdChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1ZIWDoKCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJCWJ0di0+bWJveF93ZSAgICAgID0gMHgyMDsKCQlidHYtPm1ib3hfbW9zdCAgICA9IDA7CgkJYnR2LT5tYm94X2NsayAgICAgPSAweDA4OwoJCWJ0di0+bWJveF9kYXRhICAgID0gMHgxMDsKCQlidHYtPm1ib3hfbWFzayAgICA9IDB4Mzg7CgkJYnJlYWs7CgljYXNlIEJUVFZfVk9CSVNfQk9PU1RBUjoKCWNhc2UgQlRUVl9URVJSQVRWOgoJCXRlcnJhdGVjX2FjdGl2ZV9yYWRpb191cGdyYWRlKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfTUFHSUNUVklFVzA2MToKCQlpZiAoYnR2LT5jYXJkaWQgPT0gMHgzMDAyMTQ0ZikgewoJCQlidHYtPmhhc19yYWRpbz0xOwoJCQlwcmludGsoImJ0dHYlZDogcmFkaW8gZGV0ZWN0ZWQgYnkgc3Vic3lzdGVtIGlkIChDUEgwNXgpXG4iLGJ0di0+Yy5ucik7CgkJfQoJCWJyZWFrOwogICAgICAgY2FzZSBCVFRWX1NUQjI6CiAgICAgICAgICAgICAgICBpZiAoYnR2LT5jYXJkaWQgPT0gMHgzMDYwMTIxYSkgewoJCQkvKiBGaXggdXAgZW50cnkgZm9yIDNERlggVm9vZG9vVFYgMTAwLAoJCQkgICB3aGljaCBpcyBhbiBPRU0gU1RCIGNhcmQgdmFyaWFudC4gKi8KCQkJYnR2LT5oYXNfcmFkaW89MDsKCQkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1RFTUlDX05UU0M7CgkJfQoJCWJyZWFrOwoJY2FzZSBCVFRWX09TUFJFWTF4MDoKCWNhc2UgQlRUVl9PU1BSRVkxeDBfODQ4OgoJY2FzZSBCVFRWX09TUFJFWTEwMV84NDg6CgljYXNlIEJUVFZfT1NQUkVZMXgxOgoJY2FzZSBCVFRWX09TUFJFWTF4MV9TVklEOgoJY2FzZSBCVFRWX09TUFJFWTJ4eDoKCWNhc2UgQlRUVl9PU1BSRVkyeDBfU1ZJRDoKCWNhc2UgQlRUVl9PU1BSRVkyeDA6CgljYXNlIEJUVFZfT1NQUkVZNTAwOgoJY2FzZSBCVFRWX09TUFJFWTU0MDoKCWNhc2UgQlRUVl9PU1BSRVkyMDAwOgoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKICAgICAgICAgICAgICAgIG9zcHJleV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9JRFNfRUFHTEU6CgkJaW5pdF9pZHNfZWFnbGUoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9NT0RURUNfMjA1OgoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKCQltb2R0ZWNfZWVwcm9tKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfTE1MQlQ0OgoJCWluaXRfbG1sYnQ0eChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1RJQkVUX0NTMTY6CgkJdGliZXRDUzE2X2luaXQoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9LT0RJQ09NXzQ0MDBSOgoJCWtvZGljb200NDAwcl9pbml0KGJ0dik7CgkJYnJlYWs7Cgl9CgoJLyogcGxsIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgICBpZiAoIShidHYtPmlkPT04NDggJiYgYnR2LT5yZXZpc2lvbj09MHgxMSkpIHsKCQkvKiBkZWZhdWx0cyBmcm9tIGNhcmQgbGlzdCAqLwoJCWlmIChQTExfMjggPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5wbGwpIHsKCQkJYnR2LT5wbGwucGxsX2lmcmVxPTI4NjM2MzYzOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbD1CVDg0OF9JRk9STV9YVDA7CgkJfQoJCWlmIChQTExfMzUgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5wbGwpIHsKCQkJYnR2LT5wbGwucGxsX2lmcmVxPTM1NDY4OTUwOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbD1CVDg0OF9JRk9STV9YVDE7CgkJfQoJCS8qIGluc21vZCBvcHRpb25zIGNhbiBvdmVycmlkZSAqLwogICAgICAgICAgICAgICAgc3dpdGNoIChwbGxbYnR2LT5jLm5yXSkgewogICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBub25lICovCgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsID0gMDsKCQkJYnR2LT5wbGwucGxsX2lmcmVxICAgPSAwOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxOiAvKiAyOCBNSHogKi8KCQljYXNlIDI4OgogICAgICAgICAgICAgICAgICAgICAgICBidHYtPnBsbC5wbGxfaWZyZXEgICA9IDI4NjM2MzYzOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ0di0+cGxsLnBsbF9jcnlzdGFsID0gQlQ4NDhfSUZPUk1fWFQwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjogLyogMzUgTUh6ICovCgkJY2FzZSAzNToKICAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5wbGwucGxsX2lmcmVxICAgPSAzNTQ2ODk1MDsKCQkJYnR2LT5wbGwucGxsX29mcmVxICAgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBidHYtPnBsbC5wbGxfY3J5c3RhbCA9IEJUODQ4X0lGT1JNX1hUMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSAtMTsKCglidHR2X3Jlc2V0X2F1ZGlvKGJ0dik7CgoJLyogdHVuZXIgY29uZmlndXJhdGlvbiAoZnJvbSBjYXJkIGxpc3QgLyBhdXRvZGV0ZWN0IC8gaW5zbW9kIG9wdGlvbikgKi8KIAlpZiAoVU5TRVQgIT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl90eXBlKQoJCWlmKFVOU0VUID09IGJ0di0+dHVuZXJfdHlwZSkKICAgICAgICAgICAgICAgIAlidHYtPnR1bmVyX3R5cGUgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX3R5cGU7CglpZiAoVU5TRVQgIT0gdHVuZXJbYnR2LT5jLm5yXSkKCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcltidHYtPmMubnJdOwoJcHJpbnRrKCJidHR2JWQ6IHVzaW5nIHR1bmVyPSVkXG4iLGJ0di0+Yy5ucixidHYtPnR1bmVyX3R5cGUpOwoJaWYgKGJ0di0+cGlubmFjbGVfaWQgIT0gVU5TRVQpCgkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixBVURDX0NPTkZJR19QSU5OQUNMRSwKCQkJCSAgICAgICZidHYtPnBpbm5hY2xlX2lkKTsKCWlmIChidHYtPnR1bmVyX3R5cGUgIT0gVU5TRVQpCgkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixUVU5FUl9TRVRfVFlQRSwmYnR2LT50dW5lcl90eXBlKTsKCWJ0di0+c3ZocyA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uc3ZoczsKCWlmIChzdmhzW2J0di0+Yy5ucl0gIT0gVU5TRVQpCgkJYnR2LT5zdmhzID0gc3Zoc1tidHYtPmMubnJdOwoJaWYgKHJlbW90ZVtidHYtPmMubnJdICE9IFVOU0VUKQoJCWJ0di0+aGFzX3JlbW90ZSA9IHJlbW90ZVtidHYtPmMubnJdOwoKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19yYWRpbykKCQlidHYtPmhhc19yYWRpbz0xOwoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX3JlbW90ZSkKCQlidHYtPmhhc19yZW1vdGU9MTsKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX2dwaW9pcnEpCgkJYnR2LT5ncGlvaXJxPTA7CglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb19ob29rKQoJCWJ0di0+YXVkaW9faG9vaz1idHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvX2hvb2s7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZGlnaXRhbF9tb2RlID09IERJR0lUQUxfTU9ERV9DQU1FUkEpIHsKCQkvKiBkZXRlY3QgQnQ4MzIgY2hpcCBmb3IgcXVhcnR6c2lnaHQgZGlnaXRhbCBjYW1lcmEgKi8KCQlpZiAoKGJ0dHZfSTJDUmVhZChidHYsIEkyQ19CVDgzMl9BTFQxLCAiQnQ4MzIiKSA+PTApIHx8CgkJICAgIChidHR2X0kyQ1JlYWQoYnR2LCBJMkNfQlQ4MzJfQUxUMiwgIkJ0ODMyIikgPj0wKSkKCQkJYm9vdF9idDgzMihidHYpOwoJfQoKCWlmICghYXV0b2xvYWQpCgkJcmV0dXJuOwoKCS8qIHRyeSB0byBkZXRlY3QgYXVkaW8vZmFkZXIgY2hpcHMgKi8KCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub19tc3AzNHh4ICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX01TUDM0MDAsICJNU1AzNHh4IikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJtc3AzNDAwIik7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubXNwMzR4eF9hbHQgJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfTVNQMzQwMF9BTFQsICJNU1AzNHh4IChhbHRlcm5hdGUgYWRkcmVzcykiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoIm1zcDM0MDAiKTsKCglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fdGRhOTg3NSAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19UREE5ODc1LCAiVERBOTg3NSIpID49MCkKCQlyZXF1ZXN0X21vZHVsZSgidGRhOTg3NSIpOwoKCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub190ZGE3NDMyICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX1REQTc0MzIsICJUREE3NDMyIikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE3NDMyIik7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmVlZHNfdHZhdWRpbykKCQlyZXF1ZXN0X21vZHVsZSgidHZhdWRpbyIpOwoKCS8qIHR1bmVyIG1vZHVsZXMgKi8KCXRkYTk4ODcgPSAwOwoJaWYgKGJ0di0+cGlubmFjbGVfaWQgIT0gVU5TRVQpCgkJdGRhOTg4NyA9IDE7CglpZiAoMCA9PSB0ZGE5ODg3ICYmIDAgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfZHZiICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX1REQTk4ODcsICJUREE5ODg3IikgPj0wKQoJCXRkYTk4ODcgPSAxOwoJaWYoKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMykgfHwKCSAgIChidHYtPnR1bmVyX3R5cGUgPT0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszKSB8fAoJICAgKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDMpIHx8CgkgICAgdGRhOTg4NykKCQlyZXF1ZXN0X21vZHVsZSgidGRhOTg4NyIpOwoJaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkKCQlyZXF1ZXN0X21vZHVsZSgidHVuZXIiKTsKfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdm9pZCBtb2R0ZWNfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKCWlmKCBzdHJuY21wKCYoZWVwcm9tX2RhdGFbMHgxZV0pLCJUZW1pYyA0MDY2IEZZNSIsMTQpID09MCkgewoJCWJ0di0+dHVuZXJfdHlwZT1UVU5FUl9URU1JQ180MDY2Rlk1X1BBTF9JOwoJCXByaW50aygiYnR0diVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAoJCSAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKCX0gZWxzZSBpZiAoc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiQWxwcyBUU0JCNSIsMTApID09MCkgewoJCWJ0di0+dHVuZXJfdHlwZT1UVU5FUl9BTFBTX1RTQkI1X1BBTF9JOwoJCXByaW50aygiYnR0diVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwogICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiUGhpbGlwcyBGTTEyNDYiLDE0KSA9PTApIHsKICAgICAgICAgICAgICAgIGJ0di0+dHVuZXJfdHlwZT1UVU5FUl9QSElMSVBTX05UU0M7CiAgICAgICAgICAgICAgICBwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKCX0gZWxzZSB7CgkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVW5rbm93biBUdW5lclN0cmluZzogJXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwoJfQp9CgpzdGF0aWMgdm9pZCBfX2RldmluaXQgaGF1cHBhdWdlX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQp7CglzdHJ1Y3QgdHZlZXByb20gdHY7CgoJdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZygmdHYsIGVlcHJvbV9kYXRhKTsKCWJ0di0+dHVuZXJfdHlwZSA9IHR2LnR1bmVyX3R5cGU7CglidHYtPmhhc19yYWRpbyAgPSB0di5oYXNfcmFkaW87Cn0KCnN0YXRpYyBpbnQgdGVycmF0ZWNfYWN0aXZlX3JhZGlvX3VwZ3JhZGUoc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IGZyZXE7CgoJYnR2LT5oYXNfcmFkaW8gICAgPSAxOwoJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJYnR2LT5tYm94X3dlICAgICAgPSAweDEwOwoJYnR2LT5tYm94X21vc3QgICAgPSAweDIwOwoJYnR2LT5tYm94X2NsayAgICAgPSAweDA4OwoJYnR2LT5tYm94X2RhdGEgICAgPSAweDA0OwoJYnR2LT5tYm94X21hc2sgICAgPSAweDNjOwoKCWJ0di0+bWJveF9pb3cgICAgID0gMSA8PCAgODsKCWJ0di0+bWJveF9pb3IgICAgID0gMSA8PCAgOTsKCWJ0di0+bWJveF9jc2VsICAgID0gMSA8PCAxMDsKCglmcmVxPTg4MDAwLzYyLjU7Cgl0ZWE1NzU3X3dyaXRlKGJ0diwgNSAqIGZyZXEgKyAweDM1OCk7IC8vIHdyaXRlIDB4MWVkOAoJaWYgKDB4MWVkOCA9PSB0ZWE1NzU3X3JlYWQoYnR2KSkgewoJCXByaW50aygiYnR0diVkOiBUZXJyYXRlYyBBY3RpdmUgUmFkaW8gVXBncmFkZSBmb3VuZC5cbiIsCgkJICAgICAgIGJ0di0+Yy5ucik7CgkJYnR2LT5oYXNfcmFkaW8gICAgPSAxOwoJCWJ0di0+aGFzX21hdGNoYm94ID0gMTsKCX0gZWxzZSB7CgkJYnR2LT5oYXNfcmFkaW8gICAgPSAwOwoJCWJ0di0+aGFzX21hdGNoYm94ID0gMDsKCX0KCXJldHVybiAwOwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIG1pbmltYWwgYm9vdHN0cmFwIGZvciB0aGUgV2luVFYvUFZSIC0tIHVwbG9hZCBhbHRlcmEgZmlybXdhcmUuCiAqCiAqIFRoZSBoY3dhbWMucmJmIGZpcm13YXJlIGZpbGUgaXMgb24gdGhlIEhhdXBwYXVnZSBkcml2ZXIgQ0QuICBIYXZlCiAqIGEgbG9vayBhdCBQdnIvcHZyNDV4eHguRVhFIChzZWxmLWV4dHJhY3RpbmcgemlwIGFyY2hpdmUsIGNhbiBiZQogKiB1bnBhY2tlZCB3aXRoIHVuemlwKS4KICovCiNkZWZpbmUgUFZSX0dQSU9fREVMQVkJCTEwCgojZGVmaW5lIEJUVFZfQUxUX0RBVEEJCTB4MDAwMDAxCiNkZWZpbmUgQlRUVl9BTFRfRENMSwkJMHgxMDAwMDAKI2RlZmluZSBCVFRWX0FMVF9OQ09ORklHCTB4ODAwMDAwCgpzdGF0aWMgaW50IF9fZGV2aW5pdCBwdnJfYWx0ZXJhX2xvYWQoc3RydWN0IGJ0dHYgKmJ0diwgdTggKm1pY3JvLCB1MzIgbWljcm9sZW4pCnsKCXUzMiBuOwogIAl1OCBiaXRzOwoJaW50IGk7CgoJZ3Bpb19pbm91dCgweGZmZmZmZixCVFRWX0FMVF9EQVRBfEJUVFZfQUxUX0RDTEt8QlRUVl9BTFRfTkNPTkZJRyk7CglncGlvX3dyaXRlKDApOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglncGlvX3dyaXRlKEJUVFZfQUxUX05DT05GSUcpOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglmb3IgKG4gPSAwOyBuIDwgbWljcm9sZW47IG4rKykgewoJCWJpdHMgPSBtaWNyb1tuXTsKCQlmb3IgKCBpID0gMCA7IGkgPCA4IDsgaSsrICkgewoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCQkJaWYgKGJpdHMgJiAweDAxKQoJCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RBVEEsQlRUVl9BTFRfREFUQSk7CgkJCWVsc2UKCQkJCWdwaW9fYml0cyhCVFRWX0FMVF9EQVRBLDApOwoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSyxCVFRWX0FMVF9EQ0xLKTsKCQkJYml0cyA+Pj0gMTsKCQl9Cgl9CglncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCXVkZWxheShQVlJfR1BJT19ERUxBWSk7CgoJLyogYmVnaW4gQWx0ZXJhIGluaXQgbG9vcCAoTm90IG5lY2Vzc2FyeSxidXQgZG9lc24ndCBodXJ0KSAqLwoJZm9yIChpID0gMCA7IGkgPCAzMCA7IGkrKykgewoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOwoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLEJUVFZfQUxUX0RDTEspOwoJfQoJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2RldmluaXQgcHZyX2Jvb3Qoc3RydWN0IGJ0dHYgKmJ0dikKewogICAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7CglpbnQgcmM7CgoJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgImhjd2FtYy5yYmYiLCAmYnR2LT5jLnBjaS0+ZGV2KTsKCWlmIChyYyAhPSAwKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBubyBhbHRlcmEgZmlybXdhcmUgW3ZpYSBob3RwbHVnXVxuIiwKCQkgICAgICAgYnR2LT5jLm5yKTsKICAgICAgICAgICAgICAgIHJldHVybiByYzsKICAgICAgICB9CglyYyA9IHB2cl9hbHRlcmFfbG9hZChidHYsIGZ3X2VudHJ5LT5kYXRhLCBmd19lbnRyeS0+c2l6ZSk7CglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGFsdGVyYSBmaXJtd2FyZSB1cGxvYWQgJXNcbiIsCgkgICAgICAgYnR2LT5jLm5yLCAocmMgPCAwKSA/ICJmYWlsZWQiIDogIm9rIik7CiAgICAgICAgcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CglyZXR1cm4gcmM7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIHNvbWUgb3NwcmV5IHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgdm9pZCBfX2RldmluaXQgb3NwcmV5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQp7CiAgICAgICBpbnQgaSA9IDA7CiAgICAgICB1bnNpZ25lZCBjaGFyICplZSA9IGVlcHJvbV9kYXRhOwogICAgICAgdW5zaWduZWQgbG9uZyBzZXJpYWwgPSAwOwoKICAgICAgIGlmIChidHYtPmMudHlwZSA9PSAwKSB7CiAgICAgICAgICAgICAgIC8qIHRoaXMgbWlnaHQgYmUgYW4gYW50aXF1ZS4uLiBjaGVjayBmb3IgTU1BQyBsYWJlbCBpbiBlZXByb20gKi8KICAgICAgICAgICAgICAgaWYgKChlZVswXT09J00nKSAmJiAoZWVbMV09PSdNJykgJiYgKGVlWzJdPT0nQScpICYmIChlZVszXT09J0MnKSkgewogICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9MDsgaTwyMTsgaSsrKQoJCQkgICAgICAgY2hlY2tzdW0gKz0gZWVbaV07CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrc3VtICE9IGVlWzIxXSkKCQkJICAgICAgIHJldHVybjsKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MF84NDg7CgkJICAgICAgIGZvciAoaSA9IDEyOyBpIDwgMjE7IGkrKykKCQkJICAgICAgIHNlcmlhbCAqPSAxMCwgc2VyaWFsICs9IGVlW2ldIC0gJzAnOwogICAgICAgICAgICAgICB9CiAgICAgICB9IGVsc2UgewoJICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGU7CiAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSA0KjE2OwoKICAgICAgICAgICAgICAgZm9yKDsgb2Zmc2V0IDwgOCoxNjsgb2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgY2hlY2tzdW0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcmlmeSB0aGUgY2hlY2tzdW0gKi8KICAgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGk8MTQ7IGkrKykgY2hlY2tzdW0gKz0gZWVbaStvZmZzZXRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0gPSB+Y2hlY2tzdW07ICAvKiBubyBpZGVhIHdoeSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoKGNoZWNrc3VtPj44KSYweDBGRikgPT0gZWVbb2Zmc2V0KzE0XSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoZWNrc3VtICYgMHgwRkYpID09IGVlW29mZnNldCsxNV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gOCoxNikKCQkgICAgICAgcmV0dXJuOwoKCSAgICAgICAvKiBmb3VuZCBhIHZhbGlkIGRlc2NyaXB0b3IgKi8KCSAgICAgICB0eXBlID0gKGVlW29mZnNldCs0XTw8OCkgfCAoZWVbb2Zmc2V0KzVdKTsKCgkgICAgICAgc3dpdGNoKHR5cGUpIHsKCgkgICAgICAgLyogODQ4IGJhc2VkICovCgkgICAgICAgY2FzZSAweDAwMDQ6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkxeDBfODQ4OwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAwNToKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTEwMV84NDg7CgkJICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgLyogODc4IGJhc2VkICovCgkgICAgICAgY2FzZSAweDAwMTI6CgkgICAgICAgY2FzZSAweDAwMTM6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkxeDA7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE0OgoJICAgICAgIGNhc2UgMHgwMDE1OgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMXgxOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxNjoKCSAgICAgICBjYXNlIDB4MDAxNzoKCSAgICAgICBjYXNlIDB4MDAyMDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MV9TVklEOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxODoKCSAgICAgICBjYXNlIDB4MDAxOToKCSAgICAgICBjYXNlIDB4MDAxRToKCSAgICAgICBjYXNlIDB4MDAxRjoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTJ4eDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwMUE6CgkgICAgICAgY2FzZSAweDAwMUI6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkyeDBfU1ZJRDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwNDA6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVk1MDA7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDUwOgoJICAgICAgIGNhc2UgMHgwMDU2OgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZNTQwOwoJCSAgICAgICAvKiBidHR2X29zcHJleV81NDBfaW5pdChidHYpOyAqLwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDA2MDoKCSAgICAgICBjYXNlIDB4MDA3MDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTJ4MDsKCQkgICAgICAgLy9lbmFibGUgb3V0cHV0IG9uIHNlbGVjdCBjb250cm9sIGxpbmVzCgkJICAgICAgIGdwaW9faW5vdXQoMHhmZmZmZmYsMHgwMDAzMDMpOwoJCSAgICAgICBicmVhazsKCSAgICAgICBkZWZhdWx0OgoJCSAgICAgICAvKiB1bmtub3duLi4ubGVhdmUgZ2VuZXJpYywgYnV0IGdldCBzZXJpYWwgIyAqLwoJCSAgICAgICBicmVhazsKCSAgICAgICB9CgkgICAgICAgc2VyaWFsID0gIChlZVtvZmZzZXQrNl0gPDwgMjQpCgkJICAgICAgIHwgKGVlW29mZnNldCs3XSA8PCAxNikKCQkgICAgICAgfCAoZWVbb2Zmc2V0KzhdIDw8ICA4KQoJCSAgICAgICB8IChlZVtvZmZzZXQrOV0pOwogICAgICAgfQoKICAgICAgIHByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogb3NwcmV5IGVlcHJvbTogY2FyZD0lZCBuYW1lPSVzIHNlcmlhbD0lbGRcbiIsCgkgICAgICBidHYtPmMubnIsIGJ0di0+Yy50eXBlLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsc2VyaWFsKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogQVZlcm1lZGlhIHNwZWNpZmljIHN0dWZmLCBmcm9tICBia3RyX2NhcmQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyBpbnQgdHVuZXJfMF90YWJsZVtdID0gewogICAgICAgIFRVTkVSX1BISUxJUFNfTlRTQywgIFRVTkVSX1BISUxJUFNfUEFMIC8qIFBBTC1CRyovLAogICAgICAgIFRVTkVSX1BISUxJUFNfUEFMLCAgIFRVTkVSX1BISUxJUFNfUEFMIC8qIFBBTC1JKi8sCiAgICAgICAgVFVORVJfUEhJTElQU19QQUwsICAgVFVORVJfUEhJTElQU19QQUwsCiAgICAgICAgVFVORVJfUEhJTElQU19TRUNBTSwgVFVORVJfUEhJTElQU19TRUNBTSwKICAgICAgICBUVU5FUl9QSElMSVBTX1NFQ0FNLCBUVU5FUl9QSElMSVBTX1BBTCwKCVRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszIH07CiNpZiAwCmludCB0dW5lcl8wX2ZtX3RhYmxlW10gPSB7CiAgICAgICAgUEhJTElQU19GUjEyMzZfTlRTQywgIFBISUxJUFNfRlIxMjE2X1BBTCwKICAgICAgICBQSElMSVBTX0ZSMTIxNl9QQUwsICAgUEhJTElQU19GUjEyMTZfUEFMLAogICAgICAgIFBISUxJUFNfRlIxMjE2X1BBTCwgICBQSElMSVBTX0ZSMTIxNl9QQUwsCiAgICAgICAgUEhJTElQU19GUjEyMzZfU0VDQU0sIFBISUxJUFNfRlIxMjM2X1NFQ0FNLAogICAgICAgIFBISUxJUFNfRlIxMjM2X1NFQ0FNLCBQSElMSVBTX0ZSMTIxNl9QQUx9OwojZW5kaWYKCnN0YXRpYyBpbnQgdHVuZXJfMV90YWJsZVtdID0gewogICAgICAgIFRVTkVSX1RFTUlDX05UU0MsICBUVU5FUl9URU1JQ19QQUwsCglUVU5FUl9URU1JQ19QQUwsICAgVFVORVJfVEVNSUNfUEFMLAoJVFVORVJfVEVNSUNfUEFMLCAgIFRVTkVSX1RFTUlDX1BBTCwKICAgICAgICBUVU5FUl9URU1JQ180MDEyRlk1LCBUVU5FUl9URU1JQ180MDEyRlk1LCAvL1RVTkVSX1RFTUlDX1NFQ0FNCiAgICAgICAgVFVORVJfVEVNSUNfNDAxMkZZNSwgVFVORVJfVEVNSUNfUEFMfTsKCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdmVybWVkaWFfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKICAgICAgICBpbnQgdHVuZXJfbWFrZSx0dW5lcl90dl9mbSx0dW5lcl9mb3JtYXQsdHVuZXI9MDsKCgl0dW5lcl9tYWtlICAgICAgPSAoZWVwcm9tX2RhdGFbMHg0MV0gJiAweDcpOwogICAgICAgIHR1bmVyX3R2X2ZtICAgICA9IChlZXByb21fZGF0YVsweDQxXSAmIDB4MTgpID4+IDM7CiAgICAgICAgdHVuZXJfZm9ybWF0ICAgID0gKGVlcHJvbV9kYXRhWzB4NDJdICYgMHhmMCkgPj4gNDsKCWJ0di0+aGFzX3JlbW90ZSA9IChlZXByb21fZGF0YVsweDQyXSAmIDB4MDEpOwoKCWlmICh0dW5lcl9tYWtlID09IDAgfHwgdHVuZXJfbWFrZSA9PSAyKQoJCWlmKHR1bmVyX2Zvcm1hdCA8PTB4MGEpCgkJCXR1bmVyID0gdHVuZXJfMF90YWJsZVt0dW5lcl9mb3JtYXRdOwoJaWYgKHR1bmVyX21ha2UgPT0gMSkKCQlpZih0dW5lcl9mb3JtYXQgPD05KQoJCQl0dW5lciA9IHR1bmVyXzFfdGFibGVbdHVuZXJfZm9ybWF0XTsKCglpZiAodHVuZXJfbWFrZSA9PSA0KQoJCWlmKHR1bmVyX2Zvcm1hdCA9PSAweDA5KQoJCQl0dW5lciA9IFRVTkVSX0xHX05UU0NfTkVXX1RBUEM7IC8vIFRBUEMtRzcwMlAKCglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEF2ZXJtZWRpYSBlZXByb21bMHglMDJ4JTAyeF06IHR1bmVyPSIsCgkJYnR2LT5jLm5yLGVlcHJvbV9kYXRhWzB4NDFdLGVlcHJvbV9kYXRhWzB4NDJdKTsKCWlmKHR1bmVyKSB7CgkJYnR2LT50dW5lcl90eXBlPXR1bmVyOwoJCXByaW50aygiJWQiLHR1bmVyKTsKCX0gZWxzZQoJCXByaW50aygiVW5rbm93biB0eXBlIik7CglwcmludGsoIiByYWRpbzolcyByZW1vdGUgY29udHJvbDolc1xuIiwKCSAgICAgICB0dW5lcl90dl9mbSAgICAgPyAieWVzIiA6ICJubyIsCgkgICAgICAgYnR2LT5oYXNfcmVtb3RlID8gInllcyIgOiAibm8iKTsKfQoKLyogdXNlZCBvbiBWb29kb28gVFYvRk0gKFZvb2RvbyAyMDApLCBTMCB3aXJlZCB0byAweDEwMDAwICovCnZvaWQgYnR0dl90ZGE5ODgwX3NldG5vcm0oc3RydWN0IGJ0dHYgKmJ0diwgaW50IG5vcm0pCnsKCS8vIGZpeCB1cCBvdXIgY2FyZCBlbnRyeQoJaWYobm9ybT09VklERU9fTU9ERV9OVFNDKSB7CgkJYnR0dl90dmNhcmRzW0JUVFZfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzBdPTB4OTU3ZmZmOwoJCWJ0dHZfdHZjYXJkc1tCVFRWX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFs0XT0weDk1N2ZmZjsKCQlkcHJpbnRrKCJidHR2X3RkYTk4ODBfc2V0bm9ybSB0byBOVFNDXG4iKTsKCX0KCWVsc2UgewoJICAgICAgICBidHR2X3R2Y2FyZHNbQlRUVl9WT09ET09UVl9GTV0uYXVkaW9tdXhbMF09MHg5NDdmZmY7CiAgICAgICAgICAgICAgICBidHR2X3R2Y2FyZHNbQlRUVl9WT09ET09UVl9GTV0uYXVkaW9tdXhbNF09MHg5NDdmZmY7CgkJZHByaW50aygiYnR0dl90ZGE5ODgwX3NldG5vcm0gdG8gUEFMXG4iKTsKCX0KCS8vIHNldCBHUElPIGFjY29yZGluZwoJZ3Bpb19iaXRzKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2ssCgkJICBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2J0di0+YXVkaW9dKTsKfQoKCi8qCiAqIHJlc2V0L2VuYWJsZSB0aGUgTVNQIG9uIHNvbWUgSGF1cHBhdWdlIGNhcmRzCiAqIFRoYW5rcyB0byBLefZzdGkgTeRsa2tpIChrbWFsa2tpQGNjLmh1dC5maSkhCiAqCiAqIEhhdXBwYXVnZTogIHBpbiAgNQogKiBWb29kb286ICAgICBwaW4gMjAKICovCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBib290X21zcDM0eHgoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHBpbikKewoJaW50IG1hc2sgPSAoMSA8PCBwaW4pOwoKCWdwaW9faW5vdXQobWFzayxtYXNrKTsKCWdwaW9fYml0cyhtYXNrLDApOwogICAgICAgIHVkZWxheSgyNTAwKTsKCWdwaW9fYml0cyhtYXNrLG1hc2spOwoKCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwibXNwMzR4eCIpOwoJaWYgKGJ0dHZfdmVyYm9zZSkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEhhdXBwYXVnZS9Wb29kb28gbXNwMzR4eDogcmVzZXQgbGluZSAiCgkJICAgICAgICJpbml0IFslZF1cbiIsIGJ0di0+Yy5uciwgcGluKTsKfQoKc3RhdGljIHZvaWQgX19kZXZpbml0IGJvb3RfYnQ4MzIoc3RydWN0IGJ0dHYgKmJ0dikKewojaWYgMCAvKiBub3Qgd29ya2luZyB5ZXQgKi8KCWludCByZXNldGJpdD0wOwoKCXN3aXRjaCAoYnR2LT5jLnR5cGUpIHsKCWNhc2UgQlRUVl9QWEVMVldQTFRWUEFLOgoJCXJlc2V0Yml0ID0gMHg0MDAwMDA7CgkJYnJlYWs7CgljYXNlIEJUVFZfTU9EVEVDXzIwNToKCQlyZXNldGJpdCA9IDE8PDk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUJVRygpOwoJfQoKCXJlcXVlc3RfbW9kdWxlKCJidDgzMiIpOwoJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgQlQ4MzJfSEVYRFVNUCwgTlVMTCk7CgoJcHJpbnRrKCJidHR2JWQ6IFJlc2V0IEJ0ODMyIFtsaW5lPTB4JXhdXG4iLGJ0di0+Yy5ucixyZXNldGJpdCk7CglncGlvX3dyaXRlKDApOwoJZ3Bpb19pbm91dChyZXNldGJpdCwgcmVzZXRiaXQpOwoJdWRlbGF5KDUpOwoJZ3Bpb19iaXRzKHJlc2V0Yml0LCByZXNldGJpdCk7Cgl1ZGVsYXkoNSk7CglncGlvX2JpdHMocmVzZXRiaXQsIDApOwoJdWRlbGF5KDUpOwoKCS8vIGJ0ODMyIG9uIHBpeGVsdmlldyBjaGFuZ2VzIGZyb20gaTJjIDB4OGEgdG8gMHg4OCBhZnRlcgoJLy8gYmVpbmcgcmVzZXQgYXMgYWJvdmUuIFNvIHdlIG11c3QgZm9sbG93IGJ5IHRoaXM6CglidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBCVDgzMl9SRUFUVEFDSCwgTlVMTCk7CiNlbmRpZgp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgSW1hZ2VuYXRpb24gTC1Nb2RlbCBQWEMyMDAgRnJhbWVncmFiYmVyICovCi8qICBUaGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBwcm9jZWR1cmUgYXMKICogIHVzZWQgYnkgQWxlc3NhbmRybyBSdWJpbmkgaW4gaGlzIHB4YzIwMAogKiAgZHJpdmVyLCBidXQgdXNpbmcgQlRUViBmdW5jdGlvbnMgKi8KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X1BYQzIwMChzdHJ1Y3QgYnR0diAqYnR2KQp7CglzdGF0aWMgaW50IHZhbHNbXSBfX2RldmluaXRkYXRhID0geyAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBkLCAweDBkLAoJCQkJCSAgICAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAoJCQkJCSAgICAweDAwIH07Cgl1bnNpZ25lZCBpbnQgaTsKCWludCB0bXA7Cgl1MzIgdmFsOwoKCS8qIEluaXRpYWxpc2UgR1BJTy1jb25uZXZ0ZWQgc3R1ZmYgKi8KCWdwaW9faW5vdXQoMHhmZmZmZmYsICgxPDwxMykpOwoJZ3Bpb193cml0ZSgwKTsKCXVkZWxheSgzKTsKCWdwaW9fd3JpdGUoMTw8MTMpOwoJLyogR1BJTyBpbnB1dHMgYXJlIHB1bGxlZCB1cCwgc28gbm8gbmVlZCB0byBkcml2ZQoJICogcmVzZXQgcGluIGFueSBsb25nZXIgKi8KCWdwaW9fYml0cygweGZmZmZmZiwgMCk7CglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInB4YzIwMCIpOwoKCS8qICB3ZSBjb3VsZC9zaG91bGQgdHJ5IGFuZCByZXNldC9jb250cm9sIHRoZSBBRCBwb3RzPyBidXQKCSAgICByaWdodCBub3cgIHdlIHNpbXBseSAgdHVybmVkIG9mZiB0aGUgY3J1c2hpbmcuICBXaXRob3V0CgkgICAgdGhpcyB0aGUgQUdDIGRyaWZ0cyBkcmlmdHMKCSAgICByZW1lbWJlciB0aGUgRU4gaXMgcmV2ZXJzZSBsb2dpYyAtLT4KCSAgICBzZXR0aW5nIEJUODQ4X0FEQ19BR0NfRU4gZGlzYWJsZSB0aGUgQUdDCgkgICAgdGJvdWx0QGVlY3MubGVoaWdoLmVkdQoJKi8KCglidHdyaXRlKEJUODQ4X0FEQ19SRVNFUlZFRHxCVDg0OF9BRENfQUdDX0VOLCBCVDg0OF9BREMpOwoKCS8qCUluaXRpYWxpc2UgTUFYNTE3IERBQyAqLwoJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyBEQUMgcmVmZXJlbmNlIHZvbHRhZ2UgbGV2ZWwgLi4uXG4iKTsKCWJ0dHZfSTJDV3JpdGUoYnR2LDB4NUUsMCwweDgwLDEpOwoKCS8qCUluaXRpYWxpc2UgMTJDNTA4IFBJQyAqLwoJLyoJVGhlIEkyQ1dyaXRlIGFuZCBJMkNSZWFkIGNvbW1tYW5kcyBhcmUgYWN0dWFsbHkgdG8gdGhlCgkgKglzYW1lIGNoaXBzIC0gYnV0IHRoZSBSL1cgYml0IGlzIGluY2x1ZGVkIGluIHRoZSBhZGRyZXNzCgkgKglhcmd1bWVudCBzbyB0aGUgbnVtYmVycyBhcmUgZGlmZmVyZW50ICovCgoKCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpc2luZyAxMkM1MDggUElDIGNoaXAgLi4uXG4iKTsKCgkvKiBGaXJzdCBvZiBhbGwsIGVuYWJsZSB0aGUgY2xvY2sgbGluZS4gVGhpcyBpcyB1c2VkIGluIHRoZSBQWEMyMDAtRiAqLwoJdmFsID0gYnRyZWFkKEJUODQ4X0dQSU9fRE1BX0NUTCk7Cgl2YWwgfD0gQlQ4NDhfR1BJT19ETUFfQ1RMX0dQQ0xLTU9ERTsKCWJ0d3JpdGUodmFsLCBCVDg0OF9HUElPX0RNQV9DVEwpOwoKCS8qIFRoZW4sIHB1c2ggdG8gMCB0aGUgcmVzZXQgcGluIGxvbmcgZW5vdWdoIHRvIHJlc2V0IHRoZSAqCgkgKiBkZXZpY2Ugc2FtZSBhcyBhYm92ZSBmb3IgdGhlIHJlc2V0IGxpbmUsIGJ1dCBub3QgdGhlIHNhbWUKCSAqIHZhbHVlIHNlbnQgdG8gdGhlIEdQSU8tY29ubmVjdGVkIHN0dWZmCgkgKiB3aGljaCBvbmUgaXMgdGhlIGdvb2Qgb25lPyAqLwoJZ3Bpb19pbm91dCgweGZmZmZmZiwoMTw8MikpOwoJZ3Bpb193cml0ZSgwKTsKCXVkZWxheSgxMCk7CglncGlvX3dyaXRlKDE8PDIpOwoKICAgICAgIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2YWxzKTsgaSsrKSB7CgkJdG1wPWJ0dHZfSTJDV3JpdGUoYnR2LDB4MUUsMCx2YWxzW2ldLDEpOwoJCWlmICh0bXAgIT0gLTEpIHsKCQkJcHJpbnRrKEtFUk5fSU5GTwoJCQkgICAgICAgIkkyQyBXcml0ZSglMi4yeCkgPSAlaVxuSTJDIFJlYWQgKCkgPSAlMi4yeFxuXG4iLAoJCQkgICAgICAgdmFsc1tpXSx0bXAsYnR0dl9JMkNSZWFkKGJ0diwweDFGLE5VTEwpKTsKCQl9Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAiUFhDMjAwIEluaXRpYWxpc2VkLlxuIik7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBNaXJvIFBybyByYWRpbyBzdHVmZiAtLSB0aGUgdGVhNTc1NyBpcyBjb25uZWN0ZWQgdG8gc29tZSBHUElPIHBvcnRzICAgICAqLwovKgogKiBDb3B5cmlnaHQgKGMpIDE5OTkgQ3NhYmEgSGFsYXN6IDxxZ2VoYWxpQHVuaS1taXNrb2xjLmh1PgogKiBUaGlzIGNvZGUgaXMgcGxhY2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICoKICogQnJ1dGFsbHkgaGFja2VkIGJ5IERhbiBTaGVyaWRhbiA8ZGFuLnNoZXJpZGFuQGNvbnRhY3Qub3JnLnVrPiBkanM1MiA4LzMvMDAKICovCgpzdGF0aWMgdm9pZCBidXNfbG93KHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCnsKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWdwaW9fYml0cyhiaXQsMCk7Cgl1ZGVsYXkoNSk7CgoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLCAwKTsKCQl1ZGVsYXkoNSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGJ1c19oaWdoKHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCnsKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWdwaW9fYml0cyhiaXQsYml0KTsKCXVkZWxheSg1KTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KfQoKc3RhdGljIGludCBidXNfaW4oc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7CgoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KCXJldHVybiBncGlvX3JlYWQoKSAmIChiaXQpOwp9CgovKiBURUE1NzU3IHJlZ2lzdGVyIGJpdHMgKi8KI2RlZmluZSBURUFfRlJFUQkJMDoxNAojZGVmaW5lIFRFQV9CVUZGRVIJCTE1OjE1CgojZGVmaW5lIFRFQV9TSUdOQUxfU1RSRU5HVEgJMTY6MTcKCiNkZWZpbmUgVEVBX1BPUlQxCQkxODoxOAojZGVmaW5lIFRFQV9QT1JUMAkJMTk6MTkKCiNkZWZpbmUgVEVBX0JBTkQJCTIwOjIxCiNkZWZpbmUgVEVBX0JBTkRfRk0JCTAKI2RlZmluZSBURUFfQkFORF9NVwkJMQojZGVmaW5lIFRFQV9CQU5EX0xXCQkyCiNkZWZpbmUgVEVBX0JBTkRfU1cJCTMKCiNkZWZpbmUgVEVBX01PTk8JCTIyOjIyCiNkZWZpbmUgVEVBX0FMTE9XX1NURVJFTwkwCiNkZWZpbmUgVEVBX0ZPUkNFX01PTk8JCTEKCiNkZWZpbmUgVEVBX1NFQVJDSF9ESVJFQ1RJT04JMjM6MjMKI2RlZmluZSBURUFfU0VBUkNIX0RPV04JCTAKI2RlZmluZSBURUFfU0VBUkNIX1VQCQkxCgojZGVmaW5lIFRFQV9TVEFUVVMJCTI0OjI0CiNkZWZpbmUgVEVBX1NUQVRVU19UVU5FRAkwCiNkZWZpbmUgVEVBX1NUQVRVU19TRUFSQ0hJTkcJMQoKLyogTG93LWxldmVsIHN0dWZmICovCnN0YXRpYyBpbnQgdGVhNTc1N19yZWFkKHN0cnVjdCBidHR2ICpidHYpCnsKCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKCWludCB2YWx1ZSA9IDA7CglpbnQgaTsKCgkvKiBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5ICovCglncGlvX2lub3V0KGJ0di0+bWJveF9tYXNrLCBidHYtPm1ib3hfY2xrIHwgYnR2LT5tYm94X3dlKTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCX0KCglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInRlYTU3NTcgcmVhZCIpOwoKCWJ1c19sb3coYnR2LGJ0di0+bWJveF93ZSk7CglidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCgl1ZGVsYXkoMTApOwoJdGltZW91dD0gamlmZmllcyArIEhaOwoKCS8vIHdhaXQgZm9yIERBVEEgbGluZSB0byBnbyBsb3c7IGVycm9yIGlmIGl0IGRvZXNuJ3QKCXdoaWxlIChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKCQlzY2hlZHVsZSgpOwoJaWYgKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiB0ZWE1NzU3OiByZWFkIHRpbWVvdXRcbiIsYnR2LT5jLm5yKTsKCQlyZXR1cm4gLTE7Cgl9CgoJZHByaW50aygiYnR0diVkOiB0ZWE1NzU3OiIsYnR2LT5jLm5yKTsKCWZvcihpID0gMDsgaSA8IDI0OyBpKyspCgl7CgkJdWRlbGF5KDUpOwoJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoNSk7CgkJZHByaW50aygiJWMiLChidXNfaW4oYnR2LGJ0di0+bWJveF9tb3N0KSA9PSAwKT8nVCc6Jy0nKTsKCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCQl2YWx1ZSA8PD0gMTsKCQl2YWx1ZSB8PSAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkgPT0gMCk/MDoxOyAgLyogTVNCIGZpcnN0ICovCgkJZHByaW50aygiJWMiLCAoYnVzX2luKGJ0dixidHYtPm1ib3hfbW9zdCkgPT0gMCk/J1MnOidNJyk7Cgl9CglkcHJpbnRrKCJcbmJ0dHYlZDogdGVhNTc1NzogcmVhZCAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKCXJldHVybiB2YWx1ZTsKfQoKc3RhdGljIGludCB0ZWE1NzU3X3dyaXRlKHN0cnVjdCBidHR2ICpidHYsIGludCB2YWx1ZSkKewoJaW50IGk7CglpbnQgcmVnID0gdmFsdWU7CgoJZ3Bpb19pbm91dChidHYtPm1ib3hfbWFzaywgYnR2LT5tYm94X2NsayB8IGJ0di0+bWJveF93ZSB8IGJ0di0+bWJveF9kYXRhKTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCX0KCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVhNTc1NyB3cml0ZSIpOwoKCWRwcmludGsoImJ0dHYlZDogdGVhNTc1Nzogd3JpdGUgMHglWFxuIiwgYnR2LT5jLm5yLCB2YWx1ZSk7CglidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfd2UpOwoJZm9yKGkgPSAwOyBpIDwgMjU7IGkrKykKCXsKCQlpZiAocmVnICYgMHgxMDAwMDAwKQoJCQlidXNfaGlnaChidHYsYnR2LT5tYm94X2RhdGEpOwoJCWVsc2UKCQkJYnVzX2xvdyhidHYsYnR2LT5tYm94X2RhdGEpOwoJCXJlZyA8PD0gMTsKCQlidXNfaGlnaChidHYsYnR2LT5tYm94X2Nsayk7CgkJdWRlbGF5KDEwKTsKCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoMTApOwoJfQoJYnVzX2xvdyhidHYsYnR2LT5tYm94X3dlKTsgIC8qIHVubXV0ZSAhISEgKi8KCXJldHVybiAwOwp9Cgp2b2lkIHRlYTU3NTdfc2V0X2ZyZXEoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgc2hvcnQgZnJlcSkKewoJZHByaW50aygidGVhNTc1N19zZXRfZnJlcSAlZFxuIixmcmVxKTsKCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogYWRkIDEwLjdNSHogKHNlZSBkb2NzKSAqLwojaWYgMAoJLyogYnJlYWtzIE1pcm8gUENUViAqLwoJdmFsdWUgPSB0ZWE1NzU3X3JlYWQoYnR2KTsKCWRwcmludGsoImJ0dHYlZDogdGVhNTc1NyByZWFkYmFjaz0weCV4XG4iLGJ0di0+Yy5ucix2YWx1ZSk7CiNlbmRpZgp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogd2ludmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnZvaWQgd2ludmlld19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCS8qIFBUMjI1NEEgcHJvZ3JhbW1pbmcgSm9uIFRvbWJzLCBqb25AZ3RlLmVzaS51cy5lcyAqLwoJaW50IGJpdHNfb3V0LCBsb29wcywgdm9sLCBkYXRhOwoKCWlmICghc2V0KSB7CgkJLyogRml4ZWQgYnkgTGVhbmRybyBMdWNhcmVsbGEgPGx1Y2FAbGludXhtZW5kb3phLm9yZy5hciAoMDcvMzEvMDEpICovCgkJdi0+ZmxhZ3MgfD0gVklERU9fQVVESU9fVk9MVU1FOwoJCXJldHVybjsKCX0KCgkvKiAzMiBsZXZlbHMgbG9nYXJpdGhtaWMgKi8KCXZvbCA9IDMyIC0gKCh2LT52b2x1bWU+PjExKSk7CgkvKiB1bml0cyAqLwoJYml0c19vdXQgPSAoUFQyMjU0X0RCU19JTl8yPj4odm9sJTUpKTsKCS8qIHRlbnMgKi8KCWJpdHNfb3V0IHw9IChQVDIyNTRfREJTX0lOXzEwPj4odm9sLzUpKTsKCWJpdHNfb3V0IHw9IFBUMjI1NF9MX0NIQU5ORUwgfCBQVDIyNTRfUl9DSEFOTkVMOwoJZGF0YSA9IGdwaW9fcmVhZCgpOwoJZGF0YSAmPSB+KFdJTlZJRVdfUFQyMjU0X0NMS3wgV0lOVklFV19QVDIyNTRfREFUQXwKCQkgIFdJTlZJRVdfUFQyMjU0X1NUUk9CRSk7Cglmb3IgKGxvb3BzID0gMTc7IGxvb3BzID49IDAgOyBsb29wcy0tKSB7CgkJaWYgKGJpdHNfb3V0ICYgKDE8PGxvb3BzKSkKCQkJZGF0YSB8PSAgV0lOVklFV19QVDIyNTRfREFUQTsKCQllbHNlCgkJCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X0RBVEE7CgkJZ3Bpb193cml0ZShkYXRhKTsKCQl1ZGVsYXkoNSk7CgkJZGF0YSB8PSBXSU5WSUVXX1BUMjI1NF9DTEs7CgkJZ3Bpb193cml0ZShkYXRhKTsKCQl1ZGVsYXkoNSk7CgkJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfQ0xLOwoJCWdwaW9fd3JpdGUoZGF0YSk7Cgl9CglkYXRhIHw9ICBXSU5WSUVXX1BUMjI1NF9TVFJPQkU7CglkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9EQVRBOwoJZ3Bpb193cml0ZShkYXRhKTsKCXVkZWxheSgxMCk7CglkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9TVFJPQkU7CglncGlvX3dyaXRlKGRhdGEpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBtb25vL3N0ZXJlbyBjb250cm9sIGZvciB2YXJpb3VzIGNhcmRzICh3aGljaCBkb24ndCB1c2UgaTJjIGNoaXBzIGJ1dCAgICAqLwovKiBjb25uZWN0IHNvbWV0aGluZyB0byB0aGUgR1BJTyBwaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RhdGljIHZvaWQKZ3ZiY3R2M3BjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCBjb24gPSAwOwoKCWlmIChzZXQpIHsKCQlncGlvX2lub3V0KDB4MzAwLCAweDMwMCk7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkKCQkJY29uID0gMHgwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKCQkJY29uID0gMHgzMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCWNvbiA9IDB4MjAwOwovLwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQovLwkJCWNvbiA9IDB4MTAwOwoJCWdwaW9fYml0cygweDMwMCwgY29uKTsKCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCSAgVklERU9fU09VTkRfTEFORzEgIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCnN0YXRpYyB2b2lkCmd2YmN0djVwY2lfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgdmFsLCBjb247CgojaWYgQlRUVl9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigwLDgsMCkKCWlmIChidHYtPnJhZGlvX3VzZXIpCgkJcmV0dXJuOwojZWxzZQoJaWYgKGJ0di0+cmFkaW8pCgkJcmV0dXJuOwojZW5kaWYKCgl2YWwgPSBncGlvX3JlYWQoKTsKCWlmIChzZXQpIHsKCQljb24gPSAweDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSB7CgkJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpIHsKCQkJCS8qIExBTkcxICsgTEFORzIgKi8KCQkJCWNvbiA9IDB4MTAwOwoJCQl9CgkJCWVsc2UgewoJCQkJLyogTEFORzIgKi8KCQkJCWNvbiA9IDB4MzAwOwoJCQl9CgkJfQoJCWlmIChjb24gIT0gKHZhbCAmIDB4MzAwKSkgewoJCQlncGlvX2JpdHMoMHgzMDAsIGNvbik7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJndmJjdHY1cGNpIik7CgkJfQoJfSBlbHNlIHsKCQlzd2l0Y2ggKHZhbCAmIDB4NzApIHsKCQkgIGNhc2UgMHgxMDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJCWJyZWFrOwoJCSAgY2FzZSAweDMwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTEFORzI7CgkJCWJyZWFrOwoJCSAgY2FzZSAweDUwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTEFORzE7CgkJCWJyZWFrOwoJCSAgY2FzZSAweDYwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfU1RFUkVPOwoJCQlicmVhazsKCQkgIGNhc2UgMHg3MDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk87CgkJCWJyZWFrOwoJCSAgZGVmYXVsdDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkJICBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJCX0KCX0KfQoKLyoKICogTWFyaW8gTWVkaW5hIE51c3NiYXVtIDxtZWRpc29mdEBhbG9oYWJicy5vcmcubXg+CiAqICBJIGRpc2NvdmVyIHRoYXQgb24gQlQ4NDhfR1BJT19EQVRBIGFkZHJlc3MgYSBieXRlIDB4Y2NlIGVuYWJsZSBzdGVyZW8sCiAqICAweGRkZSBlbmFibGVzIG1vbm8gYW5kIDB4Y2NkIGVuYWJsZXMgc2FwCiAqCiAqIFBldHIgVmFuZHJvdmVjIDxWQU5EUk9WRUB2Yy5jdnV0LmN6PgogKiAgUC5TLjogQXQgbGVhc3QgbWFzayBpbiBsaW5lIGFib3ZlIGlzIHdyb25nIC0gR1BJTyBwaW5zIDMsMiBzZWxlY3QKICogIGlucHV0L291dHB1dCBzb3VuZCBjb25uZWN0aW9uLCBzbyBib3RoIG11c3QgYmUgc2V0IGZvciBvdXRwdXQgbW9kZS4KICoKICogTG9va3MgbGlrZSBpdCdzIG5lZWRlZCBvbmx5IGZvciB0aGUgInR2cGhvbmUiLCB0aGUgInR2cGhvbmUgOTgiCiAqIGhhbmRsZXMgdGhpcyB3aXRoIGEgdGRhOTg0MAogKgogKi8Kc3RhdGljIHZvaWQKYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CglpbnQgdmFsID0gMDsKCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgICAvKiBTQVAgKi8KCQkJdmFsID0gMHgwMjsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKCQkJdmFsID0gMHgwMTsKCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDAzLHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJhdmVybWVkaWEiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzE7CgkJcmV0dXJuOwoJfQp9CgpzdGF0aWMgdm9pZAphdmVybWVkaWFfdHZfc3RlcmVvX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJaW50IHZhbCA9IDA7CgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpICAgLyogU0FQICovCgkJCXZhbCA9IDB4MDE7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pICAvKiBTVEVSRU8gKi8KCQkJdmFsID0gMHgwMjsKCQlidGFvcih2YWwsIH4weDAzLCBCVDg0OF9HUElPX0RBVEEpOwoJCWlmIChidHR2X2dwaW8pCgkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImF2ZXJtZWRpYSIpOwoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJcmV0dXJuOwoJfQp9CgovKiBMaWZldGVjIDk0MTUgaGFuZGxpbmcgKi8Kc3RhdGljIHZvaWQKbHQ5NDE1X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewogICAgICAgIGludCB2YWwgPSAwOwoKICAgICAgICBpZiAoZ3Bpb19yZWFkKCkgJiAweDQwMDApIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKCQlyZXR1cm47Cgl9CgogICAgICAgIGlmIChzZXQpIHsKICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpICAvKiBBMiBTQVAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMHgwMDgwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSAvKiBBMiBzdGVyZW8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMHgwODgwOwogICAgICAgICAgICAgICAgaWYgKCh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpIHx8CgkJICAgICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykpCgkJCXZhbCA9IDA7CgkJZ3Bpb19iaXRzKDB4MDg4MCwgdmFsKTsKICAgICAgICAgICAgICAgIGlmIChidHR2X2dwaW8pCiAgICAgICAgICAgICAgICAgICAgICAgIGJ0dHZfZ3Bpb190cmFja2luZyhidHYsImx0OTQxNSIpOwogICAgICAgIH0gZWxzZSB7CgkJLyogYXV0b2RldGVjdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGlzIGNhcmQgOi0oICovCiAgICAgICAgICAgICAgICB2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQp9CgovLyBUREE5ODIxIG9uIFRlcnJhVFYrIEJ0ODQ4LCBCdDg3OApzdGF0aWMgdm9pZAp0ZXJyYXR2X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IGNvbiA9IDA7CgoJaWYgKHNldCkgewoJCWdwaW9faW5vdXQoMHgxODAwMDAsMHgxODAwMDApOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCgkJCWNvbiA9IDB4MDgwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQljb24gPSAweDE4MDAwMDsKCQlncGlvX2JpdHMoMHgxODAwMDAsIGNvbik7CgkJaWYgKGJ0dHZfZ3BpbykKCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVycmF0diIpOwoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCnN0YXRpYyB2b2lkCndpbmZhc3QyMDAwX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgbG9uZyB2YWwgPSAwOwoKCWlmIChzZXQpIHsKCQkvKmJ0b3IgKDB4YzMyMDAwLCBCVDg0OF9HUElPX09VVF9FTik7Ki8KCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCQkvKiBNb25vICovCgkJCXZhbCA9IDB4NDIwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCS8qIE1vbm8gKi8KCQkJdmFsID0gMHg0MjAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikJLyogU0FQICovCgkJCXZhbCA9IDB4NDEwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQkvKiBTdGVyZW8gKi8KCQkJdmFsID0gMHgwMjAwMDA7CgkJaWYgKHZhbCkgewoJCQlncGlvX2JpdHMoMHg0MzAwMDAsIHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ3aW5mYXN0MjAwMCIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIERhcml1c3ogS293YWxld3NraSA8ZGFyZWtrQGF1dG9tZXgucGw+CiAqIHNvdW5kIGNvbnRyb2wgZm9yIFByb2xpbmsgUFYtQlQ4NzhQKzlCIChQaXhlbFZpZXcgUGxheVRWIFBybyBGTStOSUNBTQogKiByZXZpc2lvbiA5QiBoYXMgb24tYm9hcmQgVERBOTg3NEEgc291bmQgZGVjb2RlcikuCiAqCiAqIE5vdGU6IFRoZXJlIGFyZSBjYXJkIHZhcmlhbnRzIHdpdGhvdXQgdGRhOTg3NGEuIEZvcmNpbmcgdGhlICJzdGVyZW8gc291bmQgcm91dGUiCiAqICAgICAgIHdpbGwgbXV0ZSB0aGlzIGNhcmRzLgogKi8Kc3RhdGljIHZvaWQKcHZidDg3OHA5Yl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCB2YWwgPSAwOwoKI2lmIEJUVFZfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMCw4LDApCglpZiAoYnR2LT5yYWRpb191c2VyKQoJCXJldHVybjsKI2Vsc2UKCWlmIChidHYtPnJhZGlvKQoJCXJldHVybjsKI2VuZGlmCgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJewoJCQl2YWwgPSAweDAxOwoJCX0KCQlpZiAoKHYtPm1vZGUgJiAoVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMikpCgkJICAgIHx8ICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSkgewoJCQl2YWwgPSAweDAyOwoJCX0KCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDAzLHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJwdmJ0ODc4cDliIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIERhcml1c3ogS293YWxld3NraSA8ZGFyZWtrQGF1dG9tZXgucGw+CiAqIHNvdW5kIGNvbnRyb2wgZm9yIEZseVZpZGVvIDIwMDBTICh3aXRoIHRkYTk4NzQgZGVjb2RlcikKICogYmFzZWQgb24gcHZidDg3OHA5Yl9hdWRpbygpIC0gdGhpcyBpcyBub3QgdGVzdGVkLCBwbGVhc2UgZml4ISEhCiAqLwpzdGF0aWMgdm9pZApmdjIwMDBzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCA9IDB4ZmZmZjsKCiNpZiBCVFRWX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDAsOCwwKQoJaWYgKGJ0di0+cmFkaW9fdXNlcikKCQlyZXR1cm47CiNlbHNlCglpZiAoYnR2LT5yYWRpbykKCQlyZXR1cm47CiNlbmRpZgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJewoJCQl2YWwgPSAweDAwMDA7CgkJfQoJCWlmICgodi0+bW9kZSAmIChWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyKSkKCQkgICAgfHwgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pKSB7CgkJCXZhbCA9IDB4MTA4MDsgLy8tZGstPz8/OiAweDA4ODAsIDB4MDA4MCwgMHgxODAwIC4uLgoJCX0KCQlpZiAodmFsICE9IDB4ZmZmZikgewoJCQlncGlvX2JpdHMoMHgxODAwLCB2YWwpOwoJCQlpZiAoYnR0dl9ncGlvKQoJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwiZnYyMDAwcyIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJfQp9CgovKgogKiBzb3VuZCBjb250cm9sIGZvciBDYW5vcHVzIFdpbkRWUiBQQ0kKICogTWFzYWtpIFN1enVraSA8bWFzYWtpQGJ0cmVlLm9yZz4KICovCnN0YXRpYyB2b2lkCndpbmR2cl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKICAgICAgICB1bnNpZ25lZCBsb25nIHZhbCA9IDA7CgogICAgICAgIGlmIChzZXQpIHsKICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMHgwNDAwMDA7CiAgICAgICAgICAgICAgICBpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOwogICAgICAgICAgICAgICAgaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMHgxMDAwMDA7CiAgICAgICAgICAgICAgICBpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMDsKICAgICAgICAgICAgICAgIGlmICh2YWwpIHsKCQkJZ3Bpb19iaXRzKDB4MTQwMDAwLCB2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnR0dl9ncGlvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0dHZfZ3Bpb190cmFja2luZyhidHYsIndpbmR2ciIpOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKICAgICAgICB9Cn0KCi8qCiAqIHNvdW5kIGNvbnRyb2wgZm9yIEFELVRWSzUwMwogKiBIaXJvc2hpIFRha2VrYXdhIDxzaWFuQGJpZy5vci5qcD4KICovCnN0YXRpYyB2b2lkCmFkdHZrNTAzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IGNvbiA9IDB4ZmZmZmZmOwoKCS8vYnRhb3IoMHgxZTAwMDAsIH4weDFlMDAwMCwgQlQ4NDhfR1BJT19PVVRfRU4pOwoKCWlmIChzZXQpIHsKCQkvL2J0b3IoKioqLCBCVDg0OF9HUElPX09VVF9FTik7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkKCQkJY29uID0gMHgwMDAwMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQoJCQljb24gPSAweDAwMTgwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQljb24gPSAweDAwMDAwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKCQkJY29uID0gMHgwMDA2MDAwMDsKCQlpZiAoY29uICE9IDB4ZmZmZmZmKSB7CgkJCWdwaW9fYml0cygweDFlMDAwMCxjb24pOwoJCQlpZiAoYnR0dl9ncGlvKQoJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwgImFkdHZrNTAzIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCSAgVklERU9fU09VTkRfTEFORzEgIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qIFJlbW90ZVZpc2lvbiBNWCAocnY2MDUpIG11eHNlbCBoZWxwZXIgW01pZ3VlbCBGcmVpdGFzXQogKgogKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHJ2NjA1IGRvbid0IHVzZSBhIG5vcm1hbCBtdWx0aXBsZXgsIGJ1dCBhIGNyb3NzcG9pbnQKICogc3dpdGNoIGluc3RlYWQgKENEMjJNMzQ5NEUpLiBUaGlzIElDIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBjb25uZWN0aW9ucwogKiBiZXR3ZWVuIFhuIChpbnB1dCkgYW5kIFluIChvdXRwdXQpIHBpbnMuIFdlIG5lZWQgdG8gY2xlYXIgYW55IGV4aXN0aW5nCiAqIGNvbm5lY3Rpb24gcHJpb3IgdG8gZXN0YWJsaXNoIGEgbmV3IG9uZSwgcHVsc2luZyB0aGUgU1RST0JFIHBpbi4KICoKICogVGhlIGJvYXJkIGhhcmR3aXJlIFkwICh4cG9pbnQpIHRvIE1VWDEgYW5kIE1VWE9VVCB0byBZaW4uCiAqIEdQSU8gcGlucyBhcmUgd2lyZWQgYXM6CiAqICBHUElPWzA6M10gLSBBWFswOjNdICh4cG9pbnQpIC0gUDFbMDozXSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzQ6Nl0gLSBBWVswOjJdICh4cG9pbnQpIC0gUDFbNDo2XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzddICAgLSBEQVRBICh4cG9pbnQpICAgIC0gUDFbN10gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJT1s4XSAgIC0gICAgICAgICAgICAgICAgICAtIFAzWzVdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bOV0gICAtIFJFU0VUICh4cG9pbnQpICAgLSBQM1s2XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzEwXSAgLSBTVFJPQkUgKHhwb2ludCkgIC0gUDNbN10gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJTlRSICAgIC0gICAgICAgICAgICAgICAgICAtIFAzWzRdIChtaWNyb2NvbnRyb2xlcikKICoKICogVGhlIG1pY3JvY29udHJvbGVyIGlzIGEgODBDMzIgbGlrZS4gSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGNoYW5nZSB4cG9pbnQKICogY29uZmlndXJhdGlvbiBlaXRoZXIgZGlyZWN0bHkgKGFzIHdlIGFyZSBkb2luZykgb3IgdXNpbmcgdGhlIG1pY3JvY29udHJvbGVyCiAqIHdoaWNoIGlzIGFsc28gd2lyZWQgdG8gSTJDIGludGVyZmFjZS4gSSBoYXZlIG5vIGZ1cnRoZXIgaW5mbyBvbiB0aGUKICogbWljcm9jb250cm9sZXIgZmVhdHVyZXMsIG9uZSB3b3VsZCBuZWVkIHRvIGRpc2Fzc2VtYmx5IHRoZSBmaXJtd2FyZS4KICogbm90ZTogdGhlIHZlbmRvciByZWZ1c2VkIHRvIGdpdmUgYW55IGluZm9ybWF0aW9uIG9uIHRoaXMgcHJvZHVjdCwgYWxsCiAqICAgICAgIHRoYXQgc3R1ZmYgd2FzIGZvdW5kIHVzaW5nIGEgbXVsdGltZXRlciEgOikKICovCnN0YXRpYyB2b2lkIHJ2NjA1X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCS8qIHJlc2V0IGFsbCBjb25lY3Rpb25zICovCglncGlvX2JpdHMoMHgyMDAsMHgyMDApOwoJbWRlbGF5KDEpOwoJZ3Bpb19iaXRzKDB4MjAwLDB4MDAwKTsKCW1kZWxheSgxKTsKCgkvKiBjcmVhdGUgYSBuZXcgY29uZWN0aW9uICovCglncGlvX2JpdHMoMHg0ODAsMHgwODApOwoJZ3Bpb19iaXRzKDB4NDgwLDB4NDgwKTsKCW1kZWxheSgxKTsKCWdwaW9fYml0cygweDQ4MCwweDA4MCk7CgltZGVsYXkoMSk7Cn0KCi8qIFRpYmV0IFN5c3RlbXMgJ1Byb2dyZXNzIERWUicgQ1MxNiBtdXhzZWwgaGVscGVyIFtDaHJpcyBGYW5uaW5nXQogKgogKiBUaGUgQ1MxNiAoYXZhaWxhYmxlIG9uIGVCYXkgY2hlYXApIGlzIGEgUENJIGJvYXJkIHdpdGggZm91ciBGdXNpb24KICogODc4QSBjaGlwcywgYSBQQ0kgYnJpZGdlLCBhbiBBdG1lbCBtaWNyb2NvbnRyb2xsZXIsIGZvdXIgc3luYyBzZXBlcmF0b3IKICogY2hpcHMsIHRlbiBlaWdodCBpbnB1dCBhbmFsb2cgbXVsdGlwbGV4b3JzLCBhIG5vdCBjaGlwIGFuZCBhIGZldwogKiBvdGhlciBjb21wb25lbnRzLgogKgogKiAxNiBpbnB1dHMgb24gYSBzZWNvbmRhcnkgYnJhY2tldCBhcmUgcHJvdmlkZWQgYW5kIGNhbiBiZSBzZWxlY3RlZAogKiBmcm9tIGVhY2ggb2YgdGhlIGZvdXIgY2FwdHVyZSBjaGlwcy4gIFR3byBvZiB0aGUgZWlnaHQgaW5wdXQKICogbXVsdGlwbGV4b3JzIGFyZSB1c2VkIHRvIHNlbGVjdCBmcm9tIGFueSBvZiB0aGUgMTYgaW5wdXQgc2lnbmFscy4KICoKICogVW5zdXBwb3J0ZWQgaGFyZHdhcmUgY2FwYWJpbGl0aWVzOgogKiAgLiBBIHZpZGVvIG91dHB1dCBtb25pdG9yIG9uIHRoZSBzZWNvbmRhcnkgYnJhY2tldCBjYW4gYmUgc2VsZWN0ZWQgZnJvbQogKiAgICBvbmUgb2YgdGhlIDg3OEEgY2hpcHMuCiAqICAuIEFub3RoZXIgcGFzc3Rocm91Z2ggYnV0IEkgaGF2ZW4ndCBzcGVudCBhbnkgdGltZSBpbnZlc3RpZ2F0aW5nIGl0LgogKiAgLiBEaWdpdGFsIEkvTyAobG9naWMgbGV2ZWwgY29ubmVjdGVkIHRvIEdQSU8pIGlzIGF2YWlsYWJsZSBmcm9tIGFuCiAqICAgIG9uYm9hcmQgaGVhZGVyLgogKgogKiBUaGUgb24gY2hpcCBpbnB1dCBtdXggc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gMi4KICogR1BJT1sxNjoxOV0gLSBWaWRlbyBpbnB1dCBzZWxlY3Rpb24KICogR1BJT1swOjNdICAgLSBWaWRlbyBvdXRwdXQgbW9uaXRvciBzZWxlY3QgKG9ubHkgYXZhaWxhYmxlIGZyb20gb25lIDg3OEEpCiAqIEdQSU9bPzo/XSAgIC0gRGlnaXRhbCBJL08uCiAqCiAqIFRoZXJlIGlzIGFuIEFUTUVMIG1pY3JvY29udHJvbGxlciB3aXRoIGFuIDgwMzEgY29yZSBvbiBib2FyZC4gIEkgaGF2ZSBub3QKICogZGV0ZXJtaW5lZCB3aGF0IGZ1bmN0aW9uIChpZiBhbnkpIGl0IHByb3ZpZGVzLiAgV2l0aCB0aGUgbWljcm9jb250cm9sbGVyCiAqIGFuZCBzeW5jIHNlcGVyYXRvciBjaGlwcyBhIGd1ZXNzIGlzIHRoYXQgaXQgbWlnaHQgaGF2ZSB0byBkbyB3aXRoIHZpZGVvCiAqIHN3aXRjaGluZyBhbmQgbWF5YmUgc29tZSBkaWdpdGFsIEkvTy4KICovCnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CgkvKiB2aWRlbyBtdXggKi8KCWdwaW9fYml0cygweDBmMDAwMCwgaW5wdXQgPDwgMTYpOwp9CgpzdGF0aWMgdm9pZCB0aWJldENTMTZfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKiBlbmFibGUgZ3BpbyBiaXRzLCBtYXNrIG9idGFpbmVkIHZpYSBidFNweSAqLwoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMHgwZjdmZmYpOwoJZ3Bpb193cml0ZSgweDBmN2ZmZik7Cn0KCi8qCiAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZm9yIHRoZSBLb2RpY29tLTQ0MDByIGdldCBhIGxpdHRsZSBtaW5kLXR3aXN0aW5nLgogKiBUaGVyZSBpcyBhICJtYXN0ZXIiIGNvbnRyb2xsZXIgYW5kIHRocmVlICJzbGF2ZSIgY29udHJvbGxlcnMsIHRvZ2V0aGVyCiAqIGFuIGFuYWxvZyBzd2l0Y2ggd2hpY2ggY29ubmVjdHMgYW55IG9mIDE2IGNhbWVyYXMgdG8gYW55IG9mIHRoZSBCVDg3QSdzLgogKiBUaGUgYW5hbG9nIHN3aXRjaCBpcyBjb250cm9sbGVkIGJ5IHRoZSAibWFzdGVyIiwgYnV0IHRoZSBkZXRlY3Rpb24gb3JkZXIKICogb2YgdGhlIGZvdXIgQlQ4NzhBIGNoaXBzIGlzIGluIGFuIG9yZGVyIHdoaWNoIEkganVzdCBkb24ndCB1bmRlcnN0YW5kLgogKiBUaGUgIm1hc3RlciIgaXMgYWN0dWFsbHkgdGhlIHNlY29uZCBjb250cm9sbGVyIHRvIGJlIGRldGVjdGVkLiAgVGhlCiAqIGxvZ2ljIG9uIHRoZSBib2FyZCB1c2VzIGxvZ2ljYWwgbnVtYmVycyBmb3IgdGhlIDQgY29udHJvbGVycywgYnV0CiAqIHRob3NlIG51bWJlcnMgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBkZXRlY3Rpb24gc2VxdWVuY2UuICBXaGVuIHdvcmtpbmcKICogd2l0aCB0aGUgYW5hbG9nIHN3aXRjaCwgd2UgbmVlZCB0byAibWFwIiBmcm9tIHRoZSBkZXRlY3Rpb24gc2VxdWVuY2UKICogb3ZlciB0byB0aGUgYm9hcmQncyBsb2dpY2FsIGNvbnRyb2xsZXIgbnVtYmVyLiAgVGhpcyBtYXBwaW5nIHNlcXVlbmNlCiAqIGlzIHszLCAwLCAyLCAxfSwgaS5lLiB0aGUgZmlyc3QgY29udHJvbGxlciB0byBiZSBkZXRlY3RlZCBpcyBsb2dpY2FsCiAqIHVuaXQgMywgdGhlIHNlY29uZCAod2hpY2ggaXMgdGhlIG1hc3RlcikgaXMgbG9naWNhbCB1bml0IDAsIGV0Yy4KICogV2UgbmVlZCB0byBtYWludGFpbiB0aGUgc3RhdHVzIG9mIHRoZSBhbmFsb2cgc3dpdGNoICh3aGljaCBvZiB0aGUgMTYKICogY2FtZXJhcyBpcyBjb25uZWN0ZWQgdG8gd2hpY2ggb2YgdGhlIDQgY29udHJvbGxlcnMpLiAgUmF0aGVyIHRoYW4KICogYWRkIHRvIHRoZSBidHR2IHN0cnVjdHVyZSBmb3IgdGhpcywgd2UgdXNlIHRoZSBkYXRhIHJlc2VydmVkIGZvcgogKiB0aGUgbWJveCAodW51c2VkIGZvciB0aGlzIGNhcmQgdHlwZSkuCiAqLwoKLyoKICogRmlyc3QgYSByb3V0aW5lIHRvIHNldCB0aGUgYW5hbG9nIHN3aXRjaCwgd2hpY2ggY29udHJvbHMgd2hpY2ggY2FtZXJhCiAqIGlzIHJvdXRlZCB0byB3aGljaCBjb250cm9sbGVyLiAgVGhlIHN3aXRjaCBjb21wcmlzZXMgYW4gWC1hZGRyZXNzCiAqIChncGlvIGJpdHMgMC0zLCByZXByZXNlbnRpbmcgdGhlIGNhbWVyYSwgcmFuZ2luZyBmcm9tIDAtMTUpLCBhbmQgYQogKiBZLWFkZHJlc3MgKGdwaW8gYml0cyA0LTYsIHJlcHJlc2VudGluZyB0aGUgY29udHJvbGxlciwgcmFuZ2luZyBmcm9tIDAtMykuCiAqIEEgZGF0YSB2YWx1ZSAoZ3BpbyBiaXQgNykgb2YgJzEnIGVuYWJsZXMgdGhlIHN3aXRjaCwgYW5kICcwJyBkaXNhYmxlcwogKiB0aGUgc3dpdGNoLiAgQSBTVFJPQkUgYml0IChncGlvIGJpdCA4KSBsYXRjaGVzIHRoZSBkYXRhIHZhbHVlIGludG8gdGhlCiAqIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhlIGlkZWEgaXMgdG8gc2V0IHRoZSBhZGRyZXNzIGFuZCBkYXRhLCB0aGVuIGJyaW5nCiAqIFNUUk9CRSBoaWdoLCBhbmQgZmluYWxseSBicmluZyBTVFJPQkUgYmFjayB0byBsb3cuCiAqLwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfd3JpdGUoc3RydWN0IGJ0dHYgKmJ0diwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgeGFkZHIsCgkJCSAgICAgICB1bnNpZ25lZCBjaGFyIHlhZGRyLAoJCQkgICAgICAgdW5zaWduZWQgY2hhciBkYXRhKSB7Cgl1bnNpZ25lZCBpbnQgdWRhdGE7CgoJdWRhdGEgPSAoZGF0YSA8PCA3KSB8ICgoeWFkZHImMykgPDwgNCkgfCAoeGFkZHImMHhmKTsKCWdwaW9fYml0cygweDFmZiwgdWRhdGEpOwkJLyogd3JpdGUgQUREUiBhbmQgREFUICovCglncGlvX2JpdHMoMHgxZmYsIHVkYXRhIHwgKDEgPDwgOCkpOwkvKiBzdHJvYmUgaGlnaCAqLwoJZ3Bpb19iaXRzKDB4MWZmLCB1ZGF0YSk7CQkvKiBzdHJvYmUgbG93ICovCn0KCi8qCiAqIE5leHQgdGhlIG11eCBzZWxlY3QuICBCb3RoIHRoZSAibWFzdGVyIiBhbmQgInNsYXZlIiAnY2FyZHMnIChjb250cm9sbGVycykKICogdXNlIHRoaXMgcm91dGluZS4gIFRoZSByb3V0aW5lIGZpbmRzIHRoZSAibWFzdGVyIiBmb3IgdGhlIGNhcmQsIG1hcHMKICogdGhlIGNvbnRyb2xsZXIgbnVtYmVyIGZyb20gdGhlIGRldGVjdGVkIHBvc2l0aW9uIG92ZXIgdG8gdGhlIGxvZ2ljYWwKICogbnVtYmVyLCB3cml0ZXMgdGhlIGFwcHJvcHJpYXRlIGRhdGEgdG8gdGhlIGFuYWxvZyBzd2l0Y2gsIGFuZCBob3VzZWtlZXBzCiAqIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBzd2l0Y2ggaW5mb3JtYXRpb24uICBUaGUgcGFyYW1ldGVyICdpbnB1dCcgaXMgdGhlCiAqIHJlcXVlc3RlZCBjYW1lcmEgbnVtYmVyICgwIC0gMTUpLgogKi8Kc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCWNoYXIgKnN3X3N0YXR1czsKCWludCB4YWRkciwgeWFkZHI7CglzdHJ1Y3QgYnR0diAqbWN0bHI7CglzdGF0aWMgdW5zaWduZWQgY2hhciBtYXBbNF0gPSB7MywgMCwgMiwgMX07CgoJbWN0bHIgPSBtYXN0ZXJbYnR2LT5jLm5yXTsKCWlmIChtY3RsciA9PSBOVUxMKSB7CS8qIGlnbm9yZSBpZiBtYXN0ZXIgbm90IHlldCBkZXRlY3RlZCAqLwoJCXJldHVybjsKCX0KCXlhZGRyID0gKGJ0di0+Yy5uciAtIG1jdGxyLT5jLm5yICsgMSkgJiAzOyAvKiB0aGUgJyYnIGlzIGZvciBzYWZldHkgKi8KCXlhZGRyID0gbWFwW3lhZGRyXTsKCXN3X3N0YXR1cyA9IChjaGFyICopKCZtY3Rsci0+bWJveF93ZSk7Cgl4YWRkciA9IGlucHV0ICYgMHhmOwoJLyogQ2hlY2sgaWYgdGhlIGNvbnRyb2xsZXIvY2FtZXJhIHBhaXIgaGFzIGNoYW5nZWQsIGVsc2UgaWdub3JlICovCglpZiAoc3dfc3RhdHVzW3lhZGRyXSAhPSB4YWRkcikKCXsKCQkvKiAib3BlbiIgdGhlIG9sZCBzd2l0Y2gsICJjbG9zZSIgdGhlIG5ldyBvbmUsIHNhdmUgdGhlIG5ldyAqLwoJCWtvZGljb200NDAwcl93cml0ZShtY3Rsciwgc3dfc3RhdHVzW3lhZGRyXSwgeWFkZHIsIDApOwoJCXN3X3N0YXR1c1t5YWRkcl0gPSB4YWRkcjsKCQlrb2RpY29tNDQwMHJfd3JpdGUobWN0bHIsIHhhZGRyLCB5YWRkciwgMSk7Cgl9Cn0KCi8qCiAqIER1cmluZyBpbml0aWFsaXNhdGlvbiwgd2UgbmVlZCB0byByZXNldCB0aGUgYW5hbG9nIHN3aXRjaC4gIFdlCiAqIGFsc28gcHJlc2V0IHRoZSBzd2l0Y2ggdG8gbWFwIHRoZSA0IGNvbm5lY3RvcnMgb24gdGhlIGNhcmQgdG8gdGhlCiAqICp1c2VyJ3MqIChzZWUgYWJvdmUgZGVzY3JpcHRpb24gb2Yga29kaWNvbTQ0MDByX211eHNlbCkgY2hhbm5lbHMKICogMCB0aHJvdWdoIDMKICovCnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl9pbml0KHN0cnVjdCBidHR2ICpidHYpCnsKCWNoYXIgKnN3X3N0YXR1cyA9IChjaGFyICopKCZidHYtPm1ib3hfd2UpOwoJaW50IGl4OwoKCWdwaW9faW5vdXQoMHgwMDAzZmYsIDB4MDAwM2ZmKTsKCWdwaW9fd3JpdGUoMSA8PCA5KTsJLyogcmVzZXQgTVVYICovCglncGlvX3dyaXRlKDApOwoJLyogUHJlc2V0IGNhbWVyYSAwIHRvIHRoZSA0IGNvbnRyb2xsZXJzICovCglmb3IgKGl4PTA7IGl4PDQ7IGl4KyspIHsKCQlzd19zdGF0dXNbaXhdID0gaXg7CgkJa29kaWNvbTQ0MDByX3dyaXRlKGJ0diwgaXgsIGl4LCAxKTsKCX0KCS8qCgkgKiBTaW5jZSB0aGlzIGlzIHRoZSAibWFzdGVyIiwgd2UgbmVlZCB0byBzZXQgdXAgdGhlCgkgKiBvdGhlciB0aHJlZSBjb250cm9sbGVyIGNoaXBzJyBwb2ludGVycyB0byB0aGlzIHN0cnVjdHVyZQoJICogZm9yIGxhdGVyIHVzZSBpbiB0aGUgbXV4c2VsIHJvdXRpbmUuCgkgKi8KCWlmICgoYnR2LT5jLm5yPDEpIHx8IChidHYtPmMubnI+QlRUVl9NQVgtMykpCgkgICAgcmV0dXJuOwoJbWFzdGVyW2J0di0+Yy5uci0xXSA9IGJ0djsKCW1hc3RlcltidHYtPmMubnJdICAgPSBidHY7CgltYXN0ZXJbYnR2LT5jLm5yKzFdID0gYnR2OwoJbWFzdGVyW2J0di0+Yy5ucisyXSA9IGJ0djsKfQoKLy8gVGhlIEdyYW5kdGVjIFgtR3VhcmQgZnJhbWVncmFiYmVyIGNhcmQgdXNlcyB0d28gRHVhbCA0LWNoYW5uZWwKLy8gdmlkZW8gbXVsdGlwbGV4ZXJzIHRvIHByb3ZpZGUgdXAgdG8gMTYgdmlkZW8gaW5wdXRzLiBUaGVzZQovLyBtdWx0aXBsZXhlcnMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIGxvd2VyIDggR1BJTyBwaW5zIG9mIHRoZQovLyBidDg3OC4gVGhlIG11bHRpcGxleGVycyBwcm9iYWJseSBQZXJpY29tIFBJNVYzMzFRIG9yIHNpbWlsYXIuCgovLyB4eHgwIGlzIHBpbiB4eHggb2YgbXVsdGlwbGV4ZXIgVTUsCi8vIHl5eTEgaXMgcGluIHl5eSBvZiBtdWx0aXBsZXhlciBVMgoKI2RlZmluZSBFTkEwICAgIDB4MDEKI2RlZmluZSBFTkIwICAgIDB4MDIKI2RlZmluZSBFTkExICAgIDB4MDQKI2RlZmluZSBFTkIxICAgIDB4MDgKCiNkZWZpbmUgSU4xMCAgICAweDEwCiNkZWZpbmUgSU4wMCAgICAweDIwCiNkZWZpbmUgSU4xMSAgICAweDQwCiNkZWZpbmUgSU4wMSAgICAweDgwCgpzdGF0aWMgdm9pZCB4Z3VhcmRfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJc3RhdGljIGNvbnN0IGludCBtYXNrc1tdID0gewogICAgICAgICAgICAgICAgRU5CMCwgRU5CMHxJTjAwLCBFTkIwfElOMTAsIEVOQjB8SU4wMHxJTjEwLAogICAgICAgICAgICAgICAgRU5BMCwgRU5BMHxJTjAwLCBFTkEwfElOMTAsIEVOQTB8SU4wMHxJTjEwLAogICAgICAgICAgICAgICAgRU5CMSwgRU5CMXxJTjAxLCBFTkIxfElOMTEsIEVOQjF8SU4wMXxJTjExLAogICAgICAgICAgICAgICAgRU5BMSwgRU5BMXxJTjAxLCBFTkExfElOMTEsIEVOQTF8SU4wMXxJTjExLAoJfTsKCWdwaW9fd3JpdGUobWFza3NbaW5wdXQlMTZdKTsKfQpzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKlRoaXMgaXMgdGhlIHZpZGVvIGlucHV0IHJlZGlyZWN0aW9uIGZvbmN0aW9uYWxpdHkgOiBJIERJRCBOT1QgVVNFRCBJVC4gKi8KCWJ0d3JpdGUgKDB4MDg8PDE2LEJUODQ4X0dQSU9fREFUQSk7LypHUElPWzE5XSBbPT0+IDQwNTMgQitDXSBzZXQgdG8gMSAqLwoJYnR3cml0ZSAoMHgwNDw8MTYsQlQ4NDhfR1BJT19EQVRBKTsvKkdQSU9bMThdIFs9PT4gNDA1MyBBXSAgc2V0IHRvIDEqLwp9CnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9tdXhzZWwgKHN0cnVjdCBidHR2KiBidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoKCWRwcmludGsgKEtFUk5fREVCVUcgImJ0dHYlZCA6IHBpY29sb190ZXRyYV9tdXhzZWwgPT4gIGlucHV0ID0gJWRcbiIsYnR2LT5jLm5yLGlucHV0KTsKCS8qSnVzdCBzZXQgdGhlIHJpZ2h0IHBhdGggaW4gdGhlIGFuYWxvZyBtdWx0aXBsZXhlcnMgOiBjaGFubmVsIDEgLT4gNCA9PT4gQW5hbG9nIE11eCA9PT4gTVVYMCovCgkvKkdQSU9bMjBdJkdQSU9bMjFdIHVzZWQgdG8gY2hvb3NlIHRoZSByaWdodCBpbnB1dCovCglidHdyaXRlIChpbnB1dDw8MjAsQlQ4NDhfR1BJT19EQVRBKTsKCn0KCi8qCiAqIGl2YzEyMF9tdXhzZWwgW0FkZGVkIGJ5IEFsYW4gR2FyZmllbGQgPGFsYW5AZnJvbW9yYml0LmNvbT5dCiAqCiAqIFRoZSBJVkMxMjBHIHNlY3VyaXR5IGNhcmQgaGFzIDQgaTJjIGNvbnRyb2xsZWQgVERBODU0MCBtYXRyaXgKICogc3dpY2hlcnMgdG8gcHJvdmlkZSAxNiBjaGFubmVscyB0byBNVVgwLiBUaGUgVERBODU0MCdzIGhhdmUKICogNCBpbmRlcGVkYW50IG91dHB1dHMgYW5kIGFzIHN1Y2ggdGhlIElWQzEyMEcgYWxzbyBoYXMgdGhlCiAqIG9wdGlvbmFsICJNb25pdG9yIE91dCIgYnVzLiBUaGlzIGFsbG93cyB0aGUgY2FyZCB0byBiZSBsb29raW5nCiAqIGF0IG9uZSBpbnB1dCB3aGlsZSB0aGUgbW9uaXRvciBpcyBsb29raW5nIGF0IGFub3RoZXIuCiAqCiAqIFNpbmNlIEkndmUgY291bGRuJ3QgYmUgYm90aGVyZWQgZmlndXJpbmcgb3V0IGhvdyB0byBhZGQgYW4KICogaW5kZXBlbmRhbnQgbXV4c2VsIGZvciB0aGUgbW9uaXRvciBidXMsIEkndmUganVzdCBzZXQgaXQgdG8KICogd2hhdGV2ZXIgdGhlIGNhcmQgaXMgbG9va2luZyBhdC4KICoKICogIE9VVDAgb2YgdGhlIFREQTg1NDAncyBpcyBjb25uZWN0ZWQgdG8gTVVYMCAgICAgICAgICgweDAzKQogKiAgT1VUMSBvZiB0aGUgVERBODU0MCdzIGlzIGNvbm5lY3RlZCB0byAiTW9uaXRvciBPdXQiICAgICAgICAoMHgwQykKICoKICogIFREQTg1NDBfQUxUMyBJTjAtMyA9IENoYW5uZWwgMTMgLSAxNiAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNCBJTjAtMyA9IENoYW5uZWwgMSAtIDQgICAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNSBJTjAtMyA9IENoYW5uZWwgNSAtIDggICAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNiBJTjAtMyA9IENoYW5uZWwgOSAtIDEyICAgICAgICAgICAgICAgICgweDAzKQogKgogKi8KCi8qIEFsbCA3IHBvc3NpYmxlIHN1Yi1pZHMgZm9yIHRoZSBUREE4NTQwIE1hdHJpeCBTd2l0Y2hlciAqLwojZGVmaW5lIEkyQ19UREE4NTQwICAgICAgICAweDkwCiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUMSAgIDB4OTIKI2RlZmluZSBJMkNfVERBODU0MF9BTFQyICAgMHg5NAojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDMgICAweDk2CiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUNCAgIDB4OTgKI2RlZmluZSBJMkNfVERBODU0MF9BTFQ1ICAgMHg5YQojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDYgICAweDljCgpzdGF0aWMgdm9pZCBpdmMxMjBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJLy8gU2ltcGxlIG1hdGhzCglpbnQga2V5ID0gaW5wdXQgJSA0OwoJaW50IG1hdHJpeCA9IGlucHV0IC8gNDsKCglkcHJpbnRrKCJidHR2JWQ6IGl2YzEyMF9tdXhzZWw6IElucHV0IC0gJTAyZCB8IFREQSAtICUwMmQgfCBJbiAtICUwMmRcbiIsCgkJYnR2LT5jLm5yLCBpbnB1dCwgbWF0cml4LCBrZXkpOwoKCS8vIEhhbmRsZXMgdGhlIGlucHV0IHNlbGVjdGlvbiBvbiB0aGUgVERBODU0MCdzCglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUMywgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAzKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNCwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAwKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNSwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAxKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNiwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAyKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CgoJLy8gSGFuZGxlcyB0aGUgb3V0cHV0IGVuYWJsZXMgb24gdGhlIFREQTg1NDAncwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDMsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMykgPyAweDAzIDogMHgwMCksIDEpOyAgLy8gMTMgLSAxNgoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDQsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMCkgPyAweDAzIDogMHgwMCksIDEpOyAgLy8gMS00CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNSwgMHgwMiwKCQkgICAgICAoKG1hdHJpeCA9PSAxKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvLyA1LTgKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ2LCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDIpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8vIDktMTIKCgkvLyBTZWxlY3RzIE1VWDAgZm9yIGlucHV0IG9uIHRoZSA4NzgKCWJ0YW9yKCgwKTw8NSwgfigzPDw1KSwgQlQ4NDhfSUZPUk0pOwp9CgoKLyogUFhDMjAwIG11eHNlbCBoZWxwZXIKICogbHVrZUBzeXNlbmcuYW51LmVkdS5hdQogKiBhbm90aGVyIHRyYW5zcGxhbnQKICogZnJvbSBBbGVzc2FuZHJvIFJ1YmluaSAocnViaW5pQGxpbnV4Lml0KQogKgogKiBUaGVyZSBhcmUgNCBraW5kcyBvZiBjYXJkczoKICogUFhDMjAwTCB3aGljaCBpcyBidDg0OAogKiBQWEMyMDBGIHdoaWNoIGlzIGJ0ODQ4IHdpdGggUElDIGNvbnRyb2xsaW5nIG11eAogKiBQWEMyMDBBTCB3aGljaCBpcyBidDg3OAogKiBQWEMyMDBBRiB3aGljaCBpcyBidDg3OCB3aXRoIFBJQyBjb250cm9sbGluZyBtdXgKICovCiNkZWZpbmUgUFhfQ0ZHX1BYQzIwMEYgMHgwMQojZGVmaW5lIFBYX0ZMQUdfUFhDMjAwQSAgMHgwMDAwMTAwMCAvKiBhIHB4YzIwMEEgaXMgYnQtODc4IGJhc2VkICovCiNkZWZpbmUgUFhfSTJDX1BJQyAgICAgICAweDBmCiNkZWZpbmUgUFhfUFhDMjAwQV9DQVJESUQgMHgyMDBhMTI5NQojZGVmaW5lIFBYX0kyQ19DTURfQ0ZHICAgMHgwMAoKc3RhdGljIHZvaWQgUFhDMjAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKICAgICAgICBpbnQgcmM7Cglsb25nIG11eDsKCWludCBiaXRtYXNrOwogICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmWzJdOwoKCS8qIFJlYWQgUElDIGNvbmZpZyB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIFBYQzIwMEYgKi8KCS8qIFBYX0kyQ19DTURfQ0ZHKi8KCWJ1ZlswXT0wOwoJYnVmWzFdPTA7CglyYz1idHR2X0kyQ1dyaXRlKGJ0diwoUFhfSTJDX1BJQzw8MSksYnVmWzBdLGJ1ZlsxXSwxKTsKCWlmIChyYykgewoJICBwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiBQWEMyMDBfbXV4c2VsOiBwaWMgY2ZnIHdyaXRlIGZhaWxlZDolZFxuIiwgYnR2LT5jLm5yLHJjKTsKCSAgLyogbm90IFBYQyA/IGRvIG5vdGhpbmcgKi8KCSAgcmV0dXJuOwoJfQoKCXJjPWJ0dHZfSTJDUmVhZChidHYsKFBYX0kyQ19QSUM8PDEpLE5VTEwpOwoJaWYgKCEocmMgJiBQWF9DRkdfUFhDMjAwRikpIHsKCSAgcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogUFhDMjAwX211eHNlbDogbm90IFBYQzIwMEYgcmM6JWQgXG4iLCBidHYtPmMubnIscmMpOwoJICByZXR1cm47Cgl9CgoKCS8qIFRoZSBtdWx0aXBsZXhlciBpbiB0aGUgMjAwRiBpcyBoYW5kbGVkIGJ5IHRoZSBHUElPIHBvcnQgKi8KCS8qIGdldCBjb3JyZWN0IG1hcHBpbmcgYmV0d2VlbiBpbnB1dHMgICovCgkvKiAgbXV4ID0gYnR0dl90dmNhcmRzW2J0di0+dHlwZV0ubXV4c2VsW2lucHV0XSAmIDM7ICovCgkvKiAqKiBub3QgbmVlZGVkIT8gICAqLwoJbXV4ID0gaW5wdXQ7CgoJLyogbWFrZSBzdXJlIG91dHB1dCBwaW5zIGFyZSBlbmFibGVkICovCgkvKiBiaXRtYXNrPTB4MzBmOyAqLwoJYml0bWFzaz0weDMwMjsKCS8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIFBYQzIwMEEgKi8KIAlpZiAoYnR2LT5jYXJkaWQgPT0gUFhfUFhDMjAwQV9DQVJESUQpICB7CgkgICBiaXRtYXNrIF49IDB4MTgwOyAvKiB1c2UgNyBhbmQgOSwgbm90IDggYW5kIDkgKi8KCSAgIGJpdG1hc2sgfD0gNzw8NDsgLyogdGhlIERBQyAqLwoJfQoJYnR3cml0ZShiaXRtYXNrLCBCVDg0OF9HUElPX09VVF9FTik7CgoJYml0bWFzayA9IGJ0cmVhZChCVDg0OF9HUElPX0RBVEEpOwogCWlmIChidHYtPmNhcmRpZCA9PSBQWF9QWEMyMDBBX0NBUkRJRCkKCSAgYml0bWFzayA9IChiaXRtYXNrICYgfjB4MjgwKSB8ICgobXV4ICYgMikgPDwgOCkgfCAoKG11eCAmIDEpIDw8IDcpOwoJZWxzZSAvKiBvbGRlciBkZXZpY2UgKi8KCSAgYml0bWFzayA9IChiaXRtYXNrICYgfjB4MzAwKSB8ICgobXV4ICYgMykgPDwgOCk7CglidHdyaXRlKGJpdG1hc2ssQlQ4NDhfR1BJT19EQVRBKTsKCgkvKgoJICogV2FzICJ0byBiZSBzYWZlLCBzZXQgdGhlIGJ0ODQ4IHRvIGlucHV0IDAiCgkgKiBBY3R1YWxseSwgc2luY2UgaXQncyBvayBhdCBsb2FkIHRpbWUsIGJldHRlciBub3QgbWVzc2luZwoJICogd2l0aCB0aGVzZSBiaXRzIChvbiBQWEMyMDBBRiB5b3UgbmVlZCB0byBzZXQgbXV4IDIgaGVyZSkKCSAqCgkgKiBuZWVkZWQgYmVjYXVzZSBidHR2LWRyaXZlciBzZXRzIG11eCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCgkgKi8KIAlpZiAoYnR2LT5jYXJkaWQgPT0gUFhfUFhDMjAwQV9DQVJESUQpCgkgIGJ0YW9yKDI8PDUsIH5CVDg0OF9JRk9STV9NVVhTRUwsIEJUODQ4X0lGT1JNKTsKCWVsc2UgLyogb2xkZXIgZGV2aWNlICovCgkgIGJ0YW5kKH5CVDg0OF9JRk9STV9NVVhTRUwsQlQ4NDhfSUZPUk0pOwoKCXByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IHNldHRpbmcgaW5wdXQgY2hhbm5lbCB0bzolZFxuIiwgYnR2LT5jLm5yLChpbnQpbXV4KTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogbW90aGVyYm9hcmQgY2hpcHNldCBzcGVjaWZpYyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnZvaWQgX19kZXZpbml0IGJ0dHZfY2hlY2tfY2hpcHNldCh2b2lkKQp7CglpbnQgcGNpcGNpX2ZhaWwgPSAwOwoJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CgoJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfRkFJTCkKCQlwY2lwY2lfZmFpbCA9IDE7CglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIChQQ0lQQ0lfVFJJVE9OfFBDSVBDSV9OQVRPTUF8UENJUENJX1ZJQUVUQkYpKQoJCXRyaXRvbjEgPSAxOwoJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfVlNGWCkKCQl2c2Z4ID0gMTsKI2lmZGVmIFBDSVBDSV9BTElNQUdJSwoJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfQUxJTUFHSUspCgkJbGF0ZW5jeSA9IDB4MEE7CiNlbmRpZgoKI2lmIDAKCS8qIHByaW50IHdoaWNoIGNoaXBzZXQgd2UgaGF2ZSAqLwoJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9jbGFzcyhQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCxkZXYpKSkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBpcyAlc1xuIixwY2lfbmFtZShkZXYpKTsKI2VuZGlmCgoJLyogcHJpbnQgd2FybmluZ3MgYWJvdXQgYW55IHF1aXJrcyBmb3VuZCAqLwoJaWYgKHRyaXRvbjEpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2UgbmVlZHMgRVRCRiBlbmFibGVkLlxuIik7CglpZiAodnNmeCkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBuZWVkcyBWU0ZYIGVuYWJsZWQuXG4iKTsKCWlmIChwY2lwY2lfZmFpbCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHY6IEJUODQ4IGFuZCB5b3VyIGNoaXBzZXQgbWF5IG5vdCB3b3JrIHRvZ2V0aGVyLlxuIik7CgkJaWYgKFVOU0VUID09IG5vX292ZXJsYXkpIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0djogZ29pbmcgdG8gZGlzYWJsZSBvdmVybGF5LlxuIik7CgkJCW5vX292ZXJsYXkgPSAxOwoJCX0KCX0KCWlmIChVTlNFVCAhPSBsYXRlbmN5KQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IHBjaSBsYXRlbmN5IGZpeHVwIFslZF1cbiIsbGF0ZW5jeSk7CgoJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDEsIGRldikpKSB7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGI7CgkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDUzLCAmYik7CgkJaWYgKGJ0dHZfZGVidWcpCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlOiA4MjQ0MUZYIE5hdG9tYSwgIgoJCQkgICAgICAgImJ1ZmNvbj0weCUwMnhcbiIsYik7Cgl9Cn0KCmludCBfX2RldmluaXQgYnR0dl9oYW5kbGVfY2hpcHNldChzdHJ1Y3QgYnR0diAqYnR2KQp7CiAJdW5zaWduZWQgY2hhciBjb21tYW5kOwoKCWlmICghdHJpdG9uMSAmJiAhdnNmeCAmJiBVTlNFVCA9PSBsYXRlbmN5KQoJCXJldHVybiAwOwoKCWlmIChidHR2X3ZlcmJvc2UpIHsKCQlpZiAodHJpdG9uMSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBlbmFibGluZyBFVEJGICg0MzBGWC9WUDMgY29tcGF0aWJpbHR5KVxuIixidHYtPmMubnIpOwoJCWlmICh2c2Z4ICYmIGJ0di0+aWQgPj0gODc4KQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIFZTRlhcbiIsYnR2LT5jLm5yKTsKCQlpZiAoVU5TRVQgIT0gbGF0ZW5jeSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBzZXR0aW5nIHBjaSB0aW1lciB0byAlZFxuIiwKCQkJICAgICAgIGJ0di0+Yy5ucixsYXRlbmN5KTsKCX0KCglpZiAoYnR2LT5pZCA8IDg3OCkgewoJCS8qIGJ0ODQ4IChtaXMpdXNlcyBhIGJpdCBpbiB0aGUgaXJxIG1hc2sgZm9yIGV0YmYgKi8KCQlpZiAodHJpdG9uMSkKCQkJYnR2LT50cml0b24xID0gQlQ4NDhfSU5UX0VUQkY7Cgl9IGVsc2UgewoJCS8qIGJ0ODc4IGhhcyBhIGJpdCBpbiB0aGUgcGNpIGNvbmZpZyBzcGFjZSBmb3IgaXQgKi8KICAgICAgICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGJ0di0+Yy5wY2ksIEJUODc4X0RFVkNUUkwsICZjb21tYW5kKTsKCQlpZiAodHJpdG9uMSkKCQkJY29tbWFuZCB8PSBCVDg3OF9FTl9UQkZYOwoJCWlmICh2c2Z4KQoJCQljb21tYW5kIHw9IEJUODc4X0VOX1ZTRlg7CiAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnR2LT5jLnBjaSwgQlQ4NzhfREVWQ1RSTCwgY29tbWFuZCk7CiAgICAgICAgfQoJaWYgKFVOU0VUICE9IGxhdGVuY3kpCgkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJ0di0+Yy5wY2ksIFBDSV9MQVRFTkNZX1RJTUVSLCBsYXRlbmN5KTsKCXJldHVybiAwOwp9CgoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiBjLWJhc2ljLW9mZnNldDogOAogKiBFbmQ6CiAqLwo=