LyoKICogYWJzdHJhY3Rpb24gb2YgdGhlIHNwaSBpbnRlcmZhY2Ugb2YgSG9wZVJmIHJmNjkgcmFkaW8gbW9kdWxlCiAqCiAqIENvcHlyaWdodCAoQykgMjAxNiBXb2xmLUVudHdpY2tsdW5nZW4KICoJTWFyY3VzIFdvbGYgPGxpbnV4QHdvbGYtZW50d2lja2x1bmdlbi5kZT4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICovCgovKiBlbmFibGUgcHJvc2EgZGVidWcgaW5mbyAqLwojdW5kZWYgREVCVUcKLyogZW5hYmxlIHByaW50IG9mIHZhbHVlcyBvbiByZWcgYWNjZXNzICovCiN1bmRlZiBERUJVR19WQUxVRVMKLyogZW5hYmxlIHByaW50IG9mIHZhbHVlcyBvbiBmaWZvIGFjY2VzcyAqLwojdW5kZWYgREVCVUdfRklGT19BQ0NFU1MKCiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgoKI2luY2x1ZGUgInJmNjkuaCIKI2luY2x1ZGUgInJmNjlfcmVnaXN0ZXJzLmgiCgojZGVmaW5lIEZfT1NDCSAgMzIwMDAwMDAgLyogaW4gSHogKi8KI2RlZmluZSBGSUZPX1NJWkUgNjYgCSAgIC8qIGluIGJ5dGUgKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgojZGVmaW5lIFJFQURfUkVHKHgpCXJmNjlfcmVhZF9yZWcgKHNwaSwgeCkKI2RlZmluZSBXUklURV9SRUcoeCx5KQlyZjY5X3dyaXRlX3JlZyhzcGksIHgsIHkpCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKaW50IHJmNjlfc2V0X21vZGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBtb2RlIG1vZGUpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBtb2RlIik7CgkjZW5kaWYKCglzd2l0Y2ggKG1vZGUpIHsKCWNhc2UgdHJhbnNtaXQ6CSAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfT1BNT0RFLCAoUkVBRF9SRUcoUkVHX09QTU9ERSkgJiB+TUFTS19PUE1PREVfTU9ERSkgfCBPUE1PREVfTU9ERV9UUkFOU01JVCk7CgljYXNlIHJlY2VpdmU6CSAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfT1BNT0RFLCAoUkVBRF9SRUcoUkVHX09QTU9ERSkgJiB+TUFTS19PUE1PREVfTU9ERSkgfCBPUE1PREVfTU9ERV9SRUNFSVZFKTsKCWNhc2Ugc3ludGhlc2l6ZXI6IHJldHVybiBXUklURV9SRUcoUkVHX09QTU9ERSwgKFJFQURfUkVHKFJFR19PUE1PREUpICYgfk1BU0tfT1BNT0RFX01PREUpIHwgT1BNT0RFX01PREVfU1lOVEhFU0laRVIpOwoJY2FzZSBzdGFuZGJ5OgkgIHJldHVybiBXUklURV9SRUcoUkVHX09QTU9ERSwgKFJFQURfUkVHKFJFR19PUE1PREUpICYgfk1BU0tfT1BNT0RFX01PREUpIHwgT1BNT0RFX01PREVfU1RBTkRCWSk7CgljYXNlIG1vZGVfc2xlZXA6ICByZXR1cm4gV1JJVEVfUkVHKFJFR19PUE1PREUsIChSRUFEX1JFRyhSRUdfT1BNT0RFKSAmIH5NQVNLX09QTU9ERV9NT0RFKSB8IE9QTU9ERV9NT0RFX1NMRUVQKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyB3ZSBhcmUgdXNpbmcgcGFja2V0IG1vZGUsIHNvIHRoaXMgY2hlY2sgaXMgbm90IHJlYWxseSBuZWVkZWQKCS8vIGJ1dCB3YWl0aW5nIGZvciBtb2RlIHJlYWR5IGlzIG5lY2Vzc2FyeSB3aGVuIGdvaW5nIGZyb20gc2xlZXAgYmVjYXVzZSB0aGUgRklGTyBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSBmcm9tIHByZXZpb3VzIG1vZGUKCS8vd2hpbGUgKF9tb2RlID09IFJGNjlfTU9ERV9TTEVFUCAmJiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMSkgJiBSRl9JUlFGTEFHUzFfTU9ERVJFQURZKSA9PSAweDAwKTsgLy8gV2FpdCBmb3IgTW9kZVJlYWR5Cgp9CgppbnQgcmY2OV9zZXRfZGF0YV9tb2RlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gZGF0YU1vZGUgZGF0YU1vZGUpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBkYXRhIG1vZGUiKTsKCSNlbmRpZgoKCXN3aXRjaCAoZGF0YU1vZGUpIHsKCWNhc2UgcGFja2V0OgkJcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9ERSkgfCBEQVRBTU9EVUxfTU9ERV9QQUNLRVQpOwoJY2FzZSBjb250aW51b3VzOglyZXR1cm4gV1JJVEVfUkVHKFJFR19EQVRBTU9EVUwsIChSRUFEX1JFRyhSRUdfREFUQU1PRFVMKSAmIH5NQVNLX0RBVEFNT0RVTF9NT0RFKSB8IERBVEFNT0RVTF9NT0RFX0NPTlRJTlVPVVMpOwoJY2FzZSBjb250aW51b3VzTm9TeW5jOiAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9ERSkgfCBEQVRBTU9EVUxfTU9ERV9DT05USU5VT1VTX05PU1lOQyk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9tb2R1bGF0aW9uKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gbW9kdWxhdGlvbiBtb2R1bGF0aW9uKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogbW9kdWxhdGlvbiIpOwoJI2VuZGlmCgoJc3dpdGNoIChtb2R1bGF0aW9uKSB7CgljYXNlIE9PSzogICByZXR1cm4gV1JJVEVfUkVHKFJFR19EQVRBTU9EVUwsIChSRUFEX1JFRyhSRUdfREFUQU1PRFVMKSAmIH5NQVNLX0RBVEFNT0RVTF9NT0RVTEFUSU9OX1RZUEUpIHwgREFUQU1PRFVMX01PRFVMQVRJT05fVFlQRV9PT0spOwoJY2FzZSBGU0s6ICAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9UWVBFKSB8IERBVEFNT0RVTF9NT0RVTEFUSU9OX1RZUEVfRlNLKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKZW51bSBtb2R1bGF0aW9uIHJmNjlfZ2V0X21vZHVsYXRpb24oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKewoJdTggY3VycmVudFZhbHVlOwoKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAiZ2V0OiBtb2RlIik7CgkjZW5kaWYKCgljdXJyZW50VmFsdWUgPSBSRUFEX1JFRyhSRUdfREFUQU1PRFVMKTsKCglzd2l0Y2ggKGN1cnJlbnRWYWx1ZSAmIE1BU0tfREFUQU1PRFVMX01PRFVMQVRJT05fVFlQRSA+PiAzKSB7IC8vIFRPRE8gaW1wcm92ZW1lbnQ6IGNoYW5nZSAzIHRvIGRlZmluZQoJY2FzZSBEQVRBTU9EVUxfTU9EVUxBVElPTl9UWVBFX09PSzogcmV0dXJuIE9PSzsKCWNhc2UgREFUQU1PRFVMX01PRFVMQVRJT05fVFlQRV9GU0s6IHJldHVybiBGU0s7CglkZWZhdWx0OgkJCSAgICByZXR1cm4gdW5kZWZpbmVkOwoJfQp9CgppbnQgcmY2OV9zZXRfbW9kdWxhdGlvbl9zaGFwaW5nKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gbW9kU2hhcGluZyBtb2RTaGFwaW5nKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogbW9kIHNoYXBpbmciKTsKCSNlbmRpZgoKCWlmIChyZjY5X2dldF9tb2R1bGF0aW9uKHNwaSkgPT0gRlNLKSB7CgkJc3dpdGNoIChtb2RTaGFwaW5nKSB7CgkJY2FzZSBzaGFwaW5nT2ZmOiByZXR1cm4gV1JJVEVfUkVHKFJFR19EQVRBTU9EVUwsIChSRUFEX1JFRyhSRUdfREFUQU1PRFVMKSAmIH5NQVNLX0RBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFKSB8IERBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFX05PTkUpOwoJCWNhc2Ugc2hhcGluZzFfMDogcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRV8xXzApOwoJCWNhc2Ugc2hhcGluZzBfNTogcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRV8wXzMpOwoJCWNhc2Ugc2hhcGluZzBfMzogcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRV8wXzUpOwoJCWRlZmF1bHQ6CgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJCXJldHVybiAtRUlOVkFMOwoJCX0KCX0gZWxzZSB7CgkJc3dpdGNoIChtb2RTaGFwaW5nKSB7CgkJY2FzZSBzaGFwaW5nT2ZmOiByZXR1cm4gV1JJVEVfUkVHKFJFR19EQVRBTU9EVUwsIChSRUFEX1JFRyhSRUdfREFUQU1PRFVMKSAmIH5NQVNLX0RBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFKSB8IERBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFX05PTkUpOwoJCWNhc2Ugc2hhcGluZ0JSOgkgcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRV9CUik7CgkJY2FzZSBzaGFwaW5nMkJSOiByZXR1cm4gV1JJVEVfUkVHKFJFR19EQVRBTU9EVUwsIChSRUFEX1JFRyhSRUdfREFUQU1PRFVMKSAmIH5NQVNLX0RBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFKSB8IERBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFXzJCUik7CgkJZGVmYXVsdDoKCQkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQkJcmV0dXJuIC1FSU5WQUw7CgkJfQoJfQp9CgppbnQgcmY2OV9zZXRfYml0X3JhdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTE2IGJpdFJhdGUpCnsKCWludCByZXR2YWw7Cgl1MzIgYml0UmF0ZV9taW47Cgl1MzIgYml0UmF0ZV9yZWc7Cgl1OCBtc2I7Cgl1OCBsc2I7CgoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGJpdCByYXRlIik7CgkjZW5kaWYKCgkvLyBjaGVjayBpbnB1dCB2YWx1ZQoJYml0UmF0ZV9taW4gPSBGX09TQyAvIDgzODg2MDg7IC8vIDgzODg2MDggPSAyXjIzOwoJaWYgKGJpdFJhdGUgPCBiaXRSYXRlX21pbikgewoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0Qml0UmF0ZTogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8vIGNhbGN1bGF0ZSByZWcgc2V0dGluZ3MKCWJpdFJhdGVfcmVnID0gKEZfT1NDIC8gYml0UmF0ZSk7CgoJbXNiID0gKGJpdFJhdGVfcmVnJjB4ZmYwMCkgICA+PiAgODsKCWxzYiA9IChiaXRSYXRlX3JlZyYweGZmKTsKCgkvLyB0cmFuc21pdCB0byBSRiA2OQoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19CSVRSQVRFX01TQiwgbXNiKTsKCWlmIChyZXR2YWwpICByZXR1cm4gcmV0dmFsOwoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19CSVRSQVRFX0xTQiwgbHNiKTsKCWlmIChyZXR2YWwpICByZXR1cm4gcmV0dmFsOwoKCXJldHVybiAwOwp9CgppbnQgcmY2OV9zZXRfZGV2aWF0aW9uKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHUzMiBkZXZpYXRpb24pCnsKCWludCByZXR2YWw7Ci8vCXUzMiBmX21heDsgVE9ETzogQWJo5G5naWdrZWl0IHZvbiBCaXRyYXRlIGJlYWNodGVuISEKCXU2NCBmX3JlZzsKCXU2NCBmX3N0ZXA7Cgl1OCBtc2I7Cgl1OCBsc2I7Cgl1NjQgZmFjdG9yID0gMTAwMDAwMDsgLy8gdG8gaW1wcm92ZSBwcmVjaXNpb24gb2YgY2FsY3VsYXRpb24KCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogZGV2aWF0aW9uIik7CgkjZW5kaWYKCglpZiAoZGV2aWF0aW9uIDwgNjAwIHx8IGRldmlhdGlvbiA+IDUwMDAwMCkgeyAvL1RPRE86IEFiaORuZ2lna2VpdCB2b24gQml0cmF0ZSBiZWFjaHRlbiEhCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXRfZGV2aWF0aW9uOiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLy8gY2FsY3VsYXQgZiBzdGVwCglmX3N0ZXAgPSBGX09TQyAqIGZhY3RvcjsKCWRvX2RpdihmX3N0ZXAsIDUyNDI4OCk7IC8vICA1MjQyODggPSAyXjE5CgoJLy8gY2FsY3VsYXRlIHJlZ2lzdGVyIHNldHRpbmdzCglmX3JlZyA9IGRldmlhdGlvbiAqIGZhY3RvcjsKCWRvX2RpdihmX3JlZyAgLCBmX3N0ZXApOwoKCW1zYiA9IChmX3JlZyYweGZmMDApICAgPj4gIDg7Cglsc2IgPSAoZl9yZWcmMHhmZik7CgoJLy8gY2hlY2sgbXNiCglpZiAobXNiICYgfkZERVZNQVNCX01BU0spIHsKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldF9kZXZpYXRpb246IGVyciBpbiBjYWxjIG9mIG1zYiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8vIHdyaXRlIHRvIGNoaXAKCXJldHZhbCA9IFdSSVRFX1JFRyhSRUdfRkRFVl9NU0IsIG1zYik7CglpZiAocmV0dmFsKSAgcmV0dXJuIHJldHZhbDsKCXJldHZhbCA9IFdSSVRFX1JFRyhSRUdfRkRFVl9MU0IsIGxzYik7CglpZiAocmV0dmFsKSAgcmV0dXJuIHJldHZhbDsKCglyZXR1cm4gMDsKfQoKaW50IHJmNjlfc2V0X2ZyZXF1ZW5jeShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1MzIgZnJlcXVlbmN5KQp7CglpbnQgcmV0dmFsOwoJdTMyIGZfbWF4OwoJdTY0IGZfcmVnOwoJdTY0IGZfc3RlcDsKCXU4IG1zYjsKCXU4IG1pZDsKCXU4IGxzYjsKCXU2NCBmYWN0b3IgPSAxMDAwMDAwOyAvLyB0byBpbXByb3ZlIHByZWNpc2lvbiBvZiBjYWxjdWxhdGlvbgoKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBmcmVxdWVuY3kiKTsKCSNlbmRpZgoKCS8vIGNhbGN1bGF0IGYgc3RlcAoJZl9zdGVwID0gRl9PU0MgKiBmYWN0b3I7Cglkb19kaXYoZl9zdGVwLCA1MjQyODgpOyAvLyAgNTI0Mjg4ID0gMl4xOQoKCS8vIGNoZWNrIGlucHV0IHZhbHVlCglmX21heCA9IGRpdl91NjQoZl9zdGVwICogODM4ODYwOCwgZmFjdG9yKTsKCWlmIChmcmVxdWVuY3kgPiBmX21heCkgewoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0RnJlcXVlbmN5OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLy8gY2FsY3VsYXRlIHJlZyBzZXR0aW5ncwoJZl9yZWcgPSBmcmVxdWVuY3kgKiBmYWN0b3I7Cglkb19kaXYoZl9yZWcgICwgZl9zdGVwKTsKCgltc2IgPSAoZl9yZWcmMHhmZjAwMDApID4+IDE2OwoJbWlkID0gKGZfcmVnJjB4ZmYwMCkgICA+PiAgODsKCWxzYiA9IChmX3JlZyYweGZmKTsKCgkvLyB3cml0ZSB0byBjaGlwCglyZXR2YWwgPSBXUklURV9SRUcoUkVHX0ZSRl9NU0IsIG1zYik7CglpZiAocmV0dmFsKSAgcmV0dXJuIHJldHZhbDsKCXJldHZhbCA9IFdSSVRFX1JFRyhSRUdfRlJGX01JRCwgbWlkKTsKCWlmIChyZXR2YWwpICByZXR1cm4gcmV0dmFsOwoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19GUkZfTFNCLCBsc2IpOwoJaWYgKHJldHZhbCkgIHJldHVybiByZXR2YWw7CgoJcmV0dXJuIDA7Cn0KCmludCByZjY5X3NldF9hbXBsaWZpZXJfMChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIG9wdGlvbk9uT2ZmIG9wdGlvbk9uT2ZmKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYW1wICMwIik7CgkjZW5kaWYKCglzd2l0Y2gob3B0aW9uT25PZmYpIHsKCWNhc2Ugb3B0aW9uT246CXJldHVybiBXUklURV9SRUcoUkVHX1BBTEVWRUwsIChSRUFEX1JFRyhSRUdfUEFMRVZFTCkgfCAgTUFTS19QQUxFVkVMX1BBMCkgKTsKCWNhc2Ugb3B0aW9uT2ZmOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQUxFVkVMLCAoUkVBRF9SRUcoUkVHX1BBTEVWRUwpICYgfk1BU0tfUEFMRVZFTF9QQTApICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9hbXBsaWZpZXJfMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIG9wdGlvbk9uT2ZmIG9wdGlvbk9uT2ZmKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYW1wICMxIik7CgkjZW5kaWYKCglzd2l0Y2gob3B0aW9uT25PZmYpIHsKCWNhc2Ugb3B0aW9uT246CXJldHVybiBXUklURV9SRUcoUkVHX1BBTEVWRUwsIChSRUFEX1JFRyhSRUdfUEFMRVZFTCkgfCAgTUFTS19QQUxFVkVMX1BBMSkgKTsKCWNhc2Ugb3B0aW9uT2ZmOiByZXR1cm4gV1JJVEVfUkVHKFJFR19QQUxFVkVMLCAoUkVBRF9SRUcoUkVHX1BBTEVWRUwpICYgfk1BU0tfUEFMRVZFTF9QQTEpICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9hbXBsaWZpZXJfMihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIG9wdGlvbk9uT2ZmIG9wdGlvbk9uT2ZmKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYW1wICMyIik7CgkjZW5kaWYKCglzd2l0Y2gob3B0aW9uT25PZmYpIHsKCWNhc2Ugb3B0aW9uT246CXJldHVybiBXUklURV9SRUcoUkVHX1BBTEVWRUwsIChSRUFEX1JFRyhSRUdfUEFMRVZFTCkgfCAgTUFTS19QQUxFVkVMX1BBMikgKTsKCWNhc2Ugb3B0aW9uT2ZmOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQUxFVkVMLCAoUkVBRF9SRUcoUkVHX1BBTEVWRUwpICYgfk1BU0tfUEFMRVZFTF9QQTIpICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9vdXRwdXRfcG93ZXJfbGV2ZWwoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggcG93ZXJMZXZlbCkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHBvd2VyIGxldmVsIik7CgkjZW5kaWYKCglwb3dlckxldmVsICs9MTg7IC8vIFRPRE8gQWJo5G5naWdrZWl0IHZvbiBQQTAsMSwyIHNldHRpbmcKCgkvLyBjaGVjayBpbnB1dCB2YWx1ZQoJaWYgKHBvd2VyTGV2ZWwgPiAweDFmKSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyB3cml0ZSB2YWx1ZQoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFMRVZFTCwgKFJFQURfUkVHKFJFR19QQUxFVkVMKSAmIH5NQVNLX1BBTEVWRUxfT1VUUFVUX1BPV0VSKSB8IHBvd2VyTGV2ZWwpOwp9CgppbnQgcmY2OV9zZXRfcGFfcmFtcChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIHBhUmFtcCBwYVJhbXApCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBwYSByYW1wIik7CgkjZW5kaWYKCglzd2l0Y2gocGFSYW1wKSB7CgljYXNlIHJhbXAzNDAwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8zNDAwKTsKCWNhc2UgcmFtcDIwMDA6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzIwMDApOwoJY2FzZSByYW1wMTAwMDoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfMTAwMCk7CgljYXNlIHJhbXA1MDA6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzUwMCk7CgljYXNlIHJhbXAyNTA6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzI1MCk7CgljYXNlIHJhbXAxMjU6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzEyNSk7CgljYXNlIHJhbXAxMDA6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzEwMCk7CgljYXNlIHJhbXA2MjoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfNjIpOwoJY2FzZSByYW1wNTA6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzUwKTsKCWNhc2UgcmFtcDQwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF80MCk7CgljYXNlIHJhbXAzMToJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfMzEpOwoJY2FzZSByYW1wMjU6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzI1KTsKCWNhc2UgcmFtcDIwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8yMCk7CgljYXNlIHJhbXAxNToJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfMTUpOwoJY2FzZSByYW1wMTI6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzEyKTsKCWNhc2UgcmFtcDEwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8xMCk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9hbnRlbm5hX2ltcGVkYW5jZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIGFudGVubmFJbXBlZGFuY2UgYW50ZW5uYUltcGVkYW5jZSkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGFudGVubmEgaW1wZWRhbmNlIik7CgkjZW5kaWYKCglzd2l0Y2goYW50ZW5uYUltcGVkYW5jZSkgewoJY2FzZSBmaWZ0eU9obToJICAgIHJldHVybiBXUklURV9SRUcoUkVHX0xOQSwgKFJFQURfUkVHKFJFR19MTkEpICYgfk1BU0tfTE5BX1pJTikgKTsKCWNhc2UgdHdvaHVuZHJldE9obTogcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoUkVBRF9SRUcoUkVHX0xOQSkgfCAgTUFTS19MTkFfWklOKSApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfbG5hX2dhaW4oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBsbmFHYWluIGxuYUdhaW4pCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBsbmEgZ2FpbiIpOwoJI2VuZGlmCgoJc3dpdGNoKGxuYUdhaW4pIHsKCWNhc2UgYXV0b21hdGljOgkgcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoIChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX0FVVE8pICk7CgljYXNlIG1heDoJIHJldHVybiBXUklURV9SRUcoUkVHX0xOQSwgKCAoUkVBRF9SRUcoUkVHX0xOQSkgJiB+TUFTS19MTkFfR0FJTikgJiBMTkFfR0FJTl9NQVgpICk7CgljYXNlIG1heE1pbnVzNjogIHJldHVybiBXUklURV9SRUcoUkVHX0xOQSwgKCAoUkVBRF9SRUcoUkVHX0xOQSkgJiB+TUFTS19MTkFfR0FJTikgJiBMTkFfR0FJTl9NQVhfTUlOVVNfNikgKTsKCWNhc2UgbWF4TWludXMxMjogcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoIChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX01BWF9NSU5VU18xMikgKTsKCWNhc2UgbWF4TWludXMyNDogcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoIChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX01BWF9NSU5VU18yNCkgKTsKCWNhc2UgbWF4TWludXMzNjogcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoIChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX01BWF9NSU5VU18zNikgKTsKCWNhc2UgbWF4TWludXM0ODogcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoIChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX01BWF9NSU5VU180OCkgKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKZW51bSBsbmFHYWluIHJmNjlfZ2V0X2xuYV9nYWluKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCnsKCXU4IGN1cnJlbnRWYWx1ZTsKCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgImdldDogbG5hIGdhaW4iKTsKCSNlbmRpZgoKCWN1cnJlbnRWYWx1ZSA9IFJFQURfUkVHKFJFR19MTkEpOwoKCXN3aXRjaCAoY3VycmVudFZhbHVlICYgTUFTS19MTkFfQ1VSUkVOVF9HQUlOID4+IDMpIHsgLy8gaW1wcm92ZW1lbnQ6IGNoYW5nZSAzIHRvIGRlZmluZQoJY2FzZSBMTkFfR0FJTl9BVVRPOgkgICAgcmV0dXJuIGF1dG9tYXRpYzsKCWNhc2UgTE5BX0dBSU5fTUFYOgkgICAgcmV0dXJuIG1heDsKCWNhc2UgTE5BX0dBSU5fTUFYX01JTlVTXzY6ICByZXR1cm4gbWF4TWludXM2OwoJY2FzZSBMTkFfR0FJTl9NQVhfTUlOVVNfMTI6IHJldHVybiBtYXhNaW51czEyOwoJY2FzZSBMTkFfR0FJTl9NQVhfTUlOVVNfMjQ6IHJldHVybiBtYXhNaW51czI0OwoJY2FzZSBMTkFfR0FJTl9NQVhfTUlOVVNfMzY6IHJldHVybiBtYXhNaW51czM2OwoJY2FzZSBMTkFfR0FJTl9NQVhfTUlOVVNfNDg6IHJldHVybiBtYXhNaW51czQ4OwoJZGVmYXVsdDoJCSAgICByZXR1cm4gdW5kZWZpbmVkOwoJfQp9CgppbnQgcmY2OV9zZXRfZGNfY3V0X29mZl9mcmVxdWVuY3lfaW50ZXJuKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkgLHU4IHJlZywgZW51bSBkY2NQZXJjZW50IGRjY1BlcmNlbnQpCnsKCXN3aXRjaCAoZGNjUGVyY2VudCkgewoJY2FzZSBkY2MxNlBlcmNlbnQ6CXJldHVybiBXUklURV9SRUcocmVnLCAoIChSRUFEX1JFRyhyZWcpICYgfk1BU0tfQldfRENDX0ZSRVEpIHwgQldfRENDXzE2X1BFUkNFTlQpICk7CgljYXNlIGRjYzhQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKCAoUkVBRF9SRUcocmVnKSAmIH5NQVNLX0JXX0RDQ19GUkVRKSB8IEJXX0RDQ184X1BFUkNFTlQpICk7CgljYXNlIGRjYzRQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKCAoUkVBRF9SRUcocmVnKSAmIH5NQVNLX0JXX0RDQ19GUkVRKSB8IEJXX0RDQ180X1BFUkNFTlQpICk7CgljYXNlIGRjYzJQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKCAoUkVBRF9SRUcocmVnKSAmIH5NQVNLX0JXX0RDQ19GUkVRKSB8IEJXX0RDQ18yX1BFUkNFTlQpICk7CgljYXNlIGRjYzFQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKCAoUkVBRF9SRUcocmVnKSAmIH5NQVNLX0JXX0RDQ19GUkVRKSB8IEJXX0RDQ18xX1BFUkNFTlQpICk7CgljYXNlIGRjYzBfNVBlcmNlbnQ6CXJldHVybiBXUklURV9SRUcocmVnLCAoIChSRUFEX1JFRyhyZWcpICYgfk1BU0tfQldfRENDX0ZSRVEpIHwgQldfRENDXzBfNV9QRVJDRU5UKSApOwoJY2FzZSBkY2MwXzI1UGVyY2VudDoJcmV0dXJuIFdSSVRFX1JFRyhyZWcsICggKFJFQURfUkVHKHJlZykgJiB+TUFTS19CV19EQ0NfRlJFUSkgfCBCV19EQ0NfMF8yNV9QRVJDRU5UKSApOwoJY2FzZSBkY2MwXzEyNVBlcmNlbnQ6CXJldHVybiBXUklURV9SRUcocmVnLCAoIChSRUFEX1JFRyhyZWcpICYgfk1BU0tfQldfRENDX0ZSRVEpIHwgQldfRENDXzBfMTI1X1BFUkNFTlQpICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9kY19jdXRfb2ZmX2ZyZXF1ZW5jeShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIGRjY1BlcmNlbnQgZGNjUGVyY2VudCkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGN1dCBvZmYgZnJlcSIpOwoJI2VuZGlmCgoJcmV0dXJuIHJmNjlfc2V0X2RjX2N1dF9vZmZfZnJlcXVlbmN5X2ludGVybihzcGksIFJFR19SWEJXLCBkY2NQZXJjZW50KTsKfQoKaW50IHJmNjlfc2V0X2RjX2N1dF9vZmZfZnJlcXVlbmN5X2R1cmluZ19hZmMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBkY2NQZXJjZW50IGRjY1BlcmNlbnQpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBjdXQgb2ZmIGZyZXEgZHVyaW5nIGFmYyIpOwoJI2VuZGlmCgoJcmV0dXJuIHJmNjlfc2V0X2RjX2N1dF9vZmZfZnJlcXVlbmN5X2ludGVybihzcGksIFJFR19BRkNCVywgZGNjUGVyY2VudCk7Cn0KCnN0YXRpYyBpbnQgcmY2OV9zZXRfYmFuZHdpZHRoX2ludGVybihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCByZWcsCgkJCQkgICAgIGVudW0gbWFudGlzc2UgbWFudGlzc2UsIHU4IGV4cG9uZW50KQp7Cgl1OCBuZXdWYWx1ZTsKCgkvLyBjaGVjayB2YWx1ZSBmb3IgbWFudGlzc2UgYW5kIGV4cG9uZW50CglpZiAoZXhwb25lbnQgPiA3KSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglpZiAoKG1hbnRpc3NlICE9IG1hbnRpc3NlMTYpICYmCgkgICAgKG1hbnRpc3NlICE9IG1hbnRpc3NlMjApICYmCgkgICAgKG1hbnRpc3NlICE9IG1hbnRpc3NlMjQpKSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyByZWFkIG9sZCB2YWx1ZQoJbmV3VmFsdWUgPSBSRUFEX1JFRyhyZWcpOwoKCS8vICJkZWxldGUiIG1hbnRpc3NlIGFuZCBleHBvbmVudCA9IGp1c3Qga2VlcCB0aGUgRENDIHNldHRpbmcKCW5ld1ZhbHVlID0gbmV3VmFsdWUgJiBNQVNLX0JXX0RDQ19GUkVROwoKCS8vIGFkZCBuZXcgbWFudGlzc2UKCXN3aXRjaChtYW50aXNzZSkgewoJY2FzZSBtYW50aXNzZTE2OiBuZXdWYWx1ZSA9IG5ld1ZhbHVlIHwgQldfTUFOVF8xNjsJYnJlYWs7CgljYXNlIG1hbnRpc3NlMjA6IG5ld1ZhbHVlID0gbmV3VmFsdWUgfCBCV19NQU5UXzIwOwlicmVhazsKCWNhc2UgbWFudGlzc2UyNDogbmV3VmFsdWUgPSBuZXdWYWx1ZSB8IEJXX01BTlRfMjQ7CWJyZWFrOwoJfQoKCS8vIGFkZCBuZXcgZXhwb25lbnQKCW5ld1ZhbHVlID0gbmV3VmFsdWUgfCBleHBvbmVudDsKCgkvLyB3cml0ZSBiYWNrCglyZXR1cm4gV1JJVEVfUkVHKHJlZywgbmV3VmFsdWUpOwp9CgppbnQgcmY2OV9zZXRfYmFuZHdpZHRoKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gbWFudGlzc2UgbWFudGlzc2UsIHU4IGV4cG9uZW50KQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYmFuZCB3aWR0aCIpOwoJI2VuZGlmCgoJcmV0dXJuIHJmNjlfc2V0X2JhbmR3aWR0aF9pbnRlcm4oc3BpLCBSRUdfUlhCVywgbWFudGlzc2UsIGV4cG9uZW50KTsKfQoKaW50IHJmNjlfc2V0X2JhbmR3aWR0aF9kdXJpbmdfYWZjKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gbWFudGlzc2UgbWFudGlzc2UsIHU4IGV4cG9uZW50KQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYmFuZCB3aWR0aCBkdXJpbmcgYWZjIik7CgkjZW5kaWYKCglyZXR1cm4gcmY2OV9zZXRfYmFuZHdpZHRoX2ludGVybihzcGksIFJFR19BRkNCVywgbWFudGlzc2UsIGV4cG9uZW50KTsKfQoKaW50IHJmNjlfc2V0X29va190aHJlc2hvbGRfdHlwZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIHRocmVzaG9sZFR5cGUgdGhyZXNob2xkVHlwZSkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHRocmVzaG9sZCB0eXBlIik7CgkjZW5kaWYKCglzd2l0Y2ggKHRocmVzaG9sZFR5cGUpIHsKCWNhc2UgZml4ZWQ6CXJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICggKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNUWVBFKSB8IE9PS1BFQUtfVEhSRVNIVFlQRV9GSVhFRCkgKTsKCWNhc2UgcGVhazoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfT09LUEVBSywgKCAoUkVBRF9SRUcoUkVHX09PS1BFQUspICYgfk1BU0tfT09LUEVBS19USFJFU1RZUEUpIHwgT09LUEVBS19USFJFU0hUWVBFX1BFQUspICk7CgljYXNlIGF2ZXJhZ2U6CXJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICggKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNUWVBFKSB8IE9PS1BFQUtfVEhSRVNIVFlQRV9BVkVSQUdFKSApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfb29rX3RocmVzaG9sZF9zdGVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gdGhyZXNob2xkU3RlcCB0aHJlc2hvbGRTdGVwKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogdGhyZXNob2xkIHN0ZXAiKTsKCSNlbmRpZgoKCXN3aXRjaCAodGhyZXNob2xkU3RlcCkgewoJY2FzZSBzdGVwXzBfNWRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfMF81X0RCKSApOwoJY2FzZSBzdGVwXzFfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfMV8wX0RCKSApOwoJY2FzZSBzdGVwXzFfNWRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfMV81X0RCKSApOwoJY2FzZSBzdGVwXzJfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfMl8wX0RCKSApOwoJY2FzZSBzdGVwXzNfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfM18wX0RCKSApOwoJY2FzZSBzdGVwXzRfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfNF8wX0RCKSApOwoJY2FzZSBzdGVwXzVfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfNV8wX0RCKSApOwoJY2FzZSBzdGVwXzZfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfNl8wX0RCKSApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfb29rX3RocmVzaG9sZF9kZWMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSB0aHJlc2hvbGREZWNyZW1lbnQgdGhyZXNob2xkRGVjcmVtZW50KQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogdGhyZXNob2xkIGRlY3JlbWVudCIpOwoJI2VuZGlmCgoJc3dpdGNoICh0aHJlc2hvbGREZWNyZW1lbnQpIHsKCWNhc2UgZGVjX2V2ZXJ5OHRoOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDX0VWRVJZXzhUSCkgKTsKCWNhc2UgZGVjX2V2ZXJ5NHRoOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDX0VWRVJZXzRUSCkgKTsKCWNhc2UgZGVjX2V2ZXJ5Mm5kOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDX0VWRVJZXzJORCkgKTsKCWNhc2UgZGVjX29uY2U6CSAgIHJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICggKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNERUMpIHwgT09LUEVBS19USFJFU0hERUNfT05DRSkgKTsKCWNhc2UgZGVjX3R3aWNlOgkgICByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDX1RXSUNFKSApOwoJY2FzZSBkZWNfNHRpbWVzOiAgIHJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICggKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNERUMpIHwgT09LUEVBS19USFJFU0hERUNfNF9USU1FUykgKTsKCWNhc2UgZGVjXzh0aW1lczogICByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDXzhfVElNRVMpICk7CgljYXNlIGRlY18xNnRpbWVzOiAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfT09LUEVBSywgKCAoUkVBRF9SRUcoUkVHX09PS1BFQUspICYgfk1BU0tfT09LUEVBS19USFJFU0RFQykgfCBPT0tQRUFLX1RIUkVTSERFQ18xNl9USU1FUykgKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKaW50IHJmNjlfc2V0X2Rpb19tYXBwaW5nKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IERJT051bWJlciwgdTggdmFsdWUpCnsKCXU4IG1hc2s7Cgl1OCBzaGlmdDsKCXU4IHJlZ2FkZHI7Cgl1OCByZWdWYWx1ZTsKCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogRElPIG1hcHBpbmciKTsKCSNlbmRpZgoKCS8vIGNoZWNrIERJTyBudW1iZXIKCWlmIChESU9OdW1iZXIgPiA1KSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglzd2l0Y2ggKERJT051bWJlcikgewoJY2FzZSAwOiBtYXNrPU1BU0tfRElPMDsgc2hpZnQ9U0hJRlRfRElPMDsgcmVnYWRkcj1SRUdfRElPTUFQUElORzE7IGJyZWFrOwoJY2FzZSAxOiBtYXNrPU1BU0tfRElPMTsgc2hpZnQ9U0hJRlRfRElPMTsgcmVnYWRkcj1SRUdfRElPTUFQUElORzE7IGJyZWFrOwoJY2FzZSAyOiBtYXNrPU1BU0tfRElPMjsgc2hpZnQ9U0hJRlRfRElPMjsgcmVnYWRkcj1SRUdfRElPTUFQUElORzE7IGJyZWFrOwoJY2FzZSAzOiBtYXNrPU1BU0tfRElPMzsgc2hpZnQ9U0hJRlRfRElPMzsgcmVnYWRkcj1SRUdfRElPTUFQUElORzE7IGJyZWFrOwoJY2FzZSA0OiBtYXNrPU1BU0tfRElPNDsgc2hpZnQ9U0hJRlRfRElPNDsgcmVnYWRkcj1SRUdfRElPTUFQUElORzI7IGJyZWFrOwoJY2FzZSA1OiBtYXNrPU1BU0tfRElPNTsgc2hpZnQ9U0hJRlRfRElPNTsgcmVnYWRkcj1SRUdfRElPTUFQUElORzI7IGJyZWFrOwoJfQoKCS8vIHJlYWQgcmVnCglyZWdWYWx1ZT1SRUFEX1JFRyhyZWdhZGRyKTsKCS8vIGRlbGV0ZSBvbGQgdmFsdWUKCXJlZ1ZhbHVlID0gcmVnVmFsdWUgJiB+bWFzazsKCS8vIGFkZCBuZXcgdmFsdWUKCXJlZ1ZhbHVlID0gcmVnVmFsdWUgfCB2YWx1ZSA8PCBzaGlmdDsKCS8vIHdyaXRlIGJhY2sKCXJldHVybiBXUklURV9SRUcocmVnYWRkcixyZWdWYWx1ZSk7Cn0KCmJvb2wgcmY2OV9nZXRfZmxhZyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIGZsYWcgZmxhZykKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJnZXQ6IGZsYWciKTsKCSNlbmRpZgoKCXN3aXRjaChmbGFnKSB7CgljYXNlIG1vZGVTd2l0Y2hDb21wbGV0ZWQ6ICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzEpICYgTUFTS19JUlFGTEFHUzFfTU9ERV9SRUFEWSk7CgljYXNlIHJlYWR5VG9SZWNlaXZlOgkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzEpICYgTUFTS19JUlFGTEFHUzFfUlhfUkVBRFkpOwoJY2FzZSByZWFkeVRvU2VuZDoJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MxKSAmIE1BU0tfSVJRRkxBR1MxX1RYX1JFQURZKTsKCWNhc2UgcGxsTG9ja2VkOgkJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MxKSAmIE1BU0tfSVJRRkxBR1MxX1BMTF9MT0NLKTsKCWNhc2UgcnNzaUV4Y2VlZGVkVGhyZXNob2xkOiAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMSkgJiBNQVNLX0lSUUZMQUdTMV9SU1NJKTsKCWNhc2UgdGltZW91dDoJCSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMSkgJiBNQVNLX0lSUUZMQUdTMV9USU1FT1VUKTsKCWNhc2UgYXV0b21vZGU6CQkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzEpICYgTUFTS19JUlFGTEFHUzFfQVVUT01PREUpOwoJY2FzZSBzeW5jQWRkcmVzc01hdGNoOgkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzEpICYgTUFTS19JUlFGTEFHUzFfU1lOQ19BRERSRVNTX01BVENIKTsKCWNhc2UgZmlmb0Z1bGw6CQkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzIpICYgTUFTS19JUlFGTEFHUzJfRklGT19GVUxMKTsKLyoJY2FzZSBmaWZvTm90RW1wdHk6CSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMikgJiBNQVNLX0lSUUZMQUdTMl9GSUZPX05PVF9FTVBUWSk7ICovCgljYXNlIGZpZm9FbXB0eToJCSAgICAgIHJldHVybiAhKFJFQURfUkVHKFJFR19JUlFGTEFHUzIpICYgTUFTS19JUlFGTEFHUzJfRklGT19OT1RfRU1QVFkpOwoJY2FzZSBmaWZvTGV2ZWxCZWxvd1RocmVzaG9sZDogcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MyKSAmIE1BU0tfSVJRRkxBR1MyX0ZJRk9fTEVWRUwpOwoJY2FzZSBmaWZvT3ZlcnJ1bjoJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MyKSAmIE1BU0tfSVJRRkxBR1MyX0ZJRk9fT1ZFUlJVTik7CgljYXNlIHBhY2tldFNlbnQ6CSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMikgJiBNQVNLX0lSUUZMQUdTMl9QQUNLRVRfU0VOVCk7CgljYXNlIHBheWxvYWRSZWFkeToJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MyKSAmIE1BU0tfSVJRRkxBR1MyX1BBWUxPQURfUkVBRFkpOwoJY2FzZSBjcmNPazoJCSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMikgJiBNQVNLX0lSUUZMQUdTMl9DUkNfT0spOwoJY2FzZSBiYXR0ZXJ5TG93OgkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzIpICYgTUFTS19JUlFGTEFHUzJfTE9XX0JBVCk7CglkZWZhdWx0OgkJICAgICAgcmV0dXJuIGZhbHNlOwoJfQp9CgppbnQgcmY2OV9yZXNldF9mbGFnKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gZmxhZyBmbGFnKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInJlc2V0OiBmbGFnIik7CgkjZW5kaWYKCglzd2l0Y2goZmxhZykgewoJY2FzZSByc3NpRXhjZWVkZWRUaHJlc2hvbGQ6IHJldHVybiBXUklURV9SRUcoUkVHX0lSUUZMQUdTMSwgTUFTS19JUlFGTEFHUzFfUlNTSSk7CgljYXNlIHN5bmNBZGRyZXNzTWF0Y2g6CSAgICByZXR1cm4gV1JJVEVfUkVHKFJFR19JUlFGTEFHUzEsIE1BU0tfSVJRRkxBR1MxX1NZTkNfQUREUkVTU19NQVRDSCk7CgljYXNlIGZpZm9PdmVycnVuOgkgICAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfSVJRRkxBR1MyLCBNQVNLX0lSUUZMQUdTMl9GSUZPX09WRVJSVU4pOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfcnNzaV90aHJlc2hvbGQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggdGhyZXNob2xkKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogcnNzaSB0aHJlc2hvbGQiKTsKCSNlbmRpZgoKCS8qIG5vIHZhbHVlIGNoZWNrIG5lZWRlZCAtIHU4IGV4YWN0bHkgbWF0Y2hlcyByZWdpc3RlciBzaXplICovCgoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUlNTSVRIUkVTSCwgdGhyZXNob2xkKTsKfQoKaW50IHJmNjlfc2V0X3J4X3N0YXJ0X3RpbWVvdXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggdGltZW91dCkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHN0YXJ0IHRpbWVvdXQiKTsKCSNlbmRpZgoKCS8qIG5vIHZhbHVlIGNoZWNrIG5lZWRlZCAtIHU4IGV4YWN0bHkgbWF0Y2hlcyByZWdpc3RlciBzaXplICovCgoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUlhUSU1FT1VUMSwgdGltZW91dCk7Cn0KCmludCByZjY5X3NldF9yc3NpX3RpbWVvdXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggdGltZW91dCkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHJzc2kgdGltZW91dCIpOwoJI2VuZGlmCgoJLyogbm8gdmFsdWUgY2hlY2sgbmVlZGVkIC0gdTggZXhhY3RseSBtYXRjaGVzIHJlZ2lzdGVyIHNpemUgKi8KCglyZXR1cm4gV1JJVEVfUkVHKFJFR19SWFRJTUVPVVQyLCB0aW1lb3V0KTsKfQoKaW50IHJmNjlfc2V0X3ByZWFtYmxlX2xlbmd0aChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1MTYgcHJlYW1ibGVMZW5ndGgpCnsKCWludCByZXR2YWw7Cgl1OCBtc2IsIGxzYjsKCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogcHJlYW1ibGUgbGVuZ3RoIik7CgkjZW5kaWYKCgkvKiBubyB2YWx1ZSBjaGVjayBuZWVkZWQgLSB1MTYgZXhhY3RseSBtYXRjaGVzIHJlZ2lzdGVyIHNpemUgKi8KCgkvKiBjYWxjdWxhdGUgcmVnIHNldHRpbmdzICovCgltc2IgPSAocHJlYW1ibGVMZW5ndGgmMHhmZjAwKSAgID4+ICA4OwoJbHNiID0gKHByZWFtYmxlTGVuZ3RoJjB4ZmYpOwoKCS8qIHRyYW5zbWl0IHRvIGNoaXAgKi8KCXJldHZhbCA9IFdSSVRFX1JFRyhSRUdfUFJFQU1CTEVfTVNCLCBtc2IpOwoJaWYgKHJldHZhbCkgcmV0dXJuIHJldHZhbDsKCXJldHZhbCA9IFdSSVRFX1JFRyhSRUdfUFJFQU1CTEVfTFNCLCBsc2IpOwoKCXJldHVybiByZXR2YWw7Cn0KCmludCByZjY5X3NldF9zeW5jX2VuYWJsZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIG9wdGlvbk9uT2ZmIG9wdGlvbk9uT2ZmKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogc3luYyBlbmFibGUiKTsKCSNlbmRpZgoKCXN3aXRjaChvcHRpb25Pbk9mZikgewoJY2FzZSBvcHRpb25PbjoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfU1lOQ19DT05GSUcsIChSRUFEX1JFRyhSRUdfU1lOQ19DT05GSUcpIHwgIE1BU0tfU1lOQ19DT05GSUdfU1lOQ19PTikgKTsKCWNhc2Ugb3B0aW9uT2ZmOglyZXR1cm4gV1JJVEVfUkVHKFJFR19TWU5DX0NPTkZJRywgKFJFQURfUkVHKFJFR19TWU5DX0NPTkZJRykgJiB+TUFTS19TWU5DX0NPTkZJR19TWU5DX09OKSApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfZmlmb19maWxsX2NvbmRpdGlvbihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIGZpZm9GaWxsQ29uZGl0aW9uIGZpZm9GaWxsQ29uZGl0aW9uKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogZmlmbyBmaWxsIGNvbmRpdGlvbiIpOwoJI2VuZGlmCgoJc3dpdGNoKGZpZm9GaWxsQ29uZGl0aW9uKSB7CgljYXNlIGFsd2F5czoJCSByZXR1cm4gV1JJVEVfUkVHKFJFR19TWU5DX0NPTkZJRywgKFJFQURfUkVHKFJFR19TWU5DX0NPTkZJRykgfCAgTUFTS19TWU5DX0NPTkZJR19GSUZPX0ZJTExfQ09ORElUSU9OKSApOwoJY2FzZSBhZnRlclN5bmNJbnRlcnJ1cHQ6IHJldHVybiBXUklURV9SRUcoUkVHX1NZTkNfQ09ORklHLCAoUkVBRF9SRUcoUkVHX1NZTkNfQ09ORklHKSAmIH5NQVNLX1NZTkNfQ09ORklHX0ZJRk9fRklMTF9DT05ESVRJT04pICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9zeW5jX3NpemUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggc3luY1NpemUpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBzeW5jIHNpemUiKTsKCSNlbmRpZgoKCS8vIGNoZWNrIGlucHV0IHZhbHVlCglpZiAoc3luY1NpemUgPiAweDA3KSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyB3cml0ZSB2YWx1ZQoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfU1lOQ19DT05GSUcsIChSRUFEX1JFRyhSRUdfU1lOQ19DT05GSUcpICYgfk1BU0tfU1lOQ19DT05GSUdfU1lOQ19TSVpFKSB8IChzeW5jU2l6ZSA8PCAzKSApOwp9CgppbnQgcmY2OV9zZXRfc3luY190b2xlcmFuY2Uoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggc3luY1RvbGVyYW5jZSkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHN5bmMgdG9sZXJhbmNlIik7CgkjZW5kaWYKCgkvLyBjaGVjayBpbnB1dCB2YWx1ZQoJaWYgKHN5bmNUb2xlcmFuY2UgPiAweDA3KSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyB3cml0ZSB2YWx1ZQoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfU1lOQ19DT05GSUcsIChSRUFEX1JFRyhSRUdfU1lOQ19DT05GSUcpICYgfk1BU0tfU1lOQ19DT05GSUdfU1lOQ19TSVpFKSB8IHN5bmNUb2xlcmFuY2UpOwp9CgppbnQgcmY2OV9zZXRfc3luY192YWx1ZXMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggc3luY1ZhbHVlc1s4XSkKewoJaW50IHJldHZhbCA9IDA7CgoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHN5bmMgdmFsdWVzIik7CgkjZW5kaWYKCglyZXR2YWwgKz0gV1JJVEVfUkVHKFJFR19TWU5DVkFMVUUxLCBzeW5jVmFsdWVzWzBdKTsKCXJldHZhbCArPSBXUklURV9SRUcoUkVHX1NZTkNWQUxVRTIsIHN5bmNWYWx1ZXNbMV0pOwoJcmV0dmFsICs9IFdSSVRFX1JFRyhSRUdfU1lOQ1ZBTFVFMywgc3luY1ZhbHVlc1syXSk7CglyZXR2YWwgKz0gV1JJVEVfUkVHKFJFR19TWU5DVkFMVUU0LCBzeW5jVmFsdWVzWzNdKTsKCXJldHZhbCArPSBXUklURV9SRUcoUkVHX1NZTkNWQUxVRTUsIHN5bmNWYWx1ZXNbNF0pOwoJcmV0dmFsICs9IFdSSVRFX1JFRyhSRUdfU1lOQ1ZBTFVFNiwgc3luY1ZhbHVlc1s1XSk7CglyZXR2YWwgKz0gV1JJVEVfUkVHKFJFR19TWU5DVkFMVUU3LCBzeW5jVmFsdWVzWzZdKTsKCXJldHZhbCArPSBXUklURV9SRUcoUkVHX1NZTkNWQUxVRTgsIHN5bmNWYWx1ZXNbN10pOwoKCXJldHVybiByZXR2YWw7Cn0KCmludCByZjY5X3NldF9wYWNrZXRfZm9ybWF0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gcGFja2V0Rm9ybWF0IHBhY2tldEZvcm1hdCkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHBhY2tldCBmb3JtYXQiKTsKCSNlbmRpZgoKCXN3aXRjaChwYWNrZXRGb3JtYXQpIHsKCWNhc2UgcGFja2V0TGVuZ3RoVmFyOiByZXR1cm4gV1JJVEVfUkVHKFJFR19QQUNLRVRDT05GSUcxLCAoUkVBRF9SRUcoUkVHX1BBQ0tFVENPTkZJRzEpIHwgIE1BU0tfUEFDS0VUQ09ORklHMV9QQUtFVF9GT1JNQVRfVkFSSUFCTEUpICk7CgljYXNlIHBhY2tldExlbmd0aEZpeDogcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFDS0VUQ09ORklHMSwgKFJFQURfUkVHKFJFR19QQUNLRVRDT05GSUcxKSAmIH5NQVNLX1BBQ0tFVENPTkZJRzFfUEFLRVRfRk9STUFUX1ZBUklBQkxFKSApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfY3JjX2VuYWJsZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIG9wdGlvbk9uT2ZmIG9wdGlvbk9uT2ZmKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogY3JjIGVuYWJsZSIpOwoJI2VuZGlmCgoJc3dpdGNoKG9wdGlvbk9uT2ZmKSB7CgljYXNlIG9wdGlvbk9uOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQUNLRVRDT05GSUcxLCAoUkVBRF9SRUcoUkVHX1BBQ0tFVENPTkZJRzEpIHwgIE1BU0tfUEFDS0VUQ09ORklHMV9DUkNfT04pICk7CgljYXNlIG9wdGlvbk9mZjoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFDS0VUQ09ORklHMSwgKFJFQURfUkVHKFJFR19QQUNLRVRDT05GSUcxKSAmIH5NQVNLX1BBQ0tFVENPTkZJRzFfQ1JDX09OKSApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfYWRyZXNzRmlsdGVyaW5nKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gYWRkcmVzc0ZpbHRlcmluZyBhZGRyZXNzRmlsdGVyaW5nKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYWRkcmVzcyBmaWx0ZXJpbmciKTsKCSNlbmRpZgoKCXN3aXRjaCAoYWRkcmVzc0ZpbHRlcmluZykgewoJY2FzZSBmaWx0ZXJpbmdPZmY6CSAgICAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFDS0VUQ09ORklHMSwgKCAoUkVBRF9SRUcoUkVHX1BBQ0tFVENPTkZJRzEpICYgfk1BU0tfUEFDS0VUQ09ORklHMV9BRERSRVNTRklMVEVSSU5HKSB8IFBBQ0tFVENPTkZJRzFfQUREUkVTU0ZJTFRFUklOR19PRkYpICk7CgljYXNlIG5vZGVBZGRyZXNzOgkgICAgIHJldHVybiBXUklURV9SRUcoUkVHX1BBQ0tFVENPTkZJRzEsICggKFJFQURfUkVHKFJFR19QQUNLRVRDT05GSUcxKSAmIH5NQVNLX1BBQ0tFVENPTkZJRzFfQUREUkVTU0ZJTFRFUklORykgfCBQQUNLRVRDT05GSUcxX0FERFJFU1NGSUxURVJJTkdfTk9ERSkgKTsKCWNhc2Ugbm9kZU9yQnJvYWRjYXN0QWRkcmVzczogcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFDS0VUQ09ORklHMSwgKCAoUkVBRF9SRUcoUkVHX1BBQ0tFVENPTkZJRzEpICYgfk1BU0tfUEFDS0VUQ09ORklHMV9BRERSRVNTRklMVEVSSU5HKSB8IFBBQ0tFVENPTkZJRzFfQUREUkVTU0ZJTFRFUklOR19OT0RFQlJPQURDQVNUKSApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfcGF5bG9hZF9sZW5ndGgoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggcGF5bG9hZExlbmd0aCkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHBheWxvYWQgbGVuZ3RoIik7CgkjZW5kaWYKCglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVlMT0FEX0xFTkdUSCwgcGF5bG9hZExlbmd0aCk7Cn0KCnU4ICByZjY5X2dldF9wYXlsb2FkX2xlbmd0aChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgImdldDogcGF5bG9hZCBsZW5ndGgiKTsKCSNlbmRpZgoKCXJldHVybiAodTgpIFJFQURfUkVHKFJFR19QQVlMT0FEX0xFTkdUSCk7Cn0KCmludCByZjY5X3NldF9ub2RlX2FkZHJlc3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggbm9kZUFkZHJlc3MpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBub2RlIGFkZHJlc3MiKTsKCSNlbmRpZgoKCXJldHVybiBXUklURV9SRUcoUkVHX05PREVBRFJTLCBub2RlQWRkcmVzcyk7Cn0KCmludCByZjY5X3NldF9icm9hZGNhc3RfYWRkcmVzcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBicm9hZGNhc3RBZGRyZXNzKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYnJvYWRjYXN0IGFkZHJlc3MiKTsKCSNlbmRpZgoKCXJldHVybiBXUklURV9SRUcoUkVHX0JST0FEQ0FTVEFEUlMsIGJyb2FkY2FzdEFkZHJlc3MpOwp9CgppbnQgcmY2OV9zZXRfdHhfc3RhcnRfY29uZGl0aW9uKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gdHhTdGFydENvbmRpdGlvbiB0eFN0YXJ0Q29uZGl0aW9uKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogc3RhcnQgY29uZGl0aW9uIik7CgkjZW5kaWYKCglzd2l0Y2godHhTdGFydENvbmRpdGlvbikgewoJY2FzZSBmaWZvTGV2ZWw6CSAgIHJldHVybiBXUklURV9SRUcoUkVHX0ZJRk9fVEhSRVNILCAoUkVBRF9SRUcoUkVHX0ZJRk9fVEhSRVNIKSAmIH5NQVNLX0ZJRk9fVEhSRVNIX1RYU1RBUlQpICk7CgljYXNlIGZpZm9Ob3RFbXB0eTogcmV0dXJuIFdSSVRFX1JFRyhSRUdfRklGT19USFJFU0gsIChSRUFEX1JFRyhSRUdfRklGT19USFJFU0gpIHwgIE1BU0tfRklGT19USFJFU0hfVFhTVEFSVCkgKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKaW50IHJmNjlfc2V0X2ZpZm9fdGhyZXNob2xkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IHRocmVzaG9sZCkKewoJaW50IHJldHZhbDsKCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogZmlmbyB0aHJlc2hvbGQiKTsKCSNlbmRpZgoKCS8vIGNoZWNrIGlucHV0IHZhbHVlCglpZiAodGhyZXNob2xkICYgMHg4MCkgewoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLy8gd3JpdGUgdmFsdWUKCXJldHZhbCA9IFdSSVRFX1JFRyhSRUdfRklGT19USFJFU0gsIChSRUFEX1JFRyhSRUdfRklGT19USFJFU0gpICYgfk1BU0tfRklGT19USFJFU0hfVkFMVUUpIHwgdGhyZXNob2xkKTsKCWlmIChyZXR2YWwpCgkJcmV0dXJuIHJldHZhbDsKCgkvLyBhY2Nlc3MgdGhlIGZpZm8gdG8gYWN0aXZhdGUgbmV3IHRocmVzaG9sZAoJcmV0dXJuIHJmNjlfcmVhZF9maWZvIChzcGksICh1OCopICZyZXR2YWwsIDEpOyAvLyByZXR2YWwgdXNlZCBhcyBidWZmZXIKfQoKaW50IHJmNjlfc2V0X2RhZ2Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBkYWdjIGRhZ2MpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBkYWdjIik7CgkjZW5kaWYKCglzd2l0Y2goZGFnYykgewoJY2FzZSBub3JtYWxNb2RlOgkJIHJldHVybiBXUklURV9SRUcoUkVHX1RFU1REQUdDLCBEQUdDX05PUk1BTCk7CgljYXNlIGltcHJvdmU6CQkJIHJldHVybiBXUklURV9SRUcoUkVHX1RFU1REQUdDLCBEQUdDX0lNUFJPVkVEX0xPV0JFVEEwKTsKCWNhc2UgaW1wcm92ZTRMb3dNb2R1bGF0aW9uSW5kZXg6IHJldHVybiBXUklURV9SRUcoUkVHX1RFU1REQUdDLCBEQUdDX0lNUFJPVkVEX0xPV0JFVEExKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCmludCByZjY5X3JlYWRfZmlmbyAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggKmJ1ZmZlciwgdW5zaWduZWQgaW50IHNpemUpCnsKCSNpZmRlZiBERUJVR19GSUZPX0FDQ0VTUwoJCWludCBpOwoJI2VuZGlmCglzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRyYW5zZmVyOwoJdTggbG9jYWxfYnVmZmVyW0ZJRk9fU0laRSArIDFdOwoJaW50IHJldHZhbDsKCglpZiAoc2l6ZSA+IEZJRk9fU0laRSkgewoJCSNpZmRlZiBERUJVRwoJCQlkZXZfZGJnKCZzcGktPmRldiwgInJlYWQgZmlmbzogcGFzc2VkIGluIGJ1ZmZlciBiaWdnZXIgdGhlbiBpbnRlcm5hbCBidWZmZXIgXG4iKTsKCQkjZW5kaWYKCQlyZXR1cm4gLUVNU0dTSVpFOwoJfQoKCS8qIHByZXBhcmUgYSBiaWRpcmVjdGlvbmFsIHRyYW5zZmVyICovCglsb2NhbF9idWZmZXJbMF0gPSBSRUdfRklGTzsKCW1lbXNldCgmdHJhbnNmZXIsIDAsIHNpemVvZih0cmFuc2ZlcikpOwogIAl0cmFuc2Zlci50eF9idWYgPSBsb2NhbF9idWZmZXI7CiAgCXRyYW5zZmVyLnJ4X2J1ZiA9IGxvY2FsX2J1ZmZlcjsKCXRyYW5zZmVyLmxlbgk9IHNpemUrMTsKCglyZXR2YWwgPSBzcGlfc3luY190cmFuc2ZlcihzcGksICZ0cmFuc2ZlciwgMSk7CgoJI2lmZGVmIERFQlVHX0ZJRk9fQUNDRVNTCgkJZm9yIChpPTA7IGk8c2l6ZTsgaSsrKQoJCQlkZXZfZGJnKCZzcGktPmRldiwgIiVkIC0gMHgleFxuIiwgaSwgbG9jYWxfYnVmZmVyW2krMV0pOwoJI2VuZGlmCgoJbWVtY3B5KGJ1ZmZlciwgJmxvY2FsX2J1ZmZlclsxXSwgc2l6ZSk7ICAvLyBUT0RPOiBvaG5lIG1lbWNvcHkgd+RyZSBzY2j2bmVyCgoJcmV0dXJuIHJldHZhbDsKfQoKaW50IHJmNjlfd3JpdGVfZmlmbyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKewoJI2lmZGVmIERFQlVHX0ZJRk9fQUNDRVNTCgkJaW50IGk7CgkjZW5kaWYKCWNoYXIgc3BpX2FkZHJlc3MgPSBSRUdfRklGTyB8IFdSSVRFX0JJVDsKCXU4IGxvY2FsX2J1ZmZlcltGSUZPX1NJWkUgKyAxXTsKCglpZiAoc2l6ZSA+IEZJRk9fU0laRSkgewoJCSNpZmRlZiBERUJVRwoJCQlkZXZfZGJnKCZzcGktPmRldiwgInJlYWQgZmlmbzogcGFzc2VkIGluIGJ1ZmZlciBiaWdnZXIgdGhlbiBpbnRlcm5hbCBidWZmZXIgXG4iKTsKCQkjZW5kaWYKCQlyZXR1cm4gLUVNU0dTSVpFOwoJfQoKCWxvY2FsX2J1ZmZlclswXSA9IHNwaV9hZGRyZXNzOwoJbWVtY3B5KCZsb2NhbF9idWZmZXJbMV0sIGJ1ZmZlciwgc2l6ZSk7ICAvLyBUT0RPOiBvaG5lIG1lbWNvcHkgd+RyZSBzY2j2bmVyCgoJI2lmZGVmIERFQlVHX0ZJRk9fQUNDRVNTCgkJZm9yIChpPTA7IGk8c2l6ZTsgaSsrKQoJCQlkZXZfZGJnKCZzcGktPmRldiwgIjB4JXhcbiIsYnVmZmVyW2ldKTsKCSNlbmRpZgoKCXJldHVybiBzcGlfd3JpdGUgKHNwaSwgbG9jYWxfYnVmZmVyLCBzaXplICsgMSk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp1OCByZjY5X3JlYWRfcmVnKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IGFkZHIpCnsKCWludCByZXR2YWw7CgoJcmV0dmFsID0gc3BpX3c4cjgoc3BpLCBhZGRyKTsKCgkjaWZkZWYgREVCVUdfVkFMVUVTCgkJaWYgKHJldHZhbCA8IDApCgkJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4sIHNpbmNlIHdlIGFscmVhZHkgY2hlY2tlZCwKCQkJICogdGhhdCBtb2R1bGUgaXMgY29ubmVjdGVkLiBUaGVyZWZvcmUgbm8gZXJyb3IKCQkJICogaGFuZGxpbmcsIGp1c3QgYW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZS4uLgoJCQkgKi8KCQkJZGV2X2RiZygmc3BpLT5kZXYsICJyZWFkIDB4JXggRkFJTEVEXG4iLAoJCQkJYWRkcik7CgkJZWxzZQoJCQlkZXZfZGJnKCZzcGktPmRldiwgInJlYWQgMHgleCBmcm9tIHJlZyAweCV4XG4iLAoJCQkJcmV0dmFsLAoJCQkJYWRkcik7CgkjZW5kaWYKCglyZXR1cm4gcmV0dmFsOwp9CgppbnQgcmY2OV93cml0ZV9yZWcoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggYWRkciwgdTggdmFsdWUpCnsKCWludCByZXR2YWw7CgljaGFyIGJ1ZmZlclsyXTsKCglidWZmZXJbMF0gPSBhZGRyIHwgV1JJVEVfQklUOwoJYnVmZmVyWzFdID0gdmFsdWU7CgoJcmV0dmFsID0gc3BpX3dyaXRlKHNwaSwgJmJ1ZmZlciwgMik7CgoJI2lmZGVmIERFQlVHX1ZBTFVFUwoJCWlmIChyZXR2YWwgPCAwKQoJCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuLCBzaW5jZSB3ZSBhbHJlYWR5IGNoZWNrZWQsCgkJCSAqIHRoYXQgbW9kdWxlIGlzIGNvbm5lY3RlZC4gVGhlcmVmb3JlIG5vIGVycm9yCgkJCSAqIGhhbmRsaW5nLCBqdXN0IGFuIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2UuLi4KCQkJICovCgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAid3JpdGUgMHgleCB0byAweCV4IEZBSUxFRFxuIiwKCQkJCXZhbHVlLAoJCQkJYWRkcik7CgkJZWxzZQoJCQlkZXZfZGJnKCZzcGktPmRldiwgIndyb3RlIDB4JXggdG8gcmVnIDB4JXhcbiIsCgkJCQl2YWx1ZSwKCQkJCWFkZHIpOwoJI2VuZGlmCgoJcmV0dXJuIHJldHZhbDsKfQoKCg==