LyoKCiAgICBidHR2LWNhcmRzLmMKCiAgICB0aGlzIGZpbGUgaGFzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25zIC0gY2FyZC1zcGVjaWZpYyBzdHVmZgogICAgbGlrZSB0aGUgYmlnIHR2Y2FyZHMgYXJyYXkgZm9yIHRoZSBtb3N0IHBhcnQKCiAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgKHJqa21AdGhwLnVuaS1rb2Vsbi5kZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBNYXJjdXMgTWV0emxlciAobW9jbUB0aHAudW5pLWtvZWxuLmRlKQogICAgKGMpIDE5OTktMjAwMSBHZXJkIEtub3JyIDxrcmF4ZWxAZ29sZGJhY2guaW4tYmVybGluLmRlPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoKKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CgojaW5jbHVkZSA8YXNtL2lvLmg+CgojaW5jbHVkZSAiYnR0dnAuaCIKCi8qIGZ3ZCBkZWNsICovCnN0YXRpYyB2b2lkIGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKTsKc3RhdGljIHZvaWQgYm9vdF9idDgzMihzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgaGF1cHBhdWdlX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgYXZlcm1lZGlhX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgb3NwcmV5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgbW9kdGVjX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgaW5pdF9QWEMyMDAoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyB2b2lkIGluaXRfUlRWMjQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCB3aW52aWV3X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGx0OTQxNV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsCgkJCQkgICAgaW50IHNldCk7CnN0YXRpYyB2b2lkIGF2ZXJtZWRpYV90dl9zdGVyZW9fYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LAoJCQkJICAgICAgaW50IHNldCk7CnN0YXRpYyB2b2lkIHRlcnJhdHZfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgZ3ZiY3R2M3BjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBndmJjdHY1cGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHdpbmZhc3QyMDAwX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHB2YnQ4NzhwOWJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgZnYyMDAwc19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCB3aW5kdnJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgYWR0dms1MDNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgcnY2MDVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGVhZ2xlX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCB4Z3VhcmRfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGl2YzEyMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgZ3ZjMTEwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKCnN0YXRpYyB2b2lkIFBYQzIwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKCnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX2luaXQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCB0aWJldENTMTZfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9pbml0KHN0cnVjdCBidHR2ICpidHYpOwoKc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIHNpZ21hU0xDX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBzaWdtYVNRX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwoKc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIGludCB0ZWE1NzU3X3JlYWQoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyBpbnQgdGVhNTc1N193cml0ZShzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgdmFsdWUpOwpzdGF0aWMgdm9pZCBpZGVudGlmeV9ieV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0diwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XSk7CnN0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9ib290KHN0cnVjdCBidHR2ICpidHYpOwoKLyogY29uZmlnIHZhcmlhYmxlcyAqLwpzdGF0aWMgdW5zaWduZWQgaW50IHRyaXRvbjE9MDsKc3RhdGljIHVuc2lnbmVkIGludCB2c2Z4PTA7CnN0YXRpYyB1bnNpZ25lZCBpbnQgbGF0ZW5jeSA9IFVOU0VUOwppbnQgbm9fb3ZlcmxheT0tMTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZFtCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcGxsW0JUVFZfTUFYXSAgICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgdHVuZXJbQlRUVl9NQVhdICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgc3Zoc1tCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcmVtb3RlW0JUVFZfTUFYXSA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyBzdHJ1Y3QgYnR0diAgKm1hc3RlcltCVFRWX01BWF0gPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBOVUxMIH07CiNpZmRlZiBNT0RVTEUKc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbG9hZCA9IDE7CiNlbHNlCnN0YXRpYyB1bnNpZ25lZCBpbnQgYXV0b2xvYWQgPSAwOwojZW5kaWYKc3RhdGljIHVuc2lnbmVkIGludCBncGlvbWFzayA9IFVOU0VUOwpzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvYWxsID0gVU5TRVQ7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYXVkaW9tdXhbNV0gPSB7IFsgMCAuLi4gNCBdID0gVU5TRVQgfTsKCi8qIGluc21vZCBvcHRpb25zICovCm1vZHVsZV9wYXJhbSh0cml0b24xLCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0odnNmeCwgICAgICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKG5vX292ZXJsYXksIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShsYXRlbmN5LCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0oZ3Bpb21hc2ssICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKGF1ZGlvYWxsLCAgIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShhdXRvbG9hZCwgICBpbnQsIDA0NDQpOwoKbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocGxsLCAgICAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheSh0dW5lciwgICAgaW50LCBOVUxMLCAwNDQ0KTsKbW9kdWxlX3BhcmFtX2FycmF5KHN2aHMsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocmVtb3RlLCAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheShhdWRpb211eCwgaW50LCBOVUxMLCAwNDQ0KTsKCk1PRFVMRV9QQVJNX0RFU0ModHJpdG9uMSwic2V0IEVUQkYgcGNpIGNvbmZpZyBiaXQgIgoJCSAiW2VuYWJsZSBidWcgY29tcGF0aWJpbGl0eSBmb3IgdHJpdG9uMSArIG90aGVyc10iKTsKTU9EVUxFX1BBUk1fREVTQyh2c2Z4LCJzZXQgVlNGWCBwY2kgY29uZmlnIGJpdCAiCgkJICJbeWV0IGFub3RoZXIgY2hpcHNldCBmbGF3IHdvcmthcm91bmRdIik7Ck1PRFVMRV9QQVJNX0RFU0MobGF0ZW5jeSwicGNpIGxhdGVuY3kgdGltZXIiKTsKTU9EVUxFX1BBUk1fREVTQyhjYXJkLCJzcGVjaWZ5IFRWL2dyYWJiZXIgY2FyZCBtb2RlbCwgc2VlIENBUkRMSVNUIGZpbGUgZm9yIGEgbGlzdCIpOwpNT0RVTEVfUEFSTV9ERVNDKHBsbCwic3BlY2lmeSBpbnN0YWxsZWQgY3J5c3RhbCAoMD1ub25lLCAyOD0yOCBNSHosIDM1PTM1IE1IeikiKTsKTU9EVUxFX1BBUk1fREVTQyh0dW5lciwic3BlY2lmeSBpbnN0YWxsZWQgdHVuZXIgdHlwZSIpOwpNT0RVTEVfUEFSTV9ERVNDKGF1dG9sb2FkLCJhdXRvbWF0aWNhbGx5IGxvYWQgaTJjIG1vZHVsZXMgbGlrZSB0dW5lci5vLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIGxpc3Qgb2YgY2FyZCBJRHMgZm9yIGJ0ODc4KyBjYXJkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgc3RydWN0IENBUkQgewoJdW5zaWduZWQgaWQ7CglpbnQgY2FyZG5yOwoJY2hhciAqbmFtZTsKfSBjYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Cgl7IDB4MTNlYjAwNzAsIEJUVFZfQk9BUkRfSEFVUFBBVUdFODc4LCAgIkhhdXBwYXVnZSBXaW5UViIgfSwKCXsgMHgzOTAwMDA3MCwgQlRUVl9CT0FSRF9IQVVQUEFVR0U4NzgsICAiSGF1cHBhdWdlIFdpblRWLUQiIH0sCgl7IDB4NDUwMDAwNzAsIEJUVFZfQk9BUkRfSEFVUFBBVUdFUFZSLCAgIkhhdXBwYXVnZSBXaW5UVi9QVlIiIH0sCgl7IDB4ZmYwMDAwNzAsIEJUVFZfQk9BUkRfT1NQUkVZMXgwLCAgICAgIk9zcHJleS0xMDAiIH0sCgl7IDB4ZmYwMTAwNzAsIEJUVFZfQk9BUkRfT1NQUkVZMngwX1NWSUQsIk9zcHJleS0yMDAiIH0sCgl7IDB4ZmYwMjAwNzAsIEJUVFZfQk9BUkRfT1NQUkVZNTAwLCAgICAgIk9zcHJleS01MDAiIH0sCgl7IDB4ZmYwMzAwNzAsIEJUVFZfQk9BUkRfT1NQUkVZMjAwMCwgICAgIk9zcHJleS0yMDAwIiB9LAoJeyAweGZmMDQwMDcwLCBCVFRWX0JPQVJEX09TUFJFWTU0MCwgICAgICJPc3ByZXktNTQwIiB9LAoJeyAweGZmMDcwMDcwLCBCVFRWX0JPQVJEX09TUFJFWTQ0MCwgICAgICJPc3ByZXktNDQwIiB9LAoKCXsgMHgwMDAxMTAwMiwgQlRUVl9CT0FSRF9BVElfVFZXT05ERVIsICAiQVRJIFRWIFdvbmRlciIgfSwKCXsgMHgwMDAzMTAwMiwgQlRUVl9CT0FSRF9BVElfVFZXT05ERVJWRSwiQVRJIFRWIFdvbmRlci9WRSIgfSwKCgl7IDB4NjYwNjEwN2QsIEJUVFZfQk9BUkRfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAoJeyAweDY2MDcxMDdkLCBCVFRWX0JPQVJEX1dJTkZBU1RWQzEwMCwgICJMZWFkdGVrIFdpbkZhc3QgVkMgMTAwIiB9LAoJeyAweDY2MDkxMDdkLCBCVFRWX0JPQVJEX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFRWIDIwMDAgWFAiIH0sCgl7IDB4MjYzNjEwYjQsIEJUVFZfQk9BUkRfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCgl7IDB4MjY0NTEwYjQsIEJUVFZfQk9BUkRfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCiAJeyAweDQwMjAxMGZjLCBCVFRWX0JPQVJEX0dWQkNUVjNQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjMvUENJIiB9LAoJeyAweDQwNTAxMGZjLCBCVFRWX0JPQVJEX0dWQkNUVjRQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjQvUENJIiB9LAoJeyAweDQwNzAxMGZjLCBCVFRWX0JPQVJEX0dWQkNUVjVQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjUvUENJIiB9LAogCXsgMHhkMDE4MTBmYywgQlRUVl9CT0FSRF9HVkJDVFY1UENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFY1L1BDSSIgfSwKCgl7IDB4MDAxMjExYmQsIEJUVFZfQk9BUkRfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYiIH0sCgkvKiBzb21lIGNhcmRzIHNoaXAgd2l0aCBieXRlc3dhcHBlZCBJRHMgLi4uICovCgl7IDB4MTIwMGJkMTEsIEJUVFZfQk9BUkRfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKCXsgMHhmZjAwYmQxMSwgQlRUVl9CT0FSRF9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViBbYnN3YXBdIiB9LAoJLyogdGhpcyBzZWVtcyB0byBoYXBwZW4gYXMgd2VsbCAuLi4gKi8KCXsgMHhmZjEyMTFiZCwgQlRUVl9CT0FSRF9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViIgfSwKCgl7IDB4MzAwMDEyMWEsIEJUVFZfQk9BUkRfVk9PRE9PVFZfRk0sICAgIjNEZnggVm9vZG9vVFYgRk0vIFZvb2Rvb1RWIDIwMCIgfSwKCXsgMHgyNjM3MTBiNCwgQlRUVl9CT0FSRF9WT09ET09UVl9GTSwgICAiM0RmeCBWb29kb29UViBGTS8gVm9vZG9vVFYgMjAwIiB9LAoJeyAweDMwNjAxMjFhLCBCVFRWX0JPQVJEX1NUQjIsCSAgIjNEZnggVm9vZG9vVFYgMTAwLyBTVEIgT0VNIiB9LAoKCXsgMHgzMDAwMTQ0ZiwgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYzLCAiKEFza2V5IE1hZ2ljL290aGVycykgVFZpZXc5OSBDUEgwNngiIH0sCgl7IDB4YTAwNTE0NGYsIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MywgIkNQSDA2WCBUVmlldzk5LUNhcmQiIH0sCgl7IDB4MzAwMjE0NGYsIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MSwgIihBc2tleSBNYWdpYy9vdGhlcnMpIFRWaWV3OTkgQ1BIMDV4IiB9LAoJeyAweDMwMDUxNDRmLCBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjEsICIoQXNrZXkgTWFnaWMvb3RoZXJzKSBUVmlldzk5IENQSDA2MS8wNkwgKFQxL0xDKSIgfSwKCXsgMHg1MDAwMTQ0ZiwgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYxLCAiQXNrZXkgQ1BIMDUwIiB9LAoJeyAweDMwMDAxNGZmLCBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjEsICJUVmlldyA5OSAoQ1BIMDYxKSIgfSwKCXsgMHgzMDAyMTRmZiwgQlRUVl9CT0FSRF9QSE9FQkVfVFZNQVMsICAiUGhvZWJlIFRWIE1hc3RlciAoQ1BIMDYwKSIgfSwKCgl7IDB4MDAwMTE0NjEsIEJUVFZfQk9BUkRfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwMjE0NjEsIEJUVFZfQk9BUkRfQVZFUk1FRElBOTgsICAgIkFWZXJtZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDAwMzE0NjEsIEJUVFZfQk9BUkRfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwNDE0NjEsIEJUVFZfQk9BUkRfQVZFUk1FRElBOTgsICAgIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDMwMDE0NjEsIEJUVFZfQk9BUkRfQVZFUk1FRElBOTgsICAgIlZET01BVEUgVFYgVFVORVIgQ0FSRCIgfSwKCgl7IDB4MTExNzE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoUGhpbGlwcyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE4MTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE5MTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChQaGlsaXBzIFBBTCBJKSIgfSwKCXsgMHgxMTFhMTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgSSkiIH0sCgoJeyAweDExMjMxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZSQURJTywgICJUZXJyYXRlYyBUViBSYWRpbysiIH0sCgl7IDB4MTEyNzE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUViwgICAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMDUpIiAgICB9LAoJLyogY2xhc2hlcyB3aXRoIEZseVZpZGVvCgkgKnsgMHgxODUyMTg1MiwgQlRUVl9CT0FSRF9URVJSQVRWLCAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMTApIiAgICB9LCAqLwoJeyAweDExMzQxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKExSMTAyKSIgfSwKCXsgMHgxMTM1MTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRVIsICAiVGVycmF0ZWMgVFZhbHVlIFJhZGlvIiB9LCAvKiBMUjEwMiAqLwoJeyAweDUwMTgxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUiIH0sICAgICAgIC8qID8/ICovCgl7IDB4ZmYzYjE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLyogPz8gKi8KCgl7IDB4NDAwMDE1YjAsIEJUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwYTE1YjAsIEJUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwZDE1YjAsIEJUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKCXsgMHg0MDEwMTViMCwgQlRUVl9CT0FSRF9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViAvIFJhZGlvIiB9LAoJeyAweDQwMTYxNWIwLCBCVFRWX0JPQVJEX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIC8gUmFkaW8iIH0sCgoJeyAweDE0MzBhYTAwLCBCVFRWX0JPQVJEX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0EiIH0sCgl7IDB4MTQzMWFhMDAsIEJUVFZfQk9BUkRfUFYxNDMsICAgICAgICAgIlByb3ZpZGVvIFBWMTQzQiIgfSwKCXsgMHgxNDMyYWEwMCwgQlRUVl9CT0FSRF9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNDIiB9LAoJeyAweDE0MzNhYTAwLCBCVFRWX0JPQVJEX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0QiIH0sCgl7IDB4MTQzM2FhMDMsIEJUVFZfQk9BUkRfUFYxNDMsICAgICAgICAgIlNlY3VyaXR5IEV5ZXMiIH0sCgoJeyAweDE0NjBhYTAwLCBCVFRWX0JPQVJEX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtMSIgfSwKCXsgMHgxNDYxYWEwMSwgQlRUVl9CT0FSRF9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTIiIH0sCgl7IDB4MTQ2MmFhMDIsIEJUVFZfQk9BUkRfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQS0zIiB9LAoJeyAweDE0NjNhYTAzLCBCVFRWX0JPQVJEX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtNCIgfSwKCgl7IDB4MTQ2NGFhMDQsIEJUVFZfQk9BUkRfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi0xIiB9LAoJeyAweDE0NjVhYTA1LCBCVFRWX0JPQVJEX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItMiIgfSwKCXsgMHgxNDY2YWEwNiwgQlRUVl9CT0FSRF9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBCLTMiIH0sCgl7IDB4MTQ2N2FhMDcsIEJUVFZfQk9BUkRfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi00IiB9LAoKCXsgMHhhMTMyZmYwMCwgQlRUVl9CT0FSRF9JVkMxMDAsICAgICAgICAiSVZDLTEwMCIgIH0sCgl7IDB4YTE1NTAwMDAsIEJUVFZfQk9BUkRfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMDAxLCBCVFRWX0JPQVJEX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKCXsgMHhhMTU1MDAwMiwgQlRUVl9CT0FSRF9JVkMyMDAsICAgICAgICAiSVZDLTIwMCIgIH0sCgl7IDB4YTE1NTAwMDMsIEJUVFZfQk9BUkRfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMTAwLCBCVFRWX0JPQVJEX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTU1MDEwMSwgQlRUVl9CT0FSRF9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCgl7IDB4YTE1NTAxMDIsIEJUVFZfQk9BUkRfSVZDMjAwLCAgICAgICAgIklWQy0yMDBHIiB9LAoJeyAweGExNTUwMTAzLCBCVFRWX0JPQVJEX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTgyZmYwMCwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDEsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjAyLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwMywgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDQsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA1LCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwNiwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDcsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA4LCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwOSwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGEsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBiLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwYywgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGQsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBlLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwZiwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgoJeyAweDQxNDI0MzQ0LCBCVFRWX0JPQVJEX0dSQU5EVEVDLCAgICAgICJHcmFuZFRlYyBNdWx0aSBDYXB0dXJlIiB9LAoJeyAweDAxMDIwMzA0LCBCVFRWX0JPQVJEX1hHVUFSRCwgICAgICAgICJHcmFuZHRlYyBHcmFuZCBYLUd1YXJkIiB9LAoKCXsgMHgxODUwMTg1MSwgQlRUVl9CT0FSRF9DSFJPTk9TX1ZTMiwgICAiRmx5VmlkZW8gOTggKExSNTApLyBDaHJvbm9zIFZpZGVvIFNodXR0bGUgSUkiIH0sCgl7IDB4YTA1MDE4NTEsIEJUVFZfQk9BUkRfQ0hST05PU19WUzIsICAgIkZseVZpZGVvIDk4IChMUjUwKS8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiB9LAoJeyAweDE4NTExODUxLCBCVFRWX0JPQVJEX0ZMWVZJREVPOThFWiwgICJGbHlWaWRlbyA5OEVaIChMUjUxKS8gQ3liZXJNYWlsIEFWIiB9LAoJeyAweDE4NTIxODUyLCBCVFRWX0JPQVJEX1RZUEhPT05fVFZJRVcsICJGbHlWaWRlbyA5OEZNIChMUjUwKS8gVHlwaG9vbiBUVmlldyBUVi9GTSBUdW5lciIgfSwKCXsgMHg0MWEwYTA1MSwgQlRUVl9CT0FSRF9GTFlWSURFT185OEZNLCAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCBSZXYgUSIgfSwKCXsgMHgxODUwMWY3ZiwgQlRUVl9CT0FSRF9GTFlWSURFT185OCwgICAiTGlmZXZpZXcgRmx5dmlkZW8gOTgiIH0sCgogICAgCXsgMHgwMTAxMTVjYiwgQlRUVl9CT0FSRF9HTVYxLCAgICAgICAgICAiQUcgR01WMSIgfSwKCXsgMHgwMTAxMTRjNywgQlRUVl9CT0FSRF9NT0RURUNfMjA1LCAgICAiTW9kdWxhciBUZWNobm9sb2d5IE1NMjAxL01NMjAyL01NMjA1L01NMjEwL01NMjE1IFBDVFYiIH0sCgoJeyAweDEwYjQyNjM2LCBCVFRWX0JPQVJEX0hBVVBQQVVHRTg3OCwgICJTVEIgPz8/IiB9LAoJeyAweDIxN2Q2NjA2LCBCVFRWX0JPQVJEX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFdpbkZhc3QgVFYgMjAwMCIgfSwKCXsgMHhmZmY2ZjZmZiwgQlRUVl9CT0FSRF9XSU5GQVNUMjAwMCwgICAiTGVhZHRlayBXaW5GYXN0IFRWIDIwMDAiIH0sCgl7IDB4MDMxMTYwMDAsIEJUVFZfQk9BUkRfU0VOU09SQVkzMTEsICAgIlNlbnNvcmF5IDMxMSIgfSwKCXsgMHgwMDc5MGUxMSwgQlRUVl9CT0FSRF9XSU5EVlIsICAgICAgICAiQ2Fub3B1cyBXaW5EVlIgUENJIiB9LAoJeyAweGEwZmNhMWEwLCBCVFRWX0JPQVJEX1pPTFRSSVgsICAgICAgICJGYWNlIHRvIEZhY2UgVHZtYXgiIH0sCgl7IDB4MjAwMDcwNjMsIEJUVFZfQk9BUkRfUENfSERUViwgICAgICAgInBjSERUViBIRC0yMDAwIFRWIn0sCgl7IDB4ODJiMmFhNmEsIEJUVFZfQk9BUkRfU0lNVVNfR1ZDMTEwMCwgIlNJTVVTIEdWQzExMDAiIH0sCgl7IDB4MTQ2Y2FhMGMsIEJUVFZfQk9BUkRfUFY5NTEsICAgICAgICAgIml0dW5lciBzcGVjdHJhOCIgfSwKIAl7IDB4MjAwYTEyOTUsIEJUVFZfQk9BUkRfUFhDMjAwLCAgICAgICAgIkltYWdlTmF0aW9uIFBYQzIwMEEiIH0sCgoJeyAweDQwMTExNTU0LCBCVFRWX0JPQVJEX1BWX0JUODc4UF85QiwgICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVCIgfSwKCXsgMHgxN2RlMGEwMSwgQlRUVl9CT0FSRF9LV09STEQsICAgICAgICAiTWVjZXIgVFYvRk0vVmlkZW8gVHVuZXIiIH0sCgoJeyAweDAxMDUxODA1LCBCVFRWX0JPQVJEX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzEiIH0sCgl7IDB4MDEwNjE4MDUsIEJUVFZfQk9BUkRfUElDT0xPX1RFVFJBX0NISVAsICJQaWNvbG8gVGV0cmEgQ2hpcCAjMiIgfSwKCXsgMHgwMTA3MTgwNSwgQlRUVl9CT0FSRF9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMzIiB9LAoJeyAweDAxMDgxODA1LCBCVFRWX0JPQVJEX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzQiIH0sCgoJeyAweDE1NDA5NTExLCBCVFRWX0JPQVJEX0FDT1JQX1k4NzhGLCAiQWNvcnAgWTg3OEYiIH0sCgoJLyogbGlrZWx5IGJyb2tlbiwgdmVuZG9yIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIG90aGVyIG1hZ2ljIHZpZXdzIC4uLgoJICogeyAweGEwZmNhMDRmLCBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjMsICJHdWlsbGVtb3QgTWF4aSBUViBWaWRlbyAzIiB9LCAqLwoKCS8qIERWQiBjYXJkcyAodXNpbmcgcGNpIGZ1bmN0aW9uIC4xIGZvciBtcGVnIGRhdGEgeGZlcikgKi8KCXsgMHgwMTAxMDA3MSwgQlRUVl9CT0FSRF9ORUJVTEFfRElHSVRWLCAiTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViIgfSwKCXsgMHgwNzYxMTQ2MSwgQlRUVl9CT0FSRF9BVkRWQlRfNzYxLCAgICAiQXZlck1lZGlhIEF2ZXJUViBEVkItVCA3NjEiIH0sCgl7IDB4MDAxYzExYmQsIEJUVFZfQk9BUkRfUElOTkFDTEVTQVQsICAgIlBpbm5hY2xlIFBDVFYgU2F0IiB9LAoJeyAweDAwMjYxMWJkLCBCVFRWX0JPQVJEX1RXSU5IQU5fRFNULCAgICJQaW5uYWNsZSBQQ1RWIFNBVCBDSSIgfSwKCXsgMHgwMDAxMTgyMiwgQlRUVl9CT0FSRF9UV0lOSEFOX0RTVCwgICAiVHdpbmhhbiBWaXNpb25QbHVzIERWQiIgfSwKCXsgMHhmYzAwMjcwZiwgQlRUVl9CT0FSRF9UV0lOSEFOX0RTVCwgICAiQ2hhaW5UZWNoIGRpZ2l0b3AgRFNULTEwMDAgRFZCLVMiIH0sCgl7IDB4MDc3MTE0NjEsIEJUVFZfQk9BUkRfQVZEVkJUXzc3MSwgICAgIkFWZXJtZWRpYSBBdmVyVFYgRFZCLVQgNzcxIiB9LAoJeyAweGRiMTAxOGFjLCBCVFRWX0JPQVJEX0RWSUNPX0RWQlRfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIgfSwKCXsgMHhkNTAwMThhYywgQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiB9LAoKCXsgMCwgLTEsIE5VTEwgfQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogYXJyYXkgd2l0aCBkZXNjcmlwdGlvbiBmb3IgYnQ4NDggLyBidDg3OCB0di9ncmFiYmVyIGNhcmRzICAgICAgICAgICAgICAgKi8KCnN0cnVjdCB0dmNhcmQgYnR0dl90dmNhcmRzW10gPSB7CgkvKiAtLS0tIGNhcmQgMHgwMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9VTktOT1dOXSA9IHsKCQkubmFtZQkJPSAiICoqKiBVTktOT1dOL0dFTkVSSUMgKioqICIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9NSVJPXSA9IHsKCQkubmFtZQkJPSAiTUlSTyBQQ1RWIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDIsIDAsIDAsIDAsIDEwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9IQVVQUEFVR0VdID0gewoJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODQ4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSA3LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDAsIDEsIDIsIDMsIDR9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1NUQl0gPSB7CgkJLm5hbWUJCT0gIlNUQiwgR2F0ZXdheSBQL04gNjAwMDY5OSAoYnQ4NDgpIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDcsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgNCwgMCwgMiwgMywgMX0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDA0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0lOVEVMXSA9IHsKCQkubmFtZQkJPSAiSW50ZWwgQ3JlYXRlIGFuZCBTaGFyZSBQQ0kvIFNtYXJ0IFZpZGVvIFJlY29yZGVyIElJSSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDAsCgkJLnR1bmVyCQk9IC0xLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAwLAoJCS50dW5lcl90eXBlCT0gNCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9ESUFNT05EXSA9IHsKCQkubmFtZQkJPSAiRGlhbW9uZCBEVFYyMDAwIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDMsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDB9LAoJCS5hdWRpb211eAk9IHsgMCwgMSwgMCwgMSwgM30sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfQVZFUk1FRElBXSA9IHsKCQkubmFtZQkJPSAiQVZlck1lZGlhIFRWUGhvbmUiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDMsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5ncGlvbWFzawk9IDB4MGYsCgkJLmF1ZGlvbXV4CT0geyAweDBjLCAweDA0LCAweDA4LCAweDA0LCAwfSwKCQkvKiAgICAgICAgICAgICAgICAweDA0IGZvciBzb21lIGNhcmRzID8/ICovCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbywKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX01BVFJJWF9WSVNJT05dID0gewoJCS5uYW1lCQk9ICJNQVRSSVgtVmlzaW9uIE1WLURlbHRhIiwKCQkudmlkZW9faW5wdXRzCT0gNSwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gLTEsCgkJLnN2aHMJCT0gMywKCQkuZ3Bpb21hc2sJPSAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwfSwKCQkuYXVkaW9tdXgJPSB7MCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgwOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9GTFlWSURFT10gPSB7CgkJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIElJIChCdDg0OCkgTFIyNiAvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjI2IiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4YzAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDAsIDB4YzAwLCAweDgwMCwgMHg0MDAsIDB4YzAwLCAwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9UVVJCT1RWXSA9IHsKCQkubmFtZQkJPSAiSU1TL0lYbWljcm8gVHVyYm9UViIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAzLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDEsIDEsIDIsIDMsIDB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9IQVVQUEFVR0U4NzhdID0gewoJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDBmLCAvKiBvbGQ6IDcgKi8KCQkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9NSVJPUFJPXSA9IHsKCQkubmFtZQkJPSAiTUlSTyBQQ1RWIHBybyIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDMwMTRmLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDB4MjAwMDEsMHgxMDAwMSwgMCwgMCwxMH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0FEU1RFQ0hfVFZdID0gewoJCS5uYW1lCQk9ICJBRFMgVGVjaG5vbG9naWVzIENoYW5uZWwgU3VyZmVyIFRWIChidDg0OCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMTUsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMTMsIDE0LCAxMSwgNywgMCwgMH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfQVZFUk1FRElBOThdID0gewoJCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZDYXB0dXJlIDk4IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gNCwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDEzLCAxNCwgMTEsIDcsIDAsIDB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkubXNwMzR4eF9hbHQgICAgPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sgICAgID0gYXZlcm1lZGlhX3R2X3N0ZXJlb19hdWRpbywKCQkubm9fZ3Bpb2lycSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX1ZIWF0gPSB7CgkJLm5hbWUJCT0gIkFpbXNsYWIgVmlkZW8gSGlnaHdheSBYdHJlbWUgKFZIWCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gNywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAyLCAxLCAzLCA0fSwgLyogb2xkOiB7IDAsIDEsIDIsIDMsIDR9ICovCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfWk9MVFJJWF0gPSB7CgkJLm5hbWUJCT0gIlpvbHRyaXggVFYtTWF4IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7MCAsIDAsIDEgLCAwLCAxMH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDEwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BJWFZJRVdQTEFZVFZdID0gewoJCS5uYW1lCQk9ICJQcm9saW5rIFBpeGVsdmlldyBQbGF5VFYgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkjaWYgMAoJCS8qIG9sZCAqLwoJCS5hdWRpb211eAk9IHsgMHgwMWMwMDAsIDAsIDB4MDE4MDAwLCAweDAxNDAwMCwgMHgwMDIwMDAsIDAgfSwKCSNlbHNlCgkJLyogMjAwMy0xMC0yMCBieSAiQW50b24gQS4gQXJhcG92IiA8YXJhcG92QG1haWwucnU+ICovCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAoJI2VuZGlmCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgl9LAoJW0JUVFZfQk9BUkRfV0lOVklFV182MDFdID0gewoJCS5uYW1lCQk9ICJMZWFkdGVrIFdpblZpZXcgNjAxIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4ODMwMGY4LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLDB9LAoJCS5hdWRpb211eAk9IHsgMHg0ZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDd9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gd2ludmlld19hdWRpbywKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCglbQlRUVl9CT0FSRF9BVkVDX0lOVEVSQ0FQXSA9IHsKCQkubmFtZQkJPSAiQVZFQyBJbnRlcmNhcHR1cmUiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAyLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMCwKCQkubXV4c2VsCQk9IHsyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7MSwgMCwgMCwgMCwgMH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfTElGRV9GTFlLSVRdID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyBJSSBFWiAvRmx5S2l0IExSMzggQnQ4NDggKGNhcHR1cmUgb25seSkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAtMSwKCQkuZ3Bpb21hc2sJPSAweDhkZmYwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwIH0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDE0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0NFSV9SQUZGTEVTXSA9IHsKCQkubmFtZQkJPSAiQ0VJIFJhZmZsZXMgQ2FyZCIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDMsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkubXV4c2VsCQk9IHsyLCAzLCAxLCAxfSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0NPTkZFUkVOQ0VUVl0gPSB7CgkJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4LyBMdWNreSBTdGFyIEltYWdlIFdvcmxkIENvbmZlcmVuY2VUViBMUjUwIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMiwgIC8qIHR1bmVyLCBsaW5lIGluICovCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDE4MDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUxfSSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9QSE9FQkVfVFZNQVNdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwNTAvIFBob2ViZSBUdiBNYXN0ZXIgKyBGTSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGMwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0gezAsIDEsIDB4ODAwLCAweDQwMCwgMHhjMDAsIDB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01PRFRFQ18yMDVdID0gewoJCS5uYW1lCQk9ICJNb2R1bGFyIFRlY2hub2xvZ3kgTU0yMDEvTU0yMDIvTU0yMDUvTU0yMTAvTU0yMTUgUENUViwgYnQ4NzgiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IC0xLAoJCS5ncGlvbWFzawk9IDcsCgkJLm11eHNlbAkJPSB7IDIsIDMsIC0xIH0sCgkJLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwKCQkuYXVkaW9tdXgJPSB7IDAsIDAsIDAsIDAsIDAgfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FMUFNfVFNCQjVfUEFMX0ksCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDE4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjFdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwNVgvMDZYIChidDg3OCkgW21hbnkgdmVuZG9yc10iLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhlMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsweDQwMCwgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHhjMDB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfVk9CSVNfQk9PU1RBUl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIFRlcnJhVFYrIFZlcnNpb24gMS4wIChCdDg0OCkvIFRlcnJhIFRWYWx1ZSBWZXJzaW9uIDEuMC8gVm9iaXMgVFYtQm9vc3RhciIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDFmMGZmZiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDAsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vayAgICAgPSB0ZXJyYXR2X2F1ZGlvLAoJfSwKCVtCVFRWX0JPQVJEX0hBVVBQQVVHX1dDQU1dID0gewoJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgV2luQ2FtIG5ld2VyIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDMsCgkJLmdwaW9tYXNrCT0gNywKCQkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9NQVhJXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjUwIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMiwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MTgwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19TRUNBTSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfVEVSUkFUVl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIFRlcnJhVFYrIFZlcnNpb24gMS4xIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgxZjBmZmYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMHgwMDAwMCwgMHg0MDAwMH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAwLAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSB0ZXJyYXR2X2F1ZGlvLAoJCS8qIEdQSU8gd2lyaW5nOgoJCUV4dGVybmFsIDIwIHBpbiBjb25uZWN0b3IgKGZvciBBY3RpdmUgUmFkaW8gVXBncmFkZSBib2FyZCkKCQlncGlvMDA6IGkyYy1zZGEKCQlncGlvMDE6IGkyYy1zY2wKCQlncGlvMDI6IG9tNTYxMC1kYXRhCgkJZ3BpbzAzOiBvbTU2MTAtY2xrCgkJZ3BpbzA0OiBvbTU2MTAtd3JlCgkJZ3BpbzA1OiBvbTU2MTAtc3RlcmVvCgkJZ3BpbzA2OiByZHM2NTg4LWRhdm4KCQlncGlvMDc6IFBpbiA3IG4uYy4KCQlncGlvMDg6IG5JT1cKCQlncGlvMDkrMTA6IG5JT1IsIG5TRUwgPz8gKGJ0ODc4KQoJCQlncGlvMDk6IG5JT1IgKGJ0ODQ4KQoJCQlncGlvMTA6IG5TRUwgKGJ0ODQ4KQoJCVNvdW5kIFJvdXRpbmc6CgkJZ3BpbzE2OiB1Mi1BMCAoMXN0IDQwNTJidCkKCQlncGlvMTc6IHUyLUExCgkJZ3BpbzE4OiB1Mi1uRU4KCQlncGlvMTk6IHU0LUEwICgybmQgNDA1MikKCQlncGlvMjA6IHU0LUExCgkJCXU0LW5FTiAtIEdORAoJCUJ0c3B5OgoJCQkwMDAwMCA6IENkcm9tIChpbnRlcm5hbCBhdWRpbyBpbnB1dCkKCQkJMTAwMDAgOiBleHQuIFZpZGVvIGF1ZGlvIGlucHV0CgkJCTIwMDAwIDogVFYgTW9ubwoJCQlhMDAwMCA6IFRWIE1vbm8vMgoJCTFhMDAwMCA6IFRWIFN0ZXJlbwoJCQkzMDAwMCA6IFJhZGlvCgkJCTQwMDAwIDogTXV0ZQoJKi8KCgl9LAoJW0JUVFZfQk9BUkRfUFhDMjAwXSA9IHsKCQkvKiBKYW5uaWsgRnJpdHNjaCA8amFubmlrQHRlY2hmYWsudW5pLWJpZWxlZmVsZC5kZT4gKi8KCQkubmFtZQkJPSAiSW1hZ2VuYXRpb24gUFhDMjAwIiwKCQkudmlkZW9faW5wdXRzCT0gNSwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gLTEsCgkJLnN2aHMJCT0gMSwgLyogd2FzOiA0ICovCgkJLmdwaW9tYXNrCT0gMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCwgMH0sCgkJLmF1ZGlvbXV4CT0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm11eHNlbF9ob29rICAgID0gUFhDMjAwX211eHNlbCwKCgl9LAoJW0JUVFZfQk9BUkRfRkxZVklERU9fOThdID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OCBMUjUwIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MTgwMCwgIC8qIDB4OGRmZTAwICovCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMCwgMHgwODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfSVBST1RWXSA9IHsKCQkubmFtZQkJPSAiRm9ybWFjIGlQcm9UViwgRm9ybWFjIFByb1RWIEkgKGJ0ODQ4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMywKCQkuZ3Bpb21hc2sJPSAxLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDEsIDAsIDAsIDAsIDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfSU5URUxfQ19TX1BDSV0gPSB7CgkJLm5hbWUJCT0gIkludGVsIENyZWF0ZSBhbmQgU2hhcmUgUENJLyBTbWFydCBWaWRlbyBSZWNvcmRlciBJSUkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMCwKCQkudHVuZXJfdHlwZQk9IDQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVEVSUkFUVkFMVUVdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWYWx1ZSBWZXJzaW9uIEJ0ODc4IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4ZmZmZjAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDB4NTAwLCAwLCAweDMwMCwgMHg5MDAsIDB4OTAwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9XSU5GQVNUMjAwMF0gPSB7CgkJLm5hbWUJCT0gIkxlYWR0ZWsgV2luRmFzdCAyMDAwLyBXaW5GYXN0IDIwMDAgWFAiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEsIDB9LCAvKiBUViwgQ1ZpZCwgU1ZpZCwgQ1ZpZCBvdmVyIFNWaWQgY29ubmVjdG9yICovCgkjaWYgMAoJCS5ncGlvbWFzawk9IDB4YzMzMDAwLAoJCS5hdWRpb211eAk9IHsgMHg0MjIwMDAsMHgxMDAwLDB4MDAwMCwweDYyMDAwMCwweDgwMDAwMCB9LAoJI2Vsc2UKCQkvKiBBbGV4YW5kZXIgVmFyYWtpbiA8YXZhcmFraW5AaG90bWFpbC5jb20+IFtzdGVyZW8gdmVyc2lvbl0gKi8KCQkuZ3Bpb21hc2sJPSAweGIzMzAwMCwKCQkuYXVkaW9tdXgJPSB7IDB4MTIyMDAwLDB4MTAwMCwweDAwMDAsMHg2MjAwMDAsMHg4MDAwMDAgfSwKCSNlbmRpZgoJCS8qIEF1ZGlvIFJvdXRpbmcgZm9yICJXaW5GYXN0IDIwMDAgWFAiIChubyB0diBzdGVyZW8gISkKCQkJZ3BpbzIzIC0tIGhlZjQwNTI6bkVuYWJsZSAoMHg4MDAwMDApCgkJCWdwaW8xMiAtLSBoZWY0MDUyOkExCgkJCWdwaW8xMyAtLSBoZWY0MDUyOkEwCgkJMHgwMDAwOiBleHRlcm5hbCBhdWRpbwoJCTB4MTAwMDogRk0KCQkweDIwMDA6IFRWCgkJMHgzMDAwOiBuLmMuCgkJTm90ZTogVGhlcmUgZXhpc3RzIGFub3RoZXIgdmFyaWFudCAiV2luZmFzdCAyMDAwIiB3aXRoIHR2IHN0ZXJlbyAhPwoJCU5vdGU6IGVlcHJvbSBvbmx5IGNvbnRhaW5zIEZGIGFuZCBwY2kgc3Vic3lzdGVtIGlkIDEwN2Q6NjYwNgoJCSovCgkJLm5lZWRzX3R2YXVkaW8JPSAwLAoJCS5wbGwJCT0gUExMXzI4LAoJCS5oYXNfcmFkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gNSwgLyogZGVmYXVsdCBmb3Igbm93LCBncGlvIHJlYWRzIEJGRkYwNiBmb3IgUGFsIGJnK2RrICovCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSB3aW5mYXN0MjAwMF9hdWRpbywKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX0NIUk9OT1NfVlMyXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCAvIENocm9ub3MgVmlkZW8gU2h1dHRsZSBJSSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDMsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDE4MDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDI0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1RZUEhPT05fVFZJRVddID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAgLyBUeXBob29uIFRWaWV3IFRWL0ZNIFR1bmVyIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMywKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MTgwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yYWRpbwk9IDEsCgl9LAoJW0JUVFZfQk9BUkRfUFhFTFZXUExUVlBST10gPSB7CgkJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWxWaWV3IFBsYXlUViBwcm8iLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhmZiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMHgyMSwgMHgyMCwgMHgyNCwgMHgyYywgMHgyOSwgMHgyOSB9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjNdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwNlggVFZpZXc5OSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDU1MWUwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCgkJLmF1ZGlvbXV4CT0geyAweDU1MTQwMCwgMHg1NTEyMDAsIDAsIDAsIDB4NTUxYzAwLCAweDU1MTIwMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IDEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9QSU5OQUNMRV0gPSB7CgkJLm5hbWUJCT0gIlBpbm5hY2xlIFBDVFYgU3R1ZGlvL1JhdmUiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgwMzAwMEYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMiwgMHhkMDAwMSwgMCwgMCwgMX0sCgkJLm5lZWRzX3R2YXVkaW8JPSAwLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDI4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1NUQjJdID0gewoJCS5uYW1lCQk9ICJTVEIgVFYgUENJIEZNLCBHYXRld2F5IFAvTiA2MDAwNzA0IChidDg3OCksIDNEZnggVm9vZG9vVFYgMTAwIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDcsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgNCwgMCwgMiwgMywgMX0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfQVZQSE9ORTk4XSA9IHsKCQkubmFtZQkJPSAiQVZlck1lZGlhIFRWUGhvbmUgOTgiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSA0LAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMTUsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMTMsIDQsIDExLCA3LCAwLCAwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvCT0gMSwKCQkuYXVkaW9faG9vawk9IGF2ZXJtZWRpYV90dnBob25lX2F1ZGlvLAoJfSwKCVtCVFRWX0JPQVJEX1BWOTUxXSA9IHsKCQkubmFtZQkJPSAiUHJvVmlkZW8gUFY5NTEiLCAvKiBwaWMxNmM1NCAqLwoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAwLCAwLCAwLCAwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9PTkFJUl9UVl0gPSB7CgkJLm5hbWUJCT0gIkxpdHRsZSBPbkFpciBUViIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGUwMGIsCgkJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0gezB4ZmY5ZmY2LCAweGZmOWZmNiwgMHhmZjFmZjcsIDAsIDB4ZmYzZmZjfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfU0lHTUFfVFZJSV9GTV0gPSB7CgkJLm5hbWUJCT0gIlNpZ21hIFRWSUktRk0iLAoJCS52aWRlb19pbnB1dHMJPSAyLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IC0xLAoJCS5ncGlvbWFzawk9IDMsCgkJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0gezEsIDEsIDAsIDIsIDN9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF9OT05FLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfTUFUUklYX1ZJU0lPTjJdID0gewoJCS5uYW1lCQk9ICJNQVRSSVgtVmlzaW9uIE1WLURlbHRhIDIiLAoJCS52aWRlb19pbnB1dHMJPSA1LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAzLAoJCS5ncGlvbWFzawk9IDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJCS5hdWRpb211eAk9IHswIH0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRV0gPSB7CgkJLm5hbWUJCT0gIlpvbHRyaXggR2VuaWUgVFYvRk0iLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhiY2YwM2YsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMHhiYzgwM2YsIDB4YmM5MDNmLCAweGJjYjAzZiwgMCwgMHhiY2IwM2Z9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IDIxLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1RFUlJBVFZSQURJT10gPSB7CgkJLm5hbWUJCT0gIlRlcnJhdGVjIFRWL1JhZGlvKyIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDcwMDAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDB4MjAwMDAsIDB4MzAwMDAsIDB4MTAwMDAsIDAsIDB4NDAwMDAsIDB4MjAwMDAgfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzM1LAoJCS50dW5lcl90eXBlCT0gMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MzAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfRFlOQUxJTktdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwM3gvIER5bmFsaW5rIE1hZ2ljIFRWaWV3IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7MiwwLDAsMCwxfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9HVkJDVFYzUENJXSA9IHsKCQkubmFtZQkJPSAiSU9EQVRBIEdWLUJDVFYzL1BDSSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDAxMGYwMCwKCQkubXV4c2VsCQk9IHsyLCAzLCAwLCAwfSwKCQkuYXVkaW9tdXgJPSB7MHgxMDAwMCwgMCwgMHgxMDAwMCwgMCwgMCwgMH0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfQUxQU19UU0hDNl9OVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gZ3ZiY3R2M3BjaV9hdWRpbywKCX0sCglbQlRUVl9CT0FSRF9QWEVMVldQTFRWUEFLXSA9IHsKCQkubmFtZQkJPSAiUHJvbGluayBQVi1CVDg3OFArNEUgLyBQaXhlbFZpZXcgUGxheVRWIFBBSyAvIExlbmNvIE1YVFYtOTU3OCBDUCIsCgkJLnZpZGVvX2lucHV0cwk9IDUsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMywKCQkuZ3Bpb21hc2sJPSAweEFBMDAwMCwKCQkubXV4c2VsCQk9IHsgMiwzLDEsMSwtMSB9LAoJCS5kaWdpdGFsX21vZGUgICA9IERJR0lUQUxfTU9ERV9DQU1FUkEsCgkJLmF1ZGlvbXV4CT0geyAweDIwMDAwLCAwLCAweDgwMDAwLCAweDgwMDAwLCAweGE4MDAwLCAweDQ2MDAwICB9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMX0ksCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUJPSAxLAoJCS8qIEdQSU8gd2lyaW5nOiAoZGlmZmVyZW50IGZyb20gUmV2LjRDICEpCgkJCUdQSU8xNzogVTQuQTAgKGZpcnN0IGhlZjQwNTJidCkKCQkJR1BJTzE5OiBVNC5BMQoJCQlHUElPMjA6IFU1LkExIChzZWNvbmQgaGVmNDA1MmJ0KQoJCQlHUElPMjE6IFU0Lm5FTgoJCQlHUElPMjI6IEJUODMyIFJlc2V0IExpbmUKCQkJR1BJTzIzOiBBNSxBMCwgVTUsbkVOCgkJTm90ZTogQXQgaTJjPTB4OGEgaXMgYSBCdDgzMiBjaGlwLCB3aGljaCBjaGFuZ2VzIHRvIDB4ODggYWZ0ZXIgYmVpbmcgcmVzZXQgdmlhIEdQSU8yMgoJCSovCgl9LAoJW0JUVFZfQk9BUkRfRUFHTEVdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJFYWdsZSBXaXJlbGVzcyBDYXByaWNvcm4yIChidDg3OEEpIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDcsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxLCAxfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDR9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSAvKiBUVU5FUl9BTFBTX1RNREgyX05UU0MgKi8sCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDM0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BJTk5BQ0xFUFJPXSA9IHsKCQkvKiBEYXZpZCBIw6RyZGVtYW4gPGRhdmlkQDJnZW4uY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFN0dWRpbyBQcm8iLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDMsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMSwgMHhkMDAwMSwgMCwgMCwgMTB9LAoJCQkJLyogc291bmQgcGF0aCAoNSBzb3VyY2VzKToKCQkJCU1VWDEgKG1hc2sgMHgwMyksIEVuYWJsZSBQaW4gMHgwOCAoMD1lbmFibGUsIDE9ZGlzYWJsZSkKCQkJCQkwPSBleHQuIEF1ZGlvIElOCgkJCQkJMT0gZnJvbSBNVVgyCgkJCQkJMj0gTW9ubyBUViBzb3VuZCBmcm9tIFR1bmVyCgkJCQkJMz0gbm90IGNvbm5lY3RlZAoJCQkJTVVYMiAobWFzayAweDMwMDAwKToKCQkJCQkwLDIsMz0gZnJvbSBNU1AzNHh4CgkJCQkJMT0gRk0gc3RlcmVvIFJhZGlvIGZyb20gVHVuZXIgKi8KCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9UVklFV19SRFNfRk1dID0gewoJCS8qIENsYWFzIExhbmdiZWhuIDxjbGFhc0BiaWdmb290LmNvbT4sCgkJU3ZlbiBHcm90aGtsYWdzIDxzdmVuQHVwYi5kZT4gKi8KCQkubmFtZQkJPSAiVHlwaG9vbiBUVmlldyBSRFMgKyBGTSBTdGVyZW8gLyBLTkMxIFRWIFN0YXRpb24gUkRTIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMywKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MWMsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMCwgMCwgMHgxMCwgOCwgNCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8JPSAxLAoJfSwKCVtCVFRWX0JPQVJEX0xJRkVURUNfOTQxNV0gPSB7CgkJLyogVGltIFL2c3Rlcm11bmR0IDxyb3N0ZXJtQHVuaS1tdWVuc3Rlci5kZT4KCQlpbiBkZS5jb21wLm9zLnVuaXgubGludXguaGFyZHdhcmU6CgkJCW9wdGlvbnMgYnR0diBjYXJkPTAgcGxsPTEgcmFkaW89MSBncGlvbWFzaz0weDE4ZTAKCQkJYXVkaW9tdXg9MHg0NGM3MWYsMHg0NGQ3MWYsMCwweDQ0ZDcxZiwweDQ0ZGZmZgoJCQlvcHRpb25zIHR1bmVyIHR5cGU9NSAqLwoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyAyMDAwIC9GbHlWaWRlbyBBMi8gTGlmZXRlYyBMVCA5NDE1IFRWIFtMUjkwXSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDE4ZTAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMHgwMDAwLDB4MDgwMCwweDEwMDAsMHgxMDAwLDB4MThlMCB9LAoJCQkvKiBGb3IgY2FyZHMgd2l0aCB0ZGE5ODIwL3RkYTk4MjE6CgkJCQkweDAwMDA6IFR1bmVyIG5vcm1hbCBzdGVyZW8KCQkJCTB4MDA4MDogVHVuZXIgQTIgU0FQIChzZWNvbmQgYXVkaW8gcHJvZ3JhbSA9IFp3ZWlrYW5hbHRvbikKCQkJCTB4MDg4MDogVHVuZXIgQTIgc3RlcmVvICovCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9CRVNUQlVZX0VBU1lUVl0gPSB7CgkJLyogTWlndWVsIEFuZ2VsIEFsdmFyZXogPG1hYWNydXpAbmF2ZWdhbGlhLmNvbT4KCQlvbGQgRWFzeSBUViBCVDg0OCB2ZXJzaW9uIChtb2RlbCBDUEgwMzEpICovCgkJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDAzMS8gQkVTVEJVWSBFYXN5IFRWIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweEYsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgzOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9GTFlWSURFT185OEZNXSA9IHsKCQkvKiBHb3Jkb24gSGV5ZG9uIDxnamhleWRvbkBiaWdmb290LmNvbSAoJzk4KSAqLwoJCS5uYW1lICAgICAgICAgICA9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMywKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgxODAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSA1LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCQkvKiBUaGlzIGlzIHRoZSB1bHRpbWF0ZSBjaGVhcG8gY2FwdHVyZSBjYXJkCgkJKiBqdXN0IGEgQlQ4NDhBIG9uIGEgc21hbGwgUENCIQoJCSogU3RldmUgSG9zZ29vZCA8c3RldmVAZXF1aWluZXQuY29tPiAqLwoJW0JUVFZfQk9BUkRfR1JBTkRURUNdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJHcmFuZFRlYyAnR3JhbmQgVmlkZW8gQ2FwdHVyZScgKEJ0ODQ4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLmdwaW9tYXNrICAgICAgID0gMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDMsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0FTS0VZX0NQSDA2MF0gPSB7CgkJLyogRGFuaWVsIEhlcnJpbmd0b24gPGRhbmllbC5oZXJyaW5ndG9uQGhvbWUuY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwNjAvIFBob2ViZSBUViBNYXN0ZXIgT25seSAoTm8gRk0pIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4ZTAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDQwMCwgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHg4MDAsIDB4NDAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfNDAzNkZZNV9OVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0FTS0VZX0NQSDAzWF0gPSB7CgkJLyogTWF0dGkgTW90dHVzIDxtb3R0dXNAcGh5c2ljLnV0LmVlPiAqLwoJCS5uYW1lCQk9ICJBc2tleSBDUEgwM3ggVFYgQ2FwdHVyZXIiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMiwwLDAsMCwxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4M2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfTU0xMDBQQ1RWXSA9IHsKCQkvKiBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+ICovCgkJLm5hbWUgICAgICAgICAgID0gIk1vZHVsYXIgVGVjaG5vbG9neSBNTTEwMFBDVFYiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMiwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAxMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMiwgMCwgMCwgMSwgOH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9HTVYxXSA9IHsKCQkvKiBBZHJpYW4gQ294IDxhZHJpYW5AaHVtYm9sZHQuY28udWsgKi8KCQkubmFtZQkgICAgICAgID0gIkFHIEVsZWN0cm9uaWNzIEdNVjEiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIJICAgICAgICA9IC0xLAoJCS5zdmhzCSAgICAgICAgPSAxLAoJCS5ncGlvbWFzayAgICAgICA9IDB4RiwKCQkubXV4c2VsCSAgICAgICAgPSB7IDIsIDJ9LAoJCS5hdWRpb211eCAgICAgICA9IHsgfSwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnBsbAkgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0JFU1RCVVlfRUFTWVRWMl0gPSB7CgkJLyogTWlndWVsIEFuZ2VsIEFsdmFyZXogPG1hYWNydXpAbmF2ZWdhbGlhLmNvbT4KCQluZXcgRWFzeSBUViBCVDg3OCB2ZXJzaW9uIChtb2RlbCBDUEgwNjEpCgkJc3BlY2lhbCB0aGFua3MgdG8gSW5mb3JtYXRpY2EgTWllcmVzIGZvciBwcm92aWRpbmcgdGhlIGNhcmQgKi8KCQkubmFtZSAgICAgICAgICAgPSAiQXNrZXkgQ1BIMDYxLyBCRVNUQlVZIEVhc3kgVFYgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMiwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHhGRiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMSwgMCwgNCwgNCwgOX0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0FUSV9UVldPTkRFUl0gPSB7CgkJLyogTHVrYXMgR2ViYXVlciA8Z2VieUB2b2xueS5jej4gKi8KCQkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGYwM2YsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAgfSwKCQkuYXVkaW9tdXgJPSB7IDB4YmZmZSwgMCwgMHhiZmZmLCAwLCAweGJmZmV9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfNDAwNkZONV9NVUxUSV9QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDQwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0FUSV9UVldPTkRFUlZFXSA9IHsKCQkvKiBMdWthcyBHZWJhdWVyIDxnZWJ5QHZvbG55LmN6PiAqLwoJCS5uYW1lCQk9ICJBVEkgVFYtV29uZGVyIFZFIiwKCQkudmlkZW9faW5wdXRzCT0gMiwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAtMSwKCQkuZ3Bpb21hc2sJPSAxLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDAsIDAsIDEsIDAsIDB9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0ZMWVZJREVPMjAwMF0gPSB7CgkJLyogRGVlSmF5IDxkZWVqYXlAd2VzdGVsOTAwLm5ldCAoMjAwMFMpICovCgkJLm5hbWUgICAgICAgICAgID0gIkxpZmV2aWV3IEZseVZpZGVvIDIwMDBTIExSOTAiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMywKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrCT0gMHgxOGUwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKCQkJCS8qIFJhZGlvIGNoYW5nZWQgZnJvbSAxZTgwIHRvIDB4ODAwIHRvIG1ha2UKCQkJCUZseVZpZGVvMjAwMFMgaW4gLmh1IGhhcHB5IChnbSkqLwoJCQkJLyogLWRrLT8/Pzogc2V0IG11dGU9MHgxODAwIGZvciB0ZGE5ODc0aCBkYXVnaHRlcmJvYXJkICovCgkJLmF1ZGlvbXV4CT0geyAweDAwMDAsMHgwODAwLDB4MTAwMCwweDEwMDAsMHgxODAwLCAweDEwODAgfSwKCQkuYXVkaW9faG9vawk9IGZ2MjAwMHNfYXVkaW8sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5ub190ZGE5ODc1CT0gMSwKCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSA1LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1RFUlJBVFZBTFVFUl0gPSB7CgkJLm5hbWUJCT0gIlRlcnJhdGVjIFRWYWx1ZVJhZGlvIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4ZmZmZjAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDB4NTAwLCAweDUwMCwgMHgzMDAsIDB4OTAwLCAweDkwMH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yYWRpbwk9IDEsCgl9LAoJW0JUVFZfQk9BUkRfR1ZCQ1RWNFBDSV0gPSB7CgkJLyogVEFOQUtBIEtlaSA8cGVnMDA2MjVAbmlmdHkuY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJJT0RBVEEgR1YtQkNUVjQvUENJIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDEwZjAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKCQkuYXVkaW9tdXggICAgICAgPSB7MHgxMDAwMCwgMCwgMHgxMDAwMCwgMCwgMCwgMH0sCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfU0hBUlBfMlU1SkY1NTQwX05UU0MsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sgICAgID0gZ3ZiY3R2M3BjaV9hdWRpbywKCX0sCgoJLyogLS0tLSBjYXJkIDB4NDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfVk9PRE9PVFZfRk1dID0gewoJCS5uYW1lICAgICAgICAgICA9ICIzRGZ4IFZvb2Rvb1RWIEZNIChFdXJvKSwgVm9vZG9vVFYgMjAwIChVU0EpIiwKCQkvKiB0cnkgImluc21vZCBtc3AzNDAwIHNpbXBsZT0wIiBpZiB5b3UgaGF2ZQoJCSogc291bmQgcHJvYmxlbXMgd2l0aCB0aGlzIGNhcmQuICovCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgID0gMHg0ZjhhMDAsCgkJLyogMHgxMDAwMDA6IDE9TVNQIGVuYWJsZWQgKDA9ZGlzYWJsZSBhZ2FpbikKCQkqIDB4MDEwMDAwOiBDb25uZWN0ZWQgdG8gIlMwIiBvbiB0ZGE5ODgwICgwPVBhbC9CRywgMT1OVFNDKSAqLwoJCS5hdWRpb211eCAgICAgICA9IHsweDk0N2ZmZiwgMHg5ODdmZmYsMHg5NDdmZmYsMHg5NDdmZmYsIDB4OTQ3ZmZmfSwKCQkvKiB0dnR1bmVyLCByYWRpbywgICBleHRlcm5hbCxpbnRlcm5hbCwgbXV0ZSwgIHN0ZXJlbwoJCSogdHVuZXIsIENvbXBvc2l0LCBTVmlkLCBDb21wb3NpdC1vbi1TdmlkLWFkYXB0ZXIgKi8KCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgLDAgLDF9LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX01UMjAzMiwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsCQk9IFBMTF8yOCwKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCglbQlRUVl9CT0FSRF9BSU1NU10gPSB7CgkJLyogUGhpbGlwIEJsdW5kZWxsIDxwYkBuZXh1cy5jby51az4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiQWN0aXZlIEltYWdpbmcgQUlNTVMiLAoJCS52aWRlb19pbnB1dHMgICA9IDEsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLm11eHNlbCAgICAgICAgID0geyAyIH0sCgkJLmdwaW9tYXNrICAgICAgID0gMAoJfSwKCVtCVFRWX0JPQVJEX1BWX0JUODc4UF9QTFVTXSA9IHsKCQkvKiBUb21hc3ogUHlyYSA8aGVsbGZpcmVAc2VkZXouaXEucGw+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCsgKFJldi40Qyw4RSkiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gNCwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMTUsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDExLCA3LCAxMywgMH0sIC8qIFRWIGFuZCBSYWRpbyB3aXRoIHNhbWUgR1BJTyAhICovCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gMjUsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCQkvKiBHUElPIHdpcmluZzoKCQkJR1BJTzA6IFU0LkEwIChoZWY0MDUyYnQpCgkJCUdQSU8xOiBVNC5BMQoJCQlHUElPMjogVTQuQTEgKHNlY29uZCBoZWY0MDUyYnQpCgkJCUdQSU8zOiBVNC5uRU4sIFU1LkEwLCBBNS5uRU4KCQkJR1BJTzgtMTU6IHZyZDg2NmIgPwoJCSovCgl9LAoJW0JUVFZfQk9BUkRfRkxZVklERU85OEVaXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThFWiAoY2FwdHVyZSBvbmx5KSBMUjUxIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAyLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwgLyogQVYxLCBBVjIsIFNWSFMsIENWaWQgYWRhcHRlciBvbiBTVkhTICovCgkJLnBsbAkJPSBQTExfMjgsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS50dW5lcl90eXBlCT0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDQ4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BWX0JUODc4UF85Ql0gPSB7CgkJLyogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4gKi8KCQkubmFtZQkJPSAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQ4NzhQKzlCIChQbGF5VFYgUHJvIHJldi45QiBGTStOSUNBTSkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgzZiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMHgwMSwgMHgwMCwgMHgwMywgMHgwMywgMHgwOSwgMHgwMiB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5ub190ZGE5ODc1CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IDUsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSBwdmJ0ODc4cDliX2F1ZGlvLCAvKiBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgc3RlcmVvICovCgkJLmhhc19yYWRpbwk9IDEsICAvKiBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgcmFkaW8gKi8KCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJCS8qIEdQSU8gd2lyaW5nOgoJCQlHUElPMDogQTAgaGVmNDA1MgoJCQlHUElPMTogQTEgaGVmNDA1MgoJCQlHUElPMzogbkVOIGhlZjQwNTIKCQkJR1BJTzgtMTU6IHZyZDg2NmIKCQkJR1BJTzIwLDIyLDIzOiBSMzAsUjI5LFIyOAoJCSovCgl9LAoJW0JUVFZfQk9BUkRfU0VOU09SQVkzMTFdID0gewoJCS8qIENsYXkgS3VueiA8Y2t1bnpAbWFpbC5hcmMubmFzYS5nb3Y+ICovCgkJLyogeW91IG11c3QganVtcGVyIEpQNSBmb3IgdGhlIGNhcmQgdG8gd29yayAqLwoJCS5uYW1lICAgICAgICAgICA9ICJTZW5zb3JheSAzMTEiLAoJCS52aWRlb19pbnB1dHMgICA9IDUsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSA0LAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwLCAwfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1JWNjA1XSA9IHsKCQkvKiBNaWd1ZWwgRnJlaXRhcyA8bWlndWVsQGNldHVjLnB1Yy1yaW8uYnI+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlJlbW90ZVZpc2lvbiBNWCAoUlY2MDUpIiwKCQkudmlkZW9faW5wdXRzICAgPSAxNiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkJLmdwaW9tYXNrMiAgICAgID0gMHgwN2ZmLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMHgzMywgMHgxMywgMHgyMywgMHg0MywgMHhmMywgMHg3MywgMHhlMywgMHgwMywKCQkJCTB4ZDMsIDB4YjMsIDB4YzMsIDB4NjMsIDB4OTMsIDB4NTMsIDB4ODMsIDB4YTMgfSwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm11eHNlbF9ob29rICAgID0gcnY2MDVfbXV4c2VsLAoJfSwKCVtCVFRWX0JPQVJEX1BPV0VSQ0xSX01UVjg3OF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlBvd2VyY29sb3IgTVRWODc4LyBNVFY4NzhSLyBNVFY4NzhGIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDIsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDFDODAwRiwgIC8qIEJpdDAtMjogQXVkaW8gc2VsZWN0LCA4LTEyOnJlbW90ZSBjb250cm9sIDE0OnJlbW90ZSB2YWxpZCAxNTpyZW1vdGUgcmVzZXQgKi8KCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDEsIDEsIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAyLCA0IH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsCQk9IFBMTF8yOCwKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCgoJLyogLS0tLSBjYXJkIDB4NGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfV0lORFZSXSA9IHsKCQkvKiBNYXNha2kgU3V6dWtpIDxtYXNha2lAYnRyZWUub3JnPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJDYW5vcHVzIFdpbkRWUiBQQ0kgKENPTVBBUSBQcmVzYXJpbyAzNTI0SlAsIDUxMTJKUCkiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgxNDAwMDcsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAzLCA0LCAwIH0sCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rICAgICA9IHdpbmR2cl9hdWRpbywKCX0sCglbQlRUVl9CT0FSRF9HUkFORFRFQ19NVUxUSV0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkdyYW5kVGVjIE11bHRpIENhcHR1cmUgQ2FyZCAoQnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgID0gMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0tXT1JMRF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkpldHdheSBUVi9DYXB0dXJlIEpXLVRWODc4LUZCSywgS3dvcmxkIEtXLVRWODc4UkYiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMywKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gNywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwgICAvKiBUdW5lciwgU1ZpZCwgU1ZIUywgU1ZpZCB0byBTVkhTIGNvbm5lY3RvciAqLwoJCS5hdWRpb211eCAgICAgICA9IHsgMCAsMCAsNCwgNCw0LDR9LC8qIFllcywgdGhpcyB0dW5lciB1c2VzIHRoZSBzYW1lIGF1ZGlvIG91dHB1dCBmb3IgVFYgYW5kIEZNIHJhZGlvIQoJCQkJCQkqIFRoaXMgY2FyZCBsYWNrcyBleHRlcm5hbCBBdWRpbyBJbiwgc28gd2UgbXV0ZSBpdCBvbiBFeHQuICYgSW50LgoJCQkJCQkqIFRoZSBQQ0IgY2FuIHRha2UgYSBzYngxNjM3L3NieDE2NzMsIHdpcmluZyB1bmtub3duLgoJCQkJCQkqIFRoaXMgY2FyZCBsYWNrcyBQQ0kgc3Vic3lzdGVtIElELCBzaWdoLgoJCQkJCQkqIGF1ZGlvbXV4PTE6IGxvd2VyIHZvbHVtZSwgMiszOiBtdXRlCgkJCQkJCSogYnR3aW5jYXAgdXNlcyAweDgwMDAwLzB4ODAwMDMKCQkJCQkJKi8KCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IDUsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLyogU2Ftc3VuZyBUQ1BBOTA5NVBDMjdBIChCRytESyksIHBoaWxpcHMgY29tcGF0aWJsZSwgdy9GTSwgc3RlcmVvIGFuZAoJCXJhZGlvIHNpZ25hbCBzdHJlbmd0aCBpbmRpY2F0b3JzIHdvcmsgZmluZS4gKi8KCQkuaGFzX3JhZGlvCT0gMSwKCQkvKiBHUElPIEluZm86CgkJCUdQSU8wLDE6ICAgSEVGNDA1MiBBMCxBMQoJCQlHUElPMjogICAgIEhFRjQwNTIgbkVOQUJMRQoJCQlHUElPMy03OiAgIG4uYy4KCQkJR1BJTzgtMTM6ICBJUkRDMzU3IGRhdGEwLTUgKGRhdGE2IG4uYy4gPykgW2NoaXAgbm90IHByZXNlbnQgb24gbXkgY2FyZF0KCQkJR1BJTzE0LDE1OiA/PwoJCQlHUElPMTYtMjE6IG4uYy4KCQkJR1BJTzIyLDIzOiA/PwoJCQk/PyAgICAgICA6IG10dThiNTZlcCBtaWNyb2NvbnRyb2xsZXIgZm9yIElSIChHUElPIHdpcmluZyB1bmtub3duKSovCgl9LAoJW0JUVFZfQk9BUkRfRFNQX1RDVklERU9dID0gewoJCS8qIEFydGh1ciBUZXR6bGFmZi1EZWFzLCBEU1AgRGVzaWduIEx0ZCA8c29mdHdhcmVAZHNwZGVzaWduLmNvbT4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiRFNQIERlc2lnbiBUQ1ZJREVPIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfSEFVUFBBVUdFUFZSXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiSGF1cHBhdWdlIFdpblRWIFBWUiIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDAsIDEsIDF9LAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoKCQkuZ3Bpb21hc2sgICAgICAgPSA3LAoJCS5hdWRpb211eCAgICAgICA9IHs3fSwKCX0sCglbQlRUVl9CT0FSRF9HVkJDVFY1UENJXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiSU9EQVRBIEdWLUJDVFY1L1BDSSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDBmMGY4MCwKCQkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMH0sCgkJLmF1ZGlvbXV4ICAgICAgID0gezB4MDMwMDAwLCAweDAxMDAwMCwgMCwgMCwgMHgwMjAwMDAsIDB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rICAgICA9IGd2YmN0djVwY2lfYXVkaW8sCgkJLmhhc19yYWRpbyAgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9PU1BSRVkxeDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAwLzE1MCAoODc4KSIsIC8qIDB4MSgyfDMpLTQ1QzYtQzEgKi8KCQkudmlkZW9faW5wdXRzICAgPSA0LCAgICAgICAgICAgICAgICAgIC8qIGlkLWlucHV0cy1jbG9jayAqLwoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMywKCQkubXV4c2VsICAgICAgICAgPSB7IDMsIDIsIDAsIDEgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfT1NQUkVZMXgwXzg0OF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDAvMTUwICg4NDgpIiwgLyogMHgwNC01NEMwLUMxICYgb2xkZXIgYm9hcmRzICovCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfT1NQUkVZMTAxXzg0OF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEgKDg0OCkiLCAvKiAweDA1LTQwQzAtQzEgKi8KCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDMsIDEgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfT1NQUkVZMXgxXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMS8xNTEiLCAgICAgICAvKiAweDEoNHw1KS0wMDA0LUM0ICovCgkJLnZpZGVvX2lucHV0cyAgID0gMSwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMCB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9PU1BSRVkxeDFfU1ZJRF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEvMTUxIHcvIHN2aWQiLCAgLyogMHgoMTZ8MTd8MjApLTAwQzQtQzEgKi8KCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDAsIDEgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfT1NQUkVZMnh4XSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMC8yMDEvMjUwLzI1MSIsICAvKiAweDEoOHw5fEV8RiktMDAwNC1DNCAqLwoJCS52aWRlb19pbnB1dHMgICA9IDEsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBVTlNFVCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCgoJCS8qIC0tLS0gY2FyZCAweDU4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX09TUFJFWTJ4MF9TVklEXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMC8yNTAiLCAgIC8qIDB4MShBfEIpLTAwQzQtQzEgKi8KCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDAsIDEgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBVTlNFVCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9PU1BSRVkyeDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjEwLzIyMCIsICAgLyogMHgxKEF8QiktMDRDMC1DMSAqLwoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFVOU0VULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX09TUFJFWTUwMF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSA1MDAiLCAgIC8qIDUwMCAqLwoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9PU1BSRVk1NDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgNTQwIiwgICAvKiA1NDAgKi8KCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkjaWYgMCAvKiBUT0RPIC4uLiAqLwoJCS5zdmhzICAgICAgICAgICA9IE9TUFJFWTU0MF9TVklEX0FOQUxPRywKCQkubXV4c2VsICAgICAgICAgPSB7ICAgICAgIFtPU1BSRVk1NDBfQ09NUF9BTkFMT0ddID0gMiwKCQkJCQlbT1NQUkVZNTQwX1NWSURfQU5BTE9HXSA9IDMsIH0sCgkjZW5kaWYKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkjaWYgMCAvKiBUT0RPIC4uLiAqLwoJCS5tdXhzZWxfaG9vayAgICA9IG9zcHJleV81NDBfbXV4c2VsLAoJCS5waWN0dXJlX2hvb2sgICA9IG9zcHJleV81NDBfc2V0X3BpY3R1cmUsCgkjZW5kaWYKCX0sCgoJCS8qIC0tLS0gY2FyZCAweDVDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX09TUFJFWTIwMDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjAwMCIsICAvKiAyMDAwICovCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsICAgICAgLyogbXVzdCBhdm9pZCwgY29uZmxpY3RzIHdpdGggdGhlIGJ0ODYwICovCgl9LAoJW0JUVFZfQk9BUkRfSURTX0VBR0xFXSA9IHsKCQkvKiBNIEcgQmVyYmVyaWNoIDxiZXJiZXJpY0Bmb3J3aXNzLnVuaS1wYXNzYXUuZGU+ICovCgkJLm5hbWUgICAgICAgICAgID0gIklEUyBFYWdsZSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAwLCAxLCAyLCAzIH0sCgkJLm11eHNlbF9ob29rICAgID0gZWFnbGVfbXV4c2VsLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgl9LAoJW0JUVFZfQk9BUkRfUElOTkFDTEVTQVRdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFNhdCIsCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAzLCAwLCAxLCAyfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLm5vX2dwaW9pcnEgICAgID0gMSwKCQkuaGFzX2R2YiAgICAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX0ZPUk1BQ19QUk9UVl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkZvcm1hYyBQcm9UViBJSSAoYnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAzLAoJCS5ncGlvbWFzayAgICAgICA9IDIsCgkJLyogVFYsIENvbXAxLCBDb21wb3NpdGUgb3ZlciBTVklEIGNvbiwgU1ZJRCAqLwoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAyLCAwLCAwLCAwIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkvKiBzb3VuZCByb3V0aW5nOgoJCUdQSU89MHgwMCwweDAxLDB4MDM6IG11dGUgKD8pCgkJMHgwMjogYm90aCBUViBhbmQgcmFkaW8gKHR1bmVyOiBGTTEyMTYvSSkKCQlUaGUgY2FyZCBoYXMgb25ib2FyZCBhdWRpbyBjb25uZWN0b3JzIGxhYmVsZWQgImNkcm9tIiBhbmQgImJvYXJkIiwKCQlub3Qgc29sZGVyZWQgaGVyZSwgdGhvdWdoIHVua25vd24gd2lyaW5nLgoJCUNhcmQgbGFja3M6IGV4dGVybmFsIGF1ZGlvIGluLCBwY2kgc3Vic3lzdGVtIGlkLgoJKi8KCX0sCgoJCS8qIC0tLS0gY2FyZCAweDYwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX01BQ0hUVl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk1hY2hUViIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgID0gNywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSA1LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCglbQlRUVl9CT0FSRF9FVVJFU1lTX1BJQ09MT10gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkV1cmVzeXMgUGljb2xvIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMX0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFVOU0VULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1BWMTUwXSA9IHsKCQkvKiBMdWMgVmFuIEhvZXlsYW5kdCA8bHVjQGUtbWFnaWMuYmU+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlByb1ZpZGVvIFBWMTUwIiwgLyogMHg0ZiAqLwoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfQURfVFZLNTAzXSA9IHsKCQkvKiBIaXJvc2hpIFRha2VrYXdhIDxzaWFuQGJpZy5vci5qcD4gKi8KCQkvKiBUaGlzIGNhcmQgbGFja3Mgc3Vic3lzdGVtIElEICovCgkJLm5hbWUgICAgICAgICAgID0gIkFELVRWSzUwMyIsIC8qIDB4NjMgKi8KCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDAxZTgwMDcsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLyogICAgICAgICAgICAgICAgICBUdW5lciwgUmFkaW8sIGV4dGVybmFsLCBpbnRlcm5hbCwgb2ZmLCAgb24gKi8KCQkuYXVkaW9tdXggICAgICAgPSB7IDB4MDgsICAweDBmLCAgMHgwYSwgICAgIDB4MDgsICAgICAweDBmLCAweDA4IH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAyLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gYWR0dms1MDNfYXVkaW8sCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg2NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9IRVJDVUxFU19TTV9UVl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkhlcmN1bGVzIFNtYXJ0IFRWIFN0ZXJlbyIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gNSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkvKiBOb3RlczoKCQktIGNhcmQgbGFja3Mgc3Vic3lzdGVtIElECgkJLSBzdGVyZW8gdmFyaWFudCB3LyBkYXVnaHRlciBib2FyZCB3aXRoIHRkYTk4NzRhIEAweGIwCgkJLSBBdWRpbyBSb3V0aW5nOgoJCQlhbHdheXMgZnJvbSB0ZGE5ODc0IGluZGVwZW5kZW50IG9mIEdQSU8gKD8pCgkJCWV4dGVybmFsIGxpbmUgaW46IHVua25vd24KCQktIE90aGVyIGNoaXBzOiBlbTc4cDE1NmVscCBAIDB4OTYgKHByb2JhYmx5IElSIHJlbW90ZSBjb250cm9sKQoJCQloZWY0MDUzIChpbnN0ZWFkIDQwNTIpIGZvciB1bmtub3duIGZ1bmN0aW9uCgkJKi8KCX0sCglbQlRUVl9CT0FSRF9QQUNFVFZdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJQYWNlIFRWICYgUmFkaW8gQ2FyZCIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LCAvKiBUdW5lciwgQ1ZpZCwgU1ZpZCwgQ1ZpZCBvdmVyIFNWaWQgY29ubmVjdG9yICovCgkJLmdwaW9tYXNrICAgICAgID0gMCwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkvKiBCdDg3OCwgQnQ4MzIsIEZJMTI0NiB0dW5lcjsgbm8gcGNpIHN1YnN5c3RlbSBpZAoJCW9ubHkgaW50ZXJuYWwgbGluZSBvdXQ6ICg0cGluIGhlYWRlcikgUkdHTAoJCVJhZGlvIG11c3QgYmUgZGVjb2RlZCBieSBtc3AzNDEwZCAobm90IHJvdXRlZCB0aHJvdWdoKSovCgkJLyoKCQkuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLCAgdG9kbyEKCQkqLwoJfSwKCVtCVFRWX0JPQVJEX0lWQzIwMF0gPSB7CgkJLyogQ2hyaXMgV2lsbGluZyA8Y2hyaXNAdmlzbGFiLnVzeWQuZWR1LmF1PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJJVkMtMjAwIiwKCQkudmlkZW9faW5wdXRzICAgPSAxLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgID0gMHhkZiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgl9LAoJW0JUVFZfQk9BUkRfWEdVQVJEXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiR3JhbmQgWC1HdWFyZCAvIFRydXN0IDgxNFBDSSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSA0LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ncGlvbWFzazIgICAgICA9IDB4ZmYsCgkJLm11eHNlbCAgICAgICAgID0geyAyLDIsMiwyLCAzLDMsMywzLCAxLDEsMSwxLCAwLDAsMCwwIH0sCgkJLm11eHNlbF9ob29rICAgID0geGd1YXJkX211eHNlbCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg2OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9ORUJVTEFfRElHSVRWXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViIsCgkJLnZpZGVvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX2R2YiAgICAgICAgPSAxLAoJCS5ub19ncGlvaXJxICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfUFYxNDNdID0gewoJCS8qIEpvcmdlIEJvbmNvbXB0ZSAtIERUSTIgPGpvcmdlQGR0aTIubmV0PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJQcm9WaWRlbyBQVjE0MyIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9WRDAwOVgxX01JTklESU5dID0gewoJCS8qIE0uS2xhaHJAcGh5dGVjLmRlICovCgkJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDktWDEgTWluaURJTiAoYnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkJLnN2aHMgICAgICAgICAgID0gMywKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVkQwMDlYMV9DT01CSV0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDktWDEgQ29tYmkgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJCS5zdmhzICAgICAgICAgICA9IDMsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfVkQwMDlfTUlOSURJTl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDkgTWluaURJTiAoYnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzICAgPSAxMCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJCS5zdmhzICAgICAgICAgICA9IDksCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCQkuZ3Bpb21hc2syICAgICAgPSAweDAzLCAvKiBncGlvbWFzazIgZGVmaW5lcyB0aGUgYml0cyB1c2VkIHRvIHN3aXRjaCBhdWRpbwoJCQkJCXZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKCQkJCQl4dGVybmFsIHZpZGVvLW11eCAqLwoJCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHgwMywgMHgxMywgMHgyMywgMHgzMywgMHgwMSwgMHgwMCB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1ZEMDA5X0NPTUJJXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOSBDb21iaSAoYnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzICAgPSAxMCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJCS5zdmhzICAgICAgICAgICA9IDksCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCQkuZ3Bpb21hc2syICAgICAgPSAweDAzLCAvKiBncGlvbWFzazIgZGVmaW5lcyB0aGUgYml0cyB1c2VkIHRvIHN3aXRjaCBhdWRpbwoJCQkJCXZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKCQkJCQl4dGVybmFsIHZpZGVvLW11eCAqLwoJCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHgwMywgMHgxMywgMHgyMywgMHgzMywgMHgwMSwgMHgwMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0lWQzEwMF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIklWQy0xMDAiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweGRmLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCglbQlRUVl9CT0FSRF9JVkMxMjBdID0gewoJCS8qIElWQy0xMjBHIC0gQWxhbiBHYXJmaWVsZCA8YWxhbkBmcm9tb3JiaXQuY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJJVkMtMTIwRyIsCgkJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwgICAgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCQkudHVuZXIgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5zdmhzICAgICAgICAgICA9IC0xLCAgIC8qIGNhcmQgaGFzIG5vIHN2aHMgKi8KCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkJLm11eHNlbCAgICAgICAgID0geyAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAoJCQkJMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCB9LAoJCS5tdXhzZWxfaG9vayAgICA9IGl2YzEyMF9tdXhzZWwsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NzAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfUENfSERUVl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gInBjSERUViBIRC0yMDAwIFRWIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19BVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfZHZiICAgICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfVFdJTkhBTl9EU1RdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJUd2luaGFuIERTVCArIGNsb25lcyIsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub192aWRlbyAgICAgICA9IDEsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9XSU5GQVNUVkMxMDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJXaW5mYXN0IFZDMTAwIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDMsIDEsIDEsIDN9LCAvKiBWaWQgSW4sIFNWaWQgSW4sIFZpZCBvdmVyIFNWaWQgaW4gY29ubmVjdG9yICovCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCglbQlRUVl9CT0FSRF9URVY1NjBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJUZXBwcm8gVEVWLTU2MC9JbnRlclZpc2lvbiBJVi01NjAiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMSwgMSwgMSwgMSwgMH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMzUsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg3NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9TSU1VU19HVkMxMTAwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiU0lNVVMgR1ZDMTEwMCIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDJ9LAoJCS5ncGlvbWFzayAgICAgICA9IDB4M0YsCgkJLm11eHNlbF9ob29rICAgID0gZ3ZjMTEwMF9tdXhzZWwsCgl9LAoJW0JUVFZfQk9BUkRfTkdTVFZfUExVU10gPSB7CgkJLyogQ2FybG9zIFNpbHZhIHIzcGVrQHIzcGVrLmhvbWVsaW51eC5vcmcgfHwgY2FyZCAweDc1ICovCgkJLm5hbWUgICAgICAgICAgID0gIk5HUyBOR1NUVisiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKCQkuYXVkaW9tdXggICAgICAgPSB7MCwgMCwgMCwgMCwgMHgwMDAwMDMsIDB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX0xNTEJUNF0gPSB7CgkJLyogaHR0cDovL2xpbnV4bWVkaWFsYWJzLmNvbSAqLwoJCS5uYW1lICAgICAgICAgICA9ICJMTUxCVDQiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsIC8qIElOMSxJTjIsSU4zLElONCAqLwoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9URUtSQU1fTTIwNV0gPSB7CgkJLyogSGVsbXJvb3MgSGFycmkgPGhhcnJpLmhlbG1yb29zQHBwLmluZXQuZmk+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlRla3JhbSBNMjA1IFBSTyIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5ncGlvbWFzayAgICAgICA9IDB4NjgsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDB4NjgsIDB4NjgsIDB4NjEsIDB4NjEsIDB4MDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg3OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9DT05UVkZNSV0gPSB7CgkJLyogSmF2aWVyIENlbmRhbiBBcmVzIDxqY2VuZGFuQGx5Y29zLmVzPiAqLwoJCS8qIGJ0ODc4IFRWICsgRk0gd2l0aG91dCBzdWJzeXN0ZW0gSUQgKi8KCQkubmFtZSAgICAgICAgICAgPSAiQ29uY2VwdHJvbmljIENPTlRWRk1pIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMiwgMyB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgkJLmhhc19yYWRpbyAgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9QSUNPTE9fVEVUUkFfQ0hJUF0gPSB7CgkJLypFcmljIERFQklFRiA8ZGViaWVmQHRlbGVtc2EuY29tPiovCgkJLypFVVJFU1lTIFBpY29sbyBUZXRyYSA6IDQgQ29uZXhhbnQgRnVzaW9uIDg3OEEsIG5vIGF1ZGlvLCB2aWRlbyBpbnB1dCBzZXQgd2l0aCBhbmFsb2cgbXVsdGlwbGV4ZXJzIEdQSU8gY29udHJvbGVkKi8KCQkvKiBhZGRzIHBpY29sb190ZXRyYV9tdXhzZWwoKSwgcGljb2xvX3RldHJhX2luaXQoKSwgdGhlIGZvbG93aW5nIGRlY2xhcmF0aW9uIHN0cnVjdXJlLCBhbmQgI2RlZmluZSBCVFRWX0JPQVJEX1BJQ09MT19URVRSQV9DSElQKi8KCQkvKjB4NzkgaW4gYnR0di5oKi8KCQkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8gVGV0cmEiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5ncGlvbWFzazIgICAgICA9IDB4M0M8PDE2LC8qU2V0IHRoZSBHUElPWzE4XS0+R1BJT1syMV0gYXMgb3V0cHV0IHBpbi49PT4gZHJpdmUgdGhlIHZpZGVvIGlucHV0cyB0aHJvdWdoIGFuYWxvZyBtdWx0aXBsZXhlcnMqLwoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsyLDIsMiwyfSwvKjg3OEEgaW5wdXQgaXMgYWx3YXlzIE1VWDAsIHNlZSBhYm92ZS4qLwoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5tdXhzZWxfaG9vayAgICA9IHBpY29sb190ZXRyYV9tdXhzZWwsLypSZXF1aXJlZCBhcyBpdCBkb2Vzbid0IGZvbGxvdyB0aGUgY2xhc3NpYyBpbnB1dCBzZWxlY3Rpb24gcG9saWN5Ki8KCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9TUElSSVRfVFZdID0gewoJCS8qIFNwaXJpdCBUViBUdW5lciBmcm9tIGh0dHA6Ly9zcGlyaXRtb2RlbXMuY29tLmF1ICovCgkJLyogU3RhZmZvcmQgR29vZHNlbGwgPHN1cmdlQGdvbGlhdGguaG9tZXVuaXgub3JnPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJTcGlyaXQgVFYgVHVuZXIiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMDAwMDAwZiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDEsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfQVZEVkJUXzc3MV0gPSB7CgkJLyogV29sZnJhbSBKb29zdCA8d29qb0Bmcm9rYXNjaHdlaS5kZT4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiQVZlck1lZGlhIEFWZXJUViBEVkItVCA3NzEiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm11eHNlbCAgICAgICAgID0geyAzICwgMyB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkuaGFzX2R2YiAgICAgICAgPSAxLAoJCS5ub19ncGlvaXJxICAgICA9IDEsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCX0sCgkJLyogLS0tLSBjYXJkIDB4N2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfQVZEVkJUXzc2MV0gPSB7CgkJLyogTWF0dCBKZXNzb24gPGR2YkBqZXNzb24uZWNsaXBzZS5jby51az4gKi8KCQkvKiBCYXNlZCBvbiB0aGUgTmVidWxhIGNhcmQgZGF0YSAtIGFkZGVkIHJlbW90ZSBhbmQgbmV3IGNhcmQgbnVtYmVyIC0gQlRUVl9CT0FSRF9BVkRWQlRfNzYxLCBzZWUgYWxzbyBpci1rYmQtZ3Bpby5jICovCgkJLm5hbWUgICAgICAgICAgID0gIkF2ZXJNZWRpYSBBdmVyVFYgRFZCLVQgNzYxIiwKCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAzLCAxLCAyLCAwfSwgLyogQ29tcDAsIFMtVmlkZW8sID8sID8gKi8KCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCQkubm9fZ3Bpb2lycSAgICAgPSAxLAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfTUFUUklYX1ZJU0lPTlNRXSA9IHsKCQkvKiBhbmRyZS5zY2h3YXJ6QG1hdHJpeC12aXNpb24uZGUgKi8KCQkubmFtZSAgICAgICAgICAgICA9ICJNQVRSSVggVmlzaW9uIFNpZ21hLVNRIiwKCQkudmlkZW9faW5wdXRzICAgICA9IDE2LAoJCS5hdWRpb19pbnB1dHMgICAgID0gMCwKCQkudHVuZXIgICAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgICAgPSAweDAsCgkJLm11eHNlbCAgICAgICAgICAgPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCgkJCQkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCgkJLm11eHNlbF9ob29rICAgICAgPSBzaWdtYVNRX211eHNlbCwKCQkuYXVkaW9tdXggICAgICAgICA9IHsgMCB9LAoJCS5ub19tc3AzNHh4ICAgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCSAgPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfTUFUUklYX1ZJU0lPTlNMQ10gPSB7CgkJLyogYW5kcmUuc2Nod2FyekBtYXRyaXgtdmlzaW9uLmRlICovCgkJLm5hbWUgICAgICAgICAgICAgPSAiTUFUUklYIFZpc2lvbiBTaWdtYS1TTEMiLAoJCS52aWRlb19pbnB1dHMgICAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgICA9IDAsCgkJLnR1bmVyICAgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICAgID0gMHgwLAoJCS5tdXhzZWwgICAgICAgICAgID0geyAyLCAyLCAyLCAyIH0sCgkJLm11eHNlbF9ob29rICAgICAgPSBzaWdtYVNMQ19tdXhzZWwsCgkJLmF1ZGlvbXV4ICAgICAgICAgPSB7IDAgfSwKCQkubm9fbXNwMzR4eCAgICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgkgID0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCQkvKiBCVFRWX0JPQVJEX0FQQUNfVklFV0NPTVAgKi8KCVtCVFRWX0JPQVJEX0FQQUNfVklFV0NPTVBdID0gewoJCS8qIEF0dGlsYSBLb25kb3JvcyA8YXR0aWxhLmtvbmRvcm9zQGNoZWxsby5odT4gKi8KCQkvKiBidDg3OCBUViArIEZNIDB4MDAwMDAwMDAgc3Vic3lzdGVtIElEICovCgkJLm5hbWUgICAgICAgICAgID0gIkFQQUMgVmlld2NvbXAgODc4KEFNQVgpIiwKCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweEZGLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAwLCAwLCAwLCAxMH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwgICAvKiBtaW5pcmVtb3RlIHdvcmtzLCBzZWUgaXIta2JkLWdwaW8uYyAqLwoJCS5oYXNfcmFkaW8gICAgICA9IDEsICAgLyogbm90IGV2ZXJ5IGNhcmQgaGFzIHJhZGlvICovCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg4MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9EVklDT19EVkJUX0xJVEVdID0gewoJCS8qIENocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+ICovCgkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5ub192aWRlbyAgICAgICA9IDEsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9WR0VBUl9NWVZDRF0gPSB7CgkJLyogU3RldmVuIDxwaG90b24zOEBwY2hvbWUuY29tLnR3PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJWLUdlYXIgTXlWQ0QiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgzZiwKCQkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMH0sCgkJLmF1ZGlvbXV4ICAgICAgID0gezB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzF9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8gICAgICA9IDAsCgkjaWYgMAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgkjZW5kaWYKCX0sCglbQlRUVl9CT0FSRF9TVVBFUl9UVl0gPSB7CgkJLyogUmljayBDIDxjcnlwdGRyYWdvb25AZ21haWwuY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJTdXBlciBUViBUdW5lciIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDB4MDAwMDAxLDAsMCwgMH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX1RJQkVUX0NTMTZdID0gewoJCS8qIENocmlzIEZhbm5pbmcgPHZpZGVvNGxpbnV4QGhheWRvbi5uZXQ+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlRpYmV0IFN5c3RlbXMgJ1Byb2dyZXNzIERWUicgQ1MxNiIsCgkJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIgfSwKCQkucGxsCQk9IFBMTF8yOCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIJPSAxLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5tdXhzZWxfaG9vayAgICA9IHRpYmV0Q1MxNl9tdXhzZWwsCgl9LAoJW0JUVFZfQk9BUkRfS09ESUNPTV80NDAwUl0gPSB7CgkJLyogQmlsbCBCcmFjayA8d2JyYWNrQG1tbS5jb20uaGs+ICovCgkJLyoKCQkqIE5vdGUgdGhhdCwgYmVjYXVzZSBvZiB0aGUgY2FyZCdzIHdpcmluZywgdGhlICJtYXN0ZXIiCgkJKiBCVDg3OEEgY2hpcCAoaS5lLiB0aGUgb25lIHdoaWNoIGNvbnRyb2xzIHRoZSBhbmFsb2cgc3dpdGNoCgkJKiBhbmQgbXVzdCB1c2UgdGhpcyBjYXJkIHR5cGUpIGlzIHRoZSAybmQgb25lIGRldGVjdGVkLiAgVGhlCgkJKiBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgY2FyZCB0eXBlIDB4ODUsIHdob3NlIGRlc2NyaXB0aW9uCgkJKiBmb2xsb3dzIHRoaXMgb25lLiAgVGhlcmUgaXMgYSBFRVBST00gb24gdGhlIGNhcmQgKHdoaWNoIGlzCgkJKiBjb25uZWN0ZWQgdG8gdGhlIEkyQyBvZiBvbmUgb2YgdGhvc2Ugb3RoZXIgY2hpcHMpLCBidXQgaXMKCQkqIG5vdCBjdXJyZW50bHkgaGFuZGxlZC4gIFRoZXJlIGlzIGFsc28gYSBmYWNpbGl0eSBmb3IgYQoJCSogIm1vbml0b3IiLCB3aGljaCBpcyBhbHNvIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCgkJKi8KCQkubmFtZSAgICAgICAgICAgPSAiS29kaWNvbSA0NDAwUiAobWFzdGVyKSIsCgkJLnZpZGVvX2lucHV0cwk9IDE2LAoJCS5hdWRpb19pbnB1dHMJPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5zdmhzCQk9IC0xLAoJCS8qIEdQSU8gYml0cyAwLTkgdXNlZCBmb3IgYW5hbG9nIHN3aXRjaDoKCQkqICAgMDAgLSAwMzoJY2FtZXJhIHNlbGVjdG9yCgkJKiAgIDA0IC0gMDY6CWNoYW5uZWwgKGNvbnRyb2xsZXIpIHNlbGVjdG9yCgkJKiAgIDA3OglkYXRhICgxLT5vbiwgMC0+b2ZmKQoJCSogICAwODoJc3Ryb2JlCgkJKiAgIDA5OglyZXNldAoJCSogYml0IDE2IGlzIGlucHV0IGZyb20gc3luYyBzZXBhcmF0b3IgZm9yIHRoZSBjaGFubmVsCgkJKi8KCQkuZ3Bpb21hc2sJPSAweDAwMDNmZiwKCQkubm9fZ3Bpb2lycSAgICAgPSAxLAoJCS5tdXhzZWwJCT0geyAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCgkJLnBsbAkJPSBQTExfMjgsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5ub190ZGE3NDMyCT0gMSwKCQkubm9fdGRhOTg3NQk9IDEsCgkJLm11eHNlbF9ob29rCT0ga29kaWNvbTQ0MDByX211eHNlbCwKCX0sCglbQlRUVl9CT0FSRF9LT0RJQ09NXzQ0MDBSX1NMXSA9IHsKCQkvKiBCaWxsIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4gKi8KCQkvKiBOb3RlIHRoYXQsIGZvciByZWFzb25zIHVua25vd24sIHRoZSAibWFzdGVyIiBCVDg3OEEgY2hpcCAoaS5lLiB0aGUKCQkqIG9uZSB3aGljaCBjb250cm9scyB0aGUgYW5hbG9nIHN3aXRjaCwgYW5kIG11c3QgdXNlIHRoZSBjYXJkIHR5cGUpCgkJKiBpcyB0aGUgMm5kIG9uZSBkZXRlY3RlZC4gIFRoZSBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgdGhpcyBjYXJkCgkJKiB0eXBlCgkJKi8KCQkubmFtZQkJPSAiS29kaWNvbSA0NDAwUiAoc2xhdmUpIiwKCQkudmlkZW9faW5wdXRzCT0gMTYsCgkJLmF1ZGlvX2lucHV0cwk9IDAsCgkJLnR1bmVyCQk9IC0xLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnN2aHMJCT0gLTEsCgkJLmdwaW9tYXNrCT0gMHgwMTAwMDAsCgkJLm5vX2dwaW9pcnEgICAgID0gMSwKCQkubXV4c2VsCQk9IHsgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMyB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkubm9fdGRhNzQzMgk9IDEsCgkJLm5vX3RkYTk4NzUJPSAxLAoJCS5tdXhzZWxfaG9vawk9IGtvZGljb200NDAwcl9tdXhzZWwsCgl9LAoJCS8qIC0tLS0gY2FyZCAweDg2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfQURMSU5LX1JUVjI0XSA9IHsKCQkvKiBNaWNoYWVsIEhlbnNvbiA8bWhlbnNvbkBjbGFyaXR5dmkuY29tPiAqLwoJCS8qIEFkbGluayBSVFYyNCB3aXRoIHNwZWNpYWwgdW5sb2NrIGNvZGVzICovCgkJLm5hbWUgICAgICAgICAgID0gIkFkbGluayBSVFYyNCIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCgkJLyogLS0tLSBjYXJkIDB4ODctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURV0gPSB7CgkJLyogTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbTFrLm5ldD4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiRFZpQ08gRnVzaW9uSERUViA1IExpdGUiLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfVERWU19IMDYyRiwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSB9LAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDBlMDAwMDcsCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwNDAwMDA1LCAwLCAweDAwMDAwMDAxLCAwLCAweDAwYzAwMDA3LCAwIH0sCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCX0sCgkJLyogLS0tLSBjYXJkIDB4ODgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9BQ09SUF9ZODc4Rl0gPSB7CgkJLyogTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGJydHVyYm8uY29tLmJyPiAqLwoJCS5uYW1lCQk9ICJBY29ycCBZODc4RiIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1lNRUNfVFZGNjZUNV9CX0RGRiwKCQkudHVuZXJfYWRkcgk9IDB4YzEgPj4xLAoJCS5yYWRpb19hZGRyICAgICA9IDB4YzEgPj4xLAoJCS5oYXNfcmFkaW8JPSAxLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4OSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9DT05DRVBUUk9OSUNfQ1RWRk1JMl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkNvbmNlcHRyb25pYyBDVFZGTWkgdjIiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMDFjMDAwNywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDIsIDMgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJI2lmIDAKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJI2VuZGlmCgl9LAoJCS8qIC0tLS0gY2FyZCAweDhhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BWX0JUODc4UF8yRV0gPSB7CgkJLm5hbWUgICAgICAgICAgPSAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQ4NzhQKyAoUmV2LjJFKSIsCgkJLnZpZGVvX2lucHV0cyAgPSA1LAoJCS5hdWRpb19pbnB1dHMgID0gMSwKCQkudHVuZXIgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgPSAzLAoJCS5ncGlvbWFzayAgICAgID0gMHgwMWZlMDAsCgkJLm11eHNlbCAgICAgICAgPSB7IDIsMywxLDEsLTEgfSwKCQkuZGlnaXRhbF9tb2RlICA9IERJR0lUQUxfTU9ERV9DQU1FUkEsCgkJLmF1ZGlvbXV4ICAgICAgPSB7IDB4MDA0MDAsIDB4MTA0MDAsIDB4MDQ0MDAsIDB4ODAwMDAsIDB4MTI0MDAsIDB4NDYwMDAgIH0sCgkJLm5vX21zcDM0eHggICAgPSAxLAoJCS5wbGwgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgID0gVFVORVJfTEdfUEFMX0ZNLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlICAgID0gMSwKCX0sCgkJLyogLS0tLSBjYXJkIDB4OGIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfUFZfTTQ5MDBdID0gewoJCS8qIFPpcmdpbyBGb3J0aWVyIDxzZXJnaW9mb3J0aWVyQHlhaG9vLmNvbS5icj4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiUHJvbGluayBQaXhlbFZpZXcgUGxheVRWIE1QRUcyIFBWLU00OTAwIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4M2YsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDIxLCAweDIwLCAweDI0LCAweDJjLCAweDI5LCAweDI5IH0sCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfWU1FQ19UVkZfNTUzM01GLAoJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgl9LAoJCS8qIC0tLS0gY2FyZCAweDhjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX09TUFJFWTQ0MF0gID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgNDQwIiwKCQkudmlkZW9faW5wdXRzICAgPSAxLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVU5TRVQsCgkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4ZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9BU09VTkRfU0tZRVlFXSA9IHsKCQkubmFtZQkJPSAiQXNvdW5kIFNreWV5ZSBQQ1RWIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7MiwwLDAsMCwxfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAyLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCn07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGJ0dHZfbnVtX3R2Y2FyZHMgPSBBUlJBWV9TSVpFKGJ0dHZfdHZjYXJkcyk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XTsKCi8qCiAqIGlkZW50aWZ5IGNhcmQKICovCnZvaWQgX19kZXZpbml0IGJ0dHZfaWRjYXJkKHN0cnVjdCBidHR2ICpidHYpCnsKCXVuc2lnbmVkIGludCBncGlvYml0czsKCWludCBpLHR5cGU7Cgl1bnNpZ25lZCBzaG9ydCB0bXA7CgoJLyogcmVhZCBQQ0kgc3Vic3lzdGVtIElEICovCglwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmdG1wKTsKCWJ0di0+Y2FyZGlkID0gdG1wIDw8IDE2OwoJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnR2LT5jLnBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZ0bXApOwoJYnR2LT5jYXJkaWQgfD0gdG1wOwoKCWlmICgwICE9IGJ0di0+Y2FyZGlkICYmIDB4ZmZmZmZmZmYgIT0gYnR2LT5jYXJkaWQpIHsKCQkvKiBsb29rIGZvciB0aGUgY2FyZCAqLwoJCWZvciAodHlwZSA9IC0xLCBpID0gMDsgY2FyZHNbaV0uaWQgIT0gMDsgaSsrKQoJCQlpZiAoY2FyZHNbaV0uaWQgID09IGJ0di0+Y2FyZGlkKQoJCQkJdHlwZSA9IGk7CgoJCWlmICh0eXBlICE9IC0xKSB7CgkJCS8qIGZvdW5kIGl0ICovCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZGV0ZWN0ZWQ6ICVzIFtjYXJkPSVkXSwgIgoJCQkgICAgICAgIlBDSSBzdWJzeXN0ZW0gSUQgaXMgJTA0eDolMDR4XG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLGNhcmRzW3R5cGVdLm5hbWUsY2FyZHNbdHlwZV0uY2FyZG5yLAoJCQkgICAgICAgYnR2LT5jYXJkaWQgJiAweGZmZmYsCgkJCSAgICAgICAoYnR2LT5jYXJkaWQgPj4gMTYpICYgMHhmZmZmKTsKCQkJYnR2LT5jLnR5cGUgPSBjYXJkc1t0eXBlXS5jYXJkbnI7CgkJfSBlbHNlIHsKCQkJLyogNDA0ICovCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogc3Vic3lzdGVtOiAlMDR4OiUwNHggKFVOS05PV04pXG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLCBidHYtPmNhcmRpZCAmIDB4ZmZmZiwKCQkJICAgICAgIChidHYtPmNhcmRpZCA+PiAxNikgJiAweGZmZmYpOwoJCQlwcmludGsoS0VSTl9ERUJVRyAicGxlYXNlIG1haWwgaWQsIGJvYXJkIG5hbWUgYW5kICIKCQkJICAgICAgICJ0aGUgY29ycmVjdCBjYXJkPSBpbnNtb2Qgb3B0aW9uIHRvIHZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbVxuIik7CgkJfQoJfQoKCS8qIGxldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgYXV0b2RldGVjdGVkIHR5cGUgKi8KCWlmIChjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzKQoJCWJ0di0+Yy50eXBlPWNhcmRbYnR2LT5jLm5yXTsKCgkvKiBwcmludCB3aGljaCBjYXJkIGNvbmZpZyB3ZSBhcmUgdXNpbmcgKi8KCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogdXNpbmc6ICVzIFtjYXJkPSVkLCVzXVxuIixidHYtPmMubnIsCgkgICAgICAgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLCBidHYtPmMudHlwZSwKCSAgICAgICBjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzCgkgICAgICAgPyAiaW5zbW9kIG9wdGlvbiIgOiAiYXV0b2RldGVjdGVkIik7CgoJLyogb3ZlcndyaXRlIGdwaW8gc3R1ZmYgPz8gKi8KCWlmIChVTlNFVCA9PSBhdWRpb2FsbCAmJiBVTlNFVCA9PSBhdWRpb211eFswXSkKCQlyZXR1cm47CgoJaWYgKFVOU0VUICE9IGF1ZGlvbXV4WzBdKSB7CgkJZ3Bpb2JpdHMgPSAwOwoJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKCQkJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb211eFtpXSA9IGF1ZGlvbXV4W2ldOwoJCQlncGlvYml0cyB8PSBhdWRpb211eFtpXTsKCQl9Cgl9IGVsc2UgewoJCWdwaW9iaXRzID0gYXVkaW9hbGw7CgkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2ldID0gYXVkaW9hbGw7CgkJfQoJfQoJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayA9IChVTlNFVCAhPSBncGlvbWFzaykgPyBncGlvbWFzayA6IGdwaW9iaXRzOwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBncGlvIGNvbmZpZyBvdmVycmlkZTogbWFzaz0weCV4LCBtdXg9IiwKCSAgICAgICBidHYtPmMubnIsYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayk7Cglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CgkJcHJpbnRrKCIlczB4JXgiLCBpID8gIiwiIDogIiIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbaV0pOwoJfQoJcHJpbnRrKCJcbiIpOwp9CgovKgogKiAobW9zdCkgYm9hcmQgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb25zIGdvZXMgaGVyZQogKi8KCi8qIFNvbWUgTW9kdWxhciBUZWNobm9sb2d5IGNhcmRzIGhhdmUgYW4gZWVwcm9tLCBidXQgbm8gc3Vic3lzdGVtIElEICovCnZvaWQgaWRlbnRpZnlfYnlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XSkKewoJaW50IHR5cGUgPSAtMTsKCglpZiAoMCA9PSBzdHJuY21wKGVlcHJvbV9kYXRhLCJHRVQgTU0yMHhQQ1RWIiwxMykpCgkJdHlwZSA9IEJUVFZfQk9BUkRfTU9EVEVDXzIwNTsKCWVsc2UgaWYgKDAgPT0gc3RybmNtcChlZXByb21fZGF0YSsyMCwiUGljb2xvIiw3KSkKCQl0eXBlID0gQlRUVl9CT0FSRF9FVVJFU1lTX1BJQ09MTzsKCWVsc2UgaWYgKGVlcHJvbV9kYXRhWzBdID09IDB4ODQgJiYgZWVwcm9tX2RhdGFbMl09PSAwKQogICAgICAgICAgICAgICAgdHlwZSA9IEJUVFZfQk9BUkRfSEFVUFBBVUdFOyAvKiBvbGQgYnQ4NDggKi8KCglpZiAoLTEgIT0gdHlwZSkgewoJCWJ0di0+Yy50eXBlID0gdHlwZTsKCQlwcmludGsoImJ0dHYlZDogZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlcyBbY2FyZD0lZF1cbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLCBidHYtPmMudHlwZSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGZseXZpZGVvX2dwaW8oc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IGdwaW8saGFzX3JlbW90ZSxoYXNfcmFkaW8saXNfY2FwdHVyZV9vbmx5LGlzX2xyOTAsaGFzX3RkYTk4MjBfdGRhOTgyMTsKCWludCB0dW5lcj0tMSx0dHlwZTsKCglncGlvX2lub3V0KDB4ZmZmZmZmLCAwKTsKCXVkZWxheSg4KTsgIC8qIHdpdGhvdXQgdGhpcyB3ZSB3b3VsZCBzZWUgdGhlIDB4MTgwMCBtYXNrICovCglncGlvID0gZ3Bpb19yZWFkKCk7CgkvKiBGSVhNRTogbXVzdCByZXN0b3JlIE9VUl9FTiA/Pz8gKi8KCgkvKiBhbGwgY2FyZHMgcHJvdmlkZSBHUElPIGluZm8sIHNvbWUgaGF2ZSBhbiBhZGRpdGlvbmFsIGVlcHJvbQoJICogTFI1MDogR1BJTyBjb2RpbmcgY2FuIGJlIGZvdW5kIGxvd2VyIHJpZ2h0IENQMSAuLiBDUDkKCSAqICAgICAgIENQOT1HUElPMjMgLi4gQ1AxPUdQSU8xNTsgd2hlbiBPUEVOLCB0aGUgY29ycmVzcG9uZGluZyBHUElPIHJlYWRzIDEuCgkgKiAgICAgICBHUElPMTQtMTI6IG4uYy4KCSAqIExSOTA6IEdQOT1HUElPMjMgLi4gR1AxPUdQSU8xNSAocmlnaHQgYWJvdmUgdGhlIGJ0ODc4KQoKCSAqIGxvd2VzdCAzIGJ5dGVzIGFyZSByZW1vdGUgY29udHJvbCBjb2RlcyAobm8gaGFuZHNoYWtlIG5lZWRlZCkKCSAqIHh4eEZGRjogTm8gcmVtb3RlIGNvbnRyb2wgY2hpcCBzb2xkZXJlZAoJICogeHh4RjAwKExSMjYvTFI1MCksIHh4eEZFMChMUjkwKTogUmVtb3RlIGNvbnRyb2wgY2hpcCAoTFZBMDAxIG9yIENGNDUpIHNvbGRlcmVkCgkgKiBOb3RlOiBTb21lIGJpdHMgYXJlIEF1ZGlvX01hc2sgIQoJICovCgl0dHlwZT0oZ3BpbyYweDBmMDAwMCk+PjE2OwoJc3dpdGNoKHR0eXBlKSB7CgljYXNlIDB4MDogdHVuZXI9MjsgLyogTlRTQywgZS5nLiBUUEk4TlNSMTFQICovCgkJYnJlYWs7CiAgICAgICAgY2FzZSAweDI6IHR1bmVyPTM5Oy8qIExHIE5UU0MgKG5ld2VyIFRBUEMgc2VyaWVzKSBUQVBDLUg3MDFQICovCgkJYnJlYWs7CgljYXNlIDB4NDogdHVuZXI9NTsgLyogUGhpbGlwcyBQQUwgVFBJOFBTQjAyUCwgVFBJOFBTQjEyUCwgVFBJOFBTQjEyRCBvciBGSTEyMTYsIEZNMTIxNiAqLwoJCWJyZWFrOwoJY2FzZSAweDY6IHR1bmVyPTM3Oy8qIExHIFBBTCAobmV3ZXIgVEFQQyBzZXJpZXMpIFRBUEMtRzcwMlAgKi8KCQlicmVhazsKCQljYXNlIDB4QzogdHVuZXI9MzsgLyogUGhpbGlwcyBTRUNBTSgrUEFMKSBGUTEyMTZNRSBvciBGSTEyMTZNRiAqLwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvX2dwaW86IHVua25vd24gdHVuZXIgdHlwZS5cbiIsIGJ0di0+Yy5ucik7Cgl9CgoJaGFzX3JlbW90ZSAgICAgICAgICA9ICAgZ3BpbyAmIDB4ODAwMDAwOwoJaGFzX3JhZGlvCSAgICA9ICAgZ3BpbyAmIDB4NDAwMDAwOwoJLyogICB1bmtub3duICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwOwoJICogICB1bmtub3duMiAgICAgICAgICAgICAgICAgIDB4MTAwMDAwOyAqLwogICAgICAgIGlzX2NhcHR1cmVfb25seSAgICAgPSAhKGdwaW8gJiAweDAwODAwMCk7IC8qIEdQSU8xNSAqLwoJaGFzX3RkYTk4MjBfdGRhOTgyMSA9ICEoZ3BpbyAmIDB4MDA0MDAwKTsKCWlzX2xyOTAgICAgICAgICAgICAgPSAhKGdwaW8gJiAweDAwMjAwMCk7IC8qIGVsc2UgTFIyNi9MUjUwIChMUjM4L0xSNTEgZi4gY2FwdHVyZSBvbmx5KSAqLwoJLyoKCSAqIGdwaW8gJiAweDAwMTAwMCAgICBvdXRwdXQgYml0IGZvciBhdWRpbyByb3V0aW5nICovCgoJaWYoaXNfY2FwdHVyZV9vbmx5KQoJCXR1bmVyPTQ7IC8qIE5vIHR1bmVyIHByZXNlbnQgKi8KCglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvIFJhZGlvPSVzIFJlbW90ZUNvbnRyb2w9JXMgVHVuZXI9JWQgZ3Bpbz0weCUwNnhcbiIsCgkgICAgICAgYnR2LT5jLm5yLCBoYXNfcmFkaW8/ICJ5ZXMiOiJubyAiLCBoYXNfcmVtb3RlPyAieWVzIjoibm8gIiwgdHVuZXIsIGdwaW8pOwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlbyAgTFI5MD0lcyB0ZGE5ODIxL3RkYTk4MjA9JXMgY2FwdHVyZV9vbmx5PSVzXG4iLAoJCWJ0di0+Yy5uciwgaXNfbHI5MD8ieWVzIjoibm8gIiwgaGFzX3RkYTk4MjBfdGRhOTgyMT8ieWVzIjoibm8gIiwKCQlpc19jYXB0dXJlX29ubHk/InllcyI6Im5vICIpOwoKCWlmKHR1bmVyIT0gLTEpIC8qIG9ubHkgc2V0IGlmIGtub3duIHR1bmVyIGF1dG9kZXRlY3RlZCwgZWxzZSBsZXQgaW5zbW9kIG9wdGlvbiB0aHJvdWdoICovCgkJYnR2LT50dW5lcl90eXBlID0gdHVuZXI7CglidHYtPmhhc19yYWRpbyA9IGhhc19yYWRpbzsKCgkvKiBMUjkwIEF1ZGlvIFJvdXRpbmcgaXMgZG9uZSBieSAyIGhlZjQwNTIsIHNvIEF1ZGlvX01hc2sgaGFzIDQgYml0czogMHgwMDFjODAKCSAqIExSMjYvTFI1MCBvbmx5IGhhcyAxIGhlZjQwNTIsIEF1ZGlvX01hc2sgMHgwMDBjMDAKCSAqIEF1ZGlvIG9wdGlvbnM6IGZyb20gdHVuZXIsIGZyb20gdGRhOTgyMS90ZGE5ODIxKG1vbm8sc3RlcmVvLHNhcCksIGZyb20gdGRhOTg3NCwgZXh0LiwgbXV0ZSAqLwoJaWYoaGFzX3RkYTk4MjBfdGRhOTgyMSkgYnR2LT5hdWRpb19ob29rID0gbHQ5NDE1X2F1ZGlvOwoJLyogdG9kbzogaWYoaGFzX3RkYTk4NzQpIGJ0di0+YXVkaW9faG9vayA9IGZ2MjAwMHNfYXVkaW87ICovCn0KCnN0YXRpYyBpbnQgbWlyb190dW5lcm1hcFtdID0geyAwLDYsMiwzLCAgIDQsNSw2LDAsICAzLDAsNCw1LCAgNSwyLDE2LDEsCgkJCSAgICAgICAxNCwyLDE3LDEsIDQsMSw0LDMsICAxLDIsMTYsMSwgNCw0LDQsNCB9OwpzdGF0aWMgaW50IG1pcm9fZm10dW5lcltdICA9IHsgMCwwLDAsMCwgICAwLDAsMCwwLCAgMCwwLDAsMCwgIDAsMCwwLDEsCgkJCSAgICAgICAxLDEsMSwxLCAgIDEsMSwxLDAsICAwLDAsMCwwLCAgMCwxLDAsMCB9OwoKc3RhdGljIHZvaWQgbWlyb19waW5uYWNsZV9ncGlvKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCBpZCxtc3AsZ3BpbzsKCWNoYXIgKmluZm87CgoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMCk7CiAgICAgICAgZ3BpbyA9IGdwaW9fcmVhZCgpOwoJaWQgICA9ICgoZ3Bpbz4+MTApICYgNjMpIC0xOwoJbXNwICA9IGJ0dHZfSTJDUmVhZChidHYsIEkyQ19NU1AzNDAwLCAiTVNQMzR4eCIpOwoJaWYgKGlkIDwgMzIpIHsKCQlidHYtPnR1bmVyX3R5cGUgPSBtaXJvX3R1bmVybWFwW2lkXTsKCQlpZiAoMCA9PSAoZ3BpbyAmIDB4MjApKSB7CgkJCWJ0di0+aGFzX3JhZGlvID0gMTsKCQkJaWYgKCFtaXJvX2ZtdHVuZXJbaWRdKSB7CgkJCQlidHYtPmhhc19tYXRjaGJveCA9IDE7CgkJCQlidHYtPm1ib3hfd2UgICAgPSAoMTw8Nik7CgkJCQlidHYtPm1ib3hfbW9zdCAgPSAoMTw8Nyk7CgkJCQlidHYtPm1ib3hfY2xrICAgPSAoMTw8OCk7CgkJCQlidHYtPm1ib3hfZGF0YSAgPSAoMTw8OSk7CgkJCQlidHYtPm1ib3hfbWFzayAgPSAoMTw8Nil8KDE8PDcpfCgxPDw4KXwoMTw8OSk7CgkJCX0KCQl9IGVsc2UgewoJCQlidHYtPmhhc19yYWRpbyA9IDA7CgkJfQoJCWlmICgtMSAhPSBtc3ApIHsKCQkJaWYgKGJ0di0+Yy50eXBlID09IEJUVFZfQk9BUkRfTUlSTykKCQkJCWJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9NSVJPUFJPOwoJCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9CT0FSRF9QSU5OQUNMRSkKCQkJCWJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9QSU5OQUNMRVBSTzsKCQl9CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAiYnR0diVkOiBtaXJvOiBpZD0lZCB0dW5lcj0lZCByYWRpbz0lcyBzdGVyZW89JXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgaWQrMSwgYnR2LT50dW5lcl90eXBlLAoJCSAgICAgICAhYnR2LT5oYXNfcmFkaW8gPyAibm8iIDoKCQkgICAgICAgKGJ0di0+aGFzX21hdGNoYm94ID8gIm1hdGNoYm94IiA6ICJmbXR1bmVyIiksCgkJICAgICAgICgtMSA9PSBtc3ApID8gIm5vIiA6ICJ5ZXMiKTsKCX0gZWxzZSB7CgkJLyogbmV3IGNhcmRzIHdpdGggbWljcm90dW5lIHR1bmVyICovCgkJaWQgPSA2MyAtIGlkOwoJCWJ0di0+aGFzX3JhZGlvID0gMDsKCQlzd2l0Y2ggKGlkKSB7CgkJY2FzZSAxOgoJCQlpbmZvID0gIlBBTCAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDI6CgkJCWluZm8gPSAiUEFMK1NFQ0FNIC8gc3RlcmVvIjsKCQkJYnR2LT5oYXNfcmFkaW8gPSAxOwoJCQlicmVhazsKCQljYXNlIDM6CgkJCWluZm8gPSAiTlRTQyAvIHN0ZXJlbyI7CgkJCWJ0di0+aGFzX3JhZGlvID0gMTsKCQkJYnJlYWs7CgkJY2FzZSA0OgoJCQlpbmZvID0gIlBBTCtTRUNBTSAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDU6CgkJCWluZm8gPSAiTlRTQyAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDY6CgkJCWluZm8gPSAiTlRTQyAvIHN0ZXJlbyI7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJaW5mbyA9ICJQQUwgLyBzdGVyZW8iOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlpbmZvID0gIm9vcHM6IHVua25vd24gY2FyZCI7CgkJCWJyZWFrOwoJCX0KCQlpZiAoLTEgIT0gbXNwKQoJCQlidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfUElOTkFDTEVQUk87CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAiYnR0diVkOiBwaW5uYWNsZS9tdDogaWQ9JWQgaW5mbz1cIiVzXCIgcmFkaW89JXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgaWQsIGluZm8sIGJ0di0+aGFzX3JhZGlvID8gInllcyIgOiAibm8iKTsKCQlidHYtPnR1bmVyX3R5cGUgID0gMzM7CgkJYnR2LT5waW5uYWNsZV9pZCA9IGlkOwoJfQp9CgovKiBHUElPMjEgICBMOiBCdWZmZXIgYWt0aXYsIEg6IEJ1ZmZlciBpbmFrdGl2ICovCiNkZWZpbmUgTE0xODgyX1NZTkNfRFJJVkUgICAgIDB4MjAwMDAwTAoKc3RhdGljIHZvaWQgaW5pdF9pZHNfZWFnbGUoc3RydWN0IGJ0dHYgKmJ0dikKewoJZ3Bpb19pbm91dCgweGZmZmZmZiwweEZGRkYzNyk7CglncGlvX3dyaXRlKDB4MjAwMDIwKTsKCgkvKiBmbGFzaCBzdHJvYmUgaW52ZXJ0ZXIgPyEgKi8KCWdwaW9fd3JpdGUoMHgyMDAwMjQpOwoKCS8qIHN3aXRjaCBzeW5jIGRyaXZlIG9mZiAqLwoJZ3Bpb19iaXRzKExNMTg4Ml9TWU5DX0RSSVZFLExNMTg4Ml9TWU5DX0RSSVZFKTsKCgkvKiBzZXQgQlQ4NDggbXV4ZWwgdG8gMiAqLwoJYnRhb3IoKDIpPDw1LCB+KDI8PDUpLCBCVDg0OF9JRk9STSk7Cn0KCi8qIE11eHNlbCBoZWxwZXIgZm9yIHRoZSBJRFMgRWFnbGUuCiAqIHRoZSBlYWdsZXMgZG9lcyBub3QgdXNlIHRoZSBzdGFuZGFyZCBtdXhzZWwtYml0cyBidXQKICogaGFzIGl0cyBvd24gbXVsdGlwbGV4ZXIgKi8Kc3RhdGljIHZvaWQgZWFnbGVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJYnRhb3IoKDIpPDw1LCB+KDM8PDUpLCBCVDg0OF9JRk9STSk7CglncGlvX2JpdHMoMyxidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm11eHNlbFtpbnB1dCY3XSk7CgogICAgICAgLyogY29tcG9zaXRlICovCiAgICAgICAvKiBzZXQgY2hyb21hIEFEQyB0byBzbGVlcCAqLwogICAgICAgYnRvcihCVDg0OF9BRENfQ19TTEVFUCwgQlQ4NDhfQURDKTsKICAgICAgIC8qIHNldCB0byBjb21wb3NpdGUgdmlkZW8gKi8KICAgICAgIGJ0YW5kKH5CVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X0VfQ09OVFJPTCk7CiAgICAgICBidGFuZCh+QlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9PX0NPTlRST0wpOwoKICAgICAgIC8qIHN3aXRjaCBzeW5jIGRyaXZlIG9mZiAqLwogICAgICAgZ3Bpb19iaXRzKExNMTg4Ml9TWU5DX0RSSVZFLExNMTg4Ml9TWU5DX0RSSVZFKTsKfQoKc3RhdGljIHZvaWQgZ3ZjMTEwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYXNrc1tdID0gezB4MzAsIDB4MDEsIDB4MTIsIDB4MjN9OwoJZ3Bpb193cml0ZShtYXNrc1tpbnB1dCU0XSk7Cn0KCi8qIExNTEJUNHggaW5pdGlhbGl6YXRpb24gLSB0byBhbGxvdyBhY2Nlc3MgdG8gR1BJTyBiaXRzIGZvciBzZW5zb3JzIGlucHV0IGFuZAogICBhbGFybXMgb3V0cHV0CgogICBHUElPYml0ICAgIHwgMTAgfCA5IHwgOCB8IDcgfCA2IHwgNSB8IDQgfCAzIHwgMiB8IDEgfCAwIHwKICAgYXNzaWdubWVudCB8IFRJIHwgTzN8SU54fCBPMnwgTzF8SU40fElOM3xJTjJ8SU4xfCAgIHwgICB8CgogICBJTiAtIHNlbnNvciBpbnB1dHMsIElOeCAtIHNlbnNvciBpbnB1dHMgYW5kIFRJIFhPUmVkIHRvZ2V0aGVyCiAgIE8xLE8yLE8zIC0gYWxhcm0gb3V0cHV0cyAocmVsYXlzKQoKICAgT1VUIEVOQUJMRSAgIDEgICAgMSAgIDAgIC4gMSAgMSAgIDAgICAwIC4gMCAgIDAgICAwICAgIDAgICA9IDB4NkMwCgoqLwoKc3RhdGljIHZvaWQgaW5pdF9sbWxidDR4KHN0cnVjdCBidHR2ICpidHYpCnsKCXByaW50ayhLRVJOX0RFQlVHICJMTUxCVDR4IGluaXRcbiIpOwoJYnR3cml0ZSgweDAwMDAwMCwgQlQ4NDhfR1BJT19SRUdfSU5QKTsKCWdwaW9faW5vdXQoMHhmZmZmZmYsIDB4MDAwNkMwKTsKCWdwaW9fd3JpdGUoMHgwMDAwMDApOwp9CgpzdGF0aWMgdm9pZCBzaWdtYVNRX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCXVuc2lnbmVkIGludCBpbm11eCA9IGlucHV0ICUgODsKCWdwaW9faW5vdXQoIDB4ZiwgMHhmICk7CglncGlvX2JpdHMoIDB4ZiwgaW5tdXggKTsKfQoKc3RhdGljIHZvaWQgc2lnbWFTTENfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJdW5zaWduZWQgaW50IGlubXV4ID0gaW5wdXQgJSA0OwoJZ3Bpb19pbm91dCggMzw8OSwgMzw8OSApOwoJZ3Bpb19iaXRzKCAzPDw5LCBpbm11eDw8OSApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgYnR0dl9yZXNldF9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKgoJICogQlQ4NzhBIGhhcyBhIGF1ZGlvLXJlc2V0IHJlZ2lzdGVyLgoJICogMS4gVGhpcyByZWdpc3RlciBpcyBhbiBhdWRpbyByZXNldCBmdW5jdGlvbiBidXQgaXQgaXMgaW4KCSAqICAgIGZ1bmN0aW9uLTAgKHZpZGVvIGNhcHR1cmUpIGFkZHJlc3Mgc3BhY2UuCgkgKiAyLiBJdCBpcyBlbm91Z2ggdG8gZG8gdGhpcyBvbmNlIHBlciBwb3dlci11cCBvZiB0aGUgY2FyZC4KCSAqIDMuIFRoZXJlIGlzIGEgdHlwbyBpbiB0aGUgQ29uZXhhbnQgZG9jIC0tIGl0IGlzIG5vdCBhdAoJICogICAgMHg1QiwgYnV0IGF0IDB4MDU4LiAoQiBpcyBhbiBvZGQtbnVtYmVyLCBvYnZpb3VzbHkgYSB0eXBvISkuCgkgKiAtLS8vU2hyaWt1bWFyIDAzMDYwOQoJICovCglpZiAoYnR2LT5pZCAhPSA4NzgpCgkJcmV0dXJuOwoKCWlmIChidHR2X2RlYnVnKQoJCXByaW50aygiYnR0diVkOiBCVDg3OEEgQVJFU0VUXG4iLGJ0di0+Yy5ucik7CglidHdyaXRlKCgxPDw3KSwgMHgwNTgpOwoJdWRlbGF5KDEwKTsKCWJ0d3JpdGUoICAgICAwLCAweDA1OCk7Cn0KCi8qIGluaXRpYWxpemF0aW9uIHBhcnQgb25lIC0tIGJlZm9yZSByZWdpc3RlcmluZyBpMmMgYnVzICovCnZvaWQgX19kZXZpbml0IGJ0dHZfaW5pdF9jYXJkMShzdHJ1Y3QgYnR0diAqYnR2KQp7Cglzd2l0Y2ggKGJ0di0+Yy50eXBlKSB7CgljYXNlIEJUVFZfQk9BUkRfSEFVUFBBVUdFOgoJY2FzZSBCVFRWX0JPQVJEX0hBVVBQQVVHRTg3ODoKICAgICAgICAgICAgICAgIGJvb3RfbXNwMzR4eChidHYsNSk7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfVk9PRE9PVFZfRk06CiAgICAgICAgICAgICAgICBib290X21zcDM0eHgoYnR2LDIwKTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9BVkVSTUVESUE5ODoKCQlib290X21zcDM0eHgoYnR2LDExKTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9IQVVQUEFVR0VQVlI6CgkJcHZyX2Jvb3QoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9UV0lOSEFOX0RTVDoKCWNhc2UgQlRUVl9CT0FSRF9BVkRWQlRfNzcxOgoJY2FzZSBCVFRWX0JPQVJEX1BJTk5BQ0xFU0FUOgoJCWJ0di0+dXNlX2kyY19odyA9IDE7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfQURMSU5LX1JUVjI0OgoJCWluaXRfUlRWMjQoIGJ0diApOwoJCWJyZWFrOwoKCX0KCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfZHZiKQoJCWJ0dHZfcmVzZXRfYXVkaW8oYnR2KTsKfQoKLyogaW5pdGlhbGl6YXRpb24gcGFydCB0d28gLS0gYWZ0ZXIgcmVnaXN0ZXJpbmcgaTJjIGJ1cyAqLwp2b2lkIF9fZGV2aW5pdCBidHR2X2luaXRfY2FyZDIoc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IHRkYTk4ODc7CglpbnQgYWRkcj1BRERSX1VOU0VULCByYWRpb19hZGRyPUFERFJfVU5TRVQ7CgogICAgICAgIGJ0di0+dHVuZXJfdHlwZSA9IC0xOwoKCWlmIChCVFRWX0JPQVJEX1VOS05PV04gPT0gYnR2LT5jLnR5cGUpIHsKCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CgkJaWRlbnRpZnlfYnlfZWVwcm9tKGJ0dixlZXByb21fZGF0YSk7Cgl9CgoJc3dpdGNoIChidHYtPmMudHlwZSkgewoJY2FzZSBCVFRWX0JPQVJEX01JUk86CgljYXNlIEJUVFZfQk9BUkRfTUlST1BSTzoKCWNhc2UgQlRUVl9CT0FSRF9QSU5OQUNMRToKCWNhc2UgQlRUVl9CT0FSRF9QSU5OQUNMRVBSTzoKCQkvKiBtaXJvL3Bpbm5hY2xlICovCgkJbWlyb19waW5uYWNsZV9ncGlvKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfRkxZVklERU9fOTg6CgljYXNlIEJUVFZfQk9BUkRfTUFYSToKCWNhc2UgQlRUVl9CT0FSRF9MSUZFX0ZMWUtJVDoKCWNhc2UgQlRUVl9CT0FSRF9GTFlWSURFTzoKCWNhc2UgQlRUVl9CT0FSRF9UWVBIT09OX1RWSUVXOgoJY2FzZSBCVFRWX0JPQVJEX0NIUk9OT1NfVlMyOgoJY2FzZSBCVFRWX0JPQVJEX0ZMWVZJREVPXzk4Rk06CgljYXNlIEJUVFZfQk9BUkRfRkxZVklERU8yMDAwOgoJY2FzZSBCVFRWX0JPQVJEX0ZMWVZJREVPOThFWjoKCWNhc2UgQlRUVl9CT0FSRF9DT05GRVJFTkNFVFY6CgljYXNlIEJUVFZfQk9BUkRfTElGRVRFQ185NDE1OgoJCWZseXZpZGVvX2dwaW8oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9IQVVQUEFVR0U6CgljYXNlIEJUVFZfQk9BUkRfSEFVUFBBVUdFODc4OgoJY2FzZSBCVFRWX0JPQVJEX0hBVVBQQVVHRVBWUjoKCQkvKiBwaWNrIHVwIHNvbWUgY29uZmlnIGluZm9zIGZyb20gdGhlIGVlcHJvbSAqLwoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKICAgICAgICAgICAgICAgIGhhdXBwYXVnZV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9BVkVSTUVESUE5ODoKCWNhc2UgQlRUVl9CT0FSRF9BVlBIT05FOTg6CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwoJCWF2ZXJtZWRpYV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9QWEMyMDA6CgkJaW5pdF9QWEMyMDAoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9QSUNPTE9fVEVUUkFfQ0hJUDoKCQlwaWNvbG9fdGV0cmFfaW5pdChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX1ZIWDoKCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJCWJ0di0+bWJveF93ZSAgICAgID0gMHgyMDsKCQlidHYtPm1ib3hfbW9zdCAgICA9IDA7CgkJYnR2LT5tYm94X2NsayAgICAgPSAweDA4OwoJCWJ0di0+bWJveF9kYXRhICAgID0gMHgxMDsKCQlidHYtPm1ib3hfbWFzayAgICA9IDB4Mzg7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfVk9CSVNfQk9PU1RBUjoKCWNhc2UgQlRUVl9CT0FSRF9URVJSQVRWOgoJCXRlcnJhdGVjX2FjdGl2ZV9yYWRpb191cGdyYWRlKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MToKCQlpZiAoYnR2LT5jYXJkaWQgPT0gMHgzMDAyMTQ0ZikgewoJCQlidHYtPmhhc19yYWRpbz0xOwoJCQlwcmludGsoImJ0dHYlZDogcmFkaW8gZGV0ZWN0ZWQgYnkgc3Vic3lzdGVtIGlkIChDUEgwNXgpXG4iLGJ0di0+Yy5ucik7CgkJfQoJCWJyZWFrOwogICAgICAgY2FzZSBCVFRWX0JPQVJEX1NUQjI6CiAgICAgICAgICAgICAgICBpZiAoYnR2LT5jYXJkaWQgPT0gMHgzMDYwMTIxYSkgewoJCQkvKiBGaXggdXAgZW50cnkgZm9yIDNERlggVm9vZG9vVFYgMTAwLAoJCQkgICB3aGljaCBpcyBhbiBPRU0gU1RCIGNhcmQgdmFyaWFudC4gKi8KCQkJYnR2LT5oYXNfcmFkaW89MDsKCQkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1RFTUlDX05UU0M7CgkJfQoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTF4MDoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkxeDBfODQ4OgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTEwMV84NDg6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMXgxOgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTF4MV9TVklEOgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTJ4eDoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkyeDBfU1ZJRDoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkyeDA6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZNTAwOgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTU0MDoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkyMDAwOgoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKICAgICAgICAgICAgICAgIG9zcHJleV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9JRFNfRUFHTEU6CgkJaW5pdF9pZHNfZWFnbGUoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9NT0RURUNfMjA1OgoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKCQltb2R0ZWNfZWVwcm9tKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfTE1MQlQ0OgoJCWluaXRfbG1sYnQ0eChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX1RJQkVUX0NTMTY6CgkJdGliZXRDUzE2X2luaXQoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9LT0RJQ09NXzQ0MDBSOgoJCWtvZGljb200NDAwcl9pbml0KGJ0dik7CgkJYnJlYWs7Cgl9CgoJLyogcGxsIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgICBpZiAoIShidHYtPmlkPT04NDggJiYgYnR2LT5yZXZpc2lvbj09MHgxMSkpIHsKCQkvKiBkZWZhdWx0cyBmcm9tIGNhcmQgbGlzdCAqLwoJCWlmIChQTExfMjggPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5wbGwpIHsKCQkJYnR2LT5wbGwucGxsX2lmcmVxPTI4NjM2MzYzOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbD1CVDg0OF9JRk9STV9YVDA7CgkJfQoJCWlmIChQTExfMzUgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5wbGwpIHsKCQkJYnR2LT5wbGwucGxsX2lmcmVxPTM1NDY4OTUwOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbD1CVDg0OF9JRk9STV9YVDE7CgkJfQoJCS8qIGluc21vZCBvcHRpb25zIGNhbiBvdmVycmlkZSAqLwogICAgICAgICAgICAgICAgc3dpdGNoIChwbGxbYnR2LT5jLm5yXSkgewogICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBub25lICovCgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsID0gMDsKCQkJYnR2LT5wbGwucGxsX2lmcmVxICAgPSAwOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxOiAvKiAyOCBNSHogKi8KCQljYXNlIDI4OgogICAgICAgICAgICAgICAgICAgICAgICBidHYtPnBsbC5wbGxfaWZyZXEgICA9IDI4NjM2MzYzOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ0di0+cGxsLnBsbF9jcnlzdGFsID0gQlQ4NDhfSUZPUk1fWFQwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjogLyogMzUgTUh6ICovCgkJY2FzZSAzNToKICAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5wbGwucGxsX2lmcmVxICAgPSAzNTQ2ODk1MDsKCQkJYnR2LT5wbGwucGxsX29mcmVxICAgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBidHYtPnBsbC5wbGxfY3J5c3RhbCA9IEJUODQ4X0lGT1JNX1hUMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSAtMTsKCgkvKiB0dW5lciBjb25maWd1cmF0aW9uIChmcm9tIGNhcmQgbGlzdCAvIGF1dG9kZXRlY3QgLyBpbnNtb2Qgb3B0aW9uKSAqLwoJaWYgKEFERFJfVU5TRVQgIT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl9hZGRyKQoJCWFkZHIgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX2FkZHI7CgoJaWYgKEFERFJfVU5TRVQgIT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5yYWRpb19hZGRyKQoJCXJhZGlvX2FkZHIgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnJhZGlvX2FkZHI7CgoJaWYgKFVOU0VUICE9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfdHlwZSkKCQlpZihVTlNFVCA9PSBidHYtPnR1bmVyX3R5cGUpCiAgICAgICAgCSAgICAgICAJYnR2LT50dW5lcl90eXBlID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl90eXBlOwoJaWYgKFVOU0VUICE9IHR1bmVyW2J0di0+Yy5ucl0pCgkJYnR2LT50dW5lcl90eXBlID0gdHVuZXJbYnR2LT5jLm5yXTsKCXByaW50aygiYnR0diVkOiB1c2luZyB0dW5lcj0lZFxuIixidHYtPmMubnIsYnR2LT50dW5lcl90eXBlKTsKCWlmIChidHYtPnBpbm5hY2xlX2lkICE9IFVOU0VUKQoJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIEFVRENfQ09ORklHX1BJTk5BQ0xFLAoJCQkJICAgICAgJmJ0di0+cGlubmFjbGVfaWQpOwoJaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkgewoJICAgICAgICBzdHJ1Y3QgdHVuZXJfc2V0dXAgdHVuX3NldHVwOwoKCSAgICAgICAgdHVuX3NldHVwLm1vZGVfbWFzayA9ICBUX0FOQUxPR19UViB8IFRfRElHSVRBTF9UVjsKCQl0dW5fc2V0dXAudHlwZSA9IGJ0di0+dHVuZXJfdHlwZTsKCQl0dW5fc2V0dXAuYWRkciA9IGFkZHI7CgoJCWlmIChhZGRyID09IHJhZGlvX2FkZHIpCgkJICAgICAgICB0dW5fc2V0dXAubW9kZV9tYXNrID0gIFRfUkFESU87CgoJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOwoJfQoKCWJ0di0+c3ZocyA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uc3ZoczsKCWlmIChzdmhzW2J0di0+Yy5ucl0gIT0gVU5TRVQpCgkJYnR2LT5zdmhzID0gc3Zoc1tidHYtPmMubnJdOwoJaWYgKHJlbW90ZVtidHYtPmMubnJdICE9IFVOU0VUKQoJCWJ0di0+aGFzX3JlbW90ZSA9IHJlbW90ZVtidHYtPmMubnJdOwoKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19yYWRpbykKCQlidHYtPmhhc19yYWRpbz0xOwoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX3JlbW90ZSkKCQlidHYtPmhhc19yZW1vdGU9MTsKCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub19ncGlvaXJxKQoJCWJ0di0+Z3Bpb2lycT0xOwoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9faG9vaykKCQlidHYtPmF1ZGlvX2hvb2s9YnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb19ob29rOwoKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmRpZ2l0YWxfbW9kZSA9PSBESUdJVEFMX01PREVfQ0FNRVJBKSB7CgkJLyogZGV0ZWN0IEJ0ODMyIGNoaXAgZm9yIHF1YXJ0enNpZ2h0IGRpZ2l0YWwgY2FtZXJhICovCgkJaWYgKChidHR2X0kyQ1JlYWQoYnR2LCBJMkNfQlQ4MzJfQUxUMSwgIkJ0ODMyIikgPj0wKSB8fAoJCSAgICAoYnR0dl9JMkNSZWFkKGJ0diwgSTJDX0JUODMyX0FMVDIsICJCdDgzMiIpID49MCkpCgkJCWJvb3RfYnQ4MzIoYnR2KTsKCX0KCglpZiAoIWF1dG9sb2FkKQoJCXJldHVybjsKCgkvKiB0cnkgdG8gZGV0ZWN0IGF1ZGlvL2ZhZGVyIGNoaXBzICovCglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fbXNwMzR4eCAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19NU1AzNDAwLCAiTVNQMzR4eCIpID49MCkKCQlyZXF1ZXN0X21vZHVsZSgibXNwMzQwMCIpOwoKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm1zcDM0eHhfYWx0ICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX01TUDM0MDBfQUxULCAiTVNQMzR4eCAoYWx0ZXJuYXRlIGFkZHJlc3MpIikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJtc3AzNDAwIik7CgoJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX3RkYTk4NzUgJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfVERBOTg3NSwgIlREQTk4NzUiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoInRkYTk4NzUiKTsKCglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fdGRhNzQzMiAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19UREE3NDMyLCAiVERBNzQzMiIpID49MCkKCQlyZXF1ZXN0X21vZHVsZSgidGRhNzQzMiIpOwoKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5lZWRzX3R2YXVkaW8pCgkJcmVxdWVzdF9tb2R1bGUoInR2YXVkaW8iKTsKCgkvKiB0dW5lciBtb2R1bGVzICovCgl0ZGE5ODg3ID0gMDsKCWlmIChidHYtPnBpbm5hY2xlX2lkICE9IFVOU0VUKQoJCXRkYTk4ODcgPSAxOwoJaWYgKDAgPT0gdGRhOTg4NyAmJiAwID09IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YiAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19UREE5ODg3LCAiVERBOTg4NyIpID49MCkKCQl0ZGE5ODg3ID0gMTsKCWlmKChidHYtPnR1bmVyX3R5cGUgPT0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMpIHx8CgkgICAoYnR2LT50dW5lcl90eXBlID09IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMykgfHwKCSAgIChidHYtPnR1bmVyX3R5cGUgPT0gVFVORVJfUEhJTElQU19GTTEyNTZfSUgzKSB8fAoJICAgIHRkYTk4ODcpCgkJcmVxdWVzdF9tb2R1bGUoInRkYTk4ODciKTsKCWlmIChidHYtPnR1bmVyX3R5cGUgIT0gVU5TRVQpCgkJcmVxdWVzdF9tb2R1bGUoInR1bmVyIik7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgbW9kdGVjX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQp7CglpZiggc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiVGVtaWMgNDA2NiBGWTUiLDE0KSA9PTApIHsKCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfVEVNSUNfNDA2NkZZNV9QQUxfSTsKCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7Cgl9IGVsc2UgaWYgKHN0cm5jbXAoJihlZXByb21fZGF0YVsweDFlXSksIkFscHMgVFNCQjUiLDEwKSA9PTApIHsKCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfQUxQU19UU0JCNV9QQUxfSTsKCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoJihlZXByb21fZGF0YVsweDFlXSksIlBoaWxpcHMgRk0xMjQ2IiwxNCkgPT0wKSB7CiAgICAgICAgICAgICAgICBidHYtPnR1bmVyX3R5cGU9VFVORVJfUEhJTElQU19OVFNDOwogICAgICAgICAgICAgICAgcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7Cgl9IGVsc2UgewoJCXByaW50aygiYnR0diVkOiBNb2R0ZWM6IFVua25vd24gVHVuZXJTdHJpbmc6ICVzXG4iLAoJCSAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKCX0KfQoKc3RhdGljIHZvaWQgX19kZXZpbml0IGhhdXBwYXVnZV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewoJc3RydWN0IHR2ZWVwcm9tIHR2OwoKCXR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2coJmJ0di0+aTJjX2NsaWVudCwgJnR2LCBlZXByb21fZGF0YSk7CglidHYtPnR1bmVyX3R5cGUgPSB0di50dW5lcl90eXBlOwoJYnR2LT5oYXNfcmFkaW8gID0gdHYuaGFzX3JhZGlvOwp9CgpzdGF0aWMgaW50IHRlcnJhdGVjX2FjdGl2ZV9yYWRpb191cGdyYWRlKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCBmcmVxOwoKCWJ0di0+aGFzX3JhZGlvICAgID0gMTsKCWJ0di0+aGFzX21hdGNoYm94ID0gMTsKCWJ0di0+bWJveF93ZSAgICAgID0gMHgxMDsKCWJ0di0+bWJveF9tb3N0ICAgID0gMHgyMDsKCWJ0di0+bWJveF9jbGsgICAgID0gMHgwODsKCWJ0di0+bWJveF9kYXRhICAgID0gMHgwNDsKCWJ0di0+bWJveF9tYXNrICAgID0gMHgzYzsKCglidHYtPm1ib3hfaW93ICAgICA9IDEgPDwgIDg7CglidHYtPm1ib3hfaW9yICAgICA9IDEgPDwgIDk7CglidHYtPm1ib3hfY3NlbCAgICA9IDEgPDwgMTA7CgoJZnJlcT04ODAwMC82Mi41OwoJdGVhNTc1N193cml0ZShidHYsIDUgKiBmcmVxICsgMHgzNTgpOyAvKiB3cml0ZSAweDFlZDggKi8KCWlmICgweDFlZDggPT0gdGVhNTc1N19yZWFkKGJ0dikpIHsKCQlwcmludGsoImJ0dHYlZDogVGVycmF0ZWMgQWN0aXZlIFJhZGlvIFVwZ3JhZGUgZm91bmQuXG4iLAoJCSAgICAgICBidHYtPmMubnIpOwoJCWJ0di0+aGFzX3JhZGlvICAgID0gMTsKCQlidHYtPmhhc19tYXRjaGJveCA9IDE7Cgl9IGVsc2UgewoJCWJ0di0+aGFzX3JhZGlvICAgID0gMDsKCQlidHYtPmhhc19tYXRjaGJveCA9IDA7Cgl9CglyZXR1cm4gMDsKfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBtaW5pbWFsIGJvb3RzdHJhcCBmb3IgdGhlIFdpblRWL1BWUiAtLSB1cGxvYWQgYWx0ZXJhIGZpcm13YXJlLgogKgogKiBUaGUgaGN3YW1jLnJiZiBmaXJtd2FyZSBmaWxlIGlzIG9uIHRoZSBIYXVwcGF1Z2UgZHJpdmVyIENELiAgSGF2ZQogKiBhIGxvb2sgYXQgUHZyL3B2cjQ1eHh4LkVYRSAoc2VsZi1leHRyYWN0aW5nIHppcCBhcmNoaXZlLCBjYW4gYmUKICogdW5wYWNrZWQgd2l0aCB1bnppcCkuCiAqLwojZGVmaW5lIFBWUl9HUElPX0RFTEFZCQkxMAoKI2RlZmluZSBCVFRWX0FMVF9EQVRBCQkweDAwMDAwMQojZGVmaW5lIEJUVFZfQUxUX0RDTEsJCTB4MTAwMDAwCiNkZWZpbmUgQlRUVl9BTFRfTkNPTkZJRwkweDgwMDAwMAoKc3RhdGljIGludCBfX2RldmluaXQgcHZyX2FsdGVyYV9sb2FkKHN0cnVjdCBidHR2ICpidHYsIHU4ICptaWNybywgdTMyIG1pY3JvbGVuKQp7Cgl1MzIgbjsKICAJdTggYml0czsKCWludCBpOwoKCWdwaW9faW5vdXQoMHhmZmZmZmYsQlRUVl9BTFRfREFUQXxCVFRWX0FMVF9EQ0xLfEJUVFZfQUxUX05DT05GSUcpOwoJZ3Bpb193cml0ZSgwKTsKCXVkZWxheShQVlJfR1BJT19ERUxBWSk7CgoJZ3Bpb193cml0ZShCVFRWX0FMVF9OQ09ORklHKTsKCXVkZWxheShQVlJfR1BJT19ERUxBWSk7CgoJZm9yIChuID0gMDsgbiA8IG1pY3JvbGVuOyBuKyspIHsKCQliaXRzID0gbWljcm9bbl07CgkJZm9yICggaSA9IDAgOyBpIDwgOCA7IGkrKyApIHsKCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CgkJCWlmIChiaXRzICYgMHgwMSkKCQkJCWdwaW9fYml0cyhCVFRWX0FMVF9EQVRBLEJUVFZfQUxUX0RBVEEpOwoJCQllbHNlCgkJCQlncGlvX2JpdHMoQlRUVl9BTFRfREFUQSwwKTsKCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssQlRUVl9BTFRfRENMSyk7CgkJCWJpdHMgPj49IDE7CgkJfQoJfQoJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7Cgl1ZGVsYXkoUFZSX0dQSU9fREVMQVkpOwoKCS8qIGJlZ2luIEFsdGVyYSBpbml0IGxvb3AgKE5vdCBuZWNlc3NhcnksYnV0IGRvZXNuJ3QgaHVydCkgKi8KCWZvciAoaSA9IDAgOyBpIDwgMzAgOyBpKyspIHsKCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSyxCVFRWX0FMVF9EQ0xLKTsKCX0KCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9ib290KHN0cnVjdCBidHR2ICpidHYpCnsKICAgICAgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5OwoJaW50IHJjOwoKCXJjID0gcmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksICJoY3dhbWMucmJmIiwgJmJ0di0+Yy5wY2ktPmRldik7CglpZiAocmMgIT0gMCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogbm8gYWx0ZXJhIGZpcm13YXJlIFt2aWEgaG90cGx1Z11cbiIsCgkJICAgICAgIGJ0di0+Yy5ucik7CiAgICAgICAgICAgICAgICByZXR1cm4gcmM7CiAgICAgICAgfQoJcmMgPSBwdnJfYWx0ZXJhX2xvYWQoYnR2LCBmd19lbnRyeS0+ZGF0YSwgZndfZW50cnktPnNpemUpOwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBhbHRlcmEgZmlybXdhcmUgdXBsb2FkICVzXG4iLAoJICAgICAgIGJ0di0+Yy5uciwgKHJjIDwgMCkgPyAiZmFpbGVkIiA6ICJvayIpOwogICAgICAgIHJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOwoJcmV0dXJuIHJjOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBzb21lIG9zcHJleSBzcGVjaWZpYyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RhdGljIHZvaWQgX19kZXZpbml0IG9zcHJleV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewogICAgICAgaW50IGkgPSAwOwogICAgICAgdW5zaWduZWQgY2hhciAqZWUgPSBlZXByb21fZGF0YTsKICAgICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsID0gMDsKCiAgICAgICBpZiAoYnR2LT5jLnR5cGUgPT0gMCkgewogICAgICAgICAgICAgICAvKiB0aGlzIG1pZ2h0IGJlIGFuIGFudGlxdWUuLi4gY2hlY2sgZm9yIE1NQUMgbGFiZWwgaW4gZWVwcm9tICovCiAgICAgICAgICAgICAgIGlmICgoZWVbMF09PSdNJykgJiYgKGVlWzFdPT0nTScpICYmIChlZVsyXT09J0EnKSAmJiAoZWVbM109PSdDJykpIHsKICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNoZWNrc3VtID0gMDsKICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPTA7IGk8MjE7IGkrKykKCQkJICAgICAgIGNoZWNrc3VtICs9IGVlW2ldOwogICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja3N1bSAhPSBlZVsyMV0pCgkJCSAgICAgICByZXR1cm47CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkxeDBfODQ4OwoJCSAgICAgICBmb3IgKGkgPSAxMjsgaSA8IDIxOyBpKyspCgkJCSAgICAgICBzZXJpYWwgKj0gMTAsIHNlcmlhbCArPSBlZVtpXSAtICcwJzsKICAgICAgICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKCSAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlOwogICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gNCoxNjsKCiAgICAgICAgICAgICAgIGZvcig7IG9mZnNldCA8IDgqMTY7IG9mZnNldCArPSAxNikgewogICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGNoZWNrc3VtID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJpZnkgdGhlIGNoZWNrc3VtICovCiAgICAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpPDE0OyBpKyspIGNoZWNrc3VtICs9IGVlW2krb2Zmc2V0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtID0gfmNoZWNrc3VtOyAgLyogbm8gaWRlYSB3aHkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKChjaGVja3N1bT4+OCkmMHgwRkYpID09IGVlW29mZnNldCsxNF0pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGVja3N1bSAmIDB4MEZGKSA9PSBlZVtvZmZzZXQrMTVdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IDgqMTYpCgkJICAgICAgIHJldHVybjsKCgkgICAgICAgLyogZm91bmQgYSB2YWxpZCBkZXNjcmlwdG9yICovCgkgICAgICAgdHlwZSA9IChlZVtvZmZzZXQrNF08PDgpIHwgKGVlW29mZnNldCs1XSk7CgoJICAgICAgIHN3aXRjaCh0eXBlKSB7CgoJICAgICAgIC8qIDg0OCBiYXNlZCAqLwoJICAgICAgIGNhc2UgMHgwMDA0OgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMXgwXzg0ODsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwMDU6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkxMDFfODQ4OwoJCSAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgIC8qIDg3OCBiYXNlZCAqLwoJICAgICAgIGNhc2UgMHgwMDEyOgoJICAgICAgIGNhc2UgMHgwMDEzOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMXgwOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxNDoKCSAgICAgICBjYXNlIDB4MDAxNToKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTF4MTsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwMTY6CgkgICAgICAgY2FzZSAweDAwMTc6CgkgICAgICAgY2FzZSAweDAwMjA6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkxeDFfU1ZJRDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwMTg6CgkgICAgICAgY2FzZSAweDAwMTk6CgkgICAgICAgY2FzZSAweDAwMUU6CgkgICAgICAgY2FzZSAweDAwMUY6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkyeHg7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDFBOgoJICAgICAgIGNhc2UgMHgwMDFCOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMngwX1NWSUQ7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDQwOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZNTAwOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDA1MDoKCSAgICAgICBjYXNlIDB4MDA1NjoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTU0MDsKCQkgICAgICAgLyogYnR0dl9vc3ByZXlfNTQwX2luaXQoYnR2KTsgKi8KCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwNjA6CgkgICAgICAgY2FzZSAweDAwNzA6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkyeDA7CgkJICAgICAgIC8qIGVuYWJsZSBvdXRwdXQgb24gc2VsZWN0IGNvbnRyb2wgbGluZXMgKi8KCQkgICAgICAgZ3Bpb19pbm91dCgweGZmZmZmZiwweDAwMDMwMyk7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGRlZmF1bHQ6CgkJICAgICAgIC8qIHVua25vd24uLi5sZWF2ZSBnZW5lcmljLCBidXQgZ2V0IHNlcmlhbCAjICovCgkJICAgICAgIGJyZWFrOwoJICAgICAgIH0KCSAgICAgICBzZXJpYWwgPSAgKGVlW29mZnNldCs2XSA8PCAyNCkKCQkgICAgICAgfCAoZWVbb2Zmc2V0KzddIDw8IDE2KQoJCSAgICAgICB8IChlZVtvZmZzZXQrOF0gPDwgIDgpCgkJICAgICAgIHwgKGVlW29mZnNldCs5XSk7CiAgICAgICB9CgogICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBvc3ByZXkgZWVwcm9tOiBjYXJkPSVkIG5hbWU9JXMgc2VyaWFsPSVsZFxuIiwKCSAgICAgIGJ0di0+Yy5uciwgYnR2LT5jLnR5cGUsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmFtZSxzZXJpYWwpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBBVmVybWVkaWEgc3BlY2lmaWMgc3R1ZmYsIGZyb20gIGJrdHJfY2FyZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RhdGljIGludCB0dW5lcl8wX3RhYmxlW10gPSB7CiAgICAgICAgVFVORVJfUEhJTElQU19OVFNDLCAgVFVORVJfUEhJTElQU19QQUwgLyogUEFMLUJHKi8sCiAgICAgICAgVFVORVJfUEhJTElQU19QQUwsICAgVFVORVJfUEhJTElQU19QQUwgLyogUEFMLUkqLywKICAgICAgICBUVU5FUl9QSElMSVBTX1BBTCwgICBUVU5FUl9QSElMSVBTX1BBTCwKICAgICAgICBUVU5FUl9QSElMSVBTX1NFQ0FNLCBUVU5FUl9QSElMSVBTX1NFQ0FNLAogICAgICAgIFRVTkVSX1BISUxJUFNfU0VDQU0sIFRVTkVSX1BISUxJUFNfUEFMLAoJVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMgfTsKCnN0YXRpYyBpbnQgdHVuZXJfMV90YWJsZVtdID0gewogICAgICAgIFRVTkVSX1RFTUlDX05UU0MsICBUVU5FUl9URU1JQ19QQUwsCglUVU5FUl9URU1JQ19QQUwsICAgVFVORVJfVEVNSUNfUEFMLAoJVFVORVJfVEVNSUNfUEFMLCAgIFRVTkVSX1RFTUlDX1BBTCwKICAgICAgICBUVU5FUl9URU1JQ180MDEyRlk1LCBUVU5FUl9URU1JQ180MDEyRlk1LCAvKiBUVU5FUl9URU1JQ19TRUNBTSAqLwogICAgICAgIFRVTkVSX1RFTUlDXzQwMTJGWTUsIFRVTkVSX1RFTUlDX1BBTH07CgpzdGF0aWMgdm9pZCBfX2RldmluaXQgYXZlcm1lZGlhX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQp7CiAgICAgICAgaW50IHR1bmVyX21ha2UsdHVuZXJfdHZfZm0sdHVuZXJfZm9ybWF0LHR1bmVyPTA7CgoJdHVuZXJfbWFrZSAgICAgID0gKGVlcHJvbV9kYXRhWzB4NDFdICYgMHg3KTsKICAgICAgICB0dW5lcl90dl9mbSAgICAgPSAoZWVwcm9tX2RhdGFbMHg0MV0gJiAweDE4KSA+PiAzOwogICAgICAgIHR1bmVyX2Zvcm1hdCAgICA9IChlZXByb21fZGF0YVsweDQyXSAmIDB4ZjApID4+IDQ7CglidHYtPmhhc19yZW1vdGUgPSAoZWVwcm9tX2RhdGFbMHg0Ml0gJiAweDAxKTsKCglpZiAodHVuZXJfbWFrZSA9PSAwIHx8IHR1bmVyX21ha2UgPT0gMikKCQlpZih0dW5lcl9mb3JtYXQgPD0weDBhKQoJCQl0dW5lciA9IHR1bmVyXzBfdGFibGVbdHVuZXJfZm9ybWF0XTsKCWlmICh0dW5lcl9tYWtlID09IDEpCgkJaWYodHVuZXJfZm9ybWF0IDw9OSkKCQkJdHVuZXIgPSB0dW5lcl8xX3RhYmxlW3R1bmVyX2Zvcm1hdF07CgoJaWYgKHR1bmVyX21ha2UgPT0gNCkKCQlpZih0dW5lcl9mb3JtYXQgPT0gMHgwOSkKCQkJdHVuZXIgPSBUVU5FUl9MR19OVFNDX05FV19UQVBDOyAvKiBUQVBDLUc3MDJQICovCgoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBBdmVybWVkaWEgZWVwcm9tWzB4JTAyeCUwMnhdOiB0dW5lcj0iLAoJCWJ0di0+Yy5ucixlZXByb21fZGF0YVsweDQxXSxlZXByb21fZGF0YVsweDQyXSk7CglpZih0dW5lcikgewoJCWJ0di0+dHVuZXJfdHlwZT10dW5lcjsKCQlwcmludGsoIiVkIix0dW5lcik7Cgl9IGVsc2UKCQlwcmludGsoIlVua25vd24gdHlwZSIpOwoJcHJpbnRrKCIgcmFkaW86JXMgcmVtb3RlIGNvbnRyb2w6JXNcbiIsCgkgICAgICAgdHVuZXJfdHZfZm0gICAgID8gInllcyIgOiAibm8iLAoJICAgICAgIGJ0di0+aGFzX3JlbW90ZSA/ICJ5ZXMiIDogIm5vIik7Cn0KCi8qIHVzZWQgb24gVm9vZG9vIFRWL0ZNIChWb29kb28gMjAwKSwgUzAgd2lyZWQgdG8gMHgxMDAwMCAqLwp2b2lkIGJ0dHZfdGRhOTg4MF9zZXRub3JtKHN0cnVjdCBidHR2ICpidHYsIGludCBub3JtKQp7CgkvKiBmaXggdXAgb3VyIGNhcmQgZW50cnkgKi8KCWlmKG5vcm09PVZJREVPX01PREVfTlRTQykgewoJCWJ0dHZfdHZjYXJkc1tCVFRWX0JPQVJEX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFswXT0weDk1N2ZmZjsKCQlidHR2X3R2Y2FyZHNbQlRUVl9CT0FSRF9WT09ET09UVl9GTV0uYXVkaW9tdXhbNF09MHg5NTdmZmY7CgkJZHByaW50aygiYnR0dl90ZGE5ODgwX3NldG5vcm0gdG8gTlRTQ1xuIik7Cgl9CgllbHNlIHsKCSAgICAgICAgYnR0dl90dmNhcmRzW0JUVFZfQk9BUkRfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzBdPTB4OTQ3ZmZmOwogICAgICAgICAgICAgICAgYnR0dl90dmNhcmRzW0JUVFZfQk9BUkRfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzRdPTB4OTQ3ZmZmOwoJCWRwcmludGsoImJ0dHZfdGRhOTg4MF9zZXRub3JtIHRvIFBBTFxuIik7Cgl9CgkvKiBzZXQgR1BJTyBhY2NvcmRpbmcgKi8KCWdwaW9fYml0cyhidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrLAoJCSAgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb211eFtidHYtPmF1ZGlvXSk7Cn0KCgovKgogKiByZXNldC9lbmFibGUgdGhlIE1TUCBvbiBzb21lIEhhdXBwYXVnZSBjYXJkcwogKiBUaGFua3MgdG8gS3nDtnN0aSBNw6Rsa2tpIChrbWFsa2tpQGNjLmh1dC5maSkhCiAqCiAqIEhhdXBwYXVnZTogIHBpbiAgNQogKiBWb29kb286ICAgICBwaW4gMjAKICovCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBib290X21zcDM0eHgoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHBpbikKewoJaW50IG1hc2sgPSAoMSA8PCBwaW4pOwoKCWdwaW9faW5vdXQobWFzayxtYXNrKTsKCWdwaW9fYml0cyhtYXNrLDApOwogICAgICAgIHVkZWxheSgyNTAwKTsKCWdwaW9fYml0cyhtYXNrLG1hc2spOwoKCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwibXNwMzR4eCIpOwoJaWYgKGJ0dHZfdmVyYm9zZSkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEhhdXBwYXVnZS9Wb29kb28gbXNwMzR4eDogcmVzZXQgbGluZSAiCgkJICAgICAgICJpbml0IFslZF1cbiIsIGJ0di0+Yy5uciwgcGluKTsKfQoKc3RhdGljIHZvaWQgX19kZXZpbml0IGJvb3RfYnQ4MzIoc3RydWN0IGJ0dHYgKmJ0dikKewp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgSW1hZ2VuYXRpb24gTC1Nb2RlbCBQWEMyMDAgRnJhbWVncmFiYmVyICovCi8qICBUaGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBwcm9jZWR1cmUgYXMKICogIHVzZWQgYnkgQWxlc3NhbmRybyBSdWJpbmkgaW4gaGlzIHB4YzIwMAogKiAgZHJpdmVyLCBidXQgdXNpbmcgQlRUViBmdW5jdGlvbnMgKi8KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X1BYQzIwMChzdHJ1Y3QgYnR0diAqYnR2KQp7CglzdGF0aWMgaW50IHZhbHNbXSBfX2RldmluaXRkYXRhID0geyAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBkLCAweDBkLAoJCQkJCSAgICAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAoJCQkJCSAgICAweDAwIH07Cgl1bnNpZ25lZCBpbnQgaTsKCWludCB0bXA7Cgl1MzIgdmFsOwoKCS8qIEluaXRpYWxpc2UgR1BJTy1jb25uZXZ0ZWQgc3R1ZmYgKi8KCWdwaW9faW5vdXQoMHhmZmZmZmYsICgxPDwxMykpOwoJZ3Bpb193cml0ZSgwKTsKCXVkZWxheSgzKTsKCWdwaW9fd3JpdGUoMTw8MTMpOwoJLyogR1BJTyBpbnB1dHMgYXJlIHB1bGxlZCB1cCwgc28gbm8gbmVlZCB0byBkcml2ZQoJICogcmVzZXQgcGluIGFueSBsb25nZXIgKi8KCWdwaW9fYml0cygweGZmZmZmZiwgMCk7CglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInB4YzIwMCIpOwoKCS8qICB3ZSBjb3VsZC9zaG91bGQgdHJ5IGFuZCByZXNldC9jb250cm9sIHRoZSBBRCBwb3RzPyBidXQKCSAgICByaWdodCBub3cgIHdlIHNpbXBseSAgdHVybmVkIG9mZiB0aGUgY3J1c2hpbmcuICBXaXRob3V0CgkgICAgdGhpcyB0aGUgQUdDIGRyaWZ0cyBkcmlmdHMKCSAgICByZW1lbWJlciB0aGUgRU4gaXMgcmV2ZXJzZSBsb2dpYyAtLT4KCSAgICBzZXR0aW5nIEJUODQ4X0FEQ19BR0NfRU4gZGlzYWJsZSB0aGUgQUdDCgkgICAgdGJvdWx0QGVlY3MubGVoaWdoLmVkdQoJKi8KCglidHdyaXRlKEJUODQ4X0FEQ19SRVNFUlZFRHxCVDg0OF9BRENfQUdDX0VOLCBCVDg0OF9BREMpOwoKCS8qCUluaXRpYWxpc2UgTUFYNTE3IERBQyAqLwoJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyBEQUMgcmVmZXJlbmNlIHZvbHRhZ2UgbGV2ZWwgLi4uXG4iKTsKCWJ0dHZfSTJDV3JpdGUoYnR2LDB4NUUsMCwweDgwLDEpOwoKCS8qCUluaXRpYWxpc2UgMTJDNTA4IFBJQyAqLwoJLyoJVGhlIEkyQ1dyaXRlIGFuZCBJMkNSZWFkIGNvbW1tYW5kcyBhcmUgYWN0dWFsbHkgdG8gdGhlCgkgKglzYW1lIGNoaXBzIC0gYnV0IHRoZSBSL1cgYml0IGlzIGluY2x1ZGVkIGluIHRoZSBhZGRyZXNzCgkgKglhcmd1bWVudCBzbyB0aGUgbnVtYmVycyBhcmUgZGlmZmVyZW50ICovCgoKCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpc2luZyAxMkM1MDggUElDIGNoaXAgLi4uXG4iKTsKCgkvKiBGaXJzdCBvZiBhbGwsIGVuYWJsZSB0aGUgY2xvY2sgbGluZS4gVGhpcyBpcyB1c2VkIGluIHRoZSBQWEMyMDAtRiAqLwoJdmFsID0gYnRyZWFkKEJUODQ4X0dQSU9fRE1BX0NUTCk7Cgl2YWwgfD0gQlQ4NDhfR1BJT19ETUFfQ1RMX0dQQ0xLTU9ERTsKCWJ0d3JpdGUodmFsLCBCVDg0OF9HUElPX0RNQV9DVEwpOwoKCS8qIFRoZW4sIHB1c2ggdG8gMCB0aGUgcmVzZXQgcGluIGxvbmcgZW5vdWdoIHRvIHJlc2V0IHRoZSAqCgkgKiBkZXZpY2Ugc2FtZSBhcyBhYm92ZSBmb3IgdGhlIHJlc2V0IGxpbmUsIGJ1dCBub3QgdGhlIHNhbWUKCSAqIHZhbHVlIHNlbnQgdG8gdGhlIEdQSU8tY29ubmVjdGVkIHN0dWZmCgkgKiB3aGljaCBvbmUgaXMgdGhlIGdvb2Qgb25lPyAqLwoJZ3Bpb19pbm91dCgweGZmZmZmZiwoMTw8MikpOwoJZ3Bpb193cml0ZSgwKTsKCXVkZWxheSgxMCk7CglncGlvX3dyaXRlKDE8PDIpOwoKICAgICAgIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2YWxzKTsgaSsrKSB7CgkJdG1wPWJ0dHZfSTJDV3JpdGUoYnR2LDB4MUUsMCx2YWxzW2ldLDEpOwoJCWlmICh0bXAgIT0gLTEpIHsKCQkJcHJpbnRrKEtFUk5fSU5GTwoJCQkgICAgICAgIkkyQyBXcml0ZSglMi4yeCkgPSAlaVxuSTJDIFJlYWQgKCkgPSAlMi4yeFxuXG4iLAoJCQkgICAgICAgdmFsc1tpXSx0bXAsYnR0dl9JMkNSZWFkKGJ0diwweDFGLE5VTEwpKTsKCQl9Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAiUFhDMjAwIEluaXRpYWxpc2VkLlxuIik7Cn0KCgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyoKICogIFRoZSBBZGxpbmsgUlRWLTI0IChha2EgQW5nZWxvKSBoYXMgc29tZSBzcGVjaWFsIGluaXRpYWxpc2F0aW9uIHRvIHVubG9jawogKiAgaXQuIFRoaXMgYXBwYXJlbnRseSBpbnZvbHZlcyB0aGUgZm9sbG93aW5nIHByb2NlZHVyZSBmb3IgZWFjaCA4NzggY2hpcDoKICoKICogIDEpIHdyaXRlIDB4MDBDM0ZFRkYgdG8gdGhlIEdQSU9fT1VUX0VOIHJlZ2lzdGVyCiAqCiAqICAyKSAgd3JpdGUgdG8gR1BJT19EQVRBCiAqICAgICAgLSAweDBFCiAqICAgICAgLSBzbGVlcCAxbXMKICogICAgICAtIDB4MTAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxMG1zCiAqICAgICAgLSAweDBFCiAqICAgICByZWFkIGZyb20gR1BJT19EQVRBIGludG8gYnVmICh1aW50XzMyKQogKiAgICAgIC0gaWYgKCBkYXRhPj4xOCAmIDB4MDEgIT0gMCkgfHwgKCBidWY+PjE5ICYgMHgwMSAhPSAxICkKICogICAgICAgICAgICAgICAgIGVycm9yLiBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCBzdG9wLgogKgogKiAgMykgd3JpdGUgdG8gR1BJT19EQVRBCiAqICAgICAgLSB3cml0ZSAweDQ0MDAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxMG1zCiAqICAgICAgLSB3cml0ZSAweDQ0MTAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxbXMKICogICAgICAtIHdyaXRlIDB4MEUKICogICAgIHJlYWQgZnJvbSBHUElPX0RBVEEgaW50byBidWYgKHVpbnRfMzIpCiAqICAgICAgLSBpZiAoIGJ1Zj4+MTggJiAweDAxICkgfHwgKCBidWY+PjE5ICYmIDB4MDEgIT0gMCApCiAqICAgICAgICAgICAgICAgIGVycm9yLiBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZC4KICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnZvaWQKaW5pdF9SVFYyNCAoc3RydWN0IGJ0dHYgKmJ0dikKewoJdWludDMyX3QgZGF0YVJlYWQgPSAwOwoJbG9uZyB3YXRjaGRvZ192YWx1ZSA9IDB4MEU7CgoJcHJpbnRrIChLRVJOX0lORk8KCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uIGluIHByb2dyZXNzIC4uLlxuIiwKCQlidHYtPmMubnIpOwoKCWJ0d3JpdGUgKDB4MDBjM2ZlZmYsIEJUODQ4X0dQSU9fT1VUX0VOKTsKCglidHdyaXRlICgwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7Cgltc2xlZXAgKDEpOwoJYnR3cml0ZSAoMHgxMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoJbXNsZWVwICgxMCk7CglidHdyaXRlICgwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7CgoJZGF0YVJlYWQgPSBidHJlYWQgKEJUODQ4X0dQSU9fREFUQSk7CgoJaWYgKCgoKGRhdGFSZWFkID4+IDE4KSAmIDB4MDEpICE9IDApIHx8ICgoKGRhdGFSZWFkID4+IDE5KSAmIDB4MDEpICE9IDEpKSB7CgkJcHJpbnRrIChLRVJOX0lORk8KCQkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbigxKSBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCAocmVhZCAlZClcbiIsCgkJCWJ0di0+Yy5uciwgZGF0YVJlYWQpOwoJfQoKCWJ0d3JpdGUgKDB4NDQwMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoJbXNsZWVwICgxMCk7CglidHdyaXRlICgweDQ0MTAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMSk7CglidHdyaXRlICh3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMSk7CglkYXRhUmVhZCA9IGJ0cmVhZCAoQlQ4NDhfR1BJT19EQVRBKTsKCglpZiAoKCgoZGF0YVJlYWQgPj4gMTgpICYgMHgwMSkgIT0gMCkgfHwgKCgoZGF0YVJlYWQgPj4gMTkpICYgMHgwMSkgIT0gMCkpIHsKCQlwcmludGsgKEtFUk5fSU5GTwoJCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uKDIpIEVSUk9SX0NQTERfQ2hlY2tfRmFpbGVkIChyZWFkICVkKVxuIiwKCQkJYnR2LT5jLm5yLCBkYXRhUmVhZCk7CgoJCXJldHVybjsKCX0KCglwcmludGsgKEtFUk5fSU5GTwoJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24gY29tcGxldGUuXG4iLCBidHYtPmMubnIpOwp9CgoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIE1pcm8gUHJvIHJhZGlvIHN0dWZmIC0tIHRoZSB0ZWE1NzU3IGlzIGNvbm5lY3RlZCB0byBzb21lIEdQSU8gcG9ydHMgICAgICovCi8qCiAqIENvcHlyaWdodCAoYykgMTk5OSBDc2FiYSBIYWxhc3ogPHFnZWhhbGlAdW5pLW1pc2tvbGMuaHU+CiAqIFRoaXMgY29kZSBpcyBwbGFjZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKgogKiBCcnV0YWxseSBoYWNrZWQgYnkgRGFuIFNoZXJpZGFuIDxkYW4uc2hlcmlkYW5AY29udGFjdC5vcmcudWs+IGRqczUyIDgvMy8wMAogKi8KCnN0YXRpYyB2b2lkIGJ1c19sb3coc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7Cgl9CgoJZ3Bpb19iaXRzKGJpdCwwKTsKCXVkZWxheSg1KTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KfQoKc3RhdGljIHZvaWQgYnVzX2hpZ2goc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7Cgl9CgoJZ3Bpb19iaXRzKGJpdCxiaXQpOwoJdWRlbGF5KDUpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwgMCk7CgkJdWRlbGF5KDUpOwoJfQp9CgpzdGF0aWMgaW50IGJ1c19pbihzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgYml0KQp7CglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwgMCk7CgkJdWRlbGF5KDUpOwoJfQoJcmV0dXJuIGdwaW9fcmVhZCgpICYgKGJpdCk7Cn0KCi8qIFRFQTU3NTcgcmVnaXN0ZXIgYml0cyAqLwojZGVmaW5lIFRFQV9GUkVRCQkwOjE0CiNkZWZpbmUgVEVBX0JVRkZFUgkJMTU6MTUKCiNkZWZpbmUgVEVBX1NJR05BTF9TVFJFTkdUSAkxNjoxNwoKI2RlZmluZSBURUFfUE9SVDEJCTE4OjE4CiNkZWZpbmUgVEVBX1BPUlQwCQkxOToxOQoKI2RlZmluZSBURUFfQkFORAkJMjA6MjEKI2RlZmluZSBURUFfQkFORF9GTQkJMAojZGVmaW5lIFRFQV9CQU5EX01XCQkxCiNkZWZpbmUgVEVBX0JBTkRfTFcJCTIKI2RlZmluZSBURUFfQkFORF9TVwkJMwoKI2RlZmluZSBURUFfTU9OTwkJMjI6MjIKI2RlZmluZSBURUFfQUxMT1dfU1RFUkVPCTAKI2RlZmluZSBURUFfRk9SQ0VfTU9OTwkJMQoKI2RlZmluZSBURUFfU0VBUkNIX0RJUkVDVElPTgkyMzoyMwojZGVmaW5lIFRFQV9TRUFSQ0hfRE9XTgkJMAojZGVmaW5lIFRFQV9TRUFSQ0hfVVAJCTEKCiNkZWZpbmUgVEVBX1NUQVRVUwkJMjQ6MjQKI2RlZmluZSBURUFfU1RBVFVTX1RVTkVECTAKI2RlZmluZSBURUFfU1RBVFVTX1NFQVJDSElORwkxCgovKiBMb3ctbGV2ZWwgc3R1ZmYgKi8Kc3RhdGljIGludCB0ZWE1NzU3X3JlYWQoc3RydWN0IGJ0dHYgKmJ0dikKewoJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwoJaW50IHZhbHVlID0gMDsKCWludCBpOwoKCS8qIGJldHRlciBzYWZlIHRoYW4gc29ycnkgKi8KCWdwaW9faW5vdXQoYnR2LT5tYm94X21hc2ssIGJ0di0+bWJveF9jbGsgfCBidHYtPm1ib3hfd2UpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVhNTc1NyByZWFkIik7CgoJYnVzX2xvdyhidHYsYnR2LT5tYm94X3dlKTsKCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoKCXVkZWxheSgxMCk7Cgl0aW1lb3V0PSBqaWZmaWVzICsgSFo7CgoJLyogd2FpdCBmb3IgREFUQSBsaW5lIHRvIGdvIGxvdzsgZXJyb3IgaWYgaXQgZG9lc24ndCAqLwoJd2hpbGUgKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQoJCXNjaGVkdWxlKCk7CglpZiAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHRlYTU3NTc6IHJlYWQgdGltZW91dFxuIixidHYtPmMubnIpOwoJCXJldHVybiAtMTsKCX0KCglkcHJpbnRrKCJidHR2JWQ6IHRlYTU3NTc6IixidHYtPmMubnIpOwoJZm9yKGkgPSAwOyBpIDwgMjQ7IGkrKykKCXsKCQl1ZGVsYXkoNSk7CgkJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF9jbGspOwoJCXVkZWxheSg1KTsKCQlkcHJpbnRrKCIlYyIsKGJ1c19pbihidHYsYnR2LT5tYm94X21vc3QpID09IDApPydUJzonLScpOwoJCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJCXZhbHVlIDw8PSAxOwoJCXZhbHVlIHw9IChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSA9PSAwKT8wOjE7ICAvKiBNU0IgZmlyc3QgKi8KCQlkcHJpbnRrKCIlYyIsIChidXNfaW4oYnR2LGJ0di0+bWJveF9tb3N0KSA9PSAwKT8nUyc6J00nKTsKCX0KCWRwcmludGsoIlxuYnR0diVkOiB0ZWE1NzU3OiByZWFkIDB4JVhcbiIsIGJ0di0+Yy5uciwgdmFsdWUpOwoJcmV0dXJuIHZhbHVlOwp9CgpzdGF0aWMgaW50IHRlYTU3NTdfd3JpdGUoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHZhbHVlKQp7CglpbnQgaTsKCWludCByZWcgPSB2YWx1ZTsKCglncGlvX2lub3V0KGJ0di0+bWJveF9tYXNrLCBidHYtPm1ib3hfY2xrIHwgYnR2LT5tYm94X3dlIHwgYnR2LT5tYm94X2RhdGEpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoJaWYgKGJ0dHZfZ3BpbykKCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ0ZWE1NzU3IHdyaXRlIik7CgoJZHByaW50aygiYnR0diVkOiB0ZWE1NzU3OiB3cml0ZSAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF93ZSk7Cglmb3IoaSA9IDA7IGkgPCAyNTsgaSsrKQoJewoJCWlmIChyZWcgJiAweDEwMDAwMDApCgkJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfZGF0YSk7CgkJZWxzZQoJCQlidXNfbG93KGJ0dixidHYtPm1ib3hfZGF0YSk7CgkJcmVnIDw8PSAxOwoJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoMTApOwoJCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJCXVkZWxheSgxMCk7Cgl9CglidXNfbG93KGJ0dixidHYtPm1ib3hfd2UpOyAgLyogdW5tdXRlICEhISAqLwoJcmV0dXJuIDA7Cn0KCnZvaWQgdGVhNTc1N19zZXRfZnJlcShzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBzaG9ydCBmcmVxKQp7CglkcHJpbnRrKCJ0ZWE1NzU3X3NldF9mcmVxICVkXG4iLGZyZXEpOwoJdGVhNTc1N193cml0ZShidHYsIDUgKiBmcmVxICsgMHgzNTgpOyAvKiBhZGQgMTAuN01IeiAoc2VlIGRvY3MpICovCn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiB3aW52aWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKdm9pZCB3aW52aWV3X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJLyogUFQyMjU0QSBwcm9ncmFtbWluZyBKb24gVG9tYnMsIGpvbkBndGUuZXNpLnVzLmVzICovCglpbnQgYml0c19vdXQsIGxvb3BzLCB2b2wsIGRhdGE7CgoJaWYgKCFzZXQpIHsKCQkvKiBGaXhlZCBieSBMZWFuZHJvIEx1Y2FyZWxsYSA8bHVjYUBsaW51eG1lbmRvemEub3JnLmFyICgwNy8zMS8wMSkgKi8KCQl2LT5mbGFncyB8PSBWSURFT19BVURJT19WT0xVTUU7CgkJcmV0dXJuOwoJfQoKCS8qIDMyIGxldmVscyBsb2dhcml0aG1pYyAqLwoJdm9sID0gMzIgLSAoKHYtPnZvbHVtZT4+MTEpKTsKCS8qIHVuaXRzICovCgliaXRzX291dCA9IChQVDIyNTRfREJTX0lOXzI+Pih2b2wlNSkpOwoJLyogdGVucyAqLwoJYml0c19vdXQgfD0gKFBUMjI1NF9EQlNfSU5fMTA+Pih2b2wvNSkpOwoJYml0c19vdXQgfD0gUFQyMjU0X0xfQ0hBTk5FTCB8IFBUMjI1NF9SX0NIQU5ORUw7CglkYXRhID0gZ3Bpb19yZWFkKCk7CglkYXRhICY9IH4oV0lOVklFV19QVDIyNTRfQ0xLfCBXSU5WSUVXX1BUMjI1NF9EQVRBfAoJCSAgV0lOVklFV19QVDIyNTRfU1RST0JFKTsKCWZvciAobG9vcHMgPSAxNzsgbG9vcHMgPj0gMCA7IGxvb3BzLS0pIHsKCQlpZiAoYml0c19vdXQgJiAoMTw8bG9vcHMpKQoJCQlkYXRhIHw9ICBXSU5WSUVXX1BUMjI1NF9EQVRBOwoJCWVsc2UKCQkJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfREFUQTsKCQlncGlvX3dyaXRlKGRhdGEpOwoJCXVkZWxheSg1KTsKCQlkYXRhIHw9IFdJTlZJRVdfUFQyMjU0X0NMSzsKCQlncGlvX3dyaXRlKGRhdGEpOwoJCXVkZWxheSg1KTsKCQlkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9DTEs7CgkJZ3Bpb193cml0ZShkYXRhKTsKCX0KCWRhdGEgfD0gIFdJTlZJRVdfUFQyMjU0X1NUUk9CRTsKCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X0RBVEE7CglncGlvX3dyaXRlKGRhdGEpOwoJdWRlbGF5KDEwKTsKCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X1NUUk9CRTsKCWdwaW9fd3JpdGUoZGF0YSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIG1vbm8vc3RlcmVvIGNvbnRyb2wgZm9yIHZhcmlvdXMgY2FyZHMgKHdoaWNoIGRvbid0IHVzZSBpMmMgY2hpcHMgYnV0ICAgICovCi8qIGNvbm5lY3Qgc29tZXRoaW5nIHRvIHRoZSBHUElPIHBpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgdm9pZApndmJjdHYzcGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IGNvbiA9IDA7CgoJaWYgKHNldCkgewoJCWdwaW9faW5vdXQoMHgzMDAsIDB4MzAwKTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQoJCQljb24gPSAweDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQoJCQljb24gPSAweDMwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKCQkJY29uID0gMHgyMDA7Ci8qCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCiAqCQkJY29uID0gMHgxMDA7ICovCgkJZ3Bpb19iaXRzKDB4MzAwLCBjb24pOwoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfU1RFUkVPIHwKCQkJICBWSURFT19TT1VORF9MQU5HMSAgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKc3RhdGljIHZvaWQKZ3ZiY3R2NXBjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCB2YWwsIGNvbjsKCglpZiAoYnR2LT5yYWRpb191c2VyKQoJCXJldHVybjsKCgl2YWwgPSBncGlvX3JlYWQoKTsKCWlmIChzZXQpIHsKCQljb24gPSAweDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSB7CgkJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpIHsKCQkJCS8qIExBTkcxICsgTEFORzIgKi8KCQkJCWNvbiA9IDB4MTAwOwoJCQl9CgkJCWVsc2UgewoJCQkJLyogTEFORzIgKi8KCQkJCWNvbiA9IDB4MzAwOwoJCQl9CgkJfQoJCWlmIChjb24gIT0gKHZhbCAmIDB4MzAwKSkgewoJCQlncGlvX2JpdHMoMHgzMDAsIGNvbik7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJndmJjdHY1cGNpIik7CgkJfQoJfSBlbHNlIHsKCQlzd2l0Y2ggKHZhbCAmIDB4NzApIHsKCQkgIGNhc2UgMHgxMDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJCWJyZWFrOwoJCSAgY2FzZSAweDMwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTEFORzI7CgkJCWJyZWFrOwoJCSAgY2FzZSAweDUwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTEFORzE7CgkJCWJyZWFrOwoJCSAgY2FzZSAweDYwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfU1RFUkVPOwoJCQlicmVhazsKCQkgIGNhc2UgMHg3MDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk87CgkJCWJyZWFrOwoJCSAgZGVmYXVsdDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkJICBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJCX0KCX0KfQoKLyoKICogTWFyaW8gTWVkaW5hIE51c3NiYXVtIDxtZWRpc29mdEBhbG9oYWJicy5vcmcubXg+CiAqICBJIGRpc2NvdmVyIHRoYXQgb24gQlQ4NDhfR1BJT19EQVRBIGFkZHJlc3MgYSBieXRlIDB4Y2NlIGVuYWJsZSBzdGVyZW8sCiAqICAweGRkZSBlbmFibGVzIG1vbm8gYW5kIDB4Y2NkIGVuYWJsZXMgc2FwCiAqCiAqIFBldHIgVmFuZHJvdmVjIDxWQU5EUk9WRUB2Yy5jdnV0LmN6PgogKiAgUC5TLjogQXQgbGVhc3QgbWFzayBpbiBsaW5lIGFib3ZlIGlzIHdyb25nIC0gR1BJTyBwaW5zIDMsMiBzZWxlY3QKICogIGlucHV0L291dHB1dCBzb3VuZCBjb25uZWN0aW9uLCBzbyBib3RoIG11c3QgYmUgc2V0IGZvciBvdXRwdXQgbW9kZS4KICoKICogTG9va3MgbGlrZSBpdCdzIG5lZWRlZCBvbmx5IGZvciB0aGUgInR2cGhvbmUiLCB0aGUgInR2cGhvbmUgOTgiCiAqIGhhbmRsZXMgdGhpcyB3aXRoIGEgdGRhOTg0MAogKgogKi8Kc3RhdGljIHZvaWQKYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CglpbnQgdmFsID0gMDsKCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgICAvKiBTQVAgKi8KCQkJdmFsID0gMHgwMjsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKCQkJdmFsID0gMHgwMTsKCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDAzLHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJhdmVybWVkaWEiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzE7CgkJcmV0dXJuOwoJfQp9CgpzdGF0aWMgdm9pZAphdmVybWVkaWFfdHZfc3RlcmVvX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJaW50IHZhbCA9IDA7CgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpICAgLyogU0FQICovCgkJCXZhbCA9IDB4MDE7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pICAvKiBTVEVSRU8gKi8KCQkJdmFsID0gMHgwMjsKCQlidGFvcih2YWwsIH4weDAzLCBCVDg0OF9HUElPX0RBVEEpOwoJCWlmIChidHR2X2dwaW8pCgkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImF2ZXJtZWRpYSIpOwoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJcmV0dXJuOwoJfQp9CgovKiBMaWZldGVjIDk0MTUgaGFuZGxpbmcgKi8Kc3RhdGljIHZvaWQKbHQ5NDE1X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewogICAgICAgIGludCB2YWwgPSAwOwoKICAgICAgICBpZiAoZ3Bpb19yZWFkKCkgJiAweDQwMDApIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKCQlyZXR1cm47Cgl9CgogICAgICAgIGlmIChzZXQpIHsKICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpICAvKiBBMiBTQVAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMHgwMDgwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSAvKiBBMiBzdGVyZW8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMHgwODgwOwogICAgICAgICAgICAgICAgaWYgKCh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpIHx8CgkJICAgICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykpCgkJCXZhbCA9IDA7CgkJZ3Bpb19iaXRzKDB4MDg4MCwgdmFsKTsKICAgICAgICAgICAgICAgIGlmIChidHR2X2dwaW8pCiAgICAgICAgICAgICAgICAgICAgICAgIGJ0dHZfZ3Bpb190cmFja2luZyhidHYsImx0OTQxNSIpOwogICAgICAgIH0gZWxzZSB7CgkJLyogYXV0b2RldGVjdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGlzIGNhcmQgOi0oICovCiAgICAgICAgICAgICAgICB2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQp9CgovKiBUREE5ODIxIG9uIFRlcnJhVFYrIEJ0ODQ4LCBCdDg3OCAqLwpzdGF0aWMgdm9pZAp0ZXJyYXR2X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IGNvbiA9IDA7CgoJaWYgKHNldCkgewoJCWdwaW9faW5vdXQoMHgxODAwMDAsMHgxODAwMDApOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCgkJCWNvbiA9IDB4MDgwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQljb24gPSAweDE4MDAwMDsKCQlncGlvX2JpdHMoMHgxODAwMDAsIGNvbik7CgkJaWYgKGJ0dHZfZ3BpbykKCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVycmF0diIpOwoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCnN0YXRpYyB2b2lkCndpbmZhc3QyMDAwX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgbG9uZyB2YWwgPSAwOwoKCWlmIChzZXQpIHsKCQkvKmJ0b3IgKDB4YzMyMDAwLCBCVDg0OF9HUElPX09VVF9FTik7Ki8KCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCQkvKiBNb25vICovCgkJCXZhbCA9IDB4NDIwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCS8qIE1vbm8gKi8KCQkJdmFsID0gMHg0MjAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikJLyogU0FQICovCgkJCXZhbCA9IDB4NDEwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQkvKiBTdGVyZW8gKi8KCQkJdmFsID0gMHgwMjAwMDA7CgkJaWYgKHZhbCkgewoJCQlncGlvX2JpdHMoMHg0MzAwMDAsIHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ3aW5mYXN0MjAwMCIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIERhcml1c3ogS293YWxld3NraSA8ZGFyZWtrQGF1dG9tZXgucGw+CiAqIHNvdW5kIGNvbnRyb2wgZm9yIFByb2xpbmsgUFYtQlQ4NzhQKzlCIChQaXhlbFZpZXcgUGxheVRWIFBybyBGTStOSUNBTQogKiByZXZpc2lvbiA5QiBoYXMgb24tYm9hcmQgVERBOTg3NEEgc291bmQgZGVjb2RlcikuCiAqCiAqIE5vdGU6IFRoZXJlIGFyZSBjYXJkIHZhcmlhbnRzIHdpdGhvdXQgdGRhOTg3NGEuIEZvcmNpbmcgdGhlICJzdGVyZW8gc291bmQgcm91dGUiCiAqICAgICAgIHdpbGwgbXV0ZSB0aGlzIGNhcmRzLgogKi8Kc3RhdGljIHZvaWQKcHZidDg3OHA5Yl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCB2YWwgPSAwOwoKCWlmIChidHYtPnJhZGlvX3VzZXIpCgkJcmV0dXJuOwoKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCXsKCQkJdmFsID0gMHgwMTsKCQl9CgkJaWYgKCh2LT5tb2RlICYgKFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzIpKQoJCSAgICB8fCAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykpIHsKCQkJdmFsID0gMHgwMjsKCQl9CgkJaWYgKHZhbCkgewoJCQlncGlvX2JpdHMoMHgwMyx2YWwpOwoJCQlpZiAoYnR0dl9ncGlvKQoJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwicHZidDg3OHA5YiIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJfQp9CgovKgogKiBEYXJpdXN6IEtvd2FsZXdza2kgPGRhcmVra0BhdXRvbWV4LnBsPgogKiBzb3VuZCBjb250cm9sIGZvciBGbHlWaWRlbyAyMDAwUyAod2l0aCB0ZGE5ODc0IGRlY29kZXIpCiAqIGJhc2VkIG9uIHB2YnQ4NzhwOWJfYXVkaW8oKSAtIHRoaXMgaXMgbm90IHRlc3RlZCwgcGxlYXNlIGZpeCEhIQogKi8Kc3RhdGljIHZvaWQKZnYyMDAwc19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCB2YWwgPSAweGZmZmY7CgoJaWYgKGJ0di0+cmFkaW9fdXNlcikKCQlyZXR1cm47CglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQl7CgkJCXZhbCA9IDB4MDAwMDsKCQl9CgkJaWYgKCh2LT5tb2RlICYgKFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzIpKQoJCSAgICB8fCAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykpIHsKCQkJdmFsID0gMHgxMDgwOyAvKi1kay0/Pz86IDB4MDg4MCwgMHgwMDgwLCAweDE4MDAgLi4uICovCgkJfQoJCWlmICh2YWwgIT0gMHhmZmZmKSB7CgkJCWdwaW9fYml0cygweDE4MDAsIHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJmdjIwMDBzIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIHNvdW5kIGNvbnRyb2wgZm9yIENhbm9wdXMgV2luRFZSIFBDSQogKiBNYXNha2kgU3V6dWtpIDxtYXNha2lAYnRyZWUub3JnPgogKi8Kc3RhdGljIHZvaWQKd2luZHZyX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewogICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsID0gMDsKCiAgICAgICAgaWYgKHNldCkgewogICAgICAgICAgICAgICAgaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDA0MDAwMDsKICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDA7CiAgICAgICAgICAgICAgICBpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweDEwMDAwMDsKICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOwogICAgICAgICAgICAgICAgaWYgKHZhbCkgewoJCQlncGlvX2JpdHMoMHgxNDAwMDAsIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidHR2X2dwaW8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwid2luZHZyIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwogICAgICAgIH0KfQoKLyoKICogc291bmQgY29udHJvbCBmb3IgQUQtVFZLNTAzCiAqIEhpcm9zaGkgVGFrZWthd2EgPHNpYW5AYmlnLm9yLmpwPgogKi8Kc3RhdGljIHZvaWQKYWR0dms1MDNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgY29uID0gMHhmZmZmZmY7CgoJLyogYnRhb3IoMHgxZTAwMDAsIH4weDFlMDAwMCwgQlQ4NDhfR1BJT19PVVRfRU4pOyAqLwoKCWlmIChzZXQpIHsKCQkvKiBidG9yKCoqKiwgQlQ4NDhfR1BJT19PVVRfRU4pOyAqLwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCgkJCWNvbiA9IDB4MDAwMDAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKCQkJY29uID0gMHgwMDE4MDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKCQkJY29uID0gMHgwMDAwMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCgkJCWNvbiA9IDB4MDAwNjAwMDA7CgkJaWYgKGNvbiAhPSAweGZmZmZmZikgewoJCQlncGlvX2JpdHMoMHgxZTAwMDAsY29uKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsICJhZHR2azUwMyIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkgIFZJREVPX1NPVU5EX0xBTkcxICB8IFZJREVPX1NPVU5EX0xBTkcyOwoJfQp9CgovKiBSZW1vdGVWaXNpb24gTVggKHJ2NjA1KSBtdXhzZWwgaGVscGVyIFtNaWd1ZWwgRnJlaXRhc10KICoKICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBydjYwNSBkb24ndCB1c2UgYSBub3JtYWwgbXVsdGlwbGV4LCBidXQgYSBjcm9zc3BvaW50CiAqIHN3aXRjaCBpbnN0ZWFkIChDRDIyTTM0OTRFKS4gVGhpcyBJQyBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgY29ubmVjdGlvbnMKICogYmV0d2VlbiBYbiAoaW5wdXQpIGFuZCBZbiAob3V0cHV0KSBwaW5zLiBXZSBuZWVkIHRvIGNsZWFyIGFueSBleGlzdGluZwogKiBjb25uZWN0aW9uIHByaW9yIHRvIGVzdGFibGlzaCBhIG5ldyBvbmUsIHB1bHNpbmcgdGhlIFNUUk9CRSBwaW4uCiAqCiAqIFRoZSBib2FyZCBoYXJkd2lyZSBZMCAoeHBvaW50KSB0byBNVVgxIGFuZCBNVVhPVVQgdG8gWWluLgogKiBHUElPIHBpbnMgYXJlIHdpcmVkIGFzOgogKiAgR1BJT1swOjNdIC0gQVhbMDozXSAoeHBvaW50KSAtIFAxWzA6M10gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJT1s0OjZdIC0gQVlbMDoyXSAoeHBvaW50KSAtIFAxWzQ6Nl0gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJT1s3XSAgIC0gREFUQSAoeHBvaW50KSAgICAtIFAxWzddIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bOF0gICAtICAgICAgICAgICAgICAgICAgLSBQM1s1XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzldICAgLSBSRVNFVCAoeHBvaW50KSAgIC0gUDNbNl0gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJT1sxMF0gIC0gU1RST0JFICh4cG9pbnQpICAtIFAzWzddIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU5UUiAgICAtICAgICAgICAgICAgICAgICAgLSBQM1s0XSAobWljcm9jb250cm9sZXIpCiAqCiAqIFRoZSBtaWNyb2NvbnRyb2xlciBpcyBhIDgwQzMyIGxpa2UuIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBjaGFuZ2UgeHBvaW50CiAqIGNvbmZpZ3VyYXRpb24gZWl0aGVyIGRpcmVjdGx5IChhcyB3ZSBhcmUgZG9pbmcpIG9yIHVzaW5nIHRoZSBtaWNyb2NvbnRyb2xlcgogKiB3aGljaCBpcyBhbHNvIHdpcmVkIHRvIEkyQyBpbnRlcmZhY2UuIEkgaGF2ZSBubyBmdXJ0aGVyIGluZm8gb24gdGhlCiAqIG1pY3JvY29udHJvbGVyIGZlYXR1cmVzLCBvbmUgd291bGQgbmVlZCB0byBkaXNhc3NlbWJseSB0aGUgZmlybXdhcmUuCiAqIG5vdGU6IHRoZSB2ZW5kb3IgcmVmdXNlZCB0byBnaXZlIGFueSBpbmZvcm1hdGlvbiBvbiB0aGlzIHByb2R1Y3QsIGFsbAogKiAgICAgICB0aGF0IHN0dWZmIHdhcyBmb3VuZCB1c2luZyBhIG11bHRpbWV0ZXIhIDopCiAqLwpzdGF0aWMgdm9pZCBydjYwNV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CgkvKiByZXNldCBhbGwgY29uZWN0aW9ucyAqLwoJZ3Bpb19iaXRzKDB4MjAwLDB4MjAwKTsKCW1kZWxheSgxKTsKCWdwaW9fYml0cygweDIwMCwweDAwMCk7CgltZGVsYXkoMSk7CgoJLyogY3JlYXRlIGEgbmV3IGNvbmVjdGlvbiAqLwoJZ3Bpb19iaXRzKDB4NDgwLDB4MDgwKTsKCWdwaW9fYml0cygweDQ4MCwweDQ4MCk7CgltZGVsYXkoMSk7CglncGlvX2JpdHMoMHg0ODAsMHgwODApOwoJbWRlbGF5KDEpOwp9CgovKiBUaWJldCBTeXN0ZW1zICdQcm9ncmVzcyBEVlInIENTMTYgbXV4c2VsIGhlbHBlciBbQ2hyaXMgRmFubmluZ10KICoKICogVGhlIENTMTYgKGF2YWlsYWJsZSBvbiBlQmF5IGNoZWFwKSBpcyBhIFBDSSBib2FyZCB3aXRoIGZvdXIgRnVzaW9uCiAqIDg3OEEgY2hpcHMsIGEgUENJIGJyaWRnZSwgYW4gQXRtZWwgbWljcm9jb250cm9sbGVyLCBmb3VyIHN5bmMgc2VwZXJhdG9yCiAqIGNoaXBzLCB0ZW4gZWlnaHQgaW5wdXQgYW5hbG9nIG11bHRpcGxleG9ycywgYSBub3QgY2hpcCBhbmQgYSBmZXcKICogb3RoZXIgY29tcG9uZW50cy4KICoKICogMTYgaW5wdXRzIG9uIGEgc2Vjb25kYXJ5IGJyYWNrZXQgYXJlIHByb3ZpZGVkIGFuZCBjYW4gYmUgc2VsZWN0ZWQKICogZnJvbSBlYWNoIG9mIHRoZSBmb3VyIGNhcHR1cmUgY2hpcHMuICBUd28gb2YgdGhlIGVpZ2h0IGlucHV0CiAqIG11bHRpcGxleG9ycyBhcmUgdXNlZCB0byBzZWxlY3QgZnJvbSBhbnkgb2YgdGhlIDE2IGlucHV0IHNpZ25hbHMuCiAqCiAqIFVuc3VwcG9ydGVkIGhhcmR3YXJlIGNhcGFiaWxpdGllczoKICogIC4gQSB2aWRlbyBvdXRwdXQgbW9uaXRvciBvbiB0aGUgc2Vjb25kYXJ5IGJyYWNrZXQgY2FuIGJlIHNlbGVjdGVkIGZyb20KICogICAgb25lIG9mIHRoZSA4NzhBIGNoaXBzLgogKiAgLiBBbm90aGVyIHBhc3N0aHJvdWdoIGJ1dCBJIGhhdmVuJ3Qgc3BlbnQgYW55IHRpbWUgaW52ZXN0aWdhdGluZyBpdC4KICogIC4gRGlnaXRhbCBJL08gKGxvZ2ljIGxldmVsIGNvbm5lY3RlZCB0byBHUElPKSBpcyBhdmFpbGFibGUgZnJvbSBhbgogKiAgICBvbmJvYXJkIGhlYWRlci4KICoKICogVGhlIG9uIGNoaXAgaW5wdXQgbXV4IHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIDIuCiAqIEdQSU9bMTY6MTldIC0gVmlkZW8gaW5wdXQgc2VsZWN0aW9uCiAqIEdQSU9bMDozXSAgIC0gVmlkZW8gb3V0cHV0IG1vbml0b3Igc2VsZWN0IChvbmx5IGF2YWlsYWJsZSBmcm9tIG9uZSA4NzhBKQogKiBHUElPWz86P10gICAtIERpZ2l0YWwgSS9PLgogKgogKiBUaGVyZSBpcyBhbiBBVE1FTCBtaWNyb2NvbnRyb2xsZXIgd2l0aCBhbiA4MDMxIGNvcmUgb24gYm9hcmQuICBJIGhhdmUgbm90CiAqIGRldGVybWluZWQgd2hhdCBmdW5jdGlvbiAoaWYgYW55KSBpdCBwcm92aWRlcy4gIFdpdGggdGhlIG1pY3JvY29udHJvbGxlcgogKiBhbmQgc3luYyBzZXBlcmF0b3IgY2hpcHMgYSBndWVzcyBpcyB0aGF0IGl0IG1pZ2h0IGhhdmUgdG8gZG8gd2l0aCB2aWRlbwogKiBzd2l0Y2hpbmcgYW5kIG1heWJlIHNvbWUgZGlnaXRhbCBJL08uCiAqLwpzdGF0aWMgdm9pZCB0aWJldENTMTZfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJLyogdmlkZW8gbXV4ICovCglncGlvX2JpdHMoMHgwZjAwMDAsIGlucHV0IDw8IDE2KTsKfQoKc3RhdGljIHZvaWQgdGliZXRDUzE2X2luaXQoc3RydWN0IGJ0dHYgKmJ0dikKewoJLyogZW5hYmxlIGdwaW8gYml0cywgbWFzayBvYnRhaW5lZCB2aWEgYnRTcHkgKi8KCWdwaW9faW5vdXQoMHhmZmZmZmYsIDB4MGY3ZmZmKTsKCWdwaW9fd3JpdGUoMHgwZjdmZmYpOwp9CgovKgogKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGZvciB0aGUgS29kaWNvbS00NDAwciBnZXQgYSBsaXR0bGUgbWluZC10d2lzdGluZy4KICogVGhlcmUgaXMgYSAibWFzdGVyIiBjb250cm9sbGVyIGFuZCB0aHJlZSAic2xhdmUiIGNvbnRyb2xsZXJzLCB0b2dldGhlcgogKiBhbiBhbmFsb2cgc3dpdGNoIHdoaWNoIGNvbm5lY3RzIGFueSBvZiAxNiBjYW1lcmFzIHRvIGFueSBvZiB0aGUgQlQ4N0Ency4KICogVGhlIGFuYWxvZyBzd2l0Y2ggaXMgY29udHJvbGxlZCBieSB0aGUgIm1hc3RlciIsIGJ1dCB0aGUgZGV0ZWN0aW9uIG9yZGVyCiAqIG9mIHRoZSBmb3VyIEJUODc4QSBjaGlwcyBpcyBpbiBhbiBvcmRlciB3aGljaCBJIGp1c3QgZG9uJ3QgdW5kZXJzdGFuZC4KICogVGhlICJtYXN0ZXIiIGlzIGFjdHVhbGx5IHRoZSBzZWNvbmQgY29udHJvbGxlciB0byBiZSBkZXRlY3RlZC4gIFRoZQogKiBsb2dpYyBvbiB0aGUgYm9hcmQgdXNlcyBsb2dpY2FsIG51bWJlcnMgZm9yIHRoZSA0IGNvbnRyb2xlcnMsIGJ1dAogKiB0aG9zZSBudW1iZXJzIGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgZGV0ZWN0aW9uIHNlcXVlbmNlLiAgV2hlbiB3b3JraW5nCiAqIHdpdGggdGhlIGFuYWxvZyBzd2l0Y2gsIHdlIG5lZWQgdG8gIm1hcCIgZnJvbSB0aGUgZGV0ZWN0aW9uIHNlcXVlbmNlCiAqIG92ZXIgdG8gdGhlIGJvYXJkJ3MgbG9naWNhbCBjb250cm9sbGVyIG51bWJlci4gIFRoaXMgbWFwcGluZyBzZXF1ZW5jZQogKiBpcyB7MywgMCwgMiwgMX0sIGkuZS4gdGhlIGZpcnN0IGNvbnRyb2xsZXIgdG8gYmUgZGV0ZWN0ZWQgaXMgbG9naWNhbAogKiB1bml0IDMsIHRoZSBzZWNvbmQgKHdoaWNoIGlzIHRoZSBtYXN0ZXIpIGlzIGxvZ2ljYWwgdW5pdCAwLCBldGMuCiAqIFdlIG5lZWQgdG8gbWFpbnRhaW4gdGhlIHN0YXR1cyBvZiB0aGUgYW5hbG9nIHN3aXRjaCAod2hpY2ggb2YgdGhlIDE2CiAqIGNhbWVyYXMgaXMgY29ubmVjdGVkIHRvIHdoaWNoIG9mIHRoZSA0IGNvbnRyb2xsZXJzKS4gIFJhdGhlciB0aGFuCiAqIGFkZCB0byB0aGUgYnR0diBzdHJ1Y3R1cmUgZm9yIHRoaXMsIHdlIHVzZSB0aGUgZGF0YSByZXNlcnZlZCBmb3IKICogdGhlIG1ib3ggKHVudXNlZCBmb3IgdGhpcyBjYXJkIHR5cGUpLgogKi8KCi8qCiAqIEZpcnN0IGEgcm91dGluZSB0byBzZXQgdGhlIGFuYWxvZyBzd2l0Y2gsIHdoaWNoIGNvbnRyb2xzIHdoaWNoIGNhbWVyYQogKiBpcyByb3V0ZWQgdG8gd2hpY2ggY29udHJvbGxlci4gIFRoZSBzd2l0Y2ggY29tcHJpc2VzIGFuIFgtYWRkcmVzcwogKiAoZ3BpbyBiaXRzIDAtMywgcmVwcmVzZW50aW5nIHRoZSBjYW1lcmEsIHJhbmdpbmcgZnJvbSAwLTE1KSwgYW5kIGEKICogWS1hZGRyZXNzIChncGlvIGJpdHMgNC02LCByZXByZXNlbnRpbmcgdGhlIGNvbnRyb2xsZXIsIHJhbmdpbmcgZnJvbSAwLTMpLgogKiBBIGRhdGEgdmFsdWUgKGdwaW8gYml0IDcpIG9mICcxJyBlbmFibGVzIHRoZSBzd2l0Y2gsIGFuZCAnMCcgZGlzYWJsZXMKICogdGhlIHN3aXRjaC4gIEEgU1RST0JFIGJpdCAoZ3BpbyBiaXQgOCkgbGF0Y2hlcyB0aGUgZGF0YSB2YWx1ZSBpbnRvIHRoZQogKiBzcGVjaWZpZWQgYWRkcmVzcy4gIFRoZSBpZGVhIGlzIHRvIHNldCB0aGUgYWRkcmVzcyBhbmQgZGF0YSwgdGhlbiBicmluZwogKiBTVFJPQkUgaGlnaCwgYW5kIGZpbmFsbHkgYnJpbmcgU1RST0JFIGJhY2sgdG8gbG93LgogKi8Kc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX3dyaXRlKHN0cnVjdCBidHR2ICpidHYsCgkJCSAgICAgICB1bnNpZ25lZCBjaGFyIHhhZGRyLAoJCQkgICAgICAgdW5zaWduZWQgY2hhciB5YWRkciwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgZGF0YSkgewoJdW5zaWduZWQgaW50IHVkYXRhOwoKCXVkYXRhID0gKGRhdGEgPDwgNykgfCAoKHlhZGRyJjMpIDw8IDQpIHwgKHhhZGRyJjB4Zik7CglncGlvX2JpdHMoMHgxZmYsIHVkYXRhKTsJCS8qIHdyaXRlIEFERFIgYW5kIERBVCAqLwoJZ3Bpb19iaXRzKDB4MWZmLCB1ZGF0YSB8ICgxIDw8IDgpKTsJLyogc3Ryb2JlIGhpZ2ggKi8KCWdwaW9fYml0cygweDFmZiwgdWRhdGEpOwkJLyogc3Ryb2JlIGxvdyAqLwp9CgovKgogKiBOZXh0IHRoZSBtdXggc2VsZWN0LiAgQm90aCB0aGUgIm1hc3RlciIgYW5kICJzbGF2ZSIgJ2NhcmRzJyAoY29udHJvbGxlcnMpCiAqIHVzZSB0aGlzIHJvdXRpbmUuICBUaGUgcm91dGluZSBmaW5kcyB0aGUgIm1hc3RlciIgZm9yIHRoZSBjYXJkLCBtYXBzCiAqIHRoZSBjb250cm9sbGVyIG51bWJlciBmcm9tIHRoZSBkZXRlY3RlZCBwb3NpdGlvbiBvdmVyIHRvIHRoZSBsb2dpY2FsCiAqIG51bWJlciwgd3JpdGVzIHRoZSBhcHByb3ByaWF0ZSBkYXRhIHRvIHRoZSBhbmFsb2cgc3dpdGNoLCBhbmQgaG91c2VrZWVwcwogKiB0aGUgbG9jYWwgY29weSBvZiB0aGUgc3dpdGNoIGluZm9ybWF0aW9uLiAgVGhlIHBhcmFtZXRlciAnaW5wdXQnIGlzIHRoZQogKiByZXF1ZXN0ZWQgY2FtZXJhIG51bWJlciAoMCAtIDE1KS4KICovCnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CgljaGFyICpzd19zdGF0dXM7CglpbnQgeGFkZHIsIHlhZGRyOwoJc3RydWN0IGJ0dHYgKm1jdGxyOwoJc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFwWzRdID0gezMsIDAsIDIsIDF9OwoKCW1jdGxyID0gbWFzdGVyW2J0di0+Yy5ucl07CglpZiAobWN0bHIgPT0gTlVMTCkgewkvKiBpZ25vcmUgaWYgbWFzdGVyIG5vdCB5ZXQgZGV0ZWN0ZWQgKi8KCQlyZXR1cm47Cgl9Cgl5YWRkciA9IChidHYtPmMubnIgLSBtY3Rsci0+Yy5uciArIDEpICYgMzsgLyogdGhlICcmJyBpcyBmb3Igc2FmZXR5ICovCgl5YWRkciA9IG1hcFt5YWRkcl07Cglzd19zdGF0dXMgPSAoY2hhciAqKSgmbWN0bHItPm1ib3hfd2UpOwoJeGFkZHIgPSBpbnB1dCAmIDB4ZjsKCS8qIENoZWNrIGlmIHRoZSBjb250cm9sbGVyL2NhbWVyYSBwYWlyIGhhcyBjaGFuZ2VkLCBlbHNlIGlnbm9yZSAqLwoJaWYgKHN3X3N0YXR1c1t5YWRkcl0gIT0geGFkZHIpCgl7CgkJLyogIm9wZW4iIHRoZSBvbGQgc3dpdGNoLCAiY2xvc2UiIHRoZSBuZXcgb25lLCBzYXZlIHRoZSBuZXcgKi8KCQlrb2RpY29tNDQwMHJfd3JpdGUobWN0bHIsIHN3X3N0YXR1c1t5YWRkcl0sIHlhZGRyLCAwKTsKCQlzd19zdGF0dXNbeWFkZHJdID0geGFkZHI7CgkJa29kaWNvbTQ0MDByX3dyaXRlKG1jdGxyLCB4YWRkciwgeWFkZHIsIDEpOwoJfQp9CgovKgogKiBEdXJpbmcgaW5pdGlhbGlzYXRpb24sIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGFuYWxvZyBzd2l0Y2guICBXZQogKiBhbHNvIHByZXNldCB0aGUgc3dpdGNoIHRvIG1hcCB0aGUgNCBjb25uZWN0b3JzIG9uIHRoZSBjYXJkIHRvIHRoZQogKiAqdXNlcidzKiAoc2VlIGFib3ZlIGRlc2NyaXB0aW9uIG9mIGtvZGljb200NDAwcl9tdXhzZWwpIGNoYW5uZWxzCiAqIDAgdGhyb3VnaCAzCiAqLwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KQp7CgljaGFyICpzd19zdGF0dXMgPSAoY2hhciAqKSgmYnR2LT5tYm94X3dlKTsKCWludCBpeDsKCglncGlvX2lub3V0KDB4MDAwM2ZmLCAweDAwMDNmZik7CglncGlvX3dyaXRlKDEgPDwgOSk7CS8qIHJlc2V0IE1VWCAqLwoJZ3Bpb193cml0ZSgwKTsKCS8qIFByZXNldCBjYW1lcmEgMCB0byB0aGUgNCBjb250cm9sbGVycyAqLwoJZm9yIChpeD0wOyBpeDw0OyBpeCsrKSB7CgkJc3dfc3RhdHVzW2l4XSA9IGl4OwoJCWtvZGljb200NDAwcl93cml0ZShidHYsIGl4LCBpeCwgMSk7Cgl9CgkvKgoJICogU2luY2UgdGhpcyBpcyB0aGUgIm1hc3RlciIsIHdlIG5lZWQgdG8gc2V0IHVwIHRoZQoJICogb3RoZXIgdGhyZWUgY29udHJvbGxlciBjaGlwcycgcG9pbnRlcnMgdG8gdGhpcyBzdHJ1Y3R1cmUKCSAqIGZvciBsYXRlciB1c2UgaW4gdGhlIG11eHNlbCByb3V0aW5lLgoJICovCglpZiAoKGJ0di0+Yy5ucjwxKSB8fCAoYnR2LT5jLm5yPkJUVFZfTUFYLTMpKQoJICAgIHJldHVybjsKCW1hc3RlcltidHYtPmMubnItMV0gPSBidHY7CgltYXN0ZXJbYnR2LT5jLm5yXSAgID0gYnR2OwoJbWFzdGVyW2J0di0+Yy5ucisxXSA9IGJ0djsKCW1hc3RlcltidHYtPmMubnIrMl0gPSBidHY7Cn0KCi8qIFRoZSBHcmFuZHRlYyBYLUd1YXJkIGZyYW1lZ3JhYmJlciBjYXJkIHVzZXMgdHdvIER1YWwgNC1jaGFubmVsCiAqIHZpZGVvIG11bHRpcGxleGVycyB0byBwcm92aWRlIHVwIHRvIDE2IHZpZGVvIGlucHV0cy4gVGhlc2UKICogbXVsdGlwbGV4ZXJzIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBsb3dlciA4IEdQSU8gcGlucyBvZiB0aGUKICogYnQ4NzguIFRoZSBtdWx0aXBsZXhlcnMgcHJvYmFibHkgUGVyaWNvbSBQSTVWMzMxUSBvciBzaW1pbGFyLgoKICogeHh4MCBpcyBwaW4geHh4IG9mIG11bHRpcGxleGVyIFU1LAogKiB5eXkxIGlzIHBpbiB5eXkgb2YgbXVsdGlwbGV4ZXIgVTIKICovCiNkZWZpbmUgRU5BMCAgICAweDAxCiNkZWZpbmUgRU5CMCAgICAweDAyCiNkZWZpbmUgRU5BMSAgICAweDA0CiNkZWZpbmUgRU5CMSAgICAweDA4CgojZGVmaW5lIElOMTAgICAgMHgxMAojZGVmaW5lIElOMDAgICAgMHgyMAojZGVmaW5lIElOMTEgICAgMHg0MAojZGVmaW5lIElOMDEgICAgMHg4MAoKc3RhdGljIHZvaWQgeGd1YXJkX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCXN0YXRpYyBjb25zdCBpbnQgbWFza3NbXSA9IHsKICAgICAgICAgICAgICAgIEVOQjAsIEVOQjB8SU4wMCwgRU5CMHxJTjEwLCBFTkIwfElOMDB8SU4xMCwKICAgICAgICAgICAgICAgIEVOQTAsIEVOQTB8SU4wMCwgRU5BMHxJTjEwLCBFTkEwfElOMDB8SU4xMCwKICAgICAgICAgICAgICAgIEVOQjEsIEVOQjF8SU4wMSwgRU5CMXxJTjExLCBFTkIxfElOMDF8SU4xMSwKICAgICAgICAgICAgICAgIEVOQTEsIEVOQTF8SU4wMSwgRU5BMXxJTjExLCBFTkExfElOMDF8SU4xMSwKCX07CglncGlvX3dyaXRlKG1hc2tzW2lucHV0JTE2XSk7Cn0Kc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX2luaXQoc3RydWN0IGJ0dHYgKmJ0dikKewoJLypUaGlzIGlzIHRoZSB2aWRlbyBpbnB1dCByZWRpcmVjdGlvbiBmb25jdGlvbmFsaXR5IDogSSBESUQgTk9UIFVTRUQgSVQuICovCglidHdyaXRlICgweDA4PDwxNixCVDg0OF9HUElPX0RBVEEpOy8qR1BJT1sxOV0gWz09PiA0MDUzIEIrQ10gc2V0IHRvIDEgKi8KCWJ0d3JpdGUgKDB4MDQ8PDE2LEJUODQ4X0dQSU9fREFUQSk7LypHUElPWzE4XSBbPT0+IDQwNTMgQV0gIHNldCB0byAxKi8KfQpzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfbXV4c2VsIChzdHJ1Y3QgYnR0diogYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCglkcHJpbnRrIChLRVJOX0RFQlVHICJidHR2JWQgOiBwaWNvbG9fdGV0cmFfbXV4c2VsID0+ICBpbnB1dCA9ICVkXG4iLGJ0di0+Yy5ucixpbnB1dCk7CgkvKkp1c3Qgc2V0IHRoZSByaWdodCBwYXRoIGluIHRoZSBhbmFsb2cgbXVsdGlwbGV4ZXJzIDogY2hhbm5lbCAxIC0+IDQgPT0+IEFuYWxvZyBNdXggPT0+IE1VWDAqLwoJLypHUElPWzIwXSZHUElPWzIxXSB1c2VkIHRvIGNob29zZSB0aGUgcmlnaHQgaW5wdXQqLwoJYnR3cml0ZSAoaW5wdXQ8PDIwLEJUODQ4X0dQSU9fREFUQSk7Cgp9CgovKgogKiBpdmMxMjBfbXV4c2VsIFtBZGRlZCBieSBBbGFuIEdhcmZpZWxkIDxhbGFuQGZyb21vcmJpdC5jb20+XQogKgogKiBUaGUgSVZDMTIwRyBzZWN1cml0eSBjYXJkIGhhcyA0IGkyYyBjb250cm9sbGVkIFREQTg1NDAgbWF0cml4CiAqIHN3aWNoZXJzIHRvIHByb3ZpZGUgMTYgY2hhbm5lbHMgdG8gTVVYMC4gVGhlIFREQTg1NDAncyBoYXZlCiAqIDQgaW5kZXBlZGFudCBvdXRwdXRzIGFuZCBhcyBzdWNoIHRoZSBJVkMxMjBHIGFsc28gaGFzIHRoZQogKiBvcHRpb25hbCAiTW9uaXRvciBPdXQiIGJ1cy4gVGhpcyBhbGxvd3MgdGhlIGNhcmQgdG8gYmUgbG9va2luZwogKiBhdCBvbmUgaW5wdXQgd2hpbGUgdGhlIG1vbml0b3IgaXMgbG9va2luZyBhdCBhbm90aGVyLgogKgogKiBTaW5jZSBJJ3ZlIGNvdWxkbid0IGJlIGJvdGhlcmVkIGZpZ3VyaW5nIG91dCBob3cgdG8gYWRkIGFuCiAqIGluZGVwZW5kYW50IG11eHNlbCBmb3IgdGhlIG1vbml0b3IgYnVzLCBJJ3ZlIGp1c3Qgc2V0IGl0IHRvCiAqIHdoYXRldmVyIHRoZSBjYXJkIGlzIGxvb2tpbmcgYXQuCiAqCiAqICBPVVQwIG9mIHRoZSBUREE4NTQwJ3MgaXMgY29ubmVjdGVkIHRvIE1VWDAgICAgICAgICAoMHgwMykKICogIE9VVDEgb2YgdGhlIFREQTg1NDAncyBpcyBjb25uZWN0ZWQgdG8gIk1vbml0b3IgT3V0IiAgICAgICAgKDB4MEMpCiAqCiAqICBUREE4NTQwX0FMVDMgSU4wLTMgPSBDaGFubmVsIDEzIC0gMTYgICAgICAgKDB4MDMpCiAqICBUREE4NTQwX0FMVDQgSU4wLTMgPSBDaGFubmVsIDEgLSA0ICAgICAgICAgKDB4MDMpCiAqICBUREE4NTQwX0FMVDUgSU4wLTMgPSBDaGFubmVsIDUgLSA4ICAgICAgICAgKDB4MDMpCiAqICBUREE4NTQwX0FMVDYgSU4wLTMgPSBDaGFubmVsIDkgLSAxMiAgICAgICAgICAgICAgICAoMHgwMykKICoKICovCgovKiBBbGwgNyBwb3NzaWJsZSBzdWItaWRzIGZvciB0aGUgVERBODU0MCBNYXRyaXggU3dpdGNoZXIgKi8KI2RlZmluZSBJMkNfVERBODU0MCAgICAgICAgMHg5MAojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDEgICAweDkyCiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUMiAgIDB4OTQKI2RlZmluZSBJMkNfVERBODU0MF9BTFQzICAgMHg5NgojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDQgICAweDk4CiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUNSAgIDB4OWEKI2RlZmluZSBJMkNfVERBODU0MF9BTFQ2ICAgMHg5YwoKc3RhdGljIHZvaWQgaXZjMTIwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCS8qIFNpbXBsZSBtYXRocyAqLwoJaW50IGtleSA9IGlucHV0ICUgNDsKCWludCBtYXRyaXggPSBpbnB1dCAvIDQ7CgoJZHByaW50aygiYnR0diVkOiBpdmMxMjBfbXV4c2VsOiBJbnB1dCAtICUwMmQgfCBUREEgLSAlMDJkIHwgSW4gLSAlMDJkXG4iLAoJCWJ0di0+Yy5uciwgaW5wdXQsIG1hdHJpeCwga2V5KTsKCgkvKiBIYW5kbGVzIHRoZSBpbnB1dCBzZWxlY3Rpb24gb24gdGhlIFREQTg1NDAncyAqLwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDMsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMykgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDQsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMCkgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDUsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMSkgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDYsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMikgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoKCS8qIEhhbmRsZXMgdGhlIG91dHB1dCBlbmFibGVzIG9uIHRoZSBUREE4NTQwJ3MgKi8KCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQzLCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDMpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDEzIC0gMTYgKi8KCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ0LCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDApID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDEtNCAqLwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDUsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMSkgPyAweDAzIDogMHgwMCksIDEpOyAgLyogNS04ICovCglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNiwgMHgwMiwKCQkgICAgICAoKG1hdHJpeCA9PSAyKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvKiA5LTEyICovCgoJLyogU2VsZWN0cyBNVVgwIGZvciBpbnB1dCBvbiB0aGUgODc4ICovCglidGFvcigoMCk8PDUsIH4oMzw8NSksIEJUODQ4X0lGT1JNKTsKfQoKCi8qIFBYQzIwMCBtdXhzZWwgaGVscGVyCiAqIGx1a2VAc3lzZW5nLmFudS5lZHUuYXUKICogYW5vdGhlciB0cmFuc3BsYW50CiAqIGZyb20gQWxlc3NhbmRybyBSdWJpbmkgKHJ1YmluaUBsaW51eC5pdCkKICoKICogVGhlcmUgYXJlIDQga2luZHMgb2YgY2FyZHM6CiAqIFBYQzIwMEwgd2hpY2ggaXMgYnQ4NDgKICogUFhDMjAwRiB3aGljaCBpcyBidDg0OCB3aXRoIFBJQyBjb250cm9sbGluZyBtdXgKICogUFhDMjAwQUwgd2hpY2ggaXMgYnQ4NzgKICogUFhDMjAwQUYgd2hpY2ggaXMgYnQ4Nzggd2l0aCBQSUMgY29udHJvbGxpbmcgbXV4CiAqLwojZGVmaW5lIFBYX0NGR19QWEMyMDBGIDB4MDEKI2RlZmluZSBQWF9GTEFHX1BYQzIwMEEgIDB4MDAwMDEwMDAgLyogYSBweGMyMDBBIGlzIGJ0LTg3OCBiYXNlZCAqLwojZGVmaW5lIFBYX0kyQ19QSUMgICAgICAgMHgwZgojZGVmaW5lIFBYX1BYQzIwMEFfQ0FSRElEIDB4MjAwYTEyOTUKI2RlZmluZSBQWF9JMkNfQ01EX0NGRyAgIDB4MDAKCnN0YXRpYyB2b2lkIFBYQzIwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CiAgICAgICAgaW50IHJjOwoJbG9uZyBtdXg7CglpbnQgYml0bWFzazsKICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKCgkvKiBSZWFkIFBJQyBjb25maWcgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBQWEMyMDBGICovCgkvKiBQWF9JMkNfQ01EX0NGRyovCglidWZbMF09MDsKCWJ1ZlsxXT0wOwoJcmM9YnR0dl9JMkNXcml0ZShidHYsKFBYX0kyQ19QSUM8PDEpLGJ1ZlswXSxidWZbMV0sMSk7CglpZiAocmMpIHsKCSAgcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogUFhDMjAwX211eHNlbDogcGljIGNmZyB3cml0ZSBmYWlsZWQ6JWRcbiIsIGJ0di0+Yy5ucixyYyk7CgkgIC8qIG5vdCBQWEMgPyBkbyBub3RoaW5nICovCgkgIHJldHVybjsKCX0KCglyYz1idHR2X0kyQ1JlYWQoYnR2LChQWF9JMkNfUElDPDwxKSxOVUxMKTsKCWlmICghKHJjICYgUFhfQ0ZHX1BYQzIwMEYpKSB7CgkgIHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IFBYQzIwMF9tdXhzZWw6IG5vdCBQWEMyMDBGIHJjOiVkIFxuIiwgYnR2LT5jLm5yLHJjKTsKCSAgcmV0dXJuOwoJfQoKCgkvKiBUaGUgbXVsdGlwbGV4ZXIgaW4gdGhlIDIwMEYgaXMgaGFuZGxlZCBieSB0aGUgR1BJTyBwb3J0ICovCgkvKiBnZXQgY29ycmVjdCBtYXBwaW5nIGJldHdlZW4gaW5wdXRzICAqLwoJLyogIG11eCA9IGJ0dHZfdHZjYXJkc1tidHYtPnR5cGVdLm11eHNlbFtpbnB1dF0gJiAzOyAqLwoJLyogKiogbm90IG5lZWRlZCE/ICAgKi8KCW11eCA9IGlucHV0OwoKCS8qIG1ha2Ugc3VyZSBvdXRwdXQgcGlucyBhcmUgZW5hYmxlZCAqLwoJLyogYml0bWFzaz0weDMwZjsgKi8KCWJpdG1hc2s9MHgzMDI7CgkvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYSBQWEMyMDBBICovCiAJaWYgKGJ0di0+Y2FyZGlkID09IFBYX1BYQzIwMEFfQ0FSRElEKSAgewoJICAgYml0bWFzayBePSAweDE4MDsgLyogdXNlIDcgYW5kIDksIG5vdCA4IGFuZCA5ICovCgkgICBiaXRtYXNrIHw9IDc8PDQ7IC8qIHRoZSBEQUMgKi8KCX0KCWJ0d3JpdGUoYml0bWFzaywgQlQ4NDhfR1BJT19PVVRfRU4pOwoKCWJpdG1hc2sgPSBidHJlYWQoQlQ4NDhfR1BJT19EQVRBKTsKIAlpZiAoYnR2LT5jYXJkaWQgPT0gUFhfUFhDMjAwQV9DQVJESUQpCgkgIGJpdG1hc2sgPSAoYml0bWFzayAmIH4weDI4MCkgfCAoKG11eCAmIDIpIDw8IDgpIHwgKChtdXggJiAxKSA8PCA3KTsKCWVsc2UgLyogb2xkZXIgZGV2aWNlICovCgkgIGJpdG1hc2sgPSAoYml0bWFzayAmIH4weDMwMCkgfCAoKG11eCAmIDMpIDw8IDgpOwoJYnR3cml0ZShiaXRtYXNrLEJUODQ4X0dQSU9fREFUQSk7CgoJLyoKCSAqIFdhcyAidG8gYmUgc2FmZSwgc2V0IHRoZSBidDg0OCB0byBpbnB1dCAwIgoJICogQWN0dWFsbHksIHNpbmNlIGl0J3Mgb2sgYXQgbG9hZCB0aW1lLCBiZXR0ZXIgbm90IG1lc3NpbmcKCSAqIHdpdGggdGhlc2UgYml0cyAob24gUFhDMjAwQUYgeW91IG5lZWQgdG8gc2V0IG11eCAyIGhlcmUpCgkgKgoJICogbmVlZGVkIGJlY2F1c2UgYnR0di1kcml2ZXIgc2V0cyBtdXggYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgoJICovCiAJaWYgKGJ0di0+Y2FyZGlkID09IFBYX1BYQzIwMEFfQ0FSRElEKQoJICBidGFvcigyPDw1LCB+QlQ4NDhfSUZPUk1fTVVYU0VMLCBCVDg0OF9JRk9STSk7CgllbHNlIC8qIG9sZGVyIGRldmljZSAqLwoJICBidGFuZCh+QlQ4NDhfSUZPUk1fTVVYU0VMLEJUODQ4X0lGT1JNKTsKCglwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiBzZXR0aW5nIGlucHV0IGNoYW5uZWwgdG86JWRcbiIsIGJ0di0+Yy5uciwoaW50KW11eCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIG1vdGhlcmJvYXJkIGNoaXBzZXQgc3BlY2lmaWMgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgp2b2lkIF9fZGV2aW5pdCBidHR2X2NoZWNrX2NoaXBzZXQodm9pZCkKewoJaW50IHBjaXBjaV9mYWlsID0gMDsKCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwoKCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX0ZBSUwpCgkJcGNpcGNpX2ZhaWwgPSAxOwoJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiAoUENJUENJX1RSSVRPTnxQQ0lQQ0lfTkFUT01BfFBDSVBDSV9WSUFFVEJGKSkKCQl0cml0b24xID0gMTsKCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX1ZTRlgpCgkJdnNmeCA9IDE7CiNpZmRlZiBQQ0lQQ0lfQUxJTUFHSUsKCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX0FMSU1BR0lLKQoJCWxhdGVuY3kgPSAweDBBOwojZW5kaWYKCgoJLyogcHJpbnQgd2FybmluZ3MgYWJvdXQgYW55IHF1aXJrcyBmb3VuZCAqLwoJaWYgKHRyaXRvbjEpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2UgbmVlZHMgRVRCRiBlbmFibGVkLlxuIik7CglpZiAodnNmeCkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBuZWVkcyBWU0ZYIGVuYWJsZWQuXG4iKTsKCWlmIChwY2lwY2lfZmFpbCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHY6IEJUODQ4IGFuZCB5b3VyIGNoaXBzZXQgbWF5IG5vdCB3b3JrIHRvZ2V0aGVyLlxuIik7CgkJaWYgKCFub19vdmVybGF5KSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHY6IG92ZXJsYXkgd2lsbCBiZSBkaXNhYmxlZC5cbiIpOwoJCQlub19vdmVybGF5ID0gMTsKCQl9IGVsc2UgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2OiBvdmVybGF5IGZvcmNlZC4gVXNlIHRoaXMgb3B0aW9uIGF0IHlvdXIgb3duIHJpc2suXG4iKTsKCQl9Cgl9CglpZiAoVU5TRVQgIT0gbGF0ZW5jeSkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBwY2kgbGF0ZW5jeSBmaXh1cCBbJWRdXG4iLGxhdGVuY3kpOwoJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAoJCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0MSwgZGV2KSkpIHsKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYjsKCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTMsICZiKTsKCQlpZiAoYnR0dl9kZWJ1ZykKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2U6IDgyNDQxRlggTmF0b21hLCAiCgkJCSAgICAgICAiYnVmY29uPTB4JTAyeFxuIixiKTsKCX0KfQoKaW50IF9fZGV2aW5pdCBidHR2X2hhbmRsZV9jaGlwc2V0KHN0cnVjdCBidHR2ICpidHYpCnsKIAl1bnNpZ25lZCBjaGFyIGNvbW1hbmQ7CgoJaWYgKCF0cml0b24xICYmICF2c2Z4ICYmIFVOU0VUID09IGxhdGVuY3kpCgkJcmV0dXJuIDA7CgoJaWYgKGJ0dHZfdmVyYm9zZSkgewoJCWlmICh0cml0b24xKQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIEVUQkYgKDQzMEZYL1ZQMyBjb21wYXRpYmlsdHkpXG4iLGJ0di0+Yy5ucik7CgkJaWYgKHZzZnggJiYgYnR2LT5pZCA+PSA4NzgpCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZW5hYmxpbmcgVlNGWFxuIixidHYtPmMubnIpOwoJCWlmIChVTlNFVCAhPSBsYXRlbmN5KQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHNldHRpbmcgcGNpIHRpbWVyIHRvICVkXG4iLAoJCQkgICAgICAgYnR2LT5jLm5yLGxhdGVuY3kpOwoJfQoKCWlmIChidHYtPmlkIDwgODc4KSB7CgkJLyogYnQ4NDggKG1pcyl1c2VzIGEgYml0IGluIHRoZSBpcnEgbWFzayBmb3IgZXRiZiAqLwoJCWlmICh0cml0b24xKQoJCQlidHYtPnRyaXRvbjEgPSBCVDg0OF9JTlRfRVRCRjsKCX0gZWxzZSB7CgkJLyogYnQ4NzggaGFzIGEgYml0IGluIHRoZSBwY2kgY29uZmlnIHNwYWNlIGZvciBpdCAqLwogICAgICAgICAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoYnR2LT5jLnBjaSwgQlQ4NzhfREVWQ1RSTCwgJmNvbW1hbmQpOwoJCWlmICh0cml0b24xKQoJCQljb21tYW5kIHw9IEJUODc4X0VOX1RCRlg7CgkJaWYgKHZzZngpCgkJCWNvbW1hbmQgfD0gQlQ4NzhfRU5fVlNGWDsKICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShidHYtPmMucGNpLCBCVDg3OF9ERVZDVFJMLCBjb21tYW5kKTsKICAgICAgICB9CglpZiAoVU5TRVQgIT0gbGF0ZW5jeSkKCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnR2LT5jLnBjaSwgUENJX0xBVEVOQ1lfVElNRVIsIGxhdGVuY3kpOwoJcmV0dXJuIDA7Cn0KCgovKgogKiBMb2NhbCB2YXJpYWJsZXM6CiAqIGMtYmFzaWMtb2Zmc2V0OiA4CiAqIEVuZDoKICovCg==