LyoKICogQ29weXJpZ2h0IChDKSAyMDA2IFZpdGFsaXkgTWFyZ29sZW4KICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzIFJvYmluc29uCiAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFN0ZWZhbiBE9nNpbmdlcihGb3IgQ29kZVdlYXZlcnMpCiAqIENvcHlyaWdodCAyMDA3IEhlbnJpIFZlcmJlZXQKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2RlZmluZSBDT0JKTUFDUk9TCiNpbmNsdWRlIDxkM2Q5Lmg+CiNpbmNsdWRlIDxkeGVycjkuaD4KI2luY2x1ZGUgIndpbmUvdGVzdC5oIgoKc3RhdGljIElEaXJlY3QzRDkgKihXSU5BUEkgKnBEaXJlY3QzRENyZWF0ZTkpKFVJTlQpOwoKc3RhdGljIGludCBnZXRfcmVmY291bnQoSVVua25vd24gKm9iamVjdCkKewogICAgSVVua25vd25fQWRkUmVmKCBvYmplY3QgKTsKICAgIHJldHVybiBJVW5rbm93bl9SZWxlYXNlKCBvYmplY3QgKTsKfQoKI2RlZmluZSBDSEVDS19DQUxMKHIsYyxkLHJjKSBcCiAgICBpZiAoU1VDQ0VFREVEKHIpKSB7XAogICAgICAgIGludCB0bXAxID0gZ2V0X3JlZmNvdW50KCAoSVVua25vd24gKilkICk7IFwKICAgICAgICBpbnQgcmNfbmV3ID0gcmM7IFwKICAgICAgICBvayh0bXAxID09IHJjX25ldywgIkludmFsaWQgcmVmY291bnQuIEV4cGVjdGVkICVkIGdvdCAlZFxuIiwgcmNfbmV3LCB0bXAxKTsgXAogICAgfSBlbHNlIHtcCiAgICAgICAgdHJhY2UoIiVzIGZhaWxlZDogJXNcbiIsIGMsIERYR2V0RXJyb3JTdHJpbmc5KHIpKTsgXAogICAgfQoKI2RlZmluZSBDSEVDS19SRUxFQVNFKG9iaixkLHJjKSBcCiAgICBpZiAob2JqKSB7IFwKICAgICAgICBpbnQgdG1wMSwgcmNfbmV3ID0gcmM7IFwKICAgICAgICBJVW5rbm93bl9SZWxlYXNlKCBvYmogKTsgXAogICAgICAgIHRtcDEgPSBnZXRfcmVmY291bnQoIChJVW5rbm93biAqKWQgKTsgXAogICAgICAgIG9rKHRtcDEgPT0gcmNfbmV3LCAiSW52YWxpZCByZWZjb3VudC4gRXhwZWN0ZWQgJWQgZ290ICVkXG4iLCByY19uZXcsIHRtcDEpOyBcCiAgICB9CgojZGVmaW5lIENIRUNLX1JFRkNPVU5UKG9iaixyYykgXAogICAgeyBcCiAgICAgICAgaW50IHJjX25ldyA9IHJjOyBcCiAgICAgICAgaW50IGNvdW50ID0gZ2V0X3JlZmNvdW50KCAoSVVua25vd24gKilvYmogKTsgXAogICAgICAgIG9rKGNvdW50ID09IHJjX25ldywgIkludmFsaWQgcmVmY291bnQuIEV4cGVjdGVkICVkIGdvdCAlZFxuIiwgcmNfbmV3LCBjb3VudCk7IFwKICAgIH0KCiNkZWZpbmUgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVChvYmoscmMpIFwKICAgIHsgXAogICAgICAgIGludCByY19uZXcgPSByYzsgXAogICAgICAgIGludCBjb3VudCA9IElVbmtub3duX1JlbGVhc2UoIChJVW5rbm93biAqKW9iaiApOyBcCiAgICAgICAgb2soY291bnQgPT0gcmNfbmV3LCAiSW52YWxpZCByZWZjb3VudC4gRXhwZWN0ZWQgJWQgZ290ICVkXG4iLCByY19uZXcsIGNvdW50KTsgXAogICAgfQoKI2RlZmluZSBDSEVDS19BRERSRUZfUkVGQ09VTlQob2JqLHJjKSBcCiAgICB7IFwKICAgICAgICBpbnQgcmNfbmV3ID0gcmM7IFwKICAgICAgICBpbnQgY291bnQgPSBJVW5rbm93bl9BZGRSZWYoIChJVW5rbm93biAqKW9iaiApOyBcCiAgICAgICAgb2soY291bnQgPT0gcmNfbmV3LCAiSW52YWxpZCByZWZjb3VudC4gRXhwZWN0ZWQgJWQgZ290ICVkXG4iLCByY19uZXcsIGNvdW50KTsgXAogICAgfQoKI2RlZmluZSBDSEVDS19TVVJGQUNFX0NPTlRBSU5FUihvYmosaWlkLGV4cGVjdGVkKSBcCiAgICB7IFwKICAgICAgICB2b2lkICpjb250YWluZXJfcHRyID0gKHZvaWQgKikweDEzMzdjMGQzOyBcCiAgICAgICAgaHIgPSBJRGlyZWN0M0RTdXJmYWNlOV9HZXRDb250YWluZXIob2JqLCAmaWlkLCAmY29udGFpbmVyX3B0cik7IFwKICAgICAgICBvayhTVUNDRUVERUQoaHIpICYmIGNvbnRhaW5lcl9wdHIgPT0gZXhwZWN0ZWQsICJHZXRDb250YWluZXIgcmV0dXJuZWQ6IGhyICUjeCwgY29udGFpbmVyX3B0ciAlcC4gIiBcCiAgICAgICAgICAgICJFeHBlY3RlZCBociAlI3gsIGNvbnRhaW5lcl9wdHIgJXBcbiIsIGhyLCBjb250YWluZXJfcHRyLCBTX09LLCBleHBlY3RlZCk7IFwKICAgICAgICBpZiAoY29udGFpbmVyX3B0ciAmJiBjb250YWluZXJfcHRyICE9ICh2b2lkICopMHgxMzM3YzBkMykgSVVua25vd25fUmVsZWFzZSgoSVVua25vd24gKiljb250YWluZXJfcHRyKTsgXAogICAgfQoKc3RhdGljIHZvaWQgY2hlY2tfbWlwbWFwX2xldmVscygKICAgIElEaXJlY3QzRERldmljZTkqIGRldmljZSwgCiAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBjb3VudCkgCnsKCiAgICBJRGlyZWN0M0RCYXNlVGV4dHVyZTkqIHRleHR1cmUgPSBOVUxMOwogICAgSFJFU1VMVCBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZSggZGV2aWNlLCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCAKICAgICAgICBEM0RGTVRfWDhSOEc4QjgsIEQzRFBPT0xfREVGQVVMVCwgKElEaXJlY3QzRFRleHR1cmU5KiopICZ0ZXh0dXJlLCBOVUxMICk7CiAgICAgICAKICAgIGlmIChTVUNDRUVERUQoaHIpKSB7CiAgICAgICAgRFdPUkQgbGV2ZWxzID0gSURpcmVjdDNEQmFzZVRleHR1cmU5X0dldExldmVsQ291bnQodGV4dHVyZSk7CiAgICAgICAgb2sobGV2ZWxzID09IGNvdW50LCAiSW52YWxpZCBsZXZlbCBjb3VudC4gRXhwZWN0ZWQgJWQgZ290ICV1XG4iLCBjb3VudCwgbGV2ZWxzKTsKICAgIH0gZWxzZSAKICAgICAgICB0cmFjZSgiQ3JlYXRlVGV4dHVyZSBmYWlsZWQ6ICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGlmICh0ZXh0dXJlKSBJVW5rbm93bl9SZWxlYXNlKCB0ZXh0dXJlICk7Cn0KCnN0YXRpYyB2b2lkIHRlc3RfbWlwbWFwX2xldmVscyh2b2lkKQp7CgogICAgSFJFU1VMVCAgICAgICAgICAgICAgIGhyOwogICAgSFdORCAgICAgICAgICAgICAgICAgIGh3bmQgPSBOVUxMOwoKICAgIElEaXJlY3QzRDkgICAgICAgICAgICAqcEQzZCA9IE5VTEw7CiAgICBJRGlyZWN0M0REZXZpY2U5ICAgICAgKnBEZXZpY2UgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTIGQzZHBwOwogICAgRDNERElTUExBWU1PREUgICAgICAgIGQzZGRtOwogCiAgICBwRDNkID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhwRDNkICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZDNkOV90ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAgICBvayhod25kICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICBpZiAoIXBEM2QgfHwgIWh3bmQpIGdvdG8gY2xlYW51cDsKCiAgICBJRGlyZWN0M0Q5X0dldEFkYXB0ZXJEaXNwbGF5TW9kZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCAmZDNkZG0gKTsKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuV2luZG93ZWQgICAgICAgICA9IFRSVUU7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfTlVMTFJFRiwgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5RGV2aWNlICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZiAoRkFJTEVEKGhyKSkgZ290byBjbGVhbnVwOwoKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMzIsIDMyLCA2KTsKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMjU2LCAxLCA5KTsKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMSwgMjU2LCA5KTsKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMSwgMSwgMSk7CgogICAgY2xlYW51cDoKICAgIGlmIChwRDNkKSAgICAgSVVua25vd25fUmVsZWFzZSggcEQzZCApOwogICAgaWYgKHBEZXZpY2UpICBJVW5rbm93bl9SZWxlYXNlKCBwRGV2aWNlICk7CiAgICBEZXN0cm95V2luZG93KCBod25kICk7Cn0KCnN0YXRpYyB2b2lkIHRlc3Rfc3dhcGNoYWluKHZvaWQpCnsKICAgIEhSRVNVTFQgICAgICAgICAgICAgICAgICAgICAgaHI7CiAgICBIV05EICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0Q5ICAgICAgICAgICAgICAgICAgKnBEM2QgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0REZXZpY2U5ICAgICAgICAgICAgKnBEZXZpY2UgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjEgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjIgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjMgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpblggICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgKmJhY2tidWZmZXIgICAgICAgICA9IE5VTEw7CiAgICBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgICAgICAgIGQzZHBwOwogICAgRDNERElTUExBWU1PREUgICAgICAgICAgICAgICBkM2RkbTsKCiAgICBwRDNkID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhwRDNkICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZDNkOV90ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAgICBvayhod25kICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICBpZiAoIXBEM2QgfHwgIWh3bmQpIGdvdG8gY2xlYW51cDsKCiAgICBJRGlyZWN0M0Q5X0dldEFkYXB0ZXJEaXNwbGF5TW9kZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCAmZDNkZG0gKTsKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuV2luZG93ZWQgICAgICAgICA9IFRSVUU7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKICAgIGQzZHBwLkJhY2tCdWZmZXJDb3VudCAgPSAwOwoKICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9OVUxMUkVGLCBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZkM2RwcCwgJnBEZXZpY2UgKTsKICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDlEZXZpY2UgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmIChGQUlMRUQoaHIpKSBnb3RvIGNsZWFudXA7CgogICAgLyogQ2hlY2sgaWYgdGhlIGJhY2sgYnVmZmVyIGNvdW50IHdhcyBtb2RpZmllZCAqLwogICAgb2soZDNkcHAuQmFja0J1ZmZlckNvdW50ID09IDEsICJUaGUgYmFjayBidWZmZXIgY291bnQgaW4gdGhlIHByZXNlbnRwYXJhbXMgc3RydWN0IGlzICVkXG4iLCBkM2RwcC5CYWNrQnVmZmVyQ291bnQpOwoKICAgIC8qIEdldCB0aGUgaW1wbGljaXQgc3dhcGNoYWluICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0U3dhcENoYWluKHBEZXZpY2UsIDAsICZzd2FwY2hhaW4wKTsKICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gZ2V0IHRoZSBpbXBpY2l0IHN3YXBjaGFpbiAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoc3dhcGNoYWluMCkgSURpcmVjdDNEU3dhcENoYWluOV9SZWxlYXNlKHN3YXBjaGFpbjApOwoKICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgYmFjayBidWZmZXIgKi8KICAgIGhyID0gSURpcmVjdDNEU3dhcENoYWluOV9HZXRCYWNrQnVmZmVyKHN3YXBjaGFpbjAsIDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmYmFja2J1ZmZlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGdldCB0aGUgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKGJhY2tidWZmZXIgIT0gTlVMTCwgIlRoZSBiYWNrIGJ1ZmZlciBpcyBOVUxMXG4iKTsKICAgIGlmKGJhY2tidWZmZXIpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoYmFja2J1ZmZlcik7CgogICAgLyogVHJ5IHRvIGdldCBhIG5vbmV4aXN0YW50IHN3YXBjaGFpbiAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFN3YXBDaGFpbihwRGV2aWNlLCAxLCAmc3dhcGNoYWluWCk7CiAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsICJHZXRTd2FwQ2hhaW4gb24gYW4gbm9uZXhpc3RlbnQgc3dhcGNoYWluIHJldHVybmVkICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhzd2FwY2hhaW5YID09IE5VTEwsICJTd2FwY2hhaW4gMSBpcyAlcFxuIiwgc3dhcGNoYWluWCk7CiAgICBpZihzd2FwY2hhaW5YKSBJRGlyZWN0M0RTd2FwQ2hhaW45X1JlbGVhc2Uoc3dhcGNoYWluWCk7CgogICAgLyogQ3JlYXRlIGEgYnVuY2ggb2Ygc3dhcGNoYWlucyAqLwogICAgZDNkcHAuQmFja0J1ZmZlckNvdW50ID0gMDsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKHBEZXZpY2UsICZkM2RwcCwgJnN3YXBjaGFpbjEpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBjcmVhdGUgYSBzd2FwY2hhaW4gKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKGQzZHBwLkJhY2tCdWZmZXJDb3VudCA9PSAxLCAiVGhlIGJhY2sgYnVmZmVyIGNvdW50IGluIHRoZSBwcmVzZW50cGFyYW1zIHN0cnVjdCBpcyAlZFxuIiwgZDNkcHAuQmFja0J1ZmZlckNvdW50KTsKCiAgICBkM2RwcC5CYWNrQnVmZmVyQ291bnQgID0gMTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKHBEZXZpY2UsICZkM2RwcCwgJnN3YXBjaGFpbjIpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBjcmVhdGUgYSBzd2FwY2hhaW4gKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBkM2RwcC5CYWNrQnVmZmVyQ291bnQgID0gMjsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKHBEZXZpY2UsICZkM2RwcCwgJnN3YXBjaGFpbjMpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBjcmVhdGUgYSBzd2FwY2hhaW4gKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpIHsKICAgICAgICAvKiBTd2FwY2hhaW4gMywgY3JlYXRlZCB3aXRoIGJhY2tidWZmZXJjb3VudCAyICovCiAgICAgICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICAgICAgaHIgPSBJRGlyZWN0M0RTd2FwQ2hhaW45X0dldEJhY2tCdWZmZXIoc3dhcGNoYWluMywgMCwgMCwgJmJhY2tidWZmZXIpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gZ2V0IHRoZSAxc3QgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBvayhiYWNrYnVmZmVyICE9IE5VTEwgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmLCAiVGhlIGJhY2sgYnVmZmVyIGlzICVwXG4iLCBiYWNrYnVmZmVyKTsKICAgICAgICBpZihiYWNrYnVmZmVyICYmIGJhY2tidWZmZXIgIT0gKHZvaWQgKikgMHhkZWFkYmVlZikgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShiYWNrYnVmZmVyKTsKCiAgICAgICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICAgICAgaHIgPSBJRGlyZWN0M0RTd2FwQ2hhaW45X0dldEJhY2tCdWZmZXIoc3dhcGNoYWluMywgMSwgMCwgJmJhY2tidWZmZXIpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gZ2V0IHRoZSAybmQgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBvayhiYWNrYnVmZmVyICE9IE5VTEwgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmLCAiVGhlIGJhY2sgYnVmZmVyIGlzICVwXG4iLCBiYWNrYnVmZmVyKTsKICAgICAgICBpZihiYWNrYnVmZmVyICYmIGJhY2tidWZmZXIgIT0gKHZvaWQgKikgMHhkZWFkYmVlZikgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShiYWNrYnVmZmVyKTsKCiAgICAgICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICAgICAgaHIgPSBJRGlyZWN0M0RTd2FwQ2hhaW45X0dldEJhY2tCdWZmZXIoc3dhcGNoYWluMywgMiwgMCwgJmJhY2tidWZmZXIpOwogICAgICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIkdldEJhY2tCdWZmZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgb2soYmFja2J1ZmZlciA9PSAodm9pZCAqKSAweGRlYWRiZWVmLCAiVGhlIGJhY2sgYnVmZmVyIHBvaW50ZXIgd2FzIG1vZGlmaWVkICglcClcbiIsIGJhY2tidWZmZXIpOwogICAgICAgIGlmKGJhY2tidWZmZXIgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwoKICAgICAgICBiYWNrYnVmZmVyID0gKHZvaWQgKikgMHhkZWFkYmVlZjsKICAgICAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4zLCAzLCAwLCAmYmFja2J1ZmZlcik7CiAgICAgICAgb2soRkFJTEVEKGhyKSwgIkZhaWxlZCB0byBnZXQgdGhlIGJhY2sgYnVmZmVyICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgb2soYmFja2J1ZmZlciA9PSAodm9pZCAqKSAweGRlYWRiZWVmLCAiVGhlIGJhY2sgYnVmZmVyIHBvaW50ZXIgd2FzIG1vZGlmaWVkICglcClcbiIsIGJhY2tidWZmZXIpOwogICAgICAgIGlmKGJhY2tidWZmZXIgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwogICAgfQoKICAgIC8qIENoZWNrIHRoZSBiYWNrIGJ1ZmZlcnMgb2YgdGhlIHN3YXBjaGFpbnMgKi8KICAgIC8qIFN3YXBjaGFpbiAxLCBjcmVhdGVkIHdpdGggYmFja2J1ZmZlcmNvdW50IDAgKi8KICAgIGhyID0gSURpcmVjdDNEU3dhcENoYWluOV9HZXRCYWNrQnVmZmVyKHN3YXBjaGFpbjEsIDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmYmFja2J1ZmZlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGdldCB0aGUgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKGJhY2tidWZmZXIgIT0gTlVMTCwgIlRoZSBiYWNrIGJ1ZmZlciBpcyBOVUxMICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihiYWNrYnVmZmVyKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwoKICAgIGJhY2tidWZmZXIgPSAodm9pZCAqKSAweGRlYWRiZWVmOwogICAgaHIgPSBJRGlyZWN0M0RTd2FwQ2hhaW45X0dldEJhY2tCdWZmZXIoc3dhcGNoYWluMSwgMSwgMCwgJmJhY2tidWZmZXIpOwogICAgb2soRkFJTEVEKGhyKSwgIkZhaWxlZCB0byBnZXQgdGhlIGJhY2sgYnVmZmVyICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhiYWNrYnVmZmVyID09ICh2b2lkICopIDB4ZGVhZGJlZWYsICJUaGUgYmFjayBidWZmZXIgcG9pbnRlciB3YXMgbW9kaWZpZWQgKCVwKVxuIiwgYmFja2J1ZmZlcik7CiAgICBpZihiYWNrYnVmZmVyICYmIGJhY2tidWZmZXIgIT0gKHZvaWQgKikgMHhkZWFkYmVlZikgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShiYWNrYnVmZmVyKTsKCiAgICAvKiBTd2FwY2hhaW4gMiAtIGNyZWF0ZWQgd2l0aCBiYWNrYnVmZmVyY291bnQgMSAqLwogICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4yLCAwLCAwLCAmYmFja2J1ZmZlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGdldCB0aGUgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKGJhY2tidWZmZXIgIT0gTlVMTCAmJiBiYWNrYnVmZmVyICE9ICh2b2lkICopIDB4ZGVhZGJlZWYsICJUaGUgYmFjayBidWZmZXIgaXMgJXBcbiIsIGJhY2tidWZmZXIpOwogICAgaWYoYmFja2J1ZmZlciAmJiBiYWNrYnVmZmVyICE9ICh2b2lkICopIDB4ZGVhZGJlZWYpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoYmFja2J1ZmZlcik7CgogICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4yLCAxLCAwLCAmYmFja2J1ZmZlcik7CiAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsICJHZXRCYWNrQnVmZmVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgb2soYmFja2J1ZmZlciA9PSAodm9pZCAqKSAweGRlYWRiZWVmLCAiVGhlIGJhY2sgYnVmZmVyIHBvaW50ZXIgd2FzIG1vZGlmaWVkICglcClcbiIsIGJhY2tidWZmZXIpOwogICAgaWYoYmFja2J1ZmZlciAmJiBiYWNrYnVmZmVyICE9ICh2b2lkICopIDB4ZGVhZGJlZWYpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoYmFja2J1ZmZlcik7CgogICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4yLCAyLCAwLCAmYmFja2J1ZmZlcik7CiAgICBvayhGQUlMRUQoaHIpLCAiRmFpbGVkIHRvIGdldCB0aGUgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKGJhY2tidWZmZXIgPT0gKHZvaWQgKikgMHhkZWFkYmVlZiwgIlRoZSBiYWNrIGJ1ZmZlciBwb2ludGVyIHdhcyBtb2RpZmllZCAoJXApXG4iLCBiYWNrYnVmZmVyKTsKICAgIGlmKGJhY2tidWZmZXIgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwoKICAgIC8qIFRyeSBnZXRTd2FwQ2hhaW4gb24gYSBtYW51YWxseSBjcmVhdGVkIHN3YXBjaGFpbgogICAgICogaXQgc2hvdWxkIGZhaWwsIGFwcGFyZW50bHkgR2V0U3dhcENoYWluIG9ubHkgcmV0dXJucyBpbXBsaWNpdCBzd2FwY2hhaW5zCiAgICAgKi8KICAgIHN3YXBjaGFpblggPSAodm9pZCAqKSAweGRlYWRiZWVmOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFN3YXBDaGFpbihwRGV2aWNlLCAxLCAmc3dhcGNoYWluWCk7CiAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsICJGYWlsZWQgdG8gZ2V0IHRoZSBzZWNvbmQgc3dhcGNoYWluICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhzd2FwY2hhaW5YID09IE5VTEwsICJUaGUgc3dhcGNoYWluIHBvaW50ZXIgaXMgJXBcbiIsIHN3YXBjaGFpblgpOwogICAgaWYoc3dhcGNoYWluWCAmJiBzd2FwY2hhaW5YICE9ICh2b2lkICopIDB4ZGVhZGJlZWYgKSBJRGlyZWN0M0RTd2FwQ2hhaW45X1JlbGVhc2Uoc3dhcGNoYWluWCk7CgogICAgY2xlYW51cDoKICAgIGlmKHN3YXBjaGFpbjEpIElEaXJlY3QzRFN3YXBDaGFpbjlfUmVsZWFzZShzd2FwY2hhaW4xKTsKICAgIGlmKHN3YXBjaGFpbjIpIElEaXJlY3QzRFN3YXBDaGFpbjlfUmVsZWFzZShzd2FwY2hhaW4yKTsKICAgIGlmKHN3YXBjaGFpbjMpIElEaXJlY3QzRFN3YXBDaGFpbjlfUmVsZWFzZShzd2FwY2hhaW4zKTsKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRERldmljZTlfUmVsZWFzZShwRGV2aWNlKTsKICAgIGlmKHBEM2QpIElEaXJlY3QzRERldmljZTlfUmVsZWFzZShwRDNkKTsKICAgIERlc3Ryb3lXaW5kb3coIGh3bmQgKTsKfQoKc3RhdGljIHZvaWQgdGVzdF9yZWZjb3VudCh2b2lkKQp7CiAgICBIUkVTVUxUICAgICAgICAgICAgICAgICAgICAgIGhyOwogICAgSFdORCAgICAgICAgICAgICAgICAgICAgICAgICBod25kICAgICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEOSAgICAgICAgICAgICAgICAgICpwRDNkICAgICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNERGV2aWNlOSAgICAgICAgICAgICpwRGV2aWNlICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAgICAgICpwVmVydGV4QnVmZmVyICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNESW5kZXhCdWZmZXI5ICAgICAgICpwSW5kZXhCdWZmZXIgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpwVmVydGV4RGVjbGFyYXRpb24gPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAgICAgICpwVmVydGV4U2hhZGVyICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICAgICAgICpwUGl4ZWxTaGFkZXIgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEQ3ViZVRleHR1cmU5ICAgICAgICpwQ3ViZVRleHR1cmUgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEVGV4dHVyZTkgICAgICAgICAgICpwVGV4dHVyZSAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTkgICAgICpwVm9sdW1lVGV4dHVyZSAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEVm9sdW1lOSAgICAgICAgICAgICpwVm9sdW1lTGV2ZWwgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwU3RlbmNpbFN1cmZhY2UgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwT2Zmc2NyZWVuU3VyZmFjZSAgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwUmVuZGVyVGFyZ2V0ICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwUmVuZGVyVGFyZ2V0MiAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwUmVuZGVyVGFyZ2V0MyAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwVGV4dHVyZUxldmVsICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwQmFja0J1ZmZlciAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3RhdGVCbG9jazkgICAgICAgICpwU3RhdGVCbG9jayAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3RhdGVCbG9jazkgICAgICAgICpwU3RhdGVCbG9jazEgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3dhcENoYWluOSAgICAgICAgICpwU3dhcENoYWluICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEUXVlcnk5ICAgICAgICAgICAgICpwUXVlcnkgICAgICAgICAgICAgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTICAgICAgICBkM2RwcDsKICAgIEQzRERJU1BMQVlNT0RFICAgICAgICAgICAgICAgZDNkZG07CiAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvdW50ID0gMCwgdG1wOwoKICAgIEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xbXSA9CiAgICB7CglEM0RERUNMX0VORCgpCiAgICB9OwogICAgc3RhdGljIERXT1JEIHNpbXBsZV92c1tdID0gezB4RkZGRTAxMDEsICAgICAgICAgICAgIC8qIHZzXzFfMSAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAxRiwgMHg4MDAwMDAwMCwgMHg5MDBGMDAwMCwgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uMCB2MCAgICAgKi8KICAgICAgICAweDAwMDAwMDA5LCAweEMwMDEwMDAwLCAweDkwRTQwMDAwLCAweEEwRTQwMDAwLCAvKiBkcDQgb1Bvcy54LCB2MCwgYzAgICAqLwogICAgICAgIDB4MDAwMDAwMDksIDB4QzAwMjAwMDAsIDB4OTBFNDAwMDAsIDB4QTBFNDAwMDEsIC8qIGRwNCBvUG9zLnksIHYwLCBjMSAgICovCiAgICAgICAgMHgwMDAwMDAwOSwgMHhDMDA0MDAwMCwgMHg5MEU0MDAwMCwgMHhBMEU0MDAwMiwgLyogZHA0IG9Qb3MueiwgdjAsIGMyICAgKi8KICAgICAgICAweDAwMDAwMDA5LCAweEMwMDgwMDAwLCAweDkwRTQwMDAwLCAweEEwRTQwMDAzLCAvKiBkcDQgb1Bvcy53LCB2MCwgYzMgICAqLwogICAgICAgIDB4MDAwMEZGRkZ9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVORCAgICAgICAgICAgICAgICAgICovCiAgICBzdGF0aWMgRFdPUkQgc2ltcGxlX3BzW10gPSB7MHhGRkZGMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfMV8xICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwNTEsIDB4QTAwRjAwMDEsIDB4M0Y4MDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIC8qIGRlZiBjMSA9IDEuMCwgMC4wLCAwLjAsIDAuMCAgKi8KICAgICAgICAweDAwMDAwMDQyLCAweEIwMEYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXggdDAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwOCwgMHg4MDBGMDAwMCwgMHhBMEU0MDAwMSwgMHhBMEU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHAzIHIwLCBjMSwgYzAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDUsIDB4ODAwRjAwMDAsIDB4OTBFNDAwMDAsIDB4ODBFNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11bCByMCwgdjAsIHIwICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDA1LCAweDgwMEYwMDAwLCAweEIwRTQwMDAwLCAweDgwRTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdWwgcjAsIHQwLCByMCAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwRkZGRn07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCiAgICBwRDNkID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhwRDNkICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZDNkOV90ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAgICBvayhod25kICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICBpZiAoIXBEM2QgfHwgIWh3bmQpIGdvdG8gY2xlYW51cDsKCiAgICBJRGlyZWN0M0Q5X0dldEFkYXB0ZXJEaXNwbGF5TW9kZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCAmZDNkZG0gKTsKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuV2luZG93ZWQgICAgICAgICA9IFRSVUU7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKICAgIGQzZHBwLkVuYWJsZUF1dG9EZXB0aFN0ZW5jaWwgPSBUUlVFOwogICAgZDNkcHAuQXV0b0RlcHRoU3RlbmNpbEZvcm1hdCA9IEQzREZNVF9EMTY7CgogICAgaHIgPSBJRGlyZWN0M0Q5X0NyZWF0ZURldmljZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCBEM0RERVZUWVBFX05VTExSRUYsIGh3bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDUkVBVEVfU09GVFdBUkVfVkVSVEVYUFJPQ0VTU0lORywgJmQzZHBwLCAmcERldmljZSApOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOURldmljZSAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYgKEZBSUxFRChocikpIGdvdG8gY2xlYW51cDsKCiAgICByZWZjb3VudCA9IGdldF9yZWZjb3VudCggKElVbmtub3duICopcERldmljZSApOwogICAgb2socmVmY291bnQgPT0gMSwgIkludmFsaWQgZGV2aWNlIFJlZkNvdW50ICVkXG4iLCByZWZjb3VudCk7CgogICAgLyoqCiAgICAgKiBDaGVjayByZWZjb3VudCBvZiBpbXBsaWNpdCBzdXJmYWNlcyBhbmQgaW1wbGljaXQgc3dhcGNoYWluLiBGaW5kaW5nczoKICAgICAqICAgLSB0aGUgY29udGFpbmVyIGlzIHRoZSBkZXZpY2UgT1Igc3dhcGNoYWluCiAgICAgKiAgIC0gdGhleSBob2xkIGEgcmVmZXJuY2UgdG8gdGhlIGRldmljZQogICAgICogICAtIHRoZXkgYXJlIGNyZWF0ZWQgd2l0aCBhIHJlZmNvdW50IG9mIDAgKEdldC9SZWxlYXNlIHJldHVybnMgb3JpZ25pYWwgcmVmY291bnQpCiAgICAgKiAgIC0gdGhleSBhcmUgbm90IGZyZWVkIGlmIHJlZmNvdW50IHJlYWNoZXMgMC4KICAgICAqICAgLSB0aGUgcmVmY291bnQgaXMgbm90IGZvcndhcmRlZCB0byB0aGUgY29udGFpbmVyLgogICAgICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0U3dhcENoYWluKHBEZXZpY2UsIDAsICZwU3dhcENoYWluKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiR2V0U3dhcENoYWluIiwgcERldmljZSwgKytyZWZjb3VudCk7CiAgICBpZiAocFN3YXBDaGFpbikKICAgIHsKICAgICAgICBDSEVDS19SRUZDT1VOVCggcFN3YXBDaGFpbiwgMSk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRSZW5kZXJUYXJnZXQocERldmljZSwgMCwgJnBSZW5kZXJUYXJnZXQpOwogICAgICAgIENIRUNLX0NBTEwoIGhyLCAiR2V0UmVuZGVyVGFyZ2V0IiwgcERldmljZSwgKytyZWZjb3VudCk7CiAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBTd2FwQ2hhaW4sIDEpOwogICAgICAgIGlmKHBSZW5kZXJUYXJnZXQpCiAgICAgICAgewogICAgICAgICAgICBDSEVDS19TVVJGQUNFX0NPTlRBSU5FUiggcFJlbmRlclRhcmdldCwgSUlEX0lEaXJlY3QzRFN3YXBDaGFpbjksIHBTd2FwQ2hhaW4pOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCggcFJlbmRlclRhcmdldCwgMSk7CgogICAgICAgICAgICBDSEVDS19BRERSRUZfUkVGQ09VTlQocFJlbmRlclRhcmdldCwgMik7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UKHBEZXZpY2UsIHJlZmNvdW50KTsKICAgICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVChwUmVuZGVyVGFyZ2V0LCAxKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQocERldmljZSwgcmVmY291bnQpOwoKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFJlbmRlclRhcmdldChwRGV2aWNlLCAwLCAmcFJlbmRlclRhcmdldCk7CiAgICAgICAgICAgIENIRUNLX0NBTEwoIGhyLCAiR2V0UmVuZGVyVGFyZ2V0IiwgcERldmljZSwgcmVmY291bnQpOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCggcFJlbmRlclRhcmdldCwgMik7CiAgICAgICAgICAgIENIRUNLX1JFTEVBU0VfUkVGQ09VTlQoIHBSZW5kZXJUYXJnZXQsIDEpOwogICAgICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKCBwUmVuZGVyVGFyZ2V0LCAwKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBEZXZpY2UsIC0tcmVmY291bnQpOwoKICAgICAgICAgICAgLyogVGhlIHJlbmRlciB0YXJnZXQgaXMgcmVsZWFzZWQgd2l0aCB0aGUgZGV2aWNlLCBzbyBBZGRSZWYgd2l0aCByZWZjb3VudD0wIGlzIGZpbmUgaGVyZS4gKi8KICAgICAgICAgICAgQ0hFQ0tfQUREUkVGX1JFRkNPVU5UKHBSZW5kZXJUYXJnZXQsIDEpOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVChwRGV2aWNlLCArK3JlZmNvdW50KTsKICAgICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVChwUmVuZGVyVGFyZ2V0LCAwKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQocERldmljZSwgLS1yZWZjb3VudCk7CiAgICAgICAgfQoKICAgICAgICAvKiBSZW5kZXIgdGFyZ2V0IGFuZCBiYWNrIGJ1ZmZlciBhcmUgaWRlbnRpY2FsLiAqLwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRCYWNrQnVmZmVyKHBEZXZpY2UsIDAsIDAsIDAsICZwQmFja0J1ZmZlcik7CiAgICAgICAgQ0hFQ0tfQ0FMTCggaHIsICJHZXRCYWNrQnVmZmVyIiwgcERldmljZSwgKytyZWZjb3VudCk7CiAgICAgICAgaWYocEJhY2tCdWZmZXIpCiAgICAgICAgewogICAgICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKHBCYWNrQnVmZmVyLCAwKTsKICAgICAgICAgICAgb2socFJlbmRlclRhcmdldCA9PSBwQmFja0J1ZmZlciwgIlJlbmRlclRhcmdldD0lcCBhbmQgQmFja0J1ZmZlcj0lcCBzaG91bGQgYmUgdGhlIHNhbWUuXG4iLAogICAgICAgICAgICBwUmVuZGVyVGFyZ2V0LCBwQmFja0J1ZmZlcik7CiAgICAgICAgICAgIHBCYWNrQnVmZmVyID0gTlVMTDsKICAgICAgICB9CiAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBEZXZpY2UsIC0tcmVmY291bnQpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0RGVwdGhTdGVuY2lsU3VyZmFjZShwRGV2aWNlLCAmcFN0ZW5jaWxTdXJmYWNlKTsKICAgICAgICBDSEVDS19DQUxMKCBociwgIkdldERlcHRoU3RlbmNpbFN1cmZhY2UiLCBwRGV2aWNlLCArK3JlZmNvdW50KTsKICAgICAgICBDSEVDS19SRUZDT1VOVCggcFN3YXBDaGFpbiwgMSk7CiAgICAgICAgaWYocFN0ZW5jaWxTdXJmYWNlKQogICAgICAgIHsKICAgICAgICAgICAgQ0hFQ0tfU1VSRkFDRV9DT05UQUlORVIoIHBTdGVuY2lsU3VyZmFjZSwgSUlEX0lEaXJlY3QzRERldmljZTksIHBEZXZpY2UpOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCggcFN0ZW5jaWxTdXJmYWNlLCAxKTsKCiAgICAgICAgICAgIENIRUNLX0FERFJFRl9SRUZDT1VOVChwU3RlbmNpbFN1cmZhY2UsIDIpOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVChwRGV2aWNlLCByZWZjb3VudCk7CiAgICAgICAgICAgIENIRUNLX1JFTEVBU0VfUkVGQ09VTlQocFN0ZW5jaWxTdXJmYWNlLCAxKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQocERldmljZSwgcmVmY291bnQpOwoKICAgICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVCggcFN0ZW5jaWxTdXJmYWNlLCAwKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBEZXZpY2UsIC0tcmVmY291bnQpOwoKICAgICAgICAgICAgLyogVGhlIHN0ZW5jaWwgc3VyZmFjZSBpcyByZWxlYXNlZCB3aXRoIHRoZSBkZXZpY2UsIHNvIEFkZFJlZiB3aXRoIHJlZmNvdW50PTAgaXMgZmluZSBoZXJlLiAqLwogICAgICAgICAgICBDSEVDS19BRERSRUZfUkVGQ09VTlQocFN0ZW5jaWxTdXJmYWNlLCAxKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQocERldmljZSwgKytyZWZjb3VudCk7CiAgICAgICAgICAgIENIRUNLX1JFTEVBU0VfUkVGQ09VTlQocFN0ZW5jaWxTdXJmYWNlLCAwKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQocERldmljZSwgLS1yZWZjb3VudCk7CiAgICAgICAgICAgIHBTdGVuY2lsU3VyZmFjZSA9IE5VTEw7CiAgICAgICAgfQoKICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKCBwU3dhcENoYWluLCAwKTsKICAgICAgICBDSEVDS19SRUZDT1VOVCggcERldmljZSwgLS1yZWZjb3VudCk7CgogICAgICAgIC8qIFRoZSBpbXBsaWNpdCBzd2FwY2h3aW4gaXMgcmVsZWFzZWQgd2l0aCB0aGUgZGV2aWNlLCBzbyBBZGRSZWYgd2l0aCByZWZjb3VudD0wIGlzIGZpbmUgaGVyZS4gKi8KICAgICAgICBDSEVDS19BRERSRUZfUkVGQ09VTlQocFN3YXBDaGFpbiwgMSk7CiAgICAgICAgQ0hFQ0tfUkVGQ09VTlQocERldmljZSwgKytyZWZjb3VudCk7CiAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVChwU3dhcENoYWluLCAwKTsKICAgICAgICBDSEVDS19SRUZDT1VOVChwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgICAgICBwU3dhcENoYWluID0gTlVMTDsKICAgIH0KCiAgICAvKiBCdWZmZXJzICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlSW5kZXhCdWZmZXIoIHBEZXZpY2UsIDE2LCAwLCBEM0RGTVRfSU5ERVgzMiwgRDNEUE9PTF9ERUZBVUxULCAmcEluZGV4QnVmZmVyLCBOVUxMICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZUluZGV4QnVmZmVyIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgaWYocEluZGV4QnVmZmVyKQogICAgewogICAgICAgIHRtcCA9IGdldF9yZWZjb3VudCggKElVbmtub3duICopcEluZGV4QnVmZmVyICk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRJbmRpY2VzKHBEZXZpY2UsIHBJbmRleEJ1ZmZlcik7CiAgICAgICAgQ0hFQ0tfQ0FMTCggaHIsICJTZXRJbmRpY2VzIiwgcEluZGV4QnVmZmVyLCB0bXApOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRJbmRpY2VzKHBEZXZpY2UsIE5VTEwpOwogICAgICAgIENIRUNLX0NBTEwoIGhyLCAiU2V0SW5kaWNlcyIsIHBJbmRleEJ1ZmZlciwgdG1wKTsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4QnVmZmVyKCBwRGV2aWNlLCAxNiwgMCwgRDNERlZGX1hZWiwgRDNEUE9PTF9ERUZBVUxULCAmcFZlcnRleEJ1ZmZlciwgTlVMTCApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVWZXJ0ZXhCdWZmZXIiLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICBpZihwVmVydGV4QnVmZmVyKQogICAgewogICAgICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKnBWQnVmID0gKHZvaWQqKX4wOwogICAgICAgIFVJTlQgb2Zmc2V0ID0gfjA7CiAgICAgICAgVUlOVCBzdHJpZGUgPSB+MDsKCiAgICAgICAgdG1wID0gZ2V0X3JlZmNvdW50KCAoSVVua25vd24gKilwVmVydGV4QnVmZmVyICk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UocERldmljZSwgMCwgcFZlcnRleEJ1ZmZlciwgMCwgMyAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIENIRUNLX0NBTEwoIGhyLCAiU2V0U3RyZWFtU291cmNlIiwgcFZlcnRleEJ1ZmZlciwgdG1wKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlKHBEZXZpY2UsIDAsIE5VTEwsIDAsIDApOwogICAgICAgIENIRUNLX0NBTEwoIGhyLCAiU2V0U3RyZWFtU291cmNlIiwgcFZlcnRleEJ1ZmZlciwgdG1wKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFN0cmVhbVNvdXJjZShwRGV2aWNlLCAwLCAmcFZCdWYsICZvZmZzZXQsICZzdHJpZGUpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJHZXRTdHJlYW1Tb3VyY2UgZGlkIG5vdCBzdWNjZWVkIHdpdGggTlVMTCBzdHJlYW0hXG4iKTsKICAgICAgICBvayhwVkJ1Zj09TlVMTCwgInBWQnVmIG5vdCBOVUxMICglcCkhXG4iLCBwVkJ1Zik7CiAgICAgICAgb2soc3RyaWRlPT0zKnNpemVvZihmbG9hdCksICJzdHJpZGUgbm90IDMgZmxvYXRzIChnb3QgJXUpIVxuIiwgc3RyaWRlKTsKICAgICAgICBvayhvZmZzZXQ9PTAsICJvZmZzZXQgbm90IDAgKGdvdCAldSkhXG4iLCBvZmZzZXQpOwogICAgfQogICAgLyogU2hhZGVycyAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleERlY2xhcmF0aW9uKCBwRGV2aWNlLCBkZWNsLCAmcFZlcnRleERlY2xhcmF0aW9uICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZVZlcnRleERlY2xhcmF0aW9uIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlciggcERldmljZSwgc2ltcGxlX3ZzLCAmcFZlcnRleFNoYWRlciApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVWZXJ0ZXhTaGFkZXIiLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoIHBEZXZpY2UsIHNpbXBsZV9wcywgJnBQaXhlbFNoYWRlciApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVQaXhlbFNoYWRlciIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIC8qIFRleHR1cmVzICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZSggcERldmljZSwgMzIsIDMyLCAzLCAwLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFBPT0xfREVGQVVMVCwgJnBUZXh0dXJlLCBOVUxMICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZVRleHR1cmUiLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICBpZiAocFRleHR1cmUpCiAgICB7CiAgICAgICAgdG1wID0gZ2V0X3JlZmNvdW50KCAoSVVua25vd24gKilwVGV4dHVyZSApOwoKICAgICAgICAvKiBTZXRUZXh0dXJlIHNob3VsZCBub3QgaW5jcmVhc2UgcmVmY291bnRzICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUocERldmljZSwgMCwgKElEaXJlY3QzREJhc2VUZXh0dXJlOSAqKSBwVGV4dHVyZSk7CiAgICAgICAgQ0hFQ0tfQ0FMTCggaHIsICJTZXRUZXh0dXJlIiwgcFRleHR1cmUsIHRtcCk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUocERldmljZSwgMCwgTlVMTCk7CiAgICAgICAgQ0hFQ0tfQ0FMTCggaHIsICJTZXRUZXh0dXJlIiwgcFRleHR1cmUsIHRtcCk7CgogICAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBpbmNyZW1lbnQgZGV2aWNlIHJlZmNvdW50ICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0RUZXh0dXJlOV9HZXRTdXJmYWNlTGV2ZWwoIHBUZXh0dXJlLCAxLCAmcFRleHR1cmVMZXZlbCApOwogICAgICAgIENIRUNLX0NBTEwoIGhyLCAiR2V0U3VyZmFjZUxldmVsIiwgcERldmljZSwgcmVmY291bnQgKTsKICAgICAgICAvKiBCdXQgc2hvdWxkIGluY3JlbWVudCB0ZXh0dXJlJ3MgcmVmY291bnQgKi8KICAgICAgICBDSEVDS19SRUZDT1VOVCggcFRleHR1cmUsIHRtcCsxICk7CiAgICAgICAgLyogQmVjYXVzZSB0aGUgdGV4dHVyZSBhbmQgc3VyZmFjZSByZWZjb3VudCBhcmUgaWRlbnRpY2FsICovCiAgICAgICAgaWYgKHBUZXh0dXJlTGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCAgICAgICAgKCBwVGV4dHVyZUxldmVsLCB0bXArMSApOwogICAgICAgICAgICBDSEVDS19BRERSRUZfUkVGQ09VTlQgKCBwVGV4dHVyZUxldmVsLCB0bXArMiApOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCAgICAgICAgKCBwVGV4dHVyZSAgICAgLCB0bXArMiApOwogICAgICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKCBwVGV4dHVyZUxldmVsLCB0bXArMSApOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCAgICAgICAgKCBwVGV4dHVyZSAgICAgLCB0bXArMSApOwogICAgICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKCBwVGV4dHVyZSAgICAgLCB0bXAgICApOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCAgICAgICAgKCBwVGV4dHVyZUxldmVsLCB0bXAgICApOwogICAgICAgIH0KICAgIH0KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVDdWJlVGV4dHVyZSggcERldmljZSwgMzIsIDAsIDAsIEQzREZNVF9YOFI4RzhCOCwgRDNEUE9PTF9ERUZBVUxULCAmcEN1YmVUZXh0dXJlLCBOVUxMICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZUN1YmVUZXh0dXJlIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZvbHVtZVRleHR1cmUoIHBEZXZpY2UsIDMyLCAzMiwgMiwgMCwgMCwgRDNERk1UX1g4UjhHOEI4LCBEM0RQT09MX0RFRkFVTFQsICZwVm9sdW1lVGV4dHVyZSwgTlVMTCApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVWb2x1bWVUZXh0dXJlIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgaWYgKHBWb2x1bWVUZXh0dXJlKQogICAgewogICAgICAgIHRtcCA9IGdldF9yZWZjb3VudCggKElVbmtub3duICopcFZvbHVtZVRleHR1cmUgKTsKCiAgICAgICAgLyogVGhpcyBzaG91bGQgbm90IGluY3JlbWVudCBkZXZpY2UgcmVmY291bnQgKi8KICAgICAgICBociA9IElEaXJlY3QzRFZvbHVtZVRleHR1cmU5X0dldFZvbHVtZUxldmVsKHBWb2x1bWVUZXh0dXJlLCAwLCAmcFZvbHVtZUxldmVsKTsKICAgICAgICBDSEVDS19DQUxMKCBociwgIkdldFZvbHVtZUxldmVsIiwgcERldmljZSwgcmVmY291bnQgKTsKICAgICAgICAvKiBCdXQgc2hvdWxkIGluY3JlbWVudCB2b2x1bWUgdGV4dHVyZSdzIHJlZmNvdW50ICovCiAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBWb2x1bWVUZXh0dXJlLCB0bXArMSApOwogICAgICAgIC8qIEJlY2F1c2UgdGhlIHZvbHVtZSB0ZXh0dXJlIGFuZCB2b2x1bWUgcmVmY291bnQgYXJlIGlkZW50aWNhbCAqLwogICAgICAgIGlmIChwVm9sdW1lTGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCAgICAgICAgKCBwVm9sdW1lTGV2ZWwgICwgdG1wKzEgKTsKICAgICAgICAgICAgQ0hFQ0tfQUREUkVGX1JFRkNPVU5UICggcFZvbHVtZUxldmVsICAsIHRtcCsyICk7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UICAgICAgICAoIHBWb2x1bWVUZXh0dXJlLCB0bXArMiApOwogICAgICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKCBwVm9sdW1lTGV2ZWwgICwgdG1wKzEgKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQgICAgICAgICggcFZvbHVtZVRleHR1cmUsIHRtcCsxICk7CiAgICAgICAgICAgIENIRUNLX1JFTEVBU0VfUkVGQ09VTlQoIHBWb2x1bWVUZXh0dXJlLCB0bXAgICApOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCAgICAgICAgKCBwVm9sdW1lTGV2ZWwgICwgdG1wICAgKTsKICAgICAgICB9CiAgICB9CiAgICAvKiBTdXJmYWNlcyAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UoIHBEZXZpY2UsIDMyLCAzMiwgRDNERk1UX0QyNFM4LCBEM0RNVUxUSVNBTVBMRV9OT05FLCAwLCBUUlVFLCAmcFN0ZW5jaWxTdXJmYWNlLCBOVUxMICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UiLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICBDSEVDS19SRUZDT1VOVCggcFN0ZW5jaWxTdXJmYWNlLCAxICk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKCBwRGV2aWNlLCAzMiwgMzIsIEQzREZNVF9YOFI4RzhCOCwgRDNEUE9PTF9ERUZBVUxULCAmcE9mZnNjcmVlblN1cmZhY2UsIE5VTEwgKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgQ0hFQ0tfUkVGQ09VTlQoIHBPZmZzY3JlZW5TdXJmYWNlLCAxICk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUmVuZGVyVGFyZ2V0KCBwRGV2aWNlLCAzMiwgMzIsIEQzREZNVF9YOFI4RzhCOCwgRDNETVVMVElTQU1QTEVfTk9ORSwgMCwgVFJVRSwgJnBSZW5kZXJUYXJnZXQzLCBOVUxMICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZVJlbmRlclRhcmdldCIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIENIRUNLX1JFRkNPVU5UKCBwUmVuZGVyVGFyZ2V0MywgMSApOwogICAgLyogTWlzYyAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVN0YXRlQmxvY2soIHBEZXZpY2UsIEQzRFNCVF9BTEwsICZwU3RhdGVCbG9jayApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVTdGF0ZUJsb2NrIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4oIHBEZXZpY2UsICZkM2RwcCwgJnBTd2FwQ2hhaW4gKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQ3JlYXRlQWRkaXRpb25hbFN3YXBDaGFpbiIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIGlmKHBTd2FwQ2hhaW4pCiAgICB7CiAgICAgICAgLyogY2hlY2sgaW1wbGljaXQgYmFjayBidWZmZXIgKi8KICAgICAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihwU3dhcENoYWluLCAwLCAwLCAmcEJhY2tCdWZmZXIpOwogICAgICAgIENIRUNLX0NBTEwoIGhyLCAiR2V0QmFja0J1ZmZlciIsIHBEZXZpY2UsICsrcmVmY291bnQpOwogICAgICAgIENIRUNLX1JFRkNPVU5UKCBwU3dhcENoYWluLCAxKTsKICAgICAgICBpZihwQmFja0J1ZmZlcikKICAgICAgICB7CiAgICAgICAgICAgIENIRUNLX1NVUkZBQ0VfQ09OVEFJTkVSKCBwQmFja0J1ZmZlciwgSUlEX0lEaXJlY3QzRFN3YXBDaGFpbjksIHBTd2FwQ2hhaW4pOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCggcEJhY2tCdWZmZXIsIDEpOwogICAgICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKCBwQmFja0J1ZmZlciwgMCk7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UKCBwRGV2aWNlLCAtLXJlZmNvdW50KTsKCiAgICAgICAgICAgIC8qIFRoZSBiYWNrIGJ1ZmZlciBpcyByZWxlYXNlZCB3aXRoIHRoZSBzd2FwY2hhaW4sIHNvIEFkZFJlZiB3aXRoIHJlZmNvdW50PTAgaXMgZmluZSBoZXJlLiAqLwogICAgICAgICAgICBDSEVDS19BRERSRUZfUkVGQ09VTlQocEJhY2tCdWZmZXIsIDEpOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVChwRGV2aWNlLCArK3JlZmNvdW50KTsKICAgICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVChwQmFja0J1ZmZlciwgMCk7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UKHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgICAgICAgICBwQmFja0J1ZmZlciA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIENIRUNLX1JFRkNPVU5UKCBwU3dhcENoYWluLCAxKTsKICAgIH0KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVRdWVyeSggcERldmljZSwgRDNEUVVFUllUWVBFX0VWRU5ULCAmcFF1ZXJ5ICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZVF1ZXJ5IiwgcERldmljZSwgKytyZWZjb3VudCApOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblN0YXRlQmxvY2soIHBEZXZpY2UgKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQmVnaW5TdGF0ZUJsb2NrIiwgcERldmljZSwgcmVmY291bnQgKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTdGF0ZUJsb2NrKCBwRGV2aWNlLCAmcFN0YXRlQmxvY2sxICk7CiAgICBDSEVDS19DQUxMKCBociwgIkVuZFN0YXRlQmxvY2siLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CgogICAgLyogVGhlIGltcGxpY2l0IHJlbmRlciB0YXJnZXQgaXMgbm90IGZyZWVkIGlmIHJlZmNvdW50IHJlYWNoZXMgMC4KICAgICAqIE90aGVyd2lzZSBHZXRSZW5kZXJUYXJnZXQgd291bGQgcmUtYWxsb2NhdGUgaXQgYW5kIHRoZSBwb2ludGVyIHdvdWxkIGNoYW5nZS4qLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFJlbmRlclRhcmdldChwRGV2aWNlLCAwLCAmcFJlbmRlclRhcmdldDIpOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJHZXRSZW5kZXJUYXJnZXQiLCBwRGV2aWNlLCArK3JlZmNvdW50KTsKICAgIGlmKHBSZW5kZXJUYXJnZXQyKQogICAgewogICAgICAgIENIRUNLX1JFTEVBU0VfUkVGQ09VTlQocFJlbmRlclRhcmdldDIsIDApOwogICAgICAgIG9rKHBSZW5kZXJUYXJnZXQgPT0gcFJlbmRlclRhcmdldDIsICJSZW5kZXJUYXJnZXQ9JXAgYW5kIFJlbmRlclRhcmdldDI9JXAgc2hvdWxkIGJlIHRoZSBzYW1lLlxuIiwKICAgICAgICAgICBwUmVuZGVyVGFyZ2V0LCBwUmVuZGVyVGFyZ2V0Mik7CiAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgICAgIHBSZW5kZXJUYXJnZXQyID0gTlVMTDsKICAgIH0KICAgIHBSZW5kZXJUYXJnZXQgPSBOVUxMOwoKY2xlYW51cDoKICAgIENIRUNLX1JFTEVBU0UocERldmljZSwgICAgICAgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwoKICAgIC8qIEJ1ZmZlcnMgKi8KICAgIENIRUNLX1JFTEVBU0UocFZlcnRleEJ1ZmZlciwgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgQ0hFQ0tfUkVMRUFTRShwSW5kZXhCdWZmZXIsICAgICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICAvKiBTaGFkZXJzICovCiAgICBDSEVDS19SRUxFQVNFKHBWZXJ0ZXhEZWNsYXJhdGlvbiwgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIENIRUNLX1JFTEVBU0UocFZlcnRleFNoYWRlciwgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgQ0hFQ0tfUkVMRUFTRShwUGl4ZWxTaGFkZXIsICAgICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICAvKiBUZXh0dXJlcyAqLwogICAgQ0hFQ0tfUkVMRUFTRShwVGV4dHVyZUxldmVsLCAgICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICBDSEVDS19SRUxFQVNFKHBDdWJlVGV4dHVyZSwgICAgICAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIENIRUNLX1JFTEVBU0UocFZvbHVtZVRleHR1cmUsICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgLyogU3VyZmFjZXMgKi8KICAgIENIRUNLX1JFTEVBU0UocFN0ZW5jaWxTdXJmYWNlLCAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgQ0hFQ0tfUkVMRUFTRShwT2Zmc2NyZWVuU3VyZmFjZSwgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICBDSEVDS19SRUxFQVNFKHBSZW5kZXJUYXJnZXQzLCAgICAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIC8qIE1pc2MgKi8KICAgIENIRUNLX1JFTEVBU0UocFN0YXRlQmxvY2ssICAgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgQ0hFQ0tfUkVMRUFTRShwU3dhcENoYWluLCAgICAgICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICBDSEVDS19SRUxFQVNFKHBRdWVyeSwgICAgICAgICAgICAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIC8qIFRoaXMgd2lsbCBkZXN0cm95IGRldmljZSAtIGNhbm5vdCBjaGVjayB0aGUgcmVmY291bnQgaGVyZSAqLwogICAgaWYgKHBTdGF0ZUJsb2NrMSkgICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKCBwU3RhdGVCbG9jazEsIDApOwoKICAgIGlmIChwRDNkKSAgICAgICAgICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVCggcEQzZCwgMCk7CgogICAgRGVzdHJveVdpbmRvdyggaHduZCApOwp9CgpzdGF0aWMgdm9pZCB0ZXN0X2N1cnNvcih2b2lkKQp7CiAgICBIUkVTVUxUICAgICAgICAgICAgICAgICAgICAgIGhyOwogICAgSFdORCAgICAgICAgICAgICAgICAgICAgICAgICBod25kICAgICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEOSAgICAgICAgICAgICAgICAgICpwRDNkICAgICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNERGV2aWNlOSAgICAgICAgICAgICpwRGV2aWNlICAgICAgICAgICAgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTICAgICAgICBkM2RwcDsKICAgIEQzRERJU1BMQVlNT0RFICAgICAgICAgICAgICAgZDNkZG07CiAgICBDVVJTT1JJTkZPICAgICAgICAgICAgICAgICAgIGluZm87CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAqY3Vyc29yID0gTlVMTDsKICAgIEhDVVJTT1IgY3VyOwoKICAgIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKICAgIGluZm8uY2JTaXplID0gc2l6ZW9mKGluZm8pOwogICAgaHIgPSBHZXRDdXJzb3JJbmZvKCZpbmZvKTsKICAgIGN1ciA9IGluZm8uaEN1cnNvcjsKCiAgICBwRDNkID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhwRDNkICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZDNkOV90ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAgICBvayhod25kICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICBpZiAoIXBEM2QgfHwgIWh3bmQpIGdvdG8gY2xlYW51cDsKCiAgICBJRGlyZWN0M0Q5X0dldEFkYXB0ZXJEaXNwbGF5TW9kZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCAmZDNkZG0gKTsKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuV2luZG93ZWQgICAgICAgICA9IFRSVUU7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfTlVMTFJFRiwgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5RGV2aWNlICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZiAoRkFJTEVEKGhyKSkgZ290byBjbGVhbnVwOwoKICAgIElEaXJlY3QzRERldmljZTlfQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKHBEZXZpY2UsIDMyLCAzMiwgRDNERk1UX0E4UjhHOEI4LCBEM0RQT09MX1NDUkFUQ0gsICZjdXJzb3IsIDApOwogICAgb2soY3Vyc29yICE9IE5VTEwsICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZSBmYWlsZWQgd2l0aCAlMDh4XG4iLCBocik7CgogICAgLyogSW5pdGlhbGx5IGhpZGRlbiAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Nob3dDdXJzb3IocERldmljZSwgVFJVRSk7CiAgICBvayhociA9PSBGQUxTRSwgIklEaXJlY3QzRERldmljZTlfU2hvd0N1cnNvciByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogTm90IGVuYWJsZWQgd2l0aG91dCBhIHN1cmZhY2UqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Nob3dDdXJzb3IocERldmljZSwgVFJVRSk7CiAgICBvayhociA9PSBGQUxTRSwgIklEaXJlY3QzRERldmljZTlfU2hvd0N1cnNvciByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogRmFpbHMgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRDdXJzb3JQcm9wZXJ0aWVzKHBEZXZpY2UsIDAsIDAsIE5VTEwpOwogICAgb2soaHIgPT0gRDNERVJSX0lOVkFMSURDQUxMLCAiSURpcmVjdDNERGV2aWNlOV9TZXRDdXJzb3JQcm9wZXJ0aWVzIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0Q3Vyc29yUHJvcGVydGllcyhwRGV2aWNlLCAwLCAwLCBjdXJzb3IpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRDdXJzb3JQcm9wZXJ0aWVzIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGN1cnNvcik7CgogICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwogICAgaW5mby5jYlNpemUgPSBzaXplb2YoaW5mbyk7CiAgICBociA9IEdldEN1cnNvckluZm8oJmluZm8pOwogICAgb2soaHIgIT0gMCwgIkdldEN1cnNvckluZm8gcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgb2soaW5mby5mbGFncyAmIENVUlNPUl9TSE9XSU5HLCAiVGhlIGdkaSBjdXJzb3IgaXMgaGlkZGVuICglMDh4KVxuIiwgaW5mby5mbGFncyk7CiAgICBvayhpbmZvLmhDdXJzb3IgPT0gY3VyLCAiVGhlIGN1cnNvciBoYW5kbGUgaXMgJXBcbiIsIGluZm8uaEN1cnNvcik7IC8qIHVuY2hhbmdlZCAqLwoKICAgIC8qIFN0aWxsIGhpZGRlbiAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Nob3dDdXJzb3IocERldmljZSwgVFJVRSk7CiAgICBvayhociA9PSBGQUxTRSwgIklEaXJlY3QzRERldmljZTlfU2hvd0N1cnNvciByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogRW5hYmxlZCBub3cqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Nob3dDdXJzb3IocERldmljZSwgVFJVRSk7CiAgICBvayhociA9PSBUUlVFLCAiSURpcmVjdDNERGV2aWNlOV9TaG93Q3Vyc29yIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAvKiBHREkgY3Vyc29yIHVuY2hhbmdlZCAqLwogICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwogICAgaW5mby5jYlNpemUgPSBzaXplb2YoaW5mbyk7CiAgICBociA9IEdldEN1cnNvckluZm8oJmluZm8pOwogICAgb2soaHIgIT0gMCwgIkdldEN1cnNvckluZm8gcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgb2soaW5mby5mbGFncyAmIENVUlNPUl9TSE9XSU5HLCAiVGhlIGdkaSBjdXJzb3IgaXMgaGlkZGVuICglMDh4KVxuIiwgaW5mby5mbGFncyk7CiAgICBvayhpbmZvLmhDdXJzb3IgPT0gY3VyLCAiVGhlIGN1cnNvciBoYW5kbGUgaXMgJXBcbiIsIGluZm8uaEN1cnNvcik7IC8qIHVuY2hhbmdlZCAqLwoKY2xlYW51cDoKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRDlfUmVsZWFzZShwRGV2aWNlKTsKICAgIGlmKHBEM2QpIElEaXJlY3QzRDlfUmVsZWFzZShwRDNkKTsKICAgIERlc3Ryb3lXaW5kb3coIGh3bmQgKTsKfQoKc3RhdGljIHZvaWQgdGVzdF9yZXNldCh2b2lkKQp7CiAgICBIUkVTVUxUICAgICAgICAgICAgICAgICAgICAgIGhyOwogICAgSFdORCAgICAgICAgICAgICAgICAgICAgICAgICBod25kICAgICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEOSAgICAgICAgICAgICAgICAgICpwRDNkICAgICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNERGV2aWNlOSAgICAgICAgICAgICpwRGV2aWNlICAgICAgICAgICAgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTICAgICAgICBkM2RwcDsKICAgIEQzRERJU1BMQVlNT0RFICAgICAgICAgICAgICAgZDNkZG07CiAgICBEM0RWSUVXUE9SVDkgICAgICAgICAgICAgICAgIHZwOwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgb3JpZ193aWR0aCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pOwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIG9yaWdfaGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgICpwU3dhcGNoYWluOwoKICAgIHBEM2QgPSBwRGlyZWN0M0RDcmVhdGU5KCBEM0RfU0RLX1ZFUlNJT04gKTsKICAgIG9rKHBEM2QgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOwogICAgaHduZCA9IENyZWF0ZVdpbmRvdyggInN0YXRpYyIsICJkM2Q5X3Rlc3QiLCBXU19PVkVSTEFQUEVEV0lORE9XLCAxMDAsIDEwMCwgMTYwLCAxNjAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgKTsKICAgIG9rKGh3bmQgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgd2luZG93XG4iKTsKICAgIGlmICghcEQzZCB8fCAhaHduZCkgZ290byBjbGVhbnVwOwoKICAgIElEaXJlY3QzRDlfR2V0QWRhcHRlckRpc3BsYXlNb2RlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsICZkM2RkbSApOwogICAgWmVyb01lbW9yeSggJmQzZHBwLCBzaXplb2YoZDNkcHApICk7CiAgICBkM2RwcC5XaW5kb3dlZCAgICAgICAgID0gRkFMU0U7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlcldpZHRoICA9IDgwMDsKICAgIGQzZHBwLkJhY2tCdWZmZXJIZWlnaHQgID0gNjAwOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMIC8qIG5vIE5VTExSRUYgaGVyZSAqLywgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CgogICAgaWYoRkFJTEVEKGhyKSkKICAgIHsKICAgICAgICBza2lwKCJjb3VsZCBub3QgY3JlYXRlIGRldmljZSwgSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UgcmV0dXJuZWQgJSN4XG4iLCBocik7CiAgICAgICAgZ290byBjbGVhbnVwOwogICAgfQoKICAgIHdpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7CiAgICBoZWlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKICAgIG9rKHdpZHRoID09IDgwMCwgIlNjcmVlbiB3aWR0aCBpcyAlZFxuIiwgd2lkdGgpOwogICAgb2soaGVpZ2h0ID09IDYwMCwgIlNjcmVlbiBoZWlnaHQgaXMgJWRcbiIsIGhlaWdodCk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFZpZXdwb3J0KHBEZXZpY2UsICZ2cCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldFZpZXdwb3J0IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBvayh2cC5YID09IDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5YKTsKICAgICAgICBvayh2cC5ZID09IDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5ZKTsKICAgICAgICBvayh2cC5XaWR0aCA9PSA4MDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5XaWR0aCk7CiAgICAgICAgb2sodnAuSGVpZ2h0ID09IDYwMCwgIkQzRFZJRVdQT1JULT5YID0gJWRcbiIsIHZwLkhlaWdodCk7CiAgICAgICAgb2sodnAuTWluWiA9PSAwLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuSGVpZ2h0KTsKICAgICAgICBvayh2cC5NYXhaID09IDEsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5IZWlnaHQpOwogICAgfQogICAgdnAuWCA9IDEwOwogICAgdnAuWCA9IDIwOwogICAgdnAuTWluWiA9IDI7CiAgICB2cC5NYXhaID0gMzsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWaWV3cG9ydChwRGV2aWNlLCAmdnApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWaWV3cG9ydCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBaZXJvTWVtb3J5KCAmZDNkcHAsIHNpemVvZihkM2RwcCkgKTsKICAgIGQzZHBwLlN3YXBFZmZlY3QgICAgICAgPSBEM0RTV0FQRUZGRUNUX0RJU0NBUkQ7CiAgICBkM2RwcC5XaW5kb3dlZCAgICAgICAgID0gRkFMU0U7CiAgICBkM2RwcC5CYWNrQnVmZmVyV2lkdGggID0gNjQwOwogICAgZDNkcHAuQmFja0J1ZmZlckhlaWdodCAgPSA0ODA7CiAgICBkM2RwcC5CYWNrQnVmZmVyRm9ybWF0ID0gZDNkZG0uRm9ybWF0OwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Jlc2V0KHBEZXZpY2UsICZkM2RwcCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1Jlc2V0IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIFplcm9NZW1vcnkoJnZwLCBzaXplb2YodnApKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRWaWV3cG9ydChwRGV2aWNlLCAmdnApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRWaWV3cG9ydCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgb2sodnAuWCA9PSAwLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuWCk7CiAgICAgICAgb2sodnAuWSA9PSAwLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuWSk7CiAgICAgICAgb2sodnAuV2lkdGggPT0gNjQwLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuV2lkdGgpOwogICAgICAgIG9rKHZwLkhlaWdodCA9PSA0ODAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5IZWlnaHQpOwogICAgICAgIG9rKHZwLk1pblogPT0gMCwgIkQzRFZJRVdQT1JULT5YID0gJWRcbiIsIHZwLkhlaWdodCk7CiAgICAgICAgb2sodnAuTWF4WiA9PSAxLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuSGVpZ2h0KTsKICAgIH0KCiAgICB3aWR0aCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pOwogICAgaGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CiAgICBvayh3aWR0aCA9PSA2NDAsICJTY3JlZW4gd2lkdGggaXMgJWRcbiIsIHdpZHRoKTsKICAgIG9rKGhlaWdodCA9PSA0ODAsICJTY3JlZW4gaGVpZ2h0IGlzICVkXG4iLCBoZWlnaHQpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRTd2FwQ2hhaW4ocERldmljZSwgMCwgJnBTd2FwY2hhaW4pOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRTd2FwQ2hhaW4gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIFplcm9NZW1vcnkoJmQzZHBwLCBzaXplb2YoZDNkcHApKTsKICAgICAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0UHJlc2VudFBhcmFtZXRlcnMocFN3YXBjaGFpbiwgJmQzZHBwKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RTd2FwQ2hhaW45X0dldFByZXNlbnRQYXJhbWV0ZXJzIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGlmKFNVQ0NFRURFRChocikpCiAgICAgICAgewogICAgICAgICAgICBvayhkM2RwcC5CYWNrQnVmZmVyV2lkdGggPT0gNjQwLCAiQmFjayBidWZmZXIgd2lkdGggaXMgJWRcbiIsIGQzZHBwLkJhY2tCdWZmZXJXaWR0aCk7CiAgICAgICAgICAgIG9rKGQzZHBwLkJhY2tCdWZmZXJIZWlnaHQgPT0gNDgwLCAiQmFjayBidWZmZXIgaGVpZ2h0IGlzICVkXG4iLCBkM2RwcC5CYWNrQnVmZmVySGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgSURpcmVjdDNEU3dhcENoYWluOV9SZWxlYXNlKHBTd2FwY2hhaW4pOwogICAgfQoKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuU3dhcEVmZmVjdCAgICAgICA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKICAgIGQzZHBwLldpbmRvd2VkICAgICAgICAgPSBUUlVFOwogICAgZDNkcHAuQmFja0J1ZmZlcldpZHRoICA9IDQwMDsKICAgIGQzZHBwLkJhY2tCdWZmZXJIZWlnaHQgID0gMzAwOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Jlc2V0KHBEZXZpY2UsICZkM2RwcCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1Jlc2V0IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIHdpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7CiAgICBoZWlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKICAgIG9rKHdpZHRoID09IG9yaWdfd2lkdGgsICJTY3JlZW4gd2lkdGggaXMgJWRcbiIsIHdpZHRoKTsKICAgIG9rKGhlaWdodCA9PSBvcmlnX2hlaWdodCwgIlNjcmVlbiBoZWlnaHQgaXMgJWRcbiIsIGhlaWdodCk7CgogICAgWmVyb01lbW9yeSgmdnAsIHNpemVvZih2cCkpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFZpZXdwb3J0KHBEZXZpY2UsICZ2cCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldFZpZXdwb3J0IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBvayh2cC5YID09IDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5YKTsKICAgICAgICBvayh2cC5ZID09IDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5ZKTsKICAgICAgICBvayh2cC5XaWR0aCA9PSA0MDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5XaWR0aCk7CiAgICAgICAgb2sodnAuSGVpZ2h0ID09IDMwMCwgIkQzRFZJRVdQT1JULT5YID0gJWRcbiIsIHZwLkhlaWdodCk7CiAgICAgICAgb2sodnAuTWluWiA9PSAwLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuSGVpZ2h0KTsKICAgICAgICBvayh2cC5NYXhaID09IDEsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5IZWlnaHQpOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRTd2FwQ2hhaW4ocERldmljZSwgMCwgJnBTd2FwY2hhaW4pOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRTd2FwQ2hhaW4gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIFplcm9NZW1vcnkoJmQzZHBwLCBzaXplb2YoZDNkcHApKTsKICAgICAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0UHJlc2VudFBhcmFtZXRlcnMocFN3YXBjaGFpbiwgJmQzZHBwKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RTd2FwQ2hhaW45X0dldFByZXNlbnRQYXJhbWV0ZXJzIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGlmKFNVQ0NFRURFRChocikpCiAgICAgICAgewogICAgICAgICAgICBvayhkM2RwcC5CYWNrQnVmZmVyV2lkdGggPT0gNDAwLCAiQmFjayBidWZmZXIgd2lkdGggaXMgJWRcbiIsIGQzZHBwLkJhY2tCdWZmZXJXaWR0aCk7CiAgICAgICAgICAgIG9rKGQzZHBwLkJhY2tCdWZmZXJIZWlnaHQgPT0gMzAwLCAiQmFjayBidWZmZXIgaGVpZ2h0IGlzICVkXG4iLCBkM2RwcC5CYWNrQnVmZmVySGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgSURpcmVjdDNEU3dhcENoYWluOV9SZWxlYXNlKHBTd2FwY2hhaW4pOwogICAgfQoKY2xlYW51cDoKICAgIGlmKHBEM2QpIElEaXJlY3QzRDlfUmVsZWFzZShwRDNkKTsKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRDlfUmVsZWFzZShwRGV2aWNlKTsKfQoKLyogVGVzdCBhZGFwdGVyIGRpc3BsYXkgbW9kZXMgKi8Kc3RhdGljIHZvaWQgdGVzdF9kaXNwbGF5X21vZGVzKHZvaWQpCnsKICAgIEQzRERJU1BMQVlNT0RFIGRtb2RlOwogICAgSURpcmVjdDNEOSAqcEQzZDsKCiAgICBwRDNkID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhwRDNkICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGlmKCFwRDNkKSByZXR1cm47CgojZGVmaW5lIFRFU1RfRk1UKHgscikgZG8geyBcCiAgICBIUkVTVUxUIHJlcyA9IElEaXJlY3QzRDlfRW51bUFkYXB0ZXJNb2RlcyhwRDNkLCAwLCAoeCksIDAsICZkbW9kZSk7IFwKICAgIG9rKHJlcz09KHIpLCAiRW51bUFkYXB0ZXJNb2RlcygiI3giKSBkaWQgbm90IHJldHVybiAiI3IiIChnb3QgJXMpIVxuIiwgRFhHZXRFcnJvclN0cmluZzkocmVzKSk7IFwKfSB3aGlsZSgwKQoKICAgIFRFU1RfRk1UKEQzREZNVF9SOEc4QjgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfQThSOEc4QjgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfWDhCOEc4UjgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICAvKiBEM0RGTVRfUjVHNkI1ICovCiAgICBURVNUX0ZNVChEM0RGTVRfWDFSNUc1QjUsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfQTFSNUc1QjUsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfQTRSNEc0QjQsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfUjNHM0IyLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0E4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0E4UjNHM0IyLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX1g0UjRHNEI0LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0EyQjEwRzEwUjEwLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0E4QjhHOFI4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX1g4QjhHOFI4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0cxNlIxNiwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9BMlIxMEcxMEIxMCwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9BMTZCMTZHMTZSMTYsIEQzREVSUl9JTlZBTElEQ0FMTCk7CgogICAgVEVTVF9GTVQoRDNERk1UX0E4UDgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfUDgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CgogICAgVEVTVF9GTVQoRDNERk1UX0w4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0E4TDgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfQTRMNCwgRDNERVJSX0lOVkFMSURDQUxMKTsKCiAgICBURVNUX0ZNVChEM0RGTVRfVjhVOCwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9MNlY1VTUsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfWDhMOFY4VTgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfUThXOFY4VTgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfVjE2VTE2LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0EyVzEwVjEwVTEwLCBEM0RFUlJfSU5WQUxJRENBTEwpOwoKICAgIFRFU1RfRk1UKEQzREZNVF9VWVZZLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX1lVWTIsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRFhUMSwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9EWFQyLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0RYVDMsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRFhUNCwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9EWFQ1LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX01VTFRJMl9BUkdCOCwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9HOFI4X0c4QjgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfUjhHOF9COEc4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwoKICAgIFRFU1RfRk1UKEQzREZNVF9EMTZfTE9DS0FCTEUsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRDMyLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0QxNVMxLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0QyNFM4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0QyNFg4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0QyNFg0UzQsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRDE2LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0wxNiwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9EMzJGX0xPQ0tBQkxFLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0QyNEZTOCwgRDNERVJSX0lOVkFMSURDQUxMKTsKCiAgICBURVNUX0ZNVChEM0RGTVRfVkVSVEVYREFUQSwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9JTkRFWDE2LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0lOREVYMzIsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfUTE2VzE2VjE2VTE2LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgLyogRmxvYXRpbmcgcG9pbnQgZm9ybWF0cyAqLwogICAgVEVTVF9GTVQoRDNERk1UX1IxNkYsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRzE2UjE2RiwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9BMTZCMTZHMTZSMTZGLCBEM0RFUlJfSU5WQUxJRENBTEwpOwoKICAgIC8qIElFRUUgZm9ybWF0cyAqLwogICAgVEVTVF9GTVQoRDNERk1UX1IzMkYsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRzMyUjMyRiwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9BMzJCMzJHMzJSMzJGLCBEM0RFUlJfSU5WQUxJRENBTEwpOwoKICAgIFRFU1RfRk1UKEQzREZNVF9DeFY4VTgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CgogICAgVEVTVF9GTVQoMCwgRDNERVJSX0lOVkFMSURDQUxMKTsKCiAgICBJRGlyZWN0M0Q5X1JlbGVhc2UocEQzZCk7Cn0KCnN0YXRpYyB2b2lkIHRlc3Rfc2NlbmUodm9pZCkKewogICAgSFJFU1VMVCAgICAgICAgICAgICAgICAgICAgICBocjsKICAgIEhXTkQgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRDkgICAgICAgICAgICAgICAgICAqcEQzZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRERldmljZTkgICAgICAgICAgICAqcERldmljZSAgICAgICAgICAgID0gTlVMTDsKICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAgICAgICAgZDNkcHA7CiAgICBEM0RESVNQTEFZTU9ERSAgICAgICAgICAgICAgIGQzZGRtOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICAqcFN1cmZhY2UxID0gTlVMTCwgKnBTdXJmYWNlMiA9IE5VTEwsICpwU3VyZmFjZTMgPSBOVUxMLCAqcFJlbmRlclRhcmdldCA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgICpwQmFja0J1ZmZlciA9IE5VTEwsICpwRGVwdGhTdGVuY2lsID0gTlVMTDsKICAgIFJFQ1QgcmVjdCA9IHswLCAwLCAxMjgsIDEyOH07CiAgICBEM0RDQVBTOSAgICAgICAgICAgICAgICAgICAgIGNhcHM7CgogICAgcEQzZCA9IHBEaXJlY3QzRENyZWF0ZTkoIEQzRF9TREtfVkVSU0lPTiApOwogICAgb2socEQzZCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5IG9iamVjdFxuIik7CiAgICBod25kID0gQ3JlYXRlV2luZG93KCAic3RhdGljIiwgImQzZDlfdGVzdCIsIFdTX09WRVJMQVBQRURXSU5ET1csIDEwMCwgMTAwLCAxNjAsIDE2MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCApOwogICAgb2soaHduZCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSB3aW5kb3dcbiIpOwogICAgaWYgKCFwRDNkIHx8ICFod25kKSBnb3RvIGNsZWFudXA7CgogICAgSURpcmVjdDNEOV9HZXRBZGFwdGVyRGlzcGxheU1vZGUoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgJmQzZGRtICk7CiAgICBaZXJvTWVtb3J5KCAmZDNkcHAsIHNpemVvZihkM2RwcCkgKTsKICAgIGQzZHBwLldpbmRvd2VkICAgICAgICAgPSBUUlVFOwogICAgZDNkcHAuU3dhcEVmZmVjdCAgICAgICA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKICAgIGQzZHBwLkJhY2tCdWZmZXJXaWR0aCAgPSA4MDA7CiAgICBkM2RwcC5CYWNrQnVmZmVySGVpZ2h0ICA9IDYwMDsKICAgIGQzZHBwLkJhY2tCdWZmZXJGb3JtYXQgPSBkM2RkbS5Gb3JtYXQ7CiAgICBkM2RwcC5FbmFibGVBdXRvRGVwdGhTdGVuY2lsID0gVFJVRTsKICAgIGQzZHBwLkF1dG9EZXB0aFN0ZW5jaWxGb3JtYXQgPSBEM0RGTVRfRDE2OwoKICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwgLyogbm8gTlVMTFJFRiBoZXJlICovLCBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZkM2RwcCwgJnBEZXZpY2UgKTsKICAgIG9rKGhyID09IEQzRF9PSyB8fCBociA9PSBEM0RFUlJfTk9UQVZBSUxBQkxFLCAiSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighcERldmljZSkKICAgIHsKICAgICAgICBza2lwKCJGYWlsZWQgdG8gY3JlYXRlIGEgZDNkIGRldmljZVxuIik7CiAgICAgICAgZ290byBjbGVhbnVwOwogICAgfQoKICAgIC8qIEdldCB0aGUgY2FwcywgdGhleSB3aWxsIGJlIG5lZWRlZCB0byB0ZWxsIGlmIGFuIG9wZXJhdGlvbiBpcyBzdXBwb3NlZCB0byBiZSB2YWxpZCAqLwogICAgbWVtc2V0KCZjYXBzLCAwLCBzaXplb2YoY2FwcykpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldERldmljZUNhcHMocERldmljZSwgJmNhcHMpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRDYXBzIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoRkFJTEVEKGhyKSkgZ290byBjbGVhbnVwOwoKICAgIC8qIFRlc3QgYW4gRW5kU2NlbmUgd2l0aG91dCBiZWdpbnNjZW5lLiBTaG91bGQgcmV0dXJuIGFuIGVycm9yICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUocERldmljZSk7CiAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIFRlc3QgYSBub3JtYWwgQmVnaW5TY2VuZSAvIEVuZFNjZW5lIHBhaXIsIHRoaXMgc2hvdWxkIHdvcmsgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKHBEZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUocERldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KCiAgICAvKiBUZXN0IGFub3RoZXIgRW5kU2NlbmUgd2l0aG91dCBoYXZpbmcgYmVndW4gYSBuZXcgc2NlbmUuIFNob3VsZCByZXR1cm4gYW4gZXJyb3IgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShwRGV2aWNlKTsKICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgLyogVHdvIG5lc3RlZCBCZWdpblNjZW5lIGFuZCBFbmRTY2VuZSBjYWxscyAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUocERldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShwRGV2aWNlKTsKICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShwRGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUocERldmljZSk7CiAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIENyZWF0ZSBzb21lIHN1cmZhY2VzIHRvIHRlc3Qgc3RyZXRjaHJlY3QgYmV0d2VlbiB0aGUgc2NlbmVzICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKHBEZXZpY2UsIDEyOCwgMTI4LCBEM0RGTVRfQThSOEc4QjgsIEQzRFBPT0xfREVGQVVMVCwgJnBTdXJmYWNlMSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVPZmZzY3JlZW5QbGFpblN1cmZhY2UocERldmljZSwgMTI4LCAxMjgsIEQzREZNVF9BOFI4RzhCOCwgRDNEUE9PTF9ERUZBVUxULCAmcFN1cmZhY2UyLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UocERldmljZSwgODAwLCA2MDAsIEQzREZNVF9EMTYsIEQzRE1VTFRJU0FNUExFX05PTkUsIDAsIEZBTFNFLCAmcFN1cmZhY2UzLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVSZW5kZXJUYXJnZXQocERldmljZSwgMTI4LCAxMjgsIGQzZGRtLkZvcm1hdCwgRDNETVVMVElTQU1QTEVfTk9ORSwgMCwgRkFMU0UsICZwUmVuZGVyVGFyZ2V0LCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlUmVuZGVyVGFyZ2V0IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRCYWNrQnVmZmVyKHBEZXZpY2UsIDAsIDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmcEJhY2tCdWZmZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRCYWNrQnVmZmVyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldERlcHRoU3RlbmNpbFN1cmZhY2UocERldmljZSwgJnBEZXB0aFN0ZW5jaWwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRCYWNrQnVmZmVyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIEZpcnN0IG1ha2Ugc3VyZSBhIHNpbXBsZSBTdHJldGNoUmVjdCBjYWxsIHdvcmtzICovCiAgICBpZihwU3VyZmFjZTEgJiYgcFN1cmZhY2UyKSB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1N0cmV0Y2hSZWN0KHBEZXZpY2UsIHBTdXJmYWNlMSwgTlVMTCwgcFN1cmZhY2UyLCBOVUxMLCAwKTsKICAgICAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TdHJldGNoUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KICAgIGlmKHBCYWNrQnVmZmVyICYmIHBSZW5kZXJUYXJnZXQpIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU3RyZXRjaFJlY3QocERldmljZSwgcEJhY2tCdWZmZXIsICZyZWN0LCBwUmVuZGVyVGFyZ2V0LCBOVUxMLCAwKTsKICAgICAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TdHJldGNoUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KICAgIGlmKHBEZXB0aFN0ZW5jaWwgJiYgcFN1cmZhY2UzKSB7CiAgICAgICAgSFJFU1VMVCBleHBlY3RlZDsKICAgICAgICBpZigwKSAvKiBEaXNhYmxlZCBmb3Igbm93IGJlY2F1c2UgaXQgY3Jhc2hlcyBpbiB3aW5lICovIHsKICAgICAgICAgICAgZXhwZWN0ZWQgPSBjYXBzLkRldkNhcHMyICYgRDNEREVWQ0FQUzJfQ0FOX1NUUkVUQ0hSRUNUX0ZST01fVEVYVFVSRVMgPyBEM0RfT0sgOiBEM0RFUlJfSU5WQUxJRENBTEw7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TdHJldGNoUmVjdChwRGV2aWNlLCBwRGVwdGhTdGVuY2lsLCBOVUxMLCBwU3VyZmFjZTMsIE5VTEwsIDApOwogICAgICAgICAgICBvayggaHIgPT0gZXhwZWN0ZWQsICJJRGlyZWN0M0REZXZpY2U5X1N0cmV0Y2hSZWN0IHJldHVybmVkICVzLCBleHBlY3RlZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpLCBEWEdldEVycm9yU3RyaW5nOShleHBlY3RlZCkpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBOb3cgdHJ5IGl0IGluIGEgQmVnaW5TY2VuZSAtIEVuZFNjZW5lIHBhaXIuIFNlZW1zIHRvIGJlIGFsbG93ZWQgaW4gYSBiZWdpblNjZW5lIC0gRW5kc2NlbmUgcGFpcgogICAgICogd2lkdGggbm9ybWFsIHN1cmZhY2VzLCByZW5kZXIgdGFyZ2V0cyBhbmQgZGVwdGggc3RlbmNpbCBzdXJmYWNlcy4KICAgICAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUocERldmljZSk7CiAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGlmKHBTdXJmYWNlMSAmJiBwU3VyZmFjZTIpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1N0cmV0Y2hSZWN0KHBEZXZpY2UsIHBTdXJmYWNlMSwgTlVMTCwgcFN1cmZhY2UyLCBOVUxMLCAwKTsKICAgICAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TdHJldGNoUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KICAgIGlmKHBCYWNrQnVmZmVyICYmIHBSZW5kZXJUYXJnZXQpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1N0cmV0Y2hSZWN0KHBEZXZpY2UsIHBCYWNrQnVmZmVyLCAmcmVjdCwgcFJlbmRlclRhcmdldCwgTlVMTCwgMCk7CiAgICAgICAgb2soIGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU3RyZXRjaFJlY3QgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBpZihwRGVwdGhTdGVuY2lsICYmIHBTdXJmYWNlMykKICAgIHsKICAgICAgICAvKiBUaGlzIGlzIHN1cHBvc2VkIHRvIGZhaWwgaW5zaWRlIGEgQmVnaW5TY2VuZSAtIEVuZFNjZW5lIHBhaXIuICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1N0cmV0Y2hSZWN0KHBEZXZpY2UsIHBEZXB0aFN0ZW5jaWwsIE5VTEwsIHBTdXJmYWNlMywgTlVMTCwgMCk7CiAgICAgICAgb2soIGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIklEaXJlY3QzRERldmljZTlfU3RyZXRjaFJlY3QgcmV0dXJuZWQgJXMsIGV4cGVjdGVkIEQzREVSUl9JTlZBTElEQ0FMTFxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUocERldmljZSk7CiAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAvKiBEb2VzIGEgU2V0UmVuZGVyVGFyZ2V0IGluZmx1ZW5jZSBCZWdpblNjZW5lIC8gRW5kU2NlbmUgPwogICAgICogU2V0IGEgbmV3IHJlbmRlciB0YXJnZXQsIHRoZW4gc2VlIGlmIGl0IHN0YXJ0ZWQgYSBuZXcgc2NlbmUuIEZsaXAgdGhlIHJ0IGJhY2sgYW5kIHNlZSBpZiB0aGF0IG1heWJlCiAgICAgKiBlbmRlZCB0aGUgc2NlbmUuIEV4cGVjdGVkIHJlc3VsdCBpcyB0aGF0IHRoZSBzY2VuZSBpcyBub3QgYWZmZWN0ZWQgYnkgU2V0UmVuZGVyVGFyZ2V0CiAgICAgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJUYXJnZXQocERldmljZSwgMCwgcFJlbmRlclRhcmdldCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclRhcmdldCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKHBEZXZpY2UpOwogICAgb2soIGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJUYXJnZXQocERldmljZSwgMCwgcEJhY2tCdWZmZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJUYXJnZXQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUocERldmljZSk7CiAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCmNsZWFudXA6CiAgICBpZihwUmVuZGVyVGFyZ2V0KSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKHBSZW5kZXJUYXJnZXQpOwogICAgaWYocERlcHRoU3RlbmNpbCkgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShwRGVwdGhTdGVuY2lsKTsKICAgIGlmKHBCYWNrQnVmZmVyKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKHBCYWNrQnVmZmVyKTsKICAgIGlmKHBTdXJmYWNlMSkgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShwU3VyZmFjZTEpOwogICAgaWYocFN1cmZhY2UyKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKHBTdXJmYWNlMik7CiAgICBpZihwU3VyZmFjZTMpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UocFN1cmZhY2UzKTsKICAgIGlmKHBEM2QpIElEaXJlY3QzRDlfUmVsZWFzZShwRDNkKTsKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRDlfUmVsZWFzZShwRGV2aWNlKTsKICAgIGlmKGh3bmQpIERlc3Ryb3lXaW5kb3coaHduZCk7Cn0KCnN0YXRpYyB2b2lkIHRlc3RfbGltaXRzKHZvaWQpCnsKICAgIEhSRVNVTFQgICAgICAgICAgICAgICAgICAgICAgaHI7CiAgICBIV05EICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0Q5ICAgICAgICAgICAgICAgICAgKnBEM2QgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0REZXZpY2U5ICAgICAgICAgICAgKnBEZXZpY2UgICAgICAgICAgICA9IE5VTEw7CiAgICBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgICAgICAgIGQzZHBwOwogICAgRDNERElTUExBWU1PREUgICAgICAgICAgICAgICBkM2RkbTsKICAgIElEaXJlY3QzRFRleHR1cmU5ICAgICAgICAgICAqcFRleHR1cmUgICAgICAgICAgID0gTlVMTDsKICAgIGludCBpOwoKICAgIHBEM2QgPSBwRGlyZWN0M0RDcmVhdGU5KCBEM0RfU0RLX1ZFUlNJT04gKTsKICAgIG9rKHBEM2QgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOwogICAgaHduZCA9IENyZWF0ZVdpbmRvdyggInN0YXRpYyIsICJkM2Q5X3Rlc3QiLCBXU19PVkVSTEFQUEVEV0lORE9XLCAxMDAsIDEwMCwgMTYwLCAxNjAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgKTsKICAgIG9rKGh3bmQgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgd2luZG93XG4iKTsKICAgIGlmICghcEQzZCB8fCAhaHduZCkgZ290byBjbGVhbnVwOwoKICAgIElEaXJlY3QzRDlfR2V0QWRhcHRlckRpc3BsYXlNb2RlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsICZkM2RkbSApOwogICAgWmVyb01lbW9yeSggJmQzZHBwLCBzaXplb2YoZDNkcHApICk7CiAgICBkM2RwcC5XaW5kb3dlZCAgICAgICAgID0gVFJVRTsKICAgIGQzZHBwLlN3YXBFZmZlY3QgICAgICAgPSBEM0RTV0FQRUZGRUNUX0RJU0NBUkQ7CiAgICBkM2RwcC5CYWNrQnVmZmVyV2lkdGggID0gODAwOwogICAgZDNkcHAuQmFja0J1ZmZlckhlaWdodCAgPSA2MDA7CiAgICBkM2RwcC5CYWNrQnVmZmVyRm9ybWF0ID0gZDNkZG0uRm9ybWF0OwogICAgZDNkcHAuRW5hYmxlQXV0b0RlcHRoU3RlbmNpbCA9IFRSVUU7CiAgICBkM2RwcC5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0ID0gRDNERk1UX0QxNjsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMIC8qIG5vIE5VTExSRUYgaGVyZSAqLywgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CiAgICBvayhociA9PSBEM0RfT0sgfHwgaHIgPT0gRDNERVJSX05PVEFWQUlMQUJMRSwgIklEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIXBEZXZpY2UpCiAgICB7CiAgICAgICAgc2tpcCgiRmFpbGVkIHRvIGNyZWF0ZSBhIGQzZCBkZXZpY2VcbiIpOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZShwRGV2aWNlLCAxNiwgMTYsIDEsIDAsIEQzREZNVF9BOFI4RzhCOCwgRDNEUE9PTF9NQU5BR0VELCAmcFRleHR1cmUsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIXBUZXh0dXJlKSBnb3RvIGNsZWFudXA7CgogICAgLyogVGhlcmUgYXJlIDE2IHBpeGVsIHNhbXBsZXJzLiBXZSBzaG91bGQgYmUgYWJsZSB0byBhY2Nlc3MgYWxsIG9mIHRoZW0gKi8KICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShwRGV2aWNlLCBpLCAoSURpcmVjdDNEQmFzZVRleHR1cmU5ICopIHBUZXh0dXJlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUgZm9yIHNhbXBsZXIgJWQgZmFpbGVkIHdpdGggJXNcbiIsIGksIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUocERldmljZSwgaSwgTlVMTCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlIGZvciBzYW1wbGVyICVkIGZhaWxlZCB3aXRoICVzXG4iLCBpLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUocERldmljZSwgaSwgRDNEU0FNUF9TUkdCVEVYVFVSRSwgVFJVRSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUgZm9yIHNhbXBsZXIgJWQgZmFpbGVkIHdpdGggJXNcbiIsIGksIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgLyogTm93IHRlc3QgYWxsIDggdGV4dHVyZXMgc3RhZ2Ugc3RhdGVzICovCiAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUocERldmljZSwgaSwgRDNEVFNTX0NPTE9ST1AsIEQzRFRPUF9BREQpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUgZm9yIHRleHR1cmUgJWQgZmFpbGVkIHdpdGggJXNcbiIsIGksIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgLyogSW52ZXN0aWdhdGlvbnMgc2hvdyB0aGF0IGFjY2Vzc2luZyBoaWdoZXIgc2FtcGxlcnMgLyB0ZXh0dXJlcyBzdGFnZSBzdGF0ZXMgZG9lcyBub3QgcmV0dXJuIGFuIGVycm9yIGVpdGhlci4gV3JpdGluZwogICAgICogdG8gdG9vIGhpZ2ggc2FtcGxlcnMoYXBwcm94aW1hdGVseSBzYW1wbGVyIDQwKSBjYXVzZXMgbWVtb3J5IGNvcnJ1cHRpb24gaW4gd2luZG93cywgc28gdGhlcmUgaXMgbm8gYm91bmRzIGNoZWNraW5nCiAgICAgKiBidXQgaG93IGRvIEkgdGVzdCB0aGF0PwogICAgICovCmNsZWFudXA6CiAgICBpZihwVGV4dHVyZSkgSURpcmVjdDNEVGV4dHVyZTlfUmVsZWFzZShwVGV4dHVyZSk7CiAgICBpZihwRDNkKSBJRGlyZWN0M0Q5X1JlbGVhc2UocEQzZCk7CiAgICBpZihwRGV2aWNlKSBJRGlyZWN0M0Q5X1JlbGVhc2UocERldmljZSk7CiAgICBpZihod25kKSBEZXN0cm95V2luZG93KGh3bmQpOwp9CgpzdGF0aWMgdm9pZCB0ZXN0X2RlcHRoc3RlbmNpbHRlc3Qodm9pZCkKewogICAgSFJFU1VMVCAgICAgICAgICAgICAgICAgICAgICBocjsKICAgIEhXTkQgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRDkgICAgICAgICAgICAgICAgICAqcEQzZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRERldmljZTkgICAgICAgICAgICAqcERldmljZSAgICAgICAgICAgID0gTlVMTDsKICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAgICAgICAgZDNkcHA7CiAgICBEM0RESVNQTEFZTU9ERSAgICAgICAgICAgICAgIGQzZGRtOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwRGVwdGhTdGVuY2lsICAgICAgICAgICA9IE5VTEw7CiAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOwoKICAgIHBEM2QgPSBwRGlyZWN0M0RDcmVhdGU5KCBEM0RfU0RLX1ZFUlNJT04gKTsKICAgIG9rKHBEM2QgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOwogICAgaHduZCA9IENyZWF0ZVdpbmRvdyggInN0YXRpYyIsICJkM2Q5X3Rlc3QiLCBXU19PVkVSTEFQUEVEV0lORE9XLCAxMDAsIDEwMCwgMTYwLCAxNjAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgKTsKICAgIG9rKGh3bmQgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgd2luZG93XG4iKTsKICAgIGlmICghcEQzZCB8fCAhaHduZCkgZ290byBjbGVhbnVwOwoKICAgIElEaXJlY3QzRDlfR2V0QWRhcHRlckRpc3BsYXlNb2RlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsICZkM2RkbSApOwogICAgWmVyb01lbW9yeSggJmQzZHBwLCBzaXplb2YoZDNkcHApICk7CiAgICBkM2RwcC5XaW5kb3dlZCAgICAgICAgID0gVFJVRTsKICAgIGQzZHBwLlN3YXBFZmZlY3QgICAgICAgPSBEM0RTV0FQRUZGRUNUX0RJU0NBUkQ7CiAgICBkM2RwcC5CYWNrQnVmZmVyV2lkdGggID0gODAwOwogICAgZDNkcHAuQmFja0J1ZmZlckhlaWdodCAgPSA2MDA7CiAgICBkM2RwcC5CYWNrQnVmZmVyRm9ybWF0ID0gZDNkZG0uRm9ybWF0OwogICAgZDNkcHAuRW5hYmxlQXV0b0RlcHRoU3RlbmNpbCA9IFRSVUU7CiAgICBkM2RwcC5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0ID0gRDNERk1UX0QxNjsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMIC8qIG5vIE5VTExSRUYgaGVyZSAqLywgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CiAgICBvayhociA9PSBEM0RfT0sgfHwgaHIgPT0gRDNERVJSX05PVEFWQUlMQUJMRSwgIklEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIXBEZXZpY2UpCiAgICB7CiAgICAgICAgc2tpcCgiRmFpbGVkIHRvIGNyZWF0ZSBhIGQzZCBkZXZpY2VcbiIpOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0RGVwdGhTdGVuY2lsU3VyZmFjZShwRGV2aWNlLCAmcERlcHRoU3RlbmNpbCk7CiAgICBvayhociA9PSBEM0RfT0sgJiYgcERlcHRoU3RlbmNpbCAhPSBOVUxMLCAiSURpcmVjdDNERGV2aWNlOV9HZXREZXB0aFN0ZW5jaWxTdXJmYWNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIFRyeSB0byBjbGVhciAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKHBEZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1pCVUZGRVIsIDB4MDAwMDAwMDAsIDEuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXREZXB0aFN0ZW5jaWxTdXJmYWNlKHBEZXZpY2UsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXREZXB0aFN0ZW5jaWxTdXJmYWNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIFRoaXMgbGVmdCB0aGUgcmVuZGVyIHN0YXRlcyB1bnRvdWNoZWQhICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyU3RhdGUocERldmljZSwgRDNEUlNfWkVOQUJMRSwgJnN0YXRlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyU3RhdGUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhzdGF0ZSA9PSBEM0RaQl9UUlVFLCAiRDNEUlNfWkVOQUJMRSBpcyAlc1xuIiwgc3RhdGUgPT0gRDNEWkJfRkFMU0UgPyAiRDNEWkJfRkFMU0UiIDogKHN0YXRlID09IEQzRFpCX1RSVUUgPyAiRDNEWkJfVFJVRSIgOiAiRDNEWkJfVVNFVyIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRSZW5kZXJTdGF0ZShwRGV2aWNlLCBEM0RSU19aV1JJVEVFTkFCTEUsICZzdGF0ZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldFJlbmRlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgb2soc3RhdGUgPT0gVFJVRSwgIkQzRFJTX1pXUklURUVOQUJMRSBpcyAlc1xuIiwgc3RhdGUgPyAiVFJVRSIgOiAiRkFMU0UiKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRSZW5kZXJTdGF0ZShwRGV2aWNlLCBEM0RSU19TVEVOQ0lMRU5BQkxFLCAmc3RhdGUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRSZW5kZXJTdGF0ZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKHN0YXRlID09IEZBTFNFLCAiRDNEUlNfU1RFTkNJTEVOQUJMRSBpcyAlc1xuIiwgc3RhdGUgPyAiVFJVRSIgOiAiRkFMU0UiKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRSZW5kZXJTdGF0ZShwRGV2aWNlLCBEM0RSU19TVEVOQ0lMV1JJVEVNQVNLLCAmc3RhdGUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRSZW5kZXJTdGF0ZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKHN0YXRlID09IDB4ZmZmZmZmZmYsICJEM0RSU19TVEVOQ0lMV1JJVEVNQVNLIGlzIDB4JTA4eFxuIiwgc3RhdGUpOwoKICAgIC8qIFRoaXMgaXMgc3VwcG9zZWQgdG8gZmFpbCBub3cgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DbGVhcihwRGV2aWNlLCAwLCBOVUxMLCBEM0RDTEVBUl9aQlVGRkVSLCAweDAwMDAwMDAwLCAxLjAsIDApOwogICAgb2soaHIgPT0gRDNERVJSX0lOVkFMSURDQUxMLCAiSURpcmVjdDNERGV2aWNlOV9DbGVhciBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUocERldmljZSwgRDNEUlNfWkVOQUJMRSwgRDNEWkJfRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0RGVwdGhTdGVuY2lsU3VyZmFjZShwRGV2aWNlLCBwRGVwdGhTdGVuY2lsKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0RGVwdGhTdGVuY2lsU3VyZmFjZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyU3RhdGUocERldmljZSwgRDNEUlNfWkVOQUJMRSwgJnN0YXRlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyU3RhdGUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhzdGF0ZSA9PSBEM0RaQl9GQUxTRSwgIkQzRFJTX1pFTkFCTEUgaXMgJXNcbiIsIHN0YXRlID09IEQzRFpCX0ZBTFNFID8gIkQzRFpCX0ZBTFNFIiA6IChzdGF0ZSA9PSBEM0RaQl9UUlVFID8gIkQzRFpCX1RSVUUiIDogIkQzRFpCX1VTRVciKSk7CgogICAgLyogTm93IGl0IHdvcmtzIGFnYWluICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIocERldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfWkJVRkZFUiwgMHgwMDAwMDAwMCwgMS4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgpjbGVhbnVwOgogICAgaWYocERlcHRoU3RlbmNpbCkgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShwRGVwdGhTdGVuY2lsKTsKICAgIGlmKHBEM2QpIElEaXJlY3QzRDlfUmVsZWFzZShwRDNkKTsKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRDlfUmVsZWFzZShwRGV2aWNlKTsKICAgIGlmKGh3bmQpIERlc3Ryb3lXaW5kb3coaHduZCk7Cn0KCi8qIFRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gSURpcmVjdDNERGV2aWNlOV9EcmF3SW5kZXhlZFByaW1pdGl2ZSBpcyBjYWxsZWQgd2l0aG91dCBhIHZhbGlkIGluZGV4IGJ1ZmZlciBzZXQuICovCnN0YXRpYyB2b2lkIHRlc3RfZHJhd19pbmRleGVkKHZvaWQpCnsKICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgICAgIGZsb2F0IHBvc2l0aW9uWzNdOwogICAgICAgIERXT1JEIGNvbG9yOwogICAgfSBxdWFkW10gPSB7CiAgICAgICAge3stMS4wZiwgLTEuMGYsIDAuMGZ9LCAweGZmZmYwMDAwfSwKICAgICAgICB7ey0xLjBmLCAgMS4wZiwgMC4wZn0sIDB4ZmZmZjAwMDB9LAogICAgICAgIHt7IDEuMGYsICAxLjBmLCAwLjBmfSwgMHhmZmZmMDAwMH0sCiAgICAgICAge3sgMS4wZiwgLTEuMGYsIDAuMGZ9LCAweGZmZmYwMDAwfSwKICAgIH07CiAgICBXT1JEIGluZGljZXNbXSA9IHswLCAxLCAyLCAzLCAwLCAyfTsKCiAgICBzdGF0aWMgY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgZGVjbF9lbGVtZW50c1tdID0gewogICAgICAgIHswLCAwLCAgRDNEREVDTFRZUEVfRkxPQVQzLCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1BPU0lUSU9OLCAwfSwKICAgICAgICB7MCwgMTIsIEQzRERFQ0xUWVBFX0QzRENPTE9SLCBEM0RERUNMTUVUSE9EX0RFRkFVTFQsICAgIEQzRERFQ0xVU0FHRV9DT0xPUiwgMH0sCiAgICAgICAgRDNEREVDTF9FTkQoKQogICAgfTsKCiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleF9kZWNsYXJhdGlvbiA9IE5VTEw7CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICp2ZXJ0ZXhfYnVmZmVyID0gTlVMTDsKICAgIElEaXJlY3QzREluZGV4QnVmZmVyOSAqaW5kZXhfYnVmZmVyID0gTlVMTDsKICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyBwcmVzZW50X3BhcmFtZXRlcnM7CiAgICBJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UgPSBOVUxMOwogICAgSURpcmVjdDNEOSAqZDNkOTsKICAgIEhSRVNVTFQgaHI7CiAgICBIV05EIGh3bmQ7CiAgICB2b2lkICpwdHI7CgogICAgaHduZCA9IENyZWF0ZVdpbmRvdygic3RhdGljIiwgImQzZDlfdGVzdCIsCiAgICAgICAgICAgIDAsIDAsIDAsIDEwLCAxMCwgMCwgMCwgMCwgMCk7CiAgICBpZiAoIWh3bmQpCiAgICB7CiAgICAgICAgc2tpcCgiRmFpbGVkIHRvIGNyZWF0ZSB3aW5kb3dcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBkM2Q5ID0gcERpcmVjdDNEQ3JlYXRlOShEM0RfU0RLX1ZFUlNJT04pOwogICAgaWYgKCFkM2Q5KQogICAgewogICAgICAgIHNraXAoIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KCiAgICBaZXJvTWVtb3J5KCZwcmVzZW50X3BhcmFtZXRlcnMsIHNpemVvZihwcmVzZW50X3BhcmFtZXRlcnMpKTsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5XaW5kb3dlZCA9IFRSVUU7CiAgICBwcmVzZW50X3BhcmFtZXRlcnMuaERldmljZVdpbmRvdyA9IGh3bmQ7CiAgICBwcmVzZW50X3BhcmFtZXRlcnMuU3dhcEVmZmVjdCA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKGQzZDksIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwsCiAgICAgICAgICAgIE5VTEwsIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmcHJlc2VudF9wYXJhbWV0ZXJzLCAmZGV2aWNlKTsKICAgIGlmIChGQUlMRUQoaHIpIHx8ICFkZXZpY2UpCiAgICB7CiAgICAgICAgc2tpcCgiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2VcbiIpOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzLCAmdmVydGV4X2RlY2xhcmF0aW9uKTsKICAgIG9rKFNVQ0NFRURFRChociksICJDcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIHZlcnRleF9kZWNsYXJhdGlvbik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0VmVydGV4RGVjbGFyYXRpb24gZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleEJ1ZmZlcihkZXZpY2UsIHNpemVvZihxdWFkKSwgMCwgMCwgRDNEUE9PTF9ERUZBVUxULCAmdmVydGV4X2J1ZmZlciwgTlVMTCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiQ3JlYXRlVmVydGV4QnVmZmVyIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X0xvY2sodmVydGV4X2J1ZmZlciwgMCwgMCwgJnB0ciwgRDNETE9DS19ESVNDQVJEKTsKICAgIG9rKFNVQ0NFRURFRChociksICJMb2NrIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgbWVtY3B5KHB0ciwgcXVhZCwgc2l6ZW9mKHF1YWQpKTsKICAgIGhyID0gSURpcmVjdDNEVmVydGV4QnVmZmVyOV9VbmxvY2sodmVydGV4X2J1ZmZlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiVW5sb2NrIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZShkZXZpY2UsIDAsIHZlcnRleF9idWZmZXIsIDAsIHNpemVvZigqcXVhZCkpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFN0cmVhbVNvdXJjZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlSW5kZXhCdWZmZXIoZGV2aWNlLCBzaXplb2YoaW5kaWNlcyksIDAsIEQzREZNVF9JTkRFWDE2LCBEM0RQT09MX0RFRkFVTFQsICZpbmRleF9idWZmZXIsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkNyZWF0ZUluZGV4QnVmZmVyIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjlfTG9jayhpbmRleF9idWZmZXIsIDAsIDAsICZwdHIsIEQzRExPQ0tfRElTQ0FSRCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiTG9jayBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIG1lbWNweShwdHIsIGluZGljZXMsIHNpemVvZihpbmRpY2VzKSk7CiAgICBociA9IElEaXJlY3QzREluZGV4QnVmZmVyOV9VbmxvY2soaW5kZXhfYnVmZmVyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJVbmxvY2sgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBEM0RSU19MSUdIVElORywgRkFMU0UpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldFJlbmRlclN0YXRlIEQzRFJTX0xJR0hUSU5HIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKFNVQ0NFRURFRChociksICJCZWdpblNjZW5lIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgIC8qIE5VTEwgaW5kZXggYnVmZmVyLiBTaG91bGQgZmFpbCAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldEluZGljZXMoZGV2aWNlLCBOVUxMKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRJbmRpY2VzIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdJbmRleGVkUHJpbWl0aXZlKGRldmljZSwgRDNEUFRfVFJJQU5HTEVMSVNULCAwIC8qIEJhc2VWZXJ0ZXhJbmRleCAqLywgMCAvKiBNaW5JbmRleCAqLywKICAgICAgICAgICAgNCAvKiBOdW1WZXJ0cyAqLywgMCAvKiBTdGFydEluZGV4ICovLCAyIC8qUHJpbUNvdW50ICovKTsKICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIkRyYXdJbmRleGVkUHJpbWl0aXZlIHJldHVybmVkIDB4JTA4eCwgZXhwZWN0ZWQgRDNERVJSX0lOVkFMSURDQUxMICgweCUwOHgpXG4iLAogICAgICAgICAgICBociwgRDNERVJSX0lOVkFMSURDQUxMKTsKCiAgICAvKiBWYWxpZCBpbmRleCBidWZmZXIuIFNob3VsZCBzdWNjZWVkICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0SW5kaWNlcyhkZXZpY2UsIGluZGV4X2J1ZmZlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0SW5kaWNlcyBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3SW5kZXhlZFByaW1pdGl2ZShkZXZpY2UsIEQzRFBUX1RSSUFOR0xFTElTVCwgMCAvKiBCYXNlVmVydGV4SW5kZXggKi8sIDAgLyogTWluSW5kZXggKi8sCiAgICAgICAgICAgIDQgLyogTnVtVmVydHMgKi8sIDAgLyogU3RhcnRJbmRleCAqLywgMiAvKlByaW1Db3VudCAqLyk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRHJhd0luZGV4ZWRQcmltaXRpdmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRW5kU2NlbmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1ByZXNlbnQoZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIG9rKFNVQ0NFRURFRChociksICJQcmVzZW50IGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfUmVsZWFzZSh2ZXJ0ZXhfYnVmZmVyKTsKICAgIElEaXJlY3QzREluZGV4QnVmZmVyOV9SZWxlYXNlKGluZGV4X2J1ZmZlcik7CiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfUmVsZWFzZSh2ZXJ0ZXhfZGVjbGFyYXRpb24pOwoKY2xlYW51cDoKICAgIGlmIChkM2Q5KSBJRGlyZWN0M0Q5X1JlbGVhc2UoZDNkOSk7CiAgICBpZiAoZGV2aWNlKSBJRGlyZWN0M0REZXZpY2U5X1JlbGVhc2UoZGV2aWNlKTsKICAgIGlmIChod25kKSBEZXN0cm95V2luZG93KGh3bmQpOwp9CgpzdGF0aWMgdm9pZCB0ZXN0X251bGxfc3RyZWFtKHZvaWQpCnsKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmJ1ZmZlciA9IE5VTEw7CiAgICBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgcHJlc2VudF9wYXJhbWV0ZXJzOwogICAgSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlID0gTlVMTDsKICAgIElEaXJlY3QzRDkgKmQzZDk7CiAgICBIV05EIGh3bmQ7CiAgICBIUkVTVUxUIGhyOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqc2hhZGVyID0gTlVMTDsKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqZGVjbDsKICAgIERXT1JEIHNoYWRlcl9jb2RlW10gPSB7CiAgICAgICAgMHhmZmZlMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZzXzFfMSAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDFmLCAweDgwMDAwMDAwLCAweDkwMGYwMDAwLCAgICAgLyogZGNsX3Bvc2l0aW9uIHYwICAqLwogICAgICAgIDB4MDAwMDAwMDEsIDB4YzAwZjAwMDAsIDB4OTBlNDAwMDAsICAgICAvKiBtb3Ygb1BvcywgdjAgICAgICovCiAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCAgICAgICAgICAgICAgKi8KICAgIH07CiAgICBzdGF0aWMgY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgZGVjbF9lbGVtZW50c1tdID0gewogICAgICAgIHswLCAwLCAgRDNEREVDTFRZUEVfRkxPQVQzLCAgIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgRDNEREVDTFVTQUdFX1BPU0lUSU9OLCAwfSwKICAgICAgICB7MSwgMCwgIEQzRERFQ0xUWVBFX0QzRENPTE9SLCBEM0RERUNMTUVUSE9EX0RFRkFVTFQsICAgIEQzRERFQ0xVU0FHRV9DT0xPUiwgMH0sCiAgICAgICAgRDNEREVDTF9FTkQoKQogICAgfTsKCiAgICBkM2Q5ID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhkM2Q5ICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZDNkOV90ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAgICBvayhod25kICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICBpZiAoIWQzZDkgfHwgIWh3bmQpIGdvdG8gY2xlYW51cDsKCiAgICBaZXJvTWVtb3J5KCZwcmVzZW50X3BhcmFtZXRlcnMsIHNpemVvZihwcmVzZW50X3BhcmFtZXRlcnMpKTsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5XaW5kb3dlZCA9IFRSVUU7CiAgICBwcmVzZW50X3BhcmFtZXRlcnMuaERldmljZVdpbmRvdyA9IGh3bmQ7CiAgICBwcmVzZW50X3BhcmFtZXRlcnMuU3dhcEVmZmVjdCA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBkM2Q5LCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMIC8qIG5vIE5VTExSRUYgaGVyZSAqLywgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmcHJlc2VudF9wYXJhbWV0ZXJzLCAmZGV2aWNlICk7CiAgICBvayhociA9PSBEM0RfT0sgfHwgaHIgPT0gRDNERVJSX05PVEFWQUlMQUJMRSwgIklEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIWRldmljZSkKICAgIHsKICAgICAgICBza2lwKCJGYWlsZWQgdG8gY3JlYXRlIGEgZDNkIGRldmljZVxuIik7CiAgICAgICAgZ290byBjbGVhbnVwOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBzaGFkZXJfY29kZSwgJnNoYWRlcik7CiAgICBpZihGQUlMRUQoaHIpKSB7CiAgICAgICAgc2tpcCgiTm8gdmVydGV4IHNoYWRlciBzdXBwb3J0XG4iKTsKICAgICAgICBnb3RvIGNsZWFudXA7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsX2VsZW1lbnRzLCAmZGVjbCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhCdWZmZXIoZGV2aWNlLCAxMiAqIHNpemVvZihmbG9hdCksIDAsIDAsIEQzRFBPT0xfTUFOQUdFRCwgJmJ1ZmZlciwgTlVMTCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhCdWZmZXIgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZShkZXZpY2UsIDAsIGJ1ZmZlciwgMCwgc2l6ZW9mKGZsb2F0KSAqIDMpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZShkZXZpY2UsIDEsIE5VTEwsIDAsIDApOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlcihkZXZpY2UsIHNoYWRlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBkZWNsKTsKICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKGRldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBpZihTVUNDRUVERUQoaHIpKSB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmUoZGV2aWNlLCBEM0RQVF9QT0lOVExJU1QsIDAsIDEpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X0RyYXdQcmltaXRpdmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShkZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICB9CgogICAgSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UoZGV2aWNlLCAwLCBOVUxMLCAwLCAwKTsKICAgIElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgTlVMTCk7CiAgICBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgTlVMTCk7CgogICAgY2xlYW51cDoKICAgIGlmKGRlY2wpIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOV9SZWxlYXNlKGRlY2wpOwogICAgaWYoc2hhZGVyKSBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5X1JlbGVhc2Uoc2hhZGVyKTsKICAgIGlmKGRldmljZSkgSURpcmVjdDNERGV2aWNlOV9SZWxlYXNlKGRldmljZSk7CiAgICBpZihkM2Q5KSBJRGlyZWN0M0Q5X1JlbGVhc2UoZDNkOSk7Cn0KClNUQVJUX1RFU1QoZGV2aWNlKQp7CiAgICBITU9EVUxFIGQzZDlfaGFuZGxlID0gTG9hZExpYnJhcnlBKCAiZDNkOS5kbGwiICk7CiAgICBpZiAoIWQzZDlfaGFuZGxlKQogICAgewogICAgICAgIHNraXAoIkNvdWxkIG5vdCBsb2FkIGQzZDkuZGxsXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcERpcmVjdDNEQ3JlYXRlOSA9ICh2b2lkICopR2V0UHJvY0FkZHJlc3MoIGQzZDlfaGFuZGxlLCAiRGlyZWN0M0RDcmVhdGU5IiApOwogICAgb2socERpcmVjdDNEQ3JlYXRlOSAhPSBOVUxMLCAiRmFpbGVkIHRvIGdldCBhZGRyZXNzIG9mIERpcmVjdDNEQ3JlYXRlOVxuIik7CiAgICBpZiAocERpcmVjdDNEQ3JlYXRlOSkKICAgIHsKICAgICAgICB0ZXN0X2Rpc3BsYXlfbW9kZXMoKTsKICAgICAgICB0ZXN0X3N3YXBjaGFpbigpOwogICAgICAgIHRlc3RfcmVmY291bnQoKTsKICAgICAgICB0ZXN0X21pcG1hcF9sZXZlbHMoKTsKICAgICAgICB0ZXN0X2N1cnNvcigpOwogICAgICAgIHRlc3RfcmVzZXQoKTsKICAgICAgICB0ZXN0X3NjZW5lKCk7CiAgICAgICAgdGVzdF9saW1pdHMoKTsKICAgICAgICB0ZXN0X2RlcHRoc3RlbmNpbHRlc3QoKTsKICAgICAgICB0ZXN0X2RyYXdfaW5kZXhlZCgpOwogICAgICAgIHRlc3RfbnVsbF9zdHJlYW0oKTsKICAgIH0KfQo=