LyoKICogQ29weXJpZ2h0IDIwMDUsIDIwMDcgSGVucmkgVmVyYmVldAogKiBDb3B5cmlnaHQgKEMpIDIwMDcgU3RlZmFuIET2c2luZ2VyKGZvciBDb2RlV2VhdmVycykKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKLyogVGhpcyB0ZXN0IGZyYW1ld29yayBhbGxvd3MgbGltaXRlZCB0ZXN0aW5nIG9mIHJlbmRlcmluZyByZXN1bHRzLiBUaGluZ3MgYXJlIHJlbmRlcmVkLCBzaG93biBvbgogKiB0aGUgZnJhbWVidWZmZXIsIHJlYWQgYmFjayBmcm9tIHRoZXJlIGFuZCBjb21wYXJlZCB0byBleHBlY3RlZCBjb2xvcnMuCiAqCiAqIEhvd2V2ZXIsIG5laXRoZXIgZDNkIG5vciBvcGVuZ2wgaXMgZ3VhcmFudGVlZCB0byBiZSBwaXhlbCBleGFjdCwgYW5kIHRodXMgdGhlIGNhcGFiaWxpdHkgb2YgdGhpcyB0ZXN0CiAqIGlzIHJhdGhlciBsaW1pdGVkLiBBcyBhIGdlbmVyYWwgZ3VpZGVsaW5lIGZvciBhZGRpbmcgdGVzdHMsIGRvIG5vdCByZWx5IG9uIGNvcm5lciBwaXhlbHMuIERyYXcgYSBiaWcgZW5vdWdoCiAqIGFyZWEgd2hpY2ggc2hvd3Mgc3BlY2lmaWMgYmVoYXZpb3IobGlrZSBhIHF1YWQgb24gdGhlIHdob2xlIHNjcmVlbiksIGFuZCB0cnkgdG8gZ2V0IHJlc3VsdGluZyBjb2xvcnMgd2l0aAogKiBhbGwgYml0cyBzZXQgb3IgdW5zZXQgaW4gYWxsIGNoYW5uZWxzKGxpa2UgcHVyZSByZWQsIGdyZWVuLCBibHVlLCB3aGl0ZSwgYmxhY2spLiBIb3BlZnVsbHkgZXZlcnl0aGluZyB0aGF0CiAqIGNhdXNlcyB2aXNpYmxlIHJlc3VsdHMgaW4gZ2FtZXMgY2FuIGJlIHRlc3RlZCBpbiBhIHdheSB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiBwaXhlbCBleGFjdG5lc3MKICovCgojZGVmaW5lIENPQkpNQUNST1MKI2luY2x1ZGUgPGQzZDkuaD4KI2luY2x1ZGUgPGR4ZXJyOS5oPgojaW5jbHVkZSAid2luZS90ZXN0LmgiCgpzdGF0aWMgSE1PRFVMRSBkM2Q5X2hhbmRsZSA9IDA7CgpzdGF0aWMgSFdORCBjcmVhdGVfd2luZG93KHZvaWQpCnsKICAgIFdORENMQVNTIHdjID0gezB9OwogICAgSFdORCByZXQ7CiAgICB3Yy5scGZuV25kUHJvYyA9ICZEZWZXaW5kb3dQcm9jOwogICAgd2MubHBzekNsYXNzTmFtZSA9ICJkM2Q5X3Rlc3Rfd2MiOwogICAgUmVnaXN0ZXJDbGFzcygmd2MpOwoKICAgIHJldCA9IENyZWF0ZVdpbmRvdygiZDNkOV90ZXN0X3djIiwgImQzZDlfdGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgIFdTX01BWElNSVpFIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gLCAwLCAwLCA2NDAsIDQ4MCwgMCwgMCwgMCwgMCk7CiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgRFdPUkQgZ2V0UGl4ZWxDb2xvcihJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIFVJTlQgeCwgVUlOVCB5KQp7CiAgICBEV09SRCByZXQ7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZjsKICAgIEhSRVNVTFQgaHI7CiAgICBEM0RMT0NLRURfUkVDVCBsb2NrZWRSZWN0OwogICAgUkVDVCByZWN0VG9Mb2NrID0ge3gsIHksIHgrMSwgeSsxfTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKGRldmljZSwgNjQwLCA0ODAsIEQzREZNVF9BOFI4RzhCOCwgRDNEUE9PTF9TWVNURU1NRU0sICZzdXJmLCBOVUxMKTsKICAgIGlmKEZBSUxFRChocikgfHwgIXN1cmYgKSAgLyogVGhpcyBpcyBub3QgYSB0ZXN0ICovCiAgICB7CiAgICAgICAgdHJhY2UoIkNhbid0IGNyZWF0ZSBhbiBvZmZzY3JlZW4gcGxhaW4gc3VyZmFjZSB0byByZWFkIHRoZSByZW5kZXIgdGFyZ2V0IGRhdGEsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIHJldHVybiAweGRlYWRiZWVmOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRGcm9udEJ1ZmZlckRhdGEoZGV2aWNlLCAwLCBzdXJmKTsKICAgIGlmKEZBSUxFRChocikpCiAgICB7CiAgICAgICAgdHJhY2UoIkNhbid0IHJlYWQgdGhlIGZyb250IGJ1ZmZlciBkYXRhLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICByZXQgPSAweGRlYWRiZWVkOwogICAgICAgIGdvdG8gb3V0OwogICAgfQoKICAgIGhyID0gSURpcmVjdDNEU3VyZmFjZTlfTG9ja1JlY3Qoc3VyZiwgJmxvY2tlZFJlY3QsICZyZWN0VG9Mb2NrLCBEM0RMT0NLX1JFQURPTkxZKTsKICAgIGlmKEZBSUxFRChocikpCiAgICB7CiAgICAgICAgdHJhY2UoIkNhbid0IGxvY2sgdGhlIG9mZnNjcmVlbiBzdXJmYWNlLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICByZXQgPSAweGRlYWRiZWVjOwogICAgICAgIGdvdG8gb3V0OwogICAgfQoKICAgIC8qIFJlbW92ZSB0aGUgWCBjaGFubmVsIGZvciBub3cuIERpcmVjdFggYW5kIE9wZW5HTCBoYXZlIGRpZmZlcmVudCBpZGVhcyBob3cgdG8gdHJlYXQgaXQgYXBwYXJlbnRseSwgYW5kIGl0IGlzbid0CiAgICAgKiByZWFsbHkgaW1wb3J0YW50IGZvciB0aGVzZSB0ZXN0cwogICAgICovCiAgICByZXQgPSAoKERXT1JEICopIGxvY2tlZFJlY3QucEJpdHMpWzBdICYgMHgwMGZmZmZmZjsKICAgIGhyID0gSURpcmVjdDNEU3VyZmFjZTlfVW5sb2NrUmVjdChzdXJmKTsKICAgIGlmKEZBSUxFRChocikpCiAgICB7CiAgICAgICAgdHJhY2UoIkNhbid0IHVubG9jayB0aGUgb2Zmc2NyZWVuIHN1cmZhY2UsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgfQoKb3V0OgogICAgaWYoc3VyZikgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShzdXJmKTsKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBJRGlyZWN0M0REZXZpY2U5ICppbml0X2QzZDkodm9pZCkKewogICAgSURpcmVjdDNEOSAqIChfX3N0ZGNhbGwgKiBkM2Q5X2NyZWF0ZSkoVUlOVCBTREtWZXJzaW9uKSA9IDA7CiAgICBJRGlyZWN0M0Q5ICpkM2Q5X3B0ciA9IDA7CiAgICBJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2VfcHRyID0gMDsKICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyBwcmVzZW50X3BhcmFtZXRlcnM7CiAgICBIUkVTVUxUIGhyOwoKICAgIGQzZDlfY3JlYXRlID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhkM2Q5X2hhbmRsZSwgIkRpcmVjdDNEQ3JlYXRlOSIpOwogICAgb2soZDNkOV9jcmVhdGUgIT0gTlVMTCwgIkZhaWxlZCB0byBnZXQgYWRkcmVzcyBvZiBEaXJlY3QzRENyZWF0ZTlcbiIpOwogICAgaWYgKCFkM2Q5X2NyZWF0ZSkgcmV0dXJuIE5VTEw7CgogICAgZDNkOV9wdHIgPSBkM2Q5X2NyZWF0ZShEM0RfU0RLX1ZFUlNJT04pOwogICAgb2soZDNkOV9wdHIgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOwogICAgaWYgKCFkM2Q5X3B0cikgcmV0dXJuIE5VTEw7CgogICAgWmVyb01lbW9yeSgmcHJlc2VudF9wYXJhbWV0ZXJzLCBzaXplb2YocHJlc2VudF9wYXJhbWV0ZXJzKSk7CiAgICBwcmVzZW50X3BhcmFtZXRlcnMuV2luZG93ZWQgPSBGQUxTRTsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5oRGV2aWNlV2luZG93ID0gY3JlYXRlX3dpbmRvdygpOwogICAgcHJlc2VudF9wYXJhbWV0ZXJzLlN3YXBFZmZlY3QgPSBEM0RTV0FQRUZGRUNUX0RJU0NBUkQ7CiAgICBwcmVzZW50X3BhcmFtZXRlcnMuQmFja0J1ZmZlcldpZHRoID0gNjQwOwogICAgcHJlc2VudF9wYXJhbWV0ZXJzLkJhY2tCdWZmZXJIZWlnaHQgPSA0ODA7CiAgICBwcmVzZW50X3BhcmFtZXRlcnMuQmFja0J1ZmZlckZvcm1hdCA9IEQzREZNVF9YOFI4RzhCODsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5FbmFibGVBdXRvRGVwdGhTdGVuY2lsID0gVFJVRTsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0ID0gRDNERk1UX0QyNFM4OwoKICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoZDNkOV9wdHIsIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwsIHByZXNlbnRfcGFyYW1ldGVycy5oRGV2aWNlV2luZG93LCBEM0RDUkVBVEVfU09GVFdBUkVfVkVSVEVYUFJPQ0VTU0lORywgJnByZXNlbnRfcGFyYW1ldGVycywgJmRldmljZV9wdHIpOwogICAgaWYoRkFJTEVEKGhyKSkgewogICAgICAgIHByZXNlbnRfcGFyYW1ldGVycy5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0ID0gRDNERk1UX0QxNjsKICAgICAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKGQzZDlfcHRyLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMLCBwcmVzZW50X3BhcmFtZXRlcnMuaERldmljZVdpbmRvdywgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZwcmVzZW50X3BhcmFtZXRlcnMsICZkZXZpY2VfcHRyKTsKICAgIH0KICAgIG9rKGhyID09IEQzRF9PSyB8fCBociA9PSBEM0RFUlJfTk9UQVZBSUxBQkxFLCAiSURpcmVjdDNEX0NyZWF0ZURldmljZSByZXR1cm5lZDogJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgcmV0dXJuIGRldmljZV9wdHI7Cn0KCnN0cnVjdCB2ZXJ0ZXgKewogICAgZmxvYXQgeCwgeSwgejsKICAgIERXT1JEIGRpZmZ1c2U7Cn07CgpzdHJ1Y3QgdHZlcnRleAp7CiAgICBmbG9hdCB4LCB5LCB6LCByaHc7CiAgICBEV09SRCBkaWZmdXNlOwp9OwoKc3RydWN0IG52ZXJ0ZXgKewogICAgZmxvYXQgeCwgeSwgejsKICAgIGZsb2F0IG54LCBueSwgbno7CiAgICBEV09SRCBkaWZmdXNlOwp9OwoKc3RhdGljIHZvaWQgbGlnaHRpbmdfdGVzdChJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UpCnsKICAgIEhSRVNVTFQgaHI7CiAgICBEV09SRCBmdmYgPSBEM0RGVkZfWFlaIHwgRDNERlZGX0RJRkZVU0U7CiAgICBEV09SRCBuZnZmID0gRDNERlZGX1hZWiB8IEQzREZWRl9ESUZGVVNFIHwgRDNERlZGX05PUk1BTDsKICAgIERXT1JEIGNvbG9yOwoKICAgIGZsb2F0IG1hdFsxNl0gPSB7IDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCiAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLAogICAgICAgICAgICAgICAgICAgICAgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwKICAgICAgICAgICAgICAgICAgICAgIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYgfTsKCiAgICBzdHJ1Y3QgdmVydGV4IHVubGl0cXVhZFtdID0KICAgIHsKICAgICAgICB7LTEuMGYsIC0xLjBmLCAgIDAuMWYsICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwfSwKICAgICAgICB7LTEuMGYsICAwLjBmLCAgIDAuMWYsICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwfSwKICAgICAgICB7IDAuMGYsICAwLjBmLCAgIDAuMWYsICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwfSwKICAgICAgICB7IDAuMGYsIC0xLjBmLCAgIDAuMWYsICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwfSwKICAgIH07CiAgICBzdHJ1Y3QgdmVydGV4IGxpdHF1YWRbXSA9CiAgICB7CiAgICAgICAgey0xLjBmLCAgMC4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwZmYwMH0sCiAgICAgICAgey0xLjBmLCAgMS4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwZmYwMH0sCiAgICAgICAgeyAwLjBmLCAgMS4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwZmYwMH0sCiAgICAgICAgeyAwLjBmLCAgMC4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwZmYwMH0sCiAgICB9OwogICAgc3RydWN0IG52ZXJ0ZXggdW5saXRucXVhZFtdID0KICAgIHsKICAgICAgICB7IDAuMGYsIC0xLjBmLCAgIDAuMWYsICAxLjBmLCAgIDEuMGYsICAgMS4wZiwgICAweGZmMDAwMGZmfSwKICAgICAgICB7IDAuMGYsICAwLjBmLCAgIDAuMWYsICAxLjBmLCAgIDEuMGYsICAgMS4wZiwgICAweGZmMDAwMGZmfSwKICAgICAgICB7IDEuMGYsICAwLjBmLCAgIDAuMWYsICAxLjBmLCAgIDEuMGYsICAgMS4wZiwgICAweGZmMDAwMGZmfSwKICAgICAgICB7IDEuMGYsIC0xLjBmLCAgIDAuMWYsICAxLjBmLCAgIDEuMGYsICAgMS4wZiwgICAweGZmMDAwMGZmfSwKICAgIH07CiAgICBzdHJ1Y3QgbnZlcnRleCBsaXRucXVhZFtdID0KICAgIHsKICAgICAgICB7IDAuMGYsICAwLjBmLCAgIDAuMWYsICAxLjBmLCAgIDEuMGYsICAgMS4wZiwgICAweGZmZmZmZjAwfSwKICAgICAgICB7IDAuMGYsICAxLjBmLCAgIDAuMWYsICAxLjBmLCAgIDEuMGYsICAgMS4wZiwgICAweGZmZmZmZjAwfSwKICAgICAgICB7IDEuMGYsICAxLjBmLCAgIDAuMWYsICAxLjBmLCAgIDEuMGYsICAgMS4wZiwgICAweGZmZmZmZjAwfSwKICAgICAgICB7IDEuMGYsICAwLjBmLCAgIDAuMWYsICAxLjBmLCAgIDEuMGYsICAgMS4wZiwgICAweGZmZmZmZjAwfSwKICAgIH07CiAgICBXT1JEIEluZGljZXNbXSA9IHswLCAxLCAyLCAyLCAzLCAwfTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmZmZmZmZmYsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIFNldHVwIHNvbWUgc3RhdGVzIHRoYXQgbWF5IGNhdXNlIGlzc3VlcyAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybShkZXZpY2UsIEQzRFRTX1dPUkxETUFUUklYKDApLCAoRDNETUFUUklYICopIG1hdCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUcmFuc2Zvcm0oZGV2aWNlLCBEM0RUU19WSUVXLCAoRDNETUFUUklYICopbWF0KTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybShkZXZpY2UsIEQzRFRTX1BST0pFQ1RJT04sIChEM0RNQVRSSVggKikgbWF0KTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfQ0xJUFBJTkcsIEZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19aRU5BQkxFLCBGQUxTRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfRk9HRU5BQkxFLCBGQUxTRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfU1RFTkNJTEVOQUJMRSwgRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0FMUEhBVEVTVEVOQUJMRSwgRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0FMUEhBQkxFTkRFTkFCTEUsIEZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19TQ0lTU09SVEVTVEVOQUJMRSwgRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0NVTExNT0RFLCBEM0RDVUxMX05PTkUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0NPTE9SV1JJVEVFTkFCTEUsIEQzRENPTE9SV1JJVEVFTkFCTEVfUkVEIHwgRDNEQ09MT1JXUklURUVOQUJMRV9HUkVFTiB8IEQzRENPTE9SV1JJVEVFTkFCTEVfQkxVRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBmdmYpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKGhyID09IEQzRF9PSykKICAgIHsKICAgICAgICAvKiBObyBsaWdodHMgYXJlIGRlZmluZWQuLi4gVGhhdCBtZWFucywgbGl0IHZlcnRpY2VzIHNob3VsZCBiZSBlbnRpcmVseSBibGFjayAqLwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0xJR0hUSU5HLCBGQUxTRSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFTElTVCwgMCAvKiBNaW5JbmRleCAqLywgNCAvKiBOdW1WZXJ0cyAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLypQcmltQ291bnQgKi8sIEluZGljZXMsIEQzREZNVF9JTkRFWDE2LCB1bmxpdHF1YWQsIHNpemVvZih1bmxpdHF1YWRbMF0pKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0xJR0hUSU5HLCBUUlVFKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3SW5kZXhlZFByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVMSVNULCAwIC8qIE1pbkluZGV4ICovLCA0IC8qIE51bVZlcnRzICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAvKlByaW1Db3VudCAqLywgSW5kaWNlcywgRDNERk1UX0lOREVYMTYsIGxpdHF1YWQsIHNpemVvZihsaXRxdWFkWzBdKSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3SW5kZXhlZFByaW1pdGl2ZVVQIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgbmZ2Zik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0xJR0hUSU5HLCBGQUxTRSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFTElTVCwgMCAvKiBNaW5JbmRleCAqLywgNCAvKiBOdW1WZXJ0cyAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLypQcmltQ291bnQgKi8sIEluZGljZXMsIEQzREZNVF9JTkRFWDE2LCB1bmxpdG5xdWFkLCBzaXplb2YodW5saXRucXVhZFswXSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfTElHSFRJTkcsIFRSVUUpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRUxJU1QsIDAgLyogTWluSW5kZXggKi8sIDQgLyogTnVtVmVydHMgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC8qUHJpbUNvdW50ICovLCBJbmRpY2VzLCBEM0RGTVRfSU5ERVgxNiwgbGl0bnF1YWQsIHNpemVvZihsaXRucXVhZFswXSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOyAvKiBsb3dlciBsZWZ0IHF1YWQgLSB1bmxpdCB3aXRob3V0IG5vcm1hbHMgKi8KICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsICJVbmxpdCBxdWFkIHdpdGhvdXQgbm9ybWFscyBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAxMjApOyAvKiB1cHBlciBsZWZ0IHF1YWQgLSBsaXQgd2l0aG91dCBub3JtYWxzICovCiAgICBvayhjb2xvciA9PSAweDAwMDAwMDAwLCAiTGl0IHF1YWQgd2l0aG91dCBub3JtYWxzIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDM2MCk7IC8qIGxvd2VyIGxlZnQgcXVhZCAtIHVubGl0IHdpdGggbm9ybWFscyAqLwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgIlVubGl0IHF1YWQgd2l0aCBub3JtYWxzIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDEyMCk7IC8qIHVwcGVyIGxlZnQgcXVhZCAtIGxpdCB3aXRoIG5vcm1hbHMgKi8KICAgIG9rKGNvbG9yID09IDB4MDAwMDAwMDAsICJMaXQgcXVhZCB3aXRoIG5vcm1hbHMgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19MSUdIVElORywgRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKfQoKc3RhdGljIHZvaWQgY2xlYXJfdGVzdChJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UpCnsKICAgIC8qIFRlc3RzIHRoZSBjb3JyZWN0bmVzcyBvZiBjbGVhcmluZyBwYXJhbWV0ZXJzICovCiAgICBIUkVTVUxUIGhyOwogICAgRDNEUkVDVCByZWN0WzJdOwogICAgRDNEUkVDVCByZWN0X25lZ25lZzsKICAgIERXT1JEIGNvbG9yOwogICAgRDNEVklFV1BPUlQ5IG9sZF92cCwgdnA7CiAgICBSRUNUIHNjaXNzb3I7CiAgICBEV09SRCBvbGRDb2xvcldyaXRlOwogICAgQk9PTCBpbnZhbGlkX2NsZWFyX2ZhaWxlZCA9IEZBTFNFOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmZmZmZiwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgLyogUG9zaXRpdmUgeCwgbmVnYXRpdmUgeSAqLwogICAgcmVjdFswXS54MSA9IDA7CiAgICByZWN0WzBdLnkxID0gNDgwOwogICAgcmVjdFswXS54MiA9IDMyMDsKICAgIHJlY3RbMF0ueTIgPSAyNDA7CgogICAgLyogUG9zaXRpdmUgeCwgcG9zaXRpdmUgeSAqLwogICAgcmVjdFsxXS54MSA9IDA7CiAgICByZWN0WzFdLnkxID0gMDsKICAgIHJlY3RbMV0ueDIgPSAzMjA7CiAgICByZWN0WzFdLnkyID0gMjQwOwogICAgLyogQ2xlYXIgMiByZWN0YW5nbGVzIHdpdGggb25lIGNhbGwuIFRoZSByZWZyYXN0IHJldHVybnMgYW4gZXJyb3IgaW4gdGhpcyBjYXNlLCBldmVyeSByZWFsIGRyaXZlciB0ZXN0ZWQgc28gZmFyCiAgICAgKiByZXR1cm5zIEQzRF9PSywgYnV0IGlnbm9yZXMgdGhlIHJlY3RhbmdsZSBzaWxlbnRseQogICAgICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAyLCByZWN0LCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmZmZjAwMDAsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0sgfHwgaHIgPT0gRDNERVJSX0lOVkFMSURDQUxMLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCkgaW52YWxpZF9jbGVhcl9mYWlsZWQgPSBUUlVFOwoKICAgIC8qIG5lZ2F0aXZlIHgsIG5lZ2F0aXZlIHkgKi8KICAgIHJlY3RfbmVnbmVnLngxID0gNjQwOwogICAgcmVjdF9uZWduZWcueTEgPSAyNDA7CiAgICByZWN0X25lZ25lZy54MiA9IDMyMDsKICAgIHJlY3RfbmVnbmVnLnkyID0gMDsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDEsICZyZWN0X25lZ25lZywgRDNEQ0xFQVJfVEFSR0VULCAweGZmMDBmZjAwLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LIHx8IGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihociA9PSBEM0RFUlJfSU5WQUxJRENBTEwpIGludmFsaWRfY2xlYXJfZmFpbGVkID0gVFJVRTsKCiAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDM2MCk7IC8qIGxvd2VyIGxlZnQgcXVhZCAqLwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgIkNsZWFyIHJlY3RhbmdsZSAzKHBvcywgbmVnKSBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAxMjApOyAvKiB1cHBlciBsZWZ0IHF1YWQgKi8KICAgIGlmKGludmFsaWRfY2xlYXJfZmFpbGVkKSB7CiAgICAgICAgLyogSWYgdGhlIG5lZ2F0aXZlIHJlY3RhbmdsZSB3YXMgcmVmdXNlZCwgdGhlIG90aGVyIHJlY3RhbmdsZXMgaW4gdGhlIGxpc3Qgc2hvdWxkbid0IGJlIGNsZWFyZWQgZWl0aGVyICovCiAgICAgICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgIkNsZWFyIHJlY3RhbmdsZSAxKHBvcywgcG9zKSBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgfSBlbHNlIHsKICAgICAgICAvKiBJZiB0aGUgbmVnYXRpdmUgcmVjdGFuZ2xlIHdhcyBkcm9wcGVkIHNpbGVudGx5LCB0aGUgY29ycmVjdCBvbmVzIGFyZSBjbGVhcmVkICovCiAgICAgICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIkNsZWFyIHJlY3RhbmdsZSAxKHBvcywgcG9zKSBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgfQogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAzNjApOyAvKiBsb3dlciByaWdodCBxdWFkICAqLwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgIkNsZWFyIHJlY3RhbmdsZSA0KE5VTEwpIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDEyMCk7IC8qIHVwcGVyIHJpZ2h0IHF1YWQgKi8KICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJDbGVhciByZWN0YW5nbGUgNChuZWcsIG5lZykgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKCiAgICAvKiBUZXN0IGhvdyB0aGUgdmlld3BvcnQgYWZmZWN0cyBjbGVhcnMgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmZmZmZiwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0Vmlld3BvcnQoZGV2aWNlLCAmb2xkX3ZwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfR2V0Vmlld3BvcnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgdnAuWCA9IDE2MDsKICAgIHZwLlkgPSAxMjA7CiAgICB2cC5XaWR0aCA9IDE2MDsKICAgIHZwLkhlaWdodCA9IDEyMDsKICAgIHZwLk1pblogPSAwLjA7CiAgICB2cC5NYXhaID0gMS4wOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZpZXdwb3J0KGRldmljZSwgJnZwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0Vmlld3BvcnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmYwMDAwZmYsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIHZwLlggPSAzMjA7CiAgICB2cC5ZID0gMjQwOwogICAgdnAuV2lkdGggPSAzMjA7CiAgICB2cC5IZWlnaHQgPSAyNDA7CiAgICB2cC5NaW5aID0gMC4wOwogICAgdnAuTWF4WiA9IDEuMDsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWaWV3cG9ydChkZXZpY2UsICZ2cCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZpZXdwb3J0IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgcmVjdFswXS54MSA9IDE2MDsKICAgIHJlY3RbMF0ueTEgPSAxMjA7CiAgICByZWN0WzBdLngyID0gNDgwOwogICAgcmVjdFswXS55MiA9IDM2MDsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDEsICZyZWN0WzBdLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmYwMGZmMDAsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWaWV3cG9ydChkZXZpY2UsICZvbGRfdnApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWaWV3cG9ydCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE1OCwgMTE4KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICIoMTU4LDExOCkgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MiwgMTE4KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICIoMTYyLDExOCkgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE1OCwgMTIyKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICIoMTU4LDEyMikgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MiwgMTIyKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICIoMTYyLDEyMikgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMTgsIDIzOCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAiKDMxOCwyMzgpIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMjIsIDIzOCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiKDMyMiwzMjgpIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMTgsIDI0Mik7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiKDMxOCwyNDIpIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMjIsIDI0Mik7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZjAwLCAiKDMyMiwyNDIpIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDc4LCAzNTgpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgIig0NzgsMzU4IGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODIsIDM1OCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiKDQ4MiwzNTgpIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0NzgsIDM2Mik7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiKDQ3OCwzNjIpIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODIsIDM2Mik7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiKDQ4MiwzNjIpIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmZmZmZmLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBzY2lzc29yLmxlZnQgPSAxNjA7CiAgICBzY2lzc29yLnJpZ2h0ID0gNDgwOwogICAgc2Npc3Nvci50b3AgPSAxMjA7CiAgICBzY2lzc29yLmJvdHRvbSA9IDM2MDsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTY2lzc29yUmVjdChkZXZpY2UsICZzY2lzc29yKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZV9TZXRTY2lzc29yUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX1NDSVNTT1JURVNURU5BQkxFLCBUUlVFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZV9TZXRTY2lzc29yUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmYwMGZmMDAsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMSwgJnJlY3RbMV0sIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmMDAwMCwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfU0NJU1NPUlRFU1RFTkFCTEUsIEZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZV9TZXRTY2lzc29yUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE1OCwgMTE4KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJQaXhlbCAxNTgvMTE4IGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjIsIDExOCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiUGl4ZWwgMTYyLzExOCBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTU4LCAxMjIpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgIlBpeGVsIDE1OC8xMjIgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MiwgMTIyKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsICJQaXhlbCAxNjIvMTIyIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTU4LCAzNTgpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgIlBpeGVsIDE1OC8zNTggaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MiwgMzU4KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJQaXhlbCAxNjIvMzU4IGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNTgsIDM1OCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiUGl4ZWwgMTU4LzM1OCBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYyLCAzNjIpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgIlBpeGVsIDE2Mi8zNjIgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0NzgsIDExOCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiUGl4ZWwgMTU4LzExOCBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDc4LCAxMjIpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgIlBpeGVsIDE2Mi8xMTggaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MiwgMTIyKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJQaXhlbCAxNTgvMTIyIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODIsIDM1OCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiUGl4ZWwgMTYyLzEyMiBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ3OCwgMzU4KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJQaXhlbCA0NzgvMzU4IGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0NzgsIDM2Mik7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiUGl4ZWwgNDc4LzExOCBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgyLCAzNTgpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgIlBpeGVsIDQ4Mi8xMjIgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MiwgMzYyKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJQaXhlbCA0ODIvMTIyIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzE4LCAyMzgpOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIlBpeGVsIDMxOC8yMzggaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDMxOCwgMjQyKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJQaXhlbCAzMTgvMjQyIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMjIsIDIzOCk7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZjAwLCAiUGl4ZWwgMzIyLzIzOCBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIyLCAyNDIpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgIlBpeGVsIDMyMi8yNDIgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19DT0xPUldSSVRFRU5BQkxFLCAmb2xkQ29sb3JXcml0ZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldFJlbmRlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfQ09MT1JXUklURUVOQUJMRSwgRDNEQ09MT1JXUklURUVOQUJMRV9SRUQpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmZmZmZmZmYsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0NPTE9SV1JJVEVFTkFCTEUsIG9sZENvbG9yV3JpdGUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKCiAgICAvKiBDb2xvcndyaXRlZW5hYmxlIGRvZXMgbm90IGFmZmVjdCB0aGUgY2xlYXIgKi8KICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDMyMCwgMjQwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJDb2xvciB3cml0ZSBwcm90ZWN0ZWQgY2xlYXIgcmV0dXJuZWQgY29sb3IgJTA4eFxuIiwgY29sb3IpOwp9Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBmbG9hdCBpbls0XTsKICAgIERXT1JEIG91dDsKfSB0ZXN0X2RhdGFfdDsKCi8qCiAqICBjNyAgICAgIG1vdmEgICAgQVJHQiAgICAgICAgICAgIG1vdiAgICAgQVJHQgogKiAtMi40ICAgICAtMiAgICAgIDB4MDBmZmZmMDAgICAgICAtMyAgICAgIDB4MDBmZjAwMDAKICogLTEuNiAgICAgLTIgICAgICAweDAwZmZmZjAwICAgICAgLTIgICAgICAweDAwZmZmZjAwCiAqIC0wLjQgICAgICAwICAgICAgMHgwMDAwZmZmZiAgICAgIC0xICAgICAgMHgwMDAwZmYwMAogKiAgMC40ICAgICAgMCAgICAgIDB4MDAwMGZmZmYgICAgICAgMCAgICAgIDB4MDAwMGZmZmYKICogIDEuNiAgICAgIDIgICAgICAweDAwZmYwMGZmICAgICAgIDEgICAgICAweDAwMDAwMGZmCiAqICAyLjQgICAgICAyICAgICAgMHgwMGZmMDBmZiAgICAgICAyICAgICAgMHgwMGZmMDBmZgogKi8Kc3RhdGljIHZvaWQgdGVzdF9tb3ZhKElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgc3RhdGljIGNvbnN0IERXT1JEIG1vdmFfdGVzdFtdID0gewogICAgICAgIDB4ZmZmZTAyMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzXzJfMCAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfcG9zaXRpb24gdjAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMCwgMHgzZjgwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZjgwMDAwMCwgLyogZGVmIGMwLCAxLjAsIDAuMCwgMC4wLCAxLjAgICAqLwogICAgICAgIDB4MDUwMDAwNTEsIDB4YTAwZjAwMDEsIDB4M2Y4MDAwMDAsIDB4M2Y4MDAwMDAsIDB4MDAwMDAwMDAsIDB4M2Y4MDAwMDAsIC8qIGRlZiBjMSwgMS4wLCAxLjAsIDAuMCwgMS4wICAgKi8KICAgICAgICAweDA1MDAwMDUxLCAweGEwMGYwMDAyLCAweDAwMDAwMDAwLCAweDNmODAwMDAwLCAweDAwMDAwMDAwLCAweDNmODAwMDAwLCAvKiBkZWYgYzIsIDAuMCwgMS4wLCAwLjAsIDEuMCAgICovCiAgICAgICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMywgMHgwMDAwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgLyogZGVmIGMzLCAwLjAsIDEuMCwgMS4wLCAxLjAgICAqLwogICAgICAgIDB4MDUwMDAwNTEsIDB4YTAwZjAwMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2Y4MDAwMDAsIDB4M2Y4MDAwMDAsIC8qIGRlZiBjNCwgMC4wLCAwLjAsIDEuMCwgMS4wICAgKi8KICAgICAgICAweDA1MDAwMDUxLCAweGEwMGYwMDA1LCAweDNmODAwMDAwLCAweDAwMDAwMDAwLCAweDNmODAwMDAwLCAweDNmODAwMDAwLCAvKiBkZWYgYzUsIDEuMCwgMC4wLCAxLjAsIDEuMCAgICovCiAgICAgICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwNiwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgLyogZGVmIGM2LCAxLjAsIDEuMCwgMS4wLCAxLjAgICAqLwogICAgICAgIDB4MDIwMDAwMmUsIDB4YjAwMTAwMDAsIDB4YTAwMDAwMDcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdmEgYTAueCwgYzcueCAgICAgICAgICAgICAgKi8KICAgICAgICAweDAzMDAwMDAxLCAweGQwMGYwMDAwLCAweGEwZTQyMDAzLCAweGIwMDAwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3Ygb0QwLCBjW2EwLnggKyAzXSAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAwMSwgMHhjMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9Qb3MsIHYwICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBzdGF0aWMgY29uc3QgRFdPUkQgbW92X3Rlc3RbXSA9IHsKICAgICAgICAweGZmZmUwMTAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2c18xXzEgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIHYwICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwNTEsIDB4YTAwZjAwMDAsIDB4M2Y4MDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2Y4MDAwMDAsIC8qIGRlZiBjMCwgMS4wLCAwLjAsIDAuMCwgMS4wICAgKi8KICAgICAgICAweDAwMDAwMDUxLCAweGEwMGYwMDAxLCAweDNmODAwMDAwLCAweDNmODAwMDAwLCAweDAwMDAwMDAwLCAweDNmODAwMDAwLCAvKiBkZWYgYzEsIDEuMCwgMS4wLCAwLjAsIDEuMCAgICovCiAgICAgICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMiwgMHgwMDAwMDAwMCwgMHgzZjgwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZjgwMDAwMCwgLyogZGVmIGMyLCAwLjAsIDEuMCwgMC4wLCAxLjAgICAqLwogICAgICAgIDB4MDAwMDAwNTEsIDB4YTAwZjAwMDMsIDB4MDAwMDAwMDAsIDB4M2Y4MDAwMDAsIDB4M2Y4MDAwMDAsIDB4M2Y4MDAwMDAsIC8qIGRlZiBjMywgMC4wLCAxLjAsIDEuMCwgMS4wICAgKi8KICAgICAgICAweDAwMDAwMDUxLCAweGEwMGYwMDA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNmODAwMDAwLCAweDNmODAwMDAwLCAvKiBkZWYgYzQsIDAuMCwgMC4wLCAxLjAsIDEuMCAgICovCiAgICAgICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwNSwgMHgzZjgwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgLyogZGVmIGM1LCAxLjAsIDAuMCwgMS4wLCAxLjAgICAqLwogICAgICAgIDB4MDAwMDAwNTEsIDB4YTAwZjAwMDYsIDB4M2Y4MDAwMDAsIDB4M2Y4MDAwMDAsIDB4M2Y4MDAwMDAsIDB4M2Y4MDAwMDAsIC8qIGRlZiBjNiwgMS4wLCAxLjAsIDEuMCwgMS4wICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweGIwMDEwMDAwLCAweGEwMDAwMDA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgYTAueCwgYzcueCAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHhkMDBmMDAwMCwgMHhhMGU0MjAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9EMCwgY1thMC54ICsgM10gICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4YzAwZjAwMDAsIDB4OTBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvUG9zLCB2MCAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB9OwoKICAgIHN0YXRpYyBjb25zdCB0ZXN0X2RhdGFfdCB0ZXN0X2RhdGFbMl1bNl0gPSB7CiAgICAgICAgewogICAgICAgICAgICB7ey0yLjRmLCAwLjBmLCAwLjBmLCAwLjBmfSwgMHgwMGZmMDAwMH0sCiAgICAgICAgICAgIHt7LTEuNmYsIDAuMGYsIDAuMGYsIDAuMGZ9LCAweDAwZmZmZjAwfSwKICAgICAgICAgICAge3stMC40ZiwgMC4wZiwgMC4wZiwgMC4wZn0sIDB4MDAwMGZmMDB9LAogICAgICAgICAgICB7eyAwLjRmLCAwLjBmLCAwLjBmLCAwLjBmfSwgMHgwMDAwZmZmZn0sCiAgICAgICAgICAgIHt7IDEuNmYsIDAuMGYsIDAuMGYsIDAuMGZ9LCAweDAwMDAwMGZmfSwKICAgICAgICAgICAge3sgMi40ZiwgMC4wZiwgMC4wZiwgMC4wZn0sIDB4MDBmZjAwZmZ9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIHt7LTIuNGYsIDAuMGYsIDAuMGYsIDAuMGZ9LCAweDAwZmZmZjAwfSwKICAgICAgICAgICAge3stMS42ZiwgMC4wZiwgMC4wZiwgMC4wZn0sIDB4MDBmZmZmMDB9LAogICAgICAgICAgICB7ey0wLjRmLCAwLjBmLCAwLjBmLCAwLjBmfSwgMHgwMDAwZmZmZn0sCiAgICAgICAgICAgIHt7IDAuNGYsIDAuMGYsIDAuMGYsIDAuMGZ9LCAweDAwMDBmZmZmfSwKICAgICAgICAgICAge3sgMS42ZiwgMC4wZiwgMC4wZiwgMC4wZn0sIDB4MDBmZjAwZmZ9LAogICAgICAgICAgICB7eyAyLjRmLCAwLjBmLCAwLjBmLCAwLjBmfSwgMHgwMGZmMDBmZn0KICAgICAgICB9CiAgICB9OwoKICAgIHN0YXRpYyBjb25zdCBmbG9hdCBxdWFkW11bM10gPSB7CiAgICAgICAgey0xLjBmLCAtMS4wZiwgMC4wZn0sCiAgICAgICAgey0xLjBmLCAgMS4wZiwgMC4wZn0sCiAgICAgICAgeyAxLjBmLCAtMS4wZiwgMC4wZn0sCiAgICAgICAgeyAxLjBmLCAgMS4wZiwgMC4wZn0sCiAgICB9OwoKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzW10gPSB7CiAgICAgICAgezAsIDAsIEQzRERFQ0xUWVBFX0ZMT0FUMywgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfUE9TSVRJT04sIDB9LAogICAgICAgIEQzRERFQ0xfRU5EKCkKICAgIH07CgogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICp2ZXJ0ZXhfZGVjbGFyYXRpb24gPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqbW92YV9zaGFkZXIgPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqbW92X3NoYWRlciA9IE5VTEw7CiAgICBIUkVTVUxUIGhyOwogICAgVUlOVCBpLCBqOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBtb3ZhX3Rlc3QsICZtb3ZhX3NoYWRlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiQ3JlYXRlVmVydGV4U2hhZGVyIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBtb3ZfdGVzdCwgJm1vdl9zaGFkZXIpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkNyZWF0ZVZlcnRleFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzLCAmdmVydGV4X2RlY2xhcmF0aW9uKTsKICAgIG9rKFNVQ0NFRURFRChociksICJDcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCB2ZXJ0ZXhfZGVjbGFyYXRpb24pOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgbW92X3NoYWRlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0VmVydGV4U2hhZGVyIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGZvcihqID0gMDsgaiA8IDI7ICsraikKICAgIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZih0ZXN0X2RhdGFbMF0pIC8gc2l6ZW9mKHRlc3RfZGF0YV90KSk7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIERXT1JEIGNvbG9yOwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlckNvbnN0YW50RihkZXZpY2UsIDcsIHRlc3RfZGF0YVtqXVtpXS5pbiwgMSk7CiAgICAgICAgICAgIG9rKFNVQ0NFRURFRChociksICJTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgICAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkJlZ2luU2NlbmUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsICZxdWFkWzBdLCAzICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgICAgIG9rKFNVQ0NFRURFRChociksICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgICAgIG9rKFNVQ0NFRURFRChociksICJFbmRTY2VuZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiUHJlc2VudCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMjAsIDI0MCk7CiAgICAgICAgICAgIG9rKGNvbG9yID09IHRlc3RfZGF0YVtqXVtpXS5vdXQsICJFeHBlY3RlZCBjb2xvciAlMDh4LCBnb3QgJTA4eCAoZm9yIGlucHV0ICVmLCBpbnN0cnVjdGlvbiAlcylcbiIsCiAgICAgICAgICAgICAgIHRlc3RfZGF0YVtqXVtpXS5vdXQsIGNvbG9yLCB0ZXN0X2RhdGFbal1baV0uaW5bMF0sIGogPT0gMCA/ICJtb3YiIDogIm1vdmEiKTsKCiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMCwgMC4wZiwgMCk7CiAgICAgICAgICAgIG9rKFNVQ0NFRURFRChociksICJDbGVhciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAgICAgfQogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBtb3ZhX3NoYWRlcik7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFZlcnRleFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFZlcnRleFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245X1JlbGVhc2UodmVydGV4X2RlY2xhcmF0aW9uKTsKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjlfUmVsZWFzZShtb3ZhX3NoYWRlcik7CiAgICBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5X1JlbGVhc2UobW92X3NoYWRlcik7Cn0KCnN0cnVjdCBzVmVydGV4IHsKICAgIGZsb2F0IHgsIHksIHo7CiAgICBEV09SRCBkaWZmdXNlOwogICAgRFdPUkQgc3BlY3VsYXI7Cn07CgpzdHJ1Y3Qgc1ZlcnRleFQgewogICAgZmxvYXQgeCwgeSwgeiwgcmh3OwogICAgRFdPUkQgZGlmZnVzZTsKICAgIERXT1JEIHNwZWN1bGFyOwp9OwoKc3RhdGljIHZvaWQgZm9nX3Rlc3QoSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlKQp7CiAgICBIUkVTVUxUIGhyOwogICAgRFdPUkQgY29sb3I7CiAgICBCWVRFIHIsIGcsIGI7CiAgICBmbG9hdCBzdGFydCA9IDAuMGYsIGVuZCA9IDEuMGY7CiAgICBEM0RDQVBTOSBjYXBzOwogICAgaW50IGk7CgogICAgLyogR2V0cyBmdWxsIHogYmFzZWQgZm9nIHdpdGggbGluZWFyIGZvZywgbm8gZm9nIHdpdGggc3BlY3VsYXIgY29sb3IgKi8KICAgIHN0cnVjdCBzVmVydGV4IHVuc3RyYW5zZm9ybWVkXzFbXSA9IHsKICAgICAgICB7LTEsICAgIC0xLCAgIDAuMWYsICAgICAgICAgMHhGRkZGMDAwMCwgICAgIDB4RkYwMDAwMDAgIH0sCiAgICAgICAgey0xLCAgICAgMCwgICAwLjFmLCAgICAgICAgIDB4RkZGRjAwMDAsICAgICAweEZGMDAwMDAwICB9LAogICAgICAgIHsgMCwgICAgIDAsICAgMC4xZiwgICAgICAgICAweEZGRkYwMDAwLCAgICAgMHhGRjAwMDAwMCAgfSwKICAgICAgICB7IDAsICAgIC0xLCAgIDAuMWYsICAgICAgICAgMHhGRkZGMDAwMCwgICAgIDB4RkYwMDAwMDAgIH0sCiAgICB9OwogICAgLyogT2ssIEkgYW0gdG9vIGxhenkgdG8gZGVhbCB3aXRoIHRyYW5zZm9ybSBtYXRyaWNlcyAqLwogICAgc3RydWN0IHNWZXJ0ZXggdW5zdHJhbnNmb3JtZWRfMltdID0gewogICAgICAgIHstMSwgICAgIDAsICAgMS4wZiwgICAgICAgICAweEZGRkYwMDAwLCAgICAgMHhGRjAwMDAwMCAgfSwKICAgICAgICB7LTEsICAgICAxLCAgIDEuMGYsICAgICAgICAgMHhGRkZGMDAwMCwgICAgIDB4RkYwMDAwMDAgIH0sCiAgICAgICAgeyAwLCAgICAgMSwgICAxLjBmLCAgICAgICAgIDB4RkZGRjAwMDAsICAgICAweEZGMDAwMDAwICB9LAogICAgICAgIHsgMCwgICAgIDAsICAgMS4wZiwgICAgICAgICAweEZGRkYwMDAwLCAgICAgMHhGRjAwMDAwMCAgfSwKICAgIH07CiAgICAvKiBVbnRyYW5zZm9ybWVkIG9uZXMuIEdpdmUgdGhlbSBhIGRpZmZlcmVudCBkaWZmdXNlIGNvbG9yIHRvIG1ha2UgdGhlIHRlc3QgbG9vawogICAgICogbmljZXIuIEl0IGFsc28gbWFrZXMgbWFraW5nIHN1cmUgdGhhdCB0aGV5IGFyZSBkcmF3biBjb3JyZWN0bHkgZWFzaWVyLgogICAgICovCiAgICBzdHJ1Y3Qgc1ZlcnRleFQgdHJhbnNmb3JtZWRfMVtdID0gewogICAgICAgIHszMjAsICAgIDAsICAgMS4wZiwgMS4wZiwgICAweEZGRkZGRjAwLCAgICAgMHhGRjAwMDAwMCAgfSwKICAgICAgICB7NjQwLCAgICAwLCAgIDEuMGYsIDEuMGYsICAgMHhGRkZGRkYwMCwgICAgIDB4RkYwMDAwMDAgIH0sCiAgICAgICAgezY0MCwgIDI0MCwgICAxLjBmLCAxLjBmLCAgIDB4RkZGRkZGMDAsICAgICAweEZGMDAwMDAwICB9LAogICAgICAgIHszMjAsICAyNDAsICAgMS4wZiwgMS4wZiwgICAweEZGRkZGRjAwLCAgICAgMHhGRjAwMDAwMCAgfSwKICAgIH07CiAgICBzdHJ1Y3Qgc1ZlcnRleFQgdHJhbnNmb3JtZWRfMltdID0gewogICAgICAgIHszMjAsICAyNDAsICAgMS4wZiwgMS4wZiwgICAweEZGRkZGRjAwLCAgICAgMHhGRjAwMDAwMCAgfSwKICAgICAgICB7NjQwLCAgMjQwLCAgIDEuMGYsIDEuMGYsICAgMHhGRkZGRkYwMCwgICAgIDB4RkYwMDAwMDAgIH0sCiAgICAgICAgezY0MCwgIDQ4MCwgICAxLjBmLCAxLjBmLCAgIDB4RkZGRkZGMDAsICAgICAweEZGMDAwMDAwICB9LAogICAgICAgIHszMjAsICA0ODAsICAgMS4wZiwgMS4wZiwgICAweEZGRkZGRjAwLCAgICAgMHhGRjAwMDAwMCAgfSwKICAgIH07CiAgICBzdHJ1Y3QgdmVydGV4IHJldl9mb2dfcXVhZHNbXSA9IHsKICAgICAgIHstMS4wLCAgIC0xLjAsICAgMC4xLCAgICAweDAwMDAwMGZmfSwKICAgICAgIHstMS4wLCAgICAwLjAsICAgMC4xLCAgICAweDAwMDAwMGZmfSwKICAgICAgIHsgMC4wLCAgICAwLjAsICAgMC4xLCAgICAweDAwMDAwMGZmfSwKICAgICAgIHsgMC4wLCAgIC0xLjAsICAgMC4xLCAgICAweDAwMDAwMGZmfSwKCiAgICAgICB7IDAuMCwgICAtMS4wLCAgIDAuOSwgICAgMHgwMDAwMDBmZn0sCiAgICAgICB7IDAuMCwgICAgMC4wLCAgIDAuOSwgICAgMHgwMDAwMDBmZn0sCiAgICAgICB7IDEuMCwgICAgMC4wLCAgIDAuOSwgICAgMHgwMDAwMDBmZn0sCiAgICAgICB7IDEuMCwgICAtMS4wLCAgIDAuOSwgICAgMHgwMDAwMDBmZn0sCgogICAgICAgeyAwLjAsICAgIDAuMCwgICAwLjQsICAgIDB4MDAwMDAwZmZ9LAogICAgICAgeyAwLjAsICAgIDEuMCwgICAwLjQsICAgIDB4MDAwMDAwZmZ9LAogICAgICAgeyAxLjAsICAgIDEuMCwgICAwLjQsICAgIDB4MDAwMDAwZmZ9LAogICAgICAgeyAxLjAsICAgIDAuMCwgICAwLjQsICAgIDB4MDAwMDAwZmZ9LAoKICAgICAgIHstMS4wLCAgICAwLjAsICAgMC43LCAgICAweDAwMDAwMGZmfSwKICAgICAgIHstMS4wLCAgICAxLjAsICAgMC43LCAgICAweDAwMDAwMGZmfSwKICAgICAgIHsgMC4wLCAgICAxLjAsICAgMC43LCAgICAweDAwMDAwMGZmfSwKICAgICAgIHsgMC4wLCAgICAwLjAsICAgMC43LCAgICAweDAwMDAwMGZmfSwKICAgIH07CiAgICBXT1JEIEluZGljZXNbXSA9IHswLCAxLCAyLCAyLCAzLCAwfTsKCiAgICBtZW1zZXQoJmNhcHMsIDAsIHNpemVvZihjYXBzKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0RGV2aWNlQ2FwcyhkZXZpY2UsICZjYXBzKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfR2V0RGV2aWNlQ2FwcyByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmMDBmZiwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgLyogU2V0dXAgaW5pdGlhbCBzdGF0ZXM6IE5vIGxpZ2h0aW5nLCBmb2cgb24sIGZvZyBjb2xvciAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfTElHSFRJTkcsIEZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlR1cm5pbmcgb2ZmIGxpZ2h0aW5nIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfRk9HRU5BQkxFLCBUUlVFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlR1cm5pbmcgb24gZm9nIGNhbGN1bGF0aW9ucyByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR0NPTE9SLCAweEZGMDBGRjAwIC8qIEEgbmljZSBncmVlbiAqLyk7CiAgICBvayhociA9PSBEM0RfT0ssICJUdXJuaW5nIG9uIGZvZyBjYWxjdWxhdGlvbnMgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgLyogRmlyc3QgdGVzdDogQm90aCB0YWJsZSBmb2cgYW5kIHZlcnRleCBmb2cgb2ZmICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19GT0dUQUJMRU1PREUsIEQzREZPR19OT05FKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlR1cm5pbmcgb2ZmIHRhYmxlIGZvZyByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1ZFUlRFWE1PREUsIEQzREZPR19OT05FKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlR1cm5pbmcgb2ZmIHRhYmxlIGZvZyByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAvKiBTdGFydCA9IDAsIGVuZCA9IDEuIFNob3VsZCBiZSBkZWZhdWx0LCBidXQgc2V0IHRoZW0gKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1NUQVJULCAqKChEV09SRCAqKSAmc3RhcnQpKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlNldHRpbmcgZm9nIHN0YXJ0IHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfRk9HRU5ELCAqKChEV09SRCAqKSAmZW5kKSk7CiAgICBvayhociA9PSBEM0RfT0ssICJTZXR0aW5nIGZvZyBzdGFydCByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBpZihJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKSA9PSBEM0RfT0spCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVogfCBEM0RGVkZfRElGRlVTRSB8IEQzREZWRl9TUEVDVUxBUik7CiAgICAgICAgb2soIGhyID09IEQzRF9PSywgIlNldEZWRiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICAvKiBVbnRyYW5zZm9ybWVkLCB2ZXJ0ZXggZm9nID0gTk9ORSwgdGFibGUgZm9nID0gTk9ORTogUmVhZCB0aGUgZm9nIHdlaWdodGluZyBmcm9tIHRoZSBzcGVjdWxhciBjb2xvciAqLwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3SW5kZXhlZFByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVMSVNULCAwIC8qIE1pbkluZGV4ICovLCA0IC8qIE51bVZlcnRzICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLypQcmltQ291bnQgKi8sIEluZGljZXMsIEQzREZNVF9JTkRFWDE2LCB1bnN0cmFuc2Zvcm1lZF8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnN0cmFuc2Zvcm1lZF8xWzBdKSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd0luZGV4ZWRQcmltaXRpdmVVUCByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgLyogVGhhdCBtYWtlcyBpdCB1c2UgdGhlIFogdmFsdWUgKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19GT0dWRVJURVhNT0RFLCBEM0RGT0dfTElORUFSKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJUdXJuaW5nIG9mZiB0YWJsZSBmb2cgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgLyogVW50cmFuc2Zvcm1lZCwgdmVydGV4IGZvZyAhPSBub25lIChvciB0YWJsZSBmb2cgIT0gbm9uZSk6CiAgICAgICAgICogVXNlIHRoZSBaIHZhbHVlIGFzIGlucHV0IGludG8gdGhlIGVxdWF0aW9uCiAgICAgICAgICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRUxJU1QsIDAgLyogTWluSW5kZXggKi8sIDQgLyogTnVtVmVydHMgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAvKlByaW1Db3VudCAqLywgSW5kaWNlcywgRDNERk1UX0lOREVYMTYsIHVuc3RyYW5zZm9ybWVkXzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVuc3RyYW5zZm9ybWVkXzFbMF0pKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3SW5kZXhlZFByaW1pdGl2ZVVQIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICAvKiB0cmFuc2Zvcm1lZCB2ZXJ0cyAqLwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaUkhXIHwgRDNERlZGX0RJRkZVU0UgfCBEM0RGVkZfU1BFQ1VMQVIpOwogICAgICAgIG9rKCBociA9PSBEM0RfT0ssICJTZXRGVkYgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgLyogVHJhbnNmb3JtZWQsIHZlcnRleCBmb2cgIT0gTk9ORSwgcGl4ZWwgZm9nID09IE5PTkU6IFVzZSBzcGVjdWxhciBjb2xvciBhbHBoYSBjb21wb25lbnQgKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFTElTVCwgMCAvKiBNaW5JbmRleCAqLywgNCAvKiBOdW1WZXJ0cyAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC8qUHJpbUNvdW50ICovLCBJbmRpY2VzLCBEM0RGTVRfSU5ERVgxNiwgdHJhbnNmb3JtZWRfMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhbnNmb3JtZWRfMVswXSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdJbmRleGVkUHJpbWl0aXZlVVAgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1RBQkxFTU9ERSwgRDNERk9HX0xJTkVBUik7CiAgICAgICAgb2soIGhyID09IEQzRF9PSywgIlNldHRpbmcgZm9nIHRhYmxlIG1vZGUgdG8gRDNERk9HX0xJTkVBUiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICAvKiBUcmFuc2Zvcm1lZCwgdGFibGUgZm9nICE9IG5vbmUsIHZlcnRleCBhbnl0aGluZzogVXNlIFogdmFsdWUgYXMgaW5wdXQgdG8gdGhlIGZvZwogICAgICAgICAqIGVxdWF0aW9uCiAgICAgICAgICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRUxJU1QsIDAgLyogTWluSW5kZXggKi8sIDQgLyogTnVtVmVydHMgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAvKlByaW1Db3VudCAqLywgSW5kaWNlcywgRDNERk1UX0lOREVYMTYsIHRyYW5zZm9ybWVkXzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYW5zZm9ybWVkXzJbMF0pKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgb2soRkFMU0UsICJCZWdpblNjZW5lIGZhaWxlZFxuIik7CiAgICB9CgogICAgSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDM2MCk7CiAgICBvayhjb2xvciA9PSAweDAwRkYwMDAwLCAiVW50cmFuc2Zvcm1lZCB2ZXJ0ZXggd2l0aCBubyB0YWJsZSBvciB2ZXJ0ZXggZm9nIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICBvayhjb2xvciA9PSAweDAwMDBGRjAwLCAiVW50cmFuc2Zvcm1lZCB2ZXJ0ZXggd2l0aCBsaW5lYXIgdmVydGV4IGZvZyBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAxMjApOwogICAgb2soY29sb3IgPT0gMHgwMEZGRkYwMCwgIlRyYW5zZm9ybWVkIHZlcnRleCB3aXRoIGxpbmVhciB2ZXJ0ZXggZm9nIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBpZihjYXBzLlJhc3RlckNhcHMgJiBEM0RQUkFTVEVSQ0FQU19GT0dUQUJMRSkKICAgIHsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDM2MCk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMDAwRkYwMCwgIlRyYW5zZm9ybWVkIHZlcnRleCB3aXRoIGxpbmVhciB0YWJsZSBmb2cgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvKiBXaXRob3V0IGZvZyB0YWJsZSBzdXBwb3J0IHRoZSB2ZXJ0ZXggZm9nIGlzIHN0aWxsIGFwcGxpZWQsIGV2ZW4gdGhvdWdoIHRhYmxlIGZvZyBpcyB0dXJuZWQgb24uCiAgICAgICAgICogVGhlIHNldHRpbmdzIGFib3ZlIHJlc3VsdCBpbiBubyBmb2dnaW5nIHdpdGggdmVydGV4IGZvZwogICAgICAgICAqLwogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMTIwKTsKICAgICAgICBvayhjb2xvciA9PSAweDAwRkZGRjAwLCAiVHJhbnNmb3JtZWQgdmVydGV4IHdpdGggbGluZWFyIHZlcnRleCBmb2cgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgICAgICB0cmFjZSgiSW5mbzogVGFibGUgZm9nIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2VcbiIpOwogICAgfQoKICAgIC8qIE5vdyB0ZXN0IHRoZSBzcGVjaWFsIGNhc2UgZm9nc3RhcnQgPT0gZm9nZW5kICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmYwMDAwZmYsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGlmKElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpID09IEQzRF9PSykKICAgIHsKICAgICAgICBzdGFydCA9IDUxMjsKICAgICAgICBlbmQgPSA1MTI7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfRk9HU1RBUlQsICooKERXT1JEICopICZzdGFydCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIlNldHRpbmcgZm9nIHN0YXJ0IHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR0VORCwgKigoRFdPUkQgKikgJmVuZCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIlNldHRpbmcgZm9nIHN0YXJ0IHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWiB8IEQzREZWRl9ESUZGVVNFIHwgRDNERlZGX1NQRUNVTEFSKTsKICAgICAgICBvayggaHIgPT0gRDNEX09LLCAiU2V0RlZGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1ZFUlRFWE1PREUsIEQzREZPR19MSU5FQVIpOwogICAgICAgIG9rKCBociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1RBQkxFTU9ERSwgRDNERk9HX05PTkUpOwogICAgICAgIG9rKCBociA9PSBEM0RfT0ssICJTZXR0aW5nIGZvZyB0YWJsZSBtb2RlIHRvIEQzREZPR19MSU5FQVIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIC8qIFVudHJhbnNmb3JtZWQgdmVydGV4LCB6IGNvb3JkID0gMC4xLCBmb2dzdGFydCA9IDUxMiwgZm9nZW5kID0gNTEyLiBXb3VsZCByZXN1bHQgaW4KICAgICAgICAgKiBhIGNvbXBsZXRlbHkgZm9nLWZyZWUgcHJpbWl0aXZlIGJlY2F1c2Ugc3RhcnQgPiB6Y29vcmQsIGJ1dCBiZWNhdXNlIHN0YXJ0ID09IGVuZCwgdGhlIHByaW1pdGl2ZQogICAgICAgICAqIGlzIGZ1bGx5IGNvdmVyZWQgYnkgZm9nLiBUaGUgc2FtZSBoYXBwZW5zIHRvIHRoZSAybmQgdW50cmFuc2Zvcm1lZCBxdWFkIHdpdGggeiA9IDEuMC4KICAgICAgICAgKiBUaGUgdGhpcmQgdHJhbnNmb3JtZWQgcXVhZCByZW1haW5zIHVuZm9nZ2VkIGJlY2F1c2UgdGhlIGZvZ2Nvb3JkcyBhcmUgcmVhZCBmcm9tIHRoZSBzcGVjdWxhcgogICAgICAgICAqIGNvbG9yIGFuZCBoYXMgZml4ZWQgZm9nc3RhcnQgYW5kIGZvZ2VuZC4KICAgICAgICAgKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFTElTVCwgMCAvKiBNaW5JbmRleCAqLywgNCAvKiBOdW1WZXJ0cyAqLywKICAgICAgICAgICAgICAgIDIgLypQcmltQ291bnQgKi8sIEluZGljZXMsIEQzREZNVF9JTkRFWDE2LCB1bnN0cmFuc2Zvcm1lZF8xLAogICAgICAgICAgICAgICAgc2l6ZW9mKHVuc3RyYW5zZm9ybWVkXzFbMF0pKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3SW5kZXhlZFByaW1pdGl2ZVVQIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3SW5kZXhlZFByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVMSVNULCAwIC8qIE1pbkluZGV4ICovLCA0IC8qIE51bVZlcnRzICovLAogICAgICAgICAgICAgICAgMiAvKlByaW1Db3VudCAqLywgSW5kaWNlcywgRDNERk1UX0lOREVYMTYsIHVuc3RyYW5zZm9ybWVkXzIsCiAgICAgICAgICAgICAgICBzaXplb2YodW5zdHJhbnNmb3JtZWRfMVswXSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdJbmRleGVkUHJpbWl0aXZlVVAgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaUkhXIHwgRDNERlZGX0RJRkZVU0UgfCBEM0RGVkZfU1BFQ1VMQVIpOwogICAgICAgIG9rKCBociA9PSBEM0RfT0ssICJTZXRGVkYgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgLyogVHJhbnNmb3JtZWQsIHZlcnRleCBmb2cgIT0gTk9ORSwgcGl4ZWwgZm9nID09IE5PTkU6IFVzZSBzcGVjdWxhciBjb2xvciBhbHBoYSBjb21wb25lbnQgKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFTElTVCwgMCAvKiBNaW5JbmRleCAqLywgNCAvKiBOdW1WZXJ0cyAqLywKICAgICAgICAgICAgICAgIDIgLypQcmltQ291bnQgKi8sIEluZGljZXMsIEQzREZNVF9JTkRFWDE2LCB0cmFuc2Zvcm1lZF8xLAogICAgICAgICAgICAgICAgc2l6ZW9mKHRyYW5zZm9ybWVkXzFbMF0pKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3SW5kZXhlZFByaW1pdGl2ZVVQIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJFbmRTY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBvayhGQUxTRSwgIkJlZ2luU2NlbmUgZmFpbGVkXG4iKTsKICAgIH0KICAgIElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOwogICAgb2soY29sb3IgPT0gMHgwMDAwRkYwMCwgIlVudHJhbnNmb3JtZWQgdmVydGV4IHdpdGggdmVydGV4IGZvZyBhbmQgeiA9IDAuMSBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAxMjApOwogICAgb2soY29sb3IgPT0gMHgwMDAwRkYwMCwgIlVudHJhbnNmb3JtZWQgdmVydGV4IHdpdGggdmVydGV4IGZvZyBhbmQgeiA9IDEuMCBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAxMjApOwogICAgb2soY29sb3IgPT0gMHgwMEZGRkYwMCwgIlRyYW5zZm9ybWVkIHZlcnRleCB3aXRoIGxpbmVhciB2ZXJ0ZXggZm9nIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CgogICAgLyogVGVzdCAicmV2ZXJzZWQiIGZvZyB3aXRob3V0IHNoYWRlcnMuIFdpdGggc2hhZGVycyB0aGlzIGZhaWxzIG9uIGEgZmV3IFdpbmRvd3MgRDNEIGltcGxlbWVudGF0aW9ucywKICAgICAqIGJ1dCB3aXRob3V0IHNoYWRlcnMgaXQgc2VlbXMgdG8gd29yayBldmVyeXdoZXJlCiAgICAgKi8KICAgIGVuZCA9IDAuMjsKICAgIHN0YXJ0ID0gMC44OwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfRk9HU1RBUlQsICooKERXT1JEICopICZzdGFydCkpOwogICAgb2soaHIgPT0gRDNEX09LLCAiU2V0dGluZyBmb2cgc3RhcnQgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19GT0dFTkQsICooKERXT1JEICopICZlbmQpKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlNldHRpbmcgZm9nIGVuZCByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaIHwgRDNERlZGX0RJRkZVU0UpOwogICAgb2soIGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0RlZGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIFRlc3QgcmV2ZXJzZWQgZm9nIHdpdGhvdXQgc2hhZGVycy4gQVRJIGNhcmRzIGhhdmUgcHJvYmxlbXMgd2l0aCByZXZlcnNlZCBmb2cgYW5kIHNoYWRlcnMsIHNvCiAgICAgKiBpdCBkb2Vzbid0IHNlZW0gdmVyeSBpbXBvcnRhbnQgZm9yIGdhbWVzLiBBVEkgY2FyZHMgYWxzbyBoYXZlIHByb2JsZW1zIHdpdGggcmV2ZXJzZWQgdGFibGUgZm9nLAogICAgICogc28gc2tpcCB0aGlzIGZvciBub3cKICAgICAqLwogICAgZm9yKGkgPSAwOyBpIDwgMSAvKjIgLSBUYWJsZSBmb2cgdGVzdCBkaXNhYmxlZCwgZmFpbHMgb24gQVRJICovOyBpKyspIHsKICAgICAgICBjb25zdCBjaGFyICptb2RlID0gKGkgPyAidGFibGUiIDogInZlcnRleCIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmMDAwMCwgMC4wLCAwKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1ZFUlRFWE1PREUsIGkgPT0gMCA/IEQzREZPR19MSU5FQVIgOiBEM0RGT0dfTk9ORSk7CiAgICAgICAgb2soIGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfRk9HVEFCTEVNT0RFLCBpID09IDAgPyBEM0RGT0dfTk9ORSA6IEQzREZPR19MSU5FQVIpOwogICAgICAgIG9rKCBociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICAgICAgb2soIGhyID09IEQzRF9PSywgIklEaXJlY3QzREREZXZpY2U5X0JlZ2luU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaWYoU1VDQ0VFREVEKGhyKSkgewogICAgICAgICAgICBXT1JEIEluZGljZXMyW10gPSB7IDAsICAxLCAgMiwgIDIsICAzLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsICA1LCAgNiwgIDYsICA3LCA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsICA5LCAxMCwgMTAsIDExLCA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDEzLCAxNCwgMTQsIDE1LCAxMn07CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFTElTVCwgMCAvKiBNaW5JbmRleCAqLywKICAgICAgICAgICAgICAgICAgICAxNiAvKiBOdW1WZXJ0cyAqLywgOCAvKlByaW1Db3VudCAqLywgSW5kaWNlczIsIEQzREZNVF9JTkRFWDE2LCByZXZfZm9nX3F1YWRzLAogICAgICAgICAgICAgICAgICAgIHNpemVvZihyZXZfZm9nX3F1YWRzWzBdKSk7CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICAgICAgb2soIGhyID09IEQzRF9PSywgIklEaXJlY3QzREREZXZpY2U5X0VuZFNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIH0KICAgICAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDM2MCk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMDAwRkYwMCwgIlJldmVyc2VkICVzIGZvZzogej0wLjEgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmYwMFxuIiwgbW9kZSwgY29sb3IpOwoKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICAgICAgciA9IChjb2xvciAmIDB4MDBmZjAwMDApID4+IDE2OwogICAgICAgIGcgPSAoY29sb3IgJiAweDAwMDBmZjAwKSA+PiAgODsKICAgICAgICBiID0gKGNvbG9yICYgMHgwMDAwMDBmZik7CiAgICAgICAgb2sociA9PSAweDAwICYmIGcgPj0gMHgyOSAmJiBnIDw9IDB4MmQgJiYgYiA+PSAweGQyICYmIGIgPD0gMHhkNiwKICAgICAgICAgICAiUmV2ZXJzZWQgJXMgZm9nOiB6PTAuNyBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZFxuIiwgbW9kZSwgY29sb3IpOwoKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDEyMCk7CiAgICAgICAgciA9IChjb2xvciAmIDB4MDBmZjAwMDApID4+IDE2OwogICAgICAgIGcgPSAoY29sb3IgJiAweDAwMDBmZjAwKSA+PiAgODsKICAgICAgICBiID0gKGNvbG9yICYgMHgwMDAwMDBmZik7CiAgICAgICAgb2sociA9PSAweDAwICYmIGcgPj0gMHhhOCAmJiBnIDw9IDB4YWMgJiYgYiA+PSAweDUzICYmIGIgPD0gMHg1NywKICAgICAgICAgICAiUmV2ZXJzZWQgJXMgZm9nOiB6PTAuNCBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZFxuIiwgbW9kZSwgY29sb3IpOwoKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDM2MCk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgIlJldmVyc2VkICVzIGZvZzogej0wLjkgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDBmZlxuIiwgbW9kZSwgY29sb3IpOwoKICAgICAgICBpZighKGNhcHMuUmFzdGVyQ2FwcyAmIEQzRFBSQVNURVJDQVBTX0ZPR1RBQkxFKSkgewogICAgICAgICAgICBza2lwKCJEM0RQUkFTVEVSQ0FQU19GT0dUQUJMRSBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyByZXZlcnNlZCB0YWJsZSBmb2cgdGVzdFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIC8qIFR1cm4gb2ZmIHRoZSBmb2cgbWFzdGVyIHN3aXRjaCB0byBhdm9pZCBjb25mdXNpbmcgb3RoZXIgdGVzdHMgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR0VOQUJMRSwgRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiVHVybmluZyBvZmYgZm9nIGNhbGN1bGF0aW9ucyByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIHN0YXJ0ID0gMC4wOwogICAgZW5kID0gMS4wOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfRk9HU1RBUlQsICooKERXT1JEICopICZzdGFydCkpOwogICAgb2soaHIgPT0gRDNEX09LLCAiU2V0dGluZyBmb2cgc3RhcnQgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19GT0dFTkQsICooKERXT1JEICopICZlbmQpKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlNldHRpbmcgZm9nIGVuZCByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1ZFUlRFWE1PREUsIEQzREZPR19MSU5FQVIpOwogICAgb2soIGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19GT0dUQUJMRU1PREUsIEQzREZPR19MSU5FQVIpOwogICAgb2soIGhyID09IEQzRF9PSywgIlNldHRpbmcgZm9nIHRhYmxlIG1vZGUgdG8gRDNERk9HX0xJTkVBUiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKfQoKLyogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBiZWhhdmlvdXIgb2YgY3ViZSBtYXBzIHdydC4gdGV4dHVyZSB3cmFwcGluZy4KICogRDNEIGN1YmUgbWFwIHdyYXBwaW5nIGFsd2F5cyBiZWhhdmVzIGxpa2UgR0xfQ0xBTVBfVE9fRURHRSwKICogcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIGFkZHJlc3NpbmcgbW9kZSBzZXQuICovCnN0YXRpYyB2b2lkIHRlc3RfY3ViZV93cmFwKElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgc3RhdGljIGNvbnN0IGZsb2F0IHF1YWRbXVs2XSA9IHsKICAgICAgICB7LTEuMGYsIC0xLjBmLCAwLjBmLCAxLjBmLCAxLjBmLCAxLjBmfSwKICAgICAgICB7LTEuMGYsICAxLjBmLCAwLjBmLCAxLjBmLCAxLjBmLCAxLjBmfSwKICAgICAgICB7IDEuMGYsIC0xLjBmLCAwLjBmLCAxLjBmLCAxLjBmLCAxLjBmfSwKICAgICAgICB7IDEuMGYsICAxLjBmLCAwLjBmLCAxLjBmLCAxLjBmLCAxLjBmfSwKICAgIH07CgogICAgc3RhdGljIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xfZWxlbWVudHNbXSA9IHsKICAgICAgICB7MCwgMCwgIEQzRERFQ0xUWVBFX0ZMT0FUMywgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfUE9TSVRJT04sIDB9LAogICAgICAgIHswLCAxMiwgRDNEREVDTFRZUEVfRkxPQVQzLCBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9URVhDT09SRCwgMH0sCiAgICAgICAgRDNEREVDTF9FTkQoKQogICAgfTsKCiAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgICAgICBEM0RURVhUVVJFQUREUkVTUyBtb2RlOwogICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICB9IGFkZHJlc3NfbW9kZXNbXSA9IHsKICAgICAgICB7RDNEVEFERFJFU1NfV1JBUCwgIkQzRFRBRERSRVNTX1dSQVAifSwKICAgICAgICB7RDNEVEFERFJFU1NfTUlSUk9SLCAiRDNEVEFERFJFU1NfTUlSUk9SIn0sCiAgICAgICAge0QzRFRBRERSRVNTX0NMQU1QLCAiRDNEVEFERFJFU1NfQ0xBTVAifSwKICAgICAgICB7RDNEVEFERFJFU1NfQk9SREVSLCAiRDNEVEFERFJFU1NfQk9SREVSIn0sCiAgICAgICAge0QzRFRBRERSRVNTX01JUlJPUk9OQ0UsICJEM0RUQUREUkVTU19NSVJST1JPTkNFIn0sCiAgICB9OwoKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqdmVydGV4X2RlY2xhcmF0aW9uID0gTlVMTDsKICAgIElEaXJlY3QzREN1YmVUZXh0dXJlOSAqdGV4dHVyZSA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZSA9IE5VTEw7CiAgICBEM0RMT0NLRURfUkVDVCBsb2NrZWRfcmVjdDsKICAgIEhSRVNVTFQgaHI7CiAgICBVSU5UIHg7CiAgICBJTlQgeSwgZmFjZTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzLCAmdmVydGV4X2RlY2xhcmF0aW9uKTsKICAgIG9rKFNVQ0NFRURFRChociksICJDcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIHZlcnRleF9kZWNsYXJhdGlvbik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0VmVydGV4RGVjbGFyYXRpb24gZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZShkZXZpY2UsIDEyOCwgMTI4LAogICAgICAgICAgICBEM0RGTVRfQThSOEc4QjgsIEQzRFBPT0xfU1lTVEVNTUVNLCAmc3VyZmFjZSwgTlVMTCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgIGhyID0gSURpcmVjdDNEU3VyZmFjZTlfTG9ja1JlY3Qoc3VyZmFjZSwgJmxvY2tlZF9yZWN0LCBOVUxMLCAwKTsKICAgIG9rKFNVQ0NFRURFRChociksICJMb2NrUmVjdCBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICBmb3IgKHkgPSAwOyB5IDwgMTI4OyArK3kpCiAgICB7CiAgICAgICAgRFdPUkQgKnB0ciA9IChEV09SRCAqKSgoKEJZVEUgKilsb2NrZWRfcmVjdC5wQml0cykgKyAoeSAqIGxvY2tlZF9yZWN0LlBpdGNoKSk7CiAgICAgICAgZm9yICh4ID0gMDsgeCA8IDY0OyArK3gpCiAgICAgICAgewogICAgICAgICAgICAqcHRyKysgPSAweGZmZmYwMDAwOwogICAgICAgIH0KICAgICAgICBmb3IgKHggPSA2NDsgeCA8IDEyODsgKyt4KQogICAgICAgIHsKICAgICAgICAgICAgKnB0cisrID0gMHhmZjAwMDBmZjsKICAgICAgICB9CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0RTdXJmYWNlOV9VbmxvY2tSZWN0KHN1cmZhY2UpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlVubG9ja1JlY3QgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZUN1YmVUZXh0dXJlKGRldmljZSwgMTI4LCAxLCAwLCBEM0RGTVRfQThSOEc4QjgsCiAgICAgICAgICAgIEQzRFBPT0xfREVGQVVMVCwgJnRleHR1cmUsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkNyZWF0ZUN1YmVUZXh0dXJlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgIC8qIENyZWF0ZSBjdWJlIGZhY2VzICovCiAgICBmb3IgKGZhY2UgPSAwOyBmYWNlIDwgNjsgKytmYWNlKQogICAgewogICAgICAgIElEaXJlY3QzRFN1cmZhY2U5ICpmYWNlX3N1cmZhY2UgPSBOVUxMOwoKICAgICAgICBocj0gSURpcmVjdDNEQ3ViZVRleHR1cmU5X0dldEN1YmVNYXBTdXJmYWNlKHRleHR1cmUsIGZhY2UsIDAsICZmYWNlX3N1cmZhY2UpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJHZXRDdWJlTWFwU3VyZmFjZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1VwZGF0ZVN1cmZhY2UoZGV2aWNlLCBzdXJmYWNlLCBOVUxMLCBmYWNlX3N1cmZhY2UsIE5VTEwpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJVcGRhdGVTdXJmYWNlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgICAgICBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGZhY2Vfc3VyZmFjZSk7CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAwLCAoSURpcmVjdDNEQmFzZVRleHR1cmU5ICopdGV4dHVyZSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0VGV4dHVyZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9NSU5GSUxURVIsIEQzRFRFWEZfTElORUFSKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRTYW1wbGVyU3RhdGUgRDNEU0FNUF9NSU5GSUxURVIgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9NQUdGSUxURVIsIEQzRFRFWEZfTElORUFSKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRTYW1wbGVyU3RhdGUgRDNEU0FNUF9NQUdGSUxURVIgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9CT1JERVJDT0xPUiwgMHhmZjAwZmYwMCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0U2FtcGxlclN0YXRlIEQzRFNBTVBfQk9SREVSQ09MT1IgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfTElHSFRJTkcsIEZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgZm9yICh4ID0gMDsgeCA8IChzaXplb2YoYWRkcmVzc19tb2RlcykgLyBzaXplb2YoKmFkZHJlc3NfbW9kZXMpKTsgKyt4KQogICAgewogICAgICAgIERXT1JEIGNvbG9yOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9BRERSRVNTVSwgYWRkcmVzc19tb2Rlc1t4XS5tb2RlKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0U2FtcGxlclN0YXRlIEQzRFNBTVBfQUREUkVTU1UgKCVzKSBmYWlsZWQgKDB4JTA4eClcbiIsIGFkZHJlc3NfbW9kZXNbeF0ubmFtZSwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAwLCBEM0RTQU1QX0FERFJFU1NWLCBhZGRyZXNzX21vZGVzW3hdLm1vZGUpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJTZXRTYW1wbGVyU3RhdGUgRDNEU0FNUF9BRERSRVNTViAoJXMpIGZhaWxlZCAoMHglMDh4KVxuIiwgYWRkcmVzc19tb2Rlc1t4XS5uYW1lLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkJlZ2luU2NlbmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCAmcXVhZFswXSwgc2l6ZW9mKHF1YWRbMF0pKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiRW5kU2NlbmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIlByZXNlbnQgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgICAgIC8qIER1ZSB0byB0aGUgbmF0dXJlIG9mIHRoaXMgdGVzdCwgd2Ugc2FtcGxlIGVzc2VudGlhbGx5IGF0IHRoZSBlZGdlCiAgICAgICAgICogYmV0d2VlbiB0d28gZmFjZXMuIEJlY2F1c2Ugb2YgdGhpcyBpdCdzIHVuZGVmaW5lZCBmcm9tIHdoaWNoIGZhY2UKICAgICAgICAgKiB0aGUgZHJpdmVyIHdpbGwgc2FtcGxlLiBGdXJ0dW5hdGVseSB0aGF0J3Mgbm90IGltcG9ydGFudCBmb3IgdGhpcwogICAgICAgICAqIHRlc3QsIHNpbmNlIGFsbCB3ZSBjYXJlIGFib3V0IGlzIHRoYXQgaXQgZG9lc24ndCBzYW1wbGUgZnJvbSB0aGUKICAgICAgICAgKiBvdGhlciBzaWRlIG9mIHRoZSBzdXJmYWNlIG9yIGZyb20gdGhlIGJvcmRlci4gKi8KICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMjAsIDI0MCk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCB8fCBjb2xvciA9PSAweDAwMDAwMGZmLAogICAgICAgICAgICAgICAgIkdvdCBjb2xvciAweCUwOHggZm9yIGFkZHJlc3NpbmcgbW9kZSAlcywgZXhwZWN0ZWQgMHgwMGZmMDAwMCBvciAweDAwMDAwMGZmLlxuIiwKICAgICAgICAgICAgICAgIGNvbG9yLCBhZGRyZXNzX21vZGVzW3hdLm5hbWUpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDAsIDAuMGYsIDApOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJDbGVhciBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFRleHR1cmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245X1JlbGVhc2UodmVydGV4X2RlY2xhcmF0aW9uKTsKICAgIElEaXJlY3QzREN1YmVUZXh0dXJlOV9SZWxlYXNlKHRleHR1cmUpOwogICAgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShzdXJmYWNlKTsKfQoKc3RhdGljIHZvaWQgb2Zmc2NyZWVuX3Rlc3QoSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlKQp7CiAgICBIUkVTVUxUIGhyOwogICAgSURpcmVjdDNEVGV4dHVyZTkgKm9mZnNjcmVlblRleHR1cmUgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgKmJhY2tidWZmZXIgPSBOVUxMLCAqb2Zmc2NyZWVuID0gTlVMTDsKICAgIERXT1JEIGNvbG9yOwoKICAgIHN0YXRpYyBjb25zdCBmbG9hdCBxdWFkW11bNV0gPSB7CiAgICAgICAgey0wLjVmLCAtMC41ZiwgMC4xZiwgMC4wZiwgMC4wZn0sCiAgICAgICAgey0wLjVmLCAgMC41ZiwgMC4xZiwgMC4wZiwgMS4wZn0sCiAgICAgICAgeyAwLjVmLCAtMC41ZiwgMC4xZiwgMS4wZiwgMC4wZn0sCiAgICAgICAgeyAwLjVmLCAgMC41ZiwgMC4xZiwgMS4wZiwgMS4wZn0sCiAgICB9OwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmMDAwMCwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIkNsZWFyIGZhaWxlZCwgaHIgPSAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZShkZXZpY2UsIDEyOCwgMTI4LCAxLCBEM0RVU0FHRV9SRU5ERVJUQVJHRVQsIEQzREZNVF9YOFI4RzhCOCwgRDNEUE9PTF9ERUZBVUxULCAmb2Zmc2NyZWVuVGV4dHVyZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0sgfHwgaHIgPT0gRDNERVJSX0lOVkFMSURDQUxMLCAiQ3JlYXRpbmcgdGhlIG9mZnNjcmVlbiByZW5kZXIgdGFyZ2V0IGZhaWxlZCwgaHIgPSAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKCFvZmZzY3JlZW5UZXh0dXJlKSB7CiAgICAgICAgdHJhY2UoIkZhaWxlZCB0byBjcmVhdGUgYW4gWDhSOEc4Qjggb2Zmc2NyZWVuIHRleHR1cmUsIHRyeWluZyBSNUc2QjVcbiIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlKGRldmljZSwgMTI4LCAxMjgsIDEsIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCwgRDNERk1UX1I1RzZCNSwgRDNEUE9PTF9ERUZBVUxULCAmb2Zmc2NyZWVuVGV4dHVyZSwgTlVMTCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LIHx8IGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIkNyZWF0aW5nIHRoZSBvZmZzY3JlZW4gcmVuZGVyIHRhcmdldCBmYWlsZWQsIGhyID0gJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaWYoIW9mZnNjcmVlblRleHR1cmUpIHsKICAgICAgICAgICAgc2tpcCgiQ2Fubm90IGNyZWF0ZSBhbiBvZmZzY3JlZW4gcmVuZGVyIHRhcmdldFxuIik7CiAgICAgICAgICAgIGdvdG8gb3V0OwogICAgICAgIH0KICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0QmFja0J1ZmZlcihkZXZpY2UsIDAsIDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmYmFja2J1ZmZlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJDYW4ndCBnZXQgYmFjayBidWZmZXIsIGhyID0gJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighYmFja2J1ZmZlcikgewogICAgICAgIGdvdG8gb3V0OwogICAgfQoKICAgIGhyID0gSURpcmVjdDNEVGV4dHVyZTlfR2V0U3VyZmFjZUxldmVsKG9mZnNjcmVlblRleHR1cmUsIDAsICZvZmZzY3JlZW4pOwogICAgb2soaHIgPT0gRDNEX09LLCAiQ2FuJ3QgZ2V0IG9mZnNjcmVlbiBzdXJmYWNlLCBociA9ICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIW9mZnNjcmVlbikgewogICAgICAgIGdvdG8gb3V0OwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaIHwgRDNERlZGX1RFWDEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiU2V0RlZGIGZhaWxlZCwgaHIgPSAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAwLCBEM0RUU1NfQ09MT1JPUCwgRDNEVE9QX1NFTEVDVEFSRzEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiU2V0VGV4dHVyZVN0YWdlU3RhdGUgZmFpbGVkLCBociA9ICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMCwgRDNEVFNTX0NPTE9SQVJHMSwgRDNEVEFfVEVYVFVSRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJTZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQsIGhyID0gJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9NSU5GSUxURVIsIEQzRFRFWEZfUE9JTlQpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFNhbXBsZXJTdGF0ZSBEM0RTQU1QX01JTkZJTFRFUiBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAwLCBEM0RTQU1QX01BR0ZJTFRFUiwgRDNEVEVYRl9QT0lOVCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0U2FtcGxlclN0YXRlIEQzRFNBTVBfTUFHRklMVEVSIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfTElHSFRJTkcsIEZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaWYoSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSkgPT0gRDNEX09LKSB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclRhcmdldChkZXZpY2UsIDAsIG9mZnNjcmVlbik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiU2V0UmVuZGVyVGFyZ2V0IGZhaWxlZCwgaHIgPSAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmZmZjAwZmYsIDAuMCwgMCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiQ2xlYXIgZmFpbGVkLCBociA9ICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICAvKiBEcmF3IHdpdGhvdXQgdGV4dHVyZXMgLSBTaG91bGQgcmVzdXQgaW4gYSB3aGl0ZSBxdWFkICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQsIHNpemVvZihxdWFkWzBdKSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCwgaHIgPSAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclRhcmdldChkZXZpY2UsIDAsIGJhY2tidWZmZXIpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIlNldFJlbmRlclRhcmdldCBmYWlsZWQsIGhyID0gJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAwLCAoSURpcmVjdDNEQmFzZVRleHR1cmU5ICopIG9mZnNjcmVlblRleHR1cmUpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIlNldFRleHR1cmUgZmFpbGVkLCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgLyogVGhpcyB0aW1lIHdpdGggdGhlIHRleHR1cmUgKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZCwgc2l6ZW9mKHF1YWRbMF0pKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkLCBociA9ICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICB9CgogICAgSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CgogICAgLyogQ2VudGVyIHF1YWQgLSBzaG91bGQgYmUgd2hpdGUgKi8KICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDMyMCwgMjQwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJPZmZzY3JlZW4gZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmLlxuIiwgY29sb3IpOwogICAgLyogU29tZSBxdWFkIGluIHRoZSBjbGVhcmVkIHBhcnQgb2YgdGhlIHRleHR1cmUgKi8KICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE3MCwgMjQwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwZmYsICJPZmZzY3JlZW4gZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmYwMGZmLlxuIiwgY29sb3IpOwogICAgLyogUGFydCBvZiB0aGUgb3JpZ2luYWxseSBjbGVhcmVkIGJhY2sgYnVmZmVyICovCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxMCwgMTApOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIk9mZnNjcmVlbiBmYWlsZWQ6IEdvdCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDAuXG4iLCBjb2xvcik7CiAgICBpZigwKSB7CiAgICAgICAgLyogTG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNjcmVlbiwgd2hlcmUgYmFjayBidWZmZXIgb2Zmc2NyZWVuIHJlbmRlcmluZyBkcmF3cyB0aGUgb2Zmc2NyZWVuIHRleHR1cmUuCiAgICAgICAgICogSXQgc2hvdWxkIGJlIHJlZCwgYnV0IHRoZSBvZmZzY3JlZW4gdGV4dHVyZSBtYXkgbGVhdmUgc29tZSBqdW5rIHRoZXJlLiBOb3QgdGVzdGVkIHlldC4gRGVwZW5kaW5nIG9uCiAgICAgICAgICogdGhlIG9mZnNjcmVlbiByZW5kZXJpbmcgbW9kZSB0aGlzIHRlc3Qgd291bGQgc3VjY2VlZCBvciBmYWlsCiAgICAgICAgICovCiAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTAsIDQ3MCk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIk9mZnNjcmVlbiBmYWlsZWQ6IEdvdCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDAuXG4iLCBjb2xvcik7CiAgICB9CgpvdXQ6CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIE5VTEwpOwoKICAgIC8qIHJlc3RvcmUgdGhpbmdzICovCiAgICBpZihiYWNrYnVmZmVyKSB7CiAgICAgICAgSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJUYXJnZXQoZGV2aWNlLCAwLCBiYWNrYnVmZmVyKTsKICAgICAgICBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwogICAgfQogICAgaWYob2Zmc2NyZWVuVGV4dHVyZSkgewogICAgICAgIElEaXJlY3QzRFRleHR1cmU5X1JlbGVhc2Uob2Zmc2NyZWVuVGV4dHVyZSk7CiAgICB9CiAgICBpZihvZmZzY3JlZW4pIHsKICAgICAgICBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKG9mZnNjcmVlbik7CiAgICB9Cn0KCi8qIFRoaXMgdGVzdCB0ZXN0cyBmb2cgaW4gY29tYmluYXRpb24gd2l0aCBzaGFkZXJzLgogKiBXaGF0J3MgdGVzdGVkOiBsaW5lYXIgZm9nICh2ZXJ0ZXggYW5kIHRhYmxlKSB3aXRoIHBpeGVsIHNoYWRlcgogKiAgICAgICAgICAgICAgICBsaW5lYXIgdGFibGUgZm9nIHdpdGggbm9uIGZvZ2d5IHZlcnRleCBzaGFkZXIKICogICAgICAgICAgICAgICAgdmVydGV4IGZvZyB3aXRoIGZvZ2d5IHZlcnRleCBzaGFkZXIKICogV2hhdCdzIG5vdCB0ZXN0ZWQ6IG5vbiBsaW5lYXIgZm9nIHdpdGggc2hhZGVyCiAqICAgICAgICAgICAgICAgICAgICB0YWJsZSBmb2cgd2l0aCBmb2dneSB2ZXJ0ZXggc2hhZGVyCiAqLwpzdGF0aWMgdm9pZCBmb2dfd2l0aF9zaGFkZXJfdGVzdChJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UpCnsKICAgIEhSRVNVTFQgaHI7CiAgICBEV09SRCBjb2xvcjsKICAgIHVuaW9uIHsKICAgICAgICBmbG9hdCBmOwogICAgICAgIERXT1JEIGk7CiAgICB9IHN0YXJ0LCBlbmQ7CiAgICB1bnNpZ25lZCBpbnQgaSwgajsKCiAgICAvKiBiYXNpYyB2ZXJ0ZXggc2hhZGVyIHdpdGhvdXQgZm9nIGNvbXB1dGF0aW9uICgibm9uIGZvZ2d5IikgKi8KICAgIHN0YXRpYyBjb25zdCBEV09SRCB2ZXJ0ZXhfc2hhZGVyX2NvZGUxW10gPSB7CiAgICAgICAgMHhmZmZlMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfMV8xICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMWYsIDB4ODAwMDAwMDAsIDB4OTAwZjAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRjbF9wb3NpdGlvbiB2MCAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDAwMDBhLCAweDkwMGYwMDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfY29sb3IwIHYxICAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHhjMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9Qb3MsIHYwICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ZDAwZjAwMDAsIDB4OTBlNDAwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvRDAsIHYxICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDBmZmZmCiAgICB9OwogICAgLyogYmFzaWMgdmVydGV4IHNoYWRlciB3aXRoIHJldmVyc2VkIGZvZyBjb21wdXRhdGlvbiAoImZvZ2d5IikgKi8KICAgIHN0YXRpYyBjb25zdCBEV09SRCB2ZXJ0ZXhfc2hhZGVyX2NvZGUyW10gPSB7CiAgICAgICAgMHhmZmZlMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfMV8xICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfcG9zaXRpb24gdjAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMWYsIDB4ODAwMDAwMGEsIDB4OTAwZjAwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRjbF9jb2xvcjAgdjEgICAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMCwgMHhiZmEwMDAwMCwgMHgwMDAwMDAwMCwgMHhiZjY2NjY2NiwgMHgwMDAwMDAwMCwgLyogZGVmIGMwLCAtMS4yNSwgMC4wLCAtMC45LCAwLjAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweGMwMGYwMDAwLCAweDkwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3Ygb1BvcywgdjAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ZDAwZjAwMDAsIDB4OTBlNDAwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvRDAsIHYxICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMiwgMHg4MDBmMDAwMCwgMHg5MGFhMDAwMCwgMHhhMGFhMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkIHIwLCB2MC56LCBjMC56ICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDA1LCAweGMwMGYwMDAxLCAweDgwMDAwMDAwLCAweGEwMDAwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdWwgb0ZvZywgcjAueCwgYzAueCAgICAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYKICAgIH07CiAgICAvKiBiYXNpYyBwaXhlbCBzaGFkZXIgKi8KICAgIHN0YXRpYyBjb25zdCBEV09SRCBwaXhlbF9zaGFkZXJfY29kZVtdID0gewogICAgICAgIDB4ZmZmZjAxMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzFfMSAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweDgwMGYwMDAwLCAweDkwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgcjAsIHZvICovCiAgICAgICAgMHgwMDAwZmZmZgogICAgfTsKCiAgICBzdGF0aWMgc3RydWN0IHZlcnRleCBxdWFkW10gPSB7CiAgICAgICAgey0xLjBmLCAtMS4wZiwgIDAuMGYsICAgICAgICAgIDB4RkZGRjAwMDAgIH0sCiAgICAgICAgey0xLjBmLCAgMS4wZiwgIDAuMGYsICAgICAgICAgIDB4RkZGRjAwMDAgIH0sCiAgICAgICAgeyAxLjBmLCAtMS4wZiwgIDAuMGYsICAgICAgICAgIDB4RkZGRjAwMDAgIH0sCiAgICAgICAgeyAxLjBmLCAgMS4wZiwgIDAuMGYsICAgICAgICAgIDB4RkZGRjAwMDAgIH0sCiAgICB9OwoKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzW10gPSB7CiAgICAgICAgezAsICAwLCBEM0RERUNMVFlQRV9GTE9BVDMsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfUE9TSVRJT04sIDB9LAogICAgICAgIHswLCAxMiwgRDNEREVDTFRZUEVfRDNEQ09MT1IsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgICAgRDNEREVDTFVTQUdFX0NPTE9SLCAwfSwKICAgICAgICBEM0RERUNMX0VORCgpCiAgICB9OwoKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqdmVydGV4X2RlY2xhcmF0aW9uID0gTlVMTDsKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjkgICAgICAqdmVydGV4X3NoYWRlclszXSAgID0ge05VTEwsIE5VTEwsIE5VTEx9OwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICAgICAgICpwaXhlbF9zaGFkZXJbMl0gICAgPSB7TlVMTCwgTlVMTH07CgogICAgLyogVGhpcyByZWZlcmVuY2UgZGF0YSB3YXMgY29sbGVjdGVkIG9uIGEgblZpZGlhIEdlRm9yY2UgNzYwMEdTIGRyaXZlciB2ZXJzaW9uIDg0LjE5IERpcmVjdFggdmVyc2lvbiA5LjBjIG9uIFdpbmRvd3MgWFAgKi8KICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVzdF9kYXRhX3QgewogICAgICAgIGludCB2c2hhZGVyOwogICAgICAgIGludCBwc2hhZGVyOwogICAgICAgIEQzREZPR01PREUgdmZvZzsKICAgICAgICBEM0RGT0dNT0RFIHRmb2c7CiAgICAgICAgdW5zaWduZWQgaW50IGNvbG9yWzExXTsKICAgIH0gdGVzdF9kYXRhW10gPSB7CiAgICAgICAgLyogb25seSBwaXhlbCBzaGFkZXI6ICovCiAgICAgICAgezAsIDEsIDAsIDMsCiAgICAgICAgezB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBkZjIwMDAsIDB4MDBiZjQwMDAsIDB4MDA5ZjYwMDAsIDB4MDA3ZjgwMDAsCiAgICAgICAgMHgwMDVmYTAwMCwgMHgwMDQwYmYwMCwgMHgwMDIwZGYwMCwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMH19LAogICAgICAgIHswLCAxLCAxLCAzLAogICAgICAgIHsweDAwZmYwMDAwLCAweDAwZmYwMDAwLCAweDAwZGYyMDAwLCAweDAwYmY0MDAwLCAweDAwOWY2MDAwLCAweDAwN2Y4MDAwLAogICAgICAgIDB4MDA1ZmEwMDAsIDB4MDA0MGJmMDAsIDB4MDAyMGRmMDAsIDB4MDAwMGZmMDAsIDB4MDAwMGZmMDB9fSwKICAgICAgICB7MCwgMSwgMiwgMywKICAgICAgICB7MHgwMGZmMDAwMCwgMHgwMGZmMDAwMCwgMHgwMGRmMjAwMCwgMHgwMGJmNDAwMCwgMHgwMDlmNjAwMCwgMHgwMDdmODAwMCwKICAgICAgICAweDAwNWZhMDAwLCAweDAwNDBiZjAwLCAweDAwMjBkZjAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwfX0sCiAgICAgICAgezAsIDEsIDMsIDAsCiAgICAgICAgezB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBkZjIwMDAsIDB4MDBiZjQwMDAsIDB4MDA5ZjYwMDAsIDB4MDA3ZjgwMDAsCiAgICAgICAgMHgwMDVmYTAwMCwgMHgwMDQwYmYwMCwgMHgwMDIwZGYwMCwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMH19LAogICAgICAgIHswLCAxLCAzLCAzLAogICAgICAgIHsweDAwZmYwMDAwLCAweDAwZmYwMDAwLCAweDAwZGYyMDAwLCAweDAwYmY0MDAwLCAweDAwOWY2MDAwLCAweDAwN2Y4MDAwLAogICAgICAgIDB4MDA1ZmEwMDAsIDB4MDA0MGJmMDAsIDB4MDAyMGRmMDAsIDB4MDAwMGZmMDAsIDB4MDAwMGZmMDB9fSwKCiAgICAgICAgLyogdmVydGV4IHNoYWRlciAqLwogICAgICAgIHsxLCAwLCAwLCAwLAogICAgICAgIHsweDAwMDBmZjAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwLAogICAgICAgICAweDAwMDBmZjAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwfX0sCiAgICAgICAgezEsIDAsIDAsIDMsCiAgICAgICAgezB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBkZjIwMDAsIDB4MDBiZjQwMDAsIDB4MDA5ZjYwMDAsIDB4MDA3ZjgwMDAsCiAgICAgICAgMHgwMDVmYTAwMCwgMHgwMDQwYmYwMCwgMHgwMDIwZGYwMCwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMH19LAogICAgICAgIHsxLCAwLCAxLCAzLAogICAgICAgIHsweDAwZmYwMDAwLCAweDAwZmYwMDAwLCAweDAwZGYyMDAwLCAweDAwYmY0MDAwLCAweDAwOWY2MDAwLCAweDAwN2Y4MDAwLAogICAgICAgIDB4MDA1ZmEwMDAsIDB4MDA0MGJmMDAsIDB4MDAyMGRmMDAsIDB4MDAwMGZmMDAsIDB4MDAwMGZmMDB9fSwKCiAgICAgICAgezEsIDAsIDIsIDMsCiAgICAgICAgezB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBkZjIwMDAsIDB4MDBiZjQwMDAsIDB4MDA5ZjYwMDAsIDB4MDA3ZjgwMDAsCiAgICAgICAgMHgwMDVmYTAwMCwgMHgwMDQwYmYwMCwgMHgwMDIwZGYwMCwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMH19LAogICAgICAgIHsxLCAwLCAzLCAzLAogICAgICAgIHsweDAwZmYwMDAwLCAweDAwZmYwMDAwLCAweDAwZGYyMDAwLCAweDAwYmY0MDAwLCAweDAwOWY2MDAwLCAweDAwN2Y4MDAwLAogICAgICAgIDB4MDA1ZmEwMDAsIDB4MDA0MGJmMDAsIDB4MDAyMGRmMDAsIDB4MDAwMGZmMDAsIDB4MDAwMGZmMDB9fSwKCiAgICAgICAgLyogdmVydGV4IHNoYWRlciBhbmQgcGl4ZWwgc2hhZGVyICovCiAgICAgICAgezEsIDEsIDAsIDMsCiAgICAgICAgezB4MDBmZjAwMDAsIDB4MDBmZjAwMDAsIDB4MDBkZjIwMDAsIDB4MDBiZjQwMDAsIDB4MDA5ZjYwMDAsIDB4MDA3ZjgwMDAsCiAgICAgICAgMHgwMDVmYTAwMCwgMHgwMDQwYmYwMCwgMHgwMDIwZGYwMCwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMH19LAogICAgICAgIHsxLCAxLCAxLCAzLAogICAgICAgIHsweDAwZmYwMDAwLCAweDAwZmYwMDAwLCAweDAwZGYyMDAwLCAweDAwYmY0MDAwLCAweDAwOWY2MDAwLCAweDAwN2Y4MDAwLAogICAgICAgIDB4MDA1ZmEwMDAsIDB4MDA0MGJmMDAsIDB4MDAyMGRmMDAsIDB4MDAwMGZmMDAsIDB4MDAwMGZmMDB9fSwKICAgICAgICB7MSwgMSwgMiwgMywKICAgICAgICB7MHgwMGZmMDAwMCwgMHgwMGZmMDAwMCwgMHgwMGRmMjAwMCwgMHgwMGJmNDAwMCwgMHgwMDlmNjAwMCwgMHgwMDdmODAwMCwKICAgICAgICAweDAwNWZhMDAwLCAweDAwNDBiZjAwLCAweDAwMjBkZjAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwfX0sCgogICAgICAgIHsxLCAxLCAzLCAzLAogICAgICAgIHsweDAwZmYwMDAwLCAweDAwZmYwMDAwLCAweDAwZGYyMDAwLCAweDAwYmY0MDAwLCAweDAwOWY2MDAwLCAweDAwN2Y4MDAwLAogICAgICAgIDB4MDA1ZmEwMDAsIDB4MDA0MGJmMDAsIDB4MDAyMGRmMDAsIDB4MDAwMGZmMDAsIDB4MDAwMGZmMDB9fSwKCgojaWYgMCAgLyogRklYTUU6IHRoZXNlIGZhaWwgb24gR2VGb3JjZSA4NTAwICovCiAgICAgICAgLyogZm9nZ3kgdmVydGV4IHNoYWRlciAqLwogICAgICAgIHsyLCAwLCAwLCAwLAogICAgICAgIHsweDAwZmYwMDAwLCAweDAwZmUwMTAwLCAweDAwZGUyMTAwLCAweDAwYmY0MDAwLCAweDAwOWY2MDAwLCAweDAwN2Y4MDAwLAogICAgICAgICAweDAwNWZhMDAwLCAweDAwM2ZjMDAwLCAweDAwMWZlMDAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwfX0sCiAgICAgICAgezIsIDAsIDEsIDAsCiAgICAgICAgezB4MDBmZjAwMDAsIDB4MDBmZTAxMDAsIDB4MDBkZTIxMDAsIDB4MDBiZjQwMDAsIDB4MDA5ZjYwMDAsIDB4MDA3ZjgwMDAsCiAgICAgICAgIDB4MDA1ZmEwMDAsIDB4MDAzZmMwMDAsIDB4MDAxZmUwMDAsIDB4MDAwMGZmMDAsIDB4MDAwMGZmMDB9fSwKICAgICAgICB7MiwgMCwgMiwgMCwKICAgICAgICB7MHgwMGZmMDAwMCwgMHgwMGZlMDEwMCwgMHgwMGRlMjEwMCwgMHgwMGJmNDAwMCwgMHgwMDlmNjAwMCwgMHgwMDdmODAwMCwKICAgICAgICAgMHgwMDVmYTAwMCwgMHgwMDNmYzAwMCwgMHgwMDFmZTAwMCwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMH19LAogICAgICAgIHsyLCAwLCAzLCAwLAogICAgICAgIHsweDAwZmYwMDAwLCAweDAwZmUwMTAwLCAweDAwZGUyMTAwLCAweDAwYmY0MDAwLCAweDAwOWY2MDAwLCAweDAwN2Y4MDAwLAogICAgICAgICAweDAwNWZhMDAwLCAweDAwM2ZjMDAwLCAweDAwMWZlMDAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwfX0sCiNlbmRpZgoKICAgICAgICAvKiBmb2dneSB2ZXJ0ZXggc2hhZGVyIGFuZCBwaXhlbCBzaGFkZXIgKi8KICAgICAgICB7MiwgMSwgMCwgMCwKICAgICAgICB7MHgwMGZmMDAwMCwgMHgwMGZlMDEwMCwgMHgwMGRlMjEwMCwgMHgwMGJmNDAwMCwgMHgwMDlmNjAwMCwgMHgwMDdmODAwMCwKICAgICAgICAgMHgwMDVmYTAwMCwgMHgwMDNmYzAwMCwgMHgwMDFmZTAwMCwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMH19LAogICAgICAgIHsyLCAxLCAxLCAwLAogICAgICAgIHsweDAwZmYwMDAwLCAweDAwZmUwMTAwLCAweDAwZGUyMTAwLCAweDAwYmY0MDAwLCAweDAwOWY2MDAwLCAweDAwN2Y4MDAwLAogICAgICAgICAweDAwNWZhMDAwLCAweDAwM2ZjMDAwLCAweDAwMWZlMDAwLCAweDAwMDBmZjAwLCAweDAwMDBmZjAwfX0sCiAgICAgICAgezIsIDEsIDIsIDAsCiAgICAgICAgezB4MDBmZjAwMDAsIDB4MDBmZTAxMDAsIDB4MDBkZTIxMDAsIDB4MDBiZjQwMDAsIDB4MDA5ZjYwMDAsIDB4MDA3ZjgwMDAsCiAgICAgICAgIDB4MDA1ZmEwMDAsIDB4MDAzZmMwMDAsIDB4MDAxZmUwMDAsIDB4MDAwMGZmMDAsIDB4MDAwMGZmMDB9fSwKICAgICAgICB7MiwgMSwgMywgMCwKICAgICAgICB7MHgwMGZmMDAwMCwgMHgwMGZlMDEwMCwgMHgwMGRlMjEwMCwgMHgwMGJmNDAwMCwgMHgwMDlmNjAwMCwgMHgwMDdmODAwMCwKICAgICAgICAgMHgwMDVmYTAwMCwgMHgwMDNmYzAwMCwgMHgwMDFmZTAwMCwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMH19LAoKICAgIH07CgogICAgLyogTk9URTogY2hhbmdpbmcgdGhlc2UgdmFsdWVzIHdpbGwgbm90IGFmZmVjdCB0aGUgdGVzdHMgd2l0aCBmb2dneSB2ZXJ0ZXggc2hhZGVyLCBhcyB0aGUgdmFsdWVzIGFyZSBoYXJkY29kZWQgaW4gdGhlIHNoYWRlciovCiAgICBzdGFydC5mPTAuMWY7CiAgICBlbmQuZj0wLjlmOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCB2ZXJ0ZXhfc2hhZGVyX2NvZGUxLCAmdmVydGV4X3NoYWRlclsxXSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiQ3JlYXRlVmVydGV4U2hhZGVyIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCB2ZXJ0ZXhfc2hhZGVyX2NvZGUyLCAmdmVydGV4X3NoYWRlclsyXSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiQ3JlYXRlVmVydGV4U2hhZGVyIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlcihkZXZpY2UsIHBpeGVsX3NoYWRlcl9jb2RlLCAmcGl4ZWxfc2hhZGVyWzFdKTsKICAgIG9rKFNVQ0NFRURFRChociksICJDcmVhdGVQaXhlbFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzLCAmdmVydGV4X2RlY2xhcmF0aW9uKTsKICAgIG9rKFNVQ0NFRURFRChociksICJDcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgLyogU2V0dXAgaW5pdGlhbCBzdGF0ZXM6IE5vIGxpZ2h0aW5nLCBmb2cgb24sIGZvZyBjb2xvciAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfTElHSFRJTkcsIEZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlR1cm5pbmcgb2ZmIGxpZ2h0aW5nIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR0VOQUJMRSwgVFJVRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJUdXJuaW5nIG9uIGZvZyBjYWxjdWxhdGlvbnMgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfRk9HQ09MT1IsIDB4RkYwMEZGMDAgLyogQSBuaWNlIGdyZWVuICovKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlNldHRpbmcgZm9nIGNvbG9yIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIHZlcnRleF9kZWNsYXJhdGlvbik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0VmVydGV4RGVjbGFyYXRpb24gZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1RBQkxFTU9ERSwgRDNERk9HX05PTkUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiVHVybmluZyBvZmYgdGFibGUgZm9nIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1ZFUlRFWE1PREUsIEQzREZPR19OT05FKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlR1cm5pbmcgb2ZmIHZlcnRleCBmb2cgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgIC8qIFVzZSBmb2d0YXJ0ID0gMC4xIGFuZCBlbmQgPSAwLjkgdG8gdGVzdCBiZWhhdmlvciBvdXRzaWRlIHRoZSBmb2cgdHJhbnNpdGlvbiBwaGFzZSwgdG9vKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1NUQVJULCBzdGFydC5pKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlNldHRpbmcgZm9nIHN0YXJ0IGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR0VORCwgZW5kLmkpOwogICAgb2soaHIgPT0gRDNEX09LLCAiU2V0dGluZyBmb2cgZW5kIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRlc3RfZGF0YSkvc2l6ZW9mKHRlc3RfZGF0YVswXSk7IGkrKykKICAgIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgdmVydGV4X3NoYWRlclt0ZXN0X2RhdGFbaV0udnNoYWRlcl0pOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJTZXRWZXJ0ZXhTaGFkZXIgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHBpeGVsX3NoYWRlclt0ZXN0X2RhdGFbaV0ucHNoYWRlcl0pOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJTZXRQaXhlbFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfRk9HVkVSVEVYTU9ERSwgdGVzdF9kYXRhW2ldLnZmb2cpOwogICAgICAgIG9rKCBociA9PSBEM0RfT0ssICJTZXR0aW5nIGZvZyB2ZXJ0ZXggbW9kZSB0byBEM0RGT0dfTElORUFSIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19GT0dUQUJMRU1PREUsIHRlc3RfZGF0YVtpXS50Zm9nKTsKICAgICAgICBvayggaHIgPT0gRDNEX09LLCAiU2V0dGluZyBmb2cgdGFibGUgbW9kZSB0byBEM0RGT0dfTElORUFSIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgZm9yKGo9MDsgaiA8IDExOyBqKyspCiAgICAgICAgewogICAgICAgICAgICAvKiBEb24ndCB1c2UgdGhlIHdob2xlIHpyYW5nZSB0byBwcmV2ZW50IHJvdW5kaW5nIGVycm9ycyAqLwogICAgICAgICAgICBxdWFkWzBdLnogPSAwLjAwMWYgKyAoZmxvYXQpaiAvIDEwLjAyZjsKICAgICAgICAgICAgcXVhZFsxXS56ID0gMC4wMDFmICsgKGZsb2F0KWogLyAxMC4wMmY7CiAgICAgICAgICAgIHF1YWRbMl0ueiA9IDAuMDAxZiArIChmbG9hdClqIC8gMTAuMDJmOwogICAgICAgICAgICBxdWFkWzNdLnogPSAwLjAwMWYgKyAoZmxvYXQpaiAvIDEwLjAyZjsKCiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmMDBmZiwgMC4wLCAwKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgICAgICAgICBvayggaHIgPT0gRDNEX09LLCAiQmVnaW5TY2VuZSByZXR1cm5lZCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgJnF1YWRbMF0sIHNpemVvZihxdWFkWzBdKSk7CiAgICAgICAgICAgIG9rKFNVQ0NFRURFRChociksICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIkVuZFNjZW5lIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgICAgIElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwoKICAgICAgICAgICAgLyogQXMgdGhlIHJlZCBhbmQgZ3JlZW4gY29tcG9uZW50IGFyZSB0aGUgcmVzdWx0IG9mIGJsZW5kaW5nIHVzZSA1JSB0b2xlcmFuY2Ugb24gdGhlIGV4cGVjdGVkIHZhbHVlICovCiAgICAgICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDEyOCwgMjQwKTsKICAgICAgICAgICAgb2soKHVuc2lnbmVkIGNoYXIpKGNvbG9yKSA9PSAoKHVuc2lnbmVkIGNoYXIpdGVzdF9kYXRhW2ldLmNvbG9yW2pdKQogICAgICAgICAgICAgICAgICAgICYmIGFicyggKCh1bnNpZ25lZCBjaGFyKShjb2xvcj4+OCkpIC0gKHVuc2lnbmVkIGNoYXIpKHRlc3RfZGF0YVtpXS5jb2xvcltqXT4+OCkgKSA8IDEzCiAgICAgICAgICAgICAgICAgICAgJiYgYWJzKCAoKHVuc2lnbmVkIGNoYXIpKGNvbG9yPj4xNikpIC0gKHVuc2lnbmVkIGNoYXIpKHRlc3RfZGF0YVtpXS5jb2xvcltqXT4+MTYpICkgPCAxMywKICAgICAgICAgICAgICAgImZvZyB2cyVpIHBzJWkgZnZtJWkgZnRtJWkgJWQ6IGdvdCBjb2xvciAlMDh4LCBleHBlY3RlZCAlMDh4ICstNSUlXG4iLAogICAgICAgICAgICAgICB0ZXN0X2RhdGFbaV0udnNoYWRlciwgdGVzdF9kYXRhW2ldLnBzaGFkZXIsIHRlc3RfZGF0YVtpXS52Zm9nLCB0ZXN0X2RhdGFbaV0udGZvZywgaiwgY29sb3IsIHRlc3RfZGF0YVtpXS5jb2xvcltqXSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIHJlc2V0IHN0YXRlcyAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFZlcnRleFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBOVUxMKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRQaXhlbFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBOVUxMKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19GT0dFTkFCTEUsIEZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlR1cm5pbmcgb2ZmIGZvZyBjYWxjdWxhdGlvbnMgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjlfUmVsZWFzZSh2ZXJ0ZXhfc2hhZGVyWzFdKTsKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjlfUmVsZWFzZSh2ZXJ0ZXhfc2hhZGVyWzJdKTsKICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOV9SZWxlYXNlKHBpeGVsX3NoYWRlclsxXSk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZSh2ZXJ0ZXhfZGVjbGFyYXRpb24pOwp9CgpzdGF0aWMgdm9pZCBnZW5lcmF0ZV9idW1wbWFwX3RleHR1cmVzKElEaXJlY3QzRERldmljZTkgKmRldmljZSkgewogICAgdW5zaWduZWQgaW50IGksIHgsIHk7CiAgICBIUkVTVUxUIGhyOwogICAgSURpcmVjdDNEVGV4dHVyZTkgKnRleHR1cmVbMl0gPSB7TlVMTCwgTlVMTH07CiAgICBEM0RMT0NLRURfUkVDVCBsb2NrZWRfcmVjdDsKCiAgICAvKiBHZW5lcmF0ZSB0aGUgdGV4dHVyZXMgKi8KICAgIGZvcihpPTA7IGk8MjsgaSsrKQogICAgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlKGRldmljZSwgMTI4LCAxMjgsIDEsIDAsIGk/RDNERk1UX0E4UjhHOEI4OkQzREZNVF9WOFU4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBPT0xfTUFOQUdFRCwgJnRleHR1cmVbaV0sIE5VTEwpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJDcmVhdGVUZXh0dXJlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X0xvY2tSZWN0KHRleHR1cmVbaV0sIDAsICZsb2NrZWRfcmVjdCwgTlVMTCwgMCk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkxvY2tSZWN0IGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgICAgIGZvciAoeSA9IDA7IHkgPCAxMjg7ICsreSkKICAgICAgICB7CiAgICAgICAgICAgIGlmKGkpCiAgICAgICAgICAgIHsgLyogU2V0IHVwIGJsYWNrIHRleHR1cmUgd2l0aCAyeDIgdGV4ZWwgd2hpdGUgc3BvdCBpbiB0aGUgbWlkZGxlICovCiAgICAgICAgICAgICAgICBEV09SRCAqcHRyID0gKERXT1JEICopKCgoQllURSAqKWxvY2tlZF9yZWN0LnBCaXRzKSArICh5ICogbG9ja2VkX3JlY3QuUGl0Y2gpKTsKICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAxMjg7ICsreCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZih5PjYyICYmIHk8NjYgJiYgeD42MiAmJiB4PDY2KQogICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSAweGZmZmZmZmZmOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gMHhmZjAwMDAwMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsgLyogU2V0IHVwIGEgZGlzcGxhY2VtZW50IG1hcCB3aGljaCBwb2ludHMgYXdheSBmcm9tIHRoZSBjZW50ZXIgcGFyYWxsZWwgdG8gdGhlIGNsb3Nlc3QgYXhpcy4KICAgICAgICAgICAgICAgKiAoaWYgbXVsdGlwbGllZCB3aXRoIGJ1bXBlbnZtYXQpCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIFdPUkQgKnB0ciA9IChXT1JEICopKCgoQllURSAqKWxvY2tlZF9yZWN0LnBCaXRzKSArICh5ICogbG9ja2VkX3JlY3QuUGl0Y2gpKTsKICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAxMjg7ICsreCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZihhYnMoeC02NCk+YWJzKHktNjQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoeCA8IDY0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gMHhjMDAwOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSAweDQwMDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHkgPCA2NCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9IDB4MDA0MDsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gMHgwMGMwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X1VubG9ja1JlY3QodGV4dHVyZVtpXSwgMCk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIlVubG9ja1JlY3QgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlKGRldmljZSwgaSwgKElEaXJlY3QzREJhc2VUZXh0dXJlOSAqKXRleHR1cmVbaV0pOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJTZXRUZXh0dXJlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgICAgICAvKiBEaXNhYmxlIHRleHR1cmUgZmlsdGVyaW5nICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIGksIEQzRFNBTVBfTUlORklMVEVSLCBEM0RURVhGX1BPSU5UKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0U2FtcGxlclN0YXRlIEQzRFNBTVBfTUlORklMVEVSIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCBpLCBEM0RTQU1QX01BR0ZJTFRFUiwgRDNEVEVYRl9QT0lOVCk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFNhbXBsZXJTdGF0ZSBEM0RTQU1QX01BR0ZJTFRFUiBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIGksIEQzRFNBTVBfQUREUkVTU1UsIEQzRFRBRERSRVNTX0NMQU1QKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0U2FtcGxlclN0YXRlIEQzRFNBTVBfQUREUkVTU1UgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIGksIEQzRFNBTVBfQUREUkVTU1YsIEQzRFRBRERSRVNTX0NMQU1QKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0U2FtcGxlclN0YXRlIEQzRFNBTVBfQUREUkVTU1YgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICB9Cn0KCi8qIHRlc3QgdGhlIGJlaGF2aW9yIG9mIHRoZSB0ZXhiZW0gaW5zdHJ1Y3Rpb24KICogd2l0aCBub3JtYWwgMkQgYW5kIHByb2plY3RpdmUgMkQgdGV4dHVyZXMKICovCnN0YXRpYyB2b2lkIHRleGJlbV90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgSFJFU1VMVCBocjsKICAgIERXT1JEIGNvbG9yOwogICAgaW50IGk7CgogICAgc3RhdGljIGNvbnN0IERXT1JEIHBpeGVsX3NoYWRlcl9jb2RlW10gPSB7CiAgICAgICAgMHhmZmZmMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfMV8xKi8KICAgICAgICAweDAwMDAwMDQyLCAweGIwMGYwMDAwLCAgICAgICAgICAgICAvKiB0ZXggdDAqLwogICAgICAgIDB4MDAwMDAwNDMsIDB4YjAwZjAwMDEsIDB4YjBlNDAwMDAsIC8qIHRleGJlbSB0MSwgdDAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ODAwZjAwMDAsIDB4YjBlNDAwMDEsIC8qIG1vdiByMCwgdDEqLwogICAgICAgIDB4MDAwMGZmZmYKICAgIH07CiAgICBzdGF0aWMgY29uc3QgRFdPUkQgZG91YmxlX3RleGJlbV9jb2RlW10gPSAgewogICAgICAgIDB4ZmZmZjAxMDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18xXzMgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDA0MiwgMHhiMDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRleCB0MCAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDQzLCAweGIwMGYwMDAxLCAweGIwZTQwMDAwLCAgICAgICAgICAgICAgICAgLyogdGV4YmVtIHQxLCB0MCAgICAqLwogICAgICAgIDB4MDAwMDAwNDIsIDB4YjAwZjAwMDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXggdDIgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDA0MywgMHhiMDBmMDAwMywgMHhiMGU0MDAwMiwgICAgICAgICAgICAgICAgIC8qIHRleGJlbSB0MywgdDIgICAgKi8KICAgICAgICAweDAwMDAwMDAyLCAweDgwMGYwMDAwLCAweGIwZTQwMDAxLCAweGIwZTQwMDAzLCAgICAgLyogYWRkIHIwLCB0MSwgdDMgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICovCiAgICB9OwoKCiAgICBzdGF0aWMgY29uc3QgZmxvYXQgcXVhZFtdWzddID0gewogICAgICAgIHstMTI4LjBmLzY0MC4wZiwgLTEyOC4wZi80ODAuMGYsIDAuMWYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGZ9LAogICAgICAgIHstMTI4LjBmLzY0MC4wZiwgIDEyOC4wZi80ODAuMGYsIDAuMWYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGZ9LAogICAgICAgIHsgMTI4LjBmLzY0MC4wZiwgLTEyOC4wZi80ODAuMGYsIDAuMWYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGZ9LAogICAgICAgIHsgMTI4LjBmLzY0MC4wZiwgIDEyOC4wZi80ODAuMGYsIDAuMWYsIDEuMGYsIDEuMGYsIDEuMGYsIDEuMGZ9LAogICAgfTsKICAgIHN0YXRpYyBjb25zdCBmbG9hdCBxdWFkX3Byb2pbXVs5XSA9IHsKICAgICAgICB7LTEyOC4wZi82NDAuMGYsIC0xMjguMGYvNDgwLjBmLCAwLjFmLCAwLjBmLCAwLjBmLCAgIDAuMGYsICAgMC4wZiwgMC4wZiwgMTI4LjBmfSwKICAgICAgICB7LTEyOC4wZi82NDAuMGYsICAxMjguMGYvNDgwLjBmLCAwLjFmLCAwLjBmLCAxLjBmLCAgIDAuMGYsIDEyOC4wZiwgMC4wZiwgMTI4LjBmfSwKICAgICAgICB7IDEyOC4wZi82NDAuMGYsIC0xMjguMGYvNDgwLjBmLCAwLjFmLCAxLjBmLCAwLjBmLCAxMjguMGYsICAgMC4wZiwgMC4wZiwgMTI4LjBmfSwKICAgICAgICB7IDEyOC4wZi82NDAuMGYsICAxMjguMGYvNDgwLjBmLCAwLjFmLCAxLjBmLCAxLjBmLCAxMjguMGYsIDEyOC4wZiwgMC4wZiwgMTI4LjBmfSwKICAgIH07CgogICAgc3RhdGljIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xfZWxlbWVudHNbXVs0XSA9IHsgewogICAgICAgIHswLCAwLCAgRDNEREVDTFRZUEVfRkxPQVQzLCBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9QT1NJVElPTiwgMH0sCiAgICAgICAgezAsIDEyLCBEM0RERUNMVFlQRV9GTE9BVDIsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1RFWENPT1JELCAwfSwKICAgICAgICB7MCwgMjAsIEQzRERFQ0xUWVBFX0ZMT0FUMiwgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfVEVYQ09PUkQsIDF9LAogICAgICAgIEQzRERFQ0xfRU5EKCkKICAgIH0sewogICAgICAgIHswLCAwLCAgRDNEREVDTFRZUEVfRkxPQVQzLCBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9QT1NJVElPTiwgMH0sCiAgICAgICAgezAsIDEyLCBEM0RERUNMVFlQRV9GTE9BVDIsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1RFWENPT1JELCAwfSwKICAgICAgICB7MCwgMjAsIEQzRERFQ0xUWVBFX0ZMT0FUNCwgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfVEVYQ09PUkQsIDF9LAogICAgICAgIEQzRERFQ0xfRU5EKCkKICAgIH0gfTsKCiAgICAvKiB1c2UgYXNzeW1ldHJpYyBtYXRyaXggdG8gdGVzdCBsb2FkaW5nICovCiAgICBmbG9hdCBidW1wZW52bWF0WzRdID0gezAuMCwwLjUsLTAuNSwwLjB9OwoKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqdmVydGV4X2RlY2xhcmF0aW9uID0gTlVMTDsKICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOSAgICAgICAqcGl4ZWxfc2hhZGVyICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRFRleHR1cmU5ICAgICAgICAgICAqdGV4dHVyZSAgICAgICAgICAgID0gTlVMTCwgKnRleHR1cmUxLCAqdGV4dHVyZTI7CiAgICBEM0RMT0NLRURfUkVDVCBsb2NrZWRfcmVjdDsKCiAgICBnZW5lcmF0ZV9idW1wbWFwX3RleHR1cmVzKGRldmljZSk7CgogICAgSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDEsIEQzRFRTU19CVU1QRU5WTUFUMDAsICooTFBEV09SRCkmYnVtcGVudm1hdFswXSk7CiAgICBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMSwgRDNEVFNTX0JVTVBFTlZNQVQwMSwgKihMUERXT1JEKSZidW1wZW52bWF0WzFdKTsKICAgIElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAxLCBEM0RUU1NfQlVNUEVOVk1BVDEwLCAqKExQRFdPUkQpJmJ1bXBlbnZtYXRbMl0pOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMSwgRDNEVFNTX0JVTVBFTlZNQVQxMSwgKihMUERXT1JEKSZidW1wZW52bWF0WzNdKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFZlcnRleFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmYwMGZmLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgZm9yKGk9MDsgaTwyOyBpKyspCiAgICB7CiAgICAgICAgaWYoaSkKICAgICAgICB7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDEsIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MsIEQzRFRURkZfQ09VTlQ0fEQzRFRURkZfUFJPSkVDVEVEKTsKICAgICAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFRleHR1cmVTdGFnZVN0YXRlIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICAgICAgfQoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzW2ldLCAmdmVydGV4X2RlY2xhcmF0aW9uKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgdmVydGV4X2RlY2xhcmF0aW9uKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0VmVydGV4RGVjbGFyYXRpb24gZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlcihkZXZpY2UsIHBpeGVsX3NoYWRlcl9jb2RlLCAmcGl4ZWxfc2hhZGVyKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiQ3JlYXRlUGl4ZWxTaGFkZXIgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHBpeGVsX3NoYWRlcik7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFBpeGVsU2hhZGVyIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiQmVnaW5TY2VuZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICAgICAgaWYoIWkpCiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCAmcXVhZFswXSwgc2l6ZW9mKHF1YWRbMF0pKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCAmcXVhZF9wcm9qWzBdLCBzaXplb2YocXVhZF9wcm9qWzBdKSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkVuZFNjZW5lIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJQcmVzZW50IGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMjAtMzIsIDI0MCk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInRleGJlbSBmYWlsZWQ6IEdvdCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmYuXG4iLCBjb2xvcik7CiAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwKzMyLCAyNDApOwogICAgICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJ0ZXhiZW0gZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmLlxuIiwgY29sb3IpOwogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDMyMCwgMjQwLTMyKTsKICAgICAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAidGV4YmVtIGZhaWxlZDogR290IGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMGZmZmZmZi5cbiIsIGNvbG9yKTsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMjAsIDI0MCszMik7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInRleGJlbSBmYWlsZWQ6IEdvdCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmYuXG4iLCBjb2xvcik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIE5VTEwpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJTZXRQaXhlbFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAgICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2UocGl4ZWxfc2hhZGVyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgTlVMTCk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZSh2ZXJ0ZXhfZGVjbGFyYXRpb24pOwogICAgfQoKICAgIC8qIGNsZWFuIHVwICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDAsIDAuMGYsIDApOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkNsZWFyIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDEsIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MsIEQzRFRURkZfQ09VTlQyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRUZXh0dXJlU3RhZ2VTdGF0ZSBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgIGZvcihpPTA7IGk8MjsgaSsrKQogICAgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRUZXh0dXJlKGRldmljZSwgaSwgKElEaXJlY3QzREJhc2VUZXh0dXJlOSAqKikgJnRleHR1cmUpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X0dldFRleHR1cmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICAgICAgSURpcmVjdDNEVGV4dHVyZTlfUmVsZWFzZSh0ZXh0dXJlKTsgLyogRm9yIHRoZSBHZXRUZXh0dXJlICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCBpLCBOVUxMKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0VGV4dHVyZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgICAgICBJRGlyZWN0M0RUZXh0dXJlOV9SZWxlYXNlKHRleHR1cmUpOwogICAgfQoKICAgIC8qIFRlc3QgZG91YmxlIHRleGJlbSAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVRleHR1cmUoZGV2aWNlLCAxLCAxLCAxLCAwLCBEM0RGTVRfVjhVOCwgRDNEUE9PTF9NQU5BR0VELCAmdGV4dHVyZSwgTlVMTCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVRleHR1cmUoZGV2aWNlLCAxLCAxLCAxLCAwLCBEM0RGTVRfVjhVOCwgRDNEUE9PTF9NQU5BR0VELCAmdGV4dHVyZTEsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlKGRldmljZSwgOCwgOCwgMSwgMCwgRDNERk1UX0E4UjhHOEI4LCBEM0RQT09MX01BTkFHRUQsICZ0ZXh0dXJlMiwgTlVMTCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyKGRldmljZSwgZG91YmxlX3RleGJlbV9jb2RlLCAmcGl4ZWxfc2hhZGVyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJDcmVhdGVQaXhlbFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0RUZXh0dXJlOV9Mb2NrUmVjdCh0ZXh0dXJlLCAwLCAmbG9ja2VkX3JlY3QsIE5VTEwsIDApOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkxvY2tSZWN0IGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgKChzaWduZWQgY2hhciAqKSBsb2NrZWRfcmVjdC5wQml0cylbMF0gPSAoLTEuMCAvIDguMCkgKiAxMjc7CiAgICAoKHNpZ25lZCBjaGFyICopIGxvY2tlZF9yZWN0LnBCaXRzKVsxXSA9ICggMS4wIC8gOC4wKSAqIDEyNzsKCiAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X1VubG9ja1JlY3QodGV4dHVyZSwgMCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiTG9ja1JlY3QgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0RUZXh0dXJlOV9Mb2NrUmVjdCh0ZXh0dXJlMSwgMCwgJmxvY2tlZF9yZWN0LCBOVUxMLCAwKTsKICAgIG9rKFNVQ0NFRURFRChociksICJMb2NrUmVjdCBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgICgoc2lnbmVkIGNoYXIgKikgbG9ja2VkX3JlY3QucEJpdHMpWzBdID0gKC0yLjAgLyA4LjApICogMTI3OwogICAgKChzaWduZWQgY2hhciAqKSBsb2NrZWRfcmVjdC5wQml0cylbMV0gPSAoLTQuMCAvIDguMCkgKiAxMjc7CiAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X1VubG9ja1JlY3QodGV4dHVyZTEsIDApOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkxvY2tSZWN0IGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgIHsKICAgICAgICAvKiBTb21lIGRhdGEgd2l0aG91dCBhbnkgbWVhbmluZywganVzdCB0byBoYXZlIGFuIDh4OCBhcnJheSB0byBzZWUgd2hpY2ggZWxlbWVudCBpcyBwaWNrZWQgKi8KI2RlZmluZSB0ZXggIDB4MDBmZjAwMDAKI2RlZmluZSB0ZXgxIDB4MDAwMGZmMDAKI2RlZmluZSBvcmlnaW4gMHgwMDAwMDBmZgogICAgICAgIHN0YXRpYyBjb25zdCBEV09SRCBwaXhlbF9kYXRhW10gPSB7CiAgICAgICAgICAgIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsCiAgICAgICAgICAgIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsCiAgICAgICAgICAgIDB4MDAwMDAwZmYsIHRleDEgICAgICAsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsCiAgICAgICAgICAgIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsCiAgICAgICAgICAgIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIG9yaWdpbiwgICAgIDB4MDAwMDAwZmYsIHRleCAgICAgICAsIDB4MDAwMDAwZmYsCiAgICAgICAgICAgIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsCiAgICAgICAgICAgIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsCiAgICAgICAgICAgIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsCiAgICAgICAgfTsKI3VuZGVmIHRleDEKI3VuZGVmIHRleDIKI3VuZGVmIG9yaWdpbgoKICAgICAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X0xvY2tSZWN0KHRleHR1cmUyLCAwLCAmbG9ja2VkX3JlY3QsIE5VTEwsIDApOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJMb2NrUmVjdCBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgICAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgICAgbWVtY3B5KCgoY2hhciAqKSBsb2NrZWRfcmVjdC5wQml0cykgKyBpICogbG9ja2VkX3JlY3QuUGl0Y2gsIHBpeGVsX2RhdGEgKyA4ICogaSwgOCAqIHNpemVvZihEV09SRCkpOwogICAgICAgIH0KICAgICAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X1VubG9ja1JlY3QodGV4dHVyZTIsIDApOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJMb2NrUmVjdCBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIChJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKikgdGV4dHVyZSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAxLCAoSURpcmVjdDNEQmFzZVRleHR1cmU5ICopIHRleHR1cmUyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDIsIChJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKikgdGV4dHVyZTEpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlKGRldmljZSwgMywgKElEaXJlY3QzREJhc2VUZXh0dXJlOSAqKSB0ZXh0dXJlMik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgcGl4ZWxfc2hhZGVyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWiB8IEQzREZWRl9URVg0KTsKICAgIG9rKFNVQ0NFRURFRChociksICJEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgYnVtcGVudm1hdFswXSA9LTEuMDsgIGJ1bXBlbnZtYXRbMl0gPSAgMi4wOwogICAgYnVtcGVudm1hdFsxXSA9IDAuMDsgIGJ1bXBlbnZtYXRbM10gPSAgMC4wOwogICAgSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDEsIEQzRFRTU19CVU1QRU5WTUFUMDAsICooTFBEV09SRCkmYnVtcGVudm1hdFswXSk7CiAgICBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMSwgRDNEVFNTX0JVTVBFTlZNQVQwMSwgKihMUERXT1JEKSZidW1wZW52bWF0WzFdKTsKICAgIElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAxLCBEM0RUU1NfQlVNUEVOVk1BVDEwLCAqKExQRFdPUkQpJmJ1bXBlbnZtYXRbMl0pOwogICAgSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDEsIEQzRFRTU19CVU1QRU5WTUFUMTEsICooTFBEV09SRCkmYnVtcGVudm1hdFszXSk7CgogICAgYnVtcGVudm1hdFswXSA9IDEuNTsgYnVtcGVudm1hdFsyXSA9ICAwLjA7CiAgICBidW1wZW52bWF0WzFdID0gMC4wOyBidW1wZW52bWF0WzNdID0gIDAuNTsKICAgIElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAzLCBEM0RUU1NfQlVNUEVOVk1BVDAwLCAqKExQRFdPUkQpJmJ1bXBlbnZtYXRbMF0pOwogICAgSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDMsIEQzRFRTU19CVU1QRU5WTUFUMDEsICooTFBEV09SRCkmYnVtcGVudm1hdFsxXSk7CiAgICBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMywgRDNEVFNTX0JVTVBFTlZNQVQxMCwgKihMUERXT1JEKSZidW1wZW52bWF0WzJdKTsKICAgIElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAzLCBEM0RUU1NfQlVNUEVOVk1BVDExLCAqKExQRFdPUkQpJmJ1bXBlbnZtYXRbM10pOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAwLCBEM0RTQU1QX0FERFJFU1NVLCBEM0RUQUREUkVTU19DTEFNUCk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9BRERSRVNTViwgRDNEVEFERFJFU1NfQ0xBTVApOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDEsIEQzRFNBTVBfQUREUkVTU1UsIEQzRFRBRERSRVNTX0NMQU1QKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAxLCBEM0RTQU1QX0FERFJFU1NWLCBEM0RUQUREUkVTU19DTEFNUCk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMiwgRDNEU0FNUF9BRERSRVNTVSwgRDNEVEFERFJFU1NfQ0xBTVApOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDIsIEQzRFNBTVBfQUREUkVTU1YsIEQzRFRBRERSRVNTX0NMQU1QKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAzLCBEM0RTQU1QX0FERFJFU1NVLCBEM0RUQUREUkVTU19DTEFNUCk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMywgRDNEU0FNUF9BRERSRVNTViwgRDNEVEFERFJFU1NfQ0xBTVApOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiQmVnaW5TY2VuZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGlmKFNVQ0NFRURFRChocikpIHsKICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQgZG91YmxlX3F1YWRbXSA9IHsKICAgICAgICAgICAgLTEuMCwgICAtMS4wLCAgIDAuMCwgICAgMC4wLCAgICAwLjAsICAgIDAuNSwgICAgMC41LCAgICAwLjAsICAgIDAuMCwgICAgMC41LCAgICAwLjUsCiAgICAgICAgICAgICAxLjAsICAgLTEuMCwgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAwLjUsICAgIDAuNSwgICAgMC4wLCAgICAwLjAsICAgIDAuNSwgICAgMC41LAogICAgICAgICAgICAtMS4wLCAgICAxLjAsICAgMC4wLCAgICAwLjAsICAgIDAuMCwgICAgMC41LCAgICAwLjUsICAgIDAuMCwgICAgMC4wLCAgICAwLjUsICAgIDAuNSwKICAgICAgICAgICAgIDEuMCwgICAgMS4wLCAgIDAuMCwgICAgMC4wLCAgICAwLjAsICAgIDAuNSwgICAgMC41LCAgICAwLjAsICAgIDAuMCwgICAgMC41LCAgICAwLjUsCiAgICAgICAgfTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIGRvdWJsZV9xdWFkLCBzaXplb2YoZmxvYXQpICogMTEpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkVuZFNjZW5lIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIG9rKFNVQ0NFRURFRChociksICJQcmVzZW50IGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwLCAyNDApOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmYwMCwgImRvdWJsZSB0ZXhiZW0gZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwLlxuIiwgY29sb3IpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlKGRldmljZSwgMCwgTlVMTCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAxLCBOVUxMKTsKICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDIsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlKGRldmljZSwgMywgTlVMTCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgTlVMTCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOV9SZWxlYXNlKHBpeGVsX3NoYWRlcik7CiAgICBJRGlyZWN0M0RUZXh0dXJlOV9SZWxlYXNlKHRleHR1cmUpOwogICAgSURpcmVjdDNEVGV4dHVyZTlfUmVsZWFzZSh0ZXh0dXJlMSk7CiAgICBJRGlyZWN0M0RUZXh0dXJlOV9SZWxlYXNlKHRleHR1cmUyKTsKfQoKc3RhdGljIHZvaWQgel9yYW5nZV90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgY29uc3Qgc3RydWN0IHZlcnRleCBxdWFkW10gPQogICAgewogICAgICAgIHstMS4wZiwgIDAuMGYsICAgMS4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDB9LAogICAgICAgIHstMS4wZiwgIDEuMGYsICAgMS4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDB9LAogICAgICAgIHsgMS4wZiwgIDAuMGYsICAtMS4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDB9LAogICAgICAgIHsgMS4wZiwgIDEuMGYsICAtMS4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDB9LAogICAgfTsKICAgIGNvbnN0IHN0cnVjdCB2ZXJ0ZXggcXVhZDJbXSA9CiAgICB7CiAgICAgICAgey0xLjBmLCAgMC4wZiwgICAxLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwMDBmZn0sCiAgICAgICAgey0xLjBmLCAgMS4wZiwgICAxLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwMDBmZn0sCiAgICAgICAgeyAxLjBmLCAgMC4wZiwgIC0xLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwMDBmZn0sCiAgICAgICAgeyAxLjBmLCAgMS4wZiwgIC0xLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwMDBmZn0sCiAgICB9OwoKICAgIGNvbnN0IHN0cnVjdCB0dmVydGV4IHF1YWQzW10gPQogICAgewogICAgICAgIHsgICAgMCwgICAyNDAsICAgMS4xZiwgIDEuMCwgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmMDB9LAogICAgICAgIHsgICAgMCwgICA0ODAsICAgMS4xZiwgIDEuMCwgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmMDB9LAogICAgICAgIHsgIDY0MCwgICAyNDAsICAtMS4xZiwgIDEuMCwgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmMDB9LAogICAgICAgIHsgIDY0MCwgICA0ODAsICAtMS4xZiwgIDEuMCwgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmMDB9LAogICAgfTsKICAgIGNvbnN0IHN0cnVjdCB0dmVydGV4IHF1YWQ0W10gPQogICAgewogICAgICAgIHsgICAgMCwgICAyNDAsICAgMS4xZiwgIDEuMCwgICAgICAgICAgICAgICAgICAgIDB4ZmYwMGZmMDB9LAogICAgICAgIHsgICAgMCwgICA0ODAsICAgMS4xZiwgIDEuMCwgICAgICAgICAgICAgICAgICAgIDB4ZmYwMGZmMDB9LAogICAgICAgIHsgIDY0MCwgICAyNDAsICAtMS4xZiwgIDEuMCwgICAgICAgICAgICAgICAgICAgIDB4ZmYwMGZmMDB9LAogICAgICAgIHsgIDY0MCwgICA0ODAsICAtMS4xZiwgIDEuMCwgICAgICAgICAgICAgICAgICAgIDB4ZmYwMGZmMDB9LAogICAgfTsKICAgIEhSRVNVTFQgaHI7CiAgICBEV09SRCBjb2xvcjsKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKnNoYWRlcjsKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqZGVjbDsKICAgIEQzRENBUFM5IGNhcHM7CiAgICBjb25zdCBEV09SRCBzaGFkZXJfY29kZVtdID0gewogICAgICAgIDB4ZmZmZTAxMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzXzFfMSAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgICAgICAgICAvKiBkY2xfcG9zaXRpb24gdjAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHhjMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgLyogbW92IG9Qb3MsIHYwICAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ZDAwZjAwMDAsIDB4YTBlNDAwMDAsICAgICAgICAgICAgIC8qIG1vdiBvRDAsIGMwICAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICovCiAgICB9OwogICAgc3RhdGljIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xfZWxlbWVudHNbXSA9IHsKICAgICAgICB7MCwgMCwgIEQzRERFQ0xUWVBFX0ZMT0FUMywgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9QT1NJVElPTiwgMH0sCiAgICAgICAgRDNEREVDTF9FTkQoKQogICAgfTsKICAgIC8qIERvZXMgdGhlIFByZXNlbnQgY2xlYXIgdGhlIGRlcHRoIHN0ZW5jaWw/IENsZWFyIHRoZSBkZXB0aCBidWZmZXIgd2l0aCBzb21lIHZhbHVlICE9IDAsCiAgICAgKiB0aGVuIGNhbGwgUHJlc2VudC4gVGhlbiBjbGVhciB0aGUgY29sb3IgYnVmZmVyIHRvIG1ha2Ugc3VyZSBpdCBoYXMgc29tZSBkZWZpbmVkIGNvbnRlbnQKICAgICAqIGFmdGVyIHRoZSBQcmVzZW50IHdpdGggRDNEU1dBUEVGRkVDVF9ESVNDQVJELiBBZnRlciB0aGF0IGRyYXcgYSBwbGFuZSB0aGF0IGlzIHNvbWV3aGVyZSBjdXQKICAgICAqIGJ5IHRoZSBkZXB0aCB2YWx1ZS4KICAgICAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VUIHwgRDNEQ0xFQVJfWkJVRkZFUiwgMHhmZmZmZmZmZiwgMC43NSwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmZmZmZiwgMC40LCAwKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19DTElQUElORywgVFJVRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfWkVOQUJMRSwgRDNEWkJfVFJVRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfWldSSVRFRU5BQkxFLCBGQUxTRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfWkZVTkMsIEQzRENNUF9HUkVBVEVSKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWiB8IEQzREZWRl9ESUZGVVNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0RlZGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihociA9PSBEM0RfT0spCiAgICB7CiAgICAgICAgLyogVGVzdCB0aGUgdW50cmFuc2Zvcm1lZCB2ZXJ0ZXggcGF0aCAqLwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyIC8qUHJpbUNvdW50ICovLCBxdWFkLCBzaXplb2YocXVhZFswXSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19aRlVOQywgRDNEQ01QX0xFU1MpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIgLypQcmltQ291bnQgKi8sIHF1YWQyLCBzaXplb2YocXVhZDJbMF0pKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIC8qIFRlc3QgdGhlIHRyYW5zZm9ybWVkIHZlcnRleCBwYXRoICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVpSSFcgfCBEM0RGVkZfRElGRlVTRSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyIC8qUHJpbUNvdW50ICovLCBxdWFkNCwgc2l6ZW9mKHF1YWQ0WzBdKSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3SW5kZXhlZFByaW1pdGl2ZVVQIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX1pGVU5DLCBEM0RDTVBfR1JFQVRFUik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiAvKlByaW1Db3VudCAqLywgcXVhZDMsIHNpemVvZihxdWFkM1swXSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlByZXNlbnQgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgLyogRG8gbm90IHRlc3QgdGhlIGV4YWN0IGNvcm5lciBwaXhlbHMsIGJ1dCBnbyBwcmV0dHkgY2xvc2UgdG8gdGhlbSAqLwoKICAgIC8qIENsaXBwZWQgYmVjYXVzZSB6ID4gMS4wICovCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAyOCwgMjM4KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJaIHJhbmdlIGZhaWxlZDogR290IGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMGZmZmZmZi5cbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDI4LCAyNDEpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgIlogcmFuZ2UgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmLlxuIiwgY29sb3IpOwoKICAgIC8qIE5vdCBjbGlwcGVkLCA+IHogYnVmZmVyIGNsZWFyIHZhbHVlKDAuNzUpICovCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMSwgMjM4KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsICJaIHJhbmdlIGZhaWxlZDogR290IGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMC5cbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDMxLCAyNDEpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmYwMCwgIlogcmFuZ2UgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwLlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTAwLCAyMzgpOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIlogcmFuZ2UgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmYwMDAwLlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTAwLCAyNDEpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmYwMCwgIlogcmFuZ2UgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwLlxuIiwgY29sb3IpOwoKICAgIC8qIE5vdCBjbGlwcGVkLCA8IHogYnVmZmVyIGNsZWFyIHZhbHVlICovCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxMDQsIDIzOCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAiWiByYW5nZSBmYWlsZWQ6IEdvdCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmYuXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxMDQsIDI0MSk7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZjAwLCAiWiByYW5nZSBmYWlsZWQ6IEdvdCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDAuXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMTgsIDIzOCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAiWiByYW5nZSBmYWlsZWQ6IEdvdCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmYuXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMTgsIDI0MSk7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZjAwLCAiWiByYW5nZSBmYWlsZWQ6IEdvdCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDAuXG4iLCBjb2xvcik7CgogICAgLyogQ2xpcHBlZCBiZWNhdXNlIHogPCAwLjAgKi8KICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDMyMSwgMjM4KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJaIHJhbmdlIGZhaWxlZDogR290IGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMGZmZmZmZi5cbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDMyMSwgMjQxKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJaIHJhbmdlIGZhaWxlZDogR290IGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMGZmZmZmZi5cbiIsIGNvbG9yKTsKCiAgICAvKiBUZXN0IHRoZSBzaGFkZXIgcGF0aCAqLwogICAgSURpcmVjdDNERGV2aWNlOV9HZXREZXZpY2VDYXBzKGRldmljZSwgJmNhcHMpOwogICAgaWYgKGNhcHMuVmVydGV4U2hhZGVyVmVyc2lvbiA8IEQzRFZTX1ZFUlNJT04oMSwgMSkpIHsKICAgICAgICBza2lwKCJWZXJ0ZXggc2hhZGVycyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICBnb3RvIG91dDsKICAgIH0KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBzaGFkZXJfY29kZSwgJnNoYWRlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHMsICZkZWNsKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmZmZmZmLCAwLjQsIDApOwoKICAgIElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIHNoYWRlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoaHIgPT0gRDNEX09LKQogICAgewogICAgICAgIGZsb2F0IGNvbG9yZltdID0gezEuMCwgMC4wLCAwLjAsIDEuMH07CiAgICAgICAgZmxvYXQgY29sb3JmMltdID0gezAuMCwgMC4wLCAxLjAsIDEuMH07CiAgICAgICAgSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoZGV2aWNlLCAwLCBjb2xvcmYsIDEpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyIC8qUHJpbUNvdW50ICovLCBxdWFkLCBzaXplb2YocXVhZFswXSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19aRlVOQywgRDNEQ01QX0xFU1MpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoZGV2aWNlLCAwLCBjb2xvcmYyLCAxKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiAvKlByaW1Db3VudCAqLywgcXVhZDIsIHNpemVvZihxdWFkMlswXSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KCiAgICBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOV9SZWxlYXNlKGRlY2wpOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOV9SZWxlYXNlKHNoYWRlcik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIG9rKFNVQ0NFRURFRChociksICJQcmVzZW50IGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgLyogWiA8IDEuMCAqLwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMjgsIDIzOCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiWiByYW5nZSBmYWlsZWQ6IEdvdCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmYuXG4iLCBjb2xvcik7CgogICAgLyogMS4wIDwgeiA8IDAuNzUgKi8KICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDMxLCAyMzgpOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIlogcmFuZ2UgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmYwMDAwLlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTAwLCAyMzgpOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIlogcmFuZ2UgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmYwMDAwLlxuIiwgY29sb3IpOwoKICAgIC8qIDAuNzUgPCB6IDwgMC4wICovCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxMDQsIDIzOCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAiWiByYW5nZSBmYWlsZWQ6IEdvdCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmYuXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMTgsIDIzOCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAiWiByYW5nZSBmYWlsZWQ6IEdvdCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmYuXG4iLCBjb2xvcik7CgogICAgLyogMC4wIDwgeiAqLwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIxLCAyMzgpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgIlogcmFuZ2UgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmLlxuIiwgY29sb3IpOwoKICAgIG91dDoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX1pFTkFCTEUsIEQzRFpCX0ZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19DTElQUElORywgRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX1pXUklURUVOQUJMRSwgVFJVRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwp9CgpzdGF0aWMgdm9pZCBmaWxsX3N1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKnN1cmZhY2UsIERXT1JEIGNvbG9yKQp7CiAgICBEM0RTVVJGQUNFX0RFU0MgZGVzYzsKICAgIEQzRExPQ0tFRF9SRUNUIGw7CiAgICBIUkVTVUxUIGhyOwogICAgdW5zaWduZWQgaW50IHgsIHk7CiAgICBEV09SRCAqbWVtOwoKICAgIG1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKICAgIG1lbXNldCgmbCwgMCwgc2l6ZW9mKGwpKTsKICAgIGhyID0gSURpcmVjdDNEU3VyZmFjZTlfR2V0RGVzYyhzdXJmYWNlLCAmZGVzYyk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RTdXJmYWNlOV9HZXREZXNjIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0RTdXJmYWNlOV9Mb2NrUmVjdChzdXJmYWNlLCAmbCwgTlVMTCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RTdXJmYWNlOV9Mb2NrUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKEZBSUxFRChocikpIHJldHVybjsKCiAgICBmb3IoeSA9IDA7IHkgPCBkZXNjLkhlaWdodDsgeSsrKQogICAgewogICAgICAgIG1lbSA9IChEV09SRCAqKSAoKEJZVEUgKikgbC5wQml0cyArIHkgKiBsLlBpdGNoKTsKICAgICAgICBmb3IoeCA9IDA7IHggPCBsLlBpdGNoIC8gc2l6ZW9mKERXT1JEKTsgeCsrKQogICAgICAgIHsKICAgICAgICAgICAgbWVtW3hdID0gY29sb3I7CiAgICAgICAgfQogICAgfQogICAgaHIgPSBJRGlyZWN0M0RTdXJmYWNlOV9VbmxvY2tSZWN0KHN1cmZhY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEU3VyZmFjZTlfVW5sb2NrUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKfQoKc3RhdGljIHZvaWQgbWF4bWlwX3Rlc3QoSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlKQp7CiAgICBJRGlyZWN0M0RUZXh0dXJlOSAqdGV4dHVyZSA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZSA9IE5VTEw7CiAgICBIUkVTVUxUIGhyOwogICAgRFdPUkQgY29sb3I7CiAgICBjb25zdCBmbG9hdCBxdWFkc1tdID0gewogICAgICAgIC0xLjAsICAgLTEuMCwgICAwLjAsICAgIDAuMCwgICAgMC4wLAogICAgICAgIC0xLjAsICAgIDAuMCwgICAwLjAsICAgIDAuMCwgICAgMS4wLAogICAgICAgICAwLjAsICAgLTEuMCwgICAwLjAsICAgIDEuMCwgICAgMC4wLAogICAgICAgICAwLjAsICAgIDAuMCwgICAwLjAsICAgIDEuMCwgICAgMS4wLAoKICAgICAgICAgMC4wLCAgIC0xLjAsICAgMC4wLCAgICAwLjAsICAgIDAuMCwKICAgICAgICAgMC4wLCAgICAwLjAsICAgMC4wLCAgICAwLjAsICAgIDEuMCwKICAgICAgICAgMS4wLCAgIC0xLjAsICAgMC4wLCAgICAxLjAsICAgIDAuMCwKICAgICAgICAgMS4wLCAgICAwLjAsICAgMC4wLCAgICAxLjAsICAgIDEuMCwKCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMCwgICAgMC4wLCAgICAwLjAsCiAgICAgICAgIDAuMCwgICAgMS4wLCAgIDAuMCwgICAgMC4wLCAgICAxLjAsCiAgICAgICAgIDEuMCwgICAgMC4wLCAgIDAuMCwgICAgMS4wLCAgICAwLjAsCiAgICAgICAgIDEuMCwgICAgMS4wLCAgIDAuMCwgICAgMS4wLCAgICAxLjAsCgogICAgICAgIC0xLjAsICAgIDAuMCwgICAwLjAsICAgIDAuMCwgICAgMC4wLAogICAgICAgIC0xLjAsICAgIDEuMCwgICAwLjAsICAgIDAuMCwgICAgMS4wLAogICAgICAgICAwLjAsICAgIDAuMCwgICAwLjAsICAgIDEuMCwgICAgMC4wLAogICAgICAgICAwLjAsICAgIDEuMCwgICAwLjAsICAgIDEuMCwgICAgMS4wLAogICAgfTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQgfCBEM0RDTEVBUl9aQlVGRkVSLCAweGZmZmZmZmZmLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZShkZXZpY2UsIDEyOCwgMTI4LCAzLCAwLCBEM0RGTVRfQThSOEc4QjgsIEQzRFBPT0xfTUFOQUdFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0dXJlLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKCF0ZXh0dXJlKQogICAgewogICAgICAgIHNraXAoIkZhaWxlZCB0byBjcmVhdGUgdGVzdCB0ZXh0dXJlXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0RUZXh0dXJlOV9HZXRTdXJmYWNlTGV2ZWwodGV4dHVyZSwgMCwgJnN1cmZhY2UpOwogICAgZmlsbF9zdXJmYWNlKHN1cmZhY2UsIDB4ZmZmZjAwMDApOwogICAgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShzdXJmYWNlKTsKICAgIGhyID0gSURpcmVjdDNEVGV4dHVyZTlfR2V0U3VyZmFjZUxldmVsKHRleHR1cmUsIDEsICZzdXJmYWNlKTsKICAgIGZpbGxfc3VyZmFjZShzdXJmYWNlLCAweGZmMDBmZjAwKTsKICAgIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2Uoc3VyZmFjZSk7CiAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X0dldFN1cmZhY2VMZXZlbCh0ZXh0dXJlLCAyLCAmc3VyZmFjZSk7CiAgICBmaWxsX3N1cmZhY2Uoc3VyZmFjZSwgMHhmZjAwMDBmZik7CiAgICBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKHN1cmZhY2UpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlKGRldmljZSwgMCwgKElEaXJlY3QzREJhc2VUZXh0dXJlOSAqKSB0ZXh0dXJlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaIHwgRDNERlZGX1RFWDEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDAsIEQzRFNBTVBfTUlQRklMVEVSLCBEM0RURVhGX05PTkUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDAsIEQzRFNBTVBfTUFYTUlQTEVWRUwsIDApOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCAmcXVhZHNbIDBdLCA1ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAwLCBEM0RTQU1QX01BWE1JUExFVkVMLCAxKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgJnF1YWRzWzIwXSwgNSAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9NQVhNSVBMRVZFTCwgMik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsICZxdWFkc1s0MF0sIDUgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDAsIEQzRFNBTVBfTUFYTUlQTEVWRUwsIDMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCAmcXVhZHNbNjBdLCA1ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIG9rKFNVQ0NFRURFRChociksICJQcmVzZW50IGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgLyogV2l0aCBtaXBtYXBwaW5nIGRpc2FibGVkLCB0aGUgbWF4IG1pcCBsZXZlbCBpcyBpZ25vcmVkLCBvbmx5IGxldmVsIDAgaXMgdXNlZCAqLwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOwogICAgb2soY29sb3IgPT0gMHgwMEZGMDAwMCwgIk1hcE1pcCAwLCBubyBtaXBmaWx0ZXIgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMTIwKTsKICAgIG9rKGNvbG9yID09IDB4MDBGRjAwMDAsICJNYXBNaXAgMywgbm8gbWlwZmlsdGVyIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDEyMCk7CiAgICBvayhjb2xvciA9PSAweDAwRkYwMDAwLCAiTWFwTWlwIDIsIG5vIG1pcGZpbHRlciBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAzNjApOwogICAgb2soY29sb3IgPT0gMHgwMEZGMDAwMCwgIk1hcE1pcCAxLCBubyBtaXBmaWx0ZXIgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQgfCBEM0RDTEVBUl9aQlVGRkVSLCAweGZmZmZmZmZmLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9NSVBGSUxURVIsIEQzRFRFWEZfUE9JTlQpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDAsIEQzRFNBTVBfTUFYTUlQTEVWRUwsIDApOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCAmcXVhZHNbIDBdLCA1ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAwLCBEM0RTQU1QX01BWE1JUExFVkVMLCAxKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgJnF1YWRzWzIwXSwgNSAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9NQVhNSVBMRVZFTCwgMik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsICZxdWFkc1s0MF0sIDUgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDAsIEQzRFNBTVBfTUFYTUlQTEVWRUwsIDMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCAmcXVhZHNbNjBdLCA1ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDAsIEQzRFNBTVBfTUFYTUlQTEVWRUwsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9NSVBGSUxURVIsIEQzRFRFWEZfTk9ORSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlByZXNlbnQgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICAvKiBNYXggTWlwIGxldmVsIDAtMiBzYW1wbGUgZnJvbSB0aGUgc3BlY2lmaWVkIHRleHR1cmUgbGV2ZWwsIE1heCBNaXAgbGV2ZWwgMyg+IGxldmVscyBpbiB0ZXh0dXJlKQogICAgICogc2FtcGxlcyBmcm9tIHRoZSBoaWdoZXN0IGxldmVsIGluIHRoZSB0ZXh0dXJlKGxldmVsIDIpCiAgICAgKi8KICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMzYwKTsKICAgIG9rKGNvbG9yID09IDB4MDBGRjAwMDAsICJNYXBNaXAgMCwgcG9pbnQgbWlwZmlsdGVyIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMEZGLCAiTWFwTWlwIDMsIHBvaW50IG1pcGZpbHRlciBoYXMgY29sb3IgJTA4eFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAxMjApOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBGRiwgIk1hcE1pcCAyLCBwb2ludCBtaXBmaWx0ZXIgaGFzIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMzYwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMEZGMDAsICJNYXBNaXAgMSwgcG9pbnQgbWlwZmlsdGVyIGhhcyBjb2xvciAlMDh4XG4iLCBjb2xvcik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAwLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAwLCBEM0RTQU1QX01BWE1JUExFVkVMLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgSURpcmVjdDNEVGV4dHVyZTlfUmVsZWFzZSh0ZXh0dXJlKTsKfQoKc3RhdGljIHZvaWQgcmVsZWFzZV9idWZmZXJfdGVzdChJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UpCnsKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKnZiID0gTlVMTDsKICAgIElEaXJlY3QzREluZGV4QnVmZmVyOSAqaWIgPSBOVUxMOwogICAgSFJFU1VMVCBocjsKICAgIEJZVEUgKmRhdGE7CiAgICBsb25nIHJlZjsKCiAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHZlcnRleCBxdWFkW10gPSB7CiAgICAgICAgey0xLjAsICAgICAgLTEuMCwgICAgICAgMC4xLCAgICAgICAgMHhmZmZmMDAwMH0sCiAgICAgICAgey0xLjAsICAgICAgIDEuMCwgICAgICAgMC4xLCAgICAgICAgMHhmZmZmMDAwMH0sCiAgICAgICAgeyAxLjAsICAgICAgIDEuMCwgICAgICAgMC4xLCAgICAgICAgMHhmZmZmMDAwMH0sCgogICAgICAgIHstMS4wLCAgICAgIC0xLjAsICAgICAgIDAuMSwgICAgICAgIDB4ZmYwMGZmMDB9LAogICAgICAgIHstMS4wLCAgICAgICAxLjAsICAgICAgIDAuMSwgICAgICAgIDB4ZmYwMGZmMDB9LAogICAgICAgIHsgMS4wLCAgICAgICAxLjAsICAgICAgIDAuMSwgICAgICAgIDB4ZmYwMGZmMDB9CiAgICB9OwogICAgc2hvcnQgaW5kaWNlc1tdID0gezMsIDQsIDV9OwoKICAgIC8qIEluZGV4IGFuZCB2ZXJ0ZXggYnVmZmVycyBzaG91bGQgYWx3YXlzIGJlIGNyZWF0YWJsZSAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleEJ1ZmZlcihkZXZpY2UsIHNpemVvZihxdWFkKSwgMCwgRDNERlZGX1hZWiB8IEQzREZWRl9ESUZGVVNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUE9PTF9NQU5BR0VELCAmdmIsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiQ3JlYXRlVmVydGV4QnVmZmVyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIXZiKSB7CiAgICAgICAgc2tpcCgiRmFpbGVkIHRvIGNyZWF0ZSBhIHZlcnRleCBidWZmZXJcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVJbmRleEJ1ZmZlcihkZXZpY2UsIHNpemVvZihpbmRpY2VzKSwgMCwgRDNERk1UX0lOREVYMTYsIEQzRFBPT0xfREVGQVVMVCwgJmliLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlSW5kZXhCdWZmZXIgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighaWIpIHsKICAgICAgICBza2lwKCJGYWlsZWQgdG8gY3JlYXRlIGFuIGluZGV4IGJ1ZmZlclxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNEVmVydGV4QnVmZmVyOV9Mb2NrKHZiLCAwLCBzaXplb2YocXVhZCksICh2b2lkICoqKSAmZGF0YSwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X0xvY2sgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBtZW1jcHkoZGF0YSwgcXVhZCwgc2l6ZW9mKHF1YWQpKTsKICAgIGhyID0gSURpcmVjdDNEVmVydGV4QnVmZmVyOV9VbmxvY2sodmIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOV9VbmxvY2sgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjlfTG9jayhpYiwgMCwgc2l6ZW9mKGluZGljZXMpLCAodm9pZCAqKikgJmRhdGEsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNESW5kZXhCdWZmZXI5X0xvY2sgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBtZW1jcHkoZGF0YSwgaW5kaWNlcywgc2l6ZW9mKGluZGljZXMpKTsKICAgIGhyID0gSURpcmVjdDNESW5kZXhCdWZmZXI5X1VubG9jayhpYik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RJbmRleEJ1ZmZlcjlfVW5sb2NrIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRJbmRpY2VzKGRldmljZSwgaWIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNESW5kZXhCdWZmZXI4X1VubG9jayBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UoZGV2aWNlLCAwLCB2YiwgMCwgc2l6ZW9mKHF1YWRbMF0pKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzREluZGV4QnVmZmVyOF9VbmxvY2sgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWiB8IEQzREZWRl9ESUZGVVNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0RlZGIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIE5vdyBkZXN0cm95IHRoZSBib3VuZCBpbmRleCBidWZmZXIgYW5kIGRyYXcgYWdhaW4gKi8KICAgIHJlZiA9IElEaXJlY3QzREluZGV4QnVmZmVyOV9SZWxlYXNlKGliKTsKICAgIG9rKHJlZiA9PSAwLCAiSW5kZXggQnVmZmVyIHJlZmVyZW5jZSBjb3VudCBpcyAlMDhsZFxuIiwgcmVmKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmYwMDAwZmYsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIGZhaWxlZCB3aXRoICUwOHhcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIGZhaWxlZCB3aXRoICUwOHhcbiIsIGhyKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgLyogRGVsaWJlcmF0ZWx5IHVzaW5nIG1pbnZlcnRleGluZGV4ID0gMCBhbmQgbnVtVmVydGljZXMgPSA2IHRvIHByZXZlbnQgZDNkIGZyb20KICAgICAgICAgKiBtYWtpbmcgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGluZGljZXMgb3IgdmVydGljZXMKICAgICAgICAgKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmUoZGV2aWNlLCBEM0RQVF9UUklBTkdMRUxJU1QsIDAsIDMsIDMsIDAsIDEpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmUgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRJbmRpY2VzKGRldmljZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RJbmRleEJ1ZmZlcjlfVW5sb2NrIGZhaWxlZCB3aXRoICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UoZGV2aWNlLCAwLCBOVUxMLCAwLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzREluZGV4QnVmZmVyOV9VbmxvY2sgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwoKICAgIC8qIEluZGV4IGJ1ZmZlciB3YXMgYWxyZWFkeSBkZXN0cm95ZWQgYXMgcGFydCBvZiB0aGUgdGVzdCAqLwogICAgSURpcmVjdDNEVmVydGV4QnVmZmVyOV9SZWxlYXNlKHZiKTsKfQoKc3RhdGljIHZvaWQgZmxvYXRfdGV4dHVyZV90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgSURpcmVjdDNEOSAqZDNkID0gTlVMTDsKICAgIEhSRVNVTFQgaHI7CiAgICBJRGlyZWN0M0RUZXh0dXJlOSAqdGV4dHVyZSA9IE5VTEw7CiAgICBEM0RMT0NLRURfUkVDVCBscjsKICAgIGZsb2F0ICpkYXRhOwogICAgRFdPUkQgY29sb3I7CiAgICBmbG9hdCBxdWFkW10gPSB7CiAgICAgICAgLTEuMCwgICAgICAtMS4wLCAgICAgICAwLjEsICAgICAwLjAsICAgIDAuMCwKICAgICAgICAtMS4wLCAgICAgICAxLjAsICAgICAgIDAuMSwgICAgIDAuMCwgICAgMS4wLAogICAgICAgICAxLjAsICAgICAgLTEuMCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAwLjAsCiAgICAgICAgIDEuMCwgICAgICAgMS4wLCAgICAgICAwLjEsICAgICAxLjAsICAgIDEuMCwKICAgIH07CgogICAgbWVtc2V0KCZsciwgMCwgc2l6ZW9mKGxyKSk7CiAgICBJRGlyZWN0M0REZXZpY2U5X0dldERpcmVjdDNEKGRldmljZSwgJmQzZCk7CiAgICBpZihJRGlyZWN0M0Q5X0NoZWNrRGV2aWNlRm9ybWF0KGQzZCwgMCwgRDNEREVWVFlQRV9IQUwsIEQzREZNVF9YOFI4RzhCOCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJUWVBFX1RFWFRVUkUsIEQzREZNVF9SMzJGKSAhPSBEM0RfT0spIHsKICAgICAgICBza2lwKCJEM0RGTVRfUjMyRiB0ZXh0dXJlcyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICBnb3RvIG91dDsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZShkZXZpY2UsIDEsIDEsIDEsIDAsIEQzREZNVF9SMzJGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUE9PTF9NQU5BR0VELCAmdGV4dHVyZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVRleHR1cmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighdGV4dHVyZSkgewogICAgICAgIHNraXAoIkZhaWxlZCB0byBjcmVhdGUgUjMyRiB0ZXh0dXJlXG4iKTsKICAgICAgICBnb3RvIG91dDsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X0xvY2tSZWN0KHRleHR1cmUsIDAsICZsciwgTlVMTCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RUZXh0dXJlOV9Mb2NrUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGRhdGEgPSBsci5wQml0czsKICAgICpkYXRhID0gMC4wOwogICAgaHIgPSBJRGlyZWN0M0RUZXh0dXJlOV9VbmxvY2tSZWN0KHRleHR1cmUsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVGV4dHVyZTlfVW5sb2NrUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIChJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKikgdGV4dHVyZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVogfCBEM0RGVkZfVEVYMSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkLCA1ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMjQwLCAzMjApOwogICAgb2soY29sb3IgPT0gMHgwMDAwRkZGRiwgIlIzMkYgd2l0aCB2YWx1ZSAwLjAgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMEZGRkZcbiIsIGNvbG9yKTsKCm91dDoKICAgIGlmKHRleHR1cmUpIElEaXJlY3QzRFRleHR1cmU5X1JlbGVhc2UodGV4dHVyZSk7CiAgICBJRGlyZWN0M0Q5X1JlbGVhc2UoZDNkKTsKfQoKc3RhdGljIHZvaWQgZzE2cjE2X3RleHR1cmVfdGVzdChJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UpCnsKICAgIElEaXJlY3QzRDkgKmQzZCA9IE5VTEw7CiAgICBIUkVTVUxUIGhyOwogICAgSURpcmVjdDNEVGV4dHVyZTkgKnRleHR1cmUgPSBOVUxMOwogICAgRDNETE9DS0VEX1JFQ1QgbHI7CiAgICBEV09SRCAqZGF0YTsKICAgIERXT1JEIGNvbG9yLCByZWQsIGdyZWVuLCBibHVlOwogICAgZmxvYXQgcXVhZFtdID0gewogICAgICAgLTEuMCwgICAgICAtMS4wLCAgICAgICAwLjEsICAgICAwLjAsICAgIDAuMCwKICAgICAgIC0xLjAsICAgICAgIDEuMCwgICAgICAgMC4xLCAgICAgMC4wLCAgICAxLjAsCiAgICAgICAgMS4wLCAgICAgIC0xLjAsICAgICAgIDAuMSwgICAgIDEuMCwgICAgMC4wLAogICAgICAgIDEuMCwgICAgICAgMS4wLCAgICAgICAwLjEsICAgICAxLjAsICAgIDEuMCwKICAgIH07CgogICAgbWVtc2V0KCZsciwgMCwgc2l6ZW9mKGxyKSk7CiAgICBJRGlyZWN0M0REZXZpY2U5X0dldERpcmVjdDNEKGRldmljZSwgJmQzZCk7CiAgICBpZihJRGlyZWN0M0Q5X0NoZWNrRGV2aWNlRm9ybWF0KGQzZCwgMCwgRDNEREVWVFlQRV9IQUwsIEQzREZNVF9YOFI4RzhCOCwgMCwKICAgICAgIEQzRFJUWVBFX1RFWFRVUkUsIEQzREZNVF9HMTZSMTYpICE9IEQzRF9PSykgewogICAgICAgICAgIHNraXAoIkQzREZNVF9HMTZSMTYgdGV4dHVyZXMgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgZ290byBvdXQ7CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVRleHR1cmUoZGV2aWNlLCAxLCAxLCAxLCAwLCBEM0RGTVRfRzE2UjE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUE9PTF9NQU5BR0VELCAmdGV4dHVyZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVRleHR1cmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighdGV4dHVyZSkgewogICAgICAgIHNraXAoIkZhaWxlZCB0byBjcmVhdGUgRDNERk1UX0cxNlIxNiB0ZXh0dXJlXG4iKTsKICAgICAgICBnb3RvIG91dDsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X0xvY2tSZWN0KHRleHR1cmUsIDAsICZsciwgTlVMTCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RUZXh0dXJlOV9Mb2NrUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGRhdGEgPSBsci5wQml0czsKICAgICpkYXRhID0gMHgwZjAwZjAwMDsKICAgIGhyID0gSURpcmVjdDNEVGV4dHVyZTlfVW5sb2NrUmVjdCh0ZXh0dXJlLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFRleHR1cmU5X1VubG9ja1JlY3QgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAwLCAoSURpcmVjdDNEQmFzZVRleHR1cmU5ICopIHRleHR1cmUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaIHwgRDNERlZGX1RFWDEpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0RlZGIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZCwgNSAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAwLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDI0MCwgMzIwKTsKICAgIHJlZCAgID0gKGNvbG9yICYgMHgwMGZmMDAwMCkgPj4gMTY7CiAgICBncmVlbiA9IChjb2xvciAmIDB4MDAwMGZmMDApID4+ICA4OwogICAgYmx1ZSAgPSAoY29sb3IgJiAweDAwMDAwMGZmKSA+PiAgMDsKICAgIG9rKGJsdWUgPT0gMHhmZiAmJiByZWQgPj0gMHhlZiAmJiByZWQgPD0gMHhmMSAmJiBncmVlbiA+PSAweDBlICYmIGdyZWVuIDw9IDB4MTAsCiAgICAgICAiRDNERk1UX0cxNlIxNiB3aXRoIHZhbHVlIDB4MDBmZmZmMDAgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBGMDBGRkZcbiIsIGNvbG9yKTsKCm91dDoKICAgIGlmKHRleHR1cmUpIElEaXJlY3QzRFRleHR1cmU5X1JlbGVhc2UodGV4dHVyZSk7CiAgICBJRGlyZWN0M0Q5X1JlbGVhc2UoZDNkKTsKfQoKc3RhdGljIHZvaWQgdGV4dHVyZV90cmFuc2Zvcm1fZmxhZ3NfdGVzdChJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UpCnsKICAgIEhSRVNVTFQgaHI7CiAgICBJRGlyZWN0M0Q5ICpkM2Q7CiAgICBEM0RGT1JNQVQgZm10ID0gRDNERk1UX1g4UjhHOEI4OwogICAgRDNEQ0FQUzkgY2FwczsKICAgIElEaXJlY3QzRFRleHR1cmU5ICp0ZXh0dXJlID0gTlVMTDsKICAgIElEaXJlY3QzRFZvbHVtZVRleHR1cmU5ICp2b2x1bWUgPSBOVUxMOwogICAgdW5zaWduZWQgaW50IHgsIHksIHo7CiAgICBEM0RMT0NLRURfUkVDVCBscjsKICAgIEQzRExPQ0tFRF9CT1ggbGI7CiAgICBEV09SRCBjb2xvcjsKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqZGVjbCwgKmRlY2wyOwogICAgZmxvYXQgaWRlbnRpdHlbMTZdID0gezEuMCwgMC4wLCAwLjAsIDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAxLjAsIDAuMCwgMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDAuMCwgMS4wLCAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIDEuMH07CiAgICBzdGF0aWMgY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgZGVjbF9lbGVtZW50c1tdID0gewogICAgICAgIHswLCAwLCAgRDNEREVDTFRZUEVfRkxPQVQzLCBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9QT1NJVElPTiwgMH0sCiAgICAgICAgezAsIDEyLCBEM0RERUNMVFlQRV9GTE9BVDMsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1RFWENPT1JELCAwfSwKICAgICAgICBEM0RERUNMX0VORCgpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xfZWxlbWVudHMyW10gPSB7CiAgICAgICAgezAsIDAsICBEM0RERUNMVFlQRV9GTE9BVDMsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1BPU0lUSU9OLCAwfSwKICAgICAgICB7MCwgMTIsIEQzRERFQ0xUWVBFX0ZMT0FUMSwgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfVEVYQ09PUkQsIDB9LAogICAgICAgIEQzRERFQ0xfRU5EKCkKICAgIH07CgogICAgbWVtc2V0KCZsciwgMCwgc2l6ZW9mKGxyKSk7CiAgICBtZW1zZXQoJmxiLCAwLCBzaXplb2YobGIpKTsKICAgIElEaXJlY3QzRERldmljZTlfR2V0RGlyZWN0M0QoZGV2aWNlLCAmZDNkKTsKICAgIGlmKElEaXJlY3QzRDlfQ2hlY2tEZXZpY2VGb3JtYXQoZDNkLCAwLCBEM0RERVZUWVBFX0hBTCwgRDNERk1UX1g4UjhHOEI4LCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUlRZUEVfVEVYVFVSRSwgRDNERk1UX0ExNkIxNkcxNlIxNikgPT0gRDNEX09LKSB7CiAgICAgICAgZm10ID0gRDNERk1UX0ExNkIxNkcxNlIxNjsKICAgIH0KICAgIElEaXJlY3QzRDlfUmVsZWFzZShkM2QpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHMsICZkZWNsKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzMiwgJmRlY2wyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9TUkdCVEVYVFVSRSwgRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoRDNEU0FNUF9TUkdCVEVYVFVSRSkgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9NQUdGSUxURVIsIEQzRFRFWEZfUE9JTlQpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoRDNEU0FNUF9NQUdGSUxURVIpIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDAsIEQzRFNBTVBfTUlORklMVEVSLCBEM0RURVhGX1BPSU5UKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKEQzRFNBTVBfTUlORklMVEVSKSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAwLCBEM0RTQU1QX01JUEZJTFRFUiwgRDNEVEVYRl9OT05FKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKEQzRFNBTVBfTUlQRklMVEVSKSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAwLCBEM0RTQU1QX0FERFJFU1NVLCBEM0RUQUREUkVTU19DTEFNUCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShEM0RTQU1QX0FERFJFU1NVKSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAwLCBEM0RTQU1QX0FERFJFU1NWLCBEM0RUQUREUkVTU19DTEFNUCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShEM0RTQU1QX0FERFJFU1NWKSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAwLCBEM0RTQU1QX0FERFJFU1NXLCBEM0RUQUREUkVTU19DTEFNUCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShEM0RTQU1QX0FERFJFU1NXKSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0xJR0hUSU5HLCBGQUxTRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKEQzRFJTX0xJR0hUSU5HKSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZjAwMDBmZiwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldERldmljZUNhcHMoZGV2aWNlLCAmY2Fwcyk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldERldmljZUNhcHMgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZShkZXZpY2UsIGNhcHMuTWF4VGV4dHVyZVdpZHRoLCBjYXBzLk1heFRleHR1cmVIZWlnaHQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBmbXQsIEQzRFBPT0xfTUFOQUdFRCwgJnRleHR1cmUsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIXRleHR1cmUpIHsKICAgICAgICBza2lwKCJGYWlsZWQgdG8gY3JlYXRlIHRoZSB0ZXN0IHRleHR1cmVcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBVbmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIHNldCB1cCBhIHRleHR1cmUgY29vcmRpbmF0ZSBwYXNzdGhyb3VnaAogICAgICogaW4gZDNkIGZpeGVkIGZ1bmN0aW9uIHBpcGVsaW5lLCBzbyBjcmVhdGUgYSB0ZXh0dXJlIHRoYXQgaGFzIGEgZ3JhZGllbnQgZnJvbSAwLjAgdG8KICAgICAqIDEuMCBpbiByZWQgYW5kIGdyZWVuIGZvciB0aGUgeCBhbmQgeSBjb29yZHMKICAgICAqLwogICAgaHIgPSBJRGlyZWN0M0RUZXh0dXJlOV9Mb2NrUmVjdCh0ZXh0dXJlLCAwLCAmbHIsIE5VTEwsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVGV4dHVyZTlfTG9ja1JlY3QgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBmb3IoeSA9IDA7IHkgPCBjYXBzLk1heFRleHR1cmVIZWlnaHQ7IHkrKykgewogICAgICAgIGZvcih4ID0gMDsgeCA8IGNhcHMuTWF4VGV4dHVyZVdpZHRoOyB4KyspIHsKICAgICAgICAgICAgZG91YmxlIHJfZiA9IChkb3VibGUpIHkgLyAoZG91YmxlKSBjYXBzLk1heFRleHR1cmVIZWlnaHQ7CiAgICAgICAgICAgIGRvdWJsZSBnX2YgPSAoZG91YmxlKSB4IC8gKGRvdWJsZSkgY2Fwcy5NYXhUZXh0dXJlV2lkdGg7CiAgICAgICAgICAgIGlmKGZtdCA9PSBEM0RGTVRfQTE2QjE2RzE2UjE2KSB7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCByLCBnOwogICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKmRzdCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoKChjaGFyICopIGxyLnBCaXRzKSArIHkgKiBsci5QaXRjaCArIHggKiA4KTsKICAgICAgICAgICAgICAgIHIgPSAodW5zaWduZWQgc2hvcnQpIChyX2YgKiA2NTUzNi4wKTsKICAgICAgICAgICAgICAgIGcgPSAodW5zaWduZWQgc2hvcnQpIChnX2YgKiA2NTUzNi4wKTsKICAgICAgICAgICAgICAgIGRzdFswXSA9IHI7CiAgICAgICAgICAgICAgICBkc3RbMV0gPSBnOwogICAgICAgICAgICAgICAgZHN0WzJdID0gMDsKICAgICAgICAgICAgICAgIGRzdFszXSA9IDY1NTM1OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0ID0gKCh1bnNpZ25lZCBjaGFyICopIGxyLnBCaXRzKSArIHkgKiBsci5QaXRjaCArIHggKiA0OwogICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciByID0gKHVuc2lnbmVkIGNoYXIpIChyX2YgKiAyNTUuMCk7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGcgPSAodW5zaWduZWQgY2hhcikgKGdfZiAqIDI1NS4wKTsKICAgICAgICAgICAgICAgIGRzdFswXSA9IDA7CiAgICAgICAgICAgICAgICBkc3RbMV0gPSBnOwogICAgICAgICAgICAgICAgZHN0WzJdID0gcjsKICAgICAgICAgICAgICAgIGRzdFszXSA9IDI1NTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGhyID0gSURpcmVjdDNEVGV4dHVyZTlfVW5sb2NrUmVjdCh0ZXh0dXJlLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFRleHR1cmU5X1VubG9ja1JlY3QgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIChJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKikgdGV4dHVyZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVogfCBEM0RGVkZfVEVYMSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldEZWRiBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIGZsb2F0IHF1YWQxW10gPSB7CiAgICAgICAgICAgIC0xLjAsICAgICAgLTEuMCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAxLjAsCiAgICAgICAgICAgIC0xLjAsICAgICAgIDAuMCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAxLjAsCiAgICAgICAgICAgICAwLjAsICAgICAgLTEuMCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAxLjAsCiAgICAgICAgICAgICAwLjAsICAgICAgIDAuMCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAxLjAsCiAgICAgICAgfTsKICAgICAgICBmbG9hdCBxdWFkMltdID0gewogICAgICAgICAgICAtMS4wLCAgICAgICAwLjAsICAgICAgIDAuMSwgICAgIDEuMCwgICAgMS4wLAogICAgICAgICAgICAtMS4wLCAgICAgICAxLjAsICAgICAgIDAuMSwgICAgIDEuMCwgICAgMS4wLAogICAgICAgICAgICAgMC4wLCAgICAgICAwLjAsICAgICAgIDAuMSwgICAgIDEuMCwgICAgMS4wLAogICAgICAgICAgICAgMC4wLCAgICAgICAxLjAsICAgICAgIDAuMSwgICAgIDEuMCwgICAgMS4wLAogICAgICAgIH07CiAgICAgICAgZmxvYXQgcXVhZDNbXSA9IHsKICAgICAgICAgICAgIDAuMCwgICAgICAgMC4wLCAgICAgICAwLjEsICAgICAwLjUsICAgIDAuNSwKICAgICAgICAgICAgIDAuMCwgICAgICAgMS4wLCAgICAgICAwLjEsICAgICAwLjUsICAgIDAuNSwKICAgICAgICAgICAgIDEuMCwgICAgICAgMC4wLCAgICAgICAwLjEsICAgICAwLjUsICAgIDAuNSwKICAgICAgICAgICAgIDEuMCwgICAgICAgMS4wLCAgICAgICAwLjEsICAgICAwLjUsICAgIDAuNSwKICAgICAgICB9OwogICAgICAgIGZsb2F0IHF1YWQ0W10gPSB7CiAgICAgICAgICAgICAzMjAsICAgICAgIDQ4MCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAwLjAsICAgIDEuMCwKICAgICAgICAgICAgIDMyMCwgICAgICAgMjQwLCAgICAgICAwLjEsICAgICAxLjAsICAgIDAuMCwgICAgMS4wLAogICAgICAgICAgICAgNjQwLCAgICAgICA0ODAsICAgICAgIDAuMSwgICAgIDEuMCwgICAgMC4wLCAgICAxLjAsCiAgICAgICAgICAgICA2NDAsICAgICAgIDI0MCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAwLjAsICAgIDEuMCwKICAgICAgICB9OwogICAgICAgIGZsb2F0IG1hdFsxNl0gPSB7MC4wLCAwLjAsIDAuMCwgMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wfTsKCiAgICAgICAgLyogV2hhdCBoYXBwZW5zIHdpdGggdGhlIHRleHR1cmUgbWF0cml4IGlmIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MgaXMgZGlzYWJsZWQ/ICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybShkZXZpY2UsIEQzRFRTX1RFWFRVUkUwLCAoRDNETUFUUklYICopICZtYXQpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMSwgNSAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICAvKiBXaGF0IGhhcHBlbnMgd2l0aCB0cmFuc2Zvcm1zIGVuYWJsZWQ/ICovCiAgICAgICAgSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MsIEQzRFRURkZfQ09VTlQyKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQyLCA1ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIC8qIFdoYXQgaGFwcGVucyBpZiA0IGNvb3JkcyBhcmUgdXNlZCwgYnV0IG9ubHkgMiBnaXZlbiA/Ki8KICAgICAgICBtYXRbOF0gPSAxLjA7CiAgICAgICAgbWF0WzEzXSA9IDEuMDsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtKGRldmljZSwgRDNEVFNfVEVYVFVSRTAsIChEM0RNQVRSSVggKikgJm1hdCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUcmFuc2Zvcm0gZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MsIEQzRFRURkZfQ09VTlQ0KTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQzLCA1ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIC8qIFdoYXQgaGFwcGVucyB3aXRoIHRyYW5zZm9ybWVkIGdlb21ldHJ5PyBUaGlzIHNldHVwIGxlYWQgdG8gMC8wIGNvb3JkcyB3aXRoIHVudHJhbnNmb3JtZWQKICAgICAgICAgKiBnZW9tZXRyeS4gSWYgdGhlIHNhbWUgYXBwbGllcyB0byB0cmFuc2Zvcm1lZCB2ZXJ0aWNlcywgdGhlIHF1YWQgd2lsbCBiZSBibGFjaywgb3RoZXJ3aXNlIHJlZCwKICAgICAgICAgKiBkdWUgdG8gdGhlIGNvb3JkcyBpbiB0aGUgdmVydGljZXMuICh0dXJucyBvdXQgcmVkLCBpbmRlZWQpCiAgICAgICAgICovCiAgICAgICAgbWVtc2V0KG1hdCwgMCwgc2l6ZW9mKG1hdCkpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUcmFuc2Zvcm0oZGV2aWNlLCBEM0RUU19URVhUVVJFMCwgKEQzRE1BVFJJWCAqKSAmbWF0KTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWlJIVyB8IEQzREZWRl9URVgxKTsKICAgICAgICBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMCwgRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUywgRDNEVFRGRl9DT1VOVDIpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldEZWRiBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDQsIDYgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDM2MCk7CiAgICBvayhjb2xvciA9PSAweDAwRkZGRjAwIHx8IGNvbG9yID09IDB4MDBGRUZFMDAsICJxdWFkIDEgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBGRkZGMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMTIwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwMDAsICJxdWFkIDIgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAxMjApOwogICAgb2soY29sb3IgPT0gMHgwMDAwRkYwMCB8fCBjb2xvciA9PSAweDAwMDBGRTAwLCAicXVhZCAzIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBGRjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDM2MCk7CiAgICBvayhjb2xvciA9PSAweDAwRkYwMDAwIHx8IDB4MDBGRTAwMDAsICJxdWFkIDQgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBGRjAwMDBcbiIsIGNvbG9yKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmYwMDAwZmYsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaIHwgRDNERlZGX1RFWDEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBmbG9hdCBxdWFkMVtdID0gewogICAgICAgICAgICAtMS4wLCAgICAgIC0xLjAsICAgICAgIDAuMSwgICAgIDAuOCwgICAgMC4yLAogICAgICAgICAgICAtMS4wLCAgICAgICAwLjAsICAgICAgIDAuMSwgICAgIDAuOCwgICAgMC4yLAogICAgICAgICAgICAgMC4wLCAgICAgIC0xLjAsICAgICAgIDAuMSwgICAgIDAuOCwgICAgMC4yLAogICAgICAgICAgICAgMC4wLCAgICAgICAwLjAsICAgICAgIDAuMSwgICAgIDAuOCwgICAgMC4yLAogICAgICAgIH07CiAgICAgICAgZmxvYXQgcXVhZDJbXSA9IHsKICAgICAgICAgICAgLTEuMCwgICAgICAgMC4wLCAgICAgICAwLjEsICAgICAwLjUsICAgIDEuMCwKICAgICAgICAgICAgLTEuMCwgICAgICAgMS4wLCAgICAgICAwLjEsICAgICAwLjUsICAgIDEuMCwKICAgICAgICAgICAgIDAuMCwgICAgICAgMC4wLCAgICAgICAwLjEsICAgICAwLjUsICAgIDEuMCwKICAgICAgICAgICAgIDAuMCwgICAgICAgMS4wLCAgICAgICAwLjEsICAgICAwLjUsICAgIDEuMCwKICAgICAgICB9OwogICAgICAgIGZsb2F0IHF1YWQzW10gPSB7CiAgICAgICAgICAgICAwLjAsICAgICAgIDAuMCwgICAgICAgMC4xLCAgICAgMC41LCAgICAxLjAsCiAgICAgICAgICAgICAwLjAsICAgICAgIDEuMCwgICAgICAgMC4xLCAgICAgMC41LCAgICAxLjAsCiAgICAgICAgICAgICAxLjAsICAgICAgIDAuMCwgICAgICAgMC4xLCAgICAgMC41LCAgICAxLjAsCiAgICAgICAgICAgICAxLjAsICAgICAgIDEuMCwgICAgICAgMC4xLCAgICAgMC41LCAgICAxLjAsCiAgICAgICAgfTsKICAgICAgICBmbG9hdCBxdWFkNFtdID0gewogICAgICAgICAgICAgMC4wLCAgICAgIC0xLjAsICAgICAgIDAuMSwgICAgIDAuOCwgICAgMC4yLAogICAgICAgICAgICAgMC4wLCAgICAgICAwLjAsICAgICAgIDAuMSwgICAgIDAuOCwgICAgMC4yLAogICAgICAgICAgICAgMS4wLCAgICAgIC0xLjAsICAgICAgIDAuMSwgICAgIDAuOCwgICAgMC4yLAogICAgICAgICAgICAgMS4wLCAgICAgICAwLjAsICAgICAgIDAuMSwgICAgIDAuOCwgICAgMC4yLAogICAgICAgIH07CiAgICAgICAgZmxvYXQgbWF0WzE2XSA9IHswLjAsIDAuMCwgMC4wLCAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMS4wLCAwLjAsIDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDAuMCwgMC4wLCAwLjB9OwoKICAgICAgICAvKiBXaGF0IGhhcHBlbnMgdG8gdGhlIGRlZmF1bHQgMSBpbiB0aGUgM3JkIGNvb3JkaW5hdGUgaWYgaXQgaXMgZGlzYWJsZWQ/CiAgICAgICAgICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybShkZXZpY2UsIEQzRFRTX1RFWFRVUkUwLCAoRDNETUFUUklYICopICZtYXQpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAwLCBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTLCBEM0RUVEZGX0NPVU5UMik7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDEsIDUgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgLyogRDNEVEZGX0NPVU5UMSBkb2VzIG5vdCB3b3JrIG9uIE52aWRpYSBkcml2ZXJzLiBJdCBiZWhhdmVzIGxpa2UgRDNEVFRGRl9ESVNBQkxFLiBPbiBBVEkgZHJpdmVycwogICAgICAgICAqIGl0IGJlaGF2ZXMgbGlrZSBDT1VOVDIgYmVjYXVzZSBub3JtYWwgdGV4dHVyZXMgcmVxdWlyZSAyIGNvb3JkcwogICAgICAgICAqLwogICAgICAgIElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAwLCBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTLCBEM0RUVEZGX0NPVU5UMSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkNCwgNSAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICAvKiBKdXN0IHRvIGJlIHN1cmUsIHRoZSBzYW1lIGFzIHF1YWQyIGFib3ZlICovCiAgICAgICAgbWVtc2V0KG1hdCwgMCwgc2l6ZW9mKG1hdCkpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUcmFuc2Zvcm0oZGV2aWNlLCBEM0RUU19URVhUVVJFMCwgKEQzRE1BVFJJWCAqKSAmbWF0KTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMCwgRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUywgRDNEVFRGRl9DT1VOVDIpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDIsIDUgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgLyogTm93LCB3aGF0IGhhcHBlbnMgdG8gdGhlIDJuZCBjb29yZGluYXRlKHRoYXQgaXMgZGlzYWJsZWQgaW4gdGhlIG1hdHJpeCkgaWYgaXQgaXMgbm90CiAgICAgICAgICogdXNlZD8gQW5kIHdoYXQgaGFwcGVucyB0byB0aGUgZmlyc3Q/CiAgICAgICAgICovCiAgICAgICAgSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MsIEQzRFRURkZfQ09VTlQxKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQzLCA1ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOwogICAgb2soY29sb3IgPT0gMHgwMEZGMDAwMCB8fCBjb2xvciA9PSAweDAwRkUwMDAwLCAicXVhZCAxIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwRkYwMDAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDAwLCAicXVhZCAyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMTIwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjgwMDAgfHwgY29sb3IgPT0gMHgwMGZlN2YwMCB8fCBjb2xvciA9PSAweDAwMDAwMDAwLAogICAgICAgInF1YWQgMyBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmODAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAzNjApOwogICAgb2soY29sb3IgPT0gMHgwMDMzY2MwMCB8fCBjb2xvciA9PSAweDAwMzJjYjAwIHx8IGNvbG9yID09IDB4MDBGRjAwMDAgfHwgY29sb3IgPT0gMHgwMEZFMDAwMCwKICAgICAgICJxdWFkIDQgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAzM2NjMDBcbiIsIGNvbG9yKTsKCiAgICBJRGlyZWN0M0RUZXh0dXJlOV9SZWxlYXNlKHRleHR1cmUpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZjIwMzA0MCwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAvKiBVc2UgYSBzbWFsbGVyIHZvbHVtZSB0ZXh0dXJlIHRoYW4gdGhlIGJpZ2dlc3QgcG9zc2libGUgc2l6ZSBmb3IgbWVtb3J5IGFuZCBwZXJmb3JtYW5jZSByZWFzb25zCiAgICAgKiBUaHVzIHdhdGNoIG91dCBpZiBzYW1wbGluZyBmcm9tIHRleGVscyBiZXR3ZWVuIDAgYW5kIDEuCiAgICAgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWb2x1bWVUZXh0dXJlKGRldmljZSwgMzIsIDMyLCAzMiwgMSwgMCwgZm10LCBEM0RQT09MX01BTkFHRUQsICZ2b2x1bWUsIDApOwogICAgb2soaHIgPT0gRDNEX09LIHx8IGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwKICAgICAgICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZvbHVtZVRleHR1cmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighdm9sdW1lKSB7CiAgICAgICAgc2tpcCgiRmFpbGVkIHRvIGNyZWF0ZSBhIHZvbHVtZSB0ZXh0dXJlXG4iKTsKICAgICAgICBnb3RvIG91dDsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRFZvbHVtZVRleHR1cmU5X0xvY2tCb3godm9sdW1lLCAwLCAmbGIsIE5VTEwsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVm9sdW1lVGV4dHVyZTlfTG9ja0JveCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGZvcih6ID0gMDsgeiA8IDMyOyB6KyspIHsKICAgICAgICBmb3IoeSA9IDA7IHkgPCAzMjsgeSsrKSB7CiAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IDMyOyB4KyspIHsKICAgICAgICAgICAgICAgIGNoYXIgc2l6ZSA9IChmbXQgPT0gRDNERk1UX0ExNkIxNkcxNlIxNiA/IDggOiA0KTsKICAgICAgICAgICAgICAgIHZvaWQgKm1lbSA9ICgoY2hhciAqKSAgbGIucEJpdHMpICsgeSAqIGxiLlJvd1BpdGNoICsgeiAqIGxiLlNsaWNlUGl0Y2ggKyB4ICogc2l6ZTsKICAgICAgICAgICAgICAgIGZsb2F0IHJfZiA9IChmbG9hdCkgeCAvIDMxLjA7CiAgICAgICAgICAgICAgICBmbG9hdCBnX2YgPSAoZmxvYXQpIHkgLyAzMS4wOwogICAgICAgICAgICAgICAgZmxvYXQgYl9mID0gKGZsb2F0KSB6IC8gMzEuMDsKCiAgICAgICAgICAgICAgICBpZihmbXQgPT0gRDNERk1UX0ExNkIxNkcxNlIxNikgewogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICptZW1fcyA9IG1lbTsKICAgICAgICAgICAgICAgICAgICBtZW1fc1swXSAgPSByX2YgKiA2NTUzNS4wOwogICAgICAgICAgICAgICAgICAgIG1lbV9zWzFdICA9IGdfZiAqIDY1NTM1LjA7CiAgICAgICAgICAgICAgICAgICAgbWVtX3NbMl0gID0gYl9mICogNjU1MzUuMDsKICAgICAgICAgICAgICAgICAgICBtZW1fc1szXSAgPSA2NTUzNTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWVtX2MgPSBtZW07CiAgICAgICAgICAgICAgICAgICAgbWVtX2NbMF0gID0gYl9mICogMjU1LjA7CiAgICAgICAgICAgICAgICAgICAgbWVtX2NbMV0gID0gZ19mICogMjU1LjA7CiAgICAgICAgICAgICAgICAgICAgbWVtX2NbMl0gID0gcl9mICogMjU1LjA7CiAgICAgICAgICAgICAgICAgICAgbWVtX2NbM10gID0gMjU1OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaHIgPSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOV9VbmxvY2tCb3godm9sdW1lLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFZvbHVtZVRleHR1cmU5X1VubG9ja0JveCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIChJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKikgdm9sdW1lKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFZvbHVtZVRleHR1cmU5X1VubG9ja0JveCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBmbG9hdCBxdWFkMVtdID0gewogICAgICAgICAgICAtMS4wLCAgICAgIC0xLjAsICAgICAgIDAuMSwgICAgIDEuMCwgICAgMS4wLCAgICAxLjAsCiAgICAgICAgICAgIC0xLjAsICAgICAgIDAuMCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAxLjAsICAgIDEuMCwKICAgICAgICAgICAgIDAuMCwgICAgICAtMS4wLCAgICAgICAwLjEsICAgICAxLjAsICAgIDEuMCwgICAgMS4wLAogICAgICAgICAgICAgMC4wLCAgICAgICAwLjAsICAgICAgIDAuMSwgICAgIDEuMCwgICAgMS4wLCAgICAxLjAKICAgICAgICB9OwogICAgICAgIGZsb2F0IHF1YWQyW10gPSB7CiAgICAgICAgICAgIC0xLjAsICAgICAgIDAuMCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAxLjAsICAgIDEuMCwKICAgICAgICAgICAgLTEuMCwgICAgICAgMS4wLCAgICAgICAwLjEsICAgICAxLjAsICAgIDEuMCwgICAgMS4wLAogICAgICAgICAgICAgMC4wLCAgICAgICAwLjAsICAgICAgIDAuMSwgICAgIDEuMCwgICAgMS4wLCAgICAxLjAsCiAgICAgICAgICAgICAwLjAsICAgICAgIDEuMCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAxLjAsICAgIDEuMAogICAgICAgIH07CiAgICAgICAgZmxvYXQgcXVhZDNbXSA9IHsKICAgICAgICAgICAgIDAuMCwgICAgICAgMC4wLCAgICAgICAwLjEsICAgICAwLjAsICAgIDAuMCwKICAgICAgICAgICAgIDAuMCwgICAgICAgMS4wLCAgICAgICAwLjEsICAgICAwLjAsICAgIDAuMCwKICAgICAgICAgICAgIDEuMCwgICAgICAgMC4wLCAgICAgICAwLjEsICAgICAwLjAsICAgIDAuMCwKICAgICAgICAgICAgIDEuMCwgICAgICAgMS4wLCAgICAgICAwLjEsICAgICAwLjAsICAgIDAuMAogICAgICAgIH07CiAgICAgICAgZmxvYXQgcXVhZDRbXSA9IHsKICAgICAgICAgICAgIDAuMCwgICAgICAtMS4wLCAgICAgICAwLjEsICAgICAxLjAsICAgIDEuMCwgICAgMS4wLAogICAgICAgICAgICAgMC4wLCAgICAgICAwLjAsICAgICAgIDAuMSwgICAgIDEuMCwgICAgMS4wLCAgICAxLjAsCiAgICAgICAgICAgICAxLjAsICAgICAgLTEuMCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAxLjAsICAgIDEuMCwKICAgICAgICAgICAgIDEuMCwgICAgICAgMC4wLCAgICAgICAwLjEsICAgICAxLjAsICAgIDEuMCwgICAgMS4wCiAgICAgICAgfTsKICAgICAgICBmbG9hdCBtYXRbMTZdID0gezEuMCwgMC4wLCAwLjAsIDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAxLjAsIDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMS4wLCAwLjAsIDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIDEuMH07CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGVjbCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgLyogRHJhdyBhIHF1YWQgd2l0aCBhbGwgMyBjb29yZHMgZW5hYmxlZC4gTm90aGluZyBmYW5jeS4gdiBhbmQgdyBhcmUgc3dhcHBlZCwgYnV0IGhhdmUgdGhlIHNhbWUKICAgICAgICAgKiB2YWx1ZXMKICAgICAgICAgKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtKGRldmljZSwgRDNEVFNfVEVYVFVSRTAsIChEM0RNQVRSSVggKikgbWF0KTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMCwgRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUywgRDNEVFRGRl9DT1VOVDMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMSwgNiAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIC8qIE5vdyBkaXNhYmxlIHRoZSB3IGNvb3JkaW5hdGUuIERvZXMgdGhhdCBjaGFuZ2UgdGhlIGlucHV0LCBvciB0aGUgb3V0cHV0LiBUaGUgY29vcmRpbmF0ZXMKICAgICAgICAgKiBhcmUgc3dhcHBlZCBieSB0aGUgbWF0cml4LiBJZiBpdCBjaGFuZ2VzIHRoZSBpbnB1dCwgdGhlIHYgY29vcmQgd2lsbCBiZSBtaXNzaW5nKGdyZWVuKSwKICAgICAgICAgKiBvdGhlcndpc2UgdGhlIHcgd2lsbCBiZSBtaXNzaW5nKGJsdWUpLgogICAgICAgICAqIHR1cm5zIG91dCB0aGF0IG9uIG52aWRpYSBjYXJkcyB0aGUgYmx1ZSBjb2xvciBpcyBtaXNzaW5nLCBzbyBpdCBpcyBhbiBvdXRwdXQgbW9kaWZpY2F0aW9uLgogICAgICAgICAqIE9uIEFUSSBjYXJkcyB0aGUgQ09VTlQyIGlzIGlnbm9yZWQsIGFuZCBpdCBiZWhhdmVzIGluIHRoZSBzYW1lIHdheSBhcyBDT1VOVDMuCiAgICAgICAgICovCiAgICAgICAgSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MsIEQzRFRURkZfQ09VTlQyKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDIsIDYgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICAvKiBkZWZhdWx0IHZhbHVlcz8gU2V0IHVwIHRoZSBpZGVudGl0eSBtYXRyaXgsIHBhc3MgaW4gMiB2ZXJ0ZXggY29vcmRzLCBhbmQgZW5hYmxlIDQgKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtKGRldmljZSwgRDNEVFNfVEVYVFVSRTAsIChEM0RNQVRSSVggKikgaWRlbnRpdHkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAwLCBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTLCBEM0RUVEZGX0NPVU5UNCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVogfCBEM0RGVkZfVEVYMSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQzLCA1ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgLyogRDNEVFRGRl9DT1VOVDEuIFNldCBhIE5VTEwgbWF0cml4LCBhbmQgY291bnQxLCBwYXNzIGluIGFsbCB2YWx1ZXMgYXMgMS4wLiBOdmlkaWEgaGFzIGNvdW50MSA9PQogICAgICAgICAqIGRpc2FibGUuIEFUSSBleHRlbmRzIGl0IHVwIHRvIHRoZSBhbW91bnQgb2YgdmFsdWVzIG5lZWRlZCBmb3IgdGhlIHZvbHVtZSB0ZXh0dXJlCiAgICAgICAgICovCiAgICAgICAgbWVtc2V0KG1hdCwgMCwgc2l6ZW9mKG1hdCkpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUcmFuc2Zvcm0oZGV2aWNlLCBEM0RUU19URVhUVVJFMCwgKEQzRE1BVFJJWCAqKSBtYXQpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAwLCBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTLCBEM0RUVEZGX0NPVU5UMSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGVjbCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDQsIDYgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfUHJlc2VudCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDM2MCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAicXVhZCAxIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZjAwIC8qIE5WKi8gfHwgY29sb3IgPT0gMHgwMGZmZmZmZiAvKiBBVEkgKi8sCiAgICAgICAicXVhZCAyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDEyMCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAicXVhZCAzIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDM2MCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmIHx8IGNvbG9yID09IDB4MDAwMGZmMDAsICJxdWFkIDQgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmYzMDMwMzAsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgZmxvYXQgcXVhZDFbXSA9IHsKICAgICAgICAgICAgLTEuMCwgICAgICAtMS4wLCAgICAgICAwLjEsICAgICAxLjAsICAgIDEuMCwgICAgMS4wLAogICAgICAgICAgICAtMS4wLCAgICAgICAwLjAsICAgICAgIDAuMSwgICAgIDEuMCwgICAgMS4wLCAgICAxLjAsCiAgICAgICAgICAgICAwLjAsICAgICAgLTEuMCwgICAgICAgMC4xLCAgICAgMS4wLCAgICAxLjAsICAgIDEuMCwKICAgICAgICAgICAgIDAuMCwgICAgICAgMC4wLCAgICAgICAwLjEsICAgICAxLjAsICAgIDEuMCwgICAgMS4wCiAgICAgICAgfTsKICAgICAgICBmbG9hdCBxdWFkMltdID0gewogICAgICAgICAgICAtMS4wLCAgICAgICAwLjAsICAgICAgIDAuMSwKICAgICAgICAgICAgLTEuMCwgICAgICAgMS4wLCAgICAgICAwLjEsCiAgICAgICAgICAgICAwLjAsICAgICAgIDAuMCwgICAgICAgMC4xLAogICAgICAgICAgICAgMC4wLCAgICAgICAxLjAsICAgICAgIDAuMSwKICAgICAgICB9OwogICAgICAgIGZsb2F0IHF1YWQzW10gPSB7CiAgICAgICAgICAgICAwLjAsICAgICAgIDAuMCwgICAgICAgMC4xLCAgICAgMS4wLAogICAgICAgICAgICAgMC4wLCAgICAgICAxLjAsICAgICAgIDAuMSwgICAgIDEuMCwKICAgICAgICAgICAgIDEuMCwgICAgICAgMC4wLCAgICAgICAwLjEsICAgICAxLjAsCiAgICAgICAgICAgICAxLjAsICAgICAgIDEuMCwgICAgICAgMC4xLCAgICAgMS4wCiAgICAgICAgfTsKICAgICAgICBmbG9hdCBtYXRbMTZdID0gIHswLjAsIDAuMCwgMC4wLCAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDEuMCwgMC4wLCAwLjB9OwogICAgICAgIGZsb2F0IG1hdDJbMTZdID0gezAuMCwgMC4wLCAwLjAsIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wLCAwLjAsIDAuMCwgMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDEuMCwgMC4wLCAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAxLjAsIDAuMH07CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGVjbCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgLyogRGVmYXVsdCB2YWx1ZXM/IDQgY29vcmRzIHVzZWQsIDMgcGFzc2VkLiBXaGF0IGhhcHBlbnMgdG8gdGhlIDR0aD8KICAgICAgICAgKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtKGRldmljZSwgRDNEVFNfVEVYVFVSRTAsIChEM0RNQVRSSVggKikgbWF0KTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMCwgRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUywgRDNEVFRGRl9DT1VOVDQpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMSwgNiAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIC8qIE5vbmUgcGFzc2VkICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybShkZXZpY2UsIEQzRFRTX1RFWFRVUkUwLCAoRDNETUFUUklYICopIGlkZW50aXR5KTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQyLCAzICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgLyogNCB1c2VkLCAxIHBhc3NlZCAqLwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2wyKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUcmFuc2Zvcm0oZGV2aWNlLCBEM0RUU19URVhUVVJFMCwgKEQzRE1BVFJJWCAqKSBtYXQyKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDMsIDQgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfUHJlc2VudCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMzYwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJxdWFkIDEgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMTIwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwMDAsICJxdWFkIDIgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMTIwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsICJxdWFkIDMgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKICAgIC8qIFF1YWQ0OiB1bnVzZWQgKi8KCiAgICBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOV9SZWxlYXNlKHZvbHVtZSk7CgogICAgb3V0OgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MsIEQzRFRURkZfRElTQUJMRSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtKGRldmljZSwgRDNEVFNfVEVYVFVSRTAsIChEM0RNQVRSSVggKikgJmlkZW50aXR5KTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAwLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOV9SZWxlYXNlKGRlY2wpOwogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245X1JlbGVhc2UoZGVjbDIpOwp9CgpzdGF0aWMgdm9pZCB0ZXhkZXB0aF90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpzaGFkZXI7CiAgICBIUkVTVUxUIGhyOwogICAgY29uc3QgZmxvYXQgdGV4ZGVwdGhfdGVzdF9kYXRhMVtdID0geyAwLjI1LCAgMi4wLCAwLjAsIDAuMH07CiAgICBjb25zdCBmbG9hdCB0ZXhkZXB0aF90ZXN0X2RhdGEyW10gPSB7IDAuMjUsICAwLjUsIDAuMCwgMC4wfTsKICAgIGNvbnN0IGZsb2F0IHRleGRlcHRoX3Rlc3RfZGF0YTNbXSA9IHstMS4wMCwgIDAuMSwgMC4wLCAwLjB9OwogICAgY29uc3QgZmxvYXQgdGV4ZGVwdGhfdGVzdF9kYXRhNFtdID0gey0wLjI1LCAtMC41LCAwLjAsIDAuMH07CiAgICBjb25zdCBmbG9hdCB0ZXhkZXB0aF90ZXN0X2RhdGE1W10gPSB7IDEuMDAsIC0wLjEsIDAuMCwgMC4wfTsKICAgIGNvbnN0IGZsb2F0IHRleGRlcHRoX3Rlc3RfZGF0YTZbXSA9IHsgMS4wMCwgIDAuNSwgMC4wLCAwLjB9OwogICAgY29uc3QgZmxvYXQgdGV4ZGVwdGhfdGVzdF9kYXRhN1tdID0geyAwLjUwLCAgMC4wLCAwLjAsIDAuMH07CiAgICBEV09SRCBzaGFkZXJfY29kZVtdID0gewogICAgICAgIDB4ZmZmZjAxMDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18xXzQgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwNTEsIDB4YTAwZjAwMDEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2Y4MDAwMDAsIDB4M2Y4MDAwMDAsICAgICAvKiBkZWYgYzEsIDAsIDAsIDEsIDEgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ODAwZjAwMDUsIDB4YTBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgcjUsIGMwICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaGFzZSAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwNTcsIDB4ODAwZjAwMDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXhkZXB0aCByNSAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ODAwZjAwMDAsIDB4YTBlNDAwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgcjAsIGMxICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIERXT1JEIGNvbG9yOwogICAgZmxvYXQgdmVydGV4W10gPSB7CiAgICAgICAtMS4wLCAgIC0xLjAsICAgIDAuMCwKICAgICAgICAxLjAsICAgLTEuMCwgICAgMS4wLAogICAgICAgLTEuMCwgICAgMS4wLCAgICAwLjAsCiAgICAgICAgMS4wLCAgICAxLjAsICAgIDEuMAogICAgfTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXJfY29kZSwgJnNoYWRlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCB8IEQzRENMRUFSX1pCVUZGRVIsIDB4ZmZmZmZmMDAsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfWkVOQUJMRSwgRDNEWkJfVFJVRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfWldSSVRFRU5BQkxFLCBUUlVFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19aRlVOQywgRDNEQ01QX0FMV0FZUyk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVopOwoKICAgIC8qIEZpbGwgdGhlIGRlcHRoIGJ1ZmZlciB3aXRoIGEgZ3JhZGllbnQgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCB2ZXJ0ZXgsIDMgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgLyogTm93IHBlcmZvcm0gdGhlIGFjdHVhbCB0ZXN0cy4gU2FtZSBnZW9tZXRyeSwgYnV0IHdpdGggdGhlIHNoYWRlciAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfWkZVTkMsIEQzRENNUF9HUkVBVEVSKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19aV1JJVEVFTkFCTEUsIEZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGRldmljZSwgMCwgdGV4ZGVwdGhfdGVzdF9kYXRhMSwgMSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHZlcnRleCwgMyAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfUHJlc2VudCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE1OCwgMjQwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJQaXhlbCAxNTgoMjUlJSAtIDIgcGl4ZWwpIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjIsIDI0MCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAiUGl4ZWwgMTU4KDI1JSUgKyAyIHBpeGVsKSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmZmZmZlxuIiwgY29sb3IpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmZmYwMCwgMC4wLCAwKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoZGV2aWNlLCAwLCB0ZXhkZXB0aF90ZXN0X2RhdGEyLCAxKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXJDb25zdGFudEYgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgdmVydGV4LCAzICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzE4LCAyNDApOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgIlBpeGVsIDMxOCg1MCUlIC0gMiBwaXhlbCkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDMyMiwgMjQwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmMDAsICJQaXhlbCAzMjIoNTAlJSArIDIgcGl4ZWwpIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwXG4iLCBjb2xvcik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmYwMDAwLCAwLjAsIDApOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlckNvbnN0YW50RihkZXZpY2UsIDAsIHRleGRlcHRoX3Rlc3RfZGF0YTMsIDEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlckNvbnN0YW50RiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCB2ZXJ0ZXgsIDMgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfUHJlc2VudCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxLCAyNDApOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIlBpeGVsIDEoMCUlICsgMiBwaXhlbCkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmYwMGZmMDAsIDAuMCwgMCk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGRldmljZSwgMCwgdGV4ZGVwdGhfdGVzdF9kYXRhNCwgMSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHZlcnRleCwgMyAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzE4LCAyNDApOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgIlBpeGVsIDMxOCg1MCUlIC0gMiBwaXhlbCkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDMyMiwgMjQwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJQaXhlbCAzMjIoNTAlJSArIDIgcGl4ZWwpIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBmZjAwXG4iLCBjb2xvcik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmZmZjAwLCAwLjAsIDApOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlckNvbnN0YW50RihkZXZpY2UsIDAsIHRleGRlcHRoX3Rlc3RfZGF0YTUsIDEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlckNvbnN0YW50RiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCB2ZXJ0ZXgsIDMgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfUHJlc2VudCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxLCAyNDApOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmYwMCwgIlBpeGVsIDEoMCUlICsgMiBwaXhlbCkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmMDBcbiIsIGNvbG9yKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmYwMGZmMDAsIDAuMCwgMCk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGRldmljZSwgMCwgdGV4ZGVwdGhfdGVzdF9kYXRhNiwgMSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHZlcnRleCwgMyAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDYzOCwgMjQwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJQaXhlbCA2MzgoMTAwJSUgKyAyIHBpeGVsKSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDBmZlxuIiwgY29sb3IpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmMDAwMCwgMC4wLCAwKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoZGV2aWNlLCAwLCB0ZXhkZXB0aF90ZXN0X2RhdGE3LCAxKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXJDb25zdGFudEYgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgdmVydGV4LCAzICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNjM4LCAyNDApOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgIlBpeGVsIDYzOCgxMDAlJSArIDIgcGl4ZWwpIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CgogICAgLyogQ2xlYW51cCAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOV9SZWxlYXNlKHNoYWRlcik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfWkVOQUJMRSwgRDNEWkJfRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX1pXUklURUVOQUJMRSwgVFJVRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwp9CgpzdGF0aWMgdm9pZCB0ZXhraWxsX3Rlc3QoSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlKQp7CiAgICBJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnNoYWRlcjsKICAgIEhSRVNVTFQgaHI7CiAgICBEV09SRCBjb2xvcjsKCiAgICBjb25zdCBmbG9hdCB2ZXJ0ZXhbXSA9IHsKICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20gIHRvcCAgICByaWdodCAgICBsZWZ0ICovCiAgICAgICAgLTEuMCwgICAtMS4wLCAgIDEuMCwgICAtMC4xLCAgICAwLjksICAgIDAuOSwgICAtMC4xLAogICAgICAgICAxLjAsICAgLTEuMCwgICAwLjAsICAgIDAuOSwgICAtMC4xLCAgICAwLjksICAgLTAuMSwKICAgICAgICAtMS4wLCAgICAxLjAsICAgMS4wLCAgIC0wLjEsICAgIDAuOSwgICAtMC4xLCAgICAwLjksCiAgICAgICAgIDEuMCwgICAgMS4wLCAgIDAuMCwgICAgMC45LCAgIC0wLjEsICAgLTAuMSwgICAgMC45LAogICAgfTsKCiAgICBEV09SRCBzaGFkZXJfY29kZV8xMVtdID0gewogICAgMHhmZmZmMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfMV8xICAgICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDAwMDAwNTEsIDB4YTAwZjAwMDAsIDB4M2Y4MDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2Y4MDAwMDAsIC8qIGRlZiBjMCwgMS4wLCAwLjAsIDAuMCwgMS4wICovCiAgICAweDAwMDAwMDQxLCAweGIwMGYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXhraWxsIHQwICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHg4MDBmMDAwMCwgMHhhMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IHIwLCBjMCAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgRFdPUkQgc2hhZGVyX2NvZGVfMjBbXSA9IHsKICAgIDB4ZmZmZjAyMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzJfMCAgICAgICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDFmLCAweDgwMDAwMDAwLCAweGIwMGYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2wgdDAgICAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgLyogZGVmIGMwLCAwLjAsIDAuMCwgMS4wLCAxLjAgKi8KICAgIDB4MDEwMDAwNDEsIDB4YjAwZjAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRleGtpbGwgdDAgICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweGEwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3Ygb0MwLCBjMCAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmMDBmZjAwLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl9jb2RlXzExLCAmc2hhZGVyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWiB8IEQzREZWRl9URVhDT09SRFNJWkU0KDApIHwgRDNERlZGX1RFWDEpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0RlZGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCB2ZXJ0ZXgsIDcgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNjMsIDQ2KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJQaXhlbCA2My80NiBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmYwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNjYsIDQ2KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJQaXhlbCA2Ni82NCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmYwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNjMsIDQ5KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJQaXhlbCA2My80OSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmYwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNjYsIDQ5KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsICJQaXhlbCA2Ni80OSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDU3OCwgNDYpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgIlBpeGVsIDU3OC80NiBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmYwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNTc1LCA0Nik7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZjAwLCAiUGl4ZWwgNTc1LzY0IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1NzgsIDQ5KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJQaXhlbCA1NzgvNDkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDU3NSwgNDkpOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIlBpeGVsIDU3NS80OSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDYzLCA0MzApOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgIlBpeGVsIDU3OC80NiBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmYwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNjMsIDQzMyk7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZjAwLCAiUGl4ZWwgNTc1LzY0IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA2NiwgNDMzKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsICJQaXhlbCA1NzgvNDkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDY2LCA0MzApOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIlBpeGVsIDU3NS80OSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDU3OCwgNDMwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJQaXhlbCA1NzgvNDYgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDU3OCwgNDMzKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJQaXhlbCA1NzUvNjQgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDU3NSwgNDMzKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsICJQaXhlbCA1NzgvNDkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDU3NSwgNDMwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsICJQaXhlbCA1NzUvNDkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBJRGlyZWN0M0RQaXhlbFNoYWRlcjlfUmVsZWFzZShzaGFkZXIpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmZmYwMCwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXJfY29kZV8yMCwgJnNoYWRlcik7CiAgICBpZihGQUlMRUQoaHIpKSB7CiAgICAgICAgc2tpcCgiRmFpbGVkIHRvIGNyZWF0ZSAyLjAgdGVzdCBzaGFkZXIsIG1vc3QgbGlrZWx5IG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCB2ZXJ0ZXgsIDcgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwoKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfUHJlc2VudCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDYzLCA0Nik7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZjAwLCAiUGl4ZWwgNjMvNDYgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDY2LCA0Nik7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZjAwLCAiUGl4ZWwgNjYvNjQgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDYzLCA0OSk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZjAwLCAiUGl4ZWwgNjMvNDkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDY2LCA0OSk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAiUGl4ZWwgNjYvNDkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1NzgsIDQ2KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmMDAsICJQaXhlbCA1NzgvNDYgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDU3NSwgNDYpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmYwMCwgIlBpeGVsIDU3NS82NCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmZmYwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNTc4LCA0OSk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZjAwLCAiUGl4ZWwgNTc4LzQ5IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1NzUsIDQ5KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJQaXhlbCA1NzUvNDkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA2MywgNDMwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmMDAsICJQaXhlbCA1NzgvNDYgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDYzLCA0MzMpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmYwMCwgIlBpeGVsIDU3NS82NCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmZmYwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNjYsIDQzMyk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZjAwLCAiUGl4ZWwgNTc4LzQ5IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA2NiwgNDMwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJQaXhlbCA1NzUvNDkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1NzgsIDQzMCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZjAwLCAiUGl4ZWwgNTc4LzQ2IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1NzgsIDQzMyk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZjAwLCAiUGl4ZWwgNTc1LzY0IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1NzUsIDQzMyk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZjAwLCAiUGl4ZWwgNTc4LzQ5IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1NzUsIDQzMCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAiUGl4ZWwgNTc1LzQ5IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CgogICAgLyogQ2xlYW51cCAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgTlVMTCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0UGl4ZWxTaGFkZXIgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyKTsKfQoKc3RhdGljIHZvaWQgeDhsOHY4dThfdGVzdChJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UpCnsKICAgIElEaXJlY3QzRDkgKmQzZDk7CiAgICBIUkVTVUxUIGhyOwogICAgSURpcmVjdDNEVGV4dHVyZTkgKnRleHR1cmU7CiAgICBJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnNoYWRlcjsKICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqc2hhZGVyMjsKICAgIEQzRExPQ0tFRF9SRUNUIGxyOwogICAgRFdPUkQgY29sb3I7CiAgICBEV09SRCBzaGFkZXJfY29kZVtdID0gewogICAgICAgIDB4ZmZmZjAxMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18xXzEgICAgICAgKi8KICAgICAgICAweDAwMDAwMDQyLCAweGIwMGYwMDAwLCAgICAgICAgICAgICAgICAgLyogdGV4IHQwICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDBmMDAwMCwgMHhiMGU0MDAwMCwgICAgIC8qIG1vdiByMCwgdDAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgKi8KICAgIH07CiAgICBEV09SRCBzaGFkZXJfY29kZTJbXSA9IHsKICAgICAgICAweGZmZmYwMTAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfMV8xICAgICAgICovCiAgICAgICAgMHgwMDAwMDA0MiwgMHhiMDBmMDAwMCwgICAgICAgICAgICAgICAgIC8qIHRleCB0MCAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ODAwZjAwMDAsIDB4YjBmZjAwMDAsICAgICAvKiBtb3YgcjAsIHQwLncgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICovCiAgICB9OwoKICAgIGZsb2F0IHF1YWRbXSA9IHsKICAgICAgIC0xLjAsICAgLTEuMCwgICAwLjEsICAgICAwLjUsICAgIDAuNSwKICAgICAgICAxLjAsICAgLTEuMCwgICAwLjEsICAgICAwLjUsICAgIDAuNSwKICAgICAgIC0xLjAsICAgIDEuMCwgICAwLjEsICAgICAwLjUsICAgIDAuNSwKICAgICAgICAxLjAsICAgIDEuMCwgICAwLjEsICAgICAwLjUsICAgIDAuNSwKICAgIH07CgogICAgbWVtc2V0KCZsciwgMCwgc2l6ZW9mKGxyKSk7CiAgICBJRGlyZWN0M0REZXZpY2U5X0dldERpcmVjdDNEKGRldmljZSwgJmQzZDkpOwogICAgaHIgPSBJRGlyZWN0M0Q5X0NoZWNrRGV2aWNlRm9ybWF0KGQzZDksIDAsIEQzRERFVlRZUEVfSEFMLCBEM0RGTVRfWDhSOEc4QjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIEQzRFJUWVBFX1RFWFRVUkUsIEQzREZNVF9YOEw4VjhVOCk7CiAgICBJRGlyZWN0M0Q5X1JlbGVhc2UoZDNkOSk7CiAgICBpZihGQUlMRUQoaHIpKSB7CiAgICAgICAgc2tpcCgiTm8gRDNERk1UX1g4TDhWOFU4IHN1cHBvcnRcbiIpOwogICAgfTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmZmZjAwMDAsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlKGRldmljZSwgMSwgMSwgMSwgMCwgRDNERk1UX1g4TDhWOFU4LCBEM0RQT09MX01BTkFHRUQsICZ0ZXh0dXJlLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X0xvY2tSZWN0KHRleHR1cmUsIDAsICZsciwgTlVMTCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RUZXh0dXJlOV9Mb2NrUmVjdCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAqKChEV09SRCAqKSBsci5wQml0cykgPSAweDExY2EzMTQxOwogICAgaHIgPSBJRGlyZWN0M0RUZXh0dXJlOV9VbmxvY2tSZWN0KHRleHR1cmUsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVGV4dHVyZTlfVW5sb2NrUmVjdCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyX2NvZGUsICZzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVTaGFkZXIgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyX2NvZGUyLCAmc2hhZGVyMik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVogfCBEM0RGVkZfVEVYMSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldEZWRiBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIChJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKikgdGV4dHVyZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZCwgNSAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNTc4LCA0MzApOwogICAgb2soY29sb3IgPT0gMHgwMDgyNjJjYSB8fCBjb2xvciA9PSAweDAwODM2M2NhIHx8IGNvbG9yID09IDB4MDA4MzYyY2EsCiAgICAgICAiRDNERk1UX1g4TDhWOFU4ID0gMHgxMTIxMzFjYSByZXR1cm5zIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDA4MjYyY2FcbiIsIGNvbG9yKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXIyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkLCA1ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIH0KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1NzgsIDQzMCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAidyBjb21wb25lbnQgb2YgRDNERk1UX1g4TDhWOFU4ID0gMHgxMWNhMzE0MSByZXR1cm5zIGNvbG9yICUwOHhcbiIsIGNvbG9yKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAwLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBJRGlyZWN0M0RQaXhlbFNoYWRlcjlfUmVsZWFzZShzaGFkZXIpOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyMik7CiAgICBJRGlyZWN0M0RUZXh0dXJlOV9SZWxlYXNlKHRleHR1cmUpOwp9CgpzdGF0aWMgdm9pZCBhdXRvZ2VuX21pcG1hcF90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgSFJFU1VMVCBocjsKICAgIElEaXJlY3QzRDkgKmQzZDsKICAgIElEaXJlY3QzRFRleHR1cmU5ICp0ZXh0dXJlID0gTlVMTDsKICAgIElEaXJlY3QzRFN1cmZhY2U5ICpzdXJmYWNlOwogICAgRFdPUkQgY29sb3I7CiAgICBjb25zdCBSRUNUIHIxID0gezI1NiwgMjU2LCA1MTIsIDUxMn07CiAgICBjb25zdCBSRUNUIHIyID0gezUxMiwgMjU2LCA3NjgsIDUxMn07CiAgICBjb25zdCBSRUNUIHIzID0gezI1NiwgNTEyLCA1MTIsIDc2OH07CiAgICBjb25zdCBSRUNUIHI0ID0gezUxMiwgNTEyLCA3NjgsIDc2OH07CiAgICB1bnNpZ25lZCBpbnQgeCwgeTsKICAgIEQzRExPQ0tFRF9SRUNUIGxyOwogICAgbWVtc2V0KCZsciwgMCwgc2l6ZW9mKGxyKSk7CgogICAgSURpcmVjdDNERGV2aWNlOV9HZXREaXJlY3QzRChkZXZpY2UsICZkM2QpOwogICAgaWYoSURpcmVjdDNEOV9DaGVja0RldmljZUZvcm1hdChkM2QsIDAsIEQzRERFVlRZUEVfSEFMLCBEM0RGTVRfWDhSOEc4QjgsCiAgICAgICBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQLCAgRDNEUlRZUEVfVEVYVFVSRSwgRDNERk1UX1g4UjhHOEI4KSAhPSBEM0RfT0spIHsKICAgICAgICBza2lwKCJObyBhdXRvZ2VubWlwbWFwIHN1cHBvcnRcbiIpOwogICAgICAgIElEaXJlY3QzRDlfUmVsZWFzZShkM2QpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIElEaXJlY3QzRDlfUmVsZWFzZShkM2QpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmZmYwMCwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgLyogTWFrZSB0aGUgbWlwbWFwIGJpZywgc28gdGhhdCBhIHNtYWxsZXIgbWlwbWFwIGlzIHVzZWQKICAgICAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVRleHR1cmUoZGV2aWNlLCAxMDI0LCAxMDI0LCAwLCBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERk1UX1g4UjhHOEI4LCBEM0RQT09MX01BTkFHRUQsICZ0ZXh0dXJlLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X0dldFN1cmZhY2VMZXZlbCh0ZXh0dXJlLCAwLCAmc3VyZmFjZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RUZXh0dXJlOV9HZXRTdXJmYWNlTGV2ZWwgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRFN1cmZhY2U5X0xvY2tSZWN0KHN1cmZhY2UsICZsciwgTlVMTCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RTdXJmYWNlOV9Mb2NrUmVjdCByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGZvcih5ID0gMDsgeSA8IDEwMjQ7IHkrKykgewogICAgICAgIGZvcih4ID0gMDsgeCA8IDEwMjQ7IHgrKykgewogICAgICAgICAgICBEV09SRCAqZHN0ID0gKERXT1JEICopICgoKEJZVEUgKikgbHIucEJpdHMpICsgeSAqIGxyLlBpdGNoICsgeCAqIDQpOwogICAgICAgICAgICBQT0lOVCBwdDsKCiAgICAgICAgICAgIHB0LnggPSB4OwogICAgICAgICAgICBwdC55ID0geTsKICAgICAgICAgICAgaWYoUHRJblJlY3QoJnIxLCBwdCkpIHsKICAgICAgICAgICAgICAgICpkc3QgPSAweGZmZmYwMDAwOwogICAgICAgICAgICB9IGVsc2UgaWYoUHRJblJlY3QoJnIyLCBwdCkpIHsKICAgICAgICAgICAgICAgICpkc3QgPSAweGZmMDBmZjAwOwogICAgICAgICAgICB9IGVsc2UgaWYoUHRJblJlY3QoJnIzLCBwdCkpIHsKICAgICAgICAgICAgICAgICpkc3QgPSAweGZmMDAwMGZmOwogICAgICAgICAgICB9IGVsc2UgaWYoUHRJblJlY3QoJnI0LCBwdCkpIHsKICAgICAgICAgICAgICAgICpkc3QgPSAweGZmMDAwMDAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgKmRzdCA9IDB4ZmZmZmZmZmY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBociA9IElEaXJlY3QzRFN1cmZhY2U5X1VubG9ja1JlY3Qoc3VyZmFjZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RTdXJmYWNlOV9VbmxvY2tSZWN0IHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShzdXJmYWNlKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIChJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKikgdGV4dHVyZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9NSVBGSUxURVIsIEQzRFRFWEZfUE9JTlQpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpIHsKICAgICAgICBjb25zdCBmbG9hdCBxdWFkW10gPSAgewogICAgICAgICAgIC0wLjUsICAgLTAuNSwgICAgMC4xLCAgICAwLjAsICAgIDAuMCwKICAgICAgICAgICAtMC41LCAgICAwLjUsICAgIDAuMSwgICAgMC4wLCAgICAxLjAsCiAgICAgICAgICAgIDAuNSwgICAtMC41LCAgICAwLjEsICAgIDEuMCwgICAgMC4wLAogICAgICAgICAgICAwLjUsICAgIDAuNSwgICAgMC4xLCAgICAxLjAsICAgIDEuMAogICAgICAgIH07CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaIHwgRDNERlZGX1RFWDEpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0RlZGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkLCA1ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAwLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUoZGV2aWNlLCAwLCBEM0RTQU1QX01JUEZJTFRFUiwgRDNEVEVYRl9OT05FKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgSURpcmVjdDNEVGV4dHVyZTlfUmVsZWFzZSh0ZXh0dXJlKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMjAwLCAyMDApOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInBpeGVsIDIwMC8yMDAgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDI4MCwgMjAwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwaXhlbCAyODAvMjAwIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzNjAsIDIwMCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDAwLCAicGl4ZWwgMzYwLzIwMCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDQwLCAyMDApOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInBpeGVsIDQ0MC8yMDAgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDIwMCwgMjcwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJwaXhlbCAyMDAvMjcwIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAyODAsIDI3MCk7CiAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwLCAicGl4ZWwgMjgwLzI3MCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzYwLCAyNzApOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgInBpeGVsIDM2MC8yNzAgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ0MCwgMjcwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJwaXhlbCA0NDAvMjAwIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7Cn0KCnN0YXRpYyB2b2lkIHRlc3RfY29uc3RhbnRfY2xhbXBfdnMoSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlKQp7CiAgICBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICpzaGFkZXJfMTEsICpzaGFkZXJfMTFfMiwgKnNoYWRlcl8yMCwgKnNoYWRlcl8yMF8yOwogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpkZWNsOwogICAgSFJFU1VMVCBocjsKICAgIERXT1JEIGNvbG9yOwogICAgRFdPUkQgc2hhZGVyX2NvZGVfMTFbXSA9ICB7CiAgICAgICAgMHhmZmZlMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzXzFfMSAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIHYwICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ODAwZjAwMDEsIDB4YTBlNDAwMDEsICAgICAgICAgICAgICAgICAvKiBtb3YgcjEsIGMxICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMiwgMHhkMDBmMDAwMCwgMHg4MGU0MDAwMSwgMHhhMGU0MDAwMiwgICAgIC8qIGFkZCBvRDAsIHIxLCBjMiAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweGMwMGYwMDAwLCAweDkwZTQwMDAwLCAgICAgICAgICAgICAgICAgLyogbW92IG9Qb3MsIHYwICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICovCiAgICB9OwogICAgRFdPUkQgc2hhZGVyX2NvZGVfMTFfMltdID0gIHsKICAgICAgICAweGZmZmUwMTAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfMV8xICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwNTEsIDB4YTAwZjAwMDEsIDB4M2ZhMDAwMDAsIDB4YmYwMDAwMDAsIDB4YmZjMDAwMDAsIDB4M2Y4MDAwMDAsIC8qIGRjbCAuLi4gKi8KICAgICAgICAweDAwMDAwMDUxLCAweGEwMGYwMDAyLCAweGJmMDAwMDAwLCAweDNmYTAwMDAwLCAweDQwMDAwMDAwLCAweDNmODAwMDAwLCAvKiBkY2wgLi4uICovCiAgICAgICAgMHgwMDAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgIC8qIGRjbF9wb3NpdGlvbiB2MCAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweDgwMGYwMDAxLCAweGEwZTQwMDAxLCAgICAgICAgICAgICAgICAgLyogbW92IHIxLCBjMSAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDIsIDB4ZDAwZjAwMDAsIDB4ODBlNDAwMDEsIDB4YTBlNDAwMDIsICAgICAvKiBhZGQgb0QwLCByMSwgYzIgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHhjMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgIC8qIG1vdiBvUG9zLCB2MCAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAqLwogICAgfTsKICAgIERXT1JEIHNoYWRlcl9jb2RlXzIwW10gPSAgewogICAgICAgIDB4ZmZmZTAyMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2c18yXzAgICAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgIC8qIGRjbF9wb3NpdGlvbiB2MCAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwMDAxLCAweGEwZTQwMDAxLCAgICAgICAgICAgICAgICAgLyogbW92IHIxLCBjMSAgICAgICAqLwogICAgICAgIDB4MDMwMDAwMDIsIDB4ZDAwZjAwMDAsIDB4ODBlNDAwMDEsIDB4YTBlNDAwMDIsICAgICAvKiBhZGQgb0QwLCByMSwgYzIgICovCiAgICAgICAgMHgwMjAwMDAwMSwgMHhjMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgIC8qIG1vdiBvUG9zLCB2MCAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAqLwogICAgfTsKICAgIERXT1JEIHNoYWRlcl9jb2RlXzIwXzJbXSA9ICB7CiAgICAgICAgMHhmZmZlMDIwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzXzJfMCAgICAgICAgICAgKi8KICAgICAgICAweDA1MDAwMDUxLCAweGEwMGYwMDAxLCAweDNmYTAwMDAwLCAweGJmMDAwMDAwLCAweGJmYzAwMDAwLCAweDNmODAwMDAwLAogICAgICAgIDB4MDUwMDAwNTEsIDB4YTAwZjAwMDIsIDB4YmYwMDAwMDAsIDB4M2ZhMDAwMDAsIDB4NDAwMDAwMDAsIDB4M2Y4MDAwMDAsCiAgICAgICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgIC8qIGRjbF9wb3NpdGlvbiB2MCAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwMDAxLCAweGEwZTQwMDAxLCAgICAgICAgICAgICAgICAgLyogbW92IHIxLCBjMSAgICAgICAqLwogICAgICAgIDB4MDMwMDAwMDIsIDB4ZDAwZjAwMDAsIDB4ODBlNDAwMDEsIDB4YTBlNDAwMDIsICAgICAvKiBhZGQgb0QwLCByMSwgYzIgICovCiAgICAgICAgMHgwMjAwMDAwMSwgMHhjMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgIC8qIG1vdiBvUG9zLCB2MCAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAqLwogICAgfTsKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzW10gPSB7CiAgICAgICAgezAsIDAsICBEM0RERUNMVFlQRV9GTE9BVDMsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfUE9TSVRJT04sIDB9LAogICAgICAgIEQzRERFQ0xfRU5EKCkKICAgIH07CiAgICBmbG9hdCBxdWFkMVtdID0gewogICAgICAgIC0xLjAsICAgLTEuMCwgICAwLjEsCiAgICAgICAgIDAuMCwgICAtMS4wLCAgIDAuMSwKICAgICAgICAtMS4wLCAgICAwLjAsICAgMC4xLAogICAgICAgICAwLjAsICAgIDAuMCwgICAwLjEKICAgIH07CiAgICBmbG9hdCBxdWFkMltdID0gewogICAgICAgICAwLjAsICAgLTEuMCwgICAwLjEsCiAgICAgICAgIDEuMCwgICAtMS4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgICAwLjAsICAgMC4xLAogICAgICAgICAxLjAsICAgIDAuMCwgICAwLjEKICAgIH07CiAgICBmbG9hdCBxdWFkM1tdID0gewogICAgICAgICAwLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgIDEuMCwgICAgMC4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgICAxLjAsICAgMC4xLAogICAgICAgICAxLjAsICAgIDEuMCwgICAwLjEKICAgIH07CiAgICBmbG9hdCBxdWFkNFtdID0gewogICAgICAgIC0xLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwKICAgICAgICAtMS4wLCAgICAxLjAsICAgMC4xLAogICAgICAgICAwLjAsICAgIDEuMCwgICAwLjEKICAgIH07CiAgICBmbG9hdCB0ZXN0X2RhdGFfYzFbNF0gPSB7ICAxLjI1LCAtMC41MCwgLTEuNTAsIDEuMH07CiAgICBmbG9hdCB0ZXN0X2RhdGFfYzJbNF0gPSB7IC0wLjUwLCAgMS4yNSwgIDIuMDAsIDEuMH07CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmMDBmZmZmLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyKGRldmljZSwgc2hhZGVyX2NvZGVfMTEsICZzaGFkZXJfMTEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyKGRldmljZSwgc2hhZGVyX2NvZGVfMTFfMiwgJnNoYWRlcl8xMV8yKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlcihkZXZpY2UsIHNoYWRlcl9jb2RlXzIwLCAmc2hhZGVyXzIwKTsKICAgIGlmKEZBSUxFRChocikpIHNoYWRlcl8yMCA9IE5VTEw7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyKGRldmljZSwgc2hhZGVyX2NvZGVfMjBfMiwgJnNoYWRlcl8yMF8yKTsKICAgIGlmKEZBSUxFRChocikpIHNoYWRlcl8yMF8yID0gTlVMTDsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHMsICZkZWNsKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlckNvbnN0YW50RihkZXZpY2UsIDEsIHRlc3RfZGF0YV9jMSwgMSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlckNvbnN0YW50RiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoZGV2aWNlLCAyLCB0ZXN0X2RhdGFfYzIsIDEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIHNoYWRlcl8xMSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQxLCAzICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIHNoYWRlcl8xMV8yKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDIsIDMgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBpZihzaGFkZXJfMjApIHsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIHNoYWRlcl8yMCk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDMsIDMgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICB9CgogICAgICAgIGlmKHNoYWRlcl8yMF8yKSB7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBzaGFkZXJfMjBfMik7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDQsIDMgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICB9CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMzYwKTsKICAgIG9rKGNvbG9yID09IDB4MDBiZmJmODAgfHwgY29sb3IgPT0gMHgwMGJmYmY3ZiB8fCBjb2xvciA9PSAweDAwYmZiZjgxLAogICAgICAgInF1YWQgMSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGJmYmY4MFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAzNjApOwogICAgb2soY29sb3IgPT0gMHgwMGJmYmY4MCB8fCBjb2xvciA9PSAweDAwYmZiZjdmIHx8IGNvbG9yID09IDB4MDBiZmJmODEsCiAgICAgICAicXVhZCAyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwYmZiZjgwXG4iLCBjb2xvcik7CiAgICBpZihzaGFkZXJfMjApIHsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMGJmYmY4MCB8fCBjb2xvciA9PSAweDAwYmZiZjdmIHx8IGNvbG9yID09IDB4MDBiZmJmODEsCiAgICAgICAgICAgInF1YWQgMyBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGJmYmY4MFxuIiwgY29sb3IpOwogICAgfQogICAgaWYoc2hhZGVyXzIwXzIpIHsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDEyMCk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMGJmYmY4MCB8fCBjb2xvciA9PSAweDAwYmZiZjdmIHx8IGNvbG9yID09IDB4MDBiZmJmODEsCiAgICAgICAgICAgInF1YWQgNCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGJmYmY4MFxuIiwgY29sb3IpOwogICAgfQoKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOV9SZWxlYXNlKGRlY2wpOwogICAgaWYoc2hhZGVyXzIwXzIpIElEaXJlY3QzRFZlcnRleFNoYWRlcjlfUmVsZWFzZShzaGFkZXJfMjBfMik7CiAgICBpZihzaGFkZXJfMjApIElEaXJlY3QzRFZlcnRleFNoYWRlcjlfUmVsZWFzZShzaGFkZXJfMjApOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOV9SZWxlYXNlKHNoYWRlcl8xMV8yKTsKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjlfUmVsZWFzZShzaGFkZXJfMTEpOwp9CgpzdGF0aWMgdm9pZCBjb25zdGFudF9jbGFtcF9wc190ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpzaGFkZXJfMTEsICpzaGFkZXJfMTIsICpzaGFkZXJfMTQsICpzaGFkZXJfMjA7CiAgICBIUkVTVUxUIGhyOwogICAgRFdPUkQgY29sb3I7CiAgICBEV09SRCBzaGFkZXJfY29kZV8xMVtdID0gIHsKICAgICAgICAweGZmZmYwMTAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfMV8xICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ODAwZjAwMDEsIDB4YTBlNDAwMDEsICAgICAgICAgICAgICAgICAvKiBtb3YgcjEsIGMxICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMiwgMHg4MDBmMDAwMCwgMHg4MGU0MDAwMSwgMHhhMGU0MDAwMiwgICAgIC8qIGFkZCByMCwgcjEsIGMyICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAqLwogICAgfTsKICAgIERXT1JEIHNoYWRlcl9jb2RlXzEyW10gPSAgewogICAgICAgIDB4ZmZmZjAxMDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18xXzIgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDBmMDAwMSwgMHhhMGU0MDAwMSwgICAgICAgICAgICAgICAgIC8qIG1vdiByMSwgYzEgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAyLCAweDgwMGYwMDAwLCAweDgwZTQwMDAxLCAweGEwZTQwMDAyLCAgICAgLyogYWRkIHIwLCByMSwgYzIgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICovCiAgICB9OwogICAgLyogU2tpcCAxLjMgc2hhZGVycyBiZWNhdXNlIHdlIGhhdmUgb25seSA0IHF1YWRzKG9rLCBjb3VsZCBtYWtlIHRoZW0gc21hbGxlciBpZiBuZWVkZWQpLgogICAgICogMS4yIGFuZCAxLjQgc2hhZGVycyBiZWhhdmUgdGhlIHNhbWUsIHNvIGl0J3MgdW5saWtlbHkgdGhhdCAxLjMgc2hhZGVycyBhcmUgZGlmZmVyZW50LgogICAgICogRHVyaW5nIGRldmVsb3BtZW50IG9mIHRoaXMgdGVzdCwgMS4zIHNoYWRlcnMgd2VyZSB2ZXJpZmllZCB0b28KICAgICAqLwogICAgRFdPUkQgc2hhZGVyX2NvZGVfMTRbXSA9ICB7CiAgICAgICAgMHhmZmZmMDEwNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzFfNCAgICAgICAgICAgKi8KICAgICAgICAvKiBUcnkgdG8gbWFrZSBvbmUgY29uc3RhbnQgbG9jYWwuIEl0IGdldHMgY2xhbXBlZCB0b28sIGFsdGhvdWdoIHRoZSBiaW5hcnkgY29udGFpbnMKICAgICAgICAgKiB0aGUgYmlnZ2VyIG51bWJlcnMKICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDUxLCAweGEwMGYwMDAyLCAweGJmMDAwMDAwLCAweDNmYTAwMDAwLCAweDQwMDAwMDAwLCAweDNmODAwMDAwLCAvKiBkZWYgYzIsIC0wLjUsIDEuMjUsIDIsIDEgKi8KICAgICAgICAweDAwMDAwMDAxLCAweDgwMGYwMDAxLCAweGEwZTQwMDAxLCAgICAgICAgICAgICAgICAgLyogbW92IHIxLCBjMSAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDIsIDB4ODAwZjAwMDAsIDB4ODBlNDAwMDEsIDB4YTBlNDAwMDIsICAgICAvKiBhZGQgcjAsIHIxLCBjMiAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBEV09SRCBzaGFkZXJfY29kZV8yMFtdID0gIHsKICAgICAgICAweGZmZmYwMjAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfMl8wICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMDEsIDB4ODAwZjAwMDEsIDB4YTBlNDAwMDEsICAgICAgICAgICAgICAgICAvKiBtb3YgcjEsIGMxICAgICAgICovCiAgICAgICAgMHgwMzAwMDAwMiwgMHg4MDBmMDAwMCwgMHg4MGU0MDAwMSwgMHhhMGU0MDAwMiwgICAgIC8qIGFkZCByMCwgcjEsIGMyICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDgwZTQwMDAwLCAgICAgICAgICAgICAgICAgLyogbW92IG9DMCwgcjAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICovCiAgICB9OwogICAgZmxvYXQgcXVhZDFbXSA9IHsKICAgICAgICAtMS4wLCAgIC0xLjAsICAgMC4xLAogICAgICAgICAwLjAsICAgLTEuMCwgICAwLjEsCiAgICAgICAgLTEuMCwgICAgMC4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgICAwLjAsICAgMC4xCiAgICB9OwogICAgZmxvYXQgcXVhZDJbXSA9IHsKICAgICAgICAgMC4wLCAgIC0xLjAsICAgMC4xLAogICAgICAgICAxLjAsICAgLTEuMCwgICAwLjEsCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwKICAgICAgICAgMS4wLCAgICAwLjAsICAgMC4xCiAgICB9OwogICAgZmxvYXQgcXVhZDNbXSA9IHsKICAgICAgICAgMC4wLCAgICAwLjAsICAgMC4xLAogICAgICAgICAxLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgIDAuMCwgICAgMS4wLCAgIDAuMSwKICAgICAgICAgMS4wLCAgICAxLjAsICAgMC4xCiAgICB9OwogICAgZmxvYXQgcXVhZDRbXSA9IHsKICAgICAgICAtMS4wLCAgICAwLjAsICAgMC4xLAogICAgICAgICAwLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgLTEuMCwgICAgMS4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgICAxLjAsICAgMC4xCiAgICB9OwogICAgZmxvYXQgdGVzdF9kYXRhX2MxWzRdID0geyAgMS4yNSwgLTAuNTAsIC0xLjUwLCAxLjB9OwogICAgZmxvYXQgdGVzdF9kYXRhX2MyWzRdID0geyAtMC41MCwgIDEuMjUsICAyLjAwLCAxLjB9OwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZjAwZmZmZiwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyX2NvZGVfMTEsICZzaGFkZXJfMTEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl9jb2RlXzEyLCAmc2hhZGVyXzEyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXJfY29kZV8xNCwgJnNoYWRlcl8xNCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyX2NvZGVfMjAsICZzaGFkZXJfMjApOwogICAgaWYoRkFJTEVEKGhyKSkgc2hhZGVyXzIwID0gTlVMTDsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoZGV2aWNlLCAxLCB0ZXN0X2RhdGFfYzEsIDEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlckNvbnN0YW50RiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlckNvbnN0YW50RihkZXZpY2UsIDIsIHRlc3RfZGF0YV9jMiwgMSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVopOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyXzExKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMSwgMyAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl8xMik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDIsIDMgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXJfMTQpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQzLCAzICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgaWYoc2hhZGVyXzIwKSB7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl8yMCk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkNCwgMyAqIHNpemVvZihmbG9hdCkpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIH0KCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDM2MCk7CiAgICBvayhjb2xvciA9PSAweDAwODA4MDAwIHx8IGNvbG9yID09IDB4MDA3ZjdmMDAgfHwgY29sb3IgPT0gMHgwMDgxODEwMCwKICAgICAgICJxdWFkIDEgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDA4MDgwMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMzYwKTsKICAgIG9rKGNvbG9yID09IDB4MDA4MDgwMDAgfHwgY29sb3IgPT0gMHgwMDdmN2YwMCB8fCBjb2xvciA9PSAweDAwODE4MTAwLAogICAgICAgInF1YWQgMiBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDgwODAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAxMjApOwogICAgb2soY29sb3IgPT0gMHgwMDgwODAwMCB8fCBjb2xvciA9PSAweDAwN2Y3ZjAwIHx8IGNvbG9yID09IDB4MDA4MTgxMDAsCiAgICAgICAicXVhZCAzIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwODA4MDAwXG4iLCBjb2xvcik7CiAgICBpZihzaGFkZXJfMjApIHsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMGJmYmY4MCB8fCBjb2xvciA9PSAweDAwYmZiZjdmIHx8IGNvbG9yID09IDB4MDBiZmJmODEsCiAgICAgICAgICAgInF1YWQgNCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGJmYmY4MFxuIiwgY29sb3IpOwogICAgfQoKICAgIGlmKHNoYWRlcl8yMCkgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyXzIwKTsKICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOV9SZWxlYXNlKHNoYWRlcl8xNCk7CiAgICBJRGlyZWN0M0RQaXhlbFNoYWRlcjlfUmVsZWFzZShzaGFkZXJfMTIpOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyXzExKTsKfQoKc3RhdGljIHZvaWQgY25kX3Rlc3QoSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlKQp7CiAgICBJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnNoYWRlcl8xMSwgKnNoYWRlcl8xMiwgKnNoYWRlcl8xMywgKnNoYWRlcl8xNDsKICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqc2hhZGVyXzExX2NvaXNzdWUsICpzaGFkZXJfMTJfY29pc3N1ZSwgKnNoYWRlcl8xM19jb2lzc3VlLCAqc2hhZGVyXzE0X2NvaXNzdWU7CiAgICBIUkVTVUxUIGhyOwogICAgRFdPUkQgY29sb3I7CiAgICAvKiBwcyAxLnggc2hhZGVycyBhcmUgcmF0aGVyIHBpY2t5IHdpdGggd3JpdGVtYXNrcyBhbmQgc291cmNlIHN3aXp6bGVzLiBUaGUgZHAzIGlzCiAgICAgKiB1c2VkIHRvIGNvcHkgcjAuciB0byBhbGwgY29tcG9uZW50cyBvZiByMSwgdGhlbiBjb3B5IHIxLmEgdG8gYzAuYS4gRXNzZW50aWFsbHkgaXQKICAgICAqIGRvZXMgYSBtb3YgcjAuYSwgcjAuciwgd2hpY2ggaXNuJ3QgYWxsb3dlZCBhcy1pcyBpbiAxLnggcGl4ZWwgc2hhZGVycy4KICAgICAqLwogICAgRFdPUkQgc2hhZGVyX2NvZGVfMTFbXSA9ICB7CiAgICAgICAgMHhmZmZmMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzFfMSAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMCwgMHgzZjgwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgICAgIC8qIGRlZiBjMCwgMSwgMCwgMCwgMCAgICovCiAgICAgICAgMHgwMDAwMDA0MCwgMHhiMDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRleGNvb3JkIHQwICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDBmMDAwMCwgMHhiMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMCwgPz8/KHQwKSAgICAgICovCiAgICAgICAgMHgwMDAwMDAwOCwgMHg4MDBmMDAwMSwgMHg4MGU0MDAwMCwgMHhhMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRwMyByMSwgcjAsIGMwICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDA4MDAwMCwgMHg4MGZmMDAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMC5hLCByMS5hICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MCwgMHg4MDBmMDAwMCwgMHg4MGZmMDAwMCwgMHhhMGU0MDAwMSwgMHhhMGU0MDAwMiwgICAgICAgICAgICAgICAgIC8qIGNuZCByMCwgcjAuYSwgYzEsIGMyICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgRFdPUkQgc2hhZGVyX2NvZGVfMTJbXSA9ICB7CiAgICAgICAgMHhmZmZmMDEwMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzFfMiAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMCwgMHgzZjgwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgICAgIC8qIGRlZiBjMCwgMSwgMCwgMCwgMCAgICovCiAgICAgICAgMHgwMDAwMDA0MCwgMHhiMDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRleGNvb3JkIHQwICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDBmMDAwMCwgMHhiMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMCwgdDAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwOCwgMHg4MDBmMDAwMSwgMHg4MGU0MDAwMCwgMHhhMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRwMyByMSwgcjAsIGMwICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDA4MDAwMCwgMHg4MGZmMDAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMC5hLCByMS5hICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MCwgMHg4MDBmMDAwMCwgMHg4MGZmMDAwMCwgMHhhMGU0MDAwMSwgMHhhMGU0MDAwMiwgICAgICAgICAgICAgICAgIC8qIGNuZCByMCwgcjAuYSwgYzEsIGMyICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgRFdPUkQgc2hhZGVyX2NvZGVfMTNbXSA9ICB7CiAgICAgICAgMHhmZmZmMDEwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzFfMyAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMCwgMHgzZjgwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgICAgIC8qIGRlZiBjMCwgMSwgMCwgMCwgMCAgICovCiAgICAgICAgMHgwMDAwMDA0MCwgMHhiMDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRleGNvb3JkIHQwICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDBmMDAwMCwgMHhiMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMCwgdDAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwOCwgMHg4MDBmMDAwMSwgMHg4MGU0MDAwMCwgMHhhMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRwMywgcjEsIHIwLCBjMCAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDA4MDAwMCwgMHg4MGZmMDAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMC5hLCByMS5hICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MCwgMHg4MDBmMDAwMCwgMHg4MGZmMDAwMCwgMHhhMGU0MDAwMSwgMHhhMGU0MDAwMiwgICAgICAgICAgICAgICAgIC8qIGNuZCByMCwgcjAuYSwgYzEsIGMyICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgRFdPUkQgc2hhZGVyX2NvZGVfMTRbXSA9ICB7CiAgICAgICAgMHhmZmZmMDEwNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzFfMyAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZjgwMDAwMCwgICAgIC8qIGRlZiBjMCwgMCwgMCwgMCwgMSAgICovCiAgICAgICAgMHgwMDAwMDA0MCwgMHg4MDA3MDAwMCwgMHhiMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRleGNyZCByMCwgdDAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDA4MDAwMCwgMHhhMGZmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMC5hLCBjMC5hICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MCwgMHg4MDBmMDAwMCwgMHg4MGU0MDAwMCwgMHhhMGU0MDAwMSwgMHhhMGU0MDAwMiwgICAgICAgICAgICAgICAgIC8qIGNuZCByMCwgcjAsIGMxLCBjMiAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICovCiAgICB9OwoKICAgIC8qIFNwZWNpYWwgZnVuOiBUaGUgY29pc3N1ZSBmbGFnIG9uIGNuZDogQXBwYXJlbnRseSBjbmQgYWx3YXlzIHNlbGVjdHMgdGhlIDJuZCBzb3VyY2UsCiAgICAgKiBhcyBpZiB0aGUgc3JjMCBjb21wYXJpc29uIGFnYWluc3QgMC41IGFsd2F5cyBldmFsdWF0ZXMgdG8gdHJ1ZS4gVGhlIGNvaXNzdWUgZmxhZyBpc24ndAogICAgICogc2V0IGJ5IHRoZSBjb21waWxlciwgaXQgd2FzIGFkZGVkIG1hbnVhbGx5IGFmdGVyIGNvbXBpbGF0aW9uLiBJdCBpc24ndCBhbHdheXMgYWxsb3dlZCwKICAgICAqIG9ubHkgaWYgdGhlcmUncyBhIG1vdiByMC5hLCBYWFhYLCBhbmQgdGhlIGNuZCBpbnN0cnVjdGlvbiB3cml0ZXMgdG8gcjAueHl6LCBvdGhlcndpc2UKICAgICAqIG5hdGl2ZSBDcmVhdGVQaXhlbFNoYWRlciByZXR1cm5zIGFuIGVycm9yLgogICAgICoKICAgICAqIFRoZSBzaGFkZXIgYXR0ZW1wdHMgdG8gdGVzdCB0aGUgcmFuZ2UgWy0xOzFdIGFnYWluc3QgY29pc3N1ZWQgY25kLCB3aGljaCBpcyBhIGJpdCB0cmlja3kuCiAgICAgKiBUaGUgaW5wdXQgZnJvbSB0MCBpcyBbMDsxXS4gMC41IGlzIHN1YnN0cmFjdGVkLCB0aGVuIHdlIGhhdmUgdG8gbXVsdGlwbHkgd2l0aCAyLiBTaW5jZQogICAgICogY29uc3RhbnRzIGFyZSBjbGFtcGVkIHRvIFstMTsxXSwgYSAyLjAgaXMgY29uc3RydWN0ZWQgYnkgYWRkaW5nIGMwLnIoPTEuMCkgdG8gYzAuciBpbnRvIHIxLnIsCiAgICAgKiB0aGVuIHIxKDIuMCwgMC4wLCAwLjAsIDAuMCkgaXMgcGFzc2VkIHRvIGRwMyhleHBsYWluZWQgYWJvdmUpLgogICAgICovCiAgICBEV09SRCBzaGFkZXJfY29kZV8xMV9jb2lzc3VlW10gPSAgewogICAgICAgIDB4ZmZmZjAxMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzFfMSAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwNTEsIDB4YTAwZjAwMDAsIDB4M2Y4MDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIC8qIGRlZiBjMCwgMSwgMCwgMCwgMCAgICAgICAqLwogICAgICAgIDB4MDAwMDAwNTEsIDB4YTAwZjAwMDMsIDB4M2YwMDAwMDAsIDB4M2YwMDAwMDAsIDB4M2YwMDAwMDAsIDB4MDAwMDAwMDAsIC8qIGRlZiBjMywgMC41LCAwLjUsIDAuNSwgMCAqLwogICAgICAgIDB4MDAwMDAwNDAsIDB4YjAwZjAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRleGNvb3JkIHQwICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ODAwZjAwMDAsIDB4YjBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMCwgdDAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDMsIDB4ODAwZjAwMDAsIDB4ODBlNDAwMDAsIDB4YTBlNDAwMDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1YiByMCwgcjAsIGMzICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDIsIDB4ODAwZjAwMDEsIDB4YTBlNDAwMDAsIDB4YTBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCByMSwgYzAsIGMwICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDgsIDB4ODAwZjAwMDEsIDB4ODBlNDAwMDAsIDB4ODBlNDAwMDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRwMywgcjEsIHIwLCByMSAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ODAwODAwMDAsIDB4ODBmZjAwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMC5hLCByMS5hICAgICAgICAgICAqLwogICAgICAgIC8qIDB4NDAwMDAwMDAgPSBEM0RTSV9DT0lTU1VFICovCiAgICAgICAgMHg0MDAwMDA1MCwgMHg4MDA3MDAwMCwgMHg4MGZmMDAwMCwgMHhhMGU0MDAwMSwgMHhhMGU0MDAwMiwgICAgICAgICAgICAgLyogY25kIHIwLnh5eiwgcjAuYSwgYzEsIGMyICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgRFdPUkQgc2hhZGVyX2NvZGVfMTJfY29pc3N1ZVtdID0gIHsKICAgICAgICAweGZmZmYwMTAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18xXzIgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDUxLCAweGEwMGYwMDAwLCAweDNmODAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAvKiBkZWYgYzAsIDEsIDAsIDAsIDAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDUxLCAweGEwMGYwMDAzLCAweDNmMDAwMDAwLCAweDNmMDAwMDAwLCAweDNmMDAwMDAwLCAweDAwMDAwMDAwLCAvKiBkZWYgYzMsIDAuNSwgMC41LCAwLjUsIDAgKi8KICAgICAgICAweDAwMDAwMDQwLCAweGIwMGYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXhjb29yZCB0MCAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweDgwMGYwMDAwLCAweGIwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgcjAsIHQwICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAzLCAweDgwMGYwMDAwLCAweDgwZTQwMDAwLCAweGEwZTQwMDAzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWIgcjAsIHIwLCBjMyAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAyLCAweDgwMGYwMDAxLCAweGEwZTQwMDAwLCAweGEwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgcjEsIGMwLCBjMCAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDA4LCAweDgwMGYwMDAxLCAweDgwZTQwMDAwLCAweDgwZTQwMDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcDMsIHIxLCByMCwgcjEgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweDgwMDgwMDAwLCAweDgwZmYwMDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgcjAuYSwgcjEuYSAgICAgICAgICAgKi8KICAgICAgICAvKiAweDQwMDAwMDAwID0gRDNEU0lfQ09JU1NVRSAqLwogICAgICAgIDB4NDAwMDAwNTAsIDB4ODAwNzAwMDAsIDB4ODBmZjAwMDAsIDB4YTBlNDAwMDEsIDB4YTBlNDAwMDIsICAgICAgICAgICAgIC8qIGNuZCByMC54eXosIHIwLmEsIGMxLCBjMiAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIERXT1JEIHNoYWRlcl9jb2RlXzEzX2NvaXNzdWVbXSA9ICB7CiAgICAgICAgMHhmZmZmMDEwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfMV8zICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMCwgMHgzZjgwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMwLCAxLCAwLCAwLCAwICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMywgMHgzZjAwMDAwMCwgMHgzZjAwMDAwMCwgMHgzZjAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMzLCAwLjUsIDAuNSwgMC41LCAwICovCiAgICAgICAgMHgwMDAwMDA0MCwgMHhiMDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGV4Y29vcmQgdDAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDBmMDAwMCwgMHhiMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IHIwLCB0MCAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMywgMHg4MDBmMDAwMCwgMHg4MGU0MDAwMCwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ViIHIwLCByMCwgYzMgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMiwgMHg4MDBmMDAwMSwgMHhhMGU0MDAwMCwgMHhhMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkIHIxLCBjMCwgYzAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwOCwgMHg4MDBmMDAwMSwgMHg4MGU0MDAwMCwgMHg4MGU0MDAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHAzLCByMSwgcjAsIHIxICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDA4MDAwMCwgMHg4MGZmMDAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IHIwLmEsIHIxLmEgICAgICAgICAgICovCiAgICAgICAgLyogMHg0MDAwMDAwMCA9IEQzRFNJX0NPSVNTVUUgKi8KICAgICAgICAweDQwMDAwMDUwLCAweDgwMDcwMDAwLCAweDgwZmYwMDAwLCAweGEwZTQwMDAxLCAweGEwZTQwMDAyLCAgICAgICAgICAgICAvKiBjbmQgcjAueHl6LCByMC5hLCBjMSwgYzIgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICAvKiBwc18xXzQgZG9lcyBub3QgaGF2ZSBhIGRpZmZlcmVudCBjbmQgYmVoYXZpb3IsIGp1c3QgcGFzcyB0aGUgWzA7MV0gdGV4Y3JkIHJlc3VsdCB0byBjbmQsIGl0IHdpbGwKICAgICAqIGNvbXBhcmUgYWdhaW5zdCAwLjUKICAgICAqLwogICAgRFdPUkQgc2hhZGVyX2NvZGVfMTRfY29pc3N1ZVtdID0gIHsKICAgICAgICAweGZmZmYwMTA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18xXzQgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDUxLCAweGEwMGYwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNmODAwMDAwLCAvKiBkZWYgYzAsIDAsIDAsIDAsIDEgICAgICAgKi8KICAgICAgICAweDAwMDAwMDQwLCAweDgwMDcwMDAwLCAweGIwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXhjcmQgcjAsIHQwICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweDgwMDgwMDAwLCAweGEwZmYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgcjAuYSwgYzAuYSAgICAgICAgICAgKi8KICAgICAgICAvKiAweDQwMDAwMDAwID0gRDNEU0lfQ09JU1NVRSAqLwogICAgICAgIDB4NDAwMDAwNTAsIDB4ODAwNzAwMDAsIDB4ODBlNDAwMDAsIDB4YTBlNDAwMDEsIDB4YTBlNDAwMDIsICAgICAgICAgICAgIC8qIGNuZCByMC54eXosIHIwLCBjMSwgYzIgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIGZsb2F0IHF1YWQxW10gPSB7CiAgICAgICAgLTEuMCwgICAtMS4wLCAgIDAuMSwgICAgIDAuMCwgICAgMC4wLCAgICAxLjAsCiAgICAgICAgIDAuMCwgICAtMS4wLCAgIDAuMSwgICAgIDEuMCwgICAgMC4wLCAgICAxLjAsCiAgICAgICAgLTEuMCwgICAgMC4wLCAgIDAuMSwgICAgIDAuMCwgICAgMS4wLCAgICAwLjAsCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwgICAgIDEuMCwgICAgMS4wLCAgICAwLjAKICAgIH07CiAgICBmbG9hdCBxdWFkMltdID0gewogICAgICAgICAwLjAsICAgLTEuMCwgICAwLjEsICAgICAwLjAsICAgIDAuMCwgICAgMS4wLAogICAgICAgICAxLjAsICAgLTEuMCwgICAwLjEsICAgICAxLjAsICAgIDAuMCwgICAgMS4wLAogICAgICAgICAwLjAsICAgIDAuMCwgICAwLjEsICAgICAwLjAsICAgIDEuMCwgICAgMC4wLAogICAgICAgICAxLjAsICAgIDAuMCwgICAwLjEsICAgICAxLjAsICAgIDEuMCwgICAgMC4wCiAgICB9OwogICAgZmxvYXQgcXVhZDNbXSA9IHsKICAgICAgICAgMC4wLCAgICAwLjAsICAgMC4xLCAgICAgMC4wLCAgICAwLjAsICAgIDEuMCwKICAgICAgICAgMS4wLCAgICAwLjAsICAgMC4xLCAgICAgMS4wLCAgICAwLjAsICAgIDEuMCwKICAgICAgICAgMC4wLCAgICAxLjAsICAgMC4xLCAgICAgMC4wLCAgICAxLjAsICAgIDAuMCwKICAgICAgICAgMS4wLCAgICAxLjAsICAgMC4xLCAgICAgMS4wLCAgICAxLjAsICAgIDAuMAogICAgfTsKICAgIGZsb2F0IHF1YWQ0W10gPSB7CiAgICAgICAgLTEuMCwgICAgMC4wLCAgIDAuMSwgICAgIDAuMCwgICAgMC4wLCAgICAxLjAsCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwgICAgIDEuMCwgICAgMC4wLCAgICAxLjAsCiAgICAgICAgLTEuMCwgICAgMS4wLCAgIDAuMSwgICAgIDAuMCwgICAgMS4wLCAgICAwLjAsCiAgICAgICAgIDAuMCwgICAgMS4wLCAgIDAuMSwgICAgIDEuMCwgICAgMS4wLCAgICAwLjAKICAgIH07CiAgICBmbG9hdCB0ZXN0X2RhdGFfYzFbNF0gPSB7ICAwLjAsIDAuMCwgMC4wLCAwLjB9OwogICAgZmxvYXQgdGVzdF9kYXRhX2MyWzRdID0geyAgMS4wLCAxLjAsIDEuMCwgMS4wfTsKICAgIGZsb2F0IHRlc3RfZGF0YV9jMV9jb2lbNF0gPSB7ICAwLjAsIDEuMCwgMC4wLCAwLjB9OwogICAgZmxvYXQgdGVzdF9kYXRhX2MyX2NvaVs0XSA9IHsgIDEuMCwgMC4wLCAxLjAsIDEuMH07CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmMDBmZmZmLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXJfY29kZV8xMSwgJnNoYWRlcl8xMSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyX2NvZGVfMTIsICZzaGFkZXJfMTIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl9jb2RlXzEzLCAmc2hhZGVyXzEzKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXJfY29kZV8xNCwgJnNoYWRlcl8xNCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyX2NvZGVfMTFfY29pc3N1ZSwgJnNoYWRlcl8xMV9jb2lzc3VlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXJfY29kZV8xMl9jb2lzc3VlLCAmc2hhZGVyXzEyX2NvaXNzdWUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl9jb2RlXzEzX2NvaXNzdWUsICZzaGFkZXJfMTNfY29pc3N1ZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyX2NvZGVfMTRfY29pc3N1ZSwgJnNoYWRlcl8xNF9jb2lzc3VlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGRldmljZSwgMSwgdGVzdF9kYXRhX2MxLCAxKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXJDb25zdGFudEYgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoZGV2aWNlLCAyLCB0ZXN0X2RhdGFfYzIsIDEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlckNvbnN0YW50RiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaIHwgRDNERlZGX1RFWDEpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyXzExKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMSwgNiAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl8xMik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDIsIDYgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXJfMTMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQzLCA2ICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyXzE0KTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkNCwgNiAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgLyogVGhpcyBpcyB0aGUgMS40IHRlc3QuIEVhY2ggY29tcG9uZW50KHIsIGcsIGIpIGlzIHRlc3RlZCBzZXBhcmF0ZWx5IGFnYWluc3QgMC41ICovCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNTgsIDExOCk7CiAgICBvayhjb2xvciA9PSAweDAwZmYwMGZmLCAicGl4ZWwgMTU4LCAxMTggaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MiwgMTE4KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwaXhlbCAxNjIsIDExOCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDBmZlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTU4LCAxMjIpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInBpeGVsIDE2MiwgMTIyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjIsIDEyMik7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZmZmLCAicGl4ZWwgMTYyLCAxMjIgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmZmZcbiIsIGNvbG9yKTsKCiAgICAvKiAxLjEgc2hhZGVyLiBBbGwgMyBjb21wb25lbnRzIGdldCBzZXQsIGJhc2VkIG9uIHRoZSAudyBjb21wYXJpc29uICovCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNTgsIDM1OCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAicGl4ZWwgMTU4LCAzNTggaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MiwgMzU4KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwMDAsICJwaXhlbCAxNjIsIDM1OCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTU4LCAzNjIpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInBpeGVsIDE1OCwgMzYyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjIsIDM2Mik7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDAwLCAicGl4ZWwgMTYyLCAzNjIgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwMDBcbiIsIGNvbG9yKTsKCiAgICAvKiAxLjIgc2hhZGVyICovCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0NzgsIDM1OCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAicGl4ZWwgNDc4LCAzNTggaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MiwgMzU4KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwMDAsICJwaXhlbCA0ODIsIDM1OCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDc4LCAzNjIpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInBpeGVsIDQ3OCwgMzYyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODIsIDM2Mik7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDAwLCAicGl4ZWwgNDgyLCAzNjIgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwMDBcbiIsIGNvbG9yKTsKCiAgICAvKiAxLjMgc2hhZGVyICovCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0NzgsIDExOCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAicGl4ZWwgNDc4LCAxMTggaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MiwgMTE4KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwMDAsICJwaXhlbCA0ODIsIDExOCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDc4LCAxMjIpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInBpeGVsIDQ3OCwgMTIyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODIsIDEyMik7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDAwLCAicGl4ZWwgNDgyLCAxMjIgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwMDBcbiIsIGNvbG9yKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmYwMGZmZmYsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGRldmljZSwgMSwgdGVzdF9kYXRhX2MxX2NvaSwgMSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGKGRldmljZSwgMiwgdGVzdF9kYXRhX2MyX2NvaSwgMSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl8xMV9jb2lzc3VlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMSwgNiAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl8xMl9jb2lzc3VlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMiwgNiAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl8xM19jb2lzc3VlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMywgNiAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl8xNF9jb2lzc3VlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkNCwgNiAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIFRoaXMgaXMgdGhlIDEuNCB0ZXN0LiBUaGUgY29pc3N1ZSBkb2Vzbid0IGNoYW5nZSB0aGUgYmVoYXZpb3IgaGVyZSwgYnV0IGtlZXAgaW4gbWluZAogICAgICogdGhhdCB3ZSBzd2FwcGVkIHRoZSB2YWx1ZXMgaW4gYzEgYW5kIGMyIHRvIG1ha2UgdGhlIG90aGVyIHRlc3RzIHJldHVybiBzb21lIGNvbG9yCiAgICAgKi8KICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE1OCwgMTE4KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJwaXhlbCAxNTgsIDExOCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmZmZmZlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYyLCAxMTgpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmZmZiwgInBpeGVsIDE2MiwgMTE4IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNTgsIDEyMik7CiAgICBvayhjb2xvciA9PSAweDAwZmYwMGZmLCAicGl4ZWwgMTYyLCAxMjIgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MiwgMTIyKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwaXhlbCAxNjIsIDEyMiBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDBmZlxuIiwgY29sb3IpOwoKICAgIC8qIDEuMSBzaGFkZXIuIGNvaXNzdWUgZmxhZyBjaGFuZ2VkIHRoZSBzZW1hbnRpYyBvZiBjbmQsIGMxIGlzIGFsd2F5cyBzZWxlY3RlZCAqLwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTU4LCAzNTgpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgInBpeGVsIDE1OCwgMzU4IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjIsIDM1OCk7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZjAwLCAicGl4ZWwgMTYyLCAzNTggaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE1OCwgMzYyKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJwaXhlbCAxNTgsIDM2MiBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmYwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYyLCAzNjIpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgInBpeGVsIDE2MiwgMzYyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBmZjAwXG4iLCBjb2xvcik7CgogICAgLyogMS4yIHNoYWRlciAqLwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDc4LCAzNTgpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgInBpeGVsIDQ3OCwgMzU4IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODIsIDM1OCk7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZjAwLCAicGl4ZWwgNDgyLCAzNTggaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ3OCwgMzYyKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJwaXhlbCA0NzgsIDM2MiBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmYwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgyLCAzNjIpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgInBpeGVsIDQ4MiwgMzYyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBmZjAwXG4iLCBjb2xvcik7CgogICAgLyogMS4zIHNoYWRlciAqLwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDc4LCAxMTgpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgInBpeGVsIDQ3OCwgMTE4IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODIsIDExOCk7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZjAwLCAicGl4ZWwgNDgyLCAxMTggaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ3OCwgMTIyKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJwaXhlbCA0NzgsIDEyMiBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmYwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgyLCAxMjIpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgInBpeGVsIDQ4MiwgMTIyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBmZjAwXG4iLCBjb2xvcik7CgogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyXzE0X2NvaXNzdWUpOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyXzEzX2NvaXNzdWUpOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyXzEyX2NvaXNzdWUpOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyXzExX2NvaXNzdWUpOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyXzE0KTsKICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOV9SZWxlYXNlKHNoYWRlcl8xMyk7CiAgICBJRGlyZWN0M0RQaXhlbFNoYWRlcjlfUmVsZWFzZShzaGFkZXJfMTIpOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyXzExKTsKfQoKc3RhdGljIHZvaWQgbmVzdGVkX2xvb3BfdGVzdChJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UpIHsKICAgIGNvbnN0IERXT1JEIHNoYWRlcl9jb2RlW10gPSB7CiAgICAgICAgMHhmZmZmMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfM18wICAgICAgICAgICAgICAgKi8KICAgICAgICAweDA1MDAwMDUxLCAweGEwMGYwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNmODAwMDAwLCAvKiBkZWYgYzAsIDAsIDAsIDAsIDEgICAqLwogICAgICAgIDB4MDUwMDAwNTEsIDB4YTAwZjAwMDEsIDB4M2QwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIC8qIGRlZiBjMSwgMS8zMiwgMCwgMCwgMCovCiAgICAgICAgMHgwNTAwMDAzMCwgMHhmMDBmMDAwMCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCwgLyogZGVmaSBpMCwgNCwgMCwgMiwgMCAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwMDAwLCAweGEwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgcjAsIGMwICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWIsIDB4ZjBlNDA4MDAsIDB4ZjBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgYUwsIGkwICAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAxYiwgMHhmMGU0MDgwMCwgMHhmMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9vcCBhTCwgaTAgICAgICAgICAgKi8KICAgICAgICAweDAzMDAwMDAyLCAweDgwMGYwMDAwLCAweDgwZTQwMDAwLCAweGEwZTQwMDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgcjAsIHIwLCBjMSAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZGxvb3AgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAxZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kbG9vcCAgICAgICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDgwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3Ygb0MwLCByMCAgICAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpzaGFkZXI7CiAgICBIUkVTVUxUIGhyOwogICAgRFdPUkQgY29sb3I7CiAgICBjb25zdCBmbG9hdCBxdWFkW10gPSB7CiAgICAgICAgLTEuMCwgICAtMS4wLCAgIDAuMSwKICAgICAgICAgMS4wLCAgIC0xLjAsICAgMC4xLAogICAgICAgIC0xLjAsICAgIDEuMCwgICAwLjEsCiAgICAgICAgIDEuMCwgICAgMS4wLCAgIDAuMQogICAgfTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXJfY29kZSwgJnNoYWRlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldEZWRiBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHgwMDAwZmYwMCwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQsIDMgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDM2MCwgMjQwKTsKICAgIG9rKGNvbG9yID09IDB4MDA3ZjAwMDAgfHwgY29sb3IgPT0gMHgwMDgwMDAwMCB8fCBjb2xvciA9PSAweDAwODEwMDAwLAogICAgICAgIk5lc3RlZCBsb29wIHRlc3QgcmV0dXJuZWQgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwODAwMDAwXG4iLCBjb2xvcik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyKTsKfQoKc3RydWN0IHZhcnlpbmdfdGVzdF9zdHJ1Y3QKewogICAgY29uc3QgRFdPUkQgICAgICAgICAgICAgKnNoYWRlcl9jb2RlOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICAgKnNoYWRlcjsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGNvbG9yLCBjb2xvcl9yaHc7CiAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAqbmFtZTsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIHRvZG8sIHRvZG9fcmh3Owp9OwoKc3RydWN0IGh1Z2VWZXJ0ZXgKewogICAgZmxvYXQgcG9zX3gsICAgICAgICBwb3NfeSwgICAgICBwb3NfeiwgICAgICByaHc7CiAgICBmbG9hdCB3ZWlnaHRfMSwgICAgIHdlaWdodF8yLCAgIHdlaWdodF8zLCAgIHdlaWdodF80OwogICAgZmxvYXQgaW5kZXhfMSwgICAgICBpbmRleF8yLCAgICBpbmRleF8zLCAgICBpbmRleF80OwogICAgZmxvYXQgbm9ybWFsXzEsICAgICBub3JtYWxfMiwgICBub3JtYWxfMywgICBub3JtYWxfNDsKICAgIGZsb2F0IGZvZ18xLCAgICAgICAgZm9nXzIsICAgICAgZm9nXzMsICAgICAgZm9nXzQ7CiAgICBmbG9hdCB0ZXhjb29yZF8xLCAgIHRleGNvb3JkXzIsIHRleGNvb3JkXzMsIHRleGNvb3JkXzQ7CiAgICBmbG9hdCB0YW5nZW50XzEsICAgIHRhbmdlbnRfMiwgIHRhbmdlbnRfMywgIHRhbmdlbnRfNDsKICAgIGZsb2F0IGJpbm9ybWFsXzEsICAgYmlub3JtYWxfMiwgYmlub3JtYWxfMywgYmlub3JtYWxfNDsKICAgIGZsb2F0IGRlcHRoXzEsICAgICAgZGVwdGhfMiwgICAgZGVwdGhfMywgICAgZGVwdGhfNDsKICAgIERXT1JEIGRpZmZ1c2UsIHNwZWN1bGFyOwp9OwoKc3RhdGljIHZvaWQgZml4ZWRfZnVuY3Rpb25fdmFyeWluZ190ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkgewogICAgLyogZGNsX3Bvc2l0aW9uOiBmYWlscyB0byBjb21waWxlICovCiAgICBjb25zdCBEV09SRCBibGVuZHdlaWdodF9jb2RlW10gPSB7CiAgICAgICAgMHhmZmZmMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzNfMCAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMDEsIDB4OTAwZjAwMDAsICAgICAvKiBkY2xfYmxlbmR3ZWlnaHQsIHYwICAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDkwZTQwMDAwLCAgICAgLyogbW92IG9DMCwgdjAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIGNvbnN0IERXT1JEIGJsZW5kaW5kaWNlc19jb2RlW10gPSB7CiAgICAgICAgMHhmZmZmMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzNfMCAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMDIsIDB4OTAwZjAwMDAsICAgICAvKiBkY2xfYmxlbmRpbmRpY2VzLCB2MCAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDkwZTQwMDAwLCAgICAgLyogbW92IG9DMCwgdjAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIGNvbnN0IERXT1JEIG5vcm1hbF9jb2RlW10gPSB7CiAgICAgICAgMHhmZmZmMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzNfMCAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMDMsIDB4OTAwZjAwMDAsICAgICAvKiBkY2xfbm9ybWFsLCB2MCAgICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDkwZTQwMDAwLCAgICAgLyogbW92IG9DMCwgdjAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIC8qIHBzaXplOiBmYWlscz8gKi8KICAgIGNvbnN0IERXT1JEIHRleGNvb3JkMF9jb2RlW10gPSB7CiAgICAgICAgMHhmZmZmMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzNfMCAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMDUsIDB4OTAwZjAwMDAsICAgICAvKiBkY2xfdGV4Y29vcmQwLCB2MCAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDkwZTQwMDAwLCAgICAgLyogbW92IG9DMCwgdjAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIGNvbnN0IERXT1JEIHRhbmdlbnRfY29kZVtdID0gewogICAgICAgIDB4ZmZmZjAzMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18zXzAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDAwMDA2LCAweDkwMGYwMDAwLCAgICAgLyogZGNsX3RhbmdlbnQsIHYwICAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAwMSwgMHg4MDBmMDgwMCwgMHg5MGU0MDAwMCwgICAgIC8qIG1vdiBvQzAsIHYwICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBjb25zdCBEV09SRCBiaW5vcm1hbF9jb2RlW10gPSB7CiAgICAgICAgMHhmZmZmMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzNfMCAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMDcsIDB4OTAwZjAwMDAsICAgICAvKiBkY2xfYmlub3JtYWwsIHYwICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDkwZTQwMDAwLCAgICAgLyogbW92IG9DMCwgdjAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIC8qIHRlc3NmYWN0b3I6IGZhaWxzICovCiAgICAvKiBwb3NpdGlvbnQ6IGZhaWxzICovCiAgICBjb25zdCBEV09SRCBjb2xvcl9jb2RlW10gPSB7CiAgICAgICAgMHhmZmZmMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzNfMCAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMGEsIDB4OTAwZjAwMDAsICAgICAvKiBkY2xfY29sb3IwLCB2MCAgICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDkwZTQwMDAwLCAgICAgLyogbW92IG9DMCwgdjAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIGNvbnN0IERXT1JEIGZvZ19jb2RlW10gPSB7CiAgICAgICAgMHhmZmZmMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzNfMCAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMGIsIDB4OTAwZjAwMDAsICAgICAvKiBkY2xfZm9nLCB2MCAgICAgICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDkwZTQwMDAwLCAgICAgLyogbW92IG9DMCwgdjAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIGNvbnN0IERXT1JEIGRlcHRoX2NvZGVbXSA9IHsKICAgICAgICAweGZmZmYwMzAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfM18wICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwYywgMHg5MDBmMDAwMCwgICAgIC8qIGRjbF9kZXB0aCwgdjAgICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMDEsIDB4ODAwZjA4MDAsIDB4OTBlNDAwMDAsICAgICAvKiBtb3Ygb0MwLCB2MCAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgY29uc3QgRFdPUkQgc3BlY3VsYXJfY29kZVtdID0gewogICAgICAgIDB4ZmZmZjAzMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18zXzAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDEwMDBhLCAweDkwMGYwMDAwLCAgICAgLyogZGNsX2NvbG9yMSwgdjAgICAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAwMSwgMHg4MDBmMDgwMCwgMHg5MGU0MDAwMCwgICAgIC8qIG1vdiBvQzAsIHYwICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICAvKiBzYW1wbGU6IGZhaWxzICovCgogICAgc3RydWN0IHZhcnlpbmdfdGVzdF9zdHJ1Y3QgdGVzdHNbXSA9IHsKICAgICAgIHtibGVuZHdlaWdodF9jb2RlLCAgICAgICBOVUxMLCAgICAgICAweDAwMDAwMDAwLCAgICAgMHgwMDE5MTkxOSwgICAgICJibGVuZHdlaWdodCIgICAsICAgRkFMU0UsICBUUlVFICB9LAogICAgICAge2JsZW5kaW5kaWNlc19jb2RlLCAgICAgIE5VTEwsICAgICAgIDB4MDAwMDAwMDAsICAgICAweDAwMDAwMDAwLCAgICAgImJsZW5kaW5kaWNlcyIgICwgICBGQUxTRSwgIEZBTFNFIH0sCiAgICAgICB7bm9ybWFsX2NvZGUsICAgICAgICAgICAgTlVMTCwgICAgICAgMHgwMDAwMDAwMCwgICAgIDB4MDA0YzRjNGMsICAgICAibm9ybWFsIiAgICAgICAgLCAgIEZBTFNFLCAgVFJVRSAgfSwKICAgICAgIC8qIFdoeSBkb2VzIGR4IG5vdCBmb3J3YXJkIHRoZSB0ZXhjb29yZD8gKi8KICAgICAgIHt0ZXhjb29yZDBfY29kZSwgICAgICAgICBOVUxMLCAgICAgICAweDAwMDAwMDAwLCAgICAgMHgwMDgwOGM4YywgICAgICJ0ZXhjb29yZDAiICAgICAsICAgRkFMU0UsICBGQUxTRSB9LAogICAgICAge3RhbmdlbnRfY29kZSwgICAgICAgICAgIE5VTEwsICAgICAgIDB4MDAwMDAwMDAsICAgICAweDAwOTk5OTk5LCAgICAgInRhbmdlbnQiICAgICAgICwgICBGQUxTRSwgIFRSVUUgIH0sCiAgICAgICB7Ymlub3JtYWxfY29kZSwgICAgICAgICAgTlVMTCwgICAgICAgMHgwMDAwMDAwMCwgICAgIDB4MDBiMmIyYjIsICAgICAiYmlub3JtYWwiICAgICAgLCAgIEZBTFNFLCAgVFJVRSAgfSwKICAgICAgIHtjb2xvcl9jb2RlLCAgICAgICAgICAgICBOVUxMLCAgICAgICAweDAwZTZlNmU2LCAgICAgMHgwMGU2ZTZlNiwgICAgICJjb2xvciIgICAgICAgICAsICAgRkFMU0UsICBGQUxTRSB9LAogICAgICAge2ZvZ19jb2RlLCAgICAgICAgICAgICAgIE5VTEwsICAgICAgIDB4MDAwMDAwMDAsICAgICAweDAwNjY2NjY2LCAgICAgImZvZyIgICAgICAgICAgICwgICBGQUxTRSwgIFRSVUUgIH0sCiAgICAgICB7ZGVwdGhfY29kZSwgICAgICAgICAgICAgTlVMTCwgICAgICAgMHgwMDAwMDAwMCwgICAgIDB4MDBjY2NjY2MsICAgICAiZGVwdGgiICAgICAgICAgLCAgIEZBTFNFLCAgVFJVRSAgfSwKICAgICAgIHtzcGVjdWxhcl9jb2RlLCAgICAgICAgICBOVUxMLCAgICAgICAweDAwNDQ4OGZmLCAgICAgMHgwMDQ0ODhmZiwgICAgICJzcGVjdWxhciIgICAgICAsICAgRkFMU0UsICBGQUxTRSB9CiAgICB9OwogICAgLyogRGVjbGFyZSBhIG1vbnN0ZXIgdmVydGV4IHR5cGUgOi0pICovCiAgICBzdGF0aWMgY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgZGVjbF9lbGVtZW50c1tdID0gewogICAgICAgIHswLCAgIDAsICBEM0RERUNMVFlQRV9GTE9BVDMsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfUE9TSVRJT04sICAgICAgIDB9LAogICAgICAgIHswLCAgMTYsICBEM0RERUNMVFlQRV9GTE9BVDQsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfQkxFTkRXRUlHSFQsICAgIDB9LAogICAgICAgIHswLCAgMzIsICBEM0RERUNMVFlQRV9GTE9BVDQsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfQkxFTkRJTkRJQ0VTLCAgIDB9LAogICAgICAgIHswLCAgNDgsICBEM0RERUNMVFlQRV9GTE9BVDQsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfTk9STUFMLCAgICAgICAgIDB9LAogICAgICAgIHswLCAgNjQsICBEM0RERUNMVFlQRV9GTE9BVDQsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfRk9HLCAgICAgICAgICAgIDB9LAogICAgICAgIHswLCAgODAsICBEM0RERUNMVFlQRV9GTE9BVDQsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfVEVYQ09PUkQsICAgICAgIDB9LAogICAgICAgIHswLCAgOTYsICBEM0RERUNMVFlQRV9GTE9BVDQsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfVEFOR0VOVCwgICAgICAgIDB9LAogICAgICAgIHswLCAxMTIsICBEM0RERUNMVFlQRV9GTE9BVDQsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfQklOT1JNQUwsICAgICAgIDB9LAogICAgICAgIHswLCAxMjgsICBEM0RERUNMVFlQRV9GTE9BVDQsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfREVQVEgsICAgICAgICAgIDB9LAogICAgICAgIHswLCAxNDQsICBEM0RERUNMVFlQRV9EM0RDT0xPUiwgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfQ09MT1IsICAgICAgICAgIDB9LAogICAgICAgIHswLCAxNDgsICBEM0RERUNMVFlQRV9EM0RDT0xPUiwgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfQ09MT1IsICAgICAgICAgIDF9LAogICAgICAgIEQzRERFQ0xfRU5EKCkKICAgIH07CiAgICBzdGF0aWMgY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgZGVjbF9lbGVtZW50czJbXSA9IHsKICAgICAgICB7MCwgICAwLCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1BPU0lUSU9OVCwgICAgICAwfSwKICAgICAgICB7MCwgIDE2LCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX0JMRU5EV0VJR0hULCAgICAwfSwKICAgICAgICB7MCwgIDMyLCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX0JMRU5ESU5ESUNFUywgICAwfSwKICAgICAgICB7MCwgIDQ4LCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX05PUk1BTCwgICAgICAgICAwfSwKICAgICAgICB7MCwgIDY0LCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX0ZPRywgICAgICAgICAgICAwfSwKICAgICAgICB7MCwgIDgwLCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1RFWENPT1JELCAgICAgICAwfSwKICAgICAgICB7MCwgIDk2LCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1RBTkdFTlQsICAgICAgICAwfSwKICAgICAgICB7MCwgMTEyLCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX0JJTk9STUFMLCAgICAgICAwfSwKICAgICAgICB7MCwgMTI4LCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX0RFUFRILCAgICAgICAgICAwfSwKICAgICAgICB7MCwgMTQ0LCAgRDNEREVDTFRZUEVfRDNEQ09MT1IsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX0NPTE9SLCAgICAgICAgICAwfSwKICAgICAgICB7MCwgMTQ4LCAgRDNEREVDTFRZUEVfRDNEQ09MT1IsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX0NPTE9SLCAgICAgICAgICAxfSwKICAgICAgICBEM0RERUNMX0VORCgpCiAgICB9OwogICAgc3RydWN0IGh1Z2VWZXJ0ZXggZGF0YVs0XSA9IHsKICAgICAgICB7CiAgICAgICAgICAgIC0xLjAsICAgLTEuMCwgICAwLjEsICAgIDEuMCwKICAgICAgICAgICAgIDAuMSwgICAgMC4xLCAgIDAuMSwgICAgMC4xLAogICAgICAgICAgICAgMC4yLCAgICAwLjIsICAgMC4yLCAgICAwLjIsCiAgICAgICAgICAgICAwLjMsICAgIDAuMywgICAwLjMsICAgIDAuMywKICAgICAgICAgICAgIDAuNCwgICAgMC40LCAgIDAuNCwgICAgMC40LAogICAgICAgICAgICAgMC41MCwgICAwLjU1LCAgMC41NSwgICAwLjU1LAogICAgICAgICAgICAgMC42LCAgICAwLjYsICAgMC42LCAgICAwLjcsCiAgICAgICAgICAgICAwLjcsICAgIDAuNywgICAwLjcsICAgIDAuNiwKICAgICAgICAgICAgIDAuOCwgICAgMC44LCAgIDAuOCwgICAgMC44LAogICAgICAgICAgICAgMHhlNmU2ZTZlNiwgLyogMC45ICogMjU2ICovCiAgICAgICAgICAgICAweDIyNDQ4OGZmICAvKiBOb3RoaW5nIHNwZWNpYWwgKi8KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIDEuMCwgICAtMS4wLCAgIDAuMSwgICAgMS4wLAogICAgICAgICAgICAgMC4xLCAgICAwLjEsICAgMC4xLCAgICAwLjEsCiAgICAgICAgICAgICAwLjIsICAgIDAuMiwgICAwLjIsICAgIDAuMiwKICAgICAgICAgICAgIDAuMywgICAgMC4zLCAgIDAuMywgICAgMC4zLAogICAgICAgICAgICAgMC40LCAgICAwLjQsICAgMC40LCAgICAwLjQsCiAgICAgICAgICAgICAwLjUwLCAgIDAuNTUsICAwLjU1LCAgIDAuNTUsCiAgICAgICAgICAgICAwLjYsICAgIDAuNiwgICAwLjYsICAgIDAuNywKICAgICAgICAgICAgIDAuNywgICAgMC43LCAgIDAuNywgICAgMC42LAogICAgICAgICAgICAgMC44LCAgICAwLjgsICAgMC44LCAgICAwLjgsCiAgICAgICAgICAgICAweGU2ZTZlNmU2LCAvKiAwLjkgKiAyNTYgKi8KICAgICAgICAgICAgIDB4MjI0NDg4ZmYgLyogTm90aGluZyBzcGVjaWFsICovCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIC0xLjAsICAgIDEuMCwgICAwLjEsICAgIDEuMCwKICAgICAgICAgICAgIDAuMSwgICAgMC4xLCAgIDAuMSwgICAgMC4xLAogICAgICAgICAgICAgMC4yLCAgICAwLjIsICAgMC4yLCAgICAwLjIsCiAgICAgICAgICAgICAwLjMsICAgIDAuMywgICAwLjMsICAgIDAuMywKICAgICAgICAgICAgIDAuNCwgICAgMC40LCAgIDAuNCwgICAgMC40LAogICAgICAgICAgICAgMC41MCwgICAwLjU1LCAgMC41NSwgICAwLjU1LAogICAgICAgICAgICAgMC42LCAgICAwLjYsICAgMC42LCAgICAwLjcsCiAgICAgICAgICAgICAwLjcsICAgIDAuNywgICAwLjcsICAgIDAuNiwKICAgICAgICAgICAgIDAuOCwgICAgMC44LCAgIDAuOCwgICAgMC44LAogICAgICAgICAgICAgMHhlNmU2ZTZlNiwgLyogMC45ICogMjU2ICovCiAgICAgICAgICAgICAweDIyNDQ4OGZmIC8qIE5vdGhpbmcgc3BlY2lhbCAqLwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAgMS4wLCAgICAxLjAsICAgMC4xLCAgICAxLjAsCiAgICAgICAgICAgICAwLjEsICAgIDAuMSwgICAwLjEsICAgIDAuMSwKICAgICAgICAgICAgIDAuMiwgICAgMC4yLCAgIDAuMiwgICAgMC4yLAogICAgICAgICAgICAgMC4zLCAgICAwLjMsICAgMC4zLCAgICAwLjMsCiAgICAgICAgICAgICAwLjQsICAgIDAuNCwgICAwLjQsICAgIDAuNCwKICAgICAgICAgICAgIDAuNTAsICAgMC41NSwgIDAuNTUsICAgMC41NSwKICAgICAgICAgICAgIDAuNiwgICAgMC42LCAgIDAuNiwgICAgMC43LAogICAgICAgICAgICAgMC43LCAgICAwLjcsICAgMC43LCAgICAwLjYsCiAgICAgICAgICAgICAwLjgsICAgIDAuOCwgICAwLjgsICAgIDAuOCwKICAgICAgICAgICAgIDB4ZTZlNmU2ZTYsIC8qIDAuOSAqIDI1NiAqLwogICAgICAgICAgICAgMHgyMjQ0ODhmZiAvKiBOb3RoaW5nIHNwZWNpYWwgKi8KICAgICAgICB9LAogICAgfTsKICAgIHN0cnVjdCBodWdlVmVydGV4IGRhdGEyWzRdOwogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpkZWNsOwogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpkZWNsMjsKICAgIEhSRVNVTFQgaHI7CiAgICB1bnNpZ25lZCBpbnQgaTsKICAgIERXT1JEIGNvbG9yLCByLCBnLCBiLCByX2UsIGdfZSwgYl9lOwoKICAgIG1lbWNweShkYXRhMiwgZGF0YSwgc2l6ZW9mKGRhdGEyKSk7CiAgICBkYXRhMlswXS5wb3NfeCA9IDA7ICAgICBkYXRhMlswXS5wb3NfeSA9IDA7CiAgICBkYXRhMlsxXS5wb3NfeCA9IDY0MDsgICBkYXRhMlsxXS5wb3NfeSA9IDA7CiAgICBkYXRhMlsyXS5wb3NfeCA9IDA7ICAgICBkYXRhMlsyXS5wb3NfeSA9IDQ4MDsKICAgIGRhdGEyWzNdLnBvc194ID0gNjQwOyAgIGRhdGEyWzNdLnBvc195ID0gNDgwOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHMsICZkZWNsKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzMiwgJmRlY2wyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKHRlc3RzKSAvIHNpemVvZih0ZXN0c1swXSk7IGkrKykKICAgIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoZGV2aWNlLCB0ZXN0c1tpXS5zaGFkZXJfY29kZSwgJnRlc3RzW2ldLnNoYWRlcik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlciBmYWlsZWQgZm9yIHNoYWRlciAlcywgaHIgPSAlc1xuIiwKICAgICAgICAgICB0ZXN0c1tpXS5uYW1lLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgfQoKICAgIGZvcihpID0gMDsgaSA8IHNpemVvZih0ZXN0cykgLyBzaXplb2YodGVzdHNbMF0pOyBpKyspCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmZmZmZmLCAwLjAsIDApOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCB0ZXN0c1tpXS5zaGFkZXIpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGlmKFNVQ0NFRURFRChocikpCiAgICAgICAgewogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgZGF0YSwgc2l6ZW9mKGRhdGFbMF0pKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgfQogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzNjAsIDI0MCk7CiAgICAgICAgciA9IGNvbG9yICYgMHgwMGZmMDAwMCA+PiAxNjsKICAgICAgICBnID0gY29sb3IgJiAweDAwMDBmZjAwID4+ICA4OwogICAgICAgIGIgPSBjb2xvciAmIDB4MDAwMDAwZmY7CiAgICAgICAgcl9lID0gdGVzdHNbaV0uY29sb3IgJiAweDAwZmYwMDAwID4+IDE2OwogICAgICAgIGdfZSA9IHRlc3RzW2ldLmNvbG9yICYgMHgwMDAwZmYwMCA+PiAgODsKICAgICAgICBiX2UgPSB0ZXN0c1tpXS5jb2xvciAmIDB4MDAwMDAwZmY7CgogICAgICAgIGlmKHRlc3RzW2ldLnRvZG8pIHsKICAgICAgICAgICAgdG9kb193aW5lIG9rKGFicyhyIC0gcl9lKSA8PSAxICYmIGFicyhnIC0gZ19lKSA8PSAxICYmIGFicyhiIC0gYl9lKSA8PSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3QgJXMgcmV0dXJuZWQgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweCUwOHgodG9kbylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0c1tpXS5uYW1lLCBjb2xvciwgdGVzdHNbaV0uY29sb3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9rKGFicyhyIC0gcl9lKSA8PSAxICYmIGFicyhnIC0gZ19lKSA8PSAxICYmIGFicyhiIC0gYl9lKSA8PSAxLAogICAgICAgICAgICAgICAiVGVzdCAlcyByZXR1cm5lZCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4JTA4eFxuIiwKICAgICAgICAgICAgICAgdGVzdHNbaV0ubmFtZSwgY29sb3IsIHRlc3RzW2ldLmNvbG9yKTsKICAgICAgICB9CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGVjbDIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGZvcihpID0gMDsgaSA8IHNpemVvZih0ZXN0cykgLyBzaXplb2YodGVzdHNbMF0pOyBpKyspCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmZmZmZmLCAwLjAsIDApOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCB0ZXN0c1tpXS5zaGFkZXIpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGlmKFNVQ0NFRURFRChocikpCiAgICAgICAgewogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgZGF0YTIsIHNpemVvZihkYXRhMlswXSkpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICB9CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDM2MCwgMjQwKTsKICAgICAgICByID0gY29sb3IgJiAweDAwZmYwMDAwID4+IDE2OwogICAgICAgIGcgPSBjb2xvciAmIDB4MDAwMGZmMDAgPj4gIDg7CiAgICAgICAgYiA9IGNvbG9yICYgMHgwMDAwMDBmZjsKICAgICAgICByX2UgPSB0ZXN0c1tpXS5jb2xvcl9yaHcgJiAweDAwZmYwMDAwID4+IDE2OwogICAgICAgIGdfZSA9IHRlc3RzW2ldLmNvbG9yX3JodyAmIDB4MDAwMGZmMDAgPj4gIDg7CiAgICAgICAgYl9lID0gdGVzdHNbaV0uY29sb3Jfcmh3ICYgMHgwMDAwMDBmZjsKCiAgICAgICAgaWYodGVzdHNbaV0udG9kb19yaHcpIHsKICAgICAgICAgICAgLyogVGhpcyBpc24ndCBhIHdlZWtlbmQncyBqb2IgdG8gZml4LCBpZ25vcmUgdGhlIHByb2JsZW0gZm9yIG5vdy4gTmVlZHMgYSByZXBsYWNlbWVudAogICAgICAgICAgICAgKiBwaXBlbGluZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdG9kb193aW5lIG9rKGFicyhyIC0gcl9lKSA8PSAxICYmIGFicyhnIC0gZ19lKSA8PSAxICYmIGFicyhiIC0gYl9lKSA8PSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3QgJXMgcmV0dXJuZWQgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweCUwOHgodG9kbylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0c1tpXS5uYW1lLCBjb2xvciwgdGVzdHNbaV0uY29sb3Jfcmh3KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvayhhYnMociAtIHJfZSkgPD0gMSAmJiBhYnMoZyAtIGdfZSkgPD0gMSAmJiBhYnMoYiAtIGJfZSkgPD0gMSwKICAgICAgICAgICAgICAgIlRlc3QgJXMgcmV0dXJuZWQgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweCUwOHhcbiIsCiAgICAgICAgICAgICAgIHRlc3RzW2ldLm5hbWUsIGNvbG9yLCB0ZXN0c1tpXS5jb2xvcl9yaHcpOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IoaSA9IDA7IGkgPCBzaXplb2YodGVzdHMpIC8gc2l6ZW9mKHRlc3RzWzBdKTsgaSsrKQogICAgewogICAgICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOV9SZWxlYXNlKHRlc3RzW2ldLnNoYWRlcik7CiAgICB9CgogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245X1JlbGVhc2UoZGVjbDIpOwogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245X1JlbGVhc2UoZGVjbCk7Cn0KCnN0YXRpYyB2b2lkIHZzaGFkZXJfdmVyc2lvbl92YXJ5aW5nX3Rlc3QoSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlKSB7CiAgICBzdGF0aWMgY29uc3QgRFdPUkQgcHNfY29kZVtdID0gewogICAgMHhmZmZmMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfM18wICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwNTAwMDAzMCwgMHhmMDBmMDAwMCwgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCwgLyogZGVmaSBpMCwgMywgMywgMSwgMCAgICAgICAgICAqLwogICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMwLCAwLjAsIDAuMCwgMC4wLCAwLjAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAxMDAwYSwgMHg5MDBmMDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX2NvbG9yMSB2MyAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwYiwgMHg5MDBmMDAwNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX2ZvZyB2NCAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAzMDAwNSwgMHg5MDBmMDAwNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX3RleGNvb3JkMyB2NSAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMywgMHg5MDBmMDAwNiwKICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMDYsIDB4OTAwZjAwMDcsCiAgICAweDAyMDAwMDFmLCAweDgwMDAwMDAxLCAweDkwMGYwMDA4LAogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwYywgMHg5MDBmMDAwOSwKCiAgICAweDAyMDAwMDAxLCAweDgwMGYwMDAwLCAweGEwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgcjAsIGMwICAgICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDFiLCAweGYwZTQwODAwLCAweGYwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIGFMLCBpMCAgICAgICAgICAgICAgICAgICovCiAgICAweDA0MDAwMDAyLCAweDgwMGYwMDAwLCAweDgwZTQwMDAwLCAweDkwZTQyMDAwLCAweGYwZTQwODAwLCAgICAgICAgICAgICAvKiBhZGQgcjAsIHIwLCB2MFthTF0gICAgICAgICAgICovCiAgICAweDAwMDAwMDFkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRsb29wICAgICAgICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDgwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3Ygb0MwLCByMCAgICAgICAgICAgICAgICAgICovCiAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgc3RhdGljIGNvbnN0IERXT1JEIHZzXzFfY29kZVtdID0gewogICAgMHhmZmZlMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfMV8xICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIHYwICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMCwgMHgzZGNjY2NjZCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMwLCAwLjEsIDAuMCwgMC4wLCAwLjAgICAqLwogICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMSwgMHgwMDAwMDAwMCwgMHgzZTRjY2NjZCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMxLCAwLjAsIDAuMiwgMC4wLCAwLjAgICAqLwogICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZWNjY2NjZCwgMHgwMDAwMDAwMCwgLyogZGVmIGMyLCAwLjAsIDAuMCwgMC40LCAwLjAgICAqLwogICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMywgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgLyogZGVmIGMzLCAxLjAsIDEuMCwgMS4wLCAxLjAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhkMDBmMDAwMCwgMHhhMGU0MDAwMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9EMCwgYzIgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhkMDBmMDAwMSwgMHhhMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9EMSwgYzAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhjMDBmMDAwMSwgMHhhMDU1MDAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9Gb2csIGMxLmcgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhlMDBmMDAwMCwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UMCwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhlMDBmMDAwMSwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UMSwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhlMDBmMDAwMiwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UMiwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhlMDBmMDAwMywgMHhhMGU0MDAwMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UMywgYzIgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhlMDBmMDAwNCwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UNCwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhlMDBmMDAwNSwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UNSwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhlMDBmMDAwNiwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UNiwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhlMDBmMDAwNywgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UNywgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwMDAwMSwgMHhjMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9Qb3MsIHYwICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwZmZmZgogICAgfTsKICAgIERXT1JEIHZzXzJfY29kZVtdID0gewogICAgMHhmZmZlMDIwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfMl8wICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIHYwICAgICAgICAgICAgICAqLwogICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMCwgMHgzZGNjY2NjZCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMwLCAwLjUsIDAuMCwgMC4wLCAwLjAgICAqLwogICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMSwgMHgwMDAwMDAwMCwgMHgzZTRjY2NjZCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMxLCAwLjAsIDAuNSwgMC4wLCAwLjAgICAqLwogICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZWNjY2NjZCwgMHgwMDAwMDAwMCwgLyogZGVmIGMyLCAwLjAsIDAuMCwgMC41LCAwLjAgICAqLwogICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMywgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgLyogZGVmIGMzLCAxLjAsIDEuMCwgMS4wLCAxLjAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhkMDBmMDAwMCwgMHhhMGU0MDAwMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9EMCwgYzIgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhkMDBmMDAwMSwgMHhhMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9EMSwgYzAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhjMDBmMDAwMSwgMHhhMDU1MDAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9Gb2csIGMxLmcgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhlMDBmMDAwMCwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UMCwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhlMDBmMDAwMSwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UMSwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhlMDBmMDAwMiwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UMiwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhlMDBmMDAwMywgMHhhMGU0MDAwMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UMywgYzIgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhlMDBmMDAwNCwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UNCwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhlMDBmMDAwNSwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UNSwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhlMDBmMDAwNiwgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UNiwgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhlMDBmMDAwNywgMHhhMGU0MDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9UNywgYzMgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHhjMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9Qb3MsIHYwICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIC8qIFRPRE86IERlZmluZSBub3JtYWwsIHRhbmdlbnQsIGJsZW5kd2VpZ2h0IGFuZCBkZXB0aCBoZXJlICovCiAgICBzdGF0aWMgY29uc3QgRFdPUkQgdnNfM19jb2RlW10gPSB7CiAgICAweGZmZmUwMzAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2c18zXzAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfcG9zaXRpb24gdjAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDFmLCAweDgwMDEwMDBhLCAweGUwMGYwMDA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfY29sb3IxIG85ICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDFmLCAweDgwMDAwMDBiLCAweGUwMGYwMDAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfZm9nIG8yICAgICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDFmLCAweDgwMDMwMDA1LCAweGUwMGYwMDA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfdGV4Y29vcmQzIG81ICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDFmLCAweDgwMDAwMDAwLCAweGUwMGYwMDBiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfcG9zaXRpb24gbzExICAgICAgICAgICAgICovCiAgICAweDA1MDAwMDUxLCAweGEwMGYwMDAwLCAweDNkY2NjY2NkLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAvKiBkZWYgYzAsIDAuMSwgMC4wLCAwLjAsIDAuMCAgICovCiAgICAweDA1MDAwMDUxLCAweGEwMGYwMDAxLCAweDAwMDAwMDAwLCAweDNlNGNjY2NkLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAvKiBkZWYgYzEsIDAuMCwgMC4yLCAwLjAsIDAuMCAgICovCiAgICAweDA1MDAwMDUxLCAweGEwMGYwMDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNlY2NjY2NkLCAweDAwMDAwMDAwLCAvKiBkZWYgYzIsIDAuMCwgMC4wLCAwLjQsIDAuMCAgICovCiAgICAweDA1MDAwMDUxLCAweGEwMGYwMDAzLCAweDNmODAwMDAwLCAweDNmODAwMDAwLCAweDNmODAwMDAwLCAweDNmODAwMDAwLCAvKiBkZWYgYzMsIDEuMCwgMS4wLCAxLjAsIDEuMCAgICovCiAgICAweDAyMDAwMDAxLCAweGUwMGYwMDA5LCAweGEwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgbzksIGMwICAgICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDAxLCAweGUwMGYwMDAyLCAweGEwZTQwMDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgbzIsIGMxICAgICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDAxLCAweGUwMGYwMDA1LCAweGEwZTQwMDAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgbzUsIGMyICAgICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDAxLCAweGUwMGYwMDBiLCAweDkwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgbzExLCB2MCAgICAgICAgICAgICAgICAgICovCiAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgZmxvYXQgcXVhZDFbXSA9ICB7CiAgICAgICAgLTEuMCwgICAtMS4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgIC0xLjAsICAgMC4xLAogICAgICAgIC0xLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMQogICAgfTsKICAgIGZsb2F0IHF1YWQyW10gPSAgewogICAgICAgICAwLjAsICAgLTEuMCwgICAwLjEsCiAgICAgICAgIDEuMCwgICAtMS4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgICAwLjAsICAgMC4xLAogICAgICAgICAxLjAsICAgIDAuMCwgICAwLjEKICAgIH07CiAgICBmbG9hdCBxdWFkM1tdID0gIHsKICAgICAgICAtMS4wLCAgICAwLjAsICAgMC4xLAogICAgICAgICAwLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgLTEuMCwgICAgMS4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgICAxLjAsICAgMC4xCiAgICB9OwoKICAgIEhSRVNVTFQgaHI7CiAgICBEV09SRCBjb2xvcjsKICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqcGl4ZWxzaGFkZXIgPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqdnNfMV9zaGFkZXIgPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqdnNfMl9zaGFkZXIgPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqdnNfM19zaGFkZXIgPSBOVUxMOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZjExMDAwMCwgMC4wLCAwKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoZGV2aWNlLCBwc19jb2RlLCAmcGl4ZWxzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlX0NyZWF0ZVBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlcihkZXZpY2UsIHZzXzFfY29kZSwgJnZzXzFfc2hhZGVyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlcihkZXZpY2UsIHZzXzJfY29kZSwgJnZzXzJfc2hhZGVyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlcihkZXZpY2UsIHZzXzNfY29kZSwgJnZzXzNfc2hhZGVyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgcGl4ZWxzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIHZzXzFfc2hhZGVyKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDEsIHNpemVvZihmbG9hdCkgKiAzKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgdnNfMl9zaGFkZXIpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCAgcXVhZDIsIHNpemVvZihmbG9hdCkgKiAzKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgdnNfM19zaGFkZXIpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMywgc2l6ZW9mKGZsb2F0KSAqIDMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMTIwKTsKICAgIG9rKChjb2xvciAmIDB4MDBmZjAwMDApID49IDB4MDAxOTAwMDAgJiYgKGNvbG9yICYgMHgwMGZmMDAwMCkgPD0gMHgwMDIxMDAwMCAmJgogICAgICAgKGNvbG9yICYgMHgwMDAwZmYwMCkgPj0gMHgwMDAwMzMwMCAmJiAoY29sb3IgJiAweDAwMDBmZjAwKSA8PSAweDAwMDAzNTAwICYmCiAgICAgICAoY29sb3IgJiAweDAwMDAwMGZmKSA+PSAweDAwMDAwMDY2ICYmIChjb2xvciAmIDB4MDAwMDAwZmYpIDw9IDB4MDAyMTAwNjgsCiAgICAgICAidnNfM18wIHJldHVybmVkIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDIwMzM2NlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOwogICAgb2soKGNvbG9yICYgMHgwMGZmMDAwMCkgPj0gMHgwMDNjMDAwMCAmJiAoY29sb3IgJiAweDAwZmYwMDAwKSA8PSAweDAwNGUwMDAwICYmCiAgICAgICAoY29sb3IgJiAweDAwMDBmZjAwKSA+PSAweDAwMDAwMDAwICYmIChjb2xvciAmIDB4MDAwMGZmMDApIDw9IDB4MDAwMDAwMDAgJiYKICAgICAgIChjb2xvciAmIDB4MDAwMDAwZmYpID49IDB4MDAwMDAwNjYgJiYgKGNvbG9yICYgMHgwMDAwMDBmZikgPD0gMHgwMDIxMDA2OCwKICAgICAgICJ2c18xXzEgcmV0dXJuZWQgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwODA4MDgwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDM2MCk7CiAgICBvaygoY29sb3IgJiAweDAwZmYwMDAwKSA+PSAweDAwM2MwMDAwICYmIChjb2xvciAmIDB4MDBmZjAwMDApIDw9IDB4MDA0ZTAwMDAgJiYKICAgICAgIChjb2xvciAmIDB4MDAwMGZmMDApID49IDB4MDAwMDAwMDAgJiYgKGNvbG9yICYgMHgwMDAwZmYwMCkgPD0gMHgwMDAwMDAwMCAmJgogICAgICAgKGNvbG9yICYgMHgwMDAwMDBmZikgPj0gMHgwMDAwMDA2NiAmJiAoY29sb3IgJiAweDAwMDAwMGZmKSA8PSAweDAwMjEwMDY4LAogICAgICAgInZzXzJfMCByZXR1cm5lZCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwMDBcbiIsIGNvbG9yKTsKCiAgICAvKiBjbGVhbnVwICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKHBpeGVsc2hhZGVyKSBJRGlyZWN0M0RQaXhlbFNoYWRlcjlfUmVsZWFzZShwaXhlbHNoYWRlcik7CiAgICBpZih2c18xX3NoYWRlcikgSURpcmVjdDNEVmVydGV4U2hhZGVyOV9SZWxlYXNlKHZzXzFfc2hhZGVyKTsKICAgIGlmKHZzXzJfc2hhZGVyKSBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5X1JlbGVhc2UodnNfMl9zaGFkZXIpOwogICAgaWYodnNfM19zaGFkZXIpIElEaXJlY3QzRFZlcnRleFNoYWRlcjlfUmVsZWFzZSh2c18zX3NoYWRlcik7Cn0KCnN0YXRpYyB2b2lkIHBzaGFkZXJfdmVyc2lvbl92YXJ5aW5nX3Rlc3QoSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlKSB7CiAgICBzdGF0aWMgY29uc3QgRFdPUkQgdnNfY29kZVtdID0gewogICAgMHhmZmZlMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfM18wICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIHYwICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHhlMDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIG8wICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwYSwgMHhlMDBmMDAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX2NvbG9yMCBvMSAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwNSwgMHhlMDBmMDAwMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX3RleGNvb3JkMCBvMiAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwYiwgMHhlMDBmMDAwMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX2ZvZyBvMyAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMywgMHhlMDBmMDAwNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX25vcm1hbCBvNCAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwYywgMHhlMDBmMDAwNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX2RlcHRoIG81ICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwNiwgMHhlMDBmMDAwNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX3RhbmdlbnQgbzYgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMSwgMHhlMDBmMDAwNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsX2JsZW5kd2VpZ2h0IG83ICAgICAgICAgICAqLwogICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMSwgMHgzZGNjY2NjZCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMxLCAwLjEsIDAuMCwgMC4wLCAwLjAgICAqLwogICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMiwgMHgwMDAwMDAwMCwgMHgzZTRjY2NjZCwgMHgwMDAwMDAwMCwgMHgzZjgwMDAwMCwgLyogZGVmIGMyLCAwLjAsIDAuMiwgMC4wLCAxLjAgICAqLwogICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMywgMHgzZWNjY2NjZCwgMHgzZjU5OTk5YSwgMHgzZjY2NjY2NiwgMHgwMDAwMDAwMCwgLyogZGVmIGMzLCAwLjQsIDAuODUsMC45LCAwLjAgICAqLwogICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgMHgzZjgwMDAwMCwgLyogZGVmIGMwLCAxLjAsIDEuMCwgMS4wLCAxLjAgICAqLwoKICAgIDB4MDIwMDAwMDEsIDB4ZTAwZjAwMDAsIDB4OTBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvMCwgdjAgICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDIwMDAwMDEsIDB4ZTAwZjAwMDEsIDB4YTBlNDAwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvMSwgYzEgICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDIwMDAwMDEsIDB4ZTAwZjAwMDIsIDB4YTBlNDAwMDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvMiwgYzIgICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDIwMDAwMDEsIDB4ZTAwZjAwMDMsIDB4YTBlNDAwMDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvMywgYzMgICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDIwMDAwMDEsIDB4ZTAwZjAwMDQsIDB4YTBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvNCwgYzAgICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDIwMDAwMDEsIDB4ZTAwZjAwMDUsIDB4YTBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvNSwgYzAgICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDIwMDAwMDEsIDB4ZTAwZjAwMDYsIDB4YTBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvNiwgYzAgICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDIwMDAwMDEsIDB4ZTAwZjAwMDcsIDB4YTBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvNywgYzAgICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBzdGF0aWMgY29uc3QgRFdPUkQgcHNfMV9jb2RlW10gPSB7CiAgICAweGZmZmYwMTA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18xXzQgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAweDAwMDAwMDUxLCAweGEwMGYwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAvKiBkZWYgYzAsIDAuMCwgMC4wLCAwLjAsIDAuMCAgICovCiAgICAweDAwMDAwMDQwLCAweDgwMDcwMDAxLCAweGIwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXhjcmQgcjEueHl6LCB0MCAgICAgICAgICAgICovCiAgICAweDAwMDAwMDAxLCAweDgwMDgwMDAxLCAweGEwZmYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgcjEuYSwgYzAuYSAgICAgICAgICAgICAgICovCiAgICAweDAwMDAwMDAyLCAweDgwMGYwMDAwLCAweDkwZTQwMDAwLCAweDgwZTQwMDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgcjAsIHYwLCByMSAgICAgICAgICAgICAgICovCiAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgc3RhdGljIGNvbnN0IERXT1JEIHBzXzJfY29kZVtdID0gewogICAgMHhmZmZmMDIwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfMl8wICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHhiMDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsIHQwICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsIHYwICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGNsIHYxICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgIDB4MDIwMDAwMDEsIDB4ODAwZjAwMDAsIDB4OTBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMCwgdjAgICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDMwMDAwMDIsIDB4ODAwZjAwMDAsIDB4ODBlNDAwMDAsMHhiMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCByMCwgcjAsIHQwICAgICAgICAgICAgICAgKi8KICAgIDB4MDIwMDAwMDEsIDB4ODAwZjA4MDAsIDB4ODBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvQzAsIHIwICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBzdGF0aWMgY29uc3QgRFdPUkQgcHNfM19jb2RlW10gPSB7CiAgICAweGZmZmYwMzAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18zXzAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDFmLCAweDgwMDAwMDA1LCAweDkwMGYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfdGV4Y29vcmQwIHYwICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDFmLCAweDgwMDAwMDBhLCAweDkwMGYwMDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfY29sb3IwIHYxICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDFmLCAweDgwMDAwMDBiLCAweDkwMGYwMDAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfZm9nIHYyICAgICAgICAgICAgICAgICAgICovCgogICAgMHgwMjAwMDAwMSwgMHg4MDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IHIwLCB2MCAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMzAwMDAwMiwgMHg4MDBmMDAwMCwgMHg4MGU0MDAwMCwgMHg5MGU0MDAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkIHIwLCByMCwgdjEgICAgICAgICAgICAgICAqLwogICAgMHgwMzAwMDAwMiwgMHg4MDBmMDAwMCwgMHg4MGU0MDAwMCwgMHg5MGU0MDAwMiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IHIwLCByMCwgdjIgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAwMSwgMHg4MDBmMDgwMCwgMHg4MGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IG9DMCwgcjAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKCiAgICBmbG9hdCBxdWFkMVtdID0gIHsKICAgICAgICAtMS4wLCAgIC0xLjAsICAgMC4xLAogICAgICAgICAwLjAsICAgLTEuMCwgICAwLjEsCiAgICAgICAgLTEuMCwgICAgMC4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgICAwLjAsICAgMC4xCiAgICB9OwogICAgZmxvYXQgcXVhZDJbXSA9ICB7CiAgICAgICAgIDAuMCwgICAtMS4wLCAgIDAuMSwKICAgICAgICAgMS4wLCAgIC0xLjAsICAgMC4xLAogICAgICAgICAwLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgIDEuMCwgICAgMC4wLCAgIDAuMQogICAgfTsKICAgIGZsb2F0IHF1YWQzW10gPSAgewogICAgICAgIC0xLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwKICAgICAgICAtMS4wLCAgICAxLjAsICAgMC4xLAogICAgICAgICAwLjAsICAgIDEuMCwgICAwLjEKICAgIH07CiAgICBmbG9hdCBxdWFkNFtdID0gIHsKICAgICAgICAgMC4wLCAgICAwLjAsICAgMC4xLAogICAgICAgICAxLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgIDAuMCwgICAgMS4wLCAgIDAuMSwKICAgICAgICAgMS4wLCAgICAxLjAsICAgMC4xCiAgICB9OwoKICAgIEhSRVNVTFQgaHI7CiAgICBEV09SRCBjb2xvcjsKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKnZlcnRleHNoYWRlciA9IE5VTEw7CiAgICBJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnBzXzFfc2hhZGVyID0gTlVMTDsKICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqcHNfMl9zaGFkZXIgPSBOVUxMOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpwc18zX3NoYWRlciA9IE5VTEw7CiAgICBJRGlyZWN0M0RUZXh0dXJlOSAqdGV4dHVyZSA9IE5VTEw7CiAgICBEM0RMT0NLRURfUkVDVCBscjsKICAgIHVuc2lnbmVkIGludCB4LCB5OwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmZmYwMCwgMC4wLCAwKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZShkZXZpY2UsIDUxMiwgIDUxMiwgMSwgMCwgRDNERk1UX0ExNkIxNkcxNlIxNiwgRDNEUE9PTF9NQU5BR0VELCAmdGV4dHVyZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVRleHR1cmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X0xvY2tSZWN0KHRleHR1cmUsIDAsICZsciwgTlVMTCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RUZXh0dXJlOV9Mb2NrUmVjdCByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGZvcih5ID0gMDsgeSA8IDUxMjsgeSsrKSB7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgNTEyOyB4KyspIHsKICAgICAgICAgICAgZG91YmxlIHJfZiA9IChkb3VibGUpIHggLyAoZG91YmxlKSA1MTI7CiAgICAgICAgICAgIGRvdWJsZSBnX2YgPSAoZG91YmxlKSB5IC8gKGRvdWJsZSkgNTEyOwogICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqZHN0ID0gKHVuc2lnbmVkIHNob3J0ICopICgoKHVuc2lnbmVkIGNoYXIgKikgbHIucEJpdHMpICsgeSAqIGxyLlBpdGNoICsgeCAqIDgpOwogICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCByID0gKHVuc2lnbmVkIHNob3J0KSAocl9mICogNjU1MzUuMCk7CiAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGcgPSAodW5zaWduZWQgc2hvcnQpIChnX2YgKiA2NTUzNS4wKTsKICAgICAgICAgICAgZHN0WzBdID0gcjsKICAgICAgICAgICAgZHN0WzFdID0gZzsKICAgICAgICAgICAgZHN0WzJdID0gMDsKICAgICAgICAgICAgZHN0WzNdID0gNjU1MzU7CiAgICAgICAgfQogICAgfQogICAgaHIgPSBJRGlyZWN0M0RUZXh0dXJlOV9VbmxvY2tSZWN0KHRleHR1cmUsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVGV4dHVyZTlfVW5sb2NrUmVjdCByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyKGRldmljZSwgdnNfY29kZSwgJnZlcnRleHNoYWRlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlcihkZXZpY2UsIHBzXzFfY29kZSwgJnBzXzFfc2hhZGVyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoZGV2aWNlLCBwc18yX2NvZGUsICZwc18yX3NoYWRlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyKGRldmljZSwgcHNfM19jb2RlLCAmcHNfM19zaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIoZGV2aWNlLCB2ZXJ0ZXhzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVopOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHBzXzFfc2hhZGVyKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMSwgc2l6ZW9mKGZsb2F0KSAqIDMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHBzXzJfc2hhZGVyKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCAgcXVhZDIsIHNpemVvZihmbG9hdCkgKiAzKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBwc18zX3NoYWRlcik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDMsIHNpemVvZihmbG9hdCkgKiAzKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBOVUxMKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlKGRldmljZSwgMCwgKElEaXJlY3QzREJhc2VUZXh0dXJlOSAqKSB0ZXh0dXJlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMSwgRDNEVFNTX0NPTE9ST1AsIEQzRFRPUF9ESVNBQkxFKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAwLCBEM0RUU1NfQ09MT1JPUCwgRDNEVE9QX0FERCk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMCwgRDNEVFNTX0NPTE9SQVJHMSwgRDNEVEFfVEVYVFVSRSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMCwgRDNEVFNTX0NPTE9SQVJHMiwgRDNEVEFfRElGRlVTRSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQ0LCBzaXplb2YoZmxvYXQpICogMyk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAxMjApOwogICAgb2soKGNvbG9yICYgMHgwMGZmMDAwMCkgPj0gMHgwMDc5MDAwMCAmJiAoY29sb3IgJiAweDAwZmYwMDAwKSA8PSAweDAwODEwMDAwICYmCiAgICAgICAoY29sb3IgJiAweDAwMDBmZjAwKSA9PSAweDAwMDBmZjAwICYmCiAgICAgICAoY29sb3IgJiAweDAwMDAwMGZmKSA+PSAweDAwMDAwMGU0ICYmIChjb2xvciAmIDB4MDAwMDAwZmYpIDw9IDB4MDAwMDAwZTYsCiAgICAgICAicHNfM18wIHJldHVybmVkIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDgwZmZlNVxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOwogICAgb2soKGNvbG9yICYgMHgwMGZmMDAwMCkgPj0gMHgwMDE5MDAwMCAmJiAoY29sb3IgJiAweDAwZmYwMDAwKSA8PSAweDAwMjEwMDAwICYmCiAgICAgICAoY29sb3IgJiAweDAwMDBmZjAwKSA+PSAweDAwMDAzMzAwICYmIChjb2xvciAmIDB4MDAwMGZmMDApIDw9IDB4MDAwMDM0MDAgJiYKICAgICAgIChjb2xvciAmIDB4MDAwMDAwZmYpID09IDB4MDAwMDAwMDAsCiAgICAgICAicHNfMV80IHJldHVybmVkIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDIwMzMwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAzNjApOwogICAgb2soKGNvbG9yICYgMHgwMGZmMDAwMCkgPj0gMHgwMDE5MDAwMCAmJiAoY29sb3IgJiAweDAwZmYwMDAwKSA8PSAweDAwMjEwMDAwICYmCiAgICAgICAoY29sb3IgJiAweDAwMDBmZjAwKSA+PSAweDAwMDAzMjAwICYmIChjb2xvciAmIDB4MDAwMGZmMDApIDw9IDB4MDAwMDM0MDAgJiYKICAgICAgIChjb2xvciAmIDB4MDAwMDAwZmYpID09IDB4MDAwMDAwMDAsCiAgICAgICAicHNfMl8wIHJldHVybmVkIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDIwMzMwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAxNjApOwogICAgb2soKGNvbG9yICYgMHgwMGZmMDAwMCkgPj0gMHgwMDE5MDAwMCAmJiAoY29sb3IgJiAweDAwZmYwMDAwKSA8PSAweDAwMjEwMDAwICYmCiAgICAgICAoY29sb3IgJiAweDAwMDBmZjAwKSA+PSAweDAwMDAzMjAwICYmIChjb2xvciAmIDB4MDAwMGZmMDApIDw9IDB4MDAwMDM0MDAgJiYKICAgICAgIChjb2xvciAmIDB4MDAwMDAwZmYpID09IDB4MDAwMDAwMDAsCiAgICAgICAiZml4ZWQgZnVuY3Rpb24gZnJhZ21lbnQgcHJvY2Vzc2luZyByZXR1cm5lZCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAyMDMzMDBcbiIsIGNvbG9yKTsKCiAgICAvKiBjbGVhbnVwICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyKGRldmljZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZih2ZXJ0ZXhzaGFkZXIpIElEaXJlY3QzRFZlcnRleFNoYWRlcjlfUmVsZWFzZSh2ZXJ0ZXhzaGFkZXIpOwogICAgaWYocHNfMV9zaGFkZXIpIElEaXJlY3QzRFBpeGVsU2hhZGVyOV9SZWxlYXNlKHBzXzFfc2hhZGVyKTsKICAgIGlmKHBzXzJfc2hhZGVyKSBJRGlyZWN0M0RQaXhlbFNoYWRlcjlfUmVsZWFzZShwc18yX3NoYWRlcik7CiAgICBpZihwc18zX3NoYWRlcikgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2UocHNfM19zaGFkZXIpOwogICAgaWYodGV4dHVyZSkgSURpcmVjdDNEVGV4dHVyZTlfUmVsZWFzZSh0ZXh0dXJlKTsKfQoKdm9pZCB0ZXN0X2NvbXBhcmVfaW5zdHJ1Y3Rpb25zKElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgRFdPUkQgc2hhZGVyX3NnZV92ZWNfY29kZVtdID0gewogICAgICAgIDB4ZmZmZTAxMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2c18xXzEgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIHYwICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHhjMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgIC8qIG1vdiBvUG9zLCB2MCAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4ODAwZjAwMDAsIDB4YTBlNDAwMDAsICAgICAgICAgICAgICAgICAvKiBtb3YgcjAsIGMwICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDBkLCAweGQwMGYwMDAwLCAweDgwZTQwMDAwLCAweGEwZTQwMDAxLCAgICAgLyogc2dlIG9EMCwgcjAsIGMxICAgICAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIERXT1JEIHNoYWRlcl9zbHRfdmVjX2NvZGVbXSA9IHsKICAgICAgICAweGZmZmUwMTAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfMV8xICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgIC8qIGRjbF9wb3NpdGlvbiB2MCAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4YzAwZjAwMDAsIDB4OTBlNDAwMDAsICAgICAgICAgICAgICAgICAvKiBtb3Ygb1BvcywgdjAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweDgwMGYwMDAwLCAweGEwZTQwMDAwLCAgICAgICAgICAgICAgICAgLyogbW92IHIwLCBjMCAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwYywgMHhkMDBmMDAwMCwgMHg4MGU0MDAwMCwgMHhhMGU0MDAwMSwgICAgIC8qIHNsdCBvRDAsIHIwLCBjMSAgICAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBEV09SRCBzaGFkZXJfc2dlX3NjYWxhcl9jb2RlW10gPSB7CiAgICAgICAgMHhmZmZlMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzXzFfMSAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMWYsIDB4ODAwMDAwMDAsIDB4OTAwZjAwMDAsICAgICAgICAgICAgICAgICAvKiBkY2xfcG9zaXRpb24gdjAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweGMwMGYwMDAwLCAweDkwZTQwMDAwLCAgICAgICAgICAgICAgICAgLyogbW92IG9Qb3MsIHYwICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDBmMDAwMCwgMHhhMGU0MDAwMCwgICAgICAgICAgICAgICAgIC8qIG1vdiByMCwgYzAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMGQsIDB4ZDAwMTAwMDAsIDB4ODAwMDAwMDAsIDB4YTA1NTAwMDEsICAgICAvKiBzbHQgb0QwLnIsIHIwLnIsIGMxLmIgICAgKi8KICAgICAgICAweDAwMDAwMDBkLCAweGQwMDIwMDAwLCAweDgwNTUwMDAwLCAweGEwYWEwMDAxLCAgICAgLyogc2x0IG9EMC5nLCByMC5nLCBjMS5yICAgICovCiAgICAgICAgMHgwMDAwMDAwZCwgMHhkMDA0MDAwMCwgMHg4MGFhMDAwMCwgMHhhMDAwMDAwMSwgICAgIC8qIHNsdCBvRDAuYiwgcjAuYiwgYzEuZyAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBEV09SRCBzaGFkZXJfc2x0X3NjYWxhcl9jb2RlW10gPSB7CiAgICAgICAgMHhmZmZlMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzXzFfMSAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMWYsIDB4ODAwMDAwMDAsIDB4OTAwZjAwMDAsICAgICAgICAgICAgICAgICAvKiBkY2xfcG9zaXRpb24gdjAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweGMwMGYwMDAwLCAweDkwZTQwMDAwLCAgICAgICAgICAgICAgICAgLyogbW92IG9Qb3MsIHYwICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDBmMDAwMCwgMHhhMGU0MDAwMCwgICAgICAgICAgICAgICAgIC8qIG1vdiByMCwgYzAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMGMsIDB4ZDAwMTAwMDAsIDB4ODAwMDAwMDAsIDB4YTBhYTAwMDEsICAgICAvKiBzbHQgb0QwLnIsIHIwLnIsIGMxLmIgICAgKi8KICAgICAgICAweDAwMDAwMDBjLCAweGQwMDIwMDAwLCAweDgwNTUwMDAwLCAweGEwMDAwMDAxLCAgICAgLyogc2x0IG9EMC5nLCByMC5nLCBjMS5yICAgICovCiAgICAgICAgMHgwMDAwMDAwYywgMHhkMDA0MDAwMCwgMHg4MGFhMDAwMCwgMHhhMDU1MDAwMSwgICAgIC8qIHNsdCBvRDAuYiwgcjAuYiwgYzEuZyAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICpzaGFkZXJfc2dlX3ZlYzsKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKnNoYWRlcl9zbHRfdmVjOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqc2hhZGVyX3NnZV9zY2FsYXI7CiAgICBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICpzaGFkZXJfc2x0X3NjYWxhcjsKICAgIEhSRVNVTFQgaHIsIGNvbG9yOwogICAgZmxvYXQgcXVhZDFbXSA9ICB7CiAgICAgICAgLTEuMCwgICAtMS4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgIC0xLjAsICAgMC4xLAogICAgICAgIC0xLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMQogICAgfTsKICAgIGZsb2F0IHF1YWQyW10gPSAgewogICAgICAgICAwLjAsICAgLTEuMCwgICAwLjEsCiAgICAgICAgIDEuMCwgICAtMS4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgICAwLjAsICAgMC4xLAogICAgICAgICAxLjAsICAgIDAuMCwgICAwLjEKICAgIH07CiAgICBmbG9hdCBxdWFkM1tdID0gIHsKICAgICAgICAtMS4wLCAgICAwLjAsICAgMC4xLAogICAgICAgICAwLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgLTEuMCwgICAgMS4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgICAxLjAsICAgMC4xCiAgICB9OwogICAgZmxvYXQgcXVhZDRbXSA9ICB7CiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwKICAgICAgICAgMS4wLCAgICAwLjAsICAgMC4xLAogICAgICAgICAwLjAsICAgIDEuMCwgICAwLjEsCiAgICAgICAgIDEuMCwgICAgMS4wLCAgIDAuMQogICAgfTsKICAgIGNvbnN0IGZsb2F0IGNvbnN0MFs0XSA9IHswLjgsIDAuMiwgMC4yLCAwLjJ9OwogICAgY29uc3QgZmxvYXQgY29uc3QxWzRdID0gezAuMiwgMC44LCAwLjIsIDAuMn07CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmZmZmZmLCAwLjAsIDApOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBzaGFkZXJfc2dlX3ZlY19jb2RlLCAmc2hhZGVyX3NnZV92ZWMpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyKGRldmljZSwgc2hhZGVyX3NsdF92ZWNfY29kZSwgJnNoYWRlcl9zbHRfdmVjKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlcihkZXZpY2UsIHNoYWRlcl9zZ2Vfc2NhbGFyX2NvZGUsICZzaGFkZXJfc2dlX3NjYWxhcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBzaGFkZXJfc2x0X3NjYWxhcl9jb2RlLCAmc2hhZGVyX3NsdF9zY2FsYXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKGRldmljZSwgMCwgY29uc3QwLCAxKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlckNvbnN0YW50RihkZXZpY2UsIDEsIGNvbnN0MSwgMSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaKTsKICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X1NldEZWRiBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIHNoYWRlcl9zZ2VfdmVjKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDEsIHNpemVvZihmbG9hdCkgKiAzKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgc2hhZGVyX3NsdF92ZWMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCAgcXVhZDIsIHNpemVvZihmbG9hdCkgKiAzKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgc2hhZGVyX3NnZV9zY2FsYXIpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMywgc2l6ZW9mKGZsb2F0KSAqIDMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoZGV2aWNlLCAwLCBjb25zdDAsIDEpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgc2hhZGVyX3NsdF9zY2FsYXIpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkNCwgc2l6ZW9mKGZsb2F0KSAqIDMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfUHJlc2VudCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDM2MCk7CiAgICBvayhjb2xvciA9PSAweDAwRkYwMEZGLCAiQ29tcGFyZSB0ZXN0OiBRdWFkIDEoc2dlIHZlYykgcmV0dXJuZWQgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwRkYwMEZGXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDM2MCk7CiAgICBvayhjb2xvciA9PSAweDAwMDBGRjAwLCAiQ29tcGFyZSB0ZXN0OiBRdWFkIDIoc2x0IHZlYykgcmV0dXJuZWQgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDBGRjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICBvayhjb2xvciA9PSAweDAwRkZGRkZGLCAiQ29tcGFyZSB0ZXN0OiBRdWFkIDMoc2dlIHNjYWxhcikgcmV0dXJuZWQgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwRkZGRkZGXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDE2MCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAiQ29tcGFyZSB0ZXN0OiBRdWFkIDQoc2x0IHNjYWxhcikgcmV0dXJuZWQgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CgogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOV9SZWxlYXNlKHNoYWRlcl9zZ2VfdmVjKTsKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjlfUmVsZWFzZShzaGFkZXJfc2x0X3ZlYyk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyX3NnZV9zY2FsYXIpOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOV9SZWxlYXNlKHNoYWRlcl9zbHRfc2NhbGFyKTsKfQoKdm9pZCB0ZXN0X3ZzaGFkZXJfaW5wdXQoSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlKQp7CiAgICBEV09SRCBzd2FwcGVkX3NoYWRlcl9jb2RlXzNbXSA9IHsKICAgICAgICAweGZmZmUwMzAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfM18wICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDAwMDAwLCAweGUwMGYwMDAwLCAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIG8wICAgICAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDAwMDBhLCAweGUwMGYwMDAxLCAgICAgICAgICAgICAgICAgLyogZGNsX2NvbG9yIG8xICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIHYwICAgICAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDAwMDA1LCAweDkwMGYwMDAxLCAgICAgICAgICAgICAgICAgLyogZGNsX3RleGNvb3JkMCB2MSAgICAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDEwMDA1LCAweDkwMGYwMDAyLCAgICAgICAgICAgICAgICAgLyogZGNsX3RleGNvb3JkMSB2MiAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweGUwMGYwMDAwLCAweDkwZTQwMDAwLCAgICAgICAgICAgICAgICAgLyogbW92IG8wLCB2MCAgICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwMDAxLCAweDkwZTQwMDAxLCAgICAgICAgICAgICAgICAgLyogbW92IHIxLCB2MSAgICAgICAgICAgKi8KICAgICAgICAweDAzMDAwMDAyLCAweGUwMGYwMDAxLCAweDgwZTQwMDAxLCAweDkxZTQwMDAyLCAgICAgLyogc3ViIG8xLCByMSwgdjIgICAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBEV09SRCBzd2FwcGVkX3NoYWRlcl9jb2RlXzFbXSA9IHsKICAgICAgICAweGZmZmUwMTAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfMV8xICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIHYwICAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDAwMDA1LCAweDkwMGYwMDAxLCAgICAgICAgICAgICAgICAgLyogZGNsX3RleGNvb3JkMCB2MSAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDEwMDA1LCAweDkwMGYwMDAyLCAgICAgICAgICAgICAgICAgLyogZGNsX3RleGNvb3JkMSB2MiAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweGMwMGYwMDAwLCAweDkwZTQwMDAwLCAgICAgICAgICAgICAgICAgLyogbW92IG8wLCB2MCAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweDgwMGYwMDAxLCAweDkwZTQwMDAxLCAgICAgICAgICAgICAgICAgLyogbW92IHIxLCB2MSAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAyLCAweGQwMGYwMDAwLCAweDgwZTQwMDAxLCAweDkxZTQwMDAyLCAgICAgLyogc3ViIG8xLCByMSwgdjIgICAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBEV09SRCBzd2FwcGVkX3NoYWRlcl9jb2RlXzJbXSA9IHsKICAgICAgICAweGZmZmUwMjAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfMl8wICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIHYwICAgICAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDAwMDA1LCAweDkwMGYwMDAxLCAgICAgICAgICAgICAgICAgLyogZGNsX3RleGNvb3JkMCB2MSAgICAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDEwMDA1LCAweDkwMGYwMDAyLCAgICAgICAgICAgICAgICAgLyogZGNsX3RleGNvb3JkMSB2MiAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweGMwMGYwMDAwLCAweDkwZTQwMDAwLCAgICAgICAgICAgICAgICAgLyogbW92IG8wLCB2MCAgICAgICAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwMDAxLCAweDkwZTQwMDAxLCAgICAgICAgICAgICAgICAgLyogbW92IHIxLCB2MSAgICAgICAgICAgKi8KICAgICAgICAweDAzMDAwMDAyLCAweGQwMGYwMDAwLCAweDgwZTQwMDAxLCAweDkxZTQwMDAyLCAgICAgLyogc3ViIG8xLCByMSwgdjIgICAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBEV09SRCB0ZXhjb29yZF9jb2xvcl9zaGFkZXJfY29kZV8zW10gPSB7CiAgICAgICAgMHhmZmZlMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzXzNfMCAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHhlMDBmMDAwMCwgICAgICAgICAgICAgICAgIC8qIGRjbF9wb3NpdGlvbiBvMCAgICAgICovCiAgICAgICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwYSwgMHhlMDBmMDAwMSwgICAgICAgICAgICAgICAgIC8qIGRjbF9jb2xvciBvMSAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgIC8qIGRjbF9wb3NpdGlvbiB2MCAgICAgICovCiAgICAgICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwNSwgMHg5MDBmMDAwMSwgICAgICAgICAgICAgICAgIC8qIGRjbF90ZXhjb29yZCB2MSAgICAgICovCiAgICAgICAgMHgwMjAwMDAwMSwgMHhlMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgIC8qIG1vdiBvMCwgdjAgICAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAwMSwgMHhlMDBmMDAwMSwgMHg5MGU0MDAwMSwgICAgICAgICAgICAgICAgIC8qIG1vdiBvMSwgdjEgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgRFdPUkQgdGV4Y29vcmRfY29sb3Jfc2hhZGVyX2NvZGVfMltdID0gewogICAgICAgIDB4ZmZmZTAyMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2c18yXzAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMDAsIDB4OTAwZjAwMDAsICAgICAgICAgICAgICAgICAvKiBkY2xfcG9zaXRpb24gdjAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMDUsIDB4OTAwZjAwMDEsICAgICAgICAgICAgICAgICAvKiBkY2xfdGV4Y29vcmQgdjEgICAgICAqLwogICAgICAgIDB4MDIwMDAwMDEsIDB4YzAwZjAwMDAsIDB4OTBlNDAwMDAsICAgICAgICAgICAgICAgICAvKiBtb3Ygb1BvcywgdjAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMDEsIDB4ZDAwZjAwMDAsIDB4OTBlNDAwMDEsICAgICAgICAgICAgICAgICAvKiBtb3Ygb0QwLCB2MSAgICAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIERXT1JEIHRleGNvb3JkX2NvbG9yX3NoYWRlcl9jb2RlXzFbXSA9IHsKICAgICAgICAweGZmZmUwMTAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfMV8xICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uIHYwICAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDAwMDA1LCAweDkwMGYwMDAxLCAgICAgICAgICAgICAgICAgLyogZGNsX3RleGNvb3JkIHYxICAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweGMwMGYwMDAwLCAweDkwZTQwMDAwLCAgICAgICAgICAgICAgICAgLyogbW92IG9Qb3MsIHYwICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweGQwMGYwMDAwLCAweDkwZTQwMDAxLCAgICAgICAgICAgICAgICAgLyogbW92IG9EMCwgdjEgICAgICAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBEV09SRCBjb2xvcl9jb2xvcl9zaGFkZXJfY29kZV8zW10gPSB7CiAgICAgICAgMHhmZmZlMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzXzNfMCAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHhlMDBmMDAwMCwgICAgICAgICAgICAgICAgIC8qIGRjbF9wb3NpdGlvbiBvMCAgICAgICovCiAgICAgICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwYSwgMHhlMDBmMDAwMSwgICAgICAgICAgICAgICAgIC8qIGRjbF9jb2xvciBvMSAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgIC8qIGRjbF9wb3NpdGlvbiB2MCAgICAgICovCiAgICAgICAgMHgwMjAwMDAxZiwgMHg4MDAwMDAwYSwgMHg5MDBmMDAwMSwgICAgICAgICAgICAgICAgIC8qIGRjbF9jb2xvciB2MSAgICAgICAgICovCiAgICAgICAgMHgwMjAwMDAwMSwgMHhlMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgIC8qIG1vdiBvMCwgdjAgICAgICAgICAgICovCiAgICAgICAgMHgwMzAwMDAwNSwgMHhlMDBmMDAwMSwgMHhhMGU0MDAwMCwgMHg5MGU0MDAwMSwgICAgIC8qIG11bCBvMSwgYzAsIHYxICAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgRFdPUkQgY29sb3JfY29sb3Jfc2hhZGVyX2NvZGVfMltdID0gewogICAgICAgIDB4ZmZmZTAyMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2c18yXzAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMDAsIDB4OTAwZjAwMDAsICAgICAgICAgICAgICAgICAvKiBkY2xfcG9zaXRpb24gdjAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMGEsIDB4OTAwZjAwMDEsICAgICAgICAgICAgICAgICAvKiBkY2xfY29sb3IgdjEgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMDEsIDB4YzAwZjAwMDAsIDB4OTBlNDAwMDAsICAgICAgICAgICAgICAgICAvKiBtb3Ygb1BvcywgdjAgICAgICAgICAqLwogICAgICAgIDB4MDMwMDAwMDUsIDB4ZDAwZjAwMDAsIDB4YTBlNDAwMDAsIDB4OTBlNDAwMDEsICAgICAvKiBtdWwgb0QwLCBjMCwgdjEgICAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBEV09SRCBjb2xvcl9jb2xvcl9zaGFkZXJfY29kZV8xW10gPSB7CiAgICAgICAgMHhmZmZlMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzXzFfMSAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgICAgICAgICAgICAgICAgIC8qIGRjbF9wb3NpdGlvbiB2MCAgICAgICovCiAgICAgICAgMHgwMDAwMDAxZiwgMHg4MDAwMDAwYSwgMHg5MDBmMDAwMSwgICAgICAgICAgICAgICAgIC8qIGRjbF9jb2xvciB2MSAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHhjMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgICAgICAgICAgICAgIC8qIG1vdiBvUG9zLCB2MCAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwNSwgMHhkMDBmMDAwMCwgMHhhMGU0MDAwMCwgMHg5MGU0MDAwMSwgICAgIC8qIG11bCBvRDAsIGMwLCB2MSAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKnN3YXBwZWRfc2hhZGVyLCAqdGV4Y29vcmRfY29sb3Jfc2hhZGVyLCAqY29sb3JfY29sb3Jfc2hhZGVyOwogICAgSFJFU1VMVCBocjsKICAgIERXT1JEIGNvbG9yLCByLCBnLCBiOwogICAgZmxvYXQgcXVhZDFbXSA9ICB7CiAgICAgICAgLTEuMCwgICAtMS4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDEuMCwgICAgMC4wLCAgICAwLjAsICAgIC0xLjAsICAgMC41LCAgICAwLjAsCiAgICAgICAgIDAuMCwgICAtMS4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDEuMCwgICAgMC4wLCAgICAwLjAsICAgIC0xLjAsICAgMC41LCAgICAwLjAsCiAgICAgICAgLTEuMCwgICAgMC4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDEuMCwgICAgMC4wLCAgICAwLjAsICAgIC0xLjAsICAgMC41LCAgICAwLjAsCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDEuMCwgICAgMC4wLCAgICAwLjAsICAgIC0xLjAsICAgMC41LCAgICAwLjAsCiAgICB9OwogICAgZmxvYXQgcXVhZDJbXSA9ICB7CiAgICAgICAgIDAuMCwgICAtMS4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAwLjAsICAgICAwLjAsICAgMC4wLCAgICAwLjAsCiAgICAgICAgIDEuMCwgICAtMS4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAwLjAsICAgICAwLjAsICAgMC4wLCAgICAwLjAsCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAwLjAsICAgICAwLjAsICAgMC4wLCAgICAwLjAsCiAgICAgICAgIDEuMCwgICAgMC4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAwLjAsICAgICAwLjAsICAgMC4wLCAgICAwLjAsCiAgICB9OwogICAgZmxvYXQgcXVhZDNbXSA9ICB7CiAgICAgICAgLTEuMCwgICAgMC4wLCAgIDAuMSwgICAtMS4wLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAxLjAsICAgIC0xLjAsICAgMC4wLCAgICAwLjAsCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwgICAtMS4wLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAxLjAsICAgICAwLjAsICAgMC4wLCAgICAwLjAsCiAgICAgICAgLTEuMCwgICAgMS4wLCAgIDAuMSwgICAtMS4wLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAwLjAsICAgIC0xLjAsICAgMS4wLCAgICAwLjAsCiAgICAgICAgIDAuMCwgICAgMS4wLCAgIDAuMSwgICAtMS4wLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgIC0xLjAsICAgICAwLjAsICAgMC4wLCAgICAwLjAsCiAgICB9OwogICAgZmxvYXQgcXVhZDRbXSA9ICB7CiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDEuMCwgICAgMC4wLCAgICAwLjAsICAgIC0xLjAsICAgMC41LCAgICAwLjAsCiAgICAgICAgIDEuMCwgICAgMC4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDEuMCwgICAgMC4wLCAgICAwLjAsICAgIC0xLjAsICAgMC41LCAgICAwLjAsCiAgICAgICAgIDAuMCwgICAgMS4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDEuMCwgICAgMC4wLCAgICAwLjAsICAgIC0xLjAsICAgMC41LCAgICAwLjAsCiAgICAgICAgIDEuMCwgICAgMS4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDEuMCwgICAgMC4wLCAgICAwLjAsICAgIC0xLjAsICAgMC41LCAgICAwLjAsCiAgICB9OwogICAgc3RhdGljIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xfZWxlbWVudHNfdHdvdGV4Y3JkW10gPSB7CiAgICAgICAgezAsICAgMCwgIEQzRERFQ0xUWVBFX0ZMT0FUMywgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9QT1NJVElPTiwgICAgICAgMH0sCiAgICAgICAgezAsICAxMiwgIEQzRERFQ0xUWVBFX0ZMT0FUNCwgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9URVhDT09SRCwgICAgICAgMH0sCiAgICAgICAgezAsICAyOCwgIEQzRERFQ0xUWVBFX0ZMT0FUNCwgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9URVhDT09SRCwgICAgICAgMX0sCiAgICAgICAgRDNEREVDTF9FTkQoKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzX3R3b3RleGNyZF9yaWdodG9yZGVyW10gPSB7CiAgICAgICAgezAsICAgMCwgIEQzRERFQ0xUWVBFX0ZMT0FUMywgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9QT1NJVElPTiwgICAgICAgMH0sCiAgICAgICAgezAsICAxMiwgIEQzRERFQ0xUWVBFX0ZMT0FUNCwgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9URVhDT09SRCwgICAgICAgMX0sCiAgICAgICAgezAsICAyOCwgIEQzRERFQ0xUWVBFX0ZMT0FUNCwgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9URVhDT09SRCwgICAgICAgMH0sCiAgICAgICAgRDNEREVDTF9FTkQoKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzX29uZXRleGNyZFtdID0gewogICAgICAgIHswLCAgIDAsICBEM0RERUNMVFlQRV9GTE9BVDMsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfUE9TSVRJT04sICAgICAgIDB9LAogICAgICAgIHswLCAgMTIsICBEM0RERUNMVFlQRV9GTE9BVDQsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfVEVYQ09PUkQsICAgICAgIDB9LAogICAgICAgIEQzRERFQ0xfRU5EKCkKICAgIH07CiAgICBzdGF0aWMgY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgZGVjbF9lbGVtZW50c190d290ZXhjcmRfd3JvbmdpZHhbXSA9IHsKICAgICAgICB7MCwgICAwLCAgRDNEREVDTFRZUEVfRkxPQVQzLCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1BPU0lUSU9OLCAgICAgICAwfSwKICAgICAgICB7MCwgIDEyLCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1RFWENPT1JELCAgICAgICAxfSwKICAgICAgICB7MCwgIDI4LCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1RFWENPT1JELCAgICAgICAyfSwKICAgICAgICBEM0RERUNMX0VORCgpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xfZWxlbWVudHNfdGV4Y29vcmRfY29sb3JbXSA9IHsKICAgICAgICB7MCwgICAwLCAgRDNEREVDTFRZUEVfRkxPQVQzLCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1BPU0lUSU9OLCAgICAgICAwfSwKICAgICAgICB7MCwgIDEyLCAgRDNEREVDTFRZUEVfRDNEQ09MT1IsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1RFWENPT1JELCAgICAgICAwfSwKICAgICAgICBEM0RERUNMX0VORCgpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xfZWxlbWVudHNfY29sb3JfY29sb3JbXSA9IHsKICAgICAgICB7MCwgICAwLCAgRDNEREVDTFRZUEVfRkxPQVQzLCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1BPU0lUSU9OLCAgICAgICAwfSwKICAgICAgICB7MCwgIDEyLCAgRDNEREVDTFRZUEVfRDNEQ09MT1IsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX0NPTE9SLCAgICAgICAgICAwfSwKICAgICAgICBEM0RERUNMX0VORCgpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xfZWxlbWVudHNfY29sb3JfdWJ5dGVbXSA9IHsKICAgICAgICB7MCwgICAwLCAgRDNEREVDTFRZUEVfRkxPQVQzLCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1BPU0lUSU9OLCAgICAgICAwfSwKICAgICAgICB7MCwgIDEyLCAgRDNEREVDTFRZUEVfVUJZVEU0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX0NPTE9SLCAgICAgICAgICAwfSwKICAgICAgICBEM0RERUNMX0VORCgpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xfZWxlbWVudHNfY29sb3JfZmxvYXRbXSA9IHsKICAgICAgICB7MCwgICAwLCAgRDNEREVDTFRZUEVfRkxPQVQzLCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1BPU0lUSU9OLCAgICAgICAwfSwKICAgICAgICB7MCwgIDEyLCAgRDNEREVDTFRZUEVfRkxPQVQ0LCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX0NPTE9SLCAgICAgICAgICAwfSwKICAgICAgICBEM0RERUNMX0VORCgpCiAgICB9OwogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpkZWNsX3R3b3RleGNyZCwgKmRlY2xfb25ldGV4Y3JkLCAqZGVjbF90d290ZXhfd3JvbmdpZHgsICpkZWNsX3R3b3RleGNyZF9yaWdodG9yZGVyOwogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpkZWNsX3RleGNvb3JkX2NvbG9yLCAqZGVjbF9jb2xvcl9jb2xvciwgKmRlY2xfY29sb3JfdWJ5dGUsICpkZWNsX2NvbG9yX2Zsb2F0OwogICAgdW5zaWduZWQgaW50IGk7CiAgICBmbG9hdCBub3JtYWxpemVbNF0gPSB7MS4wIC8gMjU2LjAsIDEuMCAvIDI1Ni4wLCAxLjAgLyAyNTYuMCwgMS4wIC8gMjU2LjB9OwogICAgZmxvYXQgbm9fbm9ybWFsaXplWzRdID0gezEuMCwgMS4wLCAxLjAsIDEuMH07CgogICAgc3RydWN0IHZlcnRleCBxdWFkMV9jb2xvcltdID0gIHsKICAgICAgIHstMS4wLCAgIC0xLjAsICAgMC4xLCAgICAweDAwZmY4MDQwfSwKICAgICAgIHsgMC4wLCAgIC0xLjAsICAgMC4xLCAgICAweDAwZmY4MDQwfSwKICAgICAgIHstMS4wLCAgICAwLjAsICAgMC4xLCAgICAweDAwZmY4MDQwfSwKICAgICAgIHsgMC4wLCAgICAwLjAsICAgMC4xLCAgICAweDAwZmY4MDQwfQogICAgfTsKICAgIHN0cnVjdCB2ZXJ0ZXggcXVhZDJfY29sb3JbXSA9ICB7CiAgICAgICB7IDAuMCwgICAtMS4wLCAgIDAuMSwgICAgMHgwMGZmODA0MH0sCiAgICAgICB7IDEuMCwgICAtMS4wLCAgIDAuMSwgICAgMHgwMGZmODA0MH0sCiAgICAgICB7IDAuMCwgICAgMC4wLCAgIDAuMSwgICAgMHgwMGZmODA0MH0sCiAgICAgICB7IDEuMCwgICAgMC4wLCAgIDAuMSwgICAgMHgwMGZmODA0MH0KICAgIH07CiAgICBzdHJ1Y3QgdmVydGV4IHF1YWQzX2NvbG9yW10gPSAgewogICAgICAgey0xLjAsICAgIDAuMCwgICAwLjEsICAgIDB4MDBmZjgwNDB9LAogICAgICAgeyAwLjAsICAgIDAuMCwgICAwLjEsICAgIDB4MDBmZjgwNDB9LAogICAgICAgey0xLjAsICAgIDEuMCwgICAwLjEsICAgIDB4MDBmZjgwNDB9LAogICAgICAgeyAwLjAsICAgIDEuMCwgICAwLjEsICAgIDB4MDBmZjgwNDB9CiAgICB9OwogICAgZmxvYXQgcXVhZDRfY29sb3JbXSA9ICB7CiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwgICAgMS4wLCAgICAxLjAsICAgIDAuMCwgICAgMC4wLAogICAgICAgICAxLjAsICAgIDAuMCwgICAwLjEsICAgIDEuMCwgICAgMS4wLCAgICAwLjAsICAgIDEuMCwKICAgICAgICAgMC4wLCAgICAxLjAsICAgMC4xLCAgICAxLjAsICAgIDEuMCwgICAgMC4wLCAgICAwLjAsCiAgICAgICAgIDEuMCwgICAgMS4wLCAgIDAuMSwgICAgMS4wLCAgICAxLjAsICAgIDAuMCwgICAgMS4wLAogICAgfTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzX3R3b3RleGNyZCwgJmRlY2xfdHdvdGV4Y3JkKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzX29uZXRleGNyZCwgJmRlY2xfb25ldGV4Y3JkKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzX3R3b3RleGNyZF93cm9uZ2lkeCwgJmRlY2xfdHdvdGV4X3dyb25naWR4KTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzX3R3b3RleGNyZF9yaWdodG9yZGVyLCAmZGVjbF90d290ZXhjcmRfcmlnaHRvcmRlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleERlY2xhcmF0aW9uIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHNfdGV4Y29vcmRfY29sb3IsICZkZWNsX3RleGNvb3JkX2NvbG9yKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzX2NvbG9yX2NvbG9yLCAmZGVjbF9jb2xvcl9jb2xvcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleERlY2xhcmF0aW9uIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGVjbF9lbGVtZW50c19jb2xvcl91Ynl0ZSwgJmRlY2xfY29sb3JfdWJ5dGUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHNfY29sb3JfZmxvYXQsICZkZWNsX2NvbG9yX2Zsb2F0KTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgZm9yKGkgPSAxOyBpIDw9IDM7IGkrKykgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZmZmMDAwMCwgMC4wLCAwKTsKICAgICAgICBpZihpID09IDMpIHsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlcihkZXZpY2UsIHN3YXBwZWRfc2hhZGVyX2NvZGVfMywgJnN3YXBwZWRfc2hhZGVyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgfSBlbHNlIGlmKGkgPT0gMil7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBzd2FwcGVkX3NoYWRlcl9jb2RlXzIsICZzd2FwcGVkX3NoYWRlcik7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIH0gZWxzZSBpZihpID09IDEpIHsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlcihkZXZpY2UsIHN3YXBwZWRfc2hhZGVyX2NvZGVfMSwgJnN3YXBwZWRfc2hhZGVyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgfQoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBpZihTVUNDRUVERUQoaHIpKQogICAgICAgIHsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIHN3YXBwZWRfc2hhZGVyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX3R3b3RleGNyZCk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMSwgc2l6ZW9mKGZsb2F0KSAqIDExKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfb25ldGV4Y3JkKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQyLCBzaXplb2YoZmxvYXQpICogMTEpOwogICAgICAgICAgICBpZihpID09IDMgfHwgaSA9PSAyKSB7CiAgICAgICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgcmV0dXJuZWQgKCUwOHgpIGkgPSAlZFxuIiwgaHIsIGkpOwogICAgICAgICAgICB9IGVsc2UgaWYoaSA9PSAxKSB7CiAgICAgICAgICAgICAgICAvKiBTdWNjZWVkcyBvciBmYWlscywgZGVwZW5kaW5nIG9uIFNXIG9yIEhXIHZlcnRleCBwcm9jZXNzaW5nICovCiAgICAgICAgICAgICAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwgfHwgaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIHJldHVybmVkICglMDh4KSwgaSA9IDFcbiIsIGhyKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGVjbF90d290ZXhjcmRfcmlnaHRvcmRlcik7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkNCwgc2l6ZW9mKGZsb2F0KSAqIDExKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfdHdvdGV4X3dyb25naWR4KTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQzLCBzaXplb2YoZmxvYXQpICogMTEpOwogICAgICAgICAgICBpZihpID09IDMgfHwgaSA9PSAyKSB7CiAgICAgICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgcmV0dXJuZWQgKCUwOHgpIGkgPSAlZFxuIiwgaHIsIGkpOwogICAgICAgICAgICB9IGVsc2UgaWYoaSA9PSAxKSB7CiAgICAgICAgICAgICAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwgfHwgaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIHJldHVybmVkICglMDh4KSBpID0gMVxuIiwgaHIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICB9CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9QcmVzZW50IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICBpZihpID09IDMgfHwgaSA9PSAyKSB7CiAgICAgICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMzYwKTsKICAgICAgICAgICAgb2soY29sb3IgPT0gMHgwMEZGRkY4MCB8fCBjb2xvciA9PSAweDAwRkZGRjdmIHx8IGNvbG9yID09IDB4MDBGRkZGODEsCiAgICAgICAgICAgICAgICJJbnB1dCB0ZXN0OiBRdWFkIDEoMmNyZCkgcmV0dXJuZWQgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwRkZGRjgwXG4iLCBjb2xvcik7CgogICAgICAgICAgICAvKiBUaGUgbGFzdCB2YWx1ZSBvZiB0aGUgcmVhZCBidXQgdW5kZWZpbmVkIHN0cmVhbSBpcyB1c2VkICovCiAgICAgICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMzYwKTsKICAgICAgICAgICAgb2soY29sb3IgPT0gMHgwMEZGRkYwMCwgIklucHV0IHRlc3Q6IFF1YWQgMigxY3JkKSByZXR1cm5lZCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBGRkZGMDBcbiIsIGNvbG9yKTsKICAgICAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAxMjApOwogICAgICAgICAgICBvayhjb2xvciA9PSAweDAwRkYwMDgwIHx8IGNvbG9yID09IDB4MDBGRjAwN2YgfHwgY29sb3IgPT0gMHgwMEZGMDA4MSwKICAgICAgICAgICAgICAgIklucHV0IHRlc3Q6IFF1YWQgMygyY3JkLXdyb25naWR4KSByZXR1cm5lZCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBGRjAwODBcbiIsIGNvbG9yKTsKCiAgICAgICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMTYwKTsKICAgICAgICAgICAgb2soY29sb3IgPT0gMHgwMDAwMDAwMCwgIklucHV0IHRlc3Q6IFF1YWQgNCgyY3JkLXJpZ2h0b3JkZXIpIHJldHVybmVkIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDAwMFxuIiwgY29sb3IpOwogICAgICAgIH0gZWxzZSBpZihpID09IDEpIHsKICAgICAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOwogICAgICAgICAgICBvayhjb2xvciA9PSAweDAwRkZGRjgwIHx8IGNvbG9yID09IDB4MDBGRkZGN2YgfHwgY29sb3IgPT0gMHgwMEZGRkY4MSwKICAgICAgICAgICAgICAgIklucHV0IHRlc3Q6IFF1YWQgMSgyY3JkKSByZXR1cm5lZCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBGRkZGODBcbiIsIGNvbG9yKTsKICAgICAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAzNjApOwogICAgICAgICAgICAvKiBBY2NlcHQgdGhlIGNsZWFyIGNvbG9yIGFzIHdlbGwgaW4gdGhpcyBjYXNlLCBzaW5jZSBTVyBWUCByZXR1cm5zIGFuIGVycm9yICovCiAgICAgICAgICAgIG9rKGNvbG9yID09IDB4MDBGRkZGMDAgfHwgY29sb3IgPT0gMHgwMEZGMDAwMCwgIklucHV0IHRlc3Q6IFF1YWQgMigxY3JkKSByZXR1cm5lZCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBGRkZGMDBcbiIsIGNvbG9yKTsKICAgICAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAxMjApOwogICAgICAgICAgICBvayhjb2xvciA9PSAweDAwRkYwMDgwIHx8IGNvbG9yID09IDB4MDBGRjAwMDAgfHwgY29sb3IgPT0gMHgwMEZGMDA3ZiB8fCBjb2xvciA9PSAweDAwRkYwMDgxLAogICAgICAgICAgICAgICAiSW5wdXQgdGVzdDogUXVhZCAzKDJjcmQtd3JvbmdpZHgpIHJldHVybmVkIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMEZGMDA4MFxuIiwgY29sb3IpOwogICAgICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDE2MCk7CiAgICAgICAgICAgIG9rKGNvbG9yID09IDB4MDAwMDAwMDAsICJJbnB1dCB0ZXN0OiBRdWFkIDQoMmNyZC1yaWdodG9yZGVyKSByZXR1cm5lZCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwMDBcbiIsIGNvbG9yKTsKICAgICAgICB9CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZjgwODA4MCwgMC4wLCAwKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICAvKiBOb3cgZmluZCBvdXQgaWYgdGhlIHdob2xlIHN0cmVhbXMgYXJlIHJlLXJlYWQsIG9yIGp1c3QgdGhlIGxhc3QgYWN0aXZlIHZhbHVlIGZvciB0aGUKICAgICAgICAgKiB2ZXJ0aWNlcyBpcyB1c2VkLgogICAgICAgICAqLwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGlmKFNVQ0NFRURFRChocikpCiAgICAgICAgewogICAgICAgICAgICBmbG9hdCBxdWFkMV9tb2RpZmllZFtdID0gIHsKICAgICAgICAgICAgICAgIC0xLjAsICAgLTEuMCwgICAwLjEsICAgIDEuMCwgICAgMC4wLCAgICAxLjAsICAgIDAuMCwgICAtMS4wLCAgICAgMC4wLCAgIDAuMCwgICAgMC4wLAogICAgICAgICAgICAgICAgIDAuMCwgICAtMS4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsICAgIDEuMCwgICAgMC4wLCAgICAwLjAsICAgIC0xLjAsICAgMC4wLCAgICAwLjAsCiAgICAgICAgICAgICAgICAtMS4wLCAgICAwLjAsICAgMC4xLCAgICAxLjAsICAgIDAuMCwgICAgMS4wLCAgICAwLjAsICAgIDAuMCwgICAgIDAuMCwgIC0xLjAsICAgIDAuMCwKICAgICAgICAgICAgICAgICAwLjAsICAgIDAuMCwgICAwLjEsICAgIDEuMCwgICAgMC4wLCAgICAxLjAsICAgIDAuMCwgICAtMS4wLCAgICAtMS4wLCAgLTEuMCwgICAgMC4wLAogICAgICAgICAgICB9OwogICAgICAgICAgICBmbG9hdCBxdWFkMl9tb2RpZmllZFtdID0gIHsKICAgICAgICAgICAgICAgICAwLjAsICAgLTEuMCwgICAwLjEsICAgIDAuMCwgICAgMC4wLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAgMC4wLCAgIDAuMCwgICAgMC4wLAogICAgICAgICAgICAgICAgIDEuMCwgICAtMS4wLCAgIDAuMSwgICAgMC4wLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAwLjAsICAgICAwLjAsICAgMC4wLCAgICAwLjAsCiAgICAgICAgICAgICAgICAgMC4wLCAgICAwLjAsICAgMC4xLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAwLjAsICAgIDAuMCwgICAgIDAuMCwgICAwLjAsICAgIDAuMCwKICAgICAgICAgICAgICAgICAxLjAsICAgIDAuMCwgICAwLjEsICAgIDAuMCwgICAgMC4wLCAgICAwLjAsICAgIDAuMCwgICAgMC4wLCAgICAgMC4wLCAgIDAuMCwgICAgMC4wLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIHN3YXBwZWRfc2hhZGVyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX3R3b3RleGNyZCk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9QT0lOVExJU1QsIDMsIHF1YWQxX21vZGlmaWVkLCBzaXplb2YoZmxvYXQpICogMTEpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGVjbF9vbmV0ZXhjcmQpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDJfbW9kaWZpZWQsIHNpemVvZihmbG9hdCkgKiAxMSk7CiAgICAgICAgICAgIGlmKGkgPT0gMyB8fCBpID09IDIpIHsKICAgICAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCByZXR1cm5lZCAoJTA4eCkgaSA9ICVkXG4iLCBociwgaSk7CiAgICAgICAgICAgIH0gZWxzZSBpZihpID09IDEpIHsKICAgICAgICAgICAgICAgIC8qIFN1Y2NlZWRzIG9yIGZhaWxzLCBkZXBlbmRpbmcgb24gU1cgb3IgSFcgdmVydGV4IHByb2Nlc3NpbmcgKi8KICAgICAgICAgICAgICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCB8fCBociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgcmV0dXJuZWQgKCUwOHgpLCBpID0gMVxuIiwgaHIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICB9CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMzYwKTsKICAgICAgICAvKiB2c18xXzEgbWF5IGZhaWwsIGFjY2VwdCB0aGUgY2xlYXIgY29sb3IKICAgICAgICAgKgogICAgICAgICAqIE5PVEU6IFRoaXMgdGVzdCBmYWlscyBvbiB0aGUgcmVmZXJlbmNlIHJhc3Rlcml6ZXIuIEluIHRoZSByZWZyYXN0LCB0aGUgNCB2ZXJ0aWNlcyBoYXZlIGRpZmZlcmVudCBjb2xvcnMsCiAgICAgICAgICogaS5lLiwgdGhlIHdob2xlIG9sZCBzdHJlYW0gaXMgcmVhZCwgYW5kIG5vdCBqdXN0IHRoZSBsYXN0IHVzZWQgYXR0cmlidXRlLiBTb21lIGdhbWVzIHJlcXVpcmUgdGhhdCB0aGlzCiAgICAgICAgICogZG9lcyAqbm90KiBoYXBwZW4sIG90aGVyd2lzZSB0aGV5IGNhbiBjcmFzaCBiZWNhdXNlIG9mIGEgcmVhZCBmcm9tIGEgYmFkIHBvaW50ZXIsIHNvIGRvIG5vdCBhY2NlcHQgdGhlCiAgICAgICAgICogcmVmcmFzdCdzIHJlc3VsdC4KICAgICAgICAgKgogICAgICAgICAqIEEgdGVzdCBhcHAgZm9yIHRoaXMgYmVoYXZpb3IgaXMgSGFsZiBMaWZlIDIgRXBpc29kZSAyIGluIGR4bGV2ZWwgOTUsIGFuZCByZWxhdGVkIGdhbWVzKFBvcnRhbCwgVEYyKS4KICAgICAgICAgKi8KICAgICAgICBvayhjb2xvciA9PSAweDAwMDAwMEZGIHx8IGNvbG9yID09IDB4MDA4MDgwODAsCiAgICAgICAgICAgIklucHV0IHRlc3Q6IFF1YWQgMihkaWZmZXJlbnQgY29sb3JzKSByZXR1cm5lZCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwRkZcbiIsIGNvbG9yKTsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CgogICAgICAgIElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgTlVMTCk7CiAgICAgICAgSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIE5VTEwpOwoKICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5X1JlbGVhc2Uoc3dhcHBlZF9zaGFkZXIpOwogICAgfQoKICAgIGZvcihpID0gMTsgaSA8PSAzOyBpKyspIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmYwMDAwZmYsIDAuMCwgMCk7CiAgICAgICAgaWYoaSA9PSAzKSB7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCB0ZXhjb29yZF9jb2xvcl9zaGFkZXJfY29kZV8zLCAmdGV4Y29vcmRfY29sb3Jfc2hhZGVyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBjb2xvcl9jb2xvcl9zaGFkZXJfY29kZV8zLCAmY29sb3JfY29sb3Jfc2hhZGVyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgfSBlbHNlIGlmKGkgPT0gMil7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCB0ZXhjb29yZF9jb2xvcl9zaGFkZXJfY29kZV8yLCAmdGV4Y29vcmRfY29sb3Jfc2hhZGVyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBjb2xvcl9jb2xvcl9zaGFkZXJfY29kZV8yLCAmY29sb3JfY29sb3Jfc2hhZGVyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgfSBlbHNlIGlmKGkgPT0gMSkgewogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyKGRldmljZSwgdGV4Y29vcmRfY29sb3Jfc2hhZGVyX2NvZGVfMSwgJnRleGNvb3JkX2NvbG9yX3NoYWRlcik7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyKGRldmljZSwgY29sb3JfY29sb3Jfc2hhZGVyX2NvZGVfMSwgJmNvbG9yX2NvbG9yX3NoYWRlcik7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIH0KCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgICAgICB7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIoZGV2aWNlLCB0ZXhjb29yZF9jb2xvcl9zaGFkZXIpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGVjbF90ZXhjb29yZF9jb2xvcik7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMV9jb2xvciwgc2l6ZW9mKHF1YWQxX2NvbG9yWzBdKSk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgY29sb3JfY29sb3Jfc2hhZGVyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKGRldmljZSwgMCwgbm9ybWFsaXplLCAxKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfY29sb3JfdWJ5dGUpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDJfY29sb3IsIHNpemVvZihxdWFkMl9jb2xvclswXSkpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlckNvbnN0YW50RihkZXZpY2UsIDAsIG5vX25vcm1hbGl6ZSwgMSk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2NvbG9yX2NvbG9yKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQzX2NvbG9yLCBzaXplb2YocXVhZDNfY29sb3JbMF0pKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfY29sb3JfZmxvYXQpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDRfY29sb3IsIHNpemVvZihmbG9hdCkgKiA3KTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIH0KICAgICAgICBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIE5VTEwpOwogICAgICAgIElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBOVUxMKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMzYwKTsKICAgICAgICByID0gKGNvbG9yICYgMHgwMGZmMDAwMCkgPj4gMTY7CiAgICAgICAgZyA9IChjb2xvciAmIDB4MDAwMGZmMDApID4+ICA4OwogICAgICAgIGIgPSAoY29sb3IgJiAweDAwMDAwMGZmKSA+PiAgMDsKICAgICAgICBvayhyID49IDB4ZmUgJiYgciA8PSAweGZmICYmIGcgPj0gMHg3ZiAmJiBnIDw9IDB4ODEgJiYgYiA+PSAweDNmICYmIGIgPD0gMHg0MSwKICAgICAgICAgICAiSW5wdXQgdGVzdDogUXVhZCAxKGNvbG9yLXRleGNvb3JkKSByZXR1cm5lZCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZjgwNDBcbiIsIGNvbG9yKTsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDM2MCk7CiAgICAgICAgciA9IChjb2xvciAmIDB4MDBmZjAwMDApID4+IDE2OwogICAgICAgIGcgPSAoY29sb3IgJiAweDAwMDBmZjAwKSA+PiAgODsKICAgICAgICBiID0gKGNvbG9yICYgMHgwMDAwMDBmZikgPj4gIDA7CiAgICAgICAgb2sociA+PSAweDNmICYmIHIgPD0gMHg0MSAmJiBnID49IDB4N2YgJiYgZyA8PSAweDgxICYmIGIgPj0gMHhmZSAmJiBiIDw9IDB4ZmYsCiAgICAgICAgICAgIklucHV0IHRlc3Q6IFF1YWQgMihjb2xvci11Ynl0ZSkgcmV0dXJuZWQgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwNDA4MGZmXG4iLCBjb2xvcik7CiAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAxMjApOwogICAgICAgIHIgPSAoY29sb3IgJiAweDAwZmYwMDAwKSA+PiAxNjsKICAgICAgICBnID0gKGNvbG9yICYgMHgwMDAwZmYwMCkgPj4gIDg7CiAgICAgICAgYiA9IChjb2xvciAmIDB4MDAwMDAwZmYpID4+ICAwOwogICAgICAgIG9rKHIgPj0gMHhmZSAmJiByIDw9IDB4ZmYgJiYgZyA+PSAweDdmICYmIGcgPD0gMHg4MSAmJiBiID49IDB4M2YgJiYgYiA8PSAweDQxLAogICAgICAgICAgICJJbnB1dCB0ZXN0OiBRdWFkIDMoY29sb3ItY29sb3IpIHJldHVybmVkIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMGZmODA0MFxuIiwgY29sb3IpOwogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMTYwKTsKICAgICAgICByID0gKGNvbG9yICYgMHgwMGZmMDAwMCkgPj4gMTY7CiAgICAgICAgZyA9IChjb2xvciAmIDB4MDAwMGZmMDApID4+ICA4OwogICAgICAgIGIgPSAoY29sb3IgJiAweDAwMDAwMGZmKSA+PiAgMDsKICAgICAgICBvayhyID49IDB4ZmUgJiYgciA8PSAweGZmICYmIGcgPj0gMHhmZSAmJiBnIDw9IDB4ZmYgJiYgYiA8PSAweDAxLAogICAgICAgICAgICJJbnB1dCB0ZXN0OiBRdWFkIDQoY29sb3ItZmxvYXQpIHJldHVybmVkIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMEZGRkYwMFxuIiwgY29sb3IpOwoKICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5X1JlbGVhc2UodGV4Y29vcmRfY29sb3Jfc2hhZGVyKTsKICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5X1JlbGVhc2UoY29sb3JfY29sb3Jfc2hhZGVyKTsKICAgIH0KCiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkZWNsX3R3b3RleGNyZCk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkZWNsX29uZXRleGNyZCk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkZWNsX3R3b3RleF93cm9uZ2lkeCk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkZWNsX3R3b3RleGNyZF9yaWdodG9yZGVyKTsKCiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkZWNsX3RleGNvb3JkX2NvbG9yKTsKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOV9SZWxlYXNlKGRlY2xfY29sb3JfY29sb3IpOwogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245X1JlbGVhc2UoZGVjbF9jb2xvcl91Ynl0ZSk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkZWNsX2NvbG9yX2Zsb2F0KTsKfQoKc3RhdGljIHZvaWQgZm9nX3NyZ2J3cml0ZV90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgLyogRHJhdyBhIGJsYWNrIHF1YWQsIGhhbGYgZm9nZ2VkIHdpdGggd2hpdGUgZm9nIC0+IGdyZXkgY29sb3IuIEVuYWJsZSBzUkdCIHdyaXRpbmcuCiAgICAgKiBpZiBzUkdCIHdyaXRpbmcgaXMgYXBwbGllZCBiZWZvcmUgZm9nZ2luZywgdGhlIDAuMCB3aWxsIGJlIG11bHRpcGxpZWQgd2l0aCB+IDEyLjkyLCBzbyBzdGlsbAogICAgICogc3RheSAwLjAuIEFmdGVyIHRoYXQgdGhlIGZvZyBnaXZlcyAwLjUuIElmIHNSR0Igd3JpdGluZyBpcyBhcHBsaWVkIGFmdGVyIGZvZ2dpbmcsIHRoZQogICAgICogMC41IHdpbGwgcnVuIHRocm91Z2ggdGhlIGFsdGVybmF0aXZlIHBhdGgoMF41IF4gMC40MTY2NiAqIDEuMDU1IC0gMC4wNTUpLCByZXN1bHRpbmcgaW4gYXBwcm94LgogICAgICogMC43MwogICAgICoKICAgICAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgd2luZWQzZCBjb3VsZCBub3QgYXBwbHkgc1JHQiBjb3JyZWN0aW9uIHRvIGZpeGVkIGZ1bmN0aW9uIHJlbmRlcmluZywKICAgICAqIHNvIHVzZSBzaGFkZXJzIGZvciB0aGlzIHRhc2sKICAgICAqLwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpwc2hhZGVyOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqdnNoYWRlcjsKICAgIElEaXJlY3QzRDkgKmQzZDsKICAgIERXT1JEIHZzaGFkZXJfY29kZVtdID0gewogICAgICAgIDB4ZmZmZTAxMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzXzFfMSAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2xfcG9zaXRpb24gdjAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MSwgMHhhMDBmMDAwMCwgMHgzZjAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMwLCAwLjUsIDAuMCwgMC4wLCAwLjAgICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4YzAwZjAwMDAsIDB4OTBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvUG9zLCB2MCAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDAxLCAweGMwMGYwMDAxLCAweGEwMDAwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3Ygb0ZvZywgYzAueCAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIERXT1JEIHBzaGFkZXJfY29kZVtdID0gewogICAgICAgIDB4ZmZmZjAxMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzXzFfMSAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDUxLCAweGEwMGYwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAvKiBkZWYgYzAsIDAuMCwgMC4wLCAwLjAsIDAuMCAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHg4MDBmMDAwMCwgMHhhMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IHIwLCBjMCAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBjb25zdCBmbG9hdCBxdWFkW10gPSB7CiAgICAgICAtMS4wLCAgIC0xLjAsICAgIDAuMSwKICAgICAgICAxLjAsICAgLTEuMCwgICAgMC4xLAogICAgICAgLTEuMCwgICAgMS4wLCAgICAwLjEsCiAgICAgICAgMS4wLCAgICAxLjAsICAgIDAuMQogICAgfTsKICAgIEhSRVNVTFQgaHI7CiAgICBEV09SRCBjb2xvcjsKCiAgICBJRGlyZWN0M0REZXZpY2U5X0dldERpcmVjdDNEKGRldmljZSwgJmQzZCk7CiAgICBpZihJRGlyZWN0M0Q5X0NoZWNrRGV2aWNlRm9ybWF0KGQzZCwgMCwgRDNEREVWVFlQRV9IQUwsIEQzREZNVF9YOFI4RzhCOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVVNBR0VfUkVOREVSVEFSR0VUIHwgRDNEVVNBR0VfUVVFUllfU1JHQldSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSVFlQRV9TVVJGQUNFLCBEM0RGTVRfQThSOEc4QjgpICE9IEQzRF9PSykgewogICAgICAgIHNraXAoIk5vIFNSR0JXUklURUVOQUJMRSBzdXBwb3J0IG9uIEQzREZNVF9YOFI4RzhCOFxuIik7CiAgICAgICAgSURpcmVjdDNEOV9SZWxlYXNlKGQzZCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgSURpcmVjdDNEOV9SZWxlYXNlKGQzZCk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmZmZjAwLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19GT0dFTkFCTEUsIFRSVUUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1RBQkxFTU9ERSwgRDNERk9HX05PTkUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR1ZFUlRFWE1PREUsIEQzREZPR19MSU5FQVIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0ZPR0NPTE9SLCAweGZmZmZmZmZmKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19TUkdCV1JJVEVFTkFCTEUsIFRSVUUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4U2hhZGVyKGRldmljZSwgdnNoYWRlcl9jb2RlLCAmdnNoYWRlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlcihkZXZpY2UsIHBzaGFkZXJfY29kZSwgJnBzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0RlZGIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIHZzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBwc2hhZGVyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZCwgc2l6ZW9mKGZsb2F0KSAqIDMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBJRGlyZWN0M0RQaXhlbFNoYWRlcjlfUmVsZWFzZShwc2hhZGVyKTsKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjlfUmVsZWFzZSh2c2hhZGVyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19GT0dFTkFCTEUsIEZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19TUkdCV1JJVEVFTkFCTEUsIEZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfUHJlc2VudCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMzYwKTsKICAgIG9rKGNvbG9yID09IDB4MDA4MDgwODAgfHwgY29sb3IgPT0gMHgwMDdmN2Y3ZiB8fCBjb2xvciA9PSAweDAwODE4MTgxLAogICAgICAgIkZvZyB3aXRoIEQzRFJTX1NSR0JXUklURUVOQUJMRSByZXR1cm5lZCBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDA4MDgwODBcbiIsIGNvbG9yKTsKfQoKc3RhdGljIHZvaWQgYWxwaGFfdGVzdChJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UpCnsKICAgIEhSRVNVTFQgaHI7CiAgICBJRGlyZWN0M0RUZXh0dXJlOSAqb2Zmc2NyZWVuVGV4dHVyZTsKICAgIElEaXJlY3QzRFN1cmZhY2U5ICpiYWNrYnVmZmVyID0gTlVMTCwgKm9mZnNjcmVlbiA9IE5VTEw7CiAgICBEV09SRCBjb2xvciwgcmVkLCBncmVlbiwgYmx1ZTsKCiAgICBzdHJ1Y3QgdmVydGV4IHF1YWQxW10gPQogICAgewogICAgICAgIHstMS4wZiwgLTEuMGYsICAgMC4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMGZmMDB9LAogICAgICAgIHstMS4wZiwgIDAuMGYsICAgMC4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMGZmMDB9LAogICAgICAgIHsgMS4wZiwgLTEuMGYsICAgMC4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMGZmMDB9LAogICAgICAgIHsgMS4wZiwgIDAuMGYsICAgMC4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMGZmMDB9LAogICAgfTsKICAgIHN0cnVjdCB2ZXJ0ZXggcXVhZDJbXSA9CiAgICB7CiAgICAgICAgey0xLjBmLCAgMC4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjMDAwMDBmZn0sCiAgICAgICAgey0xLjBmLCAgMS4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjMDAwMDBmZn0sCiAgICAgICAgeyAxLjBmLCAgMC4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjMDAwMDBmZn0sCiAgICAgICAgeyAxLjBmLCAgMS4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjMDAwMDBmZn0sCiAgICB9OwogICAgc3RhdGljIGNvbnN0IGZsb2F0IGNvbXBvc2l0ZV9xdWFkW11bNV0gPSB7CiAgICAgICAgeyAwLjBmLCAtMS4wZiwgMC4xZiwgMC4wZiwgMS4wZn0sCiAgICAgICAgeyAwLjBmLCAgMS4wZiwgMC4xZiwgMC4wZiwgMC4wZn0sCiAgICAgICAgeyAxLjBmLCAtMS4wZiwgMC4xZiwgMS4wZiwgMS4wZn0sCiAgICAgICAgeyAxLjBmLCAgMS4wZiwgMC4xZiwgMS4wZiwgMC4wZn0sCiAgICB9OwoKICAgIC8qIENsZWFyIHRoZSByZW5kZXIgdGFyZ2V0IHdpdGggYWxwaGEgPSAwLjUgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHg4MGZmMDAwMCwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIkNsZWFyIGZhaWxlZCwgaHIgPSAlMDh4XG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVRleHR1cmUoZGV2aWNlLCAxMjgsIDEyOCwgMSwgRDNEVVNBR0VfUkVOREVSVEFSR0VULCBEM0RGTVRfQThSOEc4QjgsIEQzRFBPT0xfREVGQVVMVCwgJm9mZnNjcmVlblRleHR1cmUsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LIHx8IGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIkNyZWF0aW5nIHRoZSBvZmZzY3JlZW4gcmVuZGVyIHRhcmdldCBmYWlsZWQsIGhyID0gJSMwOHhcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0QmFja0J1ZmZlcihkZXZpY2UsIDAsIDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmYmFja2J1ZmZlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJDYW4ndCBnZXQgYmFjayBidWZmZXIsIGhyID0gJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighYmFja2J1ZmZlcikgewogICAgICAgIGdvdG8gb3V0OwogICAgfQoKICAgIGhyID0gSURpcmVjdDNEVGV4dHVyZTlfR2V0U3VyZmFjZUxldmVsKG9mZnNjcmVlblRleHR1cmUsIDAsICZvZmZzY3JlZW4pOwogICAgb2soaHIgPT0gRDNEX09LLCAiQ2FuJ3QgZ2V0IG9mZnNjcmVlbiBzdXJmYWNlLCBociA9ICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIW9mZnNjcmVlbikgewogICAgICAgIGdvdG8gb3V0OwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYoZGV2aWNlLCBEM0RGVkZfWFlaIHwgRDNERlZGX0RJRkZVU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgZmFpbGVkLCBociA9ICUjMDh4XG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMCwgRDNEVFNTX0NPTE9ST1AsIEQzRFRPUF9TRUxFQ1RBUkcxKTsKICAgIG9rKGhyID09IEQzRF9PSywgIlNldFRleHR1cmVTdGFnZVN0YXRlIGZhaWxlZCwgaHIgPSAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19DT0xPUkFSRzEsIEQzRFRBX1RFWFRVUkUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiU2V0VGV4dHVyZVN0YWdlU3RhdGUgZmFpbGVkLCBociA9ICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDAsIEQzRFNBTVBfTUlORklMVEVSLCBEM0RURVhGX1BPSU5UKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRTYW1wbGVyU3RhdGUgRDNEU0FNUF9NSU5GSUxURVIgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U2FtcGxlclN0YXRlKGRldmljZSwgMCwgRDNEU0FNUF9NQUdGSUxURVIsIEQzRFRFWEZfUE9JTlQpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFNhbXBsZXJTdGF0ZSBEM0RTQU1QX01BR0ZJTFRFUiBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0xJR0hUSU5HLCBGQUxTRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0FMUEhBQkxFTkRFTkFCTEUsIFRSVUUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSBmYWlsZWQsIGhyID0gJTA4eFxuIiwgaHIpOwogICAgaWYoSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSkgPT0gRDNEX09LKSB7CgogICAgICAgIC8qIERyYXcgdHdvIHF1YWRzLCBvbmUgd2l0aCBzcmMgYWxwaGEgYmxlbmRpbmcsIG9uZSB3aXRoIGRlc3QgYWxwaGEgYmxlbmRpbmcuIFRoZQogICAgICAgICAqIFNSQ0FMUEhBIC8gSU5WU1JDQUxQSEEgYmxlbmQgZG9lc24ndCBnaXZlIGFueSBzdXJwcmlzZXMuIENvbG9ycyBhcmUgYmxlbmRlZCBiYXNlZCBvbgogICAgICAgICAqIHRoZSBpbnB1dCBhbHBoYQogICAgICAgICAqCiAgICAgICAgICogVGhlIERFU1RBTFBIQSAvIElOVkRFU1RBTFBIQSBkbyBub3QgIndvcmsiIG9uIHRoZSByZWd1bGFyIGJ1ZmZlciBiZWNhdXNlIHRoZXJlIGlzIG5vIGFscGhhLgogICAgICAgICAqIFRoZXkgZ2l2ZSBlc3NlbnRpYWxseSBaRVJPIGFuZCBPTkUgYmxlbmQgZmFjdG9ycwogICAgICAgICAqLwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX1NSQ0JMRU5ELCBEM0RCTEVORF9TUkNBTFBIQSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSBmYWlsZWQsIGhyID0gJTA4eFxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0RFU1RCTEVORCwgRDNEQkxFTkRfSU5WU1JDQUxQSEEpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgZmFpbGVkLCBociA9ICUwOHhcbiIsIGhyKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDEsIHNpemVvZihxdWFkMVswXSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQsIGhyID0gJSMwOHhcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfU1JDQkxFTkQsIEQzREJMRU5EX0RFU1RBTFBIQSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSBmYWlsZWQsIGhyID0gJTA4eFxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0RFU1RCTEVORCwgRDNEQkxFTkRfSU5WREVTVEFMUEhBKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIGZhaWxlZCwgaHIgPSAlMDh4XG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQyLCBzaXplb2YocXVhZDJbMF0pKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkLCBociA9ICUjMDh4XG4iLCBocik7CgogICAgICAgIC8qIFN3aXRjaCB0byB0aGUgb2Zmc2NyZWVuIGJ1ZmZlciwgYW5kIHJlZG8gdGhlIHRlc3RpbmcuIFNSQ0FMUEhBIGFuZCBERVNUQUxQSEEuIFRoZSBvZmZzY3JlZW4gYnVmZmVyCiAgICAgICAgICogaGFzIGEgYWxwaGEgY2hhbm5lbCBvbiBpdHMgb3duLiBDbGVhciB0aGUgb2Zmc2NyZWVuIGJ1ZmZlciB3aXRoIGFscGhhID0gMC41IGFnYWluLCB0aGVuIGRyYXcgdGhlCiAgICAgICAgICogcXVhZHMgYWdhaW4uIFRoZSBTUkNBTFBIQS9JTlZTUkNBTFBIQSBkb2Vzbid0IGdpdmUgYW55IHN1cnByaXNlcywgYnV0IHRoZSBERVNUQUxQSEEvSU5WREVTVEFMUEhBCiAgICAgICAgICogYmxlbmRpbmcgd29ya3MgYXMgc3VwcG9zZWQgbm93IC0gYmxlbmQgZmFjdG9yIGlzIDAuNSBpbiBib3RoIGNhc2VzLCBub3QgMC43NSBhcyBmcm9tIHRoZSBpbnB1dAogICAgICAgICAqIHZlcnRpY2VzCiAgICAgICAgICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclRhcmdldChkZXZpY2UsIDAsIG9mZnNjcmVlbik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiQ2FuJ3QgZ2V0IGJhY2sgYnVmZmVyLCBociA9ICUwOHhcbiIsIGhyKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ODBmZjAwMDAsIDAuMCwgMCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiQ2xlYXIgZmFpbGVkLCBociA9ICUwOHhcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfU1JDQkxFTkQsIEQzREJMRU5EX1NSQ0FMUEhBKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIGZhaWxlZCwgaHIgPSAlMDh4XG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfREVTVEJMRU5ELCBEM0RCTEVORF9JTlZTUkNBTFBIQSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSBmYWlsZWQsIGhyID0gJTA4eFxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkMSwgc2l6ZW9mKHF1YWQxWzBdKSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCwgaHIgPSAlIzA4eFxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19TUkNCTEVORCwgRDNEQkxFTkRfREVTVEFMUEhBKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIGZhaWxlZCwgaHIgPSAlMDh4XG4iLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfREVTVEJMRU5ELCBEM0RCTEVORF9JTlZERVNUQUxQSEEpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgZmFpbGVkLCBociA9ICUwOHhcbiIsIGhyKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDIsIHNpemVvZihxdWFkMlswXSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQsIGhyID0gJSMwOHhcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclRhcmdldChkZXZpY2UsIDAsIGJhY2tidWZmZXIpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkNhbid0IGdldCBiYWNrIGJ1ZmZlciwgaHIgPSAlMDh4XG4iLCBocik7CgogICAgICAgIC8qIFJlbmRlciB0aGUgb2Zmc2NyZWVuIHRleHR1cmUgb250byB0aGUgZnJhbWUgYnVmZmVyIHRvIGJlIGFibGUgdG8gY29tcGFyZSBpdCByZWd1bGFybHkuCiAgICAgICAgICogRGlzYWJsZSBhbHBoYSBibGVuZGluZyBmb3IgdGhlIGZpbmFsIGNvbXBvc2l0aW9uCiAgICAgICAgICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfQUxQSEFCTEVOREVOQUJMRSwgRkFMU0UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgZmFpbGVkLCBociA9ICUwOHhcbiIsIGhyKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWiB8IEQzREZWRl9URVgxKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldEZWRiBmYWlsZWQsIGhyID0gJSMwOHhcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAwLCAoSURpcmVjdDNEQmFzZVRleHR1cmU5ICopIG9mZnNjcmVlblRleHR1cmUpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSBmYWlsZWQsIGhyID0gJTA4eFxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBjb21wb3NpdGVfcXVhZCwgc2l6ZW9mKGZsb2F0KSAqIDUpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQsIGhyID0gJSMwOHhcbiIsIGhyKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIE5VTEwpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSBmYWlsZWQsIGhyID0gJTA4eFxuIiwgaHIpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U3X0VuZFNjZW5lIGZhaWxlZCwgaHIgPSAlMDh4XG4iLCBocik7CiAgICB9CgogICAgSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOwogICAgcmVkID0gICAoY29sb3IgJiAweDAwZmYwMDAwKSA+PiAxNjsKICAgIGdyZWVuID0gKGNvbG9yICYgMHgwMDAwZmYwMCkgPj4gIDg7CiAgICBibHVlID0gIChjb2xvciAmIDB4MDAwMDAwZmYpOwogICAgb2socmVkID49IDB4YmUgJiYgcmVkIDw9IDB4YzAgJiYgZ3JlZW4gPj0gMHgzOSAmJiBncmVlbiA8PSAweDQxICYmIGJsdWUgPT0gMHgwMCwKICAgICAgICJTUkNBTFBIQSBvbiBmcmFtZSBidWZmZXIgcmV0dXJuZWQgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGJmNDAwMFxuIiwgY29sb3IpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMTIwKTsKICAgIHJlZCA9ICAgKGNvbG9yICYgMHgwMGZmMDAwMCkgPj4gMTY7CiAgICBncmVlbiA9IChjb2xvciAmIDB4MDAwMGZmMDApID4+ICA4OwogICAgYmx1ZSA9ICAoY29sb3IgJiAweDAwMDAwMGZmKTsKICAgIG9rKHJlZCA9PSAweDAwICYmIGdyZWVuID09IDB4MDAgJiYgYmx1ZSA+PSAweGZlICYmIGJsdWUgPD0gMHhmZiAsCiAgICAgICAiRFNUQUxQSEEgb24gZnJhbWUgYnVmZmVyIHJldHVybmVkIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDM2MCk7CiAgICByZWQgPSAgIChjb2xvciAmIDB4MDBmZjAwMDApID4+IDE2OwogICAgZ3JlZW4gPSAoY29sb3IgJiAweDAwMDBmZjAwKSA+PiAgODsKICAgIGJsdWUgPSAgKGNvbG9yICYgMHgwMDAwMDBmZik7CiAgICBvayhyZWQgPj0gMHhiZSAmJiByZWQgPD0gMHhjMCAmJiBncmVlbiA+PSAweDM5ICYmIGdyZWVuIDw9IDB4NDEgJiYgYmx1ZSA9PSAweDAwLAogICAgICAgIlNSQ0FMUEhBIG9uIHRleHR1cmUgcmV0dXJuZWQgY29sb3IgJTA4eCwgZXhwZWN0ZWQgYmFyXG4iLCBjb2xvcik7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAxMjApOwogICAgcmVkID0gICAoY29sb3IgJiAweDAwZmYwMDAwKSA+PiAxNjsKICAgIGdyZWVuID0gKGNvbG9yICYgMHgwMDAwZmYwMCkgPj4gIDg7CiAgICBibHVlID0gIChjb2xvciAmIDB4MDAwMDAwZmYpOwogICAgb2socmVkID49IDB4N2UgJiYgcmVkIDw9IDB4ODEgJiYgZ3JlZW4gPT0gMHgwMCAmJiBibHVlID49IDB4N2UgJiYgYmx1ZSA8PSAweDgxLAogICAgICAgIkRTVEFMUEhBIG9uIHRleHR1cmUgcmV0dXJuZWQgY29sb3IgJTA4eCwgZXhwZWN0ZWQgZm9vXG4iLCBjb2xvcik7CgogICAgb3V0OgogICAgLyogcmVzdG9yZSB0aGluZ3MgKi8KICAgIGlmKGJhY2tidWZmZXIpIHsKICAgICAgICBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwogICAgfQogICAgaWYob2Zmc2NyZWVuVGV4dHVyZSkgewogICAgICAgIElEaXJlY3QzRFRleHR1cmU5X1JlbGVhc2Uob2Zmc2NyZWVuVGV4dHVyZSk7CiAgICB9CiAgICBpZihvZmZzY3JlZW4pIHsKICAgICAgICBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKG9mZnNjcmVlbik7CiAgICB9Cn0KCnN0cnVjdCB2ZXJ0ZXhfc2hvcnRjb2xvciB7CiAgICBmbG9hdCB4LCB5LCB6OwogICAgdW5zaWduZWQgc2hvcnQgciwgZywgYiwgYTsKfTsKc3RydWN0IHZlcnRleF9mbG9hdGNvbG9yIHsKICAgIGZsb2F0IHgsIHksIHo7CiAgICBmbG9hdCByLCBnLCBiLCBhOwp9OwoKc3RhdGljIHZvaWQgZml4ZWRfZnVuY3Rpb25fZGVjbF90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgSFJFU1VMVCBocjsKICAgIEJPT0wgc19vaywgdWJfb2ssIGZfb2s7CiAgICBEV09SRCBjb2xvciwgc2l6ZSwgaTsKICAgIHZvaWQgKmRhdGE7CiAgICBzdGF0aWMgY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgZGVjbF9lbGVtZW50c19kM2Rjb2xvcltdID0gewogICAgICAgIHswLCAgIDAsICBEM0RERUNMVFlQRV9GTE9BVDMsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfUE9TSVRJT04sICAgICAgIDB9LAogICAgICAgIHswLCAgMTIsICBEM0RERUNMVFlQRV9EM0RDT0xPUiwgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfQ09MT1IsICAgICAgICAgIDB9LAogICAgICAgIEQzRERFQ0xfRU5EKCkKICAgIH07CiAgICBzdGF0aWMgY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgZGVjbF9lbGVtZW50c19kM2Rjb2xvcl8yc3RyZWFtc1tdID0gewogICAgICAgIHswLCAgIDAsICBEM0RERUNMVFlQRV9GTE9BVDMsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfUE9TSVRJT04sICAgICAgIDB9LAogICAgICAgIHsxLCAgIDAsICBEM0RERUNMVFlQRV9EM0RDT0xPUiwgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfQ09MT1IsICAgICAgICAgIDB9LAogICAgICAgIEQzRERFQ0xfRU5EKCkKICAgIH07CiAgICBzdGF0aWMgY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgZGVjbF9lbGVtZW50c191Ynl0ZTRuW10gPSB7CiAgICAgICAgezAsICAgMCwgIEQzRERFQ0xUWVBFX0ZMT0FUMywgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9QT1NJVElPTiwgICAgICAgMH0sCiAgICAgICAgezAsICAxMiwgIEQzRERFQ0xUWVBFX1VCWVRFNE4sICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9DT0xPUiwgICAgICAgICAgMH0sCiAgICAgICAgRDNEREVDTF9FTkQoKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzX3VieXRlNG5fMnN0cmVhbXNbXSA9IHsKICAgICAgICB7MCwgICAwLCAgRDNEREVDTFRZUEVfRkxPQVQzLCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1BPU0lUSU9OLCAgICAgICAwfSwKICAgICAgICB7MSwgICAwLCAgRDNEREVDTFRZUEVfVUJZVEU0TiwgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX0NPTE9SLCAgICAgICAgICAwfSwKICAgICAgICBEM0RERUNMX0VORCgpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xfZWxlbWVudHNfc2hvcnQ0W10gPSB7CiAgICAgICAgezAsICAgMCwgIEQzRERFQ0xUWVBFX0ZMT0FUMywgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9QT1NJVElPTiwgICAgICAgMH0sCiAgICAgICAgezAsICAxMiwgIEQzRERFQ0xUWVBFX1VTSE9SVDROLCBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9DT0xPUiwgICAgICAgICAgMH0sCiAgICAgICAgRDNEREVDTF9FTkQoKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzX2Zsb2F0W10gPSB7CiAgICAgICAgezAsICAgMCwgIEQzRERFQ0xUWVBFX0ZMT0FUMywgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9QT1NJVElPTiwgICAgICAgMH0sCiAgICAgICAgezAsICAxMiwgIEQzRERFQ0xUWVBFX0ZMT0FUNCwgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9DT0xPUiwgICAgICAgICAgMH0sCiAgICAgICAgRDNEREVDTF9FTkQoKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzX3Bvc2l0aW9udFtdID0gewogICAgICAgIHswLCAgIDAsICBEM0RERUNMVFlQRV9GTE9BVDQsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfUE9TSVRJT05ULCAgICAgIDB9LAogICAgICAgIHswLCAgMTYsICBEM0RERUNMVFlQRV9EM0RDT0xPUiwgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfQ09MT1IsICAgICAgICAgIDB9LAogICAgICAgIEQzRERFQ0xfRU5EKCkKICAgIH07CiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKmRjbF9mbG9hdCA9IE5VTEwsICpkY2xfc2hvcnQgPSBOVUxMLCAqZGNsX3VieXRlID0gTlVMTCwgKmRjbF9jb2xvciA9IE5VTEw7CiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKmRjbF9jb2xvcl8yID0gTlVMTCwgKmRjbF91Ynl0ZV8yID0gTlVMTCwgKmRjbF9wb3NpdGlvbnQ7CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICp2YiwgKnZiMjsKICAgIHN0cnVjdCB2ZXJ0ZXggcXVhZDFbXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEM0RDT0xPUiAqLwogICAgewogICAgICAgIHstMS4wZiwgLTEuMGYsICAgMC4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmZmZmMDB9LAogICAgICAgIHstMS4wZiwgIDAuMGYsICAgMC4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmZmZmMDB9LAogICAgICAgIHsgMC4wZiwgLTEuMGYsICAgMC4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmZmZmMDB9LAogICAgICAgIHsgMC4wZiwgIDAuMGYsICAgMC4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmZmZmMDB9LAogICAgfTsKICAgIHN0cnVjdCB2ZXJ0ZXggcXVhZDJbXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVQllURTROICovCiAgICB7CiAgICAgICAgey0xLjBmLCAgMC4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGZmZmYwMH0sCiAgICAgICAgey0xLjBmLCAgMS4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGZmZmYwMH0sCiAgICAgICAgeyAwLjBmLCAgMC4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGZmZmYwMH0sCiAgICAgICAgeyAwLjBmLCAgMS4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGZmZmYwMH0sCiAgICB9OwogICAgc3RydWN0IHZlcnRleF9zaG9ydGNvbG9yIHF1YWQzW10gPSAgICAgICAgICAgICAgICAgIC8qIHNob3J0ICovCiAgICB7CiAgICAgICAgeyAwLjBmLCAtMS4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4ZmZmZiwgMHhmZmZmfSwKICAgICAgICB7IDAuMGYsICAwLjBmLCAgIDAuMWYsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHhmZmZmLCAweGZmZmZ9LAogICAgICAgIHsgMS4wZiwgLTEuMGYsICAgMC4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweGZmZmYsIDB4ZmZmZn0sCiAgICAgICAgeyAxLjBmLCAgMC4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4ZmZmZiwgMHhmZmZmfSwKICAgIH07CiAgICBzdHJ1Y3QgdmVydGV4X2Zsb2F0Y29sb3IgcXVhZDRbXSA9CiAgICB7CiAgICAgICAgeyAwLjBmLCAgMC4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wLCAwLjAsIDAuMCwgMC4wfSwKICAgICAgICB7IDAuMGYsICAxLjBmLCAgIDAuMWYsICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAsIDAuMCwgMC4wLCAwLjB9LAogICAgICAgIHsgMS4wZiwgIDAuMGYsICAgMC4xZiwgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwgMC4wLCAwLjAsIDAuMH0sCiAgICAgICAgeyAxLjBmLCAgMS4wZiwgICAwLjFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wLCAwLjAsIDAuMCwgMC4wfSwKICAgIH07CiAgICBEV09SRCBjb2xvcnNbXSA9IHsKICAgICAgICAweDAwZmYwMDAwLCAgIDB4MDAwMGZmMDAsICAgICAweDAwMDAwMGZmLCAgIDB4MDBmZmZmZmYsCiAgICAgICAgMHgwMGZmMDAwMCwgICAweDAwMDBmZjAwLCAgICAgMHgwMDAwMDBmZiwgICAweDAwZmZmZmZmLAogICAgICAgIDB4MDBmZjAwMDAsICAgMHgwMDAwZmYwMCwgICAgIDB4MDAwMDAwZmYsICAgMHgwMGZmZmZmZiwKICAgICAgICAweDAwZmYwMDAwLCAgIDB4MDAwMGZmMDAsICAgICAweDAwMDAwMGZmLCAgIDB4MDBmZmZmZmYsCiAgICAgICAgMHgwMGZmMDAwMCwgICAweDAwMDBmZjAwLCAgICAgMHgwMDAwMDBmZiwgICAweDAwZmZmZmZmLAogICAgICAgIDB4MDBmZjAwMDAsICAgMHgwMDAwZmYwMCwgICAgIDB4MDAwMDAwZmYsICAgMHgwMGZmZmZmZiwKICAgICAgICAweDAwZmYwMDAwLCAgIDB4MDAwMGZmMDAsICAgICAweDAwMDAwMGZmLCAgIDB4MDBmZmZmZmYsCiAgICAgICAgMHgwMGZmMDAwMCwgICAweDAwMDBmZjAwLCAgICAgMHgwMDAwMDBmZiwgICAweDAwZmZmZmZmLAogICAgICAgIDB4MDBmZjAwMDAsICAgMHgwMDAwZmYwMCwgICAgIDB4MDAwMDAwZmYsICAgMHgwMGZmZmZmZiwKICAgICAgICAweDAwZmYwMDAwLCAgIDB4MDAwMGZmMDAsICAgICAweDAwMDAwMGZmLCAgIDB4MDBmZmZmZmYsCiAgICAgICAgMHgwMGZmMDAwMCwgICAweDAwMDBmZjAwLCAgICAgMHgwMDAwMDBmZiwgICAweDAwZmZmZmZmLAogICAgICAgIDB4MDBmZjAwMDAsICAgMHgwMDAwZmYwMCwgICAgIDB4MDAwMDAwZmYsICAgMHgwMGZmZmZmZiwKICAgICAgICAweDAwZmYwMDAwLCAgIDB4MDAwMGZmMDAsICAgICAweDAwMDAwMGZmLCAgIDB4MDBmZmZmZmYsCiAgICAgICAgMHgwMGZmMDAwMCwgICAweDAwMDBmZjAwLCAgICAgMHgwMDAwMDBmZiwgICAweDAwZmZmZmZmLAogICAgICAgIDB4MDBmZjAwMDAsICAgMHgwMDAwZmYwMCwgICAgIDB4MDAwMDAwZmYsICAgMHgwMGZmZmZmZiwKICAgICAgICAweDAwZmYwMDAwLCAgIDB4MDAwMGZmMDAsICAgICAweDAwMDAwMGZmLCAgIDB4MDBmZmZmZmYsCiAgICB9OwogICAgZmxvYXQgcXVhZHNbXSA9IHsKICAgICAgICAtMS4wLCAgIC0xLjAsICAgICAwLjEsCiAgICAgICAgLTEuMCwgICAgMC4wLCAgICAgMC4xLAogICAgICAgICAwLjAsICAgLTEuMCwgICAgIDAuMSwKICAgICAgICAgMC4wLCAgICAwLjAsICAgICAwLjEsCgogICAgICAgICAwLjAsICAgLTEuMCwgICAgIDAuMSwKICAgICAgICAgMC4wLCAgICAwLjAsICAgICAwLjEsCiAgICAgICAgIDEuMCwgICAtMS4wLCAgICAgMC4xLAogICAgICAgICAxLjAsICAgIDAuMCwgICAgIDAuMSwKCiAgICAgICAgIDAuMCwgICAgMC4wLCAgICAgMC4xLAogICAgICAgICAwLjAsICAgIDEuMCwgICAgIDAuMSwKICAgICAgICAgMS4wLCAgICAwLjAsICAgICAwLjEsCiAgICAgICAgIDEuMCwgICAgMS4wLCAgICAgMC4xLAoKICAgICAgICAtMS4wLCAgICAwLjAsICAgICAwLjEsCiAgICAgICAgLTEuMCwgICAgMS4wLCAgICAgMC4xLAogICAgICAgICAwLjAsICAgIDAuMCwgICAgIDAuMSwKICAgICAgICAgMC4wLCAgICAxLjAsICAgICAwLjEKICAgIH07CiAgICBzdHJ1Y3QgdHZlcnRleCBxdWFkX3RyYW5zZm9ybWVkW10gPSB7CiAgICAgICB7ICA5MCwgICAgMTEwLCAgICAgMC4xLCAgICAgIDIuMCwgICAgICAgIDB4MDBmZmZmMDB9LAogICAgICAgeyA1NzAsICAgIDExMCwgICAgIDAuMSwgICAgICAyLjAsICAgICAgICAweDAwZmZmZjAwfSwKICAgICAgIHsgIDkwLCAgICAzMDAsICAgICAwLjEsICAgICAgMi4wLCAgICAgICAgMHgwMGZmZmYwMH0sCiAgICAgICB7IDU3MCwgICAgMzAwLCAgICAgMC4xLCAgICAgIDIuMCwgICAgICAgIDB4MDBmZmZmMDB9CiAgICB9OwogICAgRDNEQ0FQUzkgY2FwczsKCiAgICBtZW1zZXQoJmNhcHMsIDAsIHNpemVvZihjYXBzKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0RGV2aWNlQ2FwcyhkZXZpY2UsICZjYXBzKTsKICAgIG9rKGhyID09IEQzRF9PSywgIkdldERldmljZUNhcHMgZmFpbGVkLCBociA9ICUwOHhcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9UQVJHRVQsIDB4ZmZmZmZmZmYsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJDbGVhciBmYWlsZWQsIGhyID0gJTA4eFxuIiwgaHIpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHNfZDNkY29sb3IsICZkY2xfY29sb3IpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkNyZWF0ZVZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHNfc2hvcnQ0LCAmZGNsX3Nob3J0KTsKICAgIG9rKFNVQ0NFRURFRChocikgfHwgaHIgPT0gRV9GQUlMLCAiQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGVjbF9lbGVtZW50c19mbG9hdCwgJmRjbF9mbG9hdCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaWYoY2Fwcy5EZWNsVHlwZXMgJiBEM0REVENBUFNfVUJZVEU0TikgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHNfdWJ5dGU0bl8yc3RyZWFtcywgJmRjbF91Ynl0ZV8yKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHNfdWJ5dGU0biwgJmRjbF91Ynl0ZSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkNyZWF0ZVZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIH0gZWxzZSB7CiAgICAgICAgdHJhY2UoIkQzRERUQ0FQU19VQllURTROIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIGRjbF91Ynl0ZV8yID0gTlVMTDsKICAgICAgICBkY2xfdWJ5dGUgPSBOVUxMOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGVjbF9lbGVtZW50c19kM2Rjb2xvcl8yc3RyZWFtcywgJmRjbF9jb2xvcl8yKTsKICAgIG9rKFNVQ0NFRURFRChociksICJDcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzX3Bvc2l0aW9udCwgJmRjbF9wb3NpdGlvbnQpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkNyZWF0ZVZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICBzaXplID0gbWF4KHNpemVvZihxdWFkMSksIG1heChzaXplb2YocXVhZDIpLCBtYXgoc2l6ZW9mKHF1YWQzKSwgbWF4KHNpemVvZihxdWFkNCksIHNpemVvZihxdWFkcykpKSkpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleEJ1ZmZlcihkZXZpY2UsIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEQzRFBPT0xfTUFOQUdFRCwgJnZiLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIkNyZWF0ZVZlcnRleEJ1ZmZlciBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGZfb2sgPSBGQUxTRTsgc19vayA9IEZBTFNFOyB1Yl9vayA9IEZBTFNFOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgewogICAgICAgIGlmKGRjbF9jb2xvcikgewogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkY2xfY29sb3IpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQxLCBzaXplb2YocXVhZDFbMF0pKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCwgaHIgPSAlIzA4eFxuIiwgaHIpOwogICAgICAgIH0KCiAgICAgICAgLyogVGVzdHMgd2l0aCBub24tc3RhbmRhcmQgZml4ZWQgZnVuY3Rpb24gdHlwZXMgZmFpbCBvbiB0aGUgcmVmcmFzdC4gVGhlIEFUSSBkcml2ZXIgcGFydGlhbGx5CiAgICAgICAgICogYWNjZXB0cyB0aGVtLCB0aGUgbnZpZGlhIGRyaXZlciBhY2NlcHRzIHRoZW0gYWxsLiBBbGwgdGhvc2UgZGlmZmVyZW5jZXMgZXZlbiB0aG91Z2ggd2UncmUKICAgICAgICAgKiB1c2luZyBzb2Z0d2FyZSB2ZXJ0ZXggcHJvY2Vzc2luZy4gRG9oIQogICAgICAgICAqLwogICAgICAgIGlmKGRjbF91Ynl0ZSkgewogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkY2xfdWJ5dGUpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQyLCBzaXplb2YocXVhZDJbMF0pKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LIHx8IGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQsIGhyID0gJSMwOHhcbiIsIGhyKTsKICAgICAgICAgICAgdWJfb2sgPSBTVUNDRUVERUQoaHIpOwogICAgICAgIH0KCiAgICAgICAgaWYoZGNsX3Nob3J0KSB7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRjbF9zaG9ydCk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24gZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZDMsIHNpemVvZihxdWFkM1swXSkpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0sgfHwgaHIgPT0gRDNERVJSX0lOVkFMSURDQUxMLCAiRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCwgaHIgPSAlIzA4eFxuIiwgaHIpOwogICAgICAgICAgICBzX29rID0gU1VDQ0VFREVEKGhyKTsKICAgICAgICB9CgogICAgICAgIGlmKGRjbF9mbG9hdCkgewogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkY2xfZmxvYXQpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQ0LCBzaXplb2YocXVhZDRbMF0pKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LIHx8IGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQsIGhyID0gJSMwOHhcbiIsIGhyKTsKICAgICAgICAgICAgZl9vayA9IFNVQ0NFRURFRChocik7CiAgICAgICAgfQoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIGZhaWxlZCwgaHIgPSAlIzA4eFxuIiwgaHIpOwogICAgfQoKICAgIElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgaWYoZGNsX3Nob3J0KSB7CiAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAzNjApOwogICAgICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYgfHwgIXNfb2ssCiAgICAgICAgICAgIkQzRERFQ0xUWVBFX1VTSE9SVDROIHJldHVybmVkIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgIH0KICAgIGlmKGRjbF91Ynl0ZSkgewogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMTIwKTsKICAgICAgICBvayhjb2xvciA9PSAweDAwMDBmZmZmIHx8ICF1Yl9vaywKICAgICAgICAgICAiRDNEREVDTFRZUEVfVUJZVEU0TiByZXR1cm5lZCBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDBmZmZmXG4iLCBjb2xvcik7CiAgICB9CiAgICBpZihkY2xfY29sb3IpIHsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDM2MCk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMGZmZmYwMCwKICAgICAgICAgICAiRDNEREVDTFRZUEVfRDNEQ09MT1IgcmV0dXJuZWQgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmZmYwMFxuIiwgY29sb3IpOwogICAgfQogICAgaWYoZGNsX2Zsb2F0KSB7CiAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAxMjApOwogICAgICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAgfHwgIWZfb2ssCiAgICAgICAgICAgIkQzRERFQ0xUWVBFX0ZMT0FUNCByZXR1cm5lZCBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmYwMDAwXG4iLCBjb2xvcik7CiAgICB9CgogICAgLyogVGhlIGZvbGxvd2luZyB0ZXN0IHdpdGggdmVydGV4IGJ1ZmZlcnMgZG9lc24ndCBzZXJ2ZSB0byBmaW5kIG91dCBuZXcgaW5mb3JtYXRpb24gZnJvbSB3aW5kb3dzLgogICAgICogSXQgaXMgYSBwbGFpbiByZWdyZXNzaW9uIHRlc3QgYmVjYXVzZSB3aW5lZDNkIHVzZXMgZGlmZmVyZW50IGNvZGVwYXRocyBmb3IgYXR0cmlidXRlIGNvbnZlcnNpb24KICAgICAqIHdpdGggdmVydGV4IGJ1ZmZlcnMuIEl0IG1ha2VzIHN1cmUgdGhhdCB0aGUgdmVydGV4IGJ1ZmZlciBvbmUgd29ya3MsIHdoaWxlIHRoZSBhYm92ZSB0ZXN0cwogICAgICogd2hldGhlciB0aGUgaW1tZWRpYXRlIG1vZGUgY29kZSB3b3JrcwogICAgICovCiAgICBmX29rID0gRkFMU0U7IHNfb2sgPSBGQUxTRTsgdWJfb2sgPSBGQUxTRTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgewogICAgICAgIGlmKGRjbF9jb2xvcikgewogICAgICAgICAgICBociA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfTG9jayh2YiwgMCwgc2l6ZW9mKHF1YWQxKSwgKHZvaWQgKiopICZkYXRhLCAwKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOV9Mb2NrIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBtZW1jcHkoZGF0YSwgcXVhZDEsIHNpemVvZihxdWFkMSkpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfVW5sb2NrKHZiKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOV9VbmxvY2sgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkY2xfY29sb3IpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZShkZXZpY2UsIDAsIHZiLCAwLCBzaXplb2YocXVhZDFbMF0pKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMCwgMik7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZSBmYWlsZWQsIGhyID0gJSMwOHhcbiIsIGhyKTsKICAgICAgICB9CgogICAgICAgIGlmKGRjbF91Ynl0ZSkgewogICAgICAgICAgICBociA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfTG9jayh2YiwgMCwgc2l6ZW9mKHF1YWQyKSwgKHZvaWQgKiopICZkYXRhLCAwKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOV9Mb2NrIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBtZW1jcHkoZGF0YSwgcXVhZDIsIHNpemVvZihxdWFkMikpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfVW5sb2NrKHZiKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOV9VbmxvY2sgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkY2xfdWJ5dGUpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZShkZXZpY2UsIDAsIHZiLCAwLCBzaXplb2YocXVhZDJbMF0pKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMCwgMik7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSyB8fCBociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsCiAgICAgICAgICAgICAgICJJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmUgZmFpbGVkLCBociA9ICUjMDh4XG4iLCBocik7CiAgICAgICAgICAgIHViX29rID0gU1VDQ0VFREVEKGhyKTsKICAgICAgICB9CgogICAgICAgIGlmKGRjbF9zaG9ydCkgewogICAgICAgICAgICBociA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfTG9jayh2YiwgMCwgc2l6ZW9mKHF1YWQzKSwgKHZvaWQgKiopICZkYXRhLCAwKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOV9Mb2NrIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBtZW1jcHkoZGF0YSwgcXVhZDMsIHNpemVvZihxdWFkMykpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfVW5sb2NrKHZiKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOV9VbmxvY2sgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkY2xfc2hvcnQpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZShkZXZpY2UsIDAsIHZiLCAwLCBzaXplb2YocXVhZDNbMF0pKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMCwgMik7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSyB8fCBociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsCiAgICAgICAgICAgICAgICJJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmUgZmFpbGVkLCBociA9ICUjMDh4XG4iLCBocik7CiAgICAgICAgICAgIHNfb2sgPSBTVUNDRUVERUQoaHIpOwogICAgICAgIH0KCiAgICAgICAgaWYoZGNsX2Zsb2F0KSB7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNEVmVydGV4QnVmZmVyOV9Mb2NrKHZiLCAwLCBzaXplb2YocXVhZDQpLCAodm9pZCAqKikgJmRhdGEsIDApOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X0xvY2sgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIG1lbWNweShkYXRhLCBxdWFkNCwgc2l6ZW9mKHF1YWQ0KSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNEVmVydGV4QnVmZmVyOV9VbmxvY2sodmIpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X1VubG9jayBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRjbF9mbG9hdCk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24gZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlKGRldmljZSwgMCwgdmIsIDAsIHNpemVvZihxdWFkNFswXSkpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmUoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAwLCAyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LIHx8IGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwKICAgICAgICAgICAgICAgIklEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZSBmYWlsZWQsIGhyID0gJSMwOHhcbiIsIGhyKTsKICAgICAgICAgICAgZl9vayA9IFNVQ0NFRURFRChocik7CiAgICAgICAgfQoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIGZhaWxlZCwgaHIgPSAlIzA4eFxuIiwgaHIpOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UoZGV2aWNlLCAwLCBOVUxMLCAwLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCiAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIGlmKGRjbF9zaG9ydCkgewogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMzYwKTsKICAgICAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmIHx8ICFzX29rLAogICAgICAgICAgICJEM0RERUNMVFlQRV9VU0hPUlQ0TiByZXR1cm5lZCBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICB9CiAgICBpZihkY2xfdWJ5dGUpIHsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMDAwZmZmZiB8fCAhdWJfb2ssCiAgICAgICAgICAgIkQzRERFQ0xUWVBFX1VCWVRFNE4gcmV0dXJuZWQgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmZmZlxuIiwgY29sb3IpOwogICAgfQogICAgaWYoZGNsX2NvbG9yKSB7CiAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOwogICAgICAgIG9rKGNvbG9yID09IDB4MDBmZmZmMDAsCiAgICAgICAgICAgIkQzRERFQ0xUWVBFX0QzRENPTE9SIHJldHVybmVkIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmMDBcbiIsIGNvbG9yKTsKICAgIH0KICAgIGlmKGRjbF9mbG9hdCkgewogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMTIwKTsKICAgICAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwIHx8ICFmX29rLAogICAgICAgICAgICJEM0RERUNMVFlQRV9GTE9BVDQgcmV0dXJuZWQgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZjAwMDBmZiwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X0xvY2sodmIsIDAsIHNpemVvZihxdWFkX3RyYW5zZm9ybWVkKSwgKHZvaWQgKiopICZkYXRhLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfTG9jayBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG1lbWNweShkYXRhLCBxdWFkX3RyYW5zZm9ybWVkLCBzaXplb2YocXVhZF90cmFuc2Zvcm1lZCkpOwogICAgaHIgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X1VubG9jayh2Yik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X1VubG9jayBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGNsX3Bvc2l0aW9udCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UoZGV2aWNlLCAwLCB2YiwgMCwgc2l6ZW9mKHF1YWRfdHJhbnNmb3JtZWRbMF0pKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZShkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDAsIDIpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZSBmYWlsZWQsIGhyID0gJSMwOHhcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KCiAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDg4LCAxMDgpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwKICAgICAgICJwaXhlbCA4OC8xMDggaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDkyLCAxMDgpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwKICAgICAgICJwaXhlbCA5Mi8xMDggaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDg4LCAxMTIpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwKICAgICAgICJwaXhlbCA4OC8xMTIgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDkyLCAxMTIpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmYwMCwKICAgICAgICJwaXhlbCA5Mi8xMTIgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmMDBcbiIsIGNvbG9yKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1NjgsIDEwOCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLAogICAgICAgInBpeGVsIDU2OC8xMDggaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDU3MiwgMTA4KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsCiAgICAgICAicGl4ZWwgNTcyLzEwOCBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDBmZlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNTY4LCAxMTIpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmYwMCwKICAgICAgICJwaXhlbCA1NjgvMTEyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1NzIsIDExMik7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLAogICAgICAgInBpeGVsIDU3Mi8xMTIgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA4OCwgMjk4KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsCiAgICAgICAicGl4ZWwgODgvMjk4IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA5MiwgMjk4KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmMDAsCiAgICAgICAicGl4ZWwgOTIvMjk4IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA4OCwgMzAyKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsCiAgICAgICAicGl4ZWwgODgvMzAyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA5MiwgMzAyKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsCiAgICAgICAicGl4ZWwgOTIvMzAyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNTY4LCAyOTgpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmYwMCwKICAgICAgICJwaXhlbCA1NjgvMjk4IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmZmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1NzIsIDI5OCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLAogICAgICAgInBpeGVsIDU3Mi8yOTggaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDU2OCwgMzAyKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsCiAgICAgICAicGl4ZWwgNTY4LzMwMiBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDBmZlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNTcyLCAzMDIpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwKICAgICAgICJwaXhlbCA1NzIvMzAyIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CgogICAgLyogVGhpcyB0ZXN0IGlzIHBvaW50bGVzcyB3aXRob3V0IHRob3NlIHR3byBkZWNsYXJhdGlvbnM6ICovCiAgICBpZigoIWRjbF9jb2xvcl8yKSB8fCAoIWRjbF91Ynl0ZV8yKSkgewogICAgICAgIHNraXAoImNvbG9yLXVieXRlIHN3aXRjaGluZyB0ZXN0IGRlY2xhcmF0aW9ucyBhcmVuJ3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICBnb3RvIG91dDsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfTG9jayh2YiwgMCwgc2l6ZW9mKHF1YWRzKSwgKHZvaWQgKiopICZkYXRhLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfTG9jayBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG1lbWNweShkYXRhLCBxdWFkcywgc2l6ZW9mKHF1YWRzKSk7CiAgICBociA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfVW5sb2NrKHZiKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfVW5sb2NrIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhCdWZmZXIoZGV2aWNlLCBzaXplb2YoY29sb3JzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgRDNEUE9PTF9NQU5BR0VELCAmdmIyLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIkNyZWF0ZVZlcnRleEJ1ZmZlciBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNEVmVydGV4QnVmZmVyOV9Mb2NrKHZiMiwgMCwgc2l6ZW9mKGNvbG9ycyksICh2b2lkICoqKSAmZGF0YSwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X0xvY2sgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBtZW1jcHkoZGF0YSwgY29sb3JzLCBzaXplb2YoY29sb3JzKSk7CiAgICBociA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfVW5sb2NrKHZiMik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X1VubG9jayBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmZmZmZmLCAwLjAsIDApOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UoZGV2aWNlLCAwLCB2YiwgMCwgc2l6ZW9mKGZsb2F0KSAqIDMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGlmKGkgPT0gMCkgewogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlKGRldmljZSwgMSwgdmIyLCAwLCBzaXplb2YoRFdPUkQpICogNCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZShkZXZpY2UsIDEsIHZiMiwgOCwgc2l6ZW9mKERXT1JEKSAqIDQpOwogICAgICAgIH0KICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgdWJfb2sgPSBGQUxTRTsKICAgICAgICBpZihTVUNDRUVERUQoaHIpKSB7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRjbF91Ynl0ZV8yKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmUoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAwLCAyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LIHx8IGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwKICAgICAgICAgICAgICAgIklEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZSBmYWlsZWQsIGhyID0gJSMwOHhcbiIsIGhyKTsKICAgICAgICAgICAgdWJfb2sgPSBTVUNDRUVERUQoaHIpOwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgZGNsX2NvbG9yXzIpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZShkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDQsIDIpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmUgZmFpbGVkLCBociA9ICUjMDh4XG4iLCBocik7CgogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkY2xfdWJ5dGVfMik7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24gZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgOCwgMik7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSyB8fCBociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsCiAgICAgICAgICAgICAgICJJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmUgZmFpbGVkLCBociA9ICUjMDh4XG4iLCBocik7CiAgICAgICAgICAgIHViX29rID0gKFNVQ0NFRURFRChocikgJiYgdWJfb2spOwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgfQoKICAgICAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICAgICBpZihpID09IDApIHsKICAgICAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNDgwLCAzNjApOwogICAgICAgICAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwLAogICAgICAgICAgICAgICAiRDNEREVDTFRZUEVfRDNEQ09MT1IgcmV0dXJuZWQgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwogICAgICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICAgICAgICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsCiAgICAgICAgICAgICAgICAiVW51c2VkIHF1YWQgcmV0dXJuZWQgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmZmZmZlxuIiwgY29sb3IpOwogICAgICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDM2MCk7CiAgICAgICAgICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYgfHwgIXViX29rLAogICAgICAgICAgICAgICAiRDNEREVDTFRZUEVfVUJZVEU0TiByZXR1cm5lZCBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICAgICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMTIwKTsKICAgICAgICAgICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiB8fCAhdWJfb2ssCiAgICAgICAgICAgICAgICJEM0RERUNMVFlQRV9VQllURTROIHJldHVybmVkIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDM2MCk7CiAgICAgICAgICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsCiAgICAgICAgICAgICAgICJEM0RERUNMVFlQRV9EM0RDT0xPUiByZXR1cm5lZCBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICAgICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMTIwKTsKICAgICAgICAgICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwKICAgICAgICAgICAgICAgIlVudXNlZCBxdWFkIHJldHVybmVkIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgICAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOwogICAgICAgICAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwIHx8ICF1Yl9vaywKICAgICAgICAgICAgICAgIkQzRERFQ0xUWVBFX1VCWVRFNE4gcmV0dXJuZWQgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwogICAgICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDEyMCk7CiAgICAgICAgICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAgfHwgIXViX29rLAogICAgICAgICAgICAgICAiRDNEREVDTFRZUEVfVUJZVEU0TiByZXR1cm5lZCBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmYwMDAwXG4iLCBjb2xvcik7CiAgICAgICAgfQogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UoZGV2aWNlLCAwLCBOVUxMLCAwLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZShkZXZpY2UsIDEsIE5VTEwsIDAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X1JlbGVhc2UodmIyKTsKCiAgICBvdXQ6CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X1JlbGVhc2UodmIpOwogICAgaWYoZGNsX2Zsb2F0KSBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkY2xfZmxvYXQpOwogICAgaWYoZGNsX3Nob3J0KSBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkY2xfc2hvcnQpOwogICAgaWYoZGNsX3VieXRlKSBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkY2xfdWJ5dGUpOwogICAgaWYoZGNsX2NvbG9yKSBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkY2xfY29sb3IpOwogICAgaWYoZGNsX2NvbG9yXzIpIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOV9SZWxlYXNlKGRjbF9jb2xvcl8yKTsKICAgIGlmKGRjbF91Ynl0ZV8yKSBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkY2xfdWJ5dGVfMik7CiAgICBpZihkY2xfcG9zaXRpb250KSBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZShkY2xfcG9zaXRpb250KTsKfQoKc3RydWN0IHZlcnRleF9mbG9hdDE2Y29sb3IgewogICAgZmxvYXQgeCwgeSwgejsKICAgIERXT1JEIGMxLCBjMjsKfTsKCnN0YXRpYyB2b2lkIHRlc3RfdnNoYWRlcl9mbG9hdDE2KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgSFJFU1VMVCBocjsKICAgIERXT1JEIGNvbG9yOwogICAgdm9pZCAqZGF0YTsKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzW10gPSB7CiAgICAgICAgezAsICAgMCwgIEQzRERFQ0xUWVBFX0ZMT0FUMywgICBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9QT1NJVElPTiwgICAgICAgMH0sCiAgICAgICAgezAsICAxMiwgIEQzRERFQ0xUWVBFX0ZMT0FUMTZfNCxEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9DT0xPUiwgICAgICAgICAgMH0sCiAgICAgICAgRDNEREVDTF9FTkQoKQogICAgfTsKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqdmRlY2wgPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqYnVmZmVyID0gTlVMTDsKICAgIElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKnNoYWRlcjsKICAgIERXT1JEIHNoYWRlcl9jb2RlW10gPSB7CiAgICAgICAgMHhmZmZlMDEwMSwgMHgwMDAwMDAxZiwgMHg4MDAwMDAwMCwgMHg5MDBmMDAwMCwgMHgwMDAwMDAxZiwgMHg4MDAwMDAwYSwKICAgICAgICAweDkwMGYwMDAxLCAweDAwMDAwMDAxLCAweGMwMGYwMDAwLCAweDkwZTQwMDAwLCAweDAwMDAwMDAxLCAweGQwMGYwMDAwLAogICAgICAgIDB4OTBlNDAwMDEsIDB4MDAwMGZmZmYKICAgIH07CiAgICBzdHJ1Y3QgdmVydGV4X2Zsb2F0MTZjb2xvciBxdWFkW10gPSB7CiAgICAgICAgeyAtMS4wLCAgIC0xLjAsICAgICAwLjEsICAgICAgICAweDNjMDAwMDAwLCAweDAwMDAwMDAwIH0sIC8qIGdyZWVuICovCiAgICAgICAgeyAtMS4wLCAgICAwLjAsICAgICAwLjEsICAgICAgICAweDNjMDAwMDAwLCAweDAwMDAwMDAwIH0sCiAgICAgICAgeyAgMC4wLCAgIC0xLjAsICAgICAwLjEsICAgICAgICAweDNjMDAwMDAwLCAweDAwMDAwMDAwIH0sCiAgICAgICAgeyAgMC4wLCAgICAwLjAsICAgICAwLjEsICAgICAgICAweDNjMDAwMDAwLCAweDAwMDAwMDAwIH0sCgogICAgICAgIHsgIDAuMCwgICAtMS4wLCAgICAgMC4xLCAgICAgICAgMHgwMDAwM2MwMCwgMHgwMDAwMDAwMCB9LCAvKiByZWQgKi8KICAgICAgICB7ICAwLjAsICAgIDAuMCwgICAgIDAuMSwgICAgICAgIDB4MDAwMDNjMDAsIDB4MDAwMDAwMDAgfSwKICAgICAgICB7ICAxLjAsICAgLTEuMCwgICAgIDAuMSwgICAgICAgIDB4MDAwMDNjMDAsIDB4MDAwMDAwMDAgfSwKICAgICAgICB7ICAxLjAsICAgIDAuMCwgICAgIDAuMSwgICAgICAgIDB4MDAwMDNjMDAsIDB4MDAwMDAwMDAgfSwKCiAgICAgICAgeyAgMC4wLCAgICAwLjAsICAgICAwLjEsICAgICAgICAweDAwMDAwMDAwLCAweDAwMDAzYzAwIH0sIC8qIGJsdWUgKi8KICAgICAgICB7ICAwLjAsICAgIDEuMCwgICAgIDAuMSwgICAgICAgIDB4MDAwMDAwMDAsIDB4MDAwMDNjMDAgfSwKICAgICAgICB7ICAxLjAsICAgIDAuMCwgICAgIDAuMSwgICAgICAgIDB4MDAwMDAwMDAsIDB4MDAwMDNjMDAgfSwKICAgICAgICB7ICAxLjAsICAgIDEuMCwgICAgIDAuMSwgICAgICAgIDB4MDAwMDAwMDAsIDB4MDAwMDNjMDAgfSwKCiAgICAgICAgeyAtMS4wLCAgICAwLjAsICAgICAwLjEsICAgICAgICAweDAwMDAwMDAwLCAweDNjMDAwMDAwIH0sIC8qIGFscGhhICovCiAgICAgICAgeyAtMS4wLCAgICAxLjAsICAgICAwLjEsICAgICAgICAweDAwMDAwMDAwLCAweDNjMDAwMDAwIH0sCiAgICAgICAgeyAgMC4wLCAgICAwLjAsICAgICAwLjEsICAgICAgICAweDAwMDAwMDAwLCAweDNjMDAwMDAwIH0sCiAgICAgICAgeyAgMC4wLCAgICAxLjAsICAgICAwLjEsICAgICAgICAweDAwMDAwMDAwLCAweDNjMDAwMDAwIH0sCiAgICB9OwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZjEwMjAzMCwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzLCAmdmRlY2wpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24gZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlcihkZXZpY2UsIHNoYWRlcl9jb2RlLCAmc2hhZGVyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlciBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIHNoYWRlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIHZkZWNsKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQgKyAgMCwgc2l6ZW9mKHF1YWRbMF0pKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUCBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBxdWFkICsgIDQsIHNpemVvZihxdWFkWzBdKSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZCArICA4LCBzaXplb2YocXVhZFswXSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQgKyAxMiwgc2l6ZW9mKHF1YWRbMF0pKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUCBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMzYwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsCiAgICAgICAiSW5wdXQgMHgwMDAwM2MwMCwgMHgwMDAwMDAwMCByZXR1cm5lZCBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmYwMDAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDAwLAogICAgICAgIklucHV0IDB4MDAwMDAwMDAsIDB4M2MwMDAwMDAgcmV0dXJuZWQgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwKICAgICAgICJJbnB1dCAweDNjMDAwMDAwLCAweDAwMDAwMDAwIHJldHVybmVkIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMTIwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsCiAgICAgICAiSW5wdXQgMHgwMDAwMDAwMCwgMHgwMDAwM2MwMCByZXR1cm5lZCBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmMTAyMDMwLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhCdWZmZXIoZGV2aWNlLCBzaXplb2YocXVhZCksIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBPT0xfTUFOQUdFRCwgJmJ1ZmZlciwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleEJ1ZmZlciBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X0xvY2soYnVmZmVyLCAwLCBzaXplb2YocXVhZCksICh2b2lkICoqKSAmZGF0YSwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X0xvY2sgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG1lbWNweShkYXRhLCBxdWFkLCBzaXplb2YocXVhZCkpOwogICAgaHIgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X1VubG9jayhidWZmZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOV9VbmxvY2sgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UoZGV2aWNlLCAwLCBidWZmZXIsIDAsIHNpemVvZihxdWFkWzBdKSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZSBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgewogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZShkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsICAwLCAyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlIGZhaWxlZCwgaHIgPSAlIzA4eFxuIiwgaHIpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZShkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsICA0LCAyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlIGZhaWxlZCwgaHIgPSAlIzA4eFxuIiwgaHIpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZShkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsICA4LCAyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlIGZhaWxlZCwgaHIgPSAlIzA4eFxuIiwgaHIpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZShkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDEyLCAyKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlIGZhaWxlZCwgaHIgPSAlIzA4eFxuIiwgaHIpOwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KCiAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMzYwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsCiAgICAgICAiSW5wdXQgMHgwMDAwM2MwMCwgMHgwMDAwMDAwMCByZXR1cm5lZCBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmYwMDAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDEyMCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDAwLAogICAgICAgIklucHV0IDB4MDAwMDAwMDAsIDB4M2MwMDAwMDAgcmV0dXJuZWQgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCAzNjApOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwKICAgICAgICJJbnB1dCAweDNjMDAwMDAwLCAweDAwMDAwMDAwIHJldHVybmVkIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMTIwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsCiAgICAgICAiSW5wdXQgMHgwMDAwMDAwMCwgMHgwMDAwM2MwMCByZXR1cm5lZCBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZShkZXZpY2UsIDAsIE5VTEwsIDAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBOVUxMKTsKICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlciBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245X1JlbGVhc2UodmRlY2wpOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOV9SZWxlYXNlKHNoYWRlcik7CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X1JlbGVhc2UoYnVmZmVyKTsKfQoKc3RhdGljIHZvaWQgY29uZGl0aW9uYWxfbnAyX3JlcGVhdF90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgRDNEQ0FQUzkgY2FwczsKICAgIElEaXJlY3QzRFRleHR1cmU5ICp0ZXh0dXJlOwogICAgSFJFU1VMVCBocjsKICAgIEQzRExPQ0tFRF9SRUNUIHJlY3Q7CiAgICB1bnNpZ25lZCBpbnQgeCwgeTsKICAgIERXT1JEICpkc3QsIGNvbG9yOwogICAgY29uc3QgZmxvYXQgcXVhZFtdID0gewogICAgICAgIC0xLjAsICAgLTEuMCwgICAwLjEsICAgLTAuMiwgICAtMC4yLAogICAgICAgICAxLjAsICAgLTEuMCwgICAwLjEsICAgIDEuMiwgICAtMC4yLAogICAgICAgIC0xLjAsICAgIDEuMCwgICAwLjEsICAgLTAuMiwgICAgMS4yLAogICAgICAgICAxLjAsICAgIDEuMCwgICAwLjEsICAgIDEuMiwgICAgMS4yCiAgICB9OwogICAgbWVtc2V0KCZjYXBzLCAwLCBzaXplb2YoY2FwcykpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXREZXZpY2VDYXBzKGRldmljZSwgJmNhcHMpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXREZXZpY2VDYXBzIGZhaWxlZCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKCEoY2Fwcy5UZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QT1cyKSkgewogICAgICAgIC8qIE5QMiBjb25kaXRpb25hbCByZXF1aXJlcyB0aGUgUE9XMiBmbGFnLiBDaGVjayB0aGF0IHdoaWxlIHdlJ3JlIGF0IGl0ICovCiAgICAgICAgb2soKGNhcHMuVGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfTk9OUE9XMkNPTkRJVElPTkFMKSA9PSAwLAogICAgICAgICAgICJDYXJkIGhhcyBjb25kaXRpb25hbCBOUDIgc3VwcG9ydCB3aXRob3V0IHBvd2VyIG9mIHR3byByZXN0cmljdGlvbiBzZXRcbiIpOwogICAgICAgIHNraXAoIkNhcmQgaGFzIHVuY29uZGl0aW9uYWwgcG93MiBzdXBwb3J0LCBza2lwcGluZyBjb25kaXRpb25hbCBOUDIgdGVzdHNcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZighKGNhcHMuVGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUE9XMikpIHsKICAgICAgICBza2lwKCJObyBjb25kaXRpb25hbCBOUDIgc3VwcG9ydCwgc2tpcHBpbmcgY29uZGl0aW9uYWwgTlAyIHRlc3RzXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmMDAwMDAwLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlKGRldmljZSwgMTAsIDEwLCAxLCAwLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFBPT0xfTUFOQUdFRCwgJnRleHR1cmUsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlIGZhaWxlZCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBtZW1zZXQoJnJlY3QsIDAsIHNpemVvZihyZWN0KSk7CiAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X0xvY2tSZWN0KHRleHR1cmUsIDAsICZyZWN0LCBOVUxMLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFRleHR1cmU5X0xvY2tSZWN0IGZhaWxlZCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGZvcih5ID0gMDsgeSA8IDEwOyB5KyspIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCAxMDsgeCsrKSB7CiAgICAgICAgICAgIGRzdCA9IChEV09SRCAqKSAoKEJZVEUgKikgcmVjdC5wQml0cyArIHkgKiByZWN0LlBpdGNoICsgeCAqIHNpemVvZihEV09SRCkpOwogICAgICAgICAgICBpZih4ID09IDAgfHwgeCA9PSA5IHx8IHkgPT0gMCB8fCB5ID09IDkpIHsKICAgICAgICAgICAgICAgICpkc3QgPSAweDAwZmYwMDAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgKmRzdCA9IDB4MDAwMDAwZmY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBociA9IElEaXJlY3QzRFRleHR1cmU5X1VubG9ja1JlY3QodGV4dHVyZSwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RUZXh0dXJlOV9VbmxvY2tSZWN0IGZhaWxlZCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIChJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKikgdGV4dHVyZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDAsIEQzRFNBTVBfQUREUkVTU1UsIEQzRFRBRERSRVNTX1dSQVApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFNhbXBsZXJTdGF0ZShkZXZpY2UsIDAsIEQzRFNBTVBfQUREUkVTU1YsIEQzRFRBRERSRVNTX1dSQVApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVogfCBEM0RGVkZfVEVYMSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKSB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQsIHNpemVvZihmbG9hdCkgKiA1KTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUCBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIGZhaWxlZCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KCiAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAgICAxLCAgMSk7CiAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwLCAiTlAyOiBQaXhlbCAgIDEsICAxIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmYwMDAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA2MzksIDQ3OSk7CiAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwLCAiTlAyOiBQaXhlbCA2MzksIDQ3OSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDEzNSwgMTAxKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsICJOUDI6IFBpeGVsIDEzNSwgMTAxIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmYwMDAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNDAsIDEwMSk7CiAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwLCAiTlAyOiBQaXhlbCAxNDAsIDEwMSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTM1LCAxMDUpOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIk5QMjogUGl4ZWwgMTM1LCAxMDUgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE0MCwgMTA1KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJOUDI6IFBpeGVsIDE0MCwgMTA1IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTM1LCAzNzYpOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIk5QMjogUGl4ZWwgMTM1LCAzNzYgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE0MCwgMzc2KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJOUDI6IFBpeGVsIDE0MCwgMzc2IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxMzUsIDM3OSk7CiAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwLCAiTlAyOiBQaXhlbCAxMzUsIDM3OSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTQwLCAzNzkpOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIk5QMjogUGl4ZWwgMTQwLCAzNzkgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1MDAsIDEwMSk7CiAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwLCAiTlAyOiBQaXhlbCA1MDAsIDEwMSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNTA0LCAxMDEpOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIk5QMjogUGl4ZWwgNTA0LCAxMDEgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDUwMCwgMTA1KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJOUDI6IFBpeGVsIDUwMCwgMTA1IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1MDQsIDEwNSk7CiAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwLCAiTlAyOiBQaXhlbCA1MDQsIDEwNSBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDUwMCwgMzc2KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJOUDI6IFBpeGVsIDUwMCwgMzc2IGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA1MDQsIDM3Nik7CiAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwLCAiTlAyOiBQaXhlbCA1MDQsIDM3NiBoYXMgY29sb3IgJTA4eCwgZXhwZWN0ZWQgMHgwMGZmMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgNTAwLCAzODApOwogICAgb2soY29sb3IgPT0gMHgwMGZmMDAwMCwgIk5QMjogUGl4ZWwgNTAwLCAzODAgaGFzIGNvbG9yICUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDUwNCwgMzgwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsICJOUDI6IFBpeGVsIDUwNCwgMzgwIGhhcyBjb2xvciAlMDh4LCBleHBlY3RlZCAweDAwZmYwMDAwXG4iLCBjb2xvcik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAwLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBJRGlyZWN0M0RUZXh0dXJlOV9SZWxlYXNlKHRleHR1cmUpOwp9CgpzdGF0aWMgdm9pZCB2RmFjZV9yZWdpc3Rlcl90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgSFJFU1VMVCBocjsKICAgIERXT1JEIGNvbG9yOwogICAgY29uc3QgRFdPUkQgc2hhZGVyX2NvZGVbXSA9IHsKICAgICAgICAweGZmZmYwMzAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18zXzAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDUwMDAwNTEsIDB4YTAwZjAwMDAsIDB4MDAwMDAwMDAsIDB4M2Y4MDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIC8qIGRlZiBjMCwgMC4wLCAxLjAsIDAuMCwgMC4wICovCiAgICAgICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMSwgMHgzZjgwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMxLCAxLjAsIDAuMCwgMC4wLCAwLjAgKi8KICAgICAgICAweDAyMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYxMDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY2wgdkZhY2UgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDIwMDAwMDEsIDB4ODAwZjAwMDEsIDB4YTBlNDAwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMSwgYzEgICAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwNDAwMDA1OCwgMHg4MDBmMDAwMCwgMHg5MGU0MTAwMSwgMHhhMGU0MDAwMCwgMHg4MGU0MDAwMSwgICAgICAgICAgICAgLyogY21wIHIwLCB2RmFjZSwgYzAsIHIxICAgICAgKi8KICAgICAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDgwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3Ygb0MwLCByMCAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMGZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVORCAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB9OwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpzaGFkZXI7CiAgICBJRGlyZWN0M0RUZXh0dXJlOSAqdGV4dHVyZTsKICAgIElEaXJlY3QzRFN1cmZhY2U5ICpzdXJmYWNlLCAqYmFja2J1ZmZlcjsKICAgIGNvbnN0IGZsb2F0IHF1YWRbXSA9IHsKICAgICAgICAtMS4wLCAgIC0xLjAsICAgMC4xLAogICAgICAgICAxLjAsICAgLTEuMCwgICAwLjEsCiAgICAgICAgLTEuMCwgICAgMC4wLCAgIDAuMSwKCiAgICAgICAgIDEuMCwgICAtMS4wLCAgIDAuMSwKICAgICAgICAgMS4wLCAgICAwLjAsICAgMC4xLAogICAgICAgIC0xLjAsICAgIDAuMCwgICAwLjEsCgogICAgICAgIC0xLjAsICAgIDAuMCwgICAwLjEsCiAgICAgICAgLTEuMCwgICAgMS4wLCAgIDAuMSwKICAgICAgICAgMS4wLCAgICAwLjAsICAgMC4xLAoKICAgICAgICAgMS4wLCAgICAwLjAsICAgMC4xLAogICAgICAgIC0xLjAsICAgIDEuMCwgICAwLjEsCiAgICAgICAgIDEuMCwgICAgMS4wLCAgIDAuMSwKICAgIH07CiAgICBjb25zdCBmbG9hdCBibGl0W10gPSB7CiAgICAgICAgIDAuMCwgICAtMS4wLCAgIDAuMSwgICAgMC4wLCAgICAwLjAsCiAgICAgICAgIDEuMCwgICAtMS4wLCAgIDAuMSwgICAgMS4wLCAgICAwLjAsCiAgICAgICAgIDAuMCwgICAgMS4wLCAgIDAuMSwgICAgMC4wLCAgICAxLjAsCiAgICAgICAgIDEuMCwgICAgMS4wLCAgIDAuMSwgICAgMS4wLCAgICAxLjAsCiAgICB9OwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl9jb2RlLCAmc2hhZGVyKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVRleHR1cmUoZGV2aWNlLCAxMjgsIDEyOCwgMSwgRDNEVVNBR0VfUkVOREVSVEFSR0VULCBEM0RGTVRfWDhSOEc4QjgsIEQzRFBPT0xfREVGQVVMVCwgJnRleHR1cmUsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlIGZhaWxlZCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNEVGV4dHVyZTlfR2V0U3VyZmFjZUxldmVsKHRleHR1cmUsIDAsICZzdXJmYWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFRleHR1cmU5X0dldFN1cmZhY2VMZXZlbCBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlciBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldEZWRiBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0QmFja0J1ZmZlcihkZXZpY2UsIDAsIDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmYmFja2J1ZmZlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldEJhY2tCdWZmZXIgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCwgMHhmZjAwMDBmZiwgMC4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIGZhaWxlZCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpIHsKICAgICAgICAvKiBGaXJzdCwgZHJhdyB0byB0aGUgdGV4dHVyZSBhbmQgdGhlIGJhY2sgYnVmZmVyIHRvIHRlc3QgYm90aCBvZmZzY3JlZW4gYW5kIG9uc2NyZWVuIGNhc2VzICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclRhcmdldChkZXZpY2UsIDAsIHN1cmZhY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyVGFyZ2V0IGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmMDAwMGZmLCAwLjAsIDApOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVMSVNULCA0LCBxdWFkLCBzaXplb2YoZmxvYXQpICogMyk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyVGFyZ2V0KGRldmljZSwgMCwgYmFja2J1ZmZlcik7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJUYXJnZXQgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVMSVNULCA0LCBxdWFkLCBzaXplb2YoZmxvYXQpICogMyk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgLyogQmxpdCB0aGUgdGV4dHVyZSBvbnRwIHRoZSBiYWNrIGJ1ZmZlciB0byBtYWtlIGl0IHZpc2libGUgKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBOVUxMKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUoZGV2aWNlLCAwLCAoSURpcmVjdDNEQmFzZVRleHR1cmU5ICopIHRleHR1cmUpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZSBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19DT0xPUk9QLCBEM0RUT1BfU0VMRUNUQVJHMSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19DT0xPUkFSRzEsIEQzRFRBX1RFWFRVUkUpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWiB8IEQzREZWRl9URVgxKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldEZWRiBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBibGl0LCBzaXplb2YoZmxvYXQpICogNSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDM2MCk7CiAgICBvayhjb2xvciA9PSAweDAwZmYwMDAwLCAidkZhY2U6IE9uc2NyZWVuIHJlbmRlcmVkIGZyb250IGZhY2luZyBxdWFkIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMTIwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMGZmMDAsICJ2RmFjZTogT25zY3JlZW4gcmVuZGVyZWQgYmFjayBmYWNpbmcgcXVhZCBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDBmZjAwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDM2MCk7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZjAwLCAidkZhY2U6IE9mZnNjcmVlbiByZW5kZXJlZCBiYWNrIGZhY2luZyBxdWFkIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMTIwKTsKICAgIG9rKGNvbG9yID09IDB4MDBmZjAwMDAsICJ2RmFjZTogT2Zmc2NyZWVuIHJlbmRlcmVkIGZyb250IGZhY2luZyBxdWFkIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZjAwMDBcbiIsIGNvbG9yKTsKCiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyIGZhaWxlZCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIDAsIE5VTEwpOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyKTsKICAgIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2Uoc3VyZmFjZSk7CiAgICBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwogICAgSURpcmVjdDNEVGV4dHVyZTlfUmVsZWFzZSh0ZXh0dXJlKTsKfQoKc3RhdGljIHZvaWQgZml4ZWRfZnVuY3Rpb25fYnVtcG1hcF90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgSFJFU1VMVCBocjsKICAgIERXT1JEIGNvbG9yOwogICAgaW50IGk7CiAgICBEM0RDQVBTOSBjYXBzOwoKICAgIHN0YXRpYyBjb25zdCBmbG9hdCBxdWFkW11bN10gPSB7CiAgICAgICAgey0xMjguMGYvNjQwLjBmLCAtMTI4LjBmLzQ4MC4wZiwgMC4xZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZn0sCiAgICAgICAgey0xMjguMGYvNjQwLjBmLCAgMTI4LjBmLzQ4MC4wZiwgMC4xZiwgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZn0sCiAgICAgICAgeyAxMjguMGYvNjQwLjBmLCAtMTI4LjBmLzQ4MC4wZiwgMC4xZiwgMS4wZiwgMC4wZiwgMS4wZiwgMC4wZn0sCiAgICAgICAgeyAxMjguMGYvNjQwLjBmLCAgMTI4LjBmLzQ4MC4wZiwgMC4xZiwgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZn0sCiAgICB9OwoKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzW10gPSB7CiAgICAgICAgezAsIDAsICBEM0RERUNMVFlQRV9GTE9BVDMsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1BPU0lUSU9OLCAwfSwKICAgICAgICB7MCwgMTIsIEQzRERFQ0xUWVBFX0ZMT0FUMiwgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfVEVYQ09PUkQsIDB9LAogICAgICAgIHswLCAyMCwgRDNEREVDTFRZUEVfRkxPQVQyLCBEM0RERUNMTUVUSE9EX0RFRkFVTFQsIEQzRERFQ0xVU0FHRV9URVhDT09SRCwgMX0sCiAgICAgICAgRDNEREVDTF9FTkQoKQogICAgfTsKCiAgICAvKiB1c2UgYXNzeW1ldHJpYyBtYXRyaXggdG8gdGVzdCBsb2FkaW5nICovCiAgICBmbG9hdCBidW1wZW52bWF0WzRdID0gezAuMCwwLjUsLTAuNSwwLjB9OwoKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqdmVydGV4X2RlY2xhcmF0aW9uID0gTlVMTDsKICAgIElEaXJlY3QzRFRleHR1cmU5ICAgICAgICAgICAqdGV4dHVyZSAgICAgICAgICAgID0gTlVMTDsKCiAgICBtZW1zZXQoJmNhcHMsIDAsIHNpemVvZihjYXBzKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0RGV2aWNlQ2FwcyhkZXZpY2UsICZjYXBzKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfR2V0RGV2aWNlQ2FwcyBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighKGNhcHMuVGV4dHVyZU9wQ2FwcyAmIEQzRFRFWE9QQ0FQU19CVU1QRU5WTUFQKSkgewogICAgICAgIHNraXAoIkQzRFRFWE9QQ0FQU19CVU1QRU5WTUFQIG5vdCBzZXQsIHNraXBwaW5nIGJ1bXBtYXAgdGVzdHNcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogVGhpcyBjaGVjayBpcyBkaXNhYmxlZCwgc29tZSBXaW5kb3dzIGRyaXZlcnMgZG8gbm90IGhhbmRsZSBEM0RVU0FHRV9RVUVSWV9MRUdBQ1lCVU1QTUFQIHByb3Blcmx5LgogICAgICAgICAqIFRoZXkgcmVwb3J0IHRoYXQgaXQgaXMgbm90IHN1cHBvcnRlZCwgYnV0IGFmdGVyIHRoYXQgYnVtcCBtYXBwaW5nIHdvcmtzIHByb3Blcmx5LiBTbyBqdXN0IHRlc3QKICAgICAgICAgKiBpZiB0aGUgZm9ybWF0IGlzIGdlbmVyYWxseSBzdXBwb3J0ZWQsIGFuZCBjaGVjayB0aGUgQlVNUEVOVk1BUCBmbGFnCiAgICAgICAgICovCiAgICAgICAgSURpcmVjdDNEOSAqZDNkOTsKCiAgICAgICAgSURpcmVjdDNERGV2aWNlOV9HZXREaXJlY3QzRChkZXZpY2UsICZkM2Q5KTsKICAgICAgICBociA9IElEaXJlY3QzRDlfQ2hlY2tEZXZpY2VGb3JtYXQoZDNkOSwgMCwgRDNEREVWVFlQRV9IQUwsIEQzREZNVF9YOFI4RzhCOCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUlRZUEVfVEVYVFVSRSwgRDNERk1UX1Y4VTgpOwogICAgICAgIElEaXJlY3QzRDlfUmVsZWFzZShkM2Q5KTsKICAgICAgICBpZihGQUlMRUQoaHIpKSB7CiAgICAgICAgICAgIHNraXAoIkQzREZNVF9WOFU4IG5vdCBzdXBwb3J0ZWQgZm9yIGxlZ2FjeSBidW1wIG1hcHBpbmdcbiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIC8qIEdlbmVyYXRlIHRoZSB0ZXh0dXJlcyAqLwogICAgZ2VuZXJhdGVfYnVtcG1hcF90ZXh0dXJlcyhkZXZpY2UpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19CVU1QRU5WTUFUMDAsICooTFBEV09SRCkmYnVtcGVudm1hdFswXSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0VGV4dHVyZVN0YWdlU3RhdGUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMCwgRDNEVFNTX0JVTVBFTlZNQVQwMSwgKihMUERXT1JEKSZidW1wZW52bWF0WzFdKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAwLCBEM0RUU1NfQlVNUEVOVk1BVDEwLCAqKExQRFdPUkQpJmJ1bXBlbnZtYXRbMl0pOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFRleHR1cmVTdGFnZVN0YXRlIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19CVU1QRU5WTUFUMTEsICooTFBEV09SRCkmYnVtcGVudm1hdFszXSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0VGV4dHVyZVN0YWdlU3RhdGUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19DT0xPUk9QLCBEM0RUT1BfQlVNUEVOVk1BUCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0VGV4dHVyZVN0YWdlU3RhdGUgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMCwgRDNEVFNTX0NPTE9SQVJHMSwgRDNEVEFfVEVYVFVSRSApOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFRleHR1cmVTdGFnZVN0YXRlIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19DT0xPUkFSRzIsIEQzRFRBX0NVUlJFTlQgKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMSwgRDNEVFNTX0NPTE9ST1AsIEQzRFRPUF9TRUxFQ1RBUkcxKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAxLCBEM0RUU1NfQ09MT1JBUkcxLCBEM0RUQV9URVhUVVJFKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAxLCBEM0RUU1NfQ09MT1JBUkcyLCBEM0RUQV9DVVJSRU5UKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmVTdGFnZVN0YXRlKGRldmljZSwgMiwgRDNEVFNTX0NPTE9ST1AsIEQzRFRPUF9ESVNBQkxFKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFZlcnRleFNoYWRlciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmYwMGZmLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciBmYWlsZWQgKCUwOHgpXG4iLCBocik7CgoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHMsICZ2ZXJ0ZXhfZGVjbGFyYXRpb24pOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkNyZWF0ZVZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgdmVydGV4X2RlY2xhcmF0aW9uKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkJlZ2luU2NlbmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsICZxdWFkWzBdLCBzaXplb2YocXVhZFswXSkpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkRyYXdQcmltaXRpdmVVUCBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgIG9rKFNVQ0NFRURFRChociksICJFbmRTY2VuZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlByZXNlbnQgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwLTMyLCAyNDApOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgImJ1bXBtYXAgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmLlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwKzMyLCAyNDApOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgImJ1bXBtYXAgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmLlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwLCAyNDAtMzIpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgImJ1bXBtYXAgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmLlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwLCAyNDArMzIpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgImJ1bXBtYXAgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmLlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwLCAyNDApOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDAwMCwgImJ1bXBtYXAgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMDAwLlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwKzMyLCAyNDArMzIpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDAwMCwgImJ1bXBtYXAgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMDAwLlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwLTMyLCAyNDArMzIpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDAwMCwgImJ1bXBtYXAgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMDAwLlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwKzMyLCAyNDAtMzIpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDAwMCwgImJ1bXBtYXAgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMDAwLlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwLTMyLCAyNDAtMzIpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDAwMCwgImJ1bXBtYXAgZmFpbGVkOiBHb3QgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMDAwLlxuIiwgY29sb3IpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOV9SZWxlYXNlKHZlcnRleF9kZWNsYXJhdGlvbik7CgogICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFRleHR1cmUoZGV2aWNlLCBpLCAoSURpcmVjdDNEQmFzZVRleHR1cmU5ICoqKSAmdGV4dHVyZSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfR2V0VGV4dHVyZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgICAgICBJRGlyZWN0M0RUZXh0dXJlOV9SZWxlYXNlKHRleHR1cmUpOyAvKiBGb3IgdGhlIEdldFRleHR1cmUgKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShkZXZpY2UsIGksIE5VTEwpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJTZXRUZXh0dXJlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgICAgIElEaXJlY3QzRFRleHR1cmU5X1JlbGVhc2UodGV4dHVyZSk7IC8qIFRvIGRlc3Ryb3kgaXQgKi8KICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUoZGV2aWNlLCAxLCBEM0RUU1NfQ09MT1JPUCwgRDNEVE9QX0RJU0FCTEUpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFRleHR1cmVTdGFnZVN0YXRlIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShkZXZpY2UsIDAsIEQzRFRTU19DT0xPUk9QLCBEM0RUT1BfTU9EVUxBVEUpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFRleHR1cmVTdGFnZVN0YXRlIGZhaWxlZCAoJTA4eClcbiIsIGhyKTsKCn0KCnN0YXRpYyB2b2lkIHN0ZW5jaWxfY3VsbF90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkgewogICAgSFJFU1VMVCBocjsKICAgIElEaXJlY3QzRFN1cmZhY2U5ICpkZXB0aHN0ZW5jaWwgPSBOVUxMOwogICAgRDNEU1VSRkFDRV9ERVNDIGRlc2M7CiAgICBmbG9hdCBxdWFkMVtdID0gewogICAgICAgIC0xLjAsICAgLTEuMCwgICAwLjEsCiAgICAgICAgIDAuMCwgICAtMS4wLCAgIDAuMSwKICAgICAgICAtMS4wLCAgICAwLjAsICAgMC4xLAogICAgICAgICAwLjAsICAgIDAuMCwgICAwLjEsCiAgICB9OwogICAgZmxvYXQgcXVhZDJbXSA9IHsKICAgICAgICAgMC4wLCAgIC0xLjAsICAgMC4xLAogICAgICAgICAxLjAsICAgLTEuMCwgICAwLjEsCiAgICAgICAgIDAuMCwgICAgMC4wLCAgIDAuMSwKICAgICAgICAgMS4wLCAgICAwLjAsICAgMC4xLAogICAgfTsKICAgIGZsb2F0IHF1YWQzW10gPSB7CiAgICAgICAgMC4wLCAgICAwLjAsICAgMC4xLAogICAgICAgIDEuMCwgICAgMC4wLCAgIDAuMSwKICAgICAgICAwLjAsICAgIDEuMCwgICAwLjEsCiAgICAgICAgMS4wLCAgICAxLjAsICAgMC4xLAogICAgfTsKICAgIGZsb2F0IHF1YWQ0W10gPSB7CiAgICAgICAgLTEuMCwgICAgMC4wLCAgIDAuMSwKICAgICAgICAgMC4wLCAgICAwLjAsICAgMC4xLAogICAgICAgIC0xLjAsICAgIDEuMCwgICAwLjEsCiAgICAgICAgIDAuMCwgICAgMS4wLCAgIDAuMSwKICAgIH07CiAgICBzdHJ1Y3QgdmVydGV4IHBhaW50ZXJbXSA9IHsKICAgICAgIHstMS4wLCAgIC0xLjAsICAgMC4wLCAgICAweDAwMDAwMDAwfSwKICAgICAgIHsgMS4wLCAgIC0xLjAsICAgMC4wLCAgICAweDAwMDAwMDAwfSwKICAgICAgIHstMS4wLCAgICAxLjAsICAgMC4wLCAgICAweDAwMDAwMDAwfSwKICAgICAgIHsgMS4wLCAgICAxLjAsICAgMC4wLCAgICAweDAwMDAwMDAwfSwKICAgIH07CiAgICBXT1JEIGluZGljZXNfY3dbXSAgPSB7MCwgMSwgM307CiAgICBXT1JEIGluZGljZXNfY2N3W10gPSB7MCwgMiwgM307CiAgICB1bnNpZ25lZCBpbnQgaTsKICAgIERXT1JEIGNvbG9yOwoKICAgIElEaXJlY3QzRERldmljZTlfR2V0RGVwdGhTdGVuY2lsU3VyZmFjZShkZXZpY2UsICZkZXB0aHN0ZW5jaWwpOwogICAgaWYoZGVwdGhzdGVuY2lsID09IE5VTEwpIHsKICAgICAgICBza2lwKCJObyBkZXB0aCBzdGVuY2lsIGJ1ZmZlclxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0RTdXJmYWNlOV9HZXREZXNjKGRlcHRoc3RlbmNpbCwgJmRlc2MpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEU3VyZmFjZTlfR2V0RGVzYyBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoZGVwdGhzdGVuY2lsKTsKICAgIGlmKGRlc2MuRm9ybWF0ICE9IEQzREZNVF9EMjRTOCAmJiBkZXNjLkZvcm1hdCAhPSBEM0RGTVRfRDI0WDRTNCkgewogICAgICAgIHNraXAoIk5vIDQgb3IgOCBiaXQgc3RlbmNpbCBzdXJmYWNlXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VUIHwgRDNEQ0xFQVJfU1RFTkNJTCwgMHgwMGZmMDAwMCwgMC4wLCAweDgpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfU1RFTkNJTEZBSUwsIEQzRFNURU5DSUxPUF9JTkNSKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19TVEVOQ0lMWkZBSUwsIEQzRFNURU5DSUxPUF9ERUNSKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19TVEVOQ0lMUEFTUywgRDNEU1RFTkNJTE9QX1JFUExBQ0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX1NURU5DSUxSRUYsIDB4Myk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0NDV19TVEVOQ0lMRkFJTCwgRDNEU1RFTkNJTE9QX1JFUExBQ0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0NDV19TVEVOQ0lMWkZBSUwsIEQzRFNURU5DSUxPUF9ERUNSKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19DQ1dfU1RFTkNJTFBBU1MsIEQzRFNURU5DSUxPUF9JTkNSKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfU1RFTkNJTEVOQUJMRSwgVFJVRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfVFdPU0lERURTVEVOQ0lMTU9ERSwgRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAvKiBGaXJzdCBwYXNzOiBGaWxsIHRoZSBzdGVuY2lsIGJ1ZmZlciB3aXRoIHNvbWUgdmFsdWVzLi4uICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19DVUxMTU9ERSwgRDNEQ1VMTF9DVyk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFTElTVCwgMCAvKiBNaW5JbmRleCAqLywgNCAvKiBOdW1WZXJ0cyAqLywKICAgICAgICAgICAgICAgIDEgLypQcmltQ291bnQgKi8sIGluZGljZXNfY3csIEQzREZNVF9JTkRFWDE2LCBxdWFkMSwgc2l6ZW9mKGZsb2F0KSAqIDMpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3SW5kZXhlZFByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVMSVNULCAwIC8qIE1pbkluZGV4ICovLCA0IC8qIE51bVZlcnRzICovLAogICAgICAgICAgICAgICAgMSAvKlByaW1Db3VudCAqLywgaW5kaWNlc19jY3csIEQzREZNVF9JTkRFWDE2LCBxdWFkMSwgc2l6ZW9mKGZsb2F0KSAqIDMpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19UV09TSURFRFNURU5DSUxNT0RFLCBUUlVFKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0NVTExNT0RFLCBEM0RDVUxMX05PTkUpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRUxJU1QsIDAgLyogTWluSW5kZXggKi8sIDQgLyogTnVtVmVydHMgKi8sCiAgICAgICAgICAgICAgICAxIC8qUHJpbUNvdW50ICovLCBpbmRpY2VzX2N3LCBEM0RGTVRfSU5ERVgxNiwgcXVhZDIsIHNpemVvZihmbG9hdCkgKiAzKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFTElTVCwgMCAvKiBNaW5JbmRleCAqLywgNCAvKiBOdW1WZXJ0cyAqLywKICAgICAgICAgICAgICAgIDEgLypQcmltQ291bnQgKi8sIGluZGljZXNfY2N3LCBEM0RGTVRfSU5ERVgxNiwgcXVhZDIsIHNpemVvZihmbG9hdCkgKiAzKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfQ1VMTE1PREUsIEQzRENVTExfQ1cpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRUxJU1QsIDAgLyogTWluSW5kZXggKi8sIDQgLyogTnVtVmVydHMgKi8sCiAgICAgICAgICAgICAgICAxIC8qUHJpbUNvdW50ICovLCBpbmRpY2VzX2N3LCBEM0RGTVRfSU5ERVgxNiwgcXVhZDMsIHNpemVvZihmbG9hdCkgKiAzKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFTElTVCwgMCAvKiBNaW5JbmRleCAqLywgNCAvKiBOdW1WZXJ0cyAqLywKICAgICAgICAgICAgICAgIDEgLypQcmltQ291bnQgKi8sIGluZGljZXNfY2N3LCBEM0RGTVRfSU5ERVgxNiwgcXVhZDMsIHNpemVvZihmbG9hdCkgKiAzKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfQ1VMTE1PREUsIEQzRENVTExfQ0NXKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3SW5kZXhlZFByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVMSVNULCAwIC8qIE1pbkluZGV4ICovLCA0IC8qIE51bVZlcnRzICovLAogICAgICAgICAgICAgICAgMSAvKlByaW1Db3VudCAqLywgaW5kaWNlc19jdywgRDNERk1UX0lOREVYMTYsIHF1YWQ0LCBzaXplb2YoZmxvYXQpICogMyk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRUxJU1QsIDAgLyogTWluSW5kZXggKi8sIDQgLyogTnVtVmVydHMgKi8sCiAgICAgICAgICAgICAgICAxIC8qUHJpbUNvdW50ICovLCBpbmRpY2VzX2NjdywgRDNERk1UX0lOREVYMTYsIHF1YWQ0LCBzaXplb2YoZmxvYXQpICogMyk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX1NURU5DSUxaRkFJTCwgRDNEU1RFTkNJTE9QX0tFRVApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX1NURU5DSUxQQVNTLCBEM0RTVEVOQ0lMT1BfS0VFUCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfU1RFTkNJTEZBSUwsIEQzRFNURU5DSUxPUF9LRUVQKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19UV09TSURFRFNURU5DSUxNT0RFLCBGQUxTRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfQ1VMTE1PREUsIEQzRENVTExfTk9ORSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfU1RFTkNJTEZVTkMsIEQzRENNUF9FUVVBTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIDJuZCBwYXNzOiBNYWtlIHRoZSBzdGVuY2lsIHZhbHVlcyB2aXNpYmxlICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVogfCBEM0RGVkZfRElGRlVTRSk7CiAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19TVEVOQ0lMUkVGLCBpKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgICAgIHBhaW50ZXJbMF0uZGlmZnVzZSA9IChpICogMTYpOyAvKiBDcmVhdGVzIHNoYWRlcyBvZiBibHVlICovCiAgICAgICAgICAgIHBhaW50ZXJbMV0uZGlmZnVzZSA9IChpICogMTYpOwogICAgICAgICAgICBwYWludGVyWzJdLmRpZmZ1c2UgPSAoaSAqIDE2KTsKICAgICAgICAgICAgcGFpbnRlclszXS5kaWZmdXNlID0gKGkgKiAxNik7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9UUklBTkdMRVNUUklQLCAyLCBwYWludGVyLCBzaXplb2YocGFpbnRlclswXSkpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJEcmF3UHJpbWl0aXZlVVAgZmFpbGVkICglMDh4KVxuIiwgaHIpOwogICAgICAgIH0KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfU1RFTkNJTEVOQUJMRSwgRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDQyMCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDMwLCAiQ0NXIHRyaWFuZ2xlLCB0d29zaWRlIEZBTFNFLCBjdWxsIGN3LCByZXBsYWNlLCBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMDMwXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxNjAsIDMwMCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDgwLCAiQ1cgdHJpYW5nbGUsIHR3b3NpZGUgRkFMU0UsIGN1bGwgY3csIGN1bGxlZCwgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDA4MFxuIiwgY29sb3IpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgNDIwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwOTAsICJDQ1cgdHJpYW5nbGUsIHR3b3NpZGUgVFJVRSwgY3VsbCBvZmYsIGluY3IsIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwOTBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgMzAwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwMzAsICJDVyB0cmlhbmdsZSwgdHdvc2lkZSBUUlVFLCBjdWxsIG9mZiwgcmVwbGFjZSwgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDAzMFxuIiwgY29sb3IpOwoKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDE2MCwgMTgwKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwODAsICJDQ1cgdHJpYW5nbGUsIHR3b3NpZGUgVFJVRSwgY3VsbCBjY3csIGN1bGxlZCwgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDA4MFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTYwLCA2MCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDMwLCAiQ1cgdHJpYW5nbGUsIHR3b3NpZGUgVFJVRSwgY3VsbCBjY3csIHJlcGxhY2UsIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwMzBcbiIsIGNvbG9yKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA0ODAsIDE4MCk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDkwLCAiQ0NXIHRyaWFuZ2xlLCB0d29zaWRlIFRSVUUsIGN1bGwgY3csIGluY3IsIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwOTBcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDQ4MCwgNjApOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDA4MCwgIkNXIHRyaWFuZ2xlLCB0d29zaWRlIFRSVUUsIGN1bGwgY3csIGN1bGxlZCwgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDA4MFxuIiwgY29sb3IpOwp9CgpzdGF0aWMgdm9pZCB2cG9zX3JlZ2lzdGVyX3Rlc3QoSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlKQp7CiAgICBIUkVTVUxUIGhyOwogICAgRFdPUkQgY29sb3I7CiAgICBjb25zdCBEV09SRCBzaGFkZXJfY29kZVtdID0gewogICAgMHhmZmZmMDMwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfM18wICAgICAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMDAsIDB4OTAwMzEwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRjbCB2UG9zLnh5ICAgICAgICAgICAgICAgICovCiAgICAweDAzMDAwMDAyLCAweDgwMDMwMDAwLCAweDkwNTQxMDAwLCAweGExZmUwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWIgcjAueHksIHZQb3MueHksIGMwLnp3ICAqLwogICAgMHgwMjAwMDAwMSwgMHg4MDBmMDAwMSwgMHhhMGU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92IHIxLCBjMCAgICAgICAgICAgICAgICAgKi8KICAgIDB4MDIwMDAwMDEsIDB4ODAwODAwMDIsIDB4YTA1NTAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiByMi5hLCBjMC55ICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDAxLCAweDgwMDEwMDAyLCAweGEwNTUwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgcjIuciwgYzAueSAgICAgICAgICAgICAqLwogICAgMHgwNDAwMDA1OCwgMHg4MDAyMDAwMiwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMSwgMHg4MDU1MDAwMSwgICAgICAgICAgICAgLyogY21wIHIyLmcsIHIwLngsIHIxLngsIHIxLnkgKi8KICAgIDB4MDQwMDAwNTgsIDB4ODAwNDAwMDIsIDB4ODA1NTAwMDAsIDB4ODAwMDAwMDEsIDB4ODA1NTAwMDEsICAgICAgICAgICAgIC8qIGNtcCByMi5iLCByMC55LCByMS54LCByMS55ICovCiAgICAweDAyMDAwMDAxLCAweDgwMGYwODAwLCAweDgwZTQwMDAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3Ygb0MwLCByMiAgICAgICAgICAgICAgICAqLwogICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBjb25zdCBEV09SRCBzaGFkZXJfZnJhY19jb2RlW10gPSB7CiAgICAweGZmZmYwMzAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18zXzAgICAgICAgICAgICAgICAgICAgICAqLwogICAgMHgwNTAwMDA1MSwgMHhhMDBmMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMwLCAwLjAsIDAuMCwgMC4wLCAwLjAgKi8KICAgIDB4MDIwMDAwMWYsIDB4ODAwMDAwMDAsIDB4OTAwMzEwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRjbCB2UG9zLnh5ICAgICAgICAgICAgICAgICovCiAgICAweDAyMDAwMDAxLCAweDgwMGYwMDAwLCAweGEwZTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3YgcjAsIGMwICAgICAgICAgICAgICAgICAqLwogICAgMHgwMjAwMDAxMywgMHg4MDAzMDAwMCwgMHg5MDU0MTAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJjIHIwLnh5LCB2UG9zLnh5ICAgICAgICAgKi8KICAgIDB4MDIwMDAwMDEsIDB4ODAwZjA4MDAsIDB4ODBlNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdiBvQzAsIHIwICAgICAgICAgICAgICAgICovCiAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgfTsKICAgIElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqc2hhZGVyLCAqc2hhZGVyX2ZyYWM7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZSA9IE5VTEwsICpiYWNrYnVmZmVyOwogICAgY29uc3QgZmxvYXQgcXVhZFtdID0gewogICAgICAgIC0xLjAsICAgLTEuMCwgICAwLjEsICAgIDAuMCwgICAgMC4wLAogICAgICAgICAxLjAsICAgLTEuMCwgICAwLjEsICAgIDEuMCwgICAgMC4wLAogICAgICAgIC0xLjAsICAgIDEuMCwgICAwLjEsICAgIDAuMCwgICAgMS4wLAogICAgICAgICAxLjAsICAgIDEuMCwgICAwLjEsICAgIDEuMCwgICAgMS4wLAogICAgfTsKICAgIEQzRExPQ0tFRF9SRUNUIGxyOwogICAgZmxvYXQgY29uc3RhbnRbNF0gPSB7MS4wLCAwLjAsIDMyMCwgMjQwfTsKICAgIERXT1JEICpwb3M7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmMDAwMGZmLCAwLjAsIDApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyKGRldmljZSwgc2hhZGVyX2NvZGUsICZzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlciBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXJfZnJhY19jb2RlLCAmc2hhZGVyX2ZyYWMpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVQaXhlbFNoYWRlciBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIoZGV2aWNlLCBzaGFkZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlciBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RlZGKGRldmljZSwgRDNERlZGX1hZWik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldEZWRiBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0QmFja0J1ZmZlcihkZXZpY2UsIDAsIDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmYmFja2J1ZmZlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldEJhY2tCdWZmZXIgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlckNvbnN0YW50RihkZXZpY2UsIDAsIGNvbnN0YW50LCAxKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGIGZhaWxlZCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZCwgc2l6ZW9mKGZsb2F0KSAqIDUpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgSURpcmVjdDNERGV2aWNlOV9QcmVzZW50KGRldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAvKiBUaGlzIGhhcyB0byBiZSBwaXhlbCBleGFjdCAqLwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzE5LCAyMzkpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDAwMCwgInZQb3M6IFBpeGVsIDMxOSwyMzkgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDAwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwLCAyMzkpOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgInZQb3M6IFBpeGVsIDMyMCwyMzkgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmYwMFxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzE5LCAyNDApOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgInZQb3M6IFBpeGVsIDMxOSwyNDAgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDBmZlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwLCAyNDApOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmZmZiwgInZQb3M6IFBpeGVsIDMyMCwyNDAgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmZmZlxuIiwgY29sb3IpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVSZW5kZXJUYXJnZXQoZGV2aWNlLCAzMiwgMzIsIEQzREZNVF9YOFI4RzhCOCwgMCwgMCwgVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1cmZhY2UsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVSZW5kZXJUYXJnZXQgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKSB7CiAgICAgICAgY29uc3RhbnRbMl0gPSAxNjsgY29uc3RhbnRbM10gPSAxNjsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoZGV2aWNlLCAwLCBjb25zdGFudCwgMSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlckNvbnN0YW50RiBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclRhcmdldChkZXZpY2UsIDAsIHN1cmZhY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyVGFyZ2V0IGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1RSSUFOR0xFU1RSSVAsIDIsIHF1YWQsIHNpemVvZihmbG9hdCkgKiA1KTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUCBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0RTdXJmYWNlOV9Mb2NrUmVjdChzdXJmYWNlLCAmbHIsIE5VTEwsIEQzRExPQ0tfUkVBRE9OTFkpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEU3VyZmFjZTlfTG9ja1JlY3QgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBwb3MgPSAoRFdPUkQgKikgKCgoQllURSAqKSBsci5wQml0cykgKyAxNCAqIGxyLlBpdGNoICsgMTQgKiBzaXplb2YoRFdPUkQpKTsKICAgIGNvbG9yID0gKnBvcyAmIDB4MDBmZmZmZmY7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMDAwLCAiUGl4ZWwgMTQvMTQgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDAwMFxuIiwgY29sb3IpOwogICAgcG9zID0gKERXT1JEICopICgoKEJZVEUgKikgbHIucEJpdHMpICsgMTQgKiBsci5QaXRjaCArIDE4ICogc2l6ZW9mKERXT1JEKSk7CiAgICBjb2xvciA9ICpwb3MgJiAweDAwZmZmZmZmOwogICAgb2soY29sb3IgPT0gMHgwMDAwZmYwMCwgIlBpeGVsIDE0LzE4IGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMGZmMDBcbiIsIGNvbG9yKTsKICAgIHBvcyA9IChEV09SRCAqKSAoKChCWVRFICopIGxyLnBCaXRzKSArIDE4ICogbHIuUGl0Y2ggKyAxNCAqIHNpemVvZihEV09SRCkpOwogICAgY29sb3IgPSAqcG9zICYgMHgwMGZmZmZmZjsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJQaXhlbCAxOC8xNCBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBwb3MgPSAoRFdPUkQgKikgKCgoQllURSAqKSBsci5wQml0cykgKyAxOCAqIGxyLlBpdGNoICsgMTggKiBzaXplb2YoRFdPUkQpKTsKICAgIGNvbG9yID0gKnBvcyAmIDB4MDBmZmZmZmY7CiAgICBvayhjb2xvciA9PSAweDAwMDBmZmZmLCAiUGl4ZWwgMTgvMTggaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwZmZmZlxuIiwgY29sb3IpOwoKICAgIGhyID0gSURpcmVjdDNEU3VyZmFjZTlfVW5sb2NrUmVjdChzdXJmYWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFN1cmZhY2U5X1VubG9ja1JlY3QgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAvKiBUZXN0IHRoZSBmcmFjdGlvbiB2YWx1ZSBvZiB2UG9zLiBUaGlzIGlzIHRlc3RlZCB3aXRoIHRoZSBvZmZzY3JlZW4gdGFyZ2V0IGFuZCBub3QgdGhlIGJhY2tidWZmZXIgdG8KICAgICAqIGhhdmUgZnVsbCBjb250cm9sIG92ZXIgdGhlIG11bHRpc2FtcGxpbmcgc2V0dGluZyBpbnNpZGUgdGhpcyB0ZXN0CiAgICAgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIHNoYWRlcl9mcmFjKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UGl4ZWxTaGFkZXIgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKSB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKGRldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmMDAwMGZmLCAwLjAsIDApOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfVFJJQU5HTEVTVFJJUCwgMiwgcXVhZCwgc2l6ZW9mKGZsb2F0KSAqIDUpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyVGFyZ2V0KGRldmljZSwgMCwgYmFja2J1ZmZlcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclRhcmdldCBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNEU3VyZmFjZTlfTG9ja1JlY3Qoc3VyZmFjZSwgJmxyLCBOVUxMLCBEM0RMT0NLX1JFQURPTkxZKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFN1cmZhY2U5X0xvY2tSZWN0IGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgcG9zID0gKERXT1JEICopICgoKEJZVEUgKikgbHIucEJpdHMpICsgMTQgKiBsci5QaXRjaCArIDE0ICogc2l6ZW9mKERXT1JEKSk7CiAgICBjb2xvciA9ICpwb3MgJiAweDAwZmZmZmZmOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDAwMCwgInZQb3MgZnJhY3Rpb24gdGVzdCBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMDAwXG4iLCBjb2xvcik7CgogICAgaHIgPSBJRGlyZWN0M0RTdXJmYWNlOV9VbmxvY2tSZWN0KHN1cmZhY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEU3VyZmFjZTlfVW5sb2NrUmVjdCBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlcihkZXZpY2UsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRQaXhlbFNoYWRlciBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBJRGlyZWN0M0RQaXhlbFNoYWRlcjlfUmVsZWFzZShzaGFkZXIpOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyX2ZyYWMpOwogICAgaWYoc3VyZmFjZSkgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShzdXJmYWNlKTsKICAgIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoYmFja2J1ZmZlcik7Cn0KCnN0YXRpYyB2b2lkIHBvaW50c2l6ZV90ZXN0KElEaXJlY3QzRERldmljZTkgKmRldmljZSkKewogICAgSFJFU1VMVCBocjsKICAgIEQzRENBUFM5IGNhcHM7CiAgICBEM0RNQVRSSVggbWF0cml4OwogICAgRDNETUFUUklYIGlkZW50aXR5OwogICAgZmxvYXQgcHRzaXplLCBwdHNpemVfb3JpZzsKICAgIERXT1JEIGNvbG9yOwoKICAgIGNvbnN0IGZsb2F0IHZlcnRpY2VzW10gPSB7CiAgICAgICAgNjQsICAgICA2NCwgICAgIDAuMSwKICAgICAgICAxMjgsICAgIDY0LCAgICAgMC4xLAogICAgICAgIDE5MiwgICAgNjQsICAgICAwLjEsCiAgICAgICAgMjU2LCAgICA2NCwgICAgIDAuMSwKICAgICAgICAzMjAsICAgIDY0LCAgICAgMC4xLAogICAgICAgIDM4NCwgICAgNjQsICAgICAwLjEKICAgIH07CgogICAgLyogVHJhbnNmb3JtcyB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gWy0xLjA7MS4wXXhbLTEuMDsxLjBdIHRvIFswLjA7MC4wXXhbNjQwLjA7NDgwLjBdLiBaIGlzIHVudG91Y2hlZCAqLwogICAgVShtYXRyaXgpLm1bMF1bMF0gPSAyLjAvNjQwLjA7IFUobWF0cml4KS5tWzFdWzBdID0gMC4wOyAgICAgICBVKG1hdHJpeCkubVsyXVswXSA9IDAuMDsgICBVKG1hdHJpeCkubVszXVswXSA9LTEuMDsKICAgIFUobWF0cml4KS5tWzBdWzFdID0gMC4wOyAgICAgICBVKG1hdHJpeCkubVsxXVsxXSA9LTIuMC80ODAuMDsgVShtYXRyaXgpLm1bMl1bMV0gPSAwLjA7ICAgVShtYXRyaXgpLm1bM11bMV0gPSAxLjA7CiAgICBVKG1hdHJpeCkubVswXVsyXSA9IDAuMDsgICAgICAgVShtYXRyaXgpLm1bMV1bMl0gPSAwLjA7ICAgICAgIFUobWF0cml4KS5tWzJdWzJdID0gMS4wOyAgIFUobWF0cml4KS5tWzNdWzJdID0gMC4wOwogICAgVShtYXRyaXgpLm1bMF1bM10gPSAwLjA7ICAgICAgIFUobWF0cml4KS5tWzFdWzNdID0gMC4wOyAgICAgICBVKG1hdHJpeCkubVsyXVszXSA9IDAuMDsgICBVKG1hdHJpeCkubVszXVszXSA9IDEuMDsKCiAgICBVKGlkZW50aXR5KS5tWzBdWzBdID0gMS4wOyAgICAgVShpZGVudGl0eSkubVsxXVswXSA9IDAuMDsgICAgIFUoaWRlbnRpdHkpLm1bMl1bMF0gPSAwLjA7IFUoaWRlbnRpdHkpLm1bM11bMF0gPSAwLjA7CiAgICBVKGlkZW50aXR5KS5tWzBdWzFdID0gMC4wOyAgICAgVShpZGVudGl0eSkubVsxXVsxXSA9IDEuMDsgICAgIFUoaWRlbnRpdHkpLm1bMl1bMV0gPSAwLjA7IFUoaWRlbnRpdHkpLm1bM11bMV0gPSAwLjA7CiAgICBVKGlkZW50aXR5KS5tWzBdWzJdID0gMC4wOyAgICAgVShpZGVudGl0eSkubVsxXVsyXSA9IDAuMDsgICAgIFUoaWRlbnRpdHkpLm1bMl1bMl0gPSAxLjA7IFUoaWRlbnRpdHkpLm1bM11bMl0gPSAwLjA7CiAgICBVKGlkZW50aXR5KS5tWzBdWzNdID0gMC4wOyAgICAgVShpZGVudGl0eSkubVsxXVszXSA9IDAuMDsgICAgIFUoaWRlbnRpdHkpLm1bMl1bM10gPSAwLjA7IFUoaWRlbnRpdHkpLm1bM11bM10gPSAxLjA7CgogICAgbWVtc2V0KCZjYXBzLCAwLCBzaXplb2YoY2FwcykpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldERldmljZUNhcHMoZGV2aWNlLCAmY2Fwcyk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldERldmljZUNhcHMgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoY2Fwcy5NYXhQb2ludFNpemUgPCAzMi4wKSB7CiAgICAgICAgc2tpcCgiTWF4UG9pbnRTaXplIDwgMzIuMCwgc2tpcHBpbmcoTWF4UG9pbnRzaXplID0gJWYpXG4iLCBjYXBzLk1heFBvaW50U2l6ZSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihkZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1RBUkdFVCB8IEQzRENMRUFSX1pCVUZGRVIsIDB4ZmYwMDAwZmYsIDAuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VHJhbnNmb3JtKGRldmljZSwgRDNEVFNfUFJPSkVDVElPTiwgJm1hdHJpeCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybSBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldEZWRihkZXZpY2UsIEQzREZWRl9YWVopOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRGVkYgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfUE9JTlRTSVpFLCAoRFdPUkQgKikgJnB0c2l6ZV9vcmlnKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyU3RhdGUgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgewogICAgICAgIHB0c2l6ZSA9IDE2LjA7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfUE9JTlRTSVpFLCAqKChEV09SRCAqKSAoJnB0c2l6ZSkpKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUChkZXZpY2UsIEQzRFBUX1BPSU5UTElTVCwgMSwgJnZlcnRpY2VzWzBdLCBzaXplb2YoZmxvYXQpICogMyk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgcHRzaXplID0gMzIuMDsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19QT0lOVFNJWkUsICooKERXT1JEICopICgmcHRzaXplKSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfUE9JTlRMSVNULCAxLCAmdmVydGljZXNbM10sIHNpemVvZihmbG9hdCkgKiAzKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmVVUCBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgICAgICBwdHNpemUgPSAzMS41OwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX1BPSU5UU0laRSwgKigoRFdPUkQgKikgKCZwdHNpemUpKSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9QT0lOVExJU1QsIDEsICZ2ZXJ0aWNlc1s2XSwgc2l6ZW9mKGZsb2F0KSAqIDMpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQIGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgICAgIGlmKGNhcHMuTWF4UG9pbnRTaXplID49IDY0LjApIHsKICAgICAgICAgICAgcHRzaXplID0gNjQuMDsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKGRldmljZSwgRDNEUlNfUE9JTlRTSVpFLCAqKChEV09SRCAqKSAoJnB0c2l6ZSkpKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfUE9JTlRMSVNULCAxLCAmdmVydGljZXNbOV0sIHNpemVvZihmbG9hdCkgKiAzKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgICAgIHB0c2l6ZSA9IDYzLjc1OwogICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19QT0lOVFNJWkUsICooKERXT1JEICopICgmcHRzaXplKSkpOwogICAgICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlIGZhaWxlZCwgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAoZGV2aWNlLCBEM0RQVF9QT0lOVExJU1QsIDEsICZ2ZXJ0aWNlc1sxNV0sIHNpemVvZihmbG9hdCkgKiAzKTsKICAgICAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICB9CgogICAgICAgIHB0c2l6ZSA9IDEuMDsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19QT0lOVFNJWkUsICooKERXT1JEICopICgmcHRzaXplKSkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQKGRldmljZSwgRDNEUFRfUE9JTlRMSVNULCAxLCAmdmVydGljZXNbMTJdLCBzaXplb2YoZmxvYXQpICogMyk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAgZmFpbGVkLCBocj0lc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgaHI9JXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDY0LTksIDY0LTkpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgInBTaXplOiBQaXhlbCAoNjQtOSksKDY0LTkpIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDY0LTgsIDY0LTgpOwogICAgdG9kb193aW5lIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJwU2l6ZTogUGl4ZWwgKDY0LTgpLCg2NC04KSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA2NC03LCA2NC03KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJwU2l6ZTogUGl4ZWwgKDY0LTcpLCg2NC03KSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA2NCs3LCA2NCs3KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJwU2l6ZTogUGl4ZWwgKDY0KzcpLCg2NCs3KSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA2NCs4LCA2NCs4KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwU2l6ZTogUGl4ZWwgKDY0KzgpLCg2NCs4KSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCA2NCs5LCA2NCs5KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwU2l6ZTogUGl4ZWwgKDY0KzkpLCg2NCs5KSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTI4LTE3LCA2NC0xNyk7CiAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAicFNpemU6IFBpeGVsICgxMjgtMTcpLCg2NC0xNykgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDBmZlxuIiwgY29sb3IpOwogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMTI4LTE2LCA2NC0xNik7CiAgICB0b2RvX3dpbmUgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInBTaXplOiBQaXhlbCAoMTI4LTE2KSwoNjQtMTYpIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDEyOC0xNSwgNjQtMTUpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInBTaXplOiBQaXhlbCAoMTI4LTE1KSwoNjQtMTUpIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDEyOCsxNSwgNjQrMTUpOwogICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInBTaXplOiBQaXhlbCAoMTI4KzE1KSwoNjQrMTUpIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDEyOCsxNiwgNjQrMTYpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgInBTaXplOiBQaXhlbCAoMTI4KzE2KSwoNjQrMTYpIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDEyOCsxNywgNjQrMTcpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgInBTaXplOiBQaXhlbCAoMTI4KzE3KSwoNjQrMTcpIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxOTItMTcsIDY0LTE3KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwU2l6ZTogUGl4ZWwgKDE5Mi0xNyksKDY0LTE3KSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxOTItMTYsIDY0LTE2KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwU2l6ZTogUGl4ZWwgKDE5Mi0xNiksKDY0LTE2KSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxOTItMTUsIDY0LTE1KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJwU2l6ZTogUGl4ZWwgKDE5Mi0xNSksKDY0LTE1KSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxOTIrMTUsIDY0KzE1KTsKICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJwU2l6ZTogUGl4ZWwgKDE5MisxNSksKDY0KzE1KSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxOTIrMTYsIDY0KzE2KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwU2l6ZTogUGl4ZWwgKDE5MisxNiksKDY0KzE2KSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAxOTIrMTcsIDY0KzE3KTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwU2l6ZTogUGl4ZWwgKDE5MisxNyksKDY0KzE3KSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CgogICAgaWYoY2Fwcy5NYXhQb2ludFNpemUgPj0gNjQuMCkgewogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDI1Ni0zMywgNjQtMzMpOwogICAgICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwU2l6ZTogUGl4ZWwgKDI1Ni0zMyksKDY0LTMzKSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMjU2LTMyLCA2NC0zMik7CiAgICAgICAgdG9kb193aW5lIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJwU2l6ZTogUGl4ZWwgKDI1Ni0zMiksKDY0LTMyKSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMjU2LTMxLCA2NC0zMSk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInBTaXplOiBQaXhlbCAoMjU2LTMxKSwoNjQtMzEpIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAyNTYrMzEsIDY0KzMxKTsKICAgICAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAicFNpemU6IFBpeGVsICgyNTYrMzEpLCg2NCszMSkgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMGZmZmZmZlxuIiwgY29sb3IpOwogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDI1NiszMiwgNjQrMzIpOwogICAgICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwU2l6ZTogUGl4ZWwgKDI1NiszMiksKDY0KzMyKSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMjU2KzMzLCA2NCszMyk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgInBTaXplOiBQaXhlbCAoMjU2KzMzKSwoNjQrMzMpIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKCiAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzg0LTMzLCA2NC0zMyk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgInBTaXplOiBQaXhlbCAoMzg0LTMzKSwoNjQtMzMpIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDAwMDAwZmZcbiIsIGNvbG9yKTsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzODQtMzIsIDY0LTMyKTsKICAgICAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAicFNpemU6IFBpeGVsICgzODQtMzIpLCg2NC0zMikgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDBmZlxuIiwgY29sb3IpOwogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDM4NC0zMSwgNjQtMzEpOwogICAgICAgIG9rKGNvbG9yID09IDB4MDBmZmZmZmYsICJwU2l6ZTogUGl4ZWwgKDM4NC0zMSksKDY0LTMxKSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwZmZmZmZmXG4iLCBjb2xvcik7CiAgICAgICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzg0KzMxLCA2NCszMSk7CiAgICAgICAgb2soY29sb3IgPT0gMHgwMGZmZmZmZiwgInBTaXplOiBQaXhlbCAoMzg0KzMxKSwoNjQrMzEpIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgICAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzODQrMzIsIDY0KzMyKTsKICAgICAgICBvayhjb2xvciA9PSAweDAwMDAwMGZmLCAicFNpemU6IFBpeGVsICgzODQrMzIpLCg2NCszMikgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDBmZlxuIiwgY29sb3IpOwogICAgICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDM4NCszMywgNjQrMzMpOwogICAgICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwU2l6ZTogUGl4ZWwgKDM4NCszMyksKDY0KzMzKSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICB9CgogICAgY29sb3IgPSBnZXRQaXhlbENvbG9yKGRldmljZSwgMzIwLTEsIDY0LTEpOwogICAgb2soY29sb3IgPT0gMHgwMDAwMDBmZiwgInBTaXplOiBQaXhlbCAoMzIwLTEpLCg2NC0xKSBoYXMgY29sb3IgMHglMDh4LCBleHBlY3RlZCAweDAwMDAwMGZmXG4iLCBjb2xvcik7CiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlLCAzMjAtMCwgNjQtMCk7CiAgICBvayhjb2xvciA9PSAweDAwZmZmZmZmLCAicFNpemU6IFBpeGVsICgzMjAtMCksKDY0LTApIGhhcyBjb2xvciAweCUwOHgsIGV4cGVjdGVkIDB4MDBmZmZmZmZcbiIsIGNvbG9yKTsKICAgIGNvbG9yID0gZ2V0UGl4ZWxDb2xvcihkZXZpY2UsIDMyMCsxLCA2NCsxKTsKICAgIG9rKGNvbG9yID09IDB4MDAwMDAwZmYsICJwU2l6ZTogUGl4ZWwgKDMyMCsxKSwoNjQrMSkgaGFzIGNvbG9yIDB4JTA4eCwgZXhwZWN0ZWQgMHgwMDAwMDBmZlxuIiwgY29sb3IpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX1BPSU5UU0laRSwgKigoRFdPUkQgKikgKCZwdHNpemVfb3JpZykpKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgZmFpbGVkIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybShkZXZpY2UsIEQzRFRTX1BST0pFQ1RJT04sICZpZGVudGl0eSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRyYW5zZm9ybSBmYWlsZWQsIGhyPSVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwp9CgpTVEFSVF9URVNUKHZpc3VhbCkKewogICAgSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlX3B0cjsKICAgIEQzRENBUFM5IGNhcHM7CiAgICBIUkVTVUxUIGhyOwogICAgRFdPUkQgY29sb3I7CgogICAgZDNkOV9oYW5kbGUgPSBMb2FkTGlicmFyeUEoImQzZDkuZGxsIik7CiAgICBpZiAoIWQzZDlfaGFuZGxlKQogICAgewogICAgICAgIHNraXAoIkNvdWxkIG5vdCBsb2FkIGQzZDkuZGxsXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZGV2aWNlX3B0ciA9IGluaXRfZDNkOSgpOwogICAgaWYgKCFkZXZpY2VfcHRyKQogICAgewogICAgICAgIHNraXAoIkNyZWF0aW5nIHRoZSBkZXZpY2UgZmFpbGVkXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgSURpcmVjdDNERGV2aWNlOV9HZXREZXZpY2VDYXBzKGRldmljZV9wdHIsICZjYXBzKTsKCiAgICAvKiBDaGVjayBmb3IgdGhlIHJlbGlhYmlsaXR5IG9mIHRoZSByZXR1cm5lZCBkYXRhICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlX3B0ciwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmZmYwMDAwLCAwLjAsIDApOwogICAgaWYoRkFJTEVEKGhyKSkKICAgIHsKICAgICAgICB0cmFjZSgiQ2xlYXIgZmFpbGVkLCBjYW4ndCBhc3N1cmUgY29ycmVjdG5lc3Mgb2YgdGhlIHRlc3QgcmVzdWx0cywgc2tpcHBpbmdcbiIpOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KICAgIElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2VfcHRyLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlX3B0ciwgMSwgMSk7CiAgICBpZihjb2xvciAhPTB4MDBmZjAwMDApCiAgICB7CiAgICAgICAgdHJhY2UoIlNhbml0eSBjaGVjayByZXR1cm5lZCBhbiBpbmNvcnJlY3QgY29sb3IoJTA4eCksIGNhbid0IGFzc3VyZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIHRlc3RzLCBza2lwcGluZ1xuIiwgY29sb3IpOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIoZGV2aWNlX3B0ciwgMCwgTlVMTCwgRDNEQ0xFQVJfVEFSR0VULCAweGZmMDBkZGVlLCAwLjAsIDApOwogICAgaWYoRkFJTEVEKGhyKSkKICAgIHsKICAgICAgICB0cmFjZSgiQ2xlYXIgZmFpbGVkLCBjYW4ndCBhc3N1cmUgY29ycmVjdG5lc3Mgb2YgdGhlIHRlc3QgcmVzdWx0cywgc2tpcHBpbmdcbiIpOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KICAgIElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2VfcHRyLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKCiAgICBjb2xvciA9IGdldFBpeGVsQ29sb3IoZGV2aWNlX3B0ciwgNjM5LCA0NzkpOwogICAgaWYoY29sb3IgIT0gMHgwMDAwZGRlZSkKICAgIHsKICAgICAgICB0cmFjZSgiU2FuaXR5IGNoZWNrIHJldHVybmVkIGFuIGluY29ycmVjdCBjb2xvciglMDh4KSwgY2FuJ3QgYXNzdXJlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgdGVzdHMsIHNraXBwaW5nXG4iLCBjb2xvcik7CiAgICAgICAgZ290byBjbGVhbnVwOwogICAgfQoKICAgIC8qIE5vdyBleGVjdXRlIHRoZSByZWFsIHRlc3RzICovCiAgICBsaWdodGluZ190ZXN0KGRldmljZV9wdHIpOwogICAgY2xlYXJfdGVzdChkZXZpY2VfcHRyKTsKICAgIGZvZ190ZXN0KGRldmljZV9wdHIpOwogICAgaWYoY2Fwcy5UZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19DVUJFTUFQKQogICAgewogICAgICAgIHRlc3RfY3ViZV93cmFwKGRldmljZV9wdHIpOwogICAgfSBlbHNlIHsKICAgICAgICBza2lwKCJObyBjdWJlIHRleHR1cmUgc3VwcG9ydFxuIik7CiAgICB9CiAgICB6X3JhbmdlX3Rlc3QoZGV2aWNlX3B0cik7CiAgICBpZihjYXBzLlRleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX01JUE1BUCkKICAgIHsKICAgICAgICBtYXhtaXBfdGVzdChkZXZpY2VfcHRyKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBza2lwKCJObyBtaXBtYXAgc3VwcG9ydFxuIik7CiAgICB9CiAgICBvZmZzY3JlZW5fdGVzdChkZXZpY2VfcHRyKTsKICAgIGFscGhhX3Rlc3QoZGV2aWNlX3B0cik7CiAgICByZWxlYXNlX2J1ZmZlcl90ZXN0KGRldmljZV9wdHIpOwogICAgZmxvYXRfdGV4dHVyZV90ZXN0KGRldmljZV9wdHIpOwogICAgZzE2cjE2X3RleHR1cmVfdGVzdChkZXZpY2VfcHRyKTsKICAgIHRleHR1cmVfdHJhbnNmb3JtX2ZsYWdzX3Rlc3QoZGV2aWNlX3B0cik7CiAgICBhdXRvZ2VuX21pcG1hcF90ZXN0KGRldmljZV9wdHIpOwogICAgZml4ZWRfZnVuY3Rpb25fZGVjbF90ZXN0KGRldmljZV9wdHIpOwogICAgY29uZGl0aW9uYWxfbnAyX3JlcGVhdF90ZXN0KGRldmljZV9wdHIpOwogICAgZml4ZWRfZnVuY3Rpb25fYnVtcG1hcF90ZXN0KGRldmljZV9wdHIpOwogICAgaWYoY2Fwcy5TdGVuY2lsQ2FwcyAmIEQzRFNURU5DSUxDQVBTX1RXT1NJREVEKSB7CiAgICAgICAgc3RlbmNpbF9jdWxsX3Rlc3QoZGV2aWNlX3B0cik7CiAgICB9IGVsc2UgewogICAgICAgIHNraXAoIk5vIHR3byBzaWRlZCBzdGVuY2lsIHN1cHBvcnRcbiIpOwogICAgfQogICAgcG9pbnRzaXplX3Rlc3QoZGV2aWNlX3B0cik7CgogICAgaWYgKGNhcHMuVmVydGV4U2hhZGVyVmVyc2lvbiA+PSBEM0RWU19WRVJTSU9OKDEsIDEpKQogICAgewogICAgICAgIHRlc3RfY29uc3RhbnRfY2xhbXBfdnMoZGV2aWNlX3B0cik7CiAgICAgICAgdGVzdF9jb21wYXJlX2luc3RydWN0aW9ucyhkZXZpY2VfcHRyKTsKICAgIH0KICAgIGVsc2Ugc2tpcCgiTm8gdnNfMV8xIHN1cHBvcnRcbiIpOwoKICAgIGlmIChjYXBzLlZlcnRleFNoYWRlclZlcnNpb24gPj0gRDNEVlNfVkVSU0lPTigyLCAwKSkKICAgIHsKICAgICAgICB0ZXN0X21vdmEoZGV2aWNlX3B0cik7CiAgICAgICAgaWYgKGNhcHMuVmVydGV4U2hhZGVyVmVyc2lvbiA+PSBEM0RWU19WRVJTSU9OKDMsIDApKSB7CiAgICAgICAgICAgIHRlc3RfdnNoYWRlcl9pbnB1dChkZXZpY2VfcHRyKTsKICAgICAgICAgICAgdGVzdF92c2hhZGVyX2Zsb2F0MTYoZGV2aWNlX3B0cik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2tpcCgiTm8gdnNfM18wIHN1cHBvcnRcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2Ugc2tpcCgiTm8gdnNfMl8wIHN1cHBvcnRcbiIpOwoKICAgIGlmIChjYXBzLlZlcnRleFNoYWRlclZlcnNpb24gPj0gRDNEVlNfVkVSU0lPTigxLCAxKSAmJiBjYXBzLlBpeGVsU2hhZGVyVmVyc2lvbiA+PSBEM0RQU19WRVJTSU9OKDEsIDEpKQogICAgewogICAgICAgIGZvZ193aXRoX3NoYWRlcl90ZXN0KGRldmljZV9wdHIpOwogICAgICAgIGZvZ19zcmdid3JpdGVfdGVzdChkZXZpY2VfcHRyKTsKICAgIH0KICAgIGVsc2Ugc2tpcCgiTm8gdnNfMV8xIGFuZCBwc18xXzEgc3VwcG9ydFxuIik7CgogICAgaWYgKGNhcHMuUGl4ZWxTaGFkZXJWZXJzaW9uID49IEQzRFBTX1ZFUlNJT04oMSwgMSkpCiAgICB7CiAgICAgICAgdGV4YmVtX3Rlc3QoZGV2aWNlX3B0cik7CiAgICAgICAgdGV4ZGVwdGhfdGVzdChkZXZpY2VfcHRyKTsKICAgICAgICB0ZXhraWxsX3Rlc3QoZGV2aWNlX3B0cik7CiAgICAgICAgeDhsOHY4dThfdGVzdChkZXZpY2VfcHRyKTsKICAgICAgICBpZiAoY2Fwcy5QaXhlbFNoYWRlclZlcnNpb24gPj0gRDNEUFNfVkVSU0lPTigxLCA0KSkgewogICAgICAgICAgICBjb25zdGFudF9jbGFtcF9wc190ZXN0KGRldmljZV9wdHIpOwogICAgICAgICAgICBjbmRfdGVzdChkZXZpY2VfcHRyKTsKICAgICAgICAgICAgaWYgKGNhcHMuUGl4ZWxTaGFkZXJWZXJzaW9uID49IEQzRFBTX1ZFUlNJT04oMywgMCkpIHsKICAgICAgICAgICAgICAgIG5lc3RlZF9sb29wX3Rlc3QoZGV2aWNlX3B0cik7CiAgICAgICAgICAgICAgICBmaXhlZF9mdW5jdGlvbl92YXJ5aW5nX3Rlc3QoZGV2aWNlX3B0cik7CiAgICAgICAgICAgICAgICB2RmFjZV9yZWdpc3Rlcl90ZXN0KGRldmljZV9wdHIpOwogICAgICAgICAgICAgICAgdnBvc19yZWdpc3Rlcl90ZXN0KGRldmljZV9wdHIpOwogICAgICAgICAgICAgICAgaWYoY2Fwcy5WZXJ0ZXhTaGFkZXJWZXJzaW9uID49IEQzRFZTX1ZFUlNJT04oMywgMCkpIHsKICAgICAgICAgICAgICAgICAgICB2c2hhZGVyX3ZlcnNpb25fdmFyeWluZ190ZXN0KGRldmljZV9wdHIpOwogICAgICAgICAgICAgICAgICAgIHBzaGFkZXJfdmVyc2lvbl92YXJ5aW5nX3Rlc3QoZGV2aWNlX3B0cik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNraXAoIk5vIHZzXzNfMCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNraXAoIk5vIHBzXzNfMCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2Ugc2tpcCgiTm8gcHNfMV8xIHN1cHBvcnRcbiIpOwoKY2xlYW51cDoKICAgIGlmKGRldmljZV9wdHIpIHsKICAgICAgICBVTE9ORyByZWY7CgogICAgICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyBwcmVzZW50X3BhcmFtZXRlcnM7CiAgICAgICAgSURpcmVjdDNEU3dhcENoYWluOSAqc3dhcGNoYWluOwogICAgICAgIElEaXJlY3QzRERldmljZTlfR2V0U3dhcENoYWluKGRldmljZV9wdHIsIDAsICZzd2FwY2hhaW4pOwogICAgICAgIElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0UHJlc2VudFBhcmFtZXRlcnMoc3dhcGNoYWluLCAmcHJlc2VudF9wYXJhbWV0ZXJzKTsKICAgICAgICBJRGlyZWN0M0RTd2FwQ2hhaW45X1JlbGVhc2Uoc3dhcGNoYWluKTsKICAgICAgICByZWYgPSBJRGlyZWN0M0REZXZpY2U5X1JlbGVhc2UoZGV2aWNlX3B0cik7CiAgICAgICAgRGVzdHJveVdpbmRvdyhwcmVzZW50X3BhcmFtZXRlcnMuaERldmljZVdpbmRvdyk7CiAgICAgICAgb2socmVmID09IDAsICJUaGUgZGV2aWNlIHdhcyBub3QgcHJvcGVybHkgZnJlZWQ6IHJlZmNvdW50ICV1XG4iLCByZWYpOwogICAgfQp9Cg==