I2luY2x1ZGUgPENvcHlyaWdodC5oPgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3RTeXNDdHJsLmMKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIEFQSSBkZWZpbml0aW9ucyBmb3Igc3lzdGVtIGdsb2JhbCBjb250cm9sLgoqCiogREVQRU5ERU5DSUVTOgoqCiogRklMRSBSRVZJU0lPTiBOVU1CRVI6CiogICAgICAgJFJldmlzaW9uOiA1ICQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxtc0FwaS5oPgojaW5jbHVkZSA8Z3RId0NudGwuaD4KI2luY2x1ZGUgPGd0RHJ2U3dSZWdzLmg+CiNpbmNsdWRlIDxndFNlbS5oPgoKc3RhdGljIEdUX1NUQVRVUyB3cml0ZVN3aXRjaE1hY1dvbFJlZwooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX1U4ICAgICAgICBiYXNlaWQsCiAgICBJTiBHVF9FVEhFUkFERFIgKm1hYwopOwpzdGF0aWMgR1RfU1RBVFVTIHJlYWRTd2l0Y2hNYWNXb2xSZWcKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfVTggICAgICAgIGJhc2VpZCwKICAgIE9VVCBHVF9FVEhFUkFERFIgKm1hYwopOwpzdGF0aWMgR1RfU1RBVFVTIHdyaXRlRGlmZk1BQ1dvTAooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX1U4ICAgICAgICBiYXNlaWQsCiAgICBJTiBHVF9VMTYgICAgICAgZGlmZkFkZHIKKTsKc3RhdGljIEdUX1NUQVRVUyByZWFkRGlmZk1BQ1dvTAooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VOCAgICAgICAgYmFzZWlkLAogICAgT1VUIEdUX1UxNiAgICAgICAgKmRpZmZBZGRyCik7CnN0YXRpYyBHVF9TVEFUVVMgd3JpdGVTd01hY1dvbFdvZlJlZwooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX1U4ICAgICAgICBwb2ludGVyLAogICAgSU4gR1RfVTggICAgICAgIGRhdGEKKTsKc3RhdGljIEdUX1NUQVRVUyByZWFkU3dNYWNXb2xXb2ZSZWcKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VOCAgICAgICAgcG9pbnRlciwKICAgIE9VVCBHVF9VOCAgICAgICAqZGF0YQopOwoKc3RhdGljIEdUX1NUQVRVUyB3cml0ZVN3aXRjaE1hY1JlZwooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0VUSEVSQUREUiAqbWFjCik7CgpzdGF0aWMgR1RfU1RBVFVTIHJlYWRTd2l0Y2hNYWNSZWcKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0VUSEVSQUREUiAqbWFjCik7CgpzdGF0aWMgR1RfU1RBVFVTIHdyaXRlRGlmZk1BQwooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX1UxNiAgICAgICAgZGlmZkFkZHIKKTsKCnN0YXRpYyBHVF9TVEFUVVMgcmVhZERpZmZNQUMKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX1UxNiAgICAgICAgKmRpZmZBZGRyCik7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1N3UmVzZXQKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBwcmVmb3JtcyBzd2l0Y2ggc29mdHdhcmUgcmVzZXQuCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTd1Jlc2V0CigKICAgIElOICBHVF9RRF9ERVYgKmRldgopCnsKI2lmbmRlZiBHVF9STUdNVF9BQ0NFU1MKICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVXNlZCB0byBwb2xsIHRoZSBTV1Jlc2V0IGJpdCAqLwojZW5kaWYKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTggICAgICAgICAgICByZWdPZmZzZXQ7CgogICAgREJHX0lORk8oKCJnc3lzU3dSZXNldCBDYWxsZWQuXG4iKSk7CgogICAgLyogU2V0IHRoZSBTb2Z0d2FyZSByZXNldCBiaXQuICAgICAgICAgICAgICAgICAgKi8KICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9HSUdBQklUX1NXSVRDSCkpCiAgICB7CiAgICAgICAgcmVnT2Zmc2V0ID0gUURfUkVHX0dMT0JBTF9DT05UUk9MOwogICAgfQogICAgZWxzZQogICAgewogICAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfTUVMT0RZX1NXSVRDSCkpCiAgICAgICAgcmVnT2Zmc2V0ID0gUURfUkVHX0dMT0JBTF9DT05UUk9MOwogICAgICBlbHNlCiAgICAgICAgcmVnT2Zmc2V0ID0gUURfUkVHX0FUVV9DT05UUk9MOwogICAgfQoKICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LHJlZ09mZnNldCwxNSwxLDEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgojaWZkZWYgR1RfUk1HTVRfQUNDRVNTCiAgICB7CiAgICAgIEhXX0RFVl9SRUdfQUNDRVNTIHJlZ0FjY2VzczsKCiAgICAgIHJlZ0FjY2Vzcy5lbnRyaWVzID0gMTsKCiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5jbWQgPSBIV19SRUdfV0FJVF9USUxMXzA7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5hZGRyID0gQ0FMQ19TTUlfREVWX0FERFIoZGV2LCAwLCBHTE9CQUxfUkVHX0FDQ0VTUyk7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5yZWcgPSByZWdPZmZzZXQ7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5kYXRhID0gMTU7CiAgICAgIHJldFZhbCA9IGh3QWNjZXNzTXVsdGlSZWdzKGRldiwgJnJlZ0FjY2Vzcyk7CiAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgewogICAgICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICB9CiAgICB9CiNlbHNlCiAgICAvKiBNYWtlIHN1cmUgdGhlIHJlc2V0IG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuICAqLwogICAgZGF0YSA9IDE7CiAgICB3aGlsZShkYXRhICE9IDApCiAgICB7CiAgICAgICAgICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYscmVnT2Zmc2V0LDE1LDEsJmRhdGEpOwoKICAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgICAgewogICAgICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgICB9CiAgICB9CiNlbmRpZgoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFBQVUVuCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVGhpcyByb3V0aW5lIGVuYWJsZXMvZGlzYWJsZXMgUGh5IFBvbGxpbmcgVW5pdC4KKgoqIElOUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIHRvIGVuYWJsZSBQUFUsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRQUFVFbgooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0JPT0wgICAgICAgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBEYXRhIHRvIGJlIHNldCBpbnRvIHRoZSAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAqLwogICAgREJHX0lORk8oKCJnc3lzU2V0UFBVRW4gQ2FsbGVkLlxuIikpOwoKICAgIC8qIE9ubHkgR2lnYWJpdCBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0dJR0FCSVRfU1dJVENIKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfUFBVX1JFQURfT05MWSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBTZXQgdGhlIFBQVUVuIGJpdC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxNCwxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0UFBVRW4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSBQUFUgc3RhdGUuCioKKiBJTlBVVFM6CiogICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgaWYgUFBVIGlzIGVuYWJsZWQsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgICAgICAgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgICBHVF9GQUlMICAgICAgICAgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFBQVUVuCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9CT09MICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXRQUFVFbiBDYWxsZWQuXG4iKSk7CiAgICAvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9HSUdBQklUX1NXSVRDSCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1BQVV9SRUFEX09OTFkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIGlmKGVuID09IE5VTEwpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBHZXQgdGhlIEdldFBQVUVuIGJpdC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxNCwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKCiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldERpc2NhcmRFeGNlc3NpdmUKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBzZXQgdGhlIERpc2NhcmQgRXhjZXNzaXZlIHN0YXRlLgoqCiogSU5QVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSBEaXNjYXJkIGlzIGVuYWJsZWQsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXREaXNjYXJkRXhjZXNzaXZlCigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIElOIEdUX0JPT0wgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogRGF0YSB0byBiZSBzZXQgaW50byB0aGUgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXREaXNjYXJkRXhjZXNzaXZlIENhbGxlZC5cbiIpKTsKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHRoZSBEaXNjYXJkIEV4aXNzaXZlIGJpdC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxMywxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXREaXNjYXJkRXhjZXNzaXZlCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSBEaXNjYXJkIEV4Y2Vzc2l2ZSBzdGF0ZS4KKgoqIElOUFVUUzoKKiAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICBlbiAtIEdUX1RSVUUgRGlzY2FyZCBpcyBlbmFibGVkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgICAgICAgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9CQURfUEFSQU0gICAgLSBvbiBiYWQgcGFyYW1ldGVyCiogICAgICAgR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXREaXNjYXJkRXhjZXNzaXZlCigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIElOIEdUX0JPT0wgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXREaXNjYXJkRXhjZXNzaXZlIENhbGxlZC5cbiIpKTsKICAgIGlmKGVuID09IE5VTEwpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBHZXQgdGhlIERpc2NhcmQgRXhpc3NpdmUgYml0LiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDEzLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFNjaGVkdWxpbmdNb2RlCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgc2V0IHRoZSBTY2hlZHVsaW5nIE1vZGUuCioKKiBJTlBVVFM6CiogICAgICAgbW9kZSAtIEdUX1RSVUUgd3JyLCBHVF9GQUxTRSBzdHJpY3QuCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0U2NoZWR1bGluZ01vZGUKKAogICAgSU4gIEdUX1FEX0RFViAqZGV2LAogICAgSU4gR1RfQk9PTCAgICBtb2RlCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIERhdGEgdG8gYmUgc2V0IGludG8gdGhlICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAqLwogICAgREJHX0lORk8oKCJnc3lzU2V0U2NoZWR1bGluZ01vZGUgQ2FsbGVkLlxuIikpOwoKICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9QT1JUX01JWEVEX1NDSEVEVUxFKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKG1vZGUsZGF0YSk7CiAgICBkYXRhID0gMSAtIGRhdGE7CgogICAgLyogU2V0IHRoZSBTY2hlY2R1bGluZyBiaXQuICAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsMTEsMSxkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0U2NoZWR1bGluZ01vZGUKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIFNjaGVkdWxpbmcgTW9kZS4KKgoqIElOUFVUUzoKKiAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICBtb2RlIC0gR1RfVFJVRSB3cnIsIEdUX0ZBTFNFIHN0cmljdC4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAgICAgICAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0JBRF9QQVJBTSAgICAtIG9uIGJhZCBwYXJhbWV0ZXIKKiAgICAgICBHVF9GQUlMICAgICAgICAgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFNjaGVkdWxpbmdNb2RlCigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIE9VVCBHVF9CT09MICAgKm1vZGUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFNjaGVkdWxpbmdNb2RlIENhbGxlZC5cbiIpKTsKICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LCBERVZfUE9SVF9NSVhFRF9TQ0hFRFVMRSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgaWYobW9kZSA9PSBOVUxMKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CiAgICAvKiBHZXQgdGhlIFNjaGVkdWxpbmcgYml0LiAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxMSwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woMSAtIGRhdGEsKm1vZGUpOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRNYXhGcmFtZVNpemUKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBTZXQgdGhlIG1heCBmcmFtZSBzaXplIGFsbG93ZWQuCioKKiBJTlBVVFM6CiogICAgICAgbW9kZSAtIEdUX1RSVUUgbWF4IHNpemUgMTUyMiwKKiAgICAgICAgICAgICAgIEdUX0ZBTFNFIG1heCBzaXplIDE1MzUsIDE2MzIsIG9yIDIwNDguCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBQbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZSBzcGVjLiB0byBnZXQgdGhlIG1heCBmcmFtZSBzaXplLgoqICAgICAgIDg4RTYwOTUgZGV2aWNlIHN1cHBvcnRzIHVwdG8gMTYzMi4KKiAgICAgICA4OEU2MDY1Lzg4RTYwNjEgZGV2aWNlcyBzdXBwb3J0IHVwdG8gMjA0OC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldE1heEZyYW1lU2l6ZQooCiAgICBJTiAgR1RfUURfREVWICpkZXYsCiAgICBJTiAgR1RfQk9PTCAgIG1vZGUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogRGF0YSB0byBiZSBzZXQgaW50byB0aGUgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXRNYXhGcmFtZVNpemUgQ2FsbGVkLlxuIikpOwoKICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9KVU1CT19NT0RFKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKG1vZGUsZGF0YSk7CiAgICBkYXRhID0gMSAtIGRhdGE7CgogICAgLyogU2V0IHRoZSBNYXggRnJhbSBTaXplIGJpdC4gICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDEwLDEsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0TWF4RnJhbWVTaXplCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgR2V0IHRoZSBtYXggZnJhbWUgc2l6ZSBhbGxvd2VkLgoqCiogSU5QVVRTOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgIG1vZGUgLSBHVF9UUlVFIG1heCBzaXplIDE1MjIsCiogICAgICAgICAgICAgICBHVF9GQUxTRSBtYXggc2l6ZSAxNTM1LCAxNjMyLCBvciAyMDQ4LgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBQbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZSBzcGVjLiB0byBnZXQgdGhlIG1heCBmcmFtZSBzaXplLgoqICAgICAgIDg4RTYwOTUgZGV2aWNlIHN1cHBvcnRzIHVwdG8gMTYzMi4KKiAgICAgICA4OEU2MDY1Lzg4RTYwNjEgZGV2aWNlcyBzdXBwb3J0IHVwdG8gMjA0OC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldE1heEZyYW1lU2l6ZQooCiAgICBJTiAgR1RfUURfREVWICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICptb2RlCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXRNYXhGcmFtZVNpemUgQ2FsbGVkLlxuIikpOwogICAgaWYobW9kZSA9PSBOVUxMKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX0pVTUJPX01PREUpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgTWF4IEZyYW1lIFNpemUgYml0LiAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDEwLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTCgxIC0gZGF0YSwqbW9kZSk7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1JlTG9hZAoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIGNhdXNlIHRvIHRoZSBzd2l0Y2ggdG8gcmVsb2FkIHRoZSBFRVBST00uCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNSZUxvYWQKKAogICAgSU4gIEdUX1FEX0RFViAqZGV2CikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzUmVMb2FkIENhbGxlZC5cbiIpKTsKICAgIC8qIFNldCB0aGUgUmVsb2FkIGJpdC4gICAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDksMSwxKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIC8qIFNob3VsZCBhIGNoZWNrIGZvciByZWxvYWQgY29tcGxldGlvbi4gKi8KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFdhdGNoRG9nCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgU2V0IHRoZSB0aGUgd2F0Y2ggZG9nIG1vZGUuCioKKiBJTlBVVFM6CiogICAgICAgZW4gLSBHVF9UUlVFIGVuYWJsZXMsIEdUX0ZBTFNFIGRpc2FibGUuCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0V2F0Y2hEb2cKKAogICAgSU4gIEdUX1FEX0RFViAqZGV2LAogICAgSU4gIEdUX0JPT0wgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBEYXRhIHRvIGJlIHNldCBpbnRvIHRoZSAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c1NldFdhdGNoRG9nIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9XQVRDSERPR19FVkVOVCkpIHx8CiAgICAgICAgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX0VOSEFOQ0VEX0ZFX1NXSVRDSCkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHRoZSBXYXRjaERvZyBiaXQuICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCw3LDEsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFdhdGNoRG9nCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgR2V0IHRoZSB0aGUgd2F0Y2ggZG9nIG1vZGUuCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgZW4gLSBHVF9UUlVFIGVuYWJsZXMsIEdUX0ZBTFNFIGRpc2FibGUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgICAgICAgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9CQURfUEFSQU0gICAgLSBvbiBiYWQgcGFyYW1ldGVyCiogICAgICAgR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRXYXRjaERvZwooCiAgICBJTiAgR1RfUURfREVWICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0V2F0Y2hEb2cgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfRU5IQU5DRURfRkVfU1dJVENIKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBpZihlbiA9PSBOVUxMKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgLyogR2V0IHRoZSBXYXRjaERvZyBiaXQuICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCw3LDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0RHVwbGV4UGF1c2VNYWMKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBzZXRzIHRoZSBmdWxsIGR1cGxleCBwYXVzZSBzcmMgTWFjIEFkZHJlc3MuCiogICAgICAgIE1BQyBhZGRyZXNzIHNob3VsZCBiZSBhbiBVbmljYXN0IGFkZHJlc3MuCiogICAgICAgIEZvciBkaWZmZXJlbnQgTUFDIEFkZHJlc3NlcyBwZXIgcG9ydCBvcGVyYXRpb24sCiogICAgICAgIHVzZSBnc3lzU2V0UGVyUG9ydER1cGxleFBhdXNlTWFjIEFQSS4KKgoqIElOUFVUUzoKKiAgICAgICBtYWMgLSBUaGUgTWFjIGFkZHJlc3MgdG8gYmUgc2V0LgoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0RHVwbGV4UGF1c2VNYWMKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9FVEhFUkFERFIgKm1hYwopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBEYXRhIHRvIGJlIHNldCBpbnRvIHRoZSAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c1NldER1cGxleFBhdXNlTWFjIENhbGxlZC5cbiIpKTsKICAgIGlmKG1hYyA9PSBOVUxMKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgLyogaWYgdGhlIGRldmljZSBoYXMgU3dpdGNoIE1BQyBSZWdpc3Rlciwgd2UgbmVlZCB0aGUgc3BlY2lhbCBvcGVyYXRpb24gKi8KICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9TV0lUQ0hfTUFDX1JFRykpCiAgICB7CiAgICAgICAgcmV0dXJuIHdyaXRlU3dpdGNoTWFjUmVnKGRldixtYWMpOwogICAgfQoKI2lmZGVmIEdUX1JNR01UX0FDQ0VTUwogICAgewogICAgICBIV19ERVZfUkVHX0FDQ0VTUyByZWdBY2Nlc3M7CgogICAgICByZWdBY2Nlc3MuZW50cmllcyA9IDM7CgogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uY21kID0gSFdfUkVHX1dSSVRFOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0ucmVnID0gUURfUkVHX01BQ0FERFJfMDE7CiAgLyogU2V0IHRoZSBmaXJzdCBNYWMgcmVnaXN0ZXIgd2l0aCBkaWZmQWRkciBiaXQgcmVzZXQuICAqLwogICAgICBkYXRhID0gKCgoKm1hYykuYXJFdGhlclswXSAmIDB4RkUpIDw8IDgpIHwgKCptYWMpLmFyRXRoZXJbMV07CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5kYXRhID0gZGF0YTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmNtZCA9IEhXX1JFR19XUklURTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmFkZHIgPSBDQUxDX1NNSV9ERVZfQUREUihkZXYsIDAsIEdMT0JBTF9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLnJlZyA9IFFEX1JFR19NQUNBRERSXzIzOwogIC8qIFNldCB0aGUgTWFjMjMgYWRkcmVzcyByZWdpc3Rlci4gICAqLwogICAgICBkYXRhID0gKCgqbWFjKS5hckV0aGVyWzJdIDw8IDgpIHwgKCptYWMpLmFyRXRoZXJbM107CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsxXS5kYXRhID0gZGF0YTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzJdLmNtZCA9IEhXX1JFR19XUklURTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzJdLmFkZHIgPSBDQUxDX1NNSV9ERVZfQUREUihkZXYsIDAsIEdMT0JBTF9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzJdLnJlZyA9IFFEX1JFR19NQUNBRERSXzQ1OwogIC8qIFNldCB0aGUgTWFjNDUgYWRkcmVzcyByZWdpc3Rlci4gICAqLwogICAgICBkYXRhID0gKCgqbWFjKS5hckV0aGVyWzRdIDw8IDgpIHwgKCptYWMpLmFyRXRoZXJbNV07CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5kYXRhID0gZGF0YTsKICAgICAgcmV0VmFsID0gaHdBY2Nlc3NNdWx0aVJlZ3MoZGV2LCAmcmVnQWNjZXNzKTsKICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICB7CiAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgIH0KICAgIH0KI2Vsc2UKICAgIC8qIFNldCB0aGUgZmlyc3QgTWFjIHJlZ2lzdGVyIHdpdGggZGlmZkFkZHIgYml0IHJlc2V0LiAgKi8KICAgIGRhdGEgPSAoKCgqbWFjKS5hckV0aGVyWzBdICYgMHhGRSkgPDwgOCkgfCAoKm1hYykuYXJFdGhlclsxXTsKICAgIHJldFZhbCA9IGh3V3JpdGVHbG9iYWxSZWcoZGV2LFFEX1JFR19NQUNBRERSXzAxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgLyogU2V0IHRoZSBNYWMyMyBhZGRyZXNzIHJlZ2lzdGVyLiAgICovCiAgICBkYXRhID0gKCgqbWFjKS5hckV0aGVyWzJdIDw8IDgpIHwgKCptYWMpLmFyRXRoZXJbM107CiAgICByZXRWYWwgPSBod1dyaXRlR2xvYmFsUmVnKGRldixRRF9SRUdfTUFDQUREUl8yMyxkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIC8qIFNldCB0aGUgTWFjNDUgYWRkcmVzcyByZWdpc3Rlci4gICAqLwogICAgZGF0YSA9ICgoKm1hYykuYXJFdGhlcls0XSA8PCA4KSB8ICgqbWFjKS5hckV0aGVyWzVdOwogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbFJlZyhkZXYsUURfUkVHX01BQ0FERFJfNDUsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KI2VuZGlmCgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldER1cGxleFBhdXNlTWFjCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgR2V0cyB0aGUgZnVsbCBkdXBsZXggcGF1c2Ugc3JjIE1hYyBBZGRyZXNzLgoqICAgICAgICBGb3IgZGlmZmVyZW50IE1BQyBBZGRyZXNzZXMgcGVyIHBvcnQgb3BlcmF0aW9uLAoqICAgICAgICB1c2UgZ3N5c0dldFBlclBvcnREdXBsZXhQYXVzZU1hYyBBUEkuCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgbWFjIC0gdGhlIE1hYyBhZGRyZXNzLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0RHVwbGV4UGF1c2VNYWMKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0VUSEVSQUREUiAqbWFjCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiNpZm5kZWYgR1RfUk1HTVRfQUNDRVNTCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIERhdGEgdG8gcmVhZCBmcm9tIHJlZ2lzdGVyLiAgKi8KI2VuZGlmCgogICAgREJHX0lORk8oKCJnc3lzR2V0RHVwbGV4UGF1c2VNYWMgQ2FsbGVkLlxuIikpOwogICAgaWYobWFjID09IE5VTEwpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBpZiB0aGUgZGV2aWNlIGhhcyBTd2l0Y2ggTUFDIFJlZ2lzdGVyLCB3ZSBuZWVkIHRoZSBzcGVjaWFsIG9wZXJhdGlvbiAqLwogICAgaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NXSVRDSF9NQUNfUkVHKSkKICAgIHsKICAgICAgICByZXR1cm4gcmVhZFN3aXRjaE1hY1JlZyhkZXYsbWFjKTsKICAgIH0KCiNpZmRlZiBHVF9STUdNVF9BQ0NFU1MKICAgIHsKICAgICAgSFdfREVWX1JFR19BQ0NFU1MgcmVnQWNjZXNzOwoKICAgICAgcmVnQWNjZXNzLmVudHJpZXMgPSAzOwoKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmNtZCA9IEhXX1JFR19SRUFEOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0ucmVnID0gUURfUkVHX01BQ0FERFJfMDE7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5kYXRhID0gMDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmNtZCA9IEhXX1JFR19SRUFEOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0ucmVnID0gUURfUkVHX01BQ0FERFJfMjM7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsxXS5kYXRhID0gMDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzJdLmNtZCA9IEhXX1JFR19SRUFEOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMl0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMl0ucmVnID0gUURfUkVHX01BQ0FERFJfNDU7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5kYXRhID0gMDsKICAgICAgcmV0VmFsID0gaHdBY2Nlc3NNdWx0aVJlZ3MoZGV2LCAmcmVnQWNjZXNzKTsKICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICB7CiAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgIH0KICAgICAgKCptYWMpLmFyRXRoZXJbMF0gPSBxZExvbmcyQ2hhcigocmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmRhdGEgPj4gOCkpICYgfjB4MDE7CiAgICAgICgqbWFjKS5hckV0aGVyWzFdID0gcWRMb25nMkNoYXIocmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmRhdGEgJiAweEZGKTsKICAgICAgKCptYWMpLmFyRXRoZXJbMl0gPSBxZExvbmcyQ2hhcihyZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0uZGF0YSA+PiA4KTsKICAgICAgKCptYWMpLmFyRXRoZXJbM10gPSBxZExvbmcyQ2hhcihyZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0uZGF0YSAmIDB4RkYpOwogICAgICAoKm1hYykuYXJFdGhlcls0XSA9IHFkTG9uZzJDaGFyKHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5kYXRhID4+IDgpOwogICAgICAoKm1hYykuYXJFdGhlcls1XSA9IHFkTG9uZzJDaGFyKHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5kYXRhICYgMHhGRik7CiAgICB9CiNlbHNlCiAgICAvKiBHZXQgdGhlIE1hYzAxIHJlZ2lzdGVyLiAgICAgICovCiAgICByZXRWYWwgPSBod1JlYWRHbG9iYWxSZWcoZGV2LFFEX1JFR19NQUNBRERSXzAxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQogICAgKCptYWMpLmFyRXRoZXJbMF0gPSAoZGF0YSA+PiA4KSAmIH4weDAxOwogICAgKCptYWMpLmFyRXRoZXJbMV0gPSBkYXRhICYgMHhGRjsKICAgIC8qIEdldCB0aGUgTWFjMjMgcmVnaXN0ZXIuICAgICAgKi8KICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbFJlZyhkZXYsUURfUkVHX01BQ0FERFJfMjMsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CiAgICAoKm1hYykuYXJFdGhlclsyXSA9IGRhdGEgPj4gODsKICAgICgqbWFjKS5hckV0aGVyWzNdID0gZGF0YSAmIDB4RkY7CgogICAgLyogR2V0IHRoZSBNYWM0NSByZWdpc3Rlci4gICAgICAqLwogICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsUmVnKGRldixRRF9SRUdfTUFDQUREUl80NSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KICAgICgqbWFjKS5hckV0aGVyWzRdID0gZGF0YSA+PiA4OwogICAgKCptYWMpLmFyRXRoZXJbNV0gPSBkYXRhICYgMHhGRjsKI2VuZGlmCgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRQZXJQb3J0RHVwbGV4UGF1c2VNYWMKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBzZXRzIHdoZXRoZXIgdGhlIGZ1bGwgZHVwbGV4IHBhdXNlIHNyYyBNYWMgQWRkcmVzcyBpcyBwZXIKKiAgICAgICBwb3J0IG9yIHBlciBkZXZpY2UuCioKKiBJTlBVVFM6CiogICAgICAgZW4gLSBHVF9UVVJFIHBlciBwb3J0IG1hYywgR1RfRkFMU0UgZ2xvYmFsIG1hYy4KKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRQZXJQb3J0RHVwbGV4UGF1c2VNYWMKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9CT09MICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogRGF0YSB0byBiZSBzZXQgaW50byB0aGUgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXRQZXJQb3J0RHVwbGV4UGF1c2VNYWMgQ2FsbGVkLlxuIikpOwogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBpZiB0aGUgZGV2aWNlIGhhcyBTd2l0Y2ggTUFDIFJlZ2lzdGVyLCB3ZSBuZWVkIHRoZSBzcGVjaWFsIG9wZXJhdGlvbiAqLwogICAgaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NXSVRDSF9NQUNfUkVHKSkKICAgIHsKICAgICAgICByZXRWYWwgPSB3cml0ZURpZmZNQUMoZGV2LGRhdGEpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfTUVMT0RZX1NXSVRDSCkpCiAgICAgICAgcmV0VmFsID0gd3JpdGVEaWZmTUFDKGRldixkYXRhKTsKICAgICAgZWxzZQogICAgICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19NQUNBRERSXzAxLDgsMSxkYXRhKTsKICAgIH0KCiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFBlclBvcnREdXBsZXhQYXVzZU1hYwoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIEdldHMgd2hldGhlciB0aGUgZnVsbCBkdXBsZXggcGF1c2Ugc3JjIE1hYyBBZGRyZXNzIGlzIHBlcgoqICAgICAgIHBvcnQgb3IgcGVyIGRldmljZS4KKgoqIElOUFVUUzoKKiAgICAgICBlbiAtIEdUX1RVUkUgcGVyIHBvcnQgbWFjLCBHVF9GQUxTRSBnbG9iYWwgbWFjLgoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0UGVyUG9ydER1cGxleFBhdXNlTWFjCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9CT09MICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXRQZXJQb3J0RHVwbGV4UGF1c2VNYWMgQ2FsbGVkLlxuIikpOwogICAgaWYoZW4gPT0gTlVMTCkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKICAgIC8qIGlmIHRoZSBkZXZpY2UgaGFzIFN3aXRjaCBNQUMgUmVnaXN0ZXIsIHdlIG5lZWQgdGhlIHNwZWNpYWwgb3BlcmF0aW9uICovCiAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfU1dJVENIX01BQ19SRUcpKQogICAgewogICAgICAgIHJldFZhbCA9IHJlYWREaWZmTUFDKGRldiwmZGF0YSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NRUxPRFlfU1dJVENIKSkKICAgICAgICByZXRWYWwgPSByZWFkRGlmZk1BQyhkZXYsJmRhdGEpOwogICAgICBlbHNlCiAgICAgICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01BQ0FERFJfMDEsOCwxLCZkYXRhKTsKICAgIH0KCiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFBvcnRXYWtlb25GcmFtZUVuCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgc2V0cyBwb3J0IGludGVycnVwdCBmb3Igd2FrZSBvbiBmcmFtZS4KKgoqIElOUFVUUzoKKiAgICAgICBwb3J0VmVjIC0gY29tYmluZSBwb3J0IGludGVycnVwdCBlbmFibGU9MSBkaXNhYmxlPTA6CiogICAgICAgICAgICAgICAgIHBvcnQgMDogYml0MCwgcG9ydCAxOiBiaXQxLCBwb3J0IDI6IGJpdDIsIC4uLgoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFBvcnRXYWtlb25GcmFtZUVuCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfVTggICAgICAgIHBvcnRWZWMKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRQb3J0V2FrZW9uRnJhbWUgQ2FsbGVkLlxuIikpOwoKICAgIGlmICghKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NXSVRDSF9NQUNfUkVHKSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CiAgICBpZiAoIShJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9TV0lUQ0hfV09MX1dPRl9SRUcpKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KICAgIHJldFZhbCA9IHdyaXRlU3dNYWNXb2xXb2ZSZWcoZGV2LCAweDBlLCBwb3J0VmVjKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0UG9ydFdha2VvbkZyYW1lRW4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBnZXRzIHBvcnQgaW50ZXJydXB0IGVuYWJsZSBmb3Igd2FrZSBvbiBmcmFtZS4KKgoqIElOUFVUUzoKKiAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICBwb3J0VmVjIC0gY29tYmluZSBwb3J0IGludGVycnVwdCBlbmFibGU9MSBkaXNhYmxlPTA6CiogICAgICAgICAgICAgICAgIHBvcnQgMDogYml0MCwgcG9ydCAxOiBiaXQxLCBwb3J0IDI6IGJpdDIsIC4uLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFBvcnRXYWtlb25GcmFtZUVuCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX1U4ICAgICAgICpwb3J0VmVjCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0UG9ydFdha2VvbkZyYW1lRW4gQ2FsbGVkLlxuIikpOwoKICAgIGlmICghKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NXSVRDSF9NQUNfUkVHKSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CiAgICBpZiAoIShJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9TV0lUQ0hfV09MX1dPRl9SRUcpKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KICAgIHJldFZhbCA9IHJlYWRTd01hY1dvbFdvZlJlZyhkZXYsIDB4MGUsIHBvcnRWZWMpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRQb3J0V2FrZW9uRnJhbWVFblN0CioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgZ2V0cyBwb3J0IGludGVycnVwdCBzdGF0dXMgZm9yIHdha2Ugb24gZnJhbWUuCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgcG9ydFZlYyAtIGNvbWJpbmUgcG9ydCBpbnRlcnJ1cHQgZW5hYmxlPTEgZGlzYWJsZT0wOgoqICAgICAgICAgICAgICAgICBwb3J0IDA6IGJpdDAsIHBvcnQgMTogYml0MSwgcG9ydCAyOiBiaXQyLCAuLi4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRQb3J0V2FrZW9uRnJhbWVFblN0CigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX1U4ICAgICAgICpwb3J0VmVjCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0UG9ydFdha2VvbkZyYW1lRW5TdCBDYWxsZWQuXG4iKSk7CgogICAgaWYgKCEoSVNfSU5fREVWX0dST1VQKGRldixERVZfU1dJVENIX01BQ19SRUcpKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KICAgIGlmICghKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NXSVRDSF9XT0xfV09GX1JFRykpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQogICAgcmV0VmFsID0gcmVhZFN3TWFjV29sV29mUmVnKGRldiwgMHgwYywgcG9ydFZlYyk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFdvTE1hYwoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIHNldHMgdGhlIFdha2Ugb24gTGFuIE1hYyBBZGRyZXNzLgoqICAgICAgICBNQUMgYWRkcmVzcyBzaG91bGQgYmUgYW4gVW5pY2FzdCBhZGRyZXNzLgoqICAgICAgICBGb3IgZGlmZmVyZW50IE1BQyBBZGRyZXNzZXMgcGVyIHBvcnQgb3BlcmF0aW9uLAoqICAgICAgICB1c2UgZ3N5c1NldFBlclBvcnREdXBsZXhQYXVzZU1hYyBBUEkuCioKKiBJTlBVVFM6CiogICAgICAgbWFjIC0gVGhlIE1hYyBhZGRyZXNzIHRvIGJlIHNldC4KKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAgICAgICAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0JBRF9QQVJBTSAgICAtIG9uIGJhZCBwYXJhbWV0ZXIKKiAgICAgICBHVF9GQUlMICAgICAgICAgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFdvTE1hYwooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0VUSEVSQUREUiAqbWFjCikKewogICAgREJHX0lORk8oKCJnc3lzU2V0V29MTWFjIENhbGxlZC5cbiIpKTsKICAgIGlmKG1hYyA9PSBOVUxMKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgLyogaWYgdGhlIGRldmljZSBoYXMgU3dpdGNoIE1BQyBSZWdpc3Rlciwgd2UgbmVlZCB0aGUgc3BlY2lhbCBvcGVyYXRpb24gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfU1dJVENIX1dPTF9XT0ZfUkVHKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICByZXR1cm4gd3JpdGVTd2l0Y2hNYWNXb2xSZWcoZGV2LCAweDEwLCBtYWMpOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0V29MTWFjCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgR2V0cyB0aGUgV2FrZSBvbiBMYW4gTWFjIEFkZHJlc3MuCiogICAgICAgIEZvciBkaWZmZXJlbnQgTUFDIEFkZHJlc3NlcyBwZXIgcG9ydCBvcGVyYXRpb24sCiogICAgICAgIHVzZSBnc3lzR2V0UGVyUG9ydER1cGxleFBhdXNlTWFjIEFQSS4KKgoqIElOUFVUUzoKKiAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICBtYWMgLSB0aGUgTWFjIGFkZHJlc3MuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgICAgICAgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9CQURfUEFSQU0gICAgLSBvbiBiYWQgcGFyYW1ldGVyCiogICAgICAgR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRXb0xNYWMKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0VUSEVSQUREUiAqbWFjCikKewogICAgREJHX0lORk8oKCJnc3lzR2V0V29MTWFjIENhbGxlZC5cbiIpKTsKICAgIGlmKG1hYyA9PSBOVUxMKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9TV0lUQ0hfV09MX1dPRl9SRUcpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIHJldHVybiByZWFkU3dpdGNoTWFjV29sUmVnKGRldiwgMHgxMCwgbWFjKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0UGVyUG9ydFdvTE1hYwoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIHNldHMgd2hldGhlciB0aGUgV2FrZSBvbiBMYW4gTWFjIEFkZHJlc3MgaXMgcGVyCiogICAgICAgcG9ydCBvciBwZXIgZGV2aWNlLgoqCiogSU5QVVRTOgoqICAgICAgIGVuIC0gR1RfVFVSRSBwZXIgcG9ydCBtYWMsIEdUX0ZBTFNFIGdsb2JhbCBtYWMuCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0UGVyUG9ydFdvTE1hYwooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0JPT0wgICAgICBlbgopCnsKICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogRGF0YSB0byBiZSBzZXQgaW50byB0aGUgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXRQZXJQb3J0V29MTWFjIENhbGxlZC5cbiIpKTsKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogaWYgdGhlIGRldmljZSBoYXMgU3dpdGNoIE1BQyBSZWdpc3Rlciwgd2UgbmVlZCB0aGUgc3BlY2lhbCBvcGVyYXRpb24gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfU1dJVENIX01BQ19SRUcpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwoKICAgIH0KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfU1dJVENIX1dPTF9XT0ZfUkVHKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICByZXR1cm4gd3JpdGVEaWZmTUFDV29MKGRldiwgMHgxMCwgZGF0YSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFBlclBvcnRXb0xNYWMKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBHZXRzIHdoZXRoZXIgdGhlIFdha2Ugb24gTGFuYyBNYWMgQWRkcmVzcyBpcyBwZXIKKiAgICAgICBwb3J0IG9yIHBlciBkZXZpY2UuCioKKiBJTlBVVFM6CiogICAgICAgZW4gLSBHVF9UVVJFIHBlciBwb3J0IG1hYywgR1RfRkFMU0UgZ2xvYmFsIG1hYy4KKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAgICAgICAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0JBRF9QQVJBTSAgICAtIG9uIGJhZCBwYXJhbWV0ZXIKKiAgICAgICBHVF9GQUlMICAgICAgICAgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFBlclBvcnRXb0xNYWMKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAgICAqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFBlclBvcnRXb0xNYWMgQ2FsbGVkLlxuIikpOwogICAgaWYoZW4gPT0gTlVMTCkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKICAgIC8qIGlmIHRoZSBkZXZpY2UgaGFzIFN3aXRjaCBNQUMgUmVnaXN0ZXIsIHdlIG5lZWQgdGhlIHNwZWNpYWwgb3BlcmF0aW9uICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NXSVRDSF9NQUNfUkVHKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKCiAgICB9CiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NXSVRDSF9XT0xfV09GX1JFRykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgoKICAgIHJldFZhbCA9IHJlYWREaWZmTUFDV29MKGRldiwgMHgxMCwgJmRhdGEpOwoKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0V29MUGFzcwoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIHNldHMgdGhlIFdha2Ugb24gTGFuIFBhc3N3b3JkIE1hYyBBZGRyZXNzLgoqCiogSU5QVVRTOgoqICAgICAgIG1hYyAtIFRoZSBNYWMgYWRkcmVzcyB0byBiZSBzZXQuCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgICAgICAgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9CQURfUEFSQU0gICAgLSBvbiBiYWQgcGFyYW1ldGVyCiogICAgICAgR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRXb0xQYXNzCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfRVRIRVJBRERSICptYWMKKQp7CiAgICBEQkdfSU5GTygoImdzeXNTZXRXb0xQYXNzIENhbGxlZC5cbiIpKTsKICAgIGlmKG1hYyA9PSBOVUxMKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgLyogaWYgdGhlIGRldmljZSBoYXMgU3dpdGNoIE1BQyBSZWdpc3Rlciwgd2UgbmVlZCB0aGUgc3BlY2lhbCBvcGVyYXRpb24gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfU1dJVENIX1dPTF9XT0ZfUkVHKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICByZXR1cm4gd3JpdGVTd2l0Y2hNYWNXb2xSZWcoZGV2LCAweDE2LCBtYWMpOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0V29MUGFzcwoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIEdldHMgdGhlIFdha2Ugb24gTGFuIHBhc3N3b3JkIE1hYyBBZGRyZXNzLgoqCiogSU5QVVRTOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgIG1hYyAtIHRoZSBNYWMgYWRkcmVzcy4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAgICAgICAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0JBRF9QQVJBTSAgICAtIG9uIGJhZCBwYXJhbWV0ZXIKKiAgICAgICBHVF9GQUlMICAgICAgICAgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFdvTFBhc3MKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0VUSEVSQUREUiAqbWFjCikKewogICAgREJHX0lORk8oKCJnc3lzR2V0V29MUGFzcyBDYWxsZWQuXG4iKSk7CiAgICBpZihtYWMgPT0gTlVMTCkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfU1dJVENIX1dPTF9XT0ZfUkVHKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICByZXR1cm4gcmVhZFN3aXRjaE1hY1dvbFJlZyhkZXYsIDB4MTYsIG1hYyk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNSZWFkTWlpUmVnCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgcmVhZHMgUXVhcnRlckRlY2sgUmVnaXN0ZXJzLiBTaW5jZSB0aGlzIHJvdXRpbmUgaXMgb25seSBmb3IKKiAgICAgICAgRGlhZ25vc3RpYyBQdXJwb3NlLCBubyBlcnJvciBjaGVja2luZyB3aWxsIGJlIHBlcmZvcm1lZC4KKiAgICAgICAgVXNlciBoYXMgdG8ga25vdyB3aGljaCBwaHkgYWRkcmVzcygwIH4gMHgxRikgd2lsbCBiZSByZWFkLgoqCiogSU5QVVRTOgoqICAgICAgIHBoeUFkZHIgLSBQaHkgQWRkcmVzcyB0byByZWFkIHRoZSByZWdpc3RlciBmb3IuKCAwIH4gMHgxRiApCiogICAgICAgcmVnQWRkciAtIFRoZSByZWdpc3RlcidzIGFkZHJlc3MuCioKKiBPVVRQVVRTOgoqICAgICAgIGRhdGEgICAgLSBUaGUgcmVhZCByZWdpc3RlcidzIGRhdGEuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgICAgICAgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMICAgICAgICAgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1JlYWRNaWlSZWcKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gIEdUX1UzMiAgICAgICAgIHBoeUFkZHIsCiAgICBJTiAgR1RfVTMyICAgICAgICAgcmVnQWRkciwKICAgIE9VVCBHVF9VMzIgICAgICAgICAqZGF0YQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIHUxNkRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzUmVhZE1paVJlZ2lzdGVyIENhbGxlZC5cbiIpKTsKCiAgICAvKiBHZXQgdGhlIHJlZ2lzdGVyIGRhdGEgKi8KICAgIHJldFZhbCA9IGh3UmVhZE1paVJlZyhkZXYsKEdUX1U4KXBoeUFkZHIsKEdUX1U4KXJlZ0FkZHIsJnUxNkRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgKmRhdGEgPSAoR1RfVTMyKXUxNkRhdGE7CgogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNXcml0ZU1paVJlZwoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIHdyaXRlcyBRdWFydGVyRGVjayBSZWdpc3RlcnMuIFNpbmNlIHRoaXMgcm91dGluZSBpcyBvbmx5IGZvcgoqICAgICAgICBEaWFnbm9zdGljIFB1cnBvc2UsIG5vIGVycm9yIGNoZWNraW5nIHdpbGwgYmUgcGVyZm9ybWVkLgoqICAgICAgICBVc2VyIGhhcyB0byBrbm93IHdoaWNoIHBoeSBhZGRyZXNzKDAgfiAweDFGKSB3aWxsIGJlIHJlYWQuCioKKiBJTlBVVFM6CiogICAgICAgcGh5QWRkciAtIFBoeSBBZGRyZXNzIHRvIHJlYWQgdGhlIHJlZ2lzdGVyIGZvci4oIDAgfiAweDFGICkKKiAgICAgICByZWdBZGRyIC0gVGhlIHJlZ2lzdGVyJ3MgYWRkcmVzcy4KKgoqIE9VVFBVVFM6CiogICAgICAgZGF0YSAgICAtIFRoZSByZWFkIHJlZ2lzdGVyJ3MgZGF0YS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAgICAgICAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzV3JpdGVNaWlSZWcKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gIEdUX1UzMiAgICAgICAgIHBoeUFkZHIsCiAgICBJTiAgR1RfVTMyICAgICAgICAgcmVnQWRkciwKICAgIElOICBHVF9VMTYgICAgICAgICBkYXRhCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzV3JpdGVNaWlSZWdpc3RlciBDYWxsZWQuXG4iKSk7CgogICAgLyogU2V0IHRoZSByZWdpc3RlciBkYXRhICovCiAgICByZXRWYWwgPSBod1dyaXRlTWlpUmVnKGRldiwoR1RfVTgpcGh5QWRkciwoR1RfVTgpcmVnQWRkcixkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIHJldHVybiBHVF9PSzsKfQojaWZkZWYgR1RfUk1HTVRfQUNDRVNTCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0FjY2Vzc011bHRpUmVncwoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyBmdW5jdGlvbiBhY2Nlc3NlcyBzd2l0Y2gncyByZWdpc3RlcnMuCioKKiBJTlBVVFM6CiogICByZWdMaXN0ICAgICAtIGxpc3Qgb2YgSFdfREVWX1JXX1JFRy4KKiAgICAgSFdfREVWX1JXX1JFRzoKKiAgICAgY21kIC0gSFdfUkVHX1JFQUQsIEhXX1JFR19XUklURSwgSFdfUkVHX1dBSVRfVElMTF8wIG9yIEhXX1JFR19XQUlUX1RJTExfMQoqICAgICBhZGRyIC0gU01JIEFkZHJlc3MKKiAgICAgcmVnICAtIFJlZ2lzdGVyIG9mZnNldAoqICAgICBkYXRhIC0gSU5QVVQsT1VUUFVUOlZhbHVlIGluIHRoZSBSZWdpc3RlciBvciBCaXQgbnVtYmVyCioKKiBPVVRQVVRTOgoqICAgcmVnTGlzdAoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNBY2Nlc3NNdWx0aVJlZ3MKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU5PVVQgSFdfREVWX1JFR19BQ0NFU1MgKnJlZ0xpc3QKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNBY2Nlc3NNdWx0aVJlZyBDYWxsZWQuXG4iKSk7CiAgICAvKiBTZXQgdGhlIHJlZ2lzdGVyIGRhdGEgKi8KICAgIHJldFZhbCA9IGh3QWNjZXNzTXVsdGlSZWdzKGRldixyZWdMaXN0KTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQogICAgcmV0dXJuIEdUX09LOwp9CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0UmV0cmFuc21pdE1vZGUKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBzZXQgdGhlIFJldHJhbnNtaXQgTW9kZS4KKgoqIElOUFVUUzoKKiAgICAgICBlbiAtIEdUX1RSVUUgUmV0cmFuc2ltdCBNb2RlIGlzIGVuYWJsZWQsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRSZXRyYW5zbWl0TW9kZQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBJTiAgR1RfQk9PTCAgICAgIGVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIERhdGEgdG8gYmUgc2V0IGludG8gdGhlICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAqLwogICAgREJHX0lORk8oKCJnc3lzU2V0UmV0cmFuc21pdE1vZGUgQ2FsbGVkLlxuIikpOwogICAgLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICgoSVNfSU5fREVWX0dST1VQKGRldixERVZfR0lHQUJJVF9TV0lUQ0gpKSB8fAogICAgICAgIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NRUxPRFlfU1dJVENIKSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCB0aGUgUmV0cmFuc21pdCBNb2RlIGJpdC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxNSwxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRSZXRyYW5zbWl0TW9kZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgUmV0cmFuc21pdCBNb2RlLgoqCiogSU5QVVRTOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSBSZXRyYW5zbWl0IE1vZGUgaXMgZW5hYmxlZCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0UmV0cmFuc21pdE1vZGUKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAgICAqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJldHJhbnNtaXRNb2RlIENhbGxlZC5cbiIpKTsKICAgIGlmKGVuID09IE5VTEwpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9HSUdBQklUX1NXSVRDSCkpIHx8CiAgICAgICAgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX01FTE9EWV9TV0lUQ0gpKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KICAgIC8qIEdldCB0aGUgYml0LiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDE1LDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0TGltaXRCYWNrb2ZmCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgc2V0IHRoZSBMaW1pdCBCYWNrb2ZmIGJpdC4KKgoqIElOUFVUUzoKKiAgICAgICBlbiAtIEdUX1RSVUU6ICB1c2VzIFFvUyBoYWxmIGR1cGxleCBiYWNrb2ZmIG9wZXJhdGlvbgoqICAgICAgICAgICAgR1RfRkFMU0U6IHVzZXMgbm9ybWFsIGhhbGYgZHVwbGV4IGJhY2tvZmYgb3BlcmF0aW9uCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0TGltaXRCYWNrb2ZmCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOICBHVF9CT09MICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogRGF0YSB0byBiZSBzZXQgaW50byB0aGUgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXRMaW1pdEJhY2tvZmYgQ2FsbGVkLlxuIikpOwogICAgLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICgoSVNfSU5fREVWX0dST1VQKGRldixERVZfR0lHQUJJVF9TV0lUQ0gpKSB8fAogICAgICAgIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NRUxPRFlfU1dJVENIKSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCB0aGUgYml0LiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDE0LDEsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldExpbWl0QmFja29mZgoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIHNldCB0aGUgTGltaXQgQmFja29mZiBiaXQuCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgZW4gLSBHVF9UUlVFOiAgdXNlcyBRb1MgaGFsZiBkdXBsZXggYmFja29mZiBvcGVyYXRpb24KKiAgICAgICAgICAgIEdUX0ZBTFNFOiB1c2VzIG5vcm1hbCBoYWxmIGR1cGxleCBiYWNrb2ZmIG9wZXJhdGlvbgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0TGltaXRCYWNrb2ZmCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9CT09MICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXRMaW1pdEJhY2tvZmYgQ2FsbGVkLlxuIikpOwogICAgaWYoZW4gPT0gTlVMTCkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQogICAgLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICgoSVNfSU5fREVWX0dST1VQKGRldixERVZfR0lHQUJJVF9TV0lUQ0gpKSB8fAogICAgICAgIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NRUxPRFlfU1dJVENIKSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBiaXQuICAgICAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsMTQsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRSc3ZSZXFQcmkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBzZXQgdGhlIFJlc2VydmVkIFF1ZXVlJ3MgUmVxdWVzdGluZyBQcmlvcml0eQoqCiogSU5QVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRTogdXNlIHRoZSBsYXN0IHJlY2VpdmVkIGZyb21lJ3MgcHJpb3JpdHkKKiAgICAgICAgICAgIEdUX0ZBTFNFOnVzZSB0aGUgbGFzdCBzd2l0Y2hlZCBmcmFtZSdzIHByaW9yaXR5CioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0UnN2UmVxUHJpCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOICBHVF9CT09MICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogRGF0YSB0byBiZSBzZXQgaW50byB0aGUgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXRSc3ZSZXFQcmkgQ2FsbGVkLlxuIikpOwogICAgLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9HSUdBQklUX1NXSVRDSCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCB0aGUgYml0LiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDEyLDEsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFJzdlJlcVByaQoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgUmVzZXJ2ZWQgUXVldWUncyBSZXF1ZXN0aW5nIFByaW9yaXR5CioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgZW4gLSBHVF9UUlVFOiB1c2UgdGhlIGxhc3QgcmVjZWl2ZWQgZnJvbWUncyBwcmlvcml0eQoqICAgICAgICAgICAgR1RfRkFMU0U6dXNlIHRoZSBsYXN0IHN3aXRjaGVkIGZyYW1lJ3MgcHJpb3JpdHkKKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAgICAgICAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0JBRF9QQVJBTSAgICAtIG9uIGJhZCBwYXJhbWV0ZXIKKiAgICAgICBHVF9GQUlMICAgICAgICAgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFJzdlJlcVByaQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0UnN2UmVxUHJpIENhbGxlZC5cbiIpKTsKICAgIGlmKGVuID09IE5VTEwpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KICAgIC8qIE9ubHkgR2lnYWJpdCBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfR0lHQUJJVF9TV0lUQ0gpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgYml0LiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDEyLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRDYXNjYWRlUG9ydAoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFRoaXMgcm91dGluZSBzZXRzIENhc2NhZGUgUG9ydCBudW1iZXIuCiogICAgICAgIEluIG11bHRpY2hpcCBzeXN0ZW1zIGZyYW1lcyBjb21pbmcgZnJvbSBhIENQVSBuZWVkIHRvIGtub3cgd2hlbiB0aGV5CiogICAgICAgIGhhdmUgcmVhY2hlZCB0aGVpciBkZXN0aW5hdGlvbiBjaGlwLgoqCiogICAgICAgIFVzZSBDYXNjYWRlIFBvcnQgPSAweEUgdG8gaW5kaWNhdGUgdGhpcyBjaGlwIGhhcyBubyBDYXNjYWRlIHBvcnQuCiogICAgICAgIFVzZSBDYXNjYWRlIFBvcnQgPSAweEYgdG8gdXNlIFJvdXRpbmcgdGFibGUgKGdzeXNHZXREZXZSb3V0aW5nVGFibGUpLgoqCiogSU5QVVRTOgoqICAgICAgICBwb3J0IC0gQ2FzY2FkZSBQb3J0CioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0Q2FzY2FkZVBvcnQKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9MUE9SVCAgICAgcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXRDYXNjYWRlUG9ydCBDYWxsZWQuXG4iKSk7CiAgICAvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DQVNDQURFX1BPUlQpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIHRyYW5zbGF0ZSBMUE9SVCB0byBoYXJkd2FyZSBwb3J0ICovCiAgICBpZigocG9ydCA9PSAweEUpIHx8IChwb3J0ID09IDB4RikpCiAgICAgICAgZGF0YSA9IChHVF9VMTYpcG9ydDsKICAgIGVsc2UKICAgIHsKICAgICAgICBkYXRhID0gKEdUX1UxNikoR1RfTFBPUlRfMl9QT1JUKHBvcnQpKTsKICAgICAgICBpZiAoZGF0YSA9PSBHVF9JTlZBTElEX1BPUlQpCiAgICAgICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgLyogU2V0IHRoZSBDYXNjYWRlIHBvcnQuICAgICAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wyLDEyLDQsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRDYXNjYWRlUG9ydAoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFRoaXMgcm91dGluZSBnZXRzIENhc2NhZGUgUG9ydCBudW1iZXIuCiogICAgICAgIEluIG11bHRpY2hpcCBzeXN0ZW1zIGZyYW1lcyBjb21pbmcgZnJvbSBhIENQVSBuZWVkIHRvIGtub3cgd2hlbiB0aGV5CiogICAgICAgIGhhdmUgcmVhY2hlZCB0aGVpciBkZXN0aW5hdGlvbiBjaGlwLgoqCiogICAgICAgIFVzZSBDYXNjYWRlIFBvcnQgPSAweEUgdG8gaW5kaWNhdGUgdGhpcyBjaGlwIGhhcyBubyBDYXNjYWRlIHBvcnQuCiogICAgICAgIFVzZSBDYXNjYWRlIFBvcnQgPSAweEYgdG8gdXNlIFJvdXRpbmcgdGFibGUgKGdzeXNHZXREZXZSb3V0aW5nVGFibGUpLgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgcG9ydCAtIENhc2NhZGUgUG9ydAoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0Q2FzY2FkZVBvcnQKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0xQT1JUICAgICAqcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXRDYXNjYWRlUG9ydCBDYWxsZWQuXG4iKSk7CiAgICAvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DQVNDQURFX1BPUlQpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgQ2FzY2FkZSBwb3J0LiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwxMiw0LCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIGlmKChkYXRhID09IDB4RSkgfHwgKGRhdGEgPT0gMHhGKSkKICAgIHsKICAgICAgICAqcG9ydCA9IChHVF9MUE9SVClkYXRhOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgICpwb3J0ID0gR1RfUE9SVF8yX0xQT1JUKChHVF9VOClkYXRhKTsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXREZXZpY2VOdW1iZXIKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGlzIHJvdXRpbmUgc2V0cyBEZXZpY2UgTnVtYmVyLgoqICAgICAgICBJbiBtdWx0aWNoaXAgc3lzdGVtcyBmcmFtZXMgY29taW5nIGZyb20gYSBDUFUgbmVlZCB0byBrbm93IHdoZW4gdGhleQoqICAgICAgICBoYXZlIHJlYWNoZWQgdGhlaXIgZGVzdGluYXRpb24gY2hpcC4gRnJvbSBDUFUgZnJhbWVzIHdob3NlIERldl9OdW0KKiAgICAgICAgZmllbGRtYXRjaGVzIHRoZXNlIGJpdHMgaGF2ZSByZWFjaGVkdGhlaXIgZGVzdGluYXRpb24gY2hpcCBhbmQgYXJlIHNlbnQKKiAgICAgICAgb3V0IHRoaXMgY2hpcCB1c2luZyB0aGUgcG9ydCBudW1iZXIgaW5kaWNhdGVkIGluIHRoZSBmcmFtZSdzIFRyZ19Qb3J0CiogICAgICAgIGZpZWxkLgoqCiogSU5QVVRTOgoqICAgICAgICBkZXZOdW0gLSBEZXZpY2UgTnVtYmVyICgwIH4gMzEpCioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0RGV2aWNlTnVtYmVyCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfVTMyICAgICAgICAgIGRldk51bQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXREZXZpY2VOdW1iZXIgQ2FsbGVkLlxuIikpOwogICAgLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfR0lHQUJJVF9TV0lUQ0gpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIGRhdGEgPSAoKEdUX1UxNilkZXZOdW0pICYgMHgxRjsgLyogb25seSA1IGJpdHMgYXJlIHZhbGlkICovCgogICAgLyogU2V0IHRoZSBEZXZpY2UgTnVtYmVyLiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwwLDUsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXREZXZpY2VOdW1iZXIKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0cyBEZXZpY2UgTnVtYmVyLgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgZGV2TnVtIC0gRGV2aWNlIE51bWJlciAoMCB+IDMxKQoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0RGV2aWNlTnVtYmVyCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9VMzIgICAgICAqZGV2TnVtCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldERldmljZU51bWJlciBDYWxsZWQuXG4iKSk7CiAgICAvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9HSUdBQklUX1NXSVRDSCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBEZXZpY2UgTnVtYmVyLiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwwLDUsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgKmRldk51bSA9IChHVF9VMzIpZGF0YTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldENvcmVUYWdUeXBlCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVGhpcyByb3V0aW5lIHNldHMgRXRoZXIgQ29yZSBUYWcgVHlwZS4KKiAgICAgICAgVGhpcyBFdGhlciBUeXBlIGlzIGFkZGVkIHRvIGZyYW1lcyB0aGF0IGVncmVzcyB0aGUgc3dpdGNoIGFzIERvdWJsZSBUYWdnZWQKKiAgICAgICAgZnJhbWVzLiBJdCBpcyBhbHNvIHRoZSBFdGhlciBUeXBlIGV4cGVjdGVkIGR1cmluZyBJbmdyZXNzIHRvIGRldGVybWluZSBpZgoqICAgICAgICBhIGZyYW1lIGlzIFRhZ2dlZCBvciBub3Qgb24gcG9ydHMgY29uZmlndXJlZCBhcyBVc2VDb3JlVGFnIG1vZGUuCioKKiBJTlBVVFM6CiogICAgICAgIGV0aGVyVHlwZSAtIENvcmUgVGFnIFR5cGUgKDIgYnl0ZXMpCioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0Q29yZVRhZ1R5cGUKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VMTYgICAgICAgICAgZXRoZXJUeXBlCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0Q29yZVRhZ1R5cGUgQ2FsbGVkLlxuIikpOwoKICAgIC8qIE9ubHkgR2lnYWJpdCBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0NPUkVfVEFHKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBTZXQgdGhlIEV0aGVyIFR5cGUgKi8KICAgIHJldFZhbCA9IGh3V3JpdGVHbG9iYWxSZWcoZGV2LFFEX1JFR19DT1JFVEFHX1RZUEUsZXRoZXJUeXBlKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldENvcmVUYWdUeXBlCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVGhpcyByb3V0aW5lIGdldHMgQ29yZVRhZ1R5cGUKKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGV0aGVyVHlwZSAtIENvcmUgVGFnIFR5cGUgKDIgYnl0ZXMpCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRDb3JlVGFnVHlwZQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfVTE2ICAgICAgKmV0aGVyVHlwZQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRDb3JlVGFnVHlwZSBDYWxsZWQuXG4iKSk7CgogICAgLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQ09SRV9UQUcpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgRGV2aWNlIE51bWJlci4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbFJlZyhkZXYsUURfUkVHX0NPUkVUQUdfVFlQRSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICAqZXRoZXJUeXBlID0gZGF0YTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEluZ3Jlc3NNb25pdG9yRGVzdAoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFRoaXMgcm91dGluZSBzZXRzIEluZ3Jlc3MgTW9uaXRvciBEZXN0aW5hdGlvbiBQb3J0LiBGcmFtZXMgdGhhdCBhcmUKKiAgICAgICAgdGFyZ2V0ZWQgdG93YXJkIGFuIEluZ3Jlc3MgTW9uaXRvciBEZXN0aW5hdGlvbiBnbyBvdXQgdGhlIHBvcnQgbnVtYmVyCiogICAgICAgIGluZGljYXRlZCBpbiB0aGVzZSBiaXRzLiBUaGlzIGluY2x1ZGVzIGZyYW1lcyByZWNlaXZlZCBvbiBhIE1hcnZlbGwgVGFnIHBvcnQKKiAgICAgICAgd2l0aCB0aGUgSW5ncmVzcyBNb25pdG9yIHR5cGUsIGFuZCBmcmFtZXMgcmVjZWl2ZWQgb24gYSBOZXR3b3JrIHBvcnQgdGhhdAoqICAgICAgICBpcyBlbmFibGVkIHRvIGJlIHRoZSBJbmdyZXNzIE1vbml0b3IgU291cmNlIFBvcnQuCiogICAgICAgIElmIHRoZSBJbmdyZXNzIE1vbml0b3IgRGVzdGluYXRpb24gUG9ydCByZXNpZGVzIGluIHRoaXMgZGV2aWNlIHRoZXNlIGJpdHMKKiAgICAgICAgc2hvdWxkIHBvaW50IHRvIHRoZSBOZXR3b3JrIHBvcnQgd2hlcmUgdGhlc2UgZnJhbWVzIGFyZSB0byBlZ3Jlc3MuIElmIHRoZQoqICAgICAgICBJbmdyZXNzIE1vbml0b3IgRGVzdGluYXRpb24gUG9ydCByZXNpZGVzIGluIGFub3RoZXIgZGV2aWNlIHRoZXNlIGJpdHMKKiAgICAgICAgc2hvdWxkIHBvaW50IHRvIHRoZSBNYXJ2ZWxsIFRhZyBwb3J0IGluIHRoaXMgZGV2aWNlIHRoYXQgaXMgdXNlZCB0byBnZXQKKiAgICAgICAgdG8gdGhlIGRldmljZSB0aGF0IGNvbnRhaW5zIHRoZSBJbmdyZXNzIE1vbml0b3IgRGVzdGluYXRpb24gUG9ydC4KKgoqIElOUFVUUzoKKiAgICAgICAgcG9ydCAgLSB0aGUgbG9naWNhbCBwb3J0IG51bWJlci4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRJbmdyZXNzTW9uaXRvckRlc3QKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9MUE9SVCAgICAgICAgcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTggICAgICAgICAgIGh3UG9ydDsgICAgICAgICAvKiB0aGUgcGh5c2ljYWwgcG9ydCBudW1iZXIgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0SW5ncmVzc01vbml0b3JEZXN0IENhbGxlZC5cbiIpKTsKCiAgICAvKiB0cmFuc2xhdGUgTFBPUlQgdG8gaGFyZHdhcmUgcG9ydCAqLwogICAgaHdQb3J0ID0gR1RfTFBPUlRfMl9QT1JUKHBvcnQpOwoKICAgIC8qIE9ubHkgR2lnYWJpdCBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWXzg4RTYwOTNfRkFNSUxZKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiB0cmFuc2xhdGUgTFBPUlQgdG8gaGFyZHdhcmUgcG9ydCAqLwogICAgaWYocG9ydCA9PSAweEYpCiAgICAgICAgaHdQb3J0ID0gKEdUX1U4KXBvcnQ7CiAgICBlbHNlCiAgICB7CiAgICAgICAgaHdQb3J0ID0gKEdUX1U4KUdUX0xQT1JUXzJfUE9SVChwb3J0KTsKICAgICAgICBpZiAoaHdQb3J0ID09IEdUX0lOVkFMSURfUE9SVCkKICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBTZXQgdGhlIEV0aGVyIFR5cGUgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19NT05JVE9SX0NPTlRST0wsIDEyLCA0LCAoR1RfVTE2KWh3UG9ydCk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRJbmdyZXNzTW9uaXRvckRlc3QKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0cyBJbmdyZXNzIE1vbml0b3IgRGVzdGluYXRpb24gUG9ydC4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIHBvcnQgIC0gdGhlIGxvZ2ljYWwgcG9ydCBudW1iZXIuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRJbmdyZXNzTW9uaXRvckRlc3QKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0xQT1JUICAgICAgKnBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0SW5ncmVzc01vbml0b3JEZXN0IENhbGxlZC5cbiIpKTsKCiAgICAvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl84OEU2MDkzX0ZBTUlMWSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBJbmdyZXNzTW9uaXRvckRlc3QuICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTU9OSVRPUl9DT05UUk9MLCAxMiwgNCwgJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgaWYoZGF0YSA9PSAweEYpCiAgICB7CiAgICAgICAgKnBvcnQgPSAoR1RfTFBPUlQpZGF0YTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAqcG9ydCA9IEdUX1BPUlRfMl9MUE9SVCgoR1RfVTgpZGF0YSk7CiAgICB9CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRFZ3Jlc3NNb25pdG9yRGVzdAoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFRoaXMgcm91dGluZSBzZXRzIEVncmVzcyBNb25pdG9yIERlc3RpbmF0aW9uIFBvcnQuIEZyYW1lcyB0aGF0IGFyZQoqICAgICAgICB0YXJnZXRlZCB0b3dhcmQgYW4gRWdyZXNzIE1vbml0b3IgRGVzdGluYXRpb24gZ28gb3V0IHRoZSBwb3J0IG51bWJlcgoqICAgICAgICBpbmRpY2F0ZWQgaW4gdGhlc2UgYml0cy4gVGhpcyBpbmNsdWRlcyBmcmFtZXMgcmVjZWl2ZWQgb24gYSBNYXJ2ZWxsIFRhZyBwb3J0CiogICAgICAgIHdpdGggdGhlIEVncmVzcyBNb25pdG9yIHR5cGUsIGFuZCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gYSBOZXR3b3JrIHBvcnQgdGhhdAoqICAgICAgICBpcyBlbmFibGVkIHRvIGJlIHRoZSBFZ3Jlc3MgTW9uaXRvciBTb3VyY2UgUG9ydC4KKiAgICAgICAgSWYgdGhlIEVncmVzcyBNb25pdG9yIERlc3RpbmF0aW9uIFBvcnQgcmVzaWRlcyBpbiB0aGlzIGRldmljZSB0aGVzZSBiaXRzCiogICAgICAgIHNob3VsZCBwb2ludCB0byB0aGUgTmV0d29yayBwb3J0IHdoZXJlIHRoZXNlIGZyYW1lcyBhcmUgdG8gZWdyZXNzLiBJZiB0aGUKKiAgICAgICAgRWdyZXNzIE1vbml0b3IgRGVzdGluYXRpb24gUG9ydCByZXNpZGVzIGluIGFub3RoZXIgZGV2aWNlIHRoZXNlIGJpdHMKKiAgICAgICAgc2hvdWxkIHBvaW50IHRvIHRoZSBNYXJ2ZWxsIFRhZyBwb3J0IGluIHRoaXMgZGV2aWNlIHRoYXQgaXMgdXNlZCB0byBnZXQKKiAgICAgICAgdG8gdGhlIGRldmljZSB0aGF0IGNvbnRhaW5zIHRoZSBFZ3Jlc3MgTW9uaXRvciBEZXN0aW5hdGlvbiBQb3J0LgoqCiogSU5QVVRTOgoqICAgICAgICBwb3J0ICAtIHRoZSBsb2dpY2FsIHBvcnQgbnVtYmVyLgoqCiogT1VUUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEVncmVzc01vbml0b3JEZXN0CigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfTFBPUlQgICAgICAgIHBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1U4ICAgICAgICAgICBod1BvcnQ7ICAgICAgICAgLyogdGhlIHBoeXNpY2FsIHBvcnQgbnVtYmVyICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEVncmVzc01vbml0b3JEZXN0IENhbGxlZC5cbiIpKTsKCiAgICAvKiB0cmFuc2xhdGUgTFBPUlQgdG8gaGFyZHdhcmUgcG9ydCAqLwogICAgaHdQb3J0ID0gR1RfTFBPUlRfMl9QT1JUKHBvcnQpOwoKICAgIC8qIE9ubHkgR2lnYWJpdCBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWXzg4RTYwOTNfRkFNSUxZKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBpZihwb3J0ID09IDB4RikKICAgICAgICBod1BvcnQgPSAoR1RfVTgpcG9ydDsKICAgIGVsc2UKICAgIHsKICAgICAgICBod1BvcnQgPSAoR1RfVTgpR1RfTFBPUlRfMl9QT1JUKHBvcnQpOwogICAgICAgIGlmIChod1BvcnQgPT0gR1RfSU5WQUxJRF9QT1JUKQogICAgICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKICAgIC8qIFNldCBFZ3Jlc3NNb25pdG9yRGVzdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01PTklUT1JfQ09OVFJPTCwgOCwgNCwgKEdUX1UxNilod1BvcnQpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0RWdyZXNzTW9uaXRvckRlc3QKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0cyBFZ3Jlc3MgTW9uaXRvciBEZXN0aW5hdGlvbiBQb3J0LgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgcG9ydCAgLSB0aGUgbG9naWNhbCBwb3J0IG51bWJlci4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldEVncmVzc01vbml0b3JEZXN0CigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9MUE9SVCAgICAgICpwb3J0CikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldEVncmVzc01vbml0b3JEZXN0IENhbGxlZC5cbiIpKTsKCiAgICAvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl84OEU2MDkzX0ZBTUlMWSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBFZ3Jlc3NNb25pdG9yRGVzdC4gKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19NT05JVE9SX0NPTlRST0wsIDgsIDQsICZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIGlmKGRhdGEgPT0gMHhGKQogICAgewogICAgICAgICpwb3J0ID0gKEdUX0xQT1JUKWRhdGE7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgKnBvcnQgPSBHVF9QT1JUXzJfTFBPUlQoKEdUX1U4KWRhdGEpOwogICAgfQogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEFSUERlc3QKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGlzIHJvdXRpbmUgc2V0cyBBUlAgTW9uaXRvciBEZXN0aW5hdGlvbiBQb3J0LiBUYWdnZWQgb3IgdW50YWdnZWQKKiAgICAgICAgZnJhbWVzIGluZ3Jlc3MgTmV0d29yayBwb3J0cyB0aGF0IGhhdmUgdGhlIEJyb2FkY2FzdCBEZXN0aW5hdGlvbiBBZGRyZXNzCiogICAgICAgIHdpdGggYW4gRXRoZXJ0eXBlIG9mIDB4MDgwNiBhcmUgbWlycm9yZWQgdG8gdGhpcyBwb3J0LiBUaGUgQVJQRGVzdAoqICAgICAgICBzaG91bGQgcG9pbnQgdG8gdGhlIHBvcnQgdGhhdCBkaXJlY3RzIHRoZXNlIGZyYW1lcyB0byB0aGUgc3dpdGNoJ3MgQ1BVCiogICAgICAgIHRoYXQgd2lsbCBwcm9jZXNzIEFSUHMuIFRoaXMgdGFyZ2V0IHBvcnQgc2hvdWxkIGJlIGEgTWFydmVsbCBUYWcgcG9ydCBzbwoqICAgICAgICB0aGF0IGZyYW1lcyB3aWxsIGVncmVzcyB3aXRoIGEgVG8gQ1BVIE1hcnZlbGwgVGFnIHdpdGggYSBDUFUgQ29kZSBvZiBBUlAuCiogICAgICAgIFRvIENQVSBNYXJ2ZWxsIFRhZyBmcmFtZXMgd2l0aCBhIENQVSBDb2RlIG9mZiBBUlAgdGhhdCBpbmdyZXNzIGEgTWFydmVsbAoqICAgICAgICBUYWcgcG9ydCB3aWxsIGJlIHNlbnQgdG8gdGhlIHBvcnQgbnVtYmVyIGRlZmluZWRlZCBpbiBBUlBEZXN0LgoqCiogICAgICAgIElmIEFSUERlc3QgPSAgMHhGLCBBUlAgTW9uaXRvcmluZyBpcyBkaXNhYmxlZCBhbmQgaW5ncmVzc2luZyBUbyBDUFUgQVJQCiogICAgICAgIGZyYW1lcyB3aWxsIGJlIGRpc2NhcmRlZC4KKgoqIElOUFVUUzoKKiAgICAgICAgcG9ydCAgLSB0aGUgbG9naWNhbCBwb3J0IG51bWJlci4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRBUlBEZXN0CigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfTFBPUlQgICAgICAgIHBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1U4ICAgICAgICAgICBod1BvcnQ7ICAgICAgICAgLyogdGhlIHBoeXNpY2FsIHBvcnQgbnVtYmVyICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEFSUERlc3QgQ2FsbGVkLlxuIikpOwoKICAgIC8qIHRyYW5zbGF0ZSBMUE9SVCB0byBoYXJkd2FyZSBwb3J0ICovCiAgICBod1BvcnQgPSBHVF9MUE9SVF8yX1BPUlQocG9ydCk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9BUlBfREVTVF9TVVBQT1JUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiB0cmFuc2xhdGUgTFBPUlQgdG8gaGFyZHdhcmUgcG9ydCAqLwogICAgaWYocG9ydCA9PSAweEYpCiAgICAgICAgaHdQb3J0ID0gKEdUX1U4KXBvcnQ7CiAgICBlbHNlCiAgICB7CiAgICAgICAgaHdQb3J0ID0gKEdUX1U4KShHVF9MUE9SVF8yX1BPUlQocG9ydCkpOwogICAgICAgIGlmIChod1BvcnQgPT0gR1RfSU5WQUxJRF9QT1JUKQogICAgICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01PTklUT1JfQ09OVFJPTCwgNCwgNCwgKEdUX1UxNilod1BvcnQpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0QVJQRGVzdAoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFRoaXMgcm91dGluZSBnZXRzIEFSUCBNb25pdG9yIERlc3RpbmF0aW9uIFBvcnQuIFRhZ2dlZCBvciB1bnRhZ2dlZAoqICAgICAgICBmcmFtZXMgaW5ncmVzcyBOZXR3b3JrIHBvcnRzIHRoYXQgaGF2ZSB0aGUgQnJvYWRjYXN0IERlc3RpbmF0aW9uIEFkZHJlc3MKKiAgICAgICAgd2l0aCBhbiBFdGhlcnR5cGUgb2YgMHgwODA2IGFyZSBtaXJyb3JlZCB0byB0aGlzIHBvcnQuIFRoZSBBUlBEZXN0CiogICAgICAgIHNob3VsZCBwb2ludCB0byB0aGUgcG9ydCB0aGF0IGRpcmVjdHMgdGhlc2UgZnJhbWVzIHRvIHRoZSBzd2l0Y2gncyBDUFUKKiAgICAgICAgdGhhdCB3aWxsIHByb2Nlc3MgQVJQcy4gVGhpcyB0YXJnZXQgcG9ydCBzaG91bGQgYmUgYSBNYXJ2ZWxsIFRhZyBwb3J0IHNvCiogICAgICAgIHRoYXQgZnJhbWVzIHdpbGwgZWdyZXNzIHdpdGggYSBUbyBDUFUgTWFydmVsbCBUYWcgd2l0aCBhIENQVSBDb2RlIG9mIEFSUC4KKiAgICAgICAgVG8gQ1BVIE1hcnZlbGwgVGFnIGZyYW1lcyB3aXRoIGEgQ1BVIENvZGUgb2ZmIEFSUCB0aGF0IGluZ3Jlc3MgYSBNYXJ2ZWxsCiogICAgICAgIFRhZyBwb3J0IHdpbGwgYmUgc2VudCB0byB0aGUgcG9ydCBudW1iZXIgZGVmaW5lZGVkIGluIEFSUERlc3QuCioKKiAgICAgICAgSWYgQVJQRGVzdCA9ICAweEYsIEFSUCBNb25pdG9yaW5nIGlzIGRpc2FibGVkIGFuZCBpbmdyZXNzaW5nIFRvIENQVSBBUlAKKiAgICAgICAgZnJhbWVzIHdpbGwgYmUgZGlzY2FyZGVkLgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgcG9ydCAgLSB0aGUgbG9naWNhbCBwb3J0IG51bWJlci4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldEFSUERlc3QKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0xQT1JUICAgICAgKnBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0QVJQRGVzdCBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9BUlBfREVTVF9TVVBQT1JUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19NT05JVE9SX0NPTlRST0wsIDQsIDQsICZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIGlmKGRhdGEgPT0gMHhGKQogICAgewogICAgICAgICpwb3J0ID0gKEdUX0xQT1JUKWRhdGE7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgKnBvcnQgPSBHVF9QT1JUXzJfTFBPUlQoKEdUX1U4KWRhdGEpOwogICAgfQogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFJzdmQyQ3B1RW5hYmxlcwoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFJlc2VydmVkIERBIEVuYWJsZXMuIFdoZW4gdGhlIFJzdmQyQ3B1KGdzeXNTZXRSc3ZkMkNwdSkgaXMgc2V0IHRvIGEgb25lLAoqICAgICAgICB0aGUgMTYgcmVzZXJ2ZWQgbXVsdGljYXN0IERBIGFkZHJlc3Nlcywgd2hvc2UgYml0IGluIHRoaXMgcmVnaXN0ZXIgYXJlCiogICAgICAgIGFsc28gc2V0IHRvIGEgb25lLCBhcmUgdHJlYWR0ZWQgYXMgTUdNVCBmcmFtZXMuIEFsbCB0aGUgcmVzZXJ2ZWQgREEncwoqICAgICAgICB0YWtlIHRoZSBmb3JtIDAxOjgwOkMyOjAwOjAwOjB4LiBXaGVuIHggPSAweDAsIGJpdCAwIG9mIHRoaXMgcmVnaXN0ZXIgaXMKKiAgICAgICAgdGVzdGVkLiBXaGVuIHggPSAweDIsIGJpdCAyIG9mIHRoaXMgZmllbGQgaXMgdGVzdGVkIGFuZCBzbyBvbi4KKiAgICAgICAgSWYgdGhlIHRlc3RlZCBiaXQgaW4gdGhpcyByZWdpc3RlciBpcyBjbGVhcmVkIHRvIGEgemVybywgdGhlIGZyYW1lIHdpbGwKKiAgICAgICAgYmUgdHJlYXRlZCBhcyBhIG5vcm1hbCAobm9uLU1HTVQpIGZyYW1lLgoqCiogSU5QVVRTOgoqICAgICAgICBlbkJpdHMgLSBiaXQgdmVjdG9yIG9mIGVuYWJsZWQgUmVzZXJ2ZWQgTXVsdGljYXN0LgoqCiogT1VUUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFJzdmQyQ3B1RW5hYmxlcwooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX1UxNiAgICAgICAgZW5CaXRzCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0UnN2ZDJDcHVFbmFibGVzIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0VOSEFOQ0VEX01VTFRJQ0FTVCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogU2V0IHJlbGF0ZWQgcmVnaXN0ZXIgKi8KICAgIHJldFZhbCA9IGh3V3JpdGVHbG9iYWwyUmVnKGRldixRRF9SRUdfTUdNVF9FTkFCTEUsIChHVF9VMTYpZW5CaXRzKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFJzdmQyQ3B1RW5hYmxlcwoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFJlc2VydmVkIERBIEVuYWJsZXMuIFdoZW4gdGhlIFJzdmQyQ3B1KGdzeXNTZXRSc3ZkMkNwdSkgaXMgc2V0IHRvIGEgb25lLAoqICAgICAgICB0aGUgMTYgcmVzZXJ2ZWQgbXVsdGljYXN0IERBIGFkZHJlc3Nlcywgd2hvc2UgYml0IGluIHRoaXMgcmVnaXN0ZXIgYXJlCiogICAgICAgIGFsc28gc2V0IHRvIGEgb25lLCBhcmUgdHJlYWR0ZWQgYXMgTUdNVCBmcmFtZXMuIEFsbCB0aGUgcmVzZXJ2ZWQgREEncwoqICAgICAgICB0YWtlIHRoZSBmb3JtIDAxOjgwOkMyOjAwOjAwOjB4LiBXaGVuIHggPSAweDAsIGJpdCAwIG9mIHRoaXMgcmVnaXN0ZXIgaXMKKiAgICAgICAgdGVzdGVkLiBXaGVuIHggPSAweDIsIGJpdCAyIG9mIHRoaXMgZmllbGQgaXMgdGVzdGVkIGFuZCBzbyBvbi4KKiAgICAgICAgSWYgdGhlIHRlc3RlZCBiaXQgaW4gdGhpcyByZWdpc3RlciBpcyBjbGVhcmVkIHRvIGEgemVybywgdGhlIGZyYW1lIHdpbGwKKiAgICAgICAgYmUgdHJlYXRlZCBhcyBhIG5vcm1hbCAobm9uLU1HTVQpIGZyYW1lLgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgZW5CaXRzIC0gYml0IHZlY3RvciBvZiBlbmFibGVkIFJlc2VydmVkIE11bHRpY2FzdC4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFJzdmQyQ3B1RW5hYmxlcwooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfVTE2ICAgICAgKmVuQml0cwopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJzdmQyQ3B1RW5hYmxlcyBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9FTkhBTkNFRF9NVUxUSUNBU1QpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIHJlZ2lzdGVyICovCiAgICByZXRWYWwgPSBod1JlYWRHbG9iYWwyUmVnKGRldiwgUURfUkVHX01HTVRfRU5BQkxFLCBlbkJpdHMpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFJzdmQyQ3B1CioKKiBERVNDUklQVElPTjoKKiAgICAgICAgV2hlbiB0aGUgUnN2ZDJDcHUgaXMgc2V0IHRvIGEgb25lKEdUX1RSVUUpLCBmcmFtZXMgd2l0aCBhIERlc3RpbmF0aW9uCiogICAgICAgIEFkZHJlc3MgaW4gdGhlIHJhbmdlIDAxOjgwOkMyOjAwOjAwOjB4LCByZWdhcmRsZXNzIG9mIHRoZWlyIFZMQU4KKiAgICAgICAgbWVtYmVyc2hpcCwgd2lsbCBiZSBjb25zaWRlcmVkIE1HTVQgZnJhbWVzIGFuZCBzZW50IHRvIHRoZSBDUFUgUG9ydC4KKiAgICAgICAgSWYgZGV2aWNlIHN1cHBvcnRzIFJzdmQyQ3B1RW5hYmxlIChnc3lzU2V0UnN2ZDJDcHVFbmFibGUgZnVuY3Rpb24pLAoqICAgICAgICB0aGUgZnJhbWUgd2lsbCBiZSBjb25zaWRlcmVkIE1HTVQgZnJhbWUgd2hlbiB0aGUgYXNzb2NpYXRlZCBSc3ZkMkNwdUVuYWJsZQoqICAgICAgICBiaXQgZm9yIHRoZSBmcmFtZXMncyBEQSBpcyBhbHNvIHNldCB0byBhIG9uZS4KKgoqIElOUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIGlmIFJzdmQyQ3B1IGlzIHNldC4gR1RfRkFMU0UsIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRSc3ZkMkNwdQooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0JPT0wgICAgICAgIGVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgICBkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFJzdmQyQ3B1IENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoISgoSVNfSU5fREVWX0dST1VQKGRldixERVZfRU5IQU5DRURfTVVMVElDQVNUKSkgfHwKICAgICAgICAoSVNfSU5fREVWX0dST1VQKGRldixERVZfTVVMVElDQVNUKSkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfTVVMVElDQVNUKSkKICAgIHsKICAgICAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOR0VNRU5UX0NPTlRST0wsMywxLCBkYXRhKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsIDMsIDEsIGRhdGEpOwogICAgfQoKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFJzdmQyQ3B1CioKKiBERVNDUklQVElPTjoKKiAgICAgICAgV2hlbiB0aGUgUnN2ZDJDcHUgaXMgc2V0IHRvIGEgb25lKEdUX1RSVUUpLCBmcmFtZXMgd2l0aCBhIERlc3RpbmF0aW9uCiogICAgICAgIEFkZHJlc3MgaW4gdGhlIHJhbmdlIDAxOjgwOkMyOjAwOjAwOjB4LCByZWdhcmRsZXNzIG9mIHRoZWlyIFZMQU4KKiAgICAgICAgbWVtYmVyc2hpcCwgd2lsbCBiZSBjb25zaWRlcmVkIE1HTVQgZnJhbWVzIGFuZCBzZW50IHRvIHRoZSBDUFUgUG9ydC4KKiAgICAgICAgSWYgZGV2aWNlIHN1cHBvcnRzIFJzdmQyQ3B1RW5hYmxlIChnc3lzU2V0UnN2ZDJDcHVFbmFibGUgZnVuY3Rpb24pLAoqICAgICAgICB0aGUgZnJhbWUgd2lsbCBiZSBjb25zaWRlcmVkIE1HTVQgZnJhbWUgd2hlbiB0aGUgYXNzb2NpYXRlZCBSc3ZkMkNwdUVuYWJsZQoqICAgICAgICBiaXQgZm9yIHRoZSBmcmFtZXMncyBEQSBpcyBhbHNvIHNldCB0byBhIG9uZS4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGVuIC0gR1RfVFJVRSBpZiBSc3ZkMkNwdSBpcyBzZXQuIEdUX0ZBTFNFLCBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSc3ZkMkNwdQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRSc3ZkMkNwdSBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCEoKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX0VOSEFOQ0VEX01VTFRJQ0FTVCkpIHx8CiAgICAgICAgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX01VTFRJQ0FTVCkpKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NVUxUSUNBU1QpKQogICAgewogICAgICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19NQU5HRU1FTlRfQ09OVFJPTCwzLDEsJmRhdGEpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOQUdFTUVOVCwzLDEsJmRhdGEpOwogICAgfQoKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0TUdNVFByaQoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFRoZXNlIGJpdHMgYXJlIHVzZWQgYXMgdGhlIFBSSVsyOjBdIGJpdHMgb24gUnN2ZDJDUFUgZnJhbWVzLgoqCiogSU5QVVRTOgoqICAgICAgICBwcmkgLSBQUklbMjowXSBiaXRzIChzaG91bGQgYmUgbGVzcyB0aGFuIDgpCioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX0JBRF9QQVJBTSAtIElmIHByaSBpcyBub3QgbGVzcyB0aGFuIDguCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0TUdNVFByaQooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX1UxNiAgICAgICAgcHJpCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0TUdNVFByaSBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRU5IQU5DRURfTVVMVElDQVNUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBpZiAocHJpID4gMHg3KQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfQkFEX1BBUkFNXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOQUdFTUVOVCwgMCwgMywgcHJpKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldE1HTVRQcmkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGVzZSBiaXRzIGFyZSB1c2VkIGFzIHRoZSBQUklbMjowXSBiaXRzIG9uIFJzdmQyQ1BVIGZyYW1lcy4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIHByaSAtIFBSSVsyOjBdIGJpdHMgKHNob3VsZCBiZSBsZXNzIHRoYW4gOCkKKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldE1HTVRQcmkKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX1UxNiAgICAgICpwcmkKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldE1HTVRQcmkgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0VOSEFOQ0VEX01VTFRJQ0FTVCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsMCwzLHByaSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0VXNlRG91YmxlVGFnRGF0YQoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFRoaXMgYml0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIERvdWJsZSBUYWcgZGF0YSB0aGF0IGlzIHJlbW92ZWQgZnJvbSBhCiogICAgICAgIERvdWJsZSBUYWcgZnJhbWUgaXMgdXNlZCBvciBpZ25vcmVkIHdoZW4gbWFraW5nIHN3aXRjaGluZyBkZWNpc2lvbnMgb24KKiAgICAgICAgdGhlIGZyYW1lLgoqCiogSU5QVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgdG8gdXNlIHJlbW92ZWQgdGFnIGRhdGEsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRVc2VEb3VibGVUYWdEYXRhCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfQk9PTCAgICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICAgIGRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0VXNlRG91YmxlVGFnRGF0YSBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTUFSVkVMTF9UQUdfTE9PUF9CTE9DSykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOQUdFTUVOVCwgMTUsIDEsIGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0VXNlRG91YmxlVGFnRGF0YQoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFRoaXMgYml0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIERvdWJsZSBUYWcgZGF0YSB0aGF0IGlzIHJlbW92ZWQgZnJvbSBhCiogICAgICAgIERvdWJsZSBUYWcgZnJhbWUgaXMgdXNlZCBvciBpZ25vcmVkIHdoZW4gbWFraW5nIHN3aXRjaGluZyBkZWNpc2lvbnMgb24KKiAgICAgICAgdGhlIGZyYW1lLgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIGlmIHJlbW92ZWQgdGFnIGRhdGEgaXMgdXNlZCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0VXNlRG91YmxlVGFnRGF0YQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRVc2VEb3VibGVUYWdEYXRhIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NQVJWRUxMX1RBR19MT09QX0JMT0NLKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOQUdFTUVOVCwxNSwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFByZXZlbnRMb29wcwoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFdoZW4gYSBNYXJ2ZWxsIFRhZyBwb3J0IHJlY2VpdmVzIGEgRm9yd2FyZCBNYXJ2ZWxsIFRhZyB3aG9zZSBTcmNfRGV2CiogICAgICAgIGZpZWxkIGVxdWFscyB0aGlzIGRldmljZSdzIERldmljZSBOdW1iZXIsIHRoZSBmb2xsb3dpbmcgYWN0aW9uIHdpbGwgYmUKKiAgICAgICAgdGFrZW4gZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIG9mIHRoaXMgYml0LgoqICAgICAgICBHVF9UUlVFICgxKSAtIFRoZSBmcmFtZSB3aWxsIGJlIGRpc2NhcmRlZC4KKiAgICAgICAgR1RfRkFMU0UoMCkgLSBUaGUgZnJhbWUgd2lsbCBiZSBwcmV2ZW50ZWQgZnJvbSBnb2luZyBvdXQgaXRzIG9yaWdpbmFsCiogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgcG9ydCBhcyBkZWZpbmVkIGJ5IHRoZSBmcmFtZSdzIFNyY19Qb3J0IGZpZWxkLgoqCiogSU5QVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgdG8gZGlzY2FyZCB0aGUgZnJhbWUgYXMgZGVzY3JpYmVkIGFib3ZlLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0UHJldmVudExvb3BzCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfQk9PTCAgICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICAgIGRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0UHJldmVudExvb3BzIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NQVJWRUxMX1RBR19MT09QX0JMT0NLKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCAxNCwgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRQcmV2ZW50TG9vcHMKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBXaGVuIGEgTWFydmVsbCBUYWcgcG9ydCByZWNlaXZlcyBhIEZvcndhcmQgTWFydmVsbCBUYWcgd2hvc2UgU3JjX0RldgoqICAgICAgICBmaWVsZCBlcXVhbHMgdGhpcyBkZXZpY2UncyBEZXZpY2UgTnVtYmVyLCB0aGUgZm9sbG93aW5nIGFjdGlvbiB3aWxsIGJlCiogICAgICAgIHRha2VuIGRlcGVuZGluZyB1cG9uIHRoZSB2YWx1ZSBvZiB0aGlzIGJpdC4KKiAgICAgICAgR1RfVFJVRSAoMSkgLSBUaGUgZnJhbWUgd2lsbCBiZSBkaXNjYXJkZWQuCiogICAgICAgIEdUX0ZBTFNFKDApIC0gVGhlIGZyYW1lIHdpbGwgYmUgcHJldmVudGVkIGZyb20gZ29pbmcgb3V0IGl0cyBvcmlnaW5hbAoqICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHBvcnQgYXMgZGVmaW5lZCBieSB0aGUgZnJhbWUncyBTcmNfUG9ydCBmaWVsZC4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGVuIC0gR1RfVFJVRSB0byBkaXNjYXJkIHRoZSBmcmFtZSBhcyBkZXNjcmliZWQgYWJvdmUsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFByZXZlbnRMb29wcwooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRQcmV2ZW50TG9vcHMgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX01BUlZFTExfVEFHX0xPT1BfQkxPQ0spKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULDE0LDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRGbG93Q29udHJvbE1lc3NhZ2UKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBXaGVuIHRoaXMgYml0IGlzIHNldCB0byBvbmUsIE1hcnZlbGwgVGFnIEZsb3cgQ29udHJvbCBtZXNzYWdlcyB3aWxsIGJlCiogICAgICAgIGdlbmVyYXRlZCB3aGVuIGFuIG91dHB1dCBxdWV1ZSBiZWNvbWVzIGNvbmdlc3RlZCBhbmQgcmVjZWl2ZWQgTWFydmVsbCBUYWcKKiAgICAgICAgRmxvdyBDb250cm9sIG1lc3NhZ2VzIHdpbGwgcGF1c2UgTUFDcyBpbnNpZGUgdGhpcyBkZXZpY2UuIFdoZW4gdGhpcyBiaXQKKiAgICAgICAgaXMgY2xlYXJlZCB0byBhIHplcm8gTWFydmVsbCBUYWcgRmxvdyBDb250cm9sIG1lc3NhZ2VzIHdpbGwgbm90IGJlCiogICAgICAgIGdlbmVyYXRlZCBhbmQgYW55IHJlY2VpdmVkIHdpbGwgYmUgaWdub3JlZCBhdCB0aGUgdGFyZ2V0IE1BQy4KKgoqIElOUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIHRvIHVzZSBNYXJ2ZWxsIFRhZyBGbG93IENvbnRyb2wgbWVzc2FnZSwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEZsb3dDb250cm9sTWVzc2FnZQooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0JPT0wgICAgICAgIGVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgICBkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEZsb3dDb250cm9sTWVzc2FnZSBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTUFSVkVMTF9UQUdfRkxPV19DVFJMKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCAxMywgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRGbG93Q29udHJvbE1lc3NhZ2UKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBXaGVuIHRoaXMgYml0IGlzIHNldCB0byBvbmUsIE1hcnZlbGwgVGFnIEZsb3cgQ29udHJvbCBtZXNzYWdlcyB3aWxsIGJlCiogICAgICAgIGdlbmVyYXRlZCB3aGVuIGFuIG91dHB1dCBxdWV1ZSBiZWNvbWVzIGNvbmdlc3RlZCBhbmQgcmVjZWl2ZWQgTWFydmVsbCBUYWcKKiAgICAgICAgRmxvdyBDb250cm9sIG1lc3NhZ2VzIHdpbGwgcGF1c2UgTUFDcyBpbnNpZGUgdGhpcyBkZXZpY2UuIFdoZW4gdGhpcyBiaXQKKiAgICAgICAgaXMgY2xlYXJlZCB0byBhIHplcm8gTWFydmVsbCBUYWcgRmxvdyBDb250cm9sIG1lc3NhZ2VzIHdpbGwgbm90IGJlCiogICAgICAgIGdlbmVyYXRlZCBhbmQgYW55IHJlY2VpdmVkIHdpbGwgYmUgaWdub3JlZCBhdCB0aGUgdGFyZ2V0IE1BQy4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGVuIC0gR1RfVFJVRSB0byB1c2UgTWFydmVsbCBUYWcgRmxvdyBDb250cm9sIG1lc3NhZ2UsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldEZsb3dDb250cm9sTWVzc2FnZQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRGbG93Q29udHJvbE1lc3NhZ2UgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX01BUlZFTExfVEFHX0ZMT1dfQ1RSTCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsMTMsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEZvcmNlRmxvd0NvbnRyb2xQcmkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBXaGVuIHRoaXMgYml0IGlzIHNldCB0byBhIG9uZSB0aGUgUFJJWzI6MF0gYml0cyBvZiBnZW5lcmF0ZWQgTWFydmVsbCBUYWcKKiAgICAgICAgRmxvdyBDb250cm9sIGZyYW1lcyB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgb2YgdGhlIEZDIFByaSBiaXRzIChzZXQgYnkKKiAgICAgICAgZ3N5c1NldEZDUHJpIGZ1bmN0aW9uIGNhbGwpLiBXaGVuIHRoaXMgYml0IGlzIGNsZWFyZWQgdG8gYSB6ZXJvIGdlbmVyYXRlZAoqICAgICAgICBNYXJ2ZWxsIFRhZyBGbG93IENvbnRyb2wgZnJhbWVzIHdpbGwgcmV0YWluIHRoZSBQUklbMjowXSBiaXRzIGZyb20gdGhlCiogICAgICAgIGZyYW1lcyB0aGF0IGNhdXNlZCB0aGUgY29uZ2VzdGlvbi4gVGhpcyBiaXQgd2lsbCBoYXZlIG5vIGVmZmVjdCBpZiB0aGUKKiAgICAgICAgRmxvd0NvbnRyb2xNZXNzYWdlIGJpdChnc3lzU2V0Rmxvd0NvbnRyb2xNZXNzYWdlIGZ1bmN0aW9uIGNhbGwpIGlzCiogICAgICAgIGNsZWFyZWQgdG8gYSB6ZXJvLgoqCiogSU5QVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgdG8gdXNlIGRlZmluZWQgUFJJIGJpdHMsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRGb3JjZUZsb3dDb250cm9sUHJpCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfQk9PTCAgICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICAgIGRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0Rm9yY2VGbG93Q29udHJvbFByaSBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTUFSVkVMTF9UQUdfRkxPV19DVFJMKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCA3LCAxLCBkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldEZvcmNlRmxvd0NvbnRyb2xQcmkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBXaGVuIHRoaXMgYml0IGlzIHNldCB0byBhIG9uZSB0aGUgUFJJWzI6MF0gYml0cyBvZiBnZW5lcmF0ZWQgTWFydmVsbCBUYWcKKiAgICAgICAgRmxvdyBDb250cm9sIGZyYW1lcyB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgb2YgdGhlIEZDIFByaSBiaXRzIChzZXQgYnkKKiAgICAgICAgZ3N5c1NldEZDUHJpIGZ1bmN0aW9uIGNhbGwpLiBXaGVuIHRoaXMgYml0IGlzIGNsZWFyZWQgdG8gYSB6ZXJvIGdlbmVyYXRlZAoqICAgICAgICBNYXJ2ZWxsIFRhZyBGbG93IENvbnRyb2wgZnJhbWVzIHdpbGwgcmV0YWluIHRoZSBQUklbMjowXSBiaXRzIGZyb20gdGhlCiogICAgICAgIGZyYW1lcyB0aGF0IGNhdXNlZCB0aGUgY29uZ2VzdGlvbi4gVGhpcyBiaXQgd2lsbCBoYXZlIG5vIGVmZmVjdCBpZiB0aGUKKiAgICAgICAgRmxvd0NvbnRyb2xNZXNzYWdlIGJpdChnc3lzU2V0Rmxvd0NvbnRyb2xNZXNzYWdlIGZ1bmN0aW9uIGNhbGwpIGlzCiogICAgICAgIGNsZWFyZWQgdG8gYSB6ZXJvLgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIHRvIHVzZSBkZWZpbmVkIFBSSSBiaXRzLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRGb3JjZUZsb3dDb250cm9sUHJpCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9CT09MICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldEZvcmNlRmxvd0NvbnRyb2xQcmkgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX01BUlZFTExfVEFHX0ZMT1dfQ1RSTCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsNywxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0RkNQcmkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGVzZSBiaXRzIGFyZSB1c2VkIGFzIHRoZSBQUklbMjowXSBiaXRzIG9uIGdlbmVyYXRlZCBNYXJ2ZWxsIFRhZyBGbG93CiogICAgICAgIENvbnRyb2wgZnJhbWVzIGlmIHRoZSBGb3JjZUZsb3dDb250cm9sUHJpIGJpdChnc3lzU2V0Rm9yY2VGbG93Q29udHJvbFByaSkKKiAgICAgICAgaXMgc2V0IHRvIGEgb25lLgoqCiogSU5QVVRTOgoqICAgICAgICBwcmkgLSBQUklbMjowXSBiaXRzIChzaG91bGQgYmUgbGVzcyB0aGFuIDgpCioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX0JBRF9QQVJBTSAtIElmIHByaSBpcyBub3QgbGVzcyB0aGFuIDguCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0RkNQcmkKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VMTYgICAgICAgIHByaQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEZDUHJpIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NQVJWRUxMX1RBR19GTE9XX0NUUkwpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIGlmIChwcmkgPiAweDcpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9CQURfUEFSQU1cbiIpKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCA0LCAzLCBwcmkpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0RkNQcmkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGVzZSBiaXRzIGFyZSB1c2VkIGFzIHRoZSBQUklbMjowXSBiaXRzIG9uIGdlbmVyYXRlZCBNYXJ2ZWxsIFRhZyBGbG93CiogICAgICAgIENvbnRyb2wgZnJhbWVzIGlmIHRoZSBGb3JjZUZsb3dDb250cm9sUHJpIGJpdChnc3lzU2V0Rm9yY2VGbG93Q29udHJvbFByaSkKKiAgICAgICAgaXMgc2V0IHRvIGEgb25lLgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgcHJpIC0gUFJJWzI6MF0gYml0cyAoc2hvdWxkIGJlIGxlc3MgdGhhbiA4KQoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0RkNQcmkKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX1UxNiAgICAgICpwcmkKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldEZDUHJpIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NQVJWRUxMX1RBR19GTE9XX0NUUkwpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULDQsMyxwcmkpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEZsb3dDdHJsRGVsYXkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgRmxvdyBjb250cm9sIGRlbGF5IHRpbWUgZm9yIDEwTWJwcywgMTAwTWJwcywgYW5kCiogICAgICAgIDEwMDBNYnBzLgoqCiogSU5QVVRTOgoqICAgICAgICBzcCAtIFBPUlRfU1BFRURfMTBfTUJQUywgUE9SVF9TUEVFRF8xMDBfTUJQUywgb3IgUE9SVF9TUEVFRF8xMDAwX01CUFMKKiAgICAgICAgZGVsYXlUaW1lIC0gZGVsYXkgdGltZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfQkFEX1BBUkFNIC0gaWYgc3AgaXMgbm90IHZhbGlkIG9yIGRlbGF5VGltZSBpcyA+IDB4MUZGRi4KKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgQWN0dWFsIGRlbGF5IHRpbWUgd2lsbCBiZSBkZWxheVRpbWUgeCAyLjA0OHVTIChvciB4IDguMTkydVMpIGRlcGVuZGluZyBvbgoqICAgIHN3aXRjaCBkZXZpY2UuIFBsZWFzZSByZWZlciB0byB0aGUgZGV2aWNlIGRhdGFzaGVldCBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24uCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRGbG93Q3RybERlbGF5CigKICAgIElOIEdUX1FEX0RFViAgICAgICAgICAgICpkZXYsCiAgICBJTiBHVF9QT1JUX1NQRUVEX01PREUgICAgc3AsCiAgICBJTiBHVF9VMzIgICAgICAgICAgICAgICAgZGVsYXlUaW1lCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgICBkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEZsb3dDdHJsRGVsYXkgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRkxPV19DVFJMX0RFTEFZKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBndFNlbVRha2UoZGV2LGRldi0+dGJsUmVnc1NlbSxPU19XQUlUX0ZPUkVWRVIpOwoKICAgIC8qIENoZWNrIGlmIHRoZSByZWdpc3RlciBjYW4gYmUgYWNjZXNzZWQuICovCiNpZmRlZiBHVF9STUdNVF9BQ0NFU1MKICAgIHsKICAgICAgSFdfREVWX1JFR19BQ0NFU1MgcmVnQWNjZXNzOwoKICAgICAgcmVnQWNjZXNzLmVudHJpZXMgPSAxOwoKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmNtZCA9IEhXX1JFR19XQUlUX1RJTExfMDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmFkZHIgPSBDQUxDX1NNSV9ERVZfQUREUihkZXYsIDAsIEdMT0JBTDJfUkVHX0FDQ0VTUyk7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5yZWcgPSBRRF9SRUdfRkxPV0NUUkxfREVMQVk7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5kYXRhID0gMTU7CiAgICAgIHJldFZhbCA9IGh3QWNjZXNzTXVsdGlSZWdzKGRldiwgJnJlZ0FjY2Vzcyk7CiAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgewogICAgICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICB9CiAgICB9CiNlbHNlCiAgICBkbwogICAgewogICAgICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19GTE9XQ1RSTF9ERUxBWSwmZGF0YSk7CiAgICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICAgIHsKICAgICAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgICB9CiAgICB9IHdoaWxlIChkYXRhICYgMHg4MDAwKTsKI2VuZGlmCgogICAgc3dpdGNoKHNwKQogICAgewogICAgICAgIGNhc2UgUE9SVF9TUEVFRF8xMF9NQlBTOgogICAgICAgICAgICAgICAgZGF0YSA9IDA7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFBPUlRfU1BFRURfMTAwX01CUFM6CiAgICAgICAgICAgICAgICBkYXRhID0gMSA8PCAxMzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUE9SVF9TUEVFRF8xMDAwX01CUFM6CiAgICAgICAgICAgICAgICBkYXRhID0gMiA8PCAxMzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSAoc3ApXG4iKSk7CiAgICAgICAgICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKICAgIGlmIChkZWxheVRpbWUgPiAweDFGRkYpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9CQURfUEFSQU0gKGRlbGF5VGltZSlcbiIpKTsKICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICBkYXRhIHw9IChHVF9VMTYpKDB4ODAwMCB8IGRlbGF5VGltZSk7CgogICAgLyogU2V0IHJlbGF0ZWQgcmVnaXN0ZXIgKi8KICAgIHJldFZhbCA9IGh3V3JpdGVHbG9iYWwyUmVnKGRldixRRF9SRUdfRkxPV0NUUkxfREVMQVksZGF0YSk7CgogICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwoKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldEZsb3dDdHJsRGVsYXkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBGbG93IGNvbnRyb2wgZGVsYXkgdGltZSBmb3IgMTBNYnBzLCAxMDBNYnBzLCBhbmQKKiAgICAgICAgMTAwME1icHMuCioKKiBJTlBVVFM6CiogICAgICAgIHNwIC0gUE9SVF9TUEVFRF8xMF9NQlBTLCBQT1JUX1NQRUVEXzEwMF9NQlBTLCBvciBQT1JUX1NQRUVEXzEwMDBfTUJQUwoqCiogT1VUUFVUUzoKKiAgICAgICAgZGVsYXlUaW1lIC0gZGVsYXkgdGltZQoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX0JBRF9QQVJBTSAtIGlmIHNwIGlzIG5vdCB2YWxpZCBvciBkZWxheVRpbWUgaXMgPiAweDFGRkYuCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgIEFjdHVhbCBkZWxheSB0aW1lIHdpbGwgYmUgZGVsYXlUaW1lIHggMi4wNDh1UyAob3IgeCA4LjE5MnVTKSBkZXBlbmRpbmcgb24KKiAgICBzd2l0Y2ggZGV2aWNlLiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZSBkYXRhc2hlZXQgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0Rmxvd0N0cmxEZWxheQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBJTiAgR1RfUE9SVF9TUEVFRF9NT0RFICAgIHNwLAogICAgT1VUIEdUX1UzMiAgICAgICAgKmRlbGF5VGltZQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRGbG93Q3RybERlbGF5IENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0ZMT1dfQ1RSTF9ERUxBWSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgZ3RTZW1UYWtlKGRldixkZXYtPnRibFJlZ3NTZW0sT1NfV0FJVF9GT1JFVkVSKTsKCiAgICAvKiBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgY2FuIGJlIGFjY2Vzc2VkLiAqLwojaWZkZWYgR1RfUk1HTVRfQUNDRVNTCiAgICB7CiAgICAgIEhXX0RFVl9SRUdfQUNDRVNTIHJlZ0FjY2VzczsKCiAgICAgIHJlZ0FjY2Vzcy5lbnRyaWVzID0gMTsKCiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5jbWQgPSBIV19SRUdfV0FJVF9USUxMXzA7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5hZGRyID0gQ0FMQ19TTUlfREVWX0FERFIoZGV2LCAwLCBHTE9CQUwyX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0ucmVnID0gUURfUkVHX0ZMT1dDVFJMX0RFTEFZOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uZGF0YSA9IDE1OwogICAgICByZXRWYWwgPSBod0FjY2Vzc011bHRpUmVncyhkZXYsICZyZWdBY2Nlc3MpOwogICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgIHsKICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgfQogICAgfQojZWxzZQogICAgZG8KICAgIHsKICAgICAgICByZXRWYWwgPSBod1JlYWRHbG9iYWwyUmVnKGRldixRRF9SRUdfRkxPV0NUUkxfREVMQVksJmRhdGEpOwogICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgICB7CiAgICAgICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgfQogICAgfSB3aGlsZSAoZGF0YSAmIDB4ODAwMCk7CiNlbmRpZgoKICAgIHN3aXRjaChzcCkKICAgIHsKICAgICAgICBjYXNlIFBPUlRfU1BFRURfMTBfTUJQUzoKICAgICAgICAgICAgICAgIGRhdGEgPSAwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBQT1JUX1NQRUVEXzEwMF9NQlBTOgogICAgICAgICAgICAgICAgZGF0YSA9IDEgPDwgMTM7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFBPUlRfU1BFRURfMTAwMF9NQlBTOgogICAgICAgICAgICAgICAgZGF0YSA9IDIgPDwgMTM7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgREJHX0lORk8oKCJHVF9CQURfUEFSQU0gKHNwKVxuIikpOwogICAgICAgICAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICByZXRWYWwgPSBod1dyaXRlR2xvYmFsMlJlZyhkZXYsUURfUkVHX0ZMT1dDVFJMX0RFTEFZLGRhdGEpOwogICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19GTE9XQ1RSTF9ERUxBWSwmZGF0YSk7CgogICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwoKICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgICpkZWxheVRpbWUgPSAoR1RfVTMyKShkYXRhICYgMHgxRkZGKTsKCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0RGV2Um91dGluZ1RhYmxlCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIERldmljZSB0byBQb3J0IG1hcHBpbmcgKHdoaWNoIGRldmljZSBpcyBjb25uZWN0ZWQgdG8KKiAgICAgICAgd2hpY2ggcG9ydCBvZiB0aGlzIGRldmljZSkuCioKKiBJTlBVVFM6CiogICAgICAgIGRldk51bSAtIHRhcmdldCBkZXZpY2UgbnVtYmVyLgoqICAgICAgICBwb3J0TnVtIC0gdGhlIGxvZ2ljYWwgcG9ydCBudW1iZXIuCioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX0JBRF9QQVJBTSAtIGlmIHNwIGlzIG5vdCB2YWxpZCBvciBkZWxheVRpbWUgaXMgPiAweDFGRkYuCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0RGV2Um91dGluZ1RhYmxlCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfVTMyICAgICAgICAgIGRldk51bSwKICAgIElOIEdUX0xQT1JUICAgICBwb3J0CikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VOCAgICAgICAgICAgaHdQb3J0OyAgICAgICAgIC8qIHRoZSBwaHlzaWNhbCBwb3J0IG51bWJlciAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldERldlJvdXRpbmdUYWJsZSBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9TVEFDS0lORykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgZ3RTZW1UYWtlKGRldixkZXYtPnRibFJlZ3NTZW0sT1NfV0FJVF9GT1JFVkVSKTsKCiAgICBpZihkZXZOdW0gPiAweDFGKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfQkFEX1BBUkFNIChkZXZOdW0pXG4iKSk7CiAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgLyogQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGNhbiBiZSBhY2Nlc3NlZC4gKi8KI2lmZGVmIEdUX1JNR01UX0FDQ0VTUwogICAgewogICAgICBIV19ERVZfUkVHX0FDQ0VTUyByZWdBY2Nlc3M7CgogICAgICByZWdBY2Nlc3MuZW50cmllcyA9IDI7CgogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uY21kID0gSFdfUkVHX1dBSVRfVElMTF8wOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMMl9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLnJlZyA9IFFEX1JFR19ST1VUSU5HX1RCTDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmRhdGEgPSAxNTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmNtZCA9IEhXX1JFR19XUklURTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmFkZHIgPSBDQUxDX1NNSV9ERVZfQUREUihkZXYsIDAsIEdMT0JBTDJfUkVHX0FDQ0VTUyk7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsxXS5yZWcgPSBRRF9SRUdfUk9VVElOR19UQkw7CiAgICAgIC8qIHRyYW5zbGF0ZSBMUE9SVCB0byBoYXJkd2FyZSBwb3J0ICovCiAgICAgIGlmKHBvcnQgPj0gZGV2LT5udW1PZlBvcnRzKQogICAgICB7CiAgICAgICAgaHdQb3J0ID0gMHhGOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGh3UG9ydCA9IEdUX0xQT1JUXzJfUE9SVChwb3J0KTsKICAgICAgfQogICAgICBkYXRhID0gKEdUX1UxNikoMHg4MDAwIHwgKGRldk51bSA8PCA4KSB8IGh3UG9ydCk7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsxXS5kYXRhID0gZGF0YTsKICAgICAgcmV0VmFsID0gaHdBY2Nlc3NNdWx0aVJlZ3MoZGV2LCAmcmVnQWNjZXNzKTsKICAgIH0KI2Vsc2UKICAgIGRvCiAgICB7CiAgICAgICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsUURfUkVHX1JPVVRJTkdfVEJMLCZkYXRhKTsKICAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgICAgewogICAgICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICAgIH0KICAgIH0gd2hpbGUgKGRhdGEgJiAweDgwMDApOwoKICAgIC8qIHRyYW5zbGF0ZSBMUE9SVCB0byBoYXJkd2FyZSBwb3J0ICovCiAgICBpZihwb3J0ID49IGRldi0+bnVtT2ZQb3J0cykKICAgIHsKICAgICAgICBod1BvcnQgPSAweEY7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaHdQb3J0ID0gR1RfTFBPUlRfMl9QT1JUKHBvcnQpOwogICAgfQoKICAgIGRhdGEgPSAoR1RfVTE2KSgweDgwMDAgfCAoZGV2TnVtIDw8IDgpIHwgaHdQb3J0KTsKCiAgICAvKiBTZXQgcmVsYXRlZCByZWdpc3RlciAqLwogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19ST1VUSU5HX1RCTCxkYXRhKTsKI2VuZGlmCgogICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwoKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldERldlJvdXRpbmdUYWJsZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBEZXZpY2UgdG8gUG9ydCBtYXBwaW5nICh3aGljaCBkZXZpY2UgaXMgY29ubmVjdGVkIHRvCiogICAgICAgIHdoaWNoIHBvcnQgb2YgdGhpcyBkZXZpY2UpLgoqCiogSU5QVVRTOgoqICAgICAgICBkZXZOdW0gLSB0YXJnZXQgZGV2aWNlIG51bWJlci4KKgoqIE9VVFBVVFM6CiogICAgICAgIHBvcnROdW0gLSB0aGUgbG9naWNhbCBwb3J0IG51bWJlci4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9CQURfUEFSQU0gLSBpZiBzcCBpcyBub3QgdmFsaWQgb3IgZGVsYXlUaW1lIGlzID4gMHgxRkZGLgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldERldlJvdXRpbmdUYWJsZQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBJTiAgR1RfVTMyICAgICAgICAgZGV2TnVtLAogICAgT1VUIEdUX0xQT1JUICAgICAqcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0RGV2Um91dGluZ1RhYmxlIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NUQUNLSU5HKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBndFNlbVRha2UoZGV2LGRldi0+dGJsUmVnc1NlbSxPU19XQUlUX0ZPUkVWRVIpOwoKICAgIGlmKGRldk51bSA+IDB4MUYpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9CQURfUEFSQU0gKGRldk51bSlcbiIpKTsKICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgY2FuIGJlIGFjY2Vzc2VkLiAqLwojaWZkZWYgR1RfUk1HTVRfQUNDRVNTCiAgICB7CiAgICAgIEhXX0RFVl9SRUdfQUNDRVNTIHJlZ0FjY2VzczsKCiAgICAgIHJlZ0FjY2Vzcy5lbnRyaWVzID0gMzsKCiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5jbWQgPSBIV19SRUdfV0FJVF9USUxMXzA7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5hZGRyID0gQ0FMQ19TTUlfREVWX0FERFIoZGV2LCAwLCBHTE9CQUwyX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0ucmVnID0gUURfUkVHX1JPVVRJTkdfVEJMOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uZGF0YSA9IDE1OwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0uY21kID0gSFdfUkVHX1dSSVRFOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMMl9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLnJlZyA9IFFEX1JFR19ST1VUSU5HX1RCTDsKICAgICAgZGF0YSA9IChHVF9VMTYpKGRldk51bSA8PCA4KTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmRhdGEgPSBkYXRhOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMl0uY21kID0gSFdfUkVHX1JFQUQ7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5hZGRyID0gQ0FMQ19TTUlfREVWX0FERFIoZGV2LCAwLCBHTE9CQUwyX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMl0ucmVnID0gUURfUkVHX1JPVVRJTkdfVEJMOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMl0uZGF0YSA9IDA7CiAgICAgIHJldFZhbCA9IGh3QWNjZXNzTXVsdGlSZWdzKGRldiwgJnJlZ0FjY2Vzcyk7CiAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICB9CiAgICAgIGRhdGEgPSBxZExvbmcyU2hvcnQocmVnQWNjZXNzLnJ3X3JlZ19saXN0WzJdLmRhdGEpOwogICAgfQojZWxzZQogICAgZG8KICAgIHsKICAgICAgICByZXRWYWwgPSBod1JlYWRHbG9iYWwyUmVnKGRldixRRF9SRUdfUk9VVElOR19UQkwsJmRhdGEpOwogICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgICB7CiAgICAgICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgfQogICAgfSB3aGlsZSAoZGF0YSAmIDB4ODAwMCk7CgogICAgZGF0YSA9IChHVF9VMTYpKGRldk51bSA8PCA4KTsKCiAgICByZXRWYWwgPSBod1dyaXRlR2xvYmFsMlJlZyhkZXYsUURfUkVHX1JPVVRJTkdfVEJMLGRhdGEpOwogICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19ST1VUSU5HX1RCTCwmZGF0YSk7CgojZW5kaWYKICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKCiAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICAqcG9ydCA9IEdUX1BPUlRfMl9MUE9SVCgoR1RfVTgpKGRhdGEgJiAweEYpKTsKICAgIGlmKCpwb3J0ID09IEdUX0lOVkFMSURfUE9SVCkKICAgIHsKICAgICAgICAqcG9ydCA9IDB4RjsKICAgIH0KICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFRydW5rTWFza1RhYmxlCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIFRydW5rIE1hc2sgZm9yIHRoZSBnaXZlbiBUcnVuayBOdW1iZXIuCioKKiBJTlBVVFM6CiogICAgICAgIHRydW5rTnVtIC0gVHJ1bmsgTnVtYmVyLgoqICAgICAgICB0cnVua01hc2sgLSBUcnVuayBtYXNrIGJpdHMuIEJpdCAwIGNvbnRyb2xzIHRydW5rIG1hc2tpbmcgZm9yIHBvcnQgMCwKKiAgICAgICAgICAgICAgICAgICAgYml0IDEgZm9yIHBvcnQgMSAsIGV0Yy4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfQkFEX1BBUkFNIC0gaWYgdHJ1bmtOdW0gPiAweDcgZm9yIDg4RTYwOTUgYW5kIDg4RTYxODMgZmFtaWx5IGFuZAoqICAgICAgICAgICAgICAgICAgICAgICBpZiB0cnVua051bSA+IDB4MyBmb3IgODhFNjA2NSBmYW1pbHkuCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0VHJ1bmtNYXNrVGFibGUKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VMzIgICAgICAgICAgdHJ1bmtOdW0sCiAgICBJTiBHVF9VMzIgICAgICAgIHRydW5rTWFzawopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBHVF9VMzIgICAgICAgICAgICBtYXNrOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFRydW5rTWFza1RhYmxlIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoISgoSVNfSU5fREVWX0dST1VQKGRldixERVZfVFJVTkspKSB8fAogICAgICAgIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9SRURVQ0VEX1RSVU5LKSkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIGd0U2VtVGFrZShkZXYsZGV2LT50YmxSZWdzU2VtLE9TX1dBSVRfRk9SRVZFUik7CgogICAgLyogQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGNhbiBiZSBhY2Nlc3NlZC4gKi8KI2lmZGVmIEdUX1JNR01UX0FDQ0VTUwogICAgewogICAgICBIV19ERVZfUkVHX0FDQ0VTUyByZWdBY2Nlc3M7CgogICAgICByZWdBY2Nlc3MuZW50cmllcyA9IDI7CgogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uY21kID0gSFdfUkVHX1dBSVRfVElMTF8wOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMMl9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLnJlZyA9IFFEX1JFR19UUlVOS19NQVNLX1RCTDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmRhdGEgPSAxNTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmNtZCA9IEhXX1JFR19SRUFEOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMMl9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLnJlZyA9IFFEX1JFR19UUlVOS19NQVNLX1RCTDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmRhdGEgPSAwOwogICAgICByZXRWYWwgPSBod0FjY2Vzc011bHRpUmVncyhkZXYsICZyZWdBY2Nlc3MpOwogICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgIHsKICAgICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgfQogICAgICBkYXRhID0gcWRMb25nMlNob3J0KHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsxXS5kYXRhKTsKICAgIH0KI2Vsc2UKICAgIGRvCiAgICB7CiAgICAgICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsUURfUkVHX1RSVU5LX01BU0tfVEJMLCZkYXRhKTsKICAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgICAgewogICAgICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICAgIH0KICAgIH0gd2hpbGUgKGRhdGEgJiAweDgwMDApOwojZW5kaWYKCiAgICBkYXRhICY9IDB4MDgwMDsKCiAgICBpZih0cnVua051bSA+IDB4NykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSAodHJ1bmtOdW0pXG4iKSk7CiAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgaWYoKHRydW5rTnVtID4gMHgzKSAmJiBJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9SRURVQ0VEX1RSVU5LKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSAodHJ1bmtOdW0pXG4iKSk7CiAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgbWFzayA9ICgxIDw8IGRldi0+bnVtT2ZQb3J0cykgLSAxOwoKICAgIGlmKHRydW5rTWFzayA+IG1hc2spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9CQURfUEFSQU0gKHRydW5rTWFzaylcbiIpKTsKICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICBtYXNrID0gR1RfTFBPUlRWRUNfMl9QT1JUVkVDKHRydW5rTWFzayk7CgogICAgZGF0YSA9IChHVF9VMTYpKDB4ODAwMCB8IGRhdGEgfCAodHJ1bmtOdW0gPDwgMTIpIHwgbWFzayk7CgogICAgLyogU2V0IHJlbGF0ZWQgcmVnaXN0ZXIgKi8KICAgIHJldFZhbCA9IGh3V3JpdGVHbG9iYWwyUmVnKGRldixRRF9SRUdfVFJVTktfTUFTS19UQkwsZGF0YSk7CgogICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwoKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFRydW5rTWFza1RhYmxlCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIFRydW5rIE1hc2sgZm9yIHRoZSBnaXZlbiBUcnVuayBOdW1iZXIuCioKKiBJTlBVVFM6CiogICAgICAgIHRydW5rTnVtIC0gVHJ1bmsgTnVtYmVyLgoqCiogT1VUUFVUUzoKKiAgICAgICAgdHJ1bmtNYXNrIC0gVHJ1bmsgbWFzayBiaXRzLiBCaXQgMCBjb250cm9scyB0cnVuayBtYXNraW5nIGZvciBwb3J0IDAsCiogICAgICAgICAgICAgICAgICAgIGJpdCAxIGZvciBwb3J0IDEgLCBldGMuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfQkFEX1BBUkFNIC0gaWYgdHJ1bmtOdW0gPiAweDcgZm9yIDg4RTYwOTUgYW5kIDg4RTYxODMgZmFtaWx5IGFuZAoqICAgICAgICAgICAgICAgICAgICAgICBpZiB0cnVua051bSA+IDB4MyBmb3IgODhFNjA2NSBmYW1pbHkuCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0VHJ1bmtNYXNrVGFibGUKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gIEdUX1UzMiAgICAgICAgIHRydW5rTnVtLAogICAgT1VUIEdUX1UzMiAgICAgICAgKnRydW5rTWFzawopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBHVF9VMzIgICAgICAgICAgICBtYXNrOwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFRydW5rTWFza1RhYmxlIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoISgoSVNfSU5fREVWX0dST1VQKGRldixERVZfVFJVTkspKSB8fAogICAgICAgIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9SRURVQ0VEX1RSVU5LKSkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIGd0U2VtVGFrZShkZXYsZGV2LT50YmxSZWdzU2VtLE9TX1dBSVRfRk9SRVZFUik7CgogICAgLyogQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGNhbiBiZSBhY2Nlc3NlZC4gKi8KI2lmZGVmIEdUX1JNR01UX0FDQ0VTUwogICAgewogICAgICBIV19ERVZfUkVHX0FDQ0VTUyByZWdBY2Nlc3M7CgogICAgICByZWdBY2Nlc3MuZW50cmllcyA9IDI7CgogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uY21kID0gSFdfUkVHX1dBSVRfVElMTF8wOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMMl9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLnJlZyA9IFFEX1JFR19UUlVOS19NQVNLX1RCTDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmRhdGEgPSAxNTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmNtZCA9IEhXX1JFR19SRUFEOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMMl9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLnJlZyA9IFFEX1JFR19UUlVOS19NQVNLX1RCTDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmRhdGEgPSAwOwogICAgICByZXRWYWwgPSBod0FjY2Vzc011bHRpUmVncyhkZXYsICZyZWdBY2Nlc3MpOwogICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgIHsKICAgICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgfQogICAgfQojZWxzZQogICAgZG8KICAgIHsKICAgICAgICByZXRWYWwgPSBod1JlYWRHbG9iYWwyUmVnKGRldixRRF9SRUdfVFJVTktfTUFTS19UQkwsJmRhdGEpOwogICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgICB7CiAgICAgICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgfQogICAgfSB3aGlsZSAoZGF0YSAmIDB4ODAwMCk7CiNlbmRpZgoKICAgIGRhdGEgJj0gMHgwODAwOwoKICAgIGlmKHRydW5rTnVtID4gMHg3KQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfQkFEX1BBUkFNICh0cnVua0lkKVxuIikpOwogICAgICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKICAgIGlmKCh0cnVua051bSA+IDB4MykgJiYgSVNfSU5fREVWX0dST1VQKGRldixERVZfUkVEVUNFRF9UUlVOSykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9CQURfUEFSQU0gKHRydW5rTnVtKVxuIikpOwogICAgICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKICAgIGRhdGEgPSAoR1RfVTE2KShkYXRhIHwgKHRydW5rTnVtIDw8IDEyKSk7CgogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19UUlVOS19NQVNLX1RCTCxkYXRhKTsKICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICByZXRWYWwgPSBod1JlYWRHbG9iYWwyUmVnKGRldixRRF9SRUdfVFJVTktfTUFTS19UQkwsJmRhdGEpOwoKICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKCiAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBtYXNrID0gKDEgPDwgZGV2LT5tYXhQb3J0cykgLSAxOwoKICAgICp0cnVua01hc2sgPSBHVF9QT1JUVkVDXzJfTFBPUlRWRUMoZGF0YSAmIG1hc2spOwoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEhhc2hUcnVuawoqCiogREVTQ1JJUFRJT046CiogICAgICAgIEhhc2ggREEgJiBTQSBmb3IgVHJ1bmtNYXNrIHNlbGVjdGlvbi4gVHJ1bmsgbG9hZCBiYWxhbmNpbmcgaXMgYWNjb21wbGlzaGVkCiogICAgICAgIGJ5IHVzaW5nIHRoZSBmcmFtZSdzIERBIGFuZCBTQSBmaWVsZHMgdG8gYWNjZXNzIG9uZSBvZiBlaWdodCBUcnVuayBNYXNrcy4KKiAgICAgICAgV2hlbiB0aGlzIGJpdCBpcyBzZXQgdG8gYSBvbmUgdGhlIGhhc2hlZCBjb21wdXRlZCBmb3IgYWRkcmVzcyB0YWJsZQoqICAgICAgICBsb29rdXBzIGlzIHVzZWQgZm9yIHRoZSBUcnVua01hc2sgc2VsZWN0aW9uLiBXaGVuIHRoaXMgYml0IGlzIGNsZWFyZWQgdG8KKiAgICAgICAgYSB6ZXJvIHRoZSBsb3dlciAzIGJpdHMgb2YgdGhlIGZyYW1lJ3MgREEgYW5kIFNBIGFyZSBYT1InZWQgdG9nZXRoZXIgdG8KKiAgICAgICAgc2VsZWN0IHRoZSBUcnVua01hc2sgdG8gdXNlLgoqCiogSU5QVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgdG8gdXNlIGxvb2t1cCB0YWJsZSwgR1RfRkFMU0UgdG8gdXNlIFhPUi4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRIYXNoVHJ1bmsKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9CT09MICAgICAgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgICAgZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNTZXRIYXNoVHJ1bmsgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoISgoSVNfSU5fREVWX0dST1VQKGRldixERVZfVFJVTkspKSB8fAogICAgICAgIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9SRURVQ0VEX1RSVU5LKSkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1RSVU5LX01BU0tfVEJMLCAxMSwgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRIYXNoVHJ1bmsKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBIYXNoIERBICYgU0EgZm9yIFRydW5rTWFzayBzZWxlY3Rpb24uIFRydW5rIGxvYWQgYmFsYW5jaW5nIGlzIGFjY29tcGxpc2hlZAoqICAgICAgICBieSB1c2luZyB0aGUgZnJhbWUncyBEQSBhbmQgU0EgZmllbGRzIHRvIGFjY2VzcyBvbmUgb2YgZWlnaHQgVHJ1bmsgTWFza3MuCiogICAgICAgIFdoZW4gdGhpcyBiaXQgaXMgc2V0IHRvIGEgb25lIHRoZSBoYXNoZWQgY29tcHV0ZWQgZm9yIGFkZHJlc3MgdGFibGUKKiAgICAgICAgbG9va3VwcyBpcyB1c2VkIGZvciB0aGUgVHJ1bmtNYXNrIHNlbGVjdGlvbi4gV2hlbiB0aGlzIGJpdCBpcyBjbGVhcmVkIHRvCiogICAgICAgIGEgemVybyB0aGUgbG93ZXIgMyBiaXRzIG9mIHRoZSBmcmFtZSdzIERBIGFuZCBTQSBhcmUgWE9SJ2VkIHRvZ2V0aGVyIHRvCiogICAgICAgIHNlbGVjdCB0aGUgVHJ1bmtNYXNrIHRvIHVzZS4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGVuIC0gR1RfVFJVRSB0byB1c2UgbG9va3VwIHRhYmxlLCBHVF9GQUxTRSB0byB1c2UgWE9SLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0SGFzaFRydW5rCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9CT09MICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldEhhc2hUcnVuayBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghKChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9UUlVOSykpIHx8CiAgICAgICAgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1JFRFVDRURfVFJVTkspKSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1RSVU5LX01BU0tfVEJMLDExLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRUcnVua1JvdXRpbmcKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgcm91dGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIFRydW5rIElELgoqCiogSU5QVVRTOgoqICAgICAgICB0cnVua0lkIC0gVHJ1bmsgSUQuCiogICAgICAgIHRydW5rUm91dGUgLSBUcnVuayByb3V0ZSBiaXRzLiBCaXQgMCBjb250cm9scyB0cnVuayByb3V0aW5nIGZvciBwb3J0IDAsCiogICAgICAgICAgICAgICAgICAgIGJpdCAxIGZvciBwb3J0IDEgLCBldGMuCioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX0JBRF9QQVJBTSAtIGlmIHRydW5rSWQgPiAweEYuCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0VHJ1bmtSb3V0aW5nCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfVTMyICAgICAgICAgIHRydW5rSWQsCiAgICBJTiBHVF9VMzIgICAgICAgIHRydW5rUm91dGUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgR1RfVTMyICAgICAgICAgICAgbWFzazsKICAgIEdUX1UzMiAgICAgICAgICAgIG1heFRydW5rOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFRydW5rUm91dGluZyBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9UUlVOSykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgZ3RTZW1UYWtlKGRldixkZXYtPnRibFJlZ3NTZW0sT1NfV0FJVF9GT1JFVkVSKTsKCiAgICAvKiBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgY2FuIGJlIGFjY2Vzc2VkLiAqLwojaWZkZWYgR1RfUk1HTVRfQUNDRVNTCiAgICB7CiAgICAgIEhXX0RFVl9SRUdfQUNDRVNTIHJlZ0FjY2VzczsKCiAgICAgIHJlZ0FjY2Vzcy5lbnRyaWVzID0gMTsKCiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5jbWQgPSBIV19SRUdfV0FJVF9USUxMXzA7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5hZGRyID0gQ0FMQ19TTUlfREVWX0FERFIoZGV2LCAwLCBHTE9CQUwyX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0ucmVnID0gUURfUkVHX1RSVU5LX1JPVVRJTkc7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5kYXRhID0gMTU7CiAgICAgIHJldFZhbCA9IGh3QWNjZXNzTXVsdGlSZWdzKGRldiwgJnJlZ0FjY2Vzcyk7CiAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgewogICAgICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICB9CiAgICB9CiNlbHNlCiAgICBkbwogICAgewogICAgICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19UUlVOS19ST1VUSU5HLCZkYXRhKTsKICAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgICAgewogICAgICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICAgIH0KICAgIH0gd2hpbGUgKGRhdGEgJiAweDgwMDApOwojZW5kaWYKCiAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfOF9UUlVOS0lORykpCiAgICAgICAgbWF4VHJ1bmsgPSA4OwogICAgZWxzZQogICAgICAgIG1heFRydW5rID0gMTY7CgogICAgaWYodHJ1bmtJZCA+PSBtYXhUcnVuaykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSAodHJ1bmtJZClcbiIpKTsKICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICBtYXNrID0gKDEgPDwgZGV2LT5udW1PZlBvcnRzKSAtIDE7CgogICAgaWYodHJ1bmtSb3V0ZSA+IG1hc2spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9CQURfUEFSQU0gKHRydW5rUm91dGUpXG4iKSk7CiAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgbWFzayA9IEdUX0xQT1JUVkVDXzJfUE9SVFZFQyh0cnVua1JvdXRlKTsKCiAgICBkYXRhID0gKEdUX1UxNikoMHg4MDAwIHwgKHRydW5rSWQgPDwgMTEpIHwgbWFzayk7CgogICAgLyogU2V0IHJlbGF0ZWQgcmVnaXN0ZXIgKi8KICAgIHJldFZhbCA9IGh3V3JpdGVHbG9iYWwyUmVnKGRldixRRF9SRUdfVFJVTktfUk9VVElORyxkYXRhKTsKCiAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CgogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0VHJ1bmtSb3V0aW5nCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgcm91dGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIFRydW5rIElELgoqCiogSU5QVVRTOgoqICAgICAgICB0cnVua0lkIC0gVHJ1bmsgSUQuCioKKiBPVVRQVVRTOgoqICAgICAgICB0cnVua1JvdXRlIC0gVHJ1bmsgcm91dGUgYml0cy4gQml0IDAgY29udHJvbHMgdHJ1bmsgcm91dGluZyBmb3IgcG9ydCAwLAoqICAgICAgICAgICAgICAgICAgICBiaXQgMSBmb3IgcG9ydCAxICwgZXRjLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX0JBRF9QQVJBTSAtIGlmIHRydW5rSWQgPiAweEYuCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0VHJ1bmtSb3V0aW5nCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOICBHVF9VMzIgICAgICAgICB0cnVua0lkLAogICAgT1VUIEdUX1UzMiAgICAgICAgKnRydW5rUm91dGUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgR1RfVTMyICAgICAgICAgICAgbWFzazsKICAgIEdUX1UzMiAgICAgICAgICAgIG1heFRydW5rOwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFRydW5rUm91dGluZyBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9UUlVOSykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgZ3RTZW1UYWtlKGRldixkZXYtPnRibFJlZ3NTZW0sT1NfV0FJVF9GT1JFVkVSKTsKCiAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfOF9UUlVOS0lORykpCiAgICAgICAgbWF4VHJ1bmsgPSA4OwogICAgZWxzZQogICAgICAgIG1heFRydW5rID0gMTY7CgogICAgaWYodHJ1bmtJZCA+PSBtYXhUcnVuaykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSAodHJ1bmtJZClcbiIpKTsKICAgICAgICBndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgY2FuIGJlIGFjY2Vzc2VkLiAqLwojaWZkZWYgR1RfUk1HTVRfQUNDRVNTCiAgICB7CiAgICAgIEhXX0RFVl9SRUdfQUNDRVNTIHJlZ0FjY2VzczsKCiAgICAgIHJlZ0FjY2Vzcy5lbnRyaWVzID0gMzsKCiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5jbWQgPSBIV19SRUdfV0FJVF9USUxMXzA7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5hZGRyID0gQ0FMQ19TTUlfREVWX0FERFIoZGV2LCAwLCBHTE9CQUwyX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0ucmVnID0gUURfUkVHX1RSVU5LX1JPVVRJTkc7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5kYXRhID0gMTU7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsxXS5jbWQgPSBIV19SRUdfV1JJVEU7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsxXS5hZGRyID0gQ0FMQ19TTUlfREVWX0FERFIoZGV2LCAwLCBHTE9CQUwyX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0ucmVnID0gUURfUkVHX1RSVU5LX1JPVVRJTkc7CiAgICAgIGRhdGEgPSAoR1RfVTE2KSh0cnVua0lkIDw8IDExKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmRhdGEgPSBkYXRhOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMl0uY21kID0gSFdfUkVHX1JFQUQ7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5hZGRyID0gQ0FMQ19TTUlfREVWX0FERFIoZGV2LCAwLCBHTE9CQUwyX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMl0ucmVnID0gUURfUkVHX1RSVU5LX1JPVVRJTkc7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5kYXRhID0gMDsKICAgICAgcmV0VmFsID0gaHdBY2Nlc3NNdWx0aVJlZ3MoZGV2LCAmcmVnQWNjZXNzKTsKICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICB7CiAgICAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgIH0KICAgICAgZGF0YSA9IHFkTG9uZzJTaG9ydChyZWdBY2Nlc3MucndfcmVnX2xpc3RbMl0uZGF0YSk7CiAgICB9CiNlbHNlCiAgICBkbwogICAgewogICAgICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19UUlVOS19ST1VUSU5HLCZkYXRhKTsKICAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgICAgewogICAgICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICAgIH0KICAgIH0gd2hpbGUgKGRhdGEgJiAweDgwMDApOwoKICAgIGRhdGEgPSAoR1RfVTE2KSh0cnVua0lkIDw8IDExKTsKCiAgICByZXRWYWwgPSBod1dyaXRlR2xvYmFsMlJlZyhkZXYsUURfUkVHX1RSVU5LX1JPVVRJTkcsZGF0YSk7CiAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsUURfUkVHX1RSVU5LX1JPVVRJTkcsJmRhdGEpOwojZW5kaWYKICAgIGd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIG1hc2sgPSAoMSA8PCBkZXYtPm1heFBvcnRzKSAtIDE7CgogICAgKnRydW5rUm91dGUgPSBHVF9QT1JUVkVDXzJfTFBPUlRWRUMoZGF0YSAmIG1hc2spOwoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRSYXRlTGltaXRNb2RlCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgSW5ncmVzcyBSYXRlIExpbWl0aW5nIGNhbiBiZSBlaXRoZXIgUHJpb3JpdHkgYmFzZWQgb3IgQnVyc3QgU2l6ZSBiYXNlZC4KKiAgICAgICAgVGhpcyByb3V0aW5lIHNldHMgd2hpY2ggbW9kZSB0byB1c2UuCioKKiBJTlBVVFM6CiogICAgICAgIG1vZGUgLSBlaXRoZXIgR1RfUkFURV9QUklfQkFTRSBvciBHVF9SQVRFX0JVUlNUX0JBU0UKKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfQkFEX1BBUkFNIC0gaWYgaW52YWxpZCBtb2RlIGlzIHVzZWQuCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0UmF0ZUxpbWl0TW9kZQooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0lOR1JFU1NfUkFURV9NT0RFIG1vZGUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICAgIGRhdGE7CiAgICBHVF9VOCAgICAgICAgICAgaHdQb3J0OyAgICAgICAgIC8qIHRoZSBwaHlzaWNhbCBwb3J0IG51bWJlciAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRSYXRlTGltaXRNb2RlIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9CVVJTVF9SQVRFKSkKICAgIHsKICAgICAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX05FV19GRUFUVVJFX0lOX1JFVikgfHwKICAgICAgICAgICAgKChHVF9ERVZJQ0VfUkVWKWRldi0+cmV2aXNpb24gPCBHVF9SRVZfMikpCiAgICAgICAgewogICAgICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICAgICAgfQogICAgfQoKICAgIHN3aXRjaCAobW9kZSkKICAgIHsKICAgICAgICBjYXNlIEdUX1JBVEVfUFJJX0JBU0U6CiAgICAgICAgICAgIGRhdGEgPSAwOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEdUX1JBVEVfQlVSU1RfQkFTRToKICAgICAgICAgICAgZGF0YSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERCR19JTkZPKCgiTm90IHN1cHBvcnRlZCBtb2RlICVpXG4iLG1vZGUpKTsKICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICBod1BvcnQgPSA3OwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRQb3J0UmVnRmllbGQoZGV2LGh3UG9ydCwgMHgxQSwgMTUsIDEsIGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0UmF0ZUxpbWl0TW9kZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgIEluZ3Jlc3MgUmF0ZSBMaW1pdGluZyBjYW4gYmUgZWl0aGVyIFByaW9yaXR5IGJhc2VkIG9yIEJ1cnN0IFNpemUgYmFzZWQuCiogICAgICAgIFRoaXMgcm91dGluZSBnZXRzIHdoaWNoIG1vZGUgaXMgYmVpbmcgdXNlZC4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIG1vZGUgLSBlaXRoZXIgR1RfUkFURV9QUklfQkFTRSBvciBHVF9SQVRFX0JVUlNUX0JBU0UKKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFJhdGVMaW1pdE1vZGUKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0lOR1JFU1NfUkFURV9NT0RFICptb2RlCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgICBkYXRhOwogICAgR1RfVTggICAgICAgICAgIGh3UG9ydDsgICAgICAgICAvKiB0aGUgcGh5c2ljYWwgcG9ydCBudW1iZXIgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0UmF0ZUxpbWl0TW9kZSBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQlVSU1RfUkFURSkpCiAgICB7CiAgICAgICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9ORVdfRkVBVFVSRV9JTl9SRVYpIHx8CiAgICAgICAgICAgICgoR1RfREVWSUNFX1JFVilkZXYtPnJldmlzaW9uIDwgR1RfUkVWXzIpKQogICAgICAgIHsKICAgICAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgICAgIH0KICAgIH0KCiAgICBod1BvcnQgPSA3OwogICAgZGF0YSA9IDA7CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldFBvcnRSZWdGaWVsZChkZXYsaHdQb3J0LCAweDFBLCAxNSwgMSwgJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgaWYgKGRhdGEgPT0gMCkKICAgICAgICAqbW9kZSA9IEdUX1JBVEVfUFJJX0JBU0U7CiAgICBlbHNlCiAgICAgICAgKm1vZGUgPSBHVF9SQVRFX0JVUlNUX0JBU0U7CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEFnZUludAoqCiogREVTQ1JJUFRJT046CiogICAgICAgIEVuYWJsZS9EaXNhYmxlIEFnZSBSZWZyZXNoIEludGVycnVwdC4gSWYgQ1BVIERpcmVjdGVkIExlYXJuaW5nIGlzIGJlaW5nCiogICAgICAgIHVzZWQgKGdwcnRTZXRMb2NrZWRQb3J0KSwgaXQgbWF5IGJlIGRlc2lyYWJsZSB0byBrbm93IHdoZW4gYW4gYWRkcmVzcyBpcwoqICAgICAgICBzdGlsbCBiZWluZyB1c2VkIGJlZm9yZSBpdCB0b3RhbGx5IGFnZXMgb3V0IG9mIHRoZSBzd2l0Y2guIFRoaXMgY2FuIGJlCiogICAgICAgIGFjY29tcGxpc2hlZCBieSBlbmFibGluZyBBZ2UgUmVmcmVzaCBJbnRlcnJ1cHQgKG9yIEFUVSBBZ2UgVmlvbGF0aW9uIEludCkuCiogICAgICAgIEFuIEFUVSBBZ2UgVmlvbGF0aW9uIGxvb2tzIGlkZW50aWNhbCB0byBhbmQgcmVwb3J0ZWQgdGhlIHNhbWUgYXMgYW4gQVRVCiogICAgICAgIE1pc3MgVmlvbGF0aW9uLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHdoZW4gdGhpcyByZXBvcnRlZC4gTm9ybWFsIEFUVSBNaXNzCiogICAgICAgIFZpb2xhdGlvbiBvbmx5IG9jY3VyIGlmIGEgbmV3IFNBIGFycml2ZXMgYXQgYSBMb2NrZWRQb3J0LiBUaGUgQWdlIHZlcnNpb24KKiAgICAgICAgb2YgdGhlIEFUVSBNaXNzIFZpb2xhdGlvbiBvY2N1cnMgaWYgYW4gU0EgYXJyaXZlcyBhdCBhIExvY2tlZFBvcnQsIHdoZXJlCiogICAgICAgIHRoZSBhZGRyZXNzIGlzIGNvbnRhaW5lZCBpbiB0aGUgQVRVJ3MgZGF0YWJhc2UsIGJ1dCB3aGVyZSBpdHMgRW50cnlTdGF0ZQoqICAgICAgICBpcyBsZXNzIHRoYW4gMHg0IChpLmUuLCBpdCBoYXMgYWdlZCBtb3JlIHRoYW4gMS8yIHdheSkuCiogICAgICAgIEdUX0FUVV9QUk9CIEludGVycnVwdCBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBpbnRlcnJ1cHQgdG8gb2NjdXIuCiogICAgICAgIFJlZmVyIHRvIGV2ZW50U2V0QWN0aXZlIHJvdXRpbmUgdG8gZW5hYmxlIEdUX0FUVV9QUk9CLgoqCiogICAgICAgIElmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgUmVmcmVzaCBMb2NrZWQgZmVhdHVyZSAoZ3BydFNldFJlZnJlc2hMb2NrZWQgQVBJKSwKKiAgICAgICAgdGhlIGZlYXR1cmUgbXVzdCBub3QgYmUgZW5hYmxlZCBmb3IgdGhpcyBNaXNzIFZpb2xhdGlvbiB0byBvY2N1ci4KKgoqIElOUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFLCB0byBlbmFibGUsCiogICAgICAgICAgICAgR1RfRkFMU0UsIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRBZ2VJbnQKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9CT09MICAgICAgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgICAgZGF0YTsKICAgIEdUX1U4ICAgICAgICAgICBod1BvcnQ7ICAgICAgICAgLyogdGhlIHBoeXNpY2FsIHBvcnQgbnVtYmVyICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEFnZUludCBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQUdFX0lOVEVSUlVQVCkpCiAgICB7CiAgICAgICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9ORVdfRkVBVFVSRV9JTl9SRVYpIHx8CiAgICAgICAgICAgICgoR1RfREVWSUNFX1JFVilkZXYtPnJldmlzaW9uIDwgR1RfUkVWXzIpKQogICAgICAgIHsKICAgICAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgICAgIH0KICAgIH0KCiAgICBCT09MXzJfQklUKGVuLCBkYXRhKTsKCiAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfQUdFX0lOVF9HTE9CQUwyKSkKICAgIHsKICAgICAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsIDEwLCAxLCBkYXRhKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBod1BvcnQgPSA3OwogICAgICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgICAgIHJldFZhbCA9IGh3U2V0UG9ydFJlZ0ZpZWxkKGRldixod1BvcnQsIDB4MUEsIDE0LCAxLCBkYXRhKTsKICAgIH0KCiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRBZ2VJbnQKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBHZXQgc3RhdGUgb2YgQWdlIFJlZnJlc2ggSW50ZXJydXB0IG1vZGUuIElmIENQVSBEaXJlY3RlZCBMZWFybmluZyBpcyBiZWluZwoqICAgICAgICB1c2VkIChncHJ0U2V0TG9ja2VkUG9ydCksIGl0IG1heSBiZSBkZXNpcmFibGUgdG8ga25vdyB3aGVuIGFuIGFkZHJlc3MgaXMKKiAgICAgICAgc3RpbGwgYmVpbmcgdXNlZCBiZWZvcmUgaXQgdG90YWxseSBhZ2VzIG91dCBvZiB0aGUgc3dpdGNoLiBUaGlzIGNhbiBiZQoqICAgICAgICBhY2NvbXBsaXNoZWQgYnkgZW5hYmxpbmcgQWdlIFJlZnJlc2ggSW50ZXJydXB0IChvciBBVFUgQWdlIFZpb2xhdGlvbiBJbnQpLgoqICAgICAgICBBbiBBVFUgQWdlIFZpb2xhdGlvbiBsb29rcyBpZGVudGljYWwgdG8gYW5kIHJlcG9ydGVkIHRoZSBzYW1lIGFzIGFuIEFUVQoqICAgICAgICBNaXNzIFZpb2xhdGlvbi4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB3aGVuIHRoaXMgcmVwb3J0ZWQuIE5vcm1hbCBBVFUgTWlzcwoqICAgICAgICBWaW9sYXRpb24gb25seSBvY2N1ciBpZiBhIG5ldyBTQSBhcnJpdmVzIGF0IGEgTG9ja2VkUG9ydC4gVGhlIEFnZSB2ZXJzaW9uCiogICAgICAgIG9mIHRoZSBBVFUgTWlzcyBWaW9sYXRpb24gb2NjdXJzIGlmIGFuIFNBIGFycml2ZXMgYXQgYSBMb2NrZWRQb3J0LCB3aGVyZQoqICAgICAgICB0aGUgYWRkcmVzcyBpcyBjb250YWluZWQgaW4gdGhlIEFUVSdzIGRhdGFiYXNlLCBidXQgd2hlcmUgaXRzIEVudHJ5U3RhdGUKKiAgICAgICAgaXMgbGVzcyB0aGFuIDB4NCAoaS5lLiwgaXQgaGFzIGFnZWQgbW9yZSB0aGFuIDEvMiB3YXkpLgoqICAgICAgICBHVF9BVFVfUFJPQiBJbnRlcnJ1cHQgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoaXMgaW50ZXJydXB0IHRvIG9jY3VyLgoqICAgICAgICBSZWZlciB0byBldmVudFNldEFjdGl2ZSByb3V0aW5lIHRvIGVuYWJsZSBHVF9BVFVfUFJPQi4KKgoqICAgICAgICBJZiB0aGUgZGV2aWNlIHN1cHBvcnRzIFJlZnJlc2ggTG9ja2VkIGZlYXR1cmUgKGdwcnRTZXRSZWZyZXNoTG9ja2VkIEFQSSksCiogICAgICAgIHRoZSBmZWF0dXJlIG11c3Qgbm90IGJlIGVuYWJsZWQgZm9yIHRoaXMgTWlzcyBWaW9sYXRpb24gdG8gb2NjdXIuCioKKiBJTlBVVFM6CiogICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUsIGlmIGVuYWJsZWQsCiogICAgICAgICAgICAgR1RfRkFMU0UsIG90aGVyd2lzZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldEFnZUludAooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgICBkYXRhOwogICAgR1RfVTggICAgICAgICAgIGh3UG9ydDsgICAgICAgICAvKiB0aGUgcGh5c2ljYWwgcG9ydCBudW1iZXIgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0QWdlSW50IENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9BR0VfSU5URVJSVVBUKSkKICAgIHsKICAgICAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX05FV19GRUFUVVJFX0lOX1JFVikgfHwKICAgICAgICAgICAgKChHVF9ERVZJQ0VfUkVWKWRldi0+cmV2aXNpb24gPCBHVF9SRVZfMikpCiAgICAgICAgewogICAgICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICAgICAgfQogICAgfQoKICAgIGRhdGEgPSAwOwoKICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9BR0VfSU5UX0dMT0JBTDIpKQogICAgewogICAgICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOQUdFTUVOVCwgMTAsIDEsICZkYXRhKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBod1BvcnQgPSA3OwogICAgICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgICAgIHJldFZhbCA9IGh3R2V0UG9ydFJlZ0ZpZWxkKGRldixod1BvcnQsIDB4MUEsIDE0LCAxLCAmZGF0YSk7CiAgICB9CgogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCAqZW4pOwoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRGb3JjZVNub29wUHJpCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgRm9yY2UgU25vb3BpbmcgUHJpb3JpdHkuIFRoZSBwcmlvcml0eSBvbiBJR01QIG9yIE1MRCBTbm9vcCBmcmFtZXMgYXJlCiogICAgICAgIHNldCB0byB0aGUgU25vb3BQcmkgdmFsdWUgKGdzeXNTZXRTbm9vcFByaSBBUEkpIHdoZW4gRm9yY2UgU25vb3BpbmcKKiAgICAgICBQcmlvcml0eSBpcyBlbmFibGVkLiBXaGVuIGl0J3MgZGlzYWJsZWQsIHRoZSBwcmlvcml0eSBvbiB0aGVzZSBmcmFtZXMKKiAgICAgICAgaXMgbm90IG1vZGlmaWVkLgoqCiogSU5QVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgdG8gdXNlIGRlZmluZWQgUFJJIGJpdHMsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRGb3JjZVNub29wUHJpCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfQk9PTCAgICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICAgIGRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0Rm9yY2VTbm9vcFByaSBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfU05PT1BfUFJJKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19QUklPUklUWV9PVkVSUklERSwgNywgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRGb3JjZVNub29wUHJpCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgRm9yY2UgU25vb3BpbmcgUHJpb3JpdHkuIFRoZSBwcmlvcml0eSBvbiBJR01QIG9yIE1MRCBTbm9vcCBmcmFtZXMgYXJlCiogICAgICAgIHNldCB0byB0aGUgU25vb3BQcmkgdmFsdWUgKGdzeXNTZXRTbm9vcFByaSBBUEkpIHdoZW4gRm9yY2UgU25vb3BpbmcKKiAgICAgICBQcmlvcml0eSBpcyBlbmFibGVkLiBXaGVuIGl0J3MgZGlzYWJsZWQsIHRoZSBwcmlvcml0eSBvbiB0aGVzZSBmcmFtZXMKKiAgICAgICAgaXMgbm90IG1vZGlmaWVkLgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIHRvIHVzZSBkZWZpbmVkIFBSSSBiaXRzLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRGb3JjZVNub29wUHJpCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9CT09MICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldEZvcmNlU25vb3BQcmkgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NOT09QX1BSSSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1BSSU9SSVRZX09WRVJSSURFLDcsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFNub29wUHJpCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgU25vb3AgUHJpb3JpdHkuIFdoZW4gRm9yY2VTbm9vcFByaSAoZ3N5c1NldEZvcmNlU25vb3BQcmkgQVBJKSBpcyBlbmFibGVkLAoqICAgICAgIHRoaXMgcHJpb3JpdHkgaXMgdXNlZCBhcyB0aGUgZWdyZXNzaW5nIGZyYW1lJ3MgUFJJWzI6MF0gYml0cyBvbiBnZW5lcmF0ZWQKKiAgICAgICBNYXJ2ZWxsIFRhZyBUb19DUFUgU25vb3AgZnJhbWVzIGFuZCBoaWdoZXIgMiBiaXRzIG9mIHRoZSBwcmlvcml0eSBhcmUKKiAgICAgICB1c2VkIGFzIHRoZSBpbnRlcm5hbCBRdWV1ZSBQcmlvcml0eSB0byB1c2Ugb24gSUdNUC9NTEQgc25vb3AgZnJhbWVzLgoqCiogSU5QVVRTOgoqICAgICAgICBwcmkgLSBQUklbMjowXSBiaXRzIChzaG91bGQgYmUgbGVzcyB0aGFuIDgpCioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX0JBRF9QQVJBTSAtIElmIHByaSBpcyBub3QgbGVzcyB0aGFuIDguCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0U25vb3BQcmkKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VMTYgICAgICAgIHByaQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFNub29wUHJpIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9TTk9PUF9QUkkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIGlmIChwcmkgPiAweDcpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9CQURfUEFSQU1cbiIpKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19QUklPUklUWV9PVkVSUklERSwgNCwgMywgcHJpKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFNub29wUHJpCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgU25vb3AgUHJpb3JpdHkuIFdoZW4gRm9yY2VTbm9vcFByaSAoZ3N5c1NldEZvcmNlU25vb3BQcmkgQVBJKSBpcyBlbmFibGVkLAoqICAgICAgIHRoaXMgcHJpb3JpdHkgaXMgdXNlZCBhcyB0aGUgZWdyZXNzaW5nIGZyYW1lJ3MgUFJJWzI6MF0gYml0cyBvbiBnZW5lcmF0ZWQKKiAgICAgICBNYXJ2ZWxsIFRhZyBUb19DUFUgU25vb3AgZnJhbWVzIGFuZCBoaWdoZXIgMiBiaXRzIG9mIHRoZSBwcmlvcml0eSBhcmUKKiAgICAgICB1c2VkIGFzIHRoZSBpbnRlcm5hbCBRdWV1ZSBQcmlvcml0eSB0byB1c2Ugb24gSUdNUC9NTEQgc25vb3AgZnJhbWVzLgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgcHJpIC0gUFJJWzI6MF0gYml0cyAoc2hvdWxkIGJlIGxlc3MgdGhhbiA4KQoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0U25vb3BQcmkKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX1UxNiAgICAgICpwcmkKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldFNub29wUHJpIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9TTk9PUF9QUkkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19QUklPUklUWV9PVkVSUklERSw0LDMscHJpKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRGb3JjZUFSUFByaQoqCiogREVTQ1JJUFRJT046CiogICAgICAgIEZvcmNlIEFSUCBQcmlvcml0eS4gVGhlIHByaW9yaXR5IG9uIEFSUCBmcmFtZXMgYXJlIHNldCB0byB0aGUgQVJQUHJpCiogICAgICAgdmFsdWUgKGdzeXNTZXRBUlBQcmkgQVBJKSB3aGVuIEZvcmNlIEFSUCBQcmlvcml0eSBpcyBlbmFibGVkLiBXaGVuIGl0J3MKKiAgICAgICBkaXNhYmxlZCwgdGhlIHByaW9yaXR5IG9uIHRoZXNlIGZyYW1lcyBpcyBub3QgbW9kaWZpZWQuCioKKiBJTlBVVFM6CiogICAgICAgIGVuIC0gR1RfVFJVRSB0byB1c2UgZGVmaW5lZCBQUkkgYml0cywgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEZvcmNlQVJQUHJpCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfQk9PTCAgICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICAgIGRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0Rm9yY2VBUlBQcmkgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0FSUF9QUkkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1BSSU9SSVRZX09WRVJSSURFLCAzLCAxLCBkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldEZvcmNlQVJQUHJpCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgRm9yY2UgQVJQIFByaW9yaXR5LiBUaGUgcHJpb3JpdHkgb24gQVJQIGZyYW1lcyBhcmUgc2V0IHRvIHRoZSBBUlBQcmkKKiAgICAgICB2YWx1ZSAoZ3N5c1NldEFSUFByaSBBUEkpIHdoZW4gRm9yY2UgQVJQIFByaW9yaXR5IGlzIGVuYWJsZWQuIFdoZW4gaXQncwoqICAgICAgIGRpc2FibGVkLCB0aGUgcHJpb3JpdHkgb24gdGhlc2UgZnJhbWVzIGlzIG5vdCBtb2RpZmllZC4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGVuIC0gR1RfVFJVRSB0byB1c2UgZGVmaW5lZCBQUkkgYml0cywgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0Rm9yY2VBUlBQcmkKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAgICAqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0Rm9yY2VBUlBQcmkgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0FSUF9QUkkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19QUklPUklUWV9PVkVSUklERSwzLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRBUlBQcmkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBBUlAgUHJpb3JpdHkuIFdoZW4gRm9yY2VBUlBQcmkgKGdzeXNTZXRGb3JjZUFSUFByaSBBUEkpIGlzIGVuYWJsZWQsCiogICAgICAgdGhpcyBwcmlvcml0eSBpcyB1c2VkIGFzIHRoZSBlZ3Jlc3NpbmcgZnJhbWUncyBQUklbMjowXSBiaXRzIG9uIGdlbmVyYXRlZAoqICAgICAgIE1hcnZlbGwgVGFnIFRvX0NQVSBBUlAgZnJhbWVzIGFuZCBoaWdoZXIgMiBiaXRzIG9mIHRoZSBwcmlvcml0eSBhcmUKKiAgICAgICB1c2VkIGFzIHRoZSBpbnRlcm5hbCBRdWV1ZSBQcmlvcml0eSB0byB1c2Ugb24gQVJQIGZyYW1lcy4KKgoqIElOUFVUUzoKKiAgICAgICAgcHJpIC0gUFJJWzI6MF0gYml0cyAoc2hvdWxkIGJlIGxlc3MgdGhhbiA4KQoqCiogT1VUUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9CQURfUEFSQU0gLSBJZiBwcmkgaXMgbm90IGxlc3MgdGhhbiA4LgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEFSUFByaQooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX1UxNiAgICAgICAgcHJpCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0QVJQUHJpIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9BUlBfUFJJKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBpZiAocHJpID4gMHg3KQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfQkFEX1BBUkFNXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfUFJJT1JJVFlfT1ZFUlJJREUsIDAsIDMsIHByaSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRBUlBQcmkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBBUlAgUHJpb3JpdHkuIFdoZW4gRm9yY2VBUlBQcmkgKGdzeXNTZXRGb3JjZUFSUFByaSBBUEkpIGlzIGVuYWJsZWQsCiogICAgICAgdGhpcyBwcmlvcml0eSBpcyB1c2VkIGFzIHRoZSBlZ3Jlc3NpbmcgZnJhbWUncyBQUklbMjowXSBiaXRzIG9uIGdlbmVyYXRlZAoqICAgICAgIE1hcnZlbGwgVGFnIFRvX0NQVSBBUlAgZnJhbWVzIGFuZCBoaWdoZXIgMiBiaXRzIG9mIHRoZSBwcmlvcml0eSBhcmUKKiAgICAgICB1c2VkIGFzIHRoZSBpbnRlcm5hbCBRdWV1ZSBQcmlvcml0eSB0byB1c2Ugb24gQVJQIGZyYW1lcy4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIHByaSAtIFBSSVsyOjBdIGJpdHMgKHNob3VsZCBiZSBsZXNzIHRoYW4gOCkKKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldEFSUFByaQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfVTE2ICAgICAgKnByaQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0QVJQUHJpIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9BUlBfUFJJKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfUFJJT1JJVFlfT1ZFUlJJREUsMCwzLHByaSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0VXNlUG9ydFNjaGVkdWxlCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgc2V0cyBwZXIgcG9ydCBzY2hlZHVsaW5nIG1vZGUKKgoqIElOUFVUUzoKKiAgICAgICBlbiAtIEdUX1RSVUUgZW5hYmxlcyBwZXIgcG9ydCBzY2hlZHVsaW5nLAoqICAgICAgICAgICAgIEdUX0ZBTFNFIGRpc2FibGUuCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0VXNlUG9ydFNjaGVkdWxlCigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIElOICBHVF9CT09MICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogRGF0YSB0byBiZSBzZXQgaW50byB0aGUgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXRXYXRjaERvZyBDYWxsZWQuXG4iKSk7CgogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9QT1JUX1NDSEVEVUxFKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCB0aGUgVXNlUG9ydFNjaGVkdWxlIGJpdC4gICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDEyLDEsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0VXNlUG9ydFNjaGVkdWxlCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgZ2V0cyBwZXIgcG9ydCBzY2hlZHVsaW5nIG1vZGUKKgoqIElOUFVUUzoKKiAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICBlbiAtIEdUX1RSVUUgZW5hYmxlcyBwZXIgcG9ydCBzY2hlZHVsaW5nLAoqICAgICAgICAgICAgIEdUX0ZBTFNFIGRpc2FibGUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0VXNlUG9ydFNjaGVkdWxlCigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIE9VVCBHVF9CT09MICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIERhdGEgdG8gYmUgc2V0IGludG8gdGhlICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAqLwogICAgREJHX0lORk8oKCJnc3lzU2V0V2F0Y2hEb2cgQ2FsbGVkLlxuIikpOwoKICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfUE9SVF9TQ0hFRFVMRSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBVc2VQb3J0U2NoZWR1bGUgYml0LiAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsMTIsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsICplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0T2xkSGFkZXIKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBzZXRzIEVncmVzcyBPbGQgSGVhZGVyLgoqICAgICAgICBXaGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIGFuZCBmcmFtZXMgYXJlIGVncmVzc2VkIHdpdGggYSBNYXJ2ZWxsIEhlYWRlciwKKiAgICAgICAgdGhlIGZvcm1hdCBvZiB0aGUgSGVhZGVyIGlzIHNsaWdodGx5IG1vZGlmaWVkIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlCiogICAgICAgIHdpdGggcHJldmlvdXMgZGV2aWNlcyB0aGF0IHVzZWQgdGhlIG9yaWdpbmFsIEhlYWRlci4gU3BlY2lmaWNhbGx5LCBiaXQgMwoqICAgICAgICBvZiB0aGUgSGVhZGVyJ3MgMm5kIG9jdGV0IGlzIGNsZWFyZWQgdG8gYSB6ZXJvIHN1Y2ggdGhhdCBvbmx5IEZQcmlbMjoxXQoqICAgICAgICBpcyBhdmFpbGFibGUgaW4gdGhlIEhlYWRlci4KKgoqIElOUFVUUzoKKiAgICAgICBlbiAtIEdUX1RSVUUgdG8gZW5hYmxlIE9sZCBIZWFkZXIgTW9kZSwKKiAgICAgICAgICAgICBHVF9GQUxTRSB0byBkaXNhYmxlCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRPbGRIYWRlcgooCiAgICBJTiAgR1RfUURfREVWICpkZXYsCiAgICBJTiAgR1RfQk9PTCAgIGVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgICBkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEFycFFQcmkgQ2FsbGVkLlxuIikpOwoKICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfT0xEX0hFQURFUikpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBTZXQgdGhlIE9sZEhhZGVyIGJpdC4gICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01BTkdFTUVOVF9DT05UUk9MLDUsMSxkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRPbGRIYWRlcgoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIGdldHMgRWdyZXNzIE9sZCBIZWFkZXIuCiogICAgICAgIFdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgYW5kIGZyYW1lcyBhcmUgZWdyZXNzZWQgd2l0aCBhIE1hcnZlbGwgSGVhZGVyLAoqICAgICAgICB0aGUgZm9ybWF0IG9mIHRoZSBIZWFkZXIgaXMgc2xpZ2h0bHkgbW9kaWZpZWQgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUKKiAgICAgICAgd2l0aCBwcmV2aW91cyBkZXZpY2VzIHRoYXQgdXNlZCB0aGUgb3JpZ2luYWwgSGVhZGVyLiBTcGVjaWZpY2FsbHksIGJpdCAzCiogICAgICAgIG9mIHRoZSBIZWFkZXIncyAybmQgb2N0ZXQgaXMgY2xlYXJlZCB0byBhIHplcm8gc3VjaCB0aGF0IG9ubHkgRlByaVsyOjFdCiogICAgICAgIGlzIGF2YWlsYWJsZSBpbiB0aGUgSGVhZGVyLgoqCiogSU5QVVRTOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSB0byBlbmFibGUgT2xkIEhlYWRlciBNb2RlLAoqICAgICAgICAgICAgIEdUX0ZBTFNFIHRvIGRpc2FibGUKKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldE9sZEhhZGVyCigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIE9VVCBHVF9CT09MICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgICBkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c0dldEFycFFQcmkgQ2FsbGVkLlxuIikpOwoKICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfT0xEX0hFQURFUikpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBPbGRIYWRlciBiaXQuICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19NQU5HRU1FTlRfQ09OVFJPTCw1LDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCAqZW4pOwoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRSZWN1cnNpdmVTdHJpcHBpbmdEaXNhYmxlCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgZGV0ZXJtaW5lcyBpZiByZWN1cnNpdmUgdGFnIHN0cmlwcGluZyBmZWF0dXJlIG5lZWRzIHRvIGJlCiogICAgICAgIGRpc2FibGVkLgoqCiogSU5QVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSB0byBkaXNhYmxlIFJlY3Vyc2l2ZSBUYWcgU3RyaXBwaW5nLAoqICAgICAgICAgICAgIEdUX0ZBTFNFIHRvIGVuYWJsZQoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0UmVjdXJzaXZlU3RyaXBwaW5nRGlzYWJsZQooCiAgICBJTiAgR1RfUURfREVWICpkZXYsCiAgICBJTiAgR1RfQk9PTCAgIGVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgICBkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFJlY3Vyc2l2ZVN0cmlwcGluZ0Rpc2FibGUgQ2FsbGVkLlxuIikpOwoKICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfUkVDVVJTSVZFX1RBR19TVFJJUCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBTZXQgdGhlIFJlY3Vyc2l2ZVN0cmlwcGluZ0Rpc2FibGUgYml0LiAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wyLDE1LDEsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0UmVjdXJzaXZlU3RyaXBwaW5nRGlzYWJsZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIGNoZWNrcyBpZiByZWN1cnNpdmUgdGFnIHN0cmlwcGluZyBmZWF0dXJlIGlzIGRpc2FibGVkLgoqCiogSU5QVVRTOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSwgaWYgUmVjdXJzaXZlIFRhZyBTdHJpcHBpbmcgaXMgZGlzYWJsZWQsCiogICAgICAgICAgICAgR1RfRkFMU0UsIG90aGVyd2lzZQoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0UmVjdXJzaXZlU3RyaXBwaW5nRGlzYWJsZQooCiAgICBJTiAgR1RfUURfREVWICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgICAgZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNHZXRSZWN1cnNpdmVTdHJpcHBpbmdEaXNhYmxlIENhbGxlZC5cbiIpKTsKCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1JFQ1VSU0lWRV9UQUdfU1RSSVApKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgUmVjdXJzaXZlU3RyaXBwaW5nRGlzYWJsZSBiaXQuICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTDIsMTUsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsICplbik7CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldENQVVBvcnQKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBzZXRzIENQVSBQb3J0IHdoZXJlIFJzdmQyQ3B1IGZyYW1lcyBhbmQgSUdNUC9NTEQgU25vb3BlZAoqICAgICAgICBmcmFtZXMgYXJlIGRlc3RpbmVkLgoqCiogSU5QVVRTOgoqICAgICAgIGNwdVBvcnQgLSBDUFUgUG9ydAoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0Q1BVUG9ydAooCiAgICBJTiAgR1RfUURfREVWICpkZXYsCiAgICBJTiAgR1RfTFBPUlQgIGNwdVBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1U4ICAgICAgICAgICBod1BvcnQ7ICAgICAgICAgLyogdGhlIHBoeXNpY2FsIHBvcnQgbnVtYmVyICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldENQVVBvcnQgQ2FsbGVkLlxuIikpOwoKICAgIC8qIHRyYW5zbGF0ZSBMUE9SVCB0byBoYXJkd2FyZSBwb3J0ICovCiAgICBod1BvcnQgPSBHVF9MUE9SVF8yX1BPUlQoY3B1UG9ydCk7CgogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DUFVfUE9SVCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgaWYgKGNwdVBvcnQgPj0gZGV2LT5udW1PZlBvcnRzKQogICAgewogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgLyogU2V0IHRoZSBDUFUgUG9ydC4gICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01BTkdFTUVOVF9DT05UUk9MLDAsMywoR1RfVTE2KWh3UG9ydCk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRDUFVQb3J0CioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgZ2V0cyBDUFUgUG9ydCB3aGVyZSBSc3ZkMkNwdSBmcmFtZXMgYW5kIElHTVAvTUxEIFNub29wZWQKKiAgICAgICAgZnJhbWVzIGFyZSBkZXN0aW5lZC4KKgoqIElOUFVUUzoKKiAgICAgICBjcHVQb3J0IC0gQ1BVIFBvcnQKKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldENQVVBvcnQKKAogICAgSU4gIEdUX1FEX0RFViAqZGV2LAogICAgT1VUIEdUX0xQT1JUICAqY3B1UG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGh3UG9ydDsgICAgICAgICAvKiB0aGUgcGh5c2ljYWwgcG9ydCBudW1iZXIgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0Q1BVUG9ydCBDYWxsZWQuXG4iKSk7CgogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DUFVfUE9SVCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBDUFUgUG9ydC4gICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01BTkdFTUVOVF9DT05UUk9MLDAsMywmaHdQb3J0KTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIC8qIHRyYW5zbGF0ZSBoYXJkd2FyZSBwb3J0IHRvIExQT1JUICovCiAgICAqY3B1UG9ydCA9IChHVF9MUE9SVClHVF9QT1JUXzJfTFBPUlQoKEdUX1U4KWh3UG9ydCk7CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldENQVURlc3QKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGlzIHJvdXRpbmUgc2V0cyBDUFUgRGVzdGluYXRpb24gUG9ydC4gQ1BVIERlc3RpbmF0aW9uIHBvcnQgaW5kaWNhdGVzIHRoZQoqICAgICAgICBwb3J0IG51bWJlciBvbiB0aGlzIGRldmljZSB3aGVyZSB0aGUgQ1BVIGlzIGNvbm5lY3RlZCAoZWl0aGVyIGRpcmVjdGx5IG9yCiogICAgICAgIGluZGlyZWN0bHkgdGhyb3VnaCBhbm90aGVyIE1hcnZlbGwgc3dpdGNoIGRldmljZSkuCioKKiAgICAgICAgTWFueSBtb2RlcyBvZiBmcmFtZSBwcm9jZXNzaW5nIG5lZWQgdG8ga25vdyB3aGVyZSB0aGUgQ1BVIGlzIGxvY2F0ZWQuCiogICAgICAgIFRoZXNlIG1vZGVzIGFyZToKKiAgICAgICAgMS4gV2hlbiBJR01QL01MRCBmcmFtZSBpcyByZWNlaXZlZCBhbmQgU25vb3BpbmcgaXMgZW5hYmxlZAoqICAgICAgICAyLiBXaGVuIHRoZSBwb3J0IGlzIGNvbmZpZ3VyZWQgYXMgYSBEU0EgcG9ydCBhbmQgaXQgcmVjZWl2ZXMgYSBUb19DUFUgZnJhbWUKKiAgICAgICAgMy4gV2hlbiBhIFJzdmQyQ1BVIGZyYW1lIGVudGVycyB0aGUgcG9ydAoqICAgICAgICA0LiBXaGVuIHRoZSBwb3J0J3MgU0EgRmlsdGVyaW5nIG1vZGUgaXMgRHJvcCB0byBDUFUKKiAgICAgICAgNS4gV2hlbiBhbnkgb2YgdGhlIHBvcnQncyBQb2xpY3kgT3B0aW9ucyB0cmFwIHRoZSBmcmFtZSB0byB0aGUgQ1BVCiogICAgICAgIDYuIFdoZW4gdGhlIGluZ3Jlc3NpbmcgZnJhbWUgaXMgYW4gQVJQIGFuZCBBUlAgbWlycm9yaW5nIGlzIGVuYWJsZWQgaW4gdGhlCiogICAgICAgICAgIGRldmljZQoqCiogICAgICAgIEluIGFsbCBjYXNlcywgZXhjZXB0IGZvciBBUlAsIHRoZSBmcmFtZXMgdGhhdCBtZWV0IHRoZSBlbmFibGVkIGNyaXRlcmlhCiogICAgICAgIGFyZSBtYXBwZWQgdG8gdGhlIENQVSBEZXN0aW5hdGlvbiBwb3J0LCBvdmVycmlkaW5nIHdoZXJlIHRoZSBmcmFtZSB3b3VsZAoqICAgICAgICBub3JtYWxseSBnby4gSW4gdGhlIGNhc2Ugb2YgQVJQLCB0aGUgZnJhbWUgd2lsbCBiZSBtYXBwZWQgbm9ybWFsbHkgYW5kIGl0CiogICAgICAgIHdpbGwgYWxzbyBnZXQgY29waWVkIHRvIHRoaXMgcG9ydC4KKiAgICAgICAgRnJhbWVzIHRoYXQgZmlsdGVyZWQgb3IgZGlzY2FyZGVkIHdpbGwgbm90IGJlIG1hcHBlZCB0byB0aGUgQ1BVIERlc3RpbmF0aW9uCiogICAgICAgIHBvcnQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBSc3ZkMkNQVSBhbmQgRFNBIFRhZyBjYXNlcy4KKgoqICAgICAgICBJZiBDUFVEZXN0ID0gMHhGLCB0aGUgcmVtYXBwZWQgZnJhbWVzIHdpbGwgYmUgZGlzY2FyZGVkLCBubyBBUlAgbWlycm9yaW5nCiogICAgICAgIHdpbGwgb2NjdXIgYW5kIGluZ3Jlc3NpbmcgVG9fQ1BVIGZyYW1lcyB3aWxsIGJlIGRpc2NhcmRlZC4KKgoqIElOUFVUUzoKKiAgICAgICAgcG9ydCAgLSB0aGUgbG9naWNhbCBwb3J0IG51bWJlci4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRDUFVEZXN0CigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfTFBPUlQgICAgICAgIHBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1U4ICAgICAgICAgICBod1BvcnQ7ICAgICAgICAgLyogdGhlIHBoeXNpY2FsIHBvcnQgbnVtYmVyICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldENQVURlc3QgQ2FsbGVkLlxuIikpOwoKICAgIC8qIHRyYW5zbGF0ZSBMUE9SVCB0byBoYXJkd2FyZSBwb3J0ICovCiAgICBod1BvcnQgPSBHVF9MUE9SVF8yX1BPUlQocG9ydCk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DUFVfREVTVCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogdHJhbnNsYXRlIExQT1JUIHRvIGhhcmR3YXJlIHBvcnQgKi8KICAgIGlmKHBvcnQgPT0gMHhGKQogICAgICAgIGh3UG9ydCA9IChHVF9VOClwb3J0OwogICAgZWxzZQogICAgewogICAgICAgIGh3UG9ydCA9IChHVF9VOCkoR1RfTFBPUlRfMl9QT1JUKHBvcnQpKTsKICAgICAgICBpZiAoaHdQb3J0ID09IEdUX0lOVkFMSURfUE9SVCkKICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19NT05JVE9SX0NPTlRST0wsIDQsIDQsIChHVF9VMTYpaHdQb3J0KTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldENQVURlc3QKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0cyBDUFUgRGVzdGluYXRpb24gUG9ydC4gQ1BVIERlc3RpbmF0aW9uIHBvcnQgaW5kaWNhdGVzIHRoZQoqICAgICAgICBwb3J0IG51bWJlciBvbiB0aGlzIGRldmljZSB3aGVyZSB0aGUgQ1BVIGlzIGNvbm5lY3RlZCAoZWl0aGVyIGRpcmVjdGx5IG9yCiogICAgICAgIGluZGlyZWN0bHkgdGhyb3VnaCBhbm90aGVyIE1hcnZlbGwgc3dpdGNoIGRldmljZSkuCioKKiAgICAgICAgTWFueSBtb2RlcyBvZiBmcmFtZSBwcm9jZXNzaW5nIG5lZWQgdG8ga25vdyB3aGVyZSB0aGUgQ1BVIGlzIGxvY2F0ZWQuCiogICAgICAgIFRoZXNlIG1vZGVzIGFyZToKKiAgICAgICAgMS4gV2hlbiBJR01QL01MRCBmcmFtZSBpcyByZWNlaXZlZCBhbmQgU25vb3BpbmcgaXMgZW5hYmxlZAoqICAgICAgICAyLiBXaGVuIHRoZSBwb3J0IGlzIGNvbmZpZ3VyZWQgYXMgYSBEU0EgcG9ydCBhbmQgaXQgcmVjZWl2ZXMgYSBUb19DUFUgZnJhbWUKKiAgICAgICAgMy4gV2hlbiBhIFJzdmQyQ1BVIGZyYW1lIGVudGVycyB0aGUgcG9ydAoqICAgICAgICA0LiBXaGVuIHRoZSBwb3J0J3MgU0EgRmlsdGVyaW5nIG1vZGUgaXMgRHJvcCB0byBDUFUKKiAgICAgICAgNS4gV2hlbiBhbnkgb2YgdGhlIHBvcnQncyBQb2xpY3kgT3B0aW9ucyB0cmFwIHRoZSBmcmFtZSB0byB0aGUgQ1BVCiogICAgICAgIDYuIFdoZW4gdGhlIGluZ3Jlc3NpbmcgZnJhbWUgaXMgYW4gQVJQIGFuZCBBUlAgbWlycm9yaW5nIGlzIGVuYWJsZWQgaW4gdGhlCiogICAgICAgICAgIGRldmljZQoqCiogICAgICAgIEluIGFsbCBjYXNlcywgZXhjZXB0IGZvciBBUlAsIHRoZSBmcmFtZXMgdGhhdCBtZWV0IHRoZSBlbmFibGVkIGNyaXRlcmlhCiogICAgICAgIGFyZSBtYXBwZWQgdG8gdGhlIENQVSBEZXN0aW5hdGlvbiBwb3J0LCBvdmVycmlkaW5nIHdoZXJlIHRoZSBmcmFtZSB3b3VsZAoqICAgICAgICBub3JtYWxseSBnby4gSW4gdGhlIGNhc2Ugb2YgQVJQLCB0aGUgZnJhbWUgd2lsbCBiZSBtYXBwZWQgbm9ybWFsbHkgYW5kIGl0CiogICAgICAgIHdpbGwgYWxzbyBnZXQgY29waWVkIHRvIHRoaXMgcG9ydC4KKiAgICAgICAgRnJhbWVzIHRoYXQgZmlsdGVyZWQgb3IgZGlzY2FyZGVkIHdpbGwgbm90IGJlIG1hcHBlZCB0byB0aGUgQ1BVIERlc3RpbmF0aW9uCiogICAgICAgIHBvcnQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBSc3ZkMkNQVSBhbmQgRFNBIFRhZyBjYXNlcy4KKgoqICAgICAgICBJZiBDUFVEZXN0ID0gMHhGLCB0aGUgcmVtYXBwZWQgZnJhbWVzIHdpbGwgYmUgZGlzY2FyZGVkLCBubyBBUlAgbWlycm9yaW5nCiogICAgICAgIHdpbGwgb2NjdXIgYW5kIGluZ3Jlc3NpbmcgVG9fQ1BVIGZyYW1lcyB3aWxsIGJlIGRpc2NhcmRlZC4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIHBvcnQgIC0gdGhlIGxvZ2ljYWwgcG9ydCBudW1iZXIuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRDUFVEZXN0CigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9MUE9SVCAgICAgICpwb3J0CikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldENQVURlc3QgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQ1BVX0RFU1QpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01PTklUT1JfQ09OVFJPTCwgNCwgNCwgJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgaWYoZGF0YSA9PSAweEYpCiAgICB7CiAgICAgICAgKnBvcnQgPSAoR1RfTFBPUlQpZGF0YTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAqcG9ydCA9IEdUX1BPUlRfMl9MUE9SVCgoR1RfVTgpZGF0YSk7CiAgICB9CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0TWlycm9yRGVzdAoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFRoaXMgcm91dGluZSBzZXRzIE1pcnJvciBEZXN0aW5hdGlvbiBQb3J0LiBGcmFtZXMgdGhhdCBpbmdyZXNzIGEgcG9ydAoqICAgICAgICB0aGF0IHRyaWdnZXIgYSBwb2xpY3kgbWlycm9yIGFyZSBtYXBwZWQgKGNvcGllZCkgdG8gdGhpcyBwb3J0IGFzIGxvbmcgYXMKKiAgICAgICAgdGhlIGZyYW1lIGlzIG5vdCBmaWx0ZXJlZCBvciBkaXNjYXJkZWQuCiogICAgICAgIFRoZSBNaXJyb3IgRGVzdGluYXRpb24gcG9ydCBzaG91bGQgcG9pbnQgdG8gdGhlIHBvcnQgdGhhdCBkaXJlY3RzIHRoZXNlCiogICAgICAgIGZyYW1lcyB0byB0aGUgQ1BVIHRoYXQgd2lsbCBwcm9jZXNzIHRoZXNlIGZyYW1lcy4gVGhpcyB0YXJnZXQgcG9ydCBzaG91bGQKKiAgICAgICAgYmUgYSBEU0EgVGFnIHBvcnQgc28gdGhlIGZyYW1lcyB3aWxsIGVncmVzcyB3aXRoIGEgVG9fQ1BVIERTQSBUYWcgd2l0aCBhCiogICAgICAgIENQVSBDb2RlIG9mIFBvbGljeSBNaXJyb3IuCiogICAgICAgIFRvX0NQVSBEU0EgVGFnIGZyYW1lcyB3aXRoIGEgQ1BVIENvZGUgb2YgUG9saWN5IE1pcnJvciB0aGF0IGluZ3Jlc3MgYSBEU0EKKiAgICAgICAgVGFnIHBvcnQgd2lsbCBiZSBzZW50IHRvIHRoZSBwb3J0IG51bWJlciBkZWZpbmVkIGluIE1pcnJvckRlc3QuCioKKiAgICAgICAgSWYgTWlycm9yRGVzdCA9IDB4RiwgUG9saWN5IE1pcnJvcmluZyBpcyBkaXNhYmxlZCBhbmQgaW5ncmVzc2luZyBUb19DUFUKKiAgICAgICAgUG9saWN5IE1pcnJvciBmcmFtZXMgd2lsbCBiZSBkaXNjYXJkZWQuCioKKiBJTlBVVFM6CiogICAgICAgIHBvcnQgIC0gdGhlIGxvZ2ljYWwgcG9ydCBudW1iZXIuCioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0TWlycm9yRGVzdAooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0xQT1JUICAgICAgICBwb3J0CikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VOCAgICAgICAgICAgaHdQb3J0OyAgICAgICAgIC8qIHRoZSBwaHlzaWNhbCBwb3J0IG51bWJlciAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRNaXJyb3JEZXN0IENhbGxlZC5cbiIpKTsKCiAgICAvKiB0cmFuc2xhdGUgTFBPUlQgdG8gaGFyZHdhcmUgcG9ydCAqLwogICAgaHdQb3J0ID0gR1RfTFBPUlRfMl9QT1JUKHBvcnQpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTUlSUk9SX0RFU1QpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIHRyYW5zbGF0ZSBMUE9SVCB0byBoYXJkd2FyZSBwb3J0ICovCiAgICBpZihwb3J0ID09IDB4RikKICAgICAgICBod1BvcnQgPSAoR1RfVTgpcG9ydDsKICAgIGVsc2UKICAgIHsKICAgICAgICBod1BvcnQgPSAoR1RfVTgpKEdUX0xQT1JUXzJfUE9SVChwb3J0KSk7CiAgICAgICAgaWYgKGh3UG9ydCA9PSBHVF9JTlZBTElEX1BPUlQpCiAgICAgICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTU9OSVRPUl9DT05UUk9MLCAwLCA0LCAoR1RfVTE2KWh3UG9ydCk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRNaXJyb3JEZXN0CioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVGhpcyByb3V0aW5lIGdldHMgTWlycm9yIERlc3RpbmF0aW9uIFBvcnQuIEZyYW1lcyB0aGF0IGluZ3Jlc3MgYSBwb3J0CiogICAgICAgIHRoYXQgdHJpZ2dlciBhIHBvbGljeSBtaXJyb3IgYXJlIG1hcHBlZCAoY29waWVkKSB0byB0aGlzIHBvcnQgYXMgbG9uZyBhcwoqICAgICAgICB0aGUgZnJhbWUgaXMgbm90IGZpbHRlcmVkIG9yIGRpc2NhcmRlZC4KKiAgICAgICAgVGhlIE1pcnJvciBEZXN0aW5hdGlvbiBwb3J0IHNob3VsZCBwb2ludCB0byB0aGUgcG9ydCB0aGF0IGRpcmVjdHMgdGhlc2UKKiAgICAgICAgZnJhbWVzIHRvIHRoZSBDUFUgdGhhdCB3aWxsIHByb2Nlc3MgdGhlc2UgZnJhbWVzLiBUaGlzIHRhcmdldCBwb3J0IHNob3VsZAoqICAgICAgICBiZSBhIERTQSBUYWcgcG9ydCBzbyB0aGUgZnJhbWVzIHdpbGwgZWdyZXNzIHdpdGggYSBUb19DUFUgRFNBIFRhZyB3aXRoIGEKKiAgICAgICAgQ1BVIENvZGUgb2YgUG9saWN5IE1pcnJvci4KKiAgICAgICAgVG9fQ1BVIERTQSBUYWcgZnJhbWVzIHdpdGggYSBDUFUgQ29kZSBvZiBQb2xpY3kgTWlycm9yIHRoYXQgaW5ncmVzcyBhIERTQQoqICAgICAgICBUYWcgcG9ydCB3aWxsIGJlIHNlbnQgdG8gdGhlIHBvcnQgbnVtYmVyIGRlZmluZWQgaW4gTWlycm9yRGVzdC4KKgoqICAgICAgICBJZiBNaXJyb3JEZXN0ID0gMHhGLCBQb2xpY3kgTWlycm9yaW5nIGlzIGRpc2FibGVkIGFuZCBpbmdyZXNzaW5nIFRvX0NQVQoqICAgICAgICBQb2xpY3kgTWlycm9yIGZyYW1lcyB3aWxsIGJlIGRpc2NhcmRlZC4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIHBvcnQgIC0gdGhlIGxvZ2ljYWwgcG9ydCBudW1iZXIuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRNaXJyb3JEZXN0CigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9MUE9SVCAgICAgICpwb3J0CikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldE1pcnJvckRlc3QgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQ1BVX0RFU1QpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01PTklUT1JfQ09OVFJPTCwgMCwgNCwgJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgaWYoZGF0YSA9PSAweEYpCiAgICB7CiAgICAgICAgKnBvcnQgPSAoR1RfTFBPUlQpZGF0YTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAqcG9ydCA9IEdUX1BPUlRfMl9MUE9SVCgoR1RfVTgpZGF0YSk7CiAgICB9CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRSTVBvcnQKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBSZW1vdGUgTWFuYWdlbWVudCBmZWF0dXJlIGlzIGVuYWJsZWQgb25seSBvbiBvbmUgcG9ydC4gU2luY2Ugbm90IGFsbCBwb3J0cwoqICAgICAgICBjYW4gYmUgZW5hYmxlZCBmb3IgUmVtb3RlIE1hbmFnZW1lbnQgZmVhdHVyZSwgcGxlYXNlIHJlZmVyIHRvIHRoZSBkZXZpY2UKKiAgICAgICAgZGF0YXNoZWV0IGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KKiAgICAgICAgRm9yIGV4YW1wbGUsIDg4RTYwOTcgZGV2aWNlIGFsbG93cyBsb2dpY2FsIHBvcnQgOSBvciAxMCwgYW5kIDg4RTYwNDcKKiAgICAgICAgZGV2aWNlIGFsbG93cyBsb2dpY2FsIHBvcnQgNCBhbmQgNS4KKgoqIElOUFVUUzoKKiAgICAgICAgcG9ydCAtIFJlbW90ZSBNYW5hZ2VtZW50IFBvcnQKKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfQkFEX1BBUkFNICAgICAtIG9uIHVuYWxsb3dhYmxlIHBvcnQKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE9ic29sZXRlLiBQbGVhc2UgdXNlcyBnc3lzU2V0Uk1VTW9kZSBBUEksIGluc3RlYWQuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRSTVBvcnQKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9MUE9SVCAgICAgcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0Uk1Qb3J0IENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0ZSQU1FX1RPX1JFR0lTVEVSKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9STVVfTU9ERSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogdHJhbnNsYXRlIExQT1JUIHRvIGhhcmR3YXJlIHBvcnQgKi8KICAgIHN3aXRjaChHVF9MUE9SVF8yX1BPUlQocG9ydCkpCiAgICB7CiAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgZGF0YSA9IDA7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgZGF0YSA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgREJHX0lORk8oKCJOb3QgQWxsb3dlZCBQb3J0LlxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBTZXQgdGhlIEYyUiBwb3J0LiAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwxMywxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0Uk1Qb3J0CioKKiBERVNDUklQVElPTjoKKiAgICAgICAgUmVtb3RlIE1hbmFnZW1lbnQgZmVhdHVyZSBpcyBlbmFibGVkIG9ubHkgb24gb25lIHBvcnQuIFNpbmNlIG5vdCBhbGwgcG9ydHMKKiAgICAgICAgY2FuIGJlIGVuYWJsZWQgZm9yIFJlbW90ZSBNYW5hZ2VtZW50IGZlYXR1cmUsIHBsZWFzZSByZWZlciB0byB0aGUgZGV2aWNlCiogICAgICAgIGRhdGFzaGVldCBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24uCiogICAgICAgIEZvciBleGFtcGxlLCA4OEU2MDk3IGRldmljZSBhbGxvd3MgbG9naWNhbCBwb3J0IDkgb3IgMTAsIGFuZCA4OEU2MDQ3CiogICAgICAgIGRldmljZSBhbGxvd3MgbG9naWNhbCBwb3J0IDQgYW5kIDUuCioKKiBJTlBVVFM6CiogICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgICBwb3J0IC0gUmVtb3RlIE1hbmFnZW1lbnQgUG9ydAoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBPYnNvbGV0ZS4gUGxlYXNlIHVzZXMgZ3N5c0dldFJNVU1vZGUgQVBJLCBpbnN0ZWFkLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0Uk1Qb3J0CigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9MUE9SVCAgICAgKnBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJNUG9ydCBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9GUkFNRV9UT19SRUdJU1RFUikpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CiAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfUk1VX01PREUpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgRjJSIHBvcnQuICAgICAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wyLDEzLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgaWYoZGF0YSA9PSAxKQogICAgewogICAgICAgICpwb3J0ID0gR1RfUE9SVF8yX0xQT1JUKDEwKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAqcG9ydCA9IEdUX1BPUlRfMl9MUE9SVCg5KTsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0Uk1EQUNoZWNrCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgQ2hlY2sgdGhlIERBIG9uIFJlbW90ZSBNYW5hZ2VtZW50IGZyYW1lcy4KKiAgICAgICAgV2hlbiBEQSBDaGVjayBpcyBlbmFibGVkLCB0aGUgREEgb2YgUmVtb3RlIE1hbmFnZW1lbnQgZnJhbWVzIG11c3QgYmUKKiAgICAgICAgY29udGFpbmVkIGluIHRoaXMgZGV2aWNlJ3MgYWRkcmVzcyBkYXRhYmFzZSAoQVRVKSBhcyBhIFN0YXRpYyBlbnRyeQoqICAgICAgICAoZWl0aGVyIHVuaWNhc3Qgb3IgbXVsdGljYXN0KS4gSWYgdGhlIERBIG9mIHRoZSBmcmFtZSBpcyBub3QgY29udGFpbmVkCiogICAgICAgIGluIHRoaXMgZGV2aWNlJ3MgYWRkcmVzcyBkYXRhYmFzZSwgdGhlIGZyYW1lIHdpbGwgYmUgbm90IGJlIHByb2Nlc3NlZCBhcwoqICAgICAgICBhIFJlbW90ZSBNYW5hZ2VtZW50IGZyYW1lLgoqICAgICAgICBXaGVuIERBIENoZWNrIGlzIGRpc2FibGVkLCB0aGUgREEgb2YgUmVtb3RlIE1hbmFnZW1lbnQgZnJhbWVzIGlzIG5vdAoqICAgICAgICB2YWxpZGF0ZWQgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGZyYW1lLgoqCiogSU5QVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgdG8gZW5hYmxlIERBIENoZWNrLAoqICAgICAgICAgICAgIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRSTURBQ2hlY2sKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9CT09MICAgICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFJNREFDaGVjayBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9GUkFNRV9UT19SRUdJU1RFUikpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9EQV9DSEVDSykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfREFfQ0hFQ0tfMSkpCiAgICB7CiAgICAgIC8qIFNldCB0aGUgREEgQ2hlY2sgYml0LiAqLwogICAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wyLDExLDEsZGF0YSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qIFNldCB0aGUgREEgQ2hlY2sgYml0LiAqLwogICAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wyLDE0LDEsZGF0YSk7CiAgICB9CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRSTURBQ2hlY2sKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBDaGVjayB0aGUgREEgb24gUmVtb3RlIE1hbmFnZW1lbnQgZnJhbWVzLgoqICAgICAgICBXaGVuIERBIENoZWNrIGlzIGVuYWJsZWQsIHRoZSBEQSBvZiBSZW1vdGUgTWFuYWdlbWVudCBmcmFtZXMgbXVzdCBiZQoqICAgICAgICBjb250YWluZWQgaW4gdGhpcyBkZXZpY2UncyBhZGRyZXNzIGRhdGFiYXNlIChBVFUpIGFzIGEgU3RhdGljIGVudHJ5CiogICAgICAgIChlaXRoZXIgdW5pY2FzdCBvciBtdWx0aWNhc3QpLiBJZiB0aGUgREEgb2YgdGhlIGZyYW1lIGlzIG5vdCBjb250YWluZWQKKiAgICAgICAgaW4gdGhpcyBkZXZpY2UncyBhZGRyZXNzIGRhdGFiYXNlLCB0aGUgZnJhbWUgd2lsbCBiZSBub3QgYmUgcHJvY2Vzc2VkIGFzCiogICAgICAgIGEgRnJhbWUtdG8tUmVndGVyIGZyYW1lLgoqICAgICAgICBXaGVuIERBIENoZWNrIGlzIGRpc2FibGVkLCB0aGUgREEgb2YgUmVtb3RlIE1hbmFnZW1lbnQgZnJhbWVzIGlzIG5vdAoqICAgICAgICB2YWxpZGF0ZWQgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGZyYW1lLgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIGlmIERBIENoZWNrIGlzIGVuYWJsZWQsCiogICAgICAgICAgICAgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0Uk1EQUNoZWNrCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9CT09MICAgICAqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJNREFDaGVjayBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9GUkFNRV9UT19SRUdJU1RFUikpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9EQV9DSEVDSykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBEQSBDaGVjayBiaXQuICAgICAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wyLDE0LDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEhlYWRlclR5cGUKKgoqIERFU0NSSVBUSU9OOgoqICAgVG8gc2V0IEhlYWRlciBUeXBlLiBUaGVzZSBiaXRzIGFyZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYml0cyB0aGF0IGFyZSBwbGFjZWQKKiAgIGludG8gdGhlIEVncmVzcyBIZWFkZXIgd2hlbiBpdCBpcyBlbmFibGVkIG9uIGEgcG9ydCAoUG9ydCBvZmZzZXQgMHgwNCkKKiAgIGFzIGZvbGxvd3M6CiogICAgIDAwID0gT3JpZ2luYWwgSGVhZGVyIJYgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHRvIFVuaU1BQ5JzIHRoYXQgbG9vayBhdAoqICAgICAgICAgIEhlYWRlciBieXRlIDEgYml0c1s0OjJdIGFuZCBieXRlIDIgYml0cyBbMzowXQoqICAgICAwMSA9IFNpbmdsZSBjaGlwIE1HTVQgSGVhZGVyIJYgZm9yIGNvbXBhdGliaWxpdHkgdG8gTWFydmVsbCBGYXN0IEV0aGVybmV0CiogICAgICAgICAgc3dpdGNoZXMgdGhhdCBzdXBwb3J0IFNwYW5uaW5nIFRyZWUgd2l0aG91dCBEU0EgVGFncwoqICAgICAxMCA9IFRydW5rIEhlYWRlciCWIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgRFNBIFRhZ3MgdG8gcGVyZm9ybSBSZW1vdGUgU3dpdGNoaW5nCiogICAgIDExID0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCioKKiBJTlBVVFM6CiogICAgICAgIGhkVHlwZQoqCiogT1VUUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEhlYWRlclR5cGUKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VMTYgICAgICAgaGRUeXBlCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRIZWFkZXJUeXBlIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0hFQURFUl9UWVBFKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBkYXRhID0gaGRUeXBlJjB4MzsKICAgIC8qIFNldCB0aGUgREEgQ2hlY2sgYml0LiAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwxNCwyLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0SGVhZGVyVHlwZQoqCiogREVTQ1JJUFRJT046CiogICBUbyBnZXQgSGVhZGVyIFR5cGUuIFRoZXNlIGJpdHMgYXJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBiaXRzIHRoYXQgYXJlIHBsYWNlZAoqICAgaW50byB0aGUgRWdyZXNzIEhlYWRlciB3aGVuIGl0IGlzIGVuYWJsZWQgb24gYSBwb3J0IChQb3J0IG9mZnNldCAweDA0KQoqICAgYXMgZm9sbG93czoKKiAgICAgMDAgPSBPcmlnaW5hbCBIZWFkZXIgliBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdG8gVW5pTUFDknMgdGhhdCBsb29rIGF0CiogICAgICAgICAgSGVhZGVyIGJ5dGUgMSBiaXRzWzQ6Ml0gYW5kIGJ5dGUgMiBiaXRzIFszOjBdCiogICAgIDAxID0gU2luZ2xlIGNoaXAgTUdNVCBIZWFkZXIgliBmb3IgY29tcGF0aWJpbGl0eSB0byBNYXJ2ZWxsIEZhc3QgRXRoZXJuZXQKKiAgICAgICAgICBzd2l0Y2hlcyB0aGF0IHN1cHBvcnQgU3Bhbm5pbmcgVHJlZSB3aXRob3V0IERTQSBUYWdzCiogICAgIDEwID0gVHJ1bmsgSGVhZGVyIJYgdXNlZCB0b2dldGhlciB3aXRoIHRoZSBEU0EgVGFncyB0byBwZXJmb3JtIFJlbW90ZSBTd2l0Y2hpbmcKKiAgICAgMTEgPSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGhkVHlwZQoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0SGVhZGVyVHlwZQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfVTE2ICAgICAqaGRUeXBlCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXRIZWFkZXJUeXBlIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0hFQURFUl9UWVBFKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgdGhlIERBIENoZWNrIGJpdC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTDIsMTQsMiwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICAqaGRUeXBlID0gZGF0YTsKCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0Uk1FbmFibGUKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBFbmFibGUgb3IgZGlzYWJsZSBSZW1vdGUgTWFuYWdlbWVudCBmZWF0dXJlLiBUaGlzIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQKKiAgICAgICAgb25seSBvbiBvbmUgcG9ydCAoc2VlIGdzeXNTZXRSTVBvcnQgQVBJKS4KKgoqIElOUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIHRvIGVuYWJsZSBSZW1vdGUgTWFuYWdlbWVudCBmZWF0dXJlLAoqICAgICAgICAgICAgIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE9ic29sZXRlLiBQbGVhc2UgdXNlcyBnc3lzU2V0Uk1VTW9kZSBBUEksIGluc3RlYWQuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRSTUVuYWJsZQooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0JPT0wgICAgICAgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0Uk1FbmFibGUgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRlJBTUVfVE9fUkVHSVNURVIpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHRoZSBGMlIgRW4gYml0LiAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwxMiwxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0Uk1FbmFibGUKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBFbmFibGUgb3IgZGlzYWJsZSBSZW1vdGUgTWFuYWdlbWVudCBmZWF0dXJlLiBUaGlzIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQKKiAgICAgICAgb25seSBvbiBvbmUgcG9ydCAoc2VlIGdzeXNTZXRSTVBvcnQgQVBJKS4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGVuIC0gR1RfVFJVRSBpZiBSZW1vdGUgTWFuYWdlbWVudCBmZWF0dXJlIGlzIGVuYWJsZWQsCiogICAgICAgICAgICAgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBPYnNvbGV0ZS4gUGxlYXNlIHVzZXMgZ3N5c0dldFJNVU1vZGUgQVBJLCBpbnN0ZWFkLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0Uk1FbmFibGUKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0Uk1FbmFibGUgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRlJBTUVfVE9fUkVHSVNURVIpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgRjJSIEVuIGJpdC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTDIsMTIsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0Uk1VTW9kZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFNldCBSbW90ZSBNYW5hZ2VtZW50IFVuaXQgTW9kZTogZGlzYWJsZSwgZW5hYmxlIG9uIHBvcnQgNCwgNSBvciA2LCBvciBlbmFibGUKKiAgICAgICAgb24gcG9ydCA5IG9yIDEwLiBEZXZpY2VzLCBzdWNoIGFzIDg4RTYwOTcsIHN1cHBvcnQgUk1VIG9uIHBvcnQgOSBhbmQgMTAsCiogICAgICAgIHdoaWxlIG90aGVyIGRldmljZXMsIHN1Y2ggYXMgODhFNjE2NSwgc3VwcG9ydCBSTVUgb24gcG9ydCA0LCA1IGFuZCA2LiBTbywKKiAgICAgICAgcGxlYXNlIHJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0IGZvciBkZXRhaWwuCiogICAgICAgIFdoZW4gUk1VIGlzIGVuYWJsZWQgYW5kIHRoaXMgZGV2aWNlIHJlY2VpdmVzIGEgUmVtb3RlIE1hbmFnZW1lbnQgUmVxdWVzdAoqICAgICAgICBmcmFtZSBkaXJlY3RlZCB0byB0aGlzIGRldmljZSwgdGhlIGZyYW1lIHdpbGwgYmUgcHJvY2Vzc2VkIGFuZCBhIFJlbW90ZQoqICAgICAgICBNYW5hZ2VtZW50IFJlc3BvbnNlIGZyYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGFuZCBzZW50IG91dC4KKgoqICAgICAgICBOb3RlOiBlbmFibGluZyBSTVUgaGFzIG5vIGVmZmVjdCBpZiB0aGUgUmVtb3RlIE1hbmFnZW1lbnQgcG9ydCBpcyBpbiBoYWxmCiogICAgICAgIGR1cGxleCBtb2RlLiBUaGUgcG9ydCdzIEZyYW1lTW9kZSBtdXN0IGJlIERTQSBvciBFdGhlclR5cGUgRFNBIGFzIHdlbGwuCioKKiBJTlBVVFM6CiogICAgICAgIHJtdSAtIEdUX1JNVSBzdHJ1Y3R1cmUKKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfQkFEX1BBUkFNICAgICAtIG9uIGJhZCBwYXJhbWV0ZXIKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRSTVVNb2RlCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfUk1VICAgICAgICAqcm11CikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBwb3J0OwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFJNVU1vZGUgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRlJBTUVfVE9fUkVHSVNURVIpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9STVVfTU9ERSkpCiAgICB7CiAgICAgICAgaWYgKHJtdS0+cm11RW4gPT0gR1RfVFJVRSkKICAgICAgICB7CiAgICAgICAgICAgIHBvcnQgPSBHVF9MUE9SVF8yX1BPUlQocm11LT5wb3J0KTsKICAgICAgICAgICAgaWYgKHBvcnQgPT0gR1RfSU5WQUxJRF9QT1JUKQogICAgICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKCiAgICAgICAgICAgIHN3aXRjaChwb3J0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IDE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IDI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl84OEU2MzUyX0ZBTUlMWSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IDM7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGRhdGEgPSAwOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAocm11LT5ybXVFbikKICAgICAgICB7CiAgICAgICAgICAgIHBvcnQgPSBHVF9MUE9SVF8yX1BPUlQocm11LT5wb3J0KTsKICAgICAgICAgICAgaWYgKHBvcnQgPT0gR1RfSU5WQUxJRF9QT1JUKQogICAgICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKCiAgICAgICAgICAgIHN3aXRjaChwb3J0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IDE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSAzOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGRhdGEgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBTZXQgdGhlIFJNVU1vZGUgYml0LiAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwxMiwyLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0Uk1VTW9kZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgIEdldCBSbW90ZSBNYW5hZ2VtZW50IFVuaXQgTW9kZTogZGlzYWJsZSwgZW5hYmxlIG9uIHBvcnQgNCwgNSBvciA2LCBvciBlbmFibGUKKiAgICAgICAgb24gcG9ydCA5IG9yIDEwLiBEZXZpY2VzLCBzdWNoIGFzIDg4RTYwOTcsIHN1cHBvcnQgUk1VIG9uIHBvcnQgOSBhbmQgMTAsCiogICAgICAgIHdoaWxlIG90aGVyIGRldmljZXMsIHN1Y2ggYXMgODhFNjE2NSwgc3VwcG9ydCBSTVUgb24gcG9ydCA0LCA1IGFuZCA2LiBTbywKKiAgICAgICAgcGxlYXNlIHJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0IGZvciBkZXRhaWwuCiogICAgICAgIFdoZW4gUk1VIGlzIGVuYWJsZWQgYW5kIHRoaXMgZGV2aWNlIHJlY2VpdmVzIGEgUmVtb3RlIE1hbmFnZW1lbnQgUmVxdWVzdAoqICAgICAgICBmcmFtZSBkaXJlY3RlZCB0byB0aGlzIGRldmljZSwgdGhlIGZyYW1lIHdpbGwgYmUgcHJvY2Vzc2VkIGFuZCBhIFJlbW90ZQoqICAgICAgICBNYW5hZ2VtZW50IFJlc3BvbnNlIGZyYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGFuZCBzZW50IG91dC4KKgoqICAgICAgICBOb3RlOiBlbmFibGluZyBSTVUgaGFzIG5vIGVmZmVjdCBpZiB0aGUgUmVtb3RlIE1hbmFnZW1lbnQgcG9ydCBpcyBpbiBoYWxmCiogICAgICAgIGR1cGxleCBtb2RlLiBUaGUgcG9ydCdzIEZyYW1lTW9kZSBtdXN0IGJlIERTQSBvciBFdGhlclR5cGUgRFNBIGFzIHdlbGwuCioKKiBJTlBVVFM6CiogICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgICBybXUgLSBHVF9STVUgc3RydWN0dXJlCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSTVVNb2RlCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9STVUgICAgICAgICpybXUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJNVU1vZGUgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRlJBTUVfVE9fUkVHSVNURVIpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgUk1VTW9kZSBiaXQuICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wyLDEyLDIsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1JNVV9NT0RFKSkKICAgIHsKICAgICAgICBzd2l0Y2ggKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgcm11LT5ybXVFbiA9IEdUX0ZBTFNFOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgIHJtdS0+cm11RW4gPSBHVF9UUlVFOwogICAgICAgICAgICAgICAgICAgIHJtdS0+cG9ydCA9IEdUX1BPUlRfMl9MUE9SVCg0KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICBybXUtPnJtdUVuID0gR1RfVFJVRTsKICAgICAgICAgICAgICAgICAgICBybXUtPnBvcnQgPSBHVF9QT1JUXzJfTFBPUlQoNSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfODhFNjM1Ml9GQU1JTFkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIHJtdS0+cm11RW4gPSBHVF9UUlVFOwogICAgICAgICAgICAgICAgICAgICAgcm11LT5wb3J0ID0gR1RfUE9SVF8yX0xQT1JUKDYpOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBHVF9GQUlMOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBHVF9GQUlMOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzd2l0Y2ggKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgcm11LT5ybXVFbiA9IEdUX0ZBTFNFOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgIHJtdS0+cm11RW4gPSBHVF9UUlVFOwogICAgICAgICAgICAgICAgICAgIHJtdS0+cG9ydCA9IEdUX1BPUlRfMl9MUE9SVCg5KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICBybXUtPnJtdUVuID0gR1RfVFJVRTsKICAgICAgICAgICAgICAgICAgICBybXUtPnBvcnQgPSBHVF9QT1JUXzJfTFBPUlQoMTApOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBybXUtPnJtdUVuID0gR1RfRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEN0ck1vZGUKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBTZXQgQ291bnRlciBNb2Rlcy4gVGhlc2UgYml0cyBjb250cm9sIHRoZSBvcGVyYXRpbmcgbW9kZXMgb2YgdGhlIHR3byBvZgoqICAgICAgICB0aGUgUG9ydJJzIE1JQiBjb3VudGVycy4KKgoqIElOUFVUUzoKKiAgICAgICAgY3RyTW9kZSAtIENvdW50ZXIgbW9kZQoqCiogT1VUUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9CQURfUEFSQU0gICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEN0ck1vZGUKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VMTYgICAgICAgY3RyTW9kZQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0Q3RyTW9kZSBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DT1VOVEVSX01PREUpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl84OEU2MzUyX0ZBTUlMWSkpCiAgICB7CiAgICAgIGRhdGEgPSBjdHJNb2RlJjB4MzsKICAgICAgLyogU2V0IHRoZSBDb3VudGVyIE1vZGUuICovCiAgICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTDIsNSwyLGRhdGEpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBkYXRhID0gY3RyTW9kZSYweDE7CiAgICAgIC8qIFNldCB0aGUgQ291bnRlciBNb2RlLiAqLwogICAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wyLDAsMSxkYXRhKTsKICAgIH0KCiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRDdHJNb2RlCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgR2V0IENvdW50ZXIgTW9kZXMuIFRoZXNlIGJpdHMgY29udHJvbCB0aGUgb3BlcmF0aW5nIG1vZGVzIG9mIHRoZSB0d28gb2YKKiAgICAgICAgdGhlIFBvcnSScyBNSUIgY291bnRlcnMuCioKKiBJTlBVVFM6CiogICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgICBjdHJNb2RlIC0gQ291bnRlciBtb2RlCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRDdHJNb2RlCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9VMTYgICAgICAgKmN0ck1vZGUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldEN0ck1vZGUgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQ09VTlRFUl9NT0RFKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQ09VTlRFUl9NT0RFKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfODhFNjM1Ml9GQU1JTFkpKQogICAgewogICAgICAvKiBTZXQgdGhlIENvdW50ZXIgTW9kZS4gKi8KICAgICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiw1LDIsICZkYXRhKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLyogU2V0IHRoZSBDb3VudGVyIE1vZGUuICovCiAgICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTDIsMCwxLCAmZGF0YSk7CiAgICB9CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICAqY3RyTW9kZSA9IGRhdGE7CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFJzdmQyQ3B1RW5hYmxlczJYCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgUmVzZXJ2ZWQgREEgRW5hYmxlcyBmb3IgdGhlIGZvcm0gb2YgMDE6ODA6QzI6MDA6MDA6MnguCiogICAgICAgIFdoZW4gdGhlIFJzdmQyQ3B1KGdzeXNTZXRSc3ZkMkNwdSkgaXMgc2V0IHRvIGEgb25lLCB0aGUgMTYgcmVzZXJ2ZWQKKiAgICAgICAgbXVsdGljYXN0IERBIGFkZHJlc3Nlcywgd2hvc2UgYml0IGluIHRoaXMgcmVnaXN0ZXIgYXJlIGFsc28gc2V0IHRvIGEgb25lLAoqICAgICAgICBhcmUgdHJlYWR0ZWQgYXMgTUdNVCBmcmFtZXMuIEFsbCB0aGUgcmVzZXJ2ZWQgREEncyB0YWtlIHRoZSBmb3JtCiogICAgICAgIDAxOjgwOkMyOjAwOjAwOjJ4LiBXaGVuIHggPSAweDAsIGJpdCAwIG9mIHRoaXMgcmVnaXN0ZXIgaXMgdGVzdGVkLgoqICAgICAgICBXaGVuIHggPSAweDIsIGJpdCAyIG9mIHRoaXMgZmllbGQgaXMgdGVzdGVkIGFuZCBzbyBvbi4KKiAgICAgICAgSWYgdGhlIHRlc3RlZCBiaXQgaW4gdGhpcyByZWdpc3RlciBpcyBjbGVhcmVkIHRvIGEgemVybywgdGhlIGZyYW1lIHdpbGwKKiAgICAgICAgYmUgdHJlYXRlZCBhcyBhIG5vcm1hbCAobm9uLU1HTVQpIGZyYW1lLgoqCiogSU5QVVRTOgoqICAgICAgICBlbkJpdHMgLSBiaXQgdmVjdG9yIG9mIGVuYWJsZWQgUmVzZXJ2ZWQgTXVsdGljYXN0LgoqCiogT1VUUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFJzdmQyQ3B1RW5hYmxlczJYCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfVTE2ICAgICAgICBlbkJpdHMKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRSc3ZkMkNwdUVuYWJsZXMyWCBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9FTkhBTkNFRF9NVUxUSUNBU1RfMlgpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIFNldCByZWxhdGVkIHJlZ2lzdGVyICovCiAgICByZXRWYWwgPSBod1dyaXRlR2xvYmFsMlJlZyhkZXYsUURfUkVHX01HTVRfRU5BQkxFXzJYLCAoR1RfVTE2KWVuQml0cyk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRSc3ZkMkNwdUVuYWJsZXMyWAoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFJlc2VydmVkIERBIEVuYWJsZXMgZm9yIHRoZSBmb3JtIG9mIDAxOjgwOkMyOjAwOjAwOjJ4LgoqICAgICAgICBXaGVuIHRoZSBSc3ZkMkNwdShnc3lzU2V0UnN2ZDJDcHUpIGlzIHNldCB0byBhIG9uZSwgdGhlIDE2IHJlc2VydmVkCiogICAgICAgIG11bHRpY2FzdCBEQSBhZGRyZXNzZXMsIHdob3NlIGJpdCBpbiB0aGlzIHJlZ2lzdGVyIGFyZSBhbHNvIHNldCB0byBhIG9uZSwKKiAgICAgICAgYXJlIHRyZWFkdGVkIGFzIE1HTVQgZnJhbWVzLiBBbGwgdGhlIHJlc2VydmVkIERBJ3MgdGFrZSB0aGUgZm9ybQoqICAgICAgICAwMTo4MDpDMjowMDowMDoyeC4gV2hlbiB4ID0gMHgwLCBiaXQgMCBvZiB0aGlzIHJlZ2lzdGVyIGlzIHRlc3RlZC4KKiAgICAgICAgV2hlbiB4ID0gMHgyLCBiaXQgMiBvZiB0aGlzIGZpZWxkIGlzIHRlc3RlZCBhbmQgc28gb24uCiogICAgICAgIElmIHRoZSB0ZXN0ZWQgYml0IGluIHRoaXMgcmVnaXN0ZXIgaXMgY2xlYXJlZCB0byBhIHplcm8sIHRoZSBmcmFtZSB3aWxsCiogICAgICAgIGJlIHRyZWF0ZWQgYXMgYSBub3JtYWwgKG5vbi1NR01UKSBmcmFtZS4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGVuQml0cyAtIGJpdCB2ZWN0b3Igb2YgZW5hYmxlZCBSZXNlcnZlZCBNdWx0aWNhc3QuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSc3ZkMkNwdUVuYWJsZXMyWAooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfVTE2ICAgICAgKmVuQml0cwopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJzdmQyQ3B1RW5hYmxlczJYIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0VOSEFOQ0VEX01VTFRJQ0FTVF8yWCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgcmVnaXN0ZXIgKi8KICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LCBRRF9SRUdfTUdNVF9FTkFCTEVfMlgsIGVuQml0cyk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0TG9vcGJhY2tGaWx0ZXIKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBMb29wYmFjayBGaWx0ZXIuCiogICAgICAgIFdoZW4gTG9vcGJhY2sgRmlsdGVyIGlzIGVuYWJsZWQsRm9yd2FyZCBEU0EgZnJhbWVzIHRoYXQgaW5ncmVzcyBhIERTQSBwb3J0CiogICAgICAgIHRoYXQgY2FtZSBmcm9tIHRoZSBzYW1lIFNyY19EZXYgd2lsbCBiZSBmaWx0ZXJlZCB0byB0aGUgc2FtZSBTcmNfUG9ydCwKKiAgICAgICAgaS5lLiwgdGhlIGZyYW1lIHdpbGwgbm90IGJlIGFsbG93ZWQgdG8gZWdyZXNzIHRoZSBzb3VyY2UgcG9ydCBvbiB0aGUKKiAgICAgICAgc291cmNlIGRldmljZSBhcyBpbmRpY2F0ZWQgaW4gdGhlIERTQSBGb3J3YXJkJ3MgVGFnLgoqCiogSU5QVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgdG8gZW5hYmxlIExvb3BiYWNrRmlsdGVyLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0TG9vcGJhY2tGaWx0ZXIKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9CT09MICAgICAgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgICAgZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNTZXRMb29wYmFja0ZpbHRlciBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTE9PUEJBQ0tfRklMVEVSKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCAxNSwgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRMb29wYmFja0ZpbHRlcgoqCiogREVTQ1JJUFRJT046CiogICAgICAgIExvb3BiYWNrIEZpbHRlci4KKiAgICAgICAgV2hlbiBMb29wYmFjayBGaWx0ZXIgaXMgZW5hYmxlZCxGb3J3YXJkIERTQSBmcmFtZXMgdGhhdCBpbmdyZXNzIGEgRFNBIHBvcnQKKiAgICAgICAgdGhhdCBjYW1lIGZyb20gdGhlIHNhbWUgU3JjX0RldiB3aWxsIGJlIGZpbHRlcmVkIHRvIHRoZSBzYW1lIFNyY19Qb3J0LAoqICAgICAgICBpLmUuLCB0aGUgZnJhbWUgd2lsbCBub3QgYmUgYWxsb3dlZCB0byBlZ3Jlc3MgdGhlIHNvdXJjZSBwb3J0IG9uIHRoZQoqICAgICAgICBzb3VyY2UgZGV2aWNlIGFzIGluZGljYXRlZCBpbiB0aGUgRFNBIEZvcndhcmQncyBUYWcuCioKKiBJTlBVVFM6CiogICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgaWYgTG9vcGJhY2tGaWx0ZXIgaXMgZW5hYmxlZCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0TG9vcGJhY2tGaWx0ZXIKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAgICAqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0TG9vcGJhY2tGaWx0ZXIgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0xPT1BCQUNLX0ZJTFRFUikpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsMTUsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRGbG9vZEJDCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgRmxvb2QgQnJvYWRjYXN0LgoqICAgICAgICBXaGVuIEZsb29kIEJyb2FkY2FzdCBpcyBlbmFibGVkLCBmcmFtZXMgd2l0aCB0aGUgQnJvYWRjYXN0IGRlc3RpbmF0aW9uCiogICAgICAgIGFkZHJlc3Mgd2lsbCBmbG9vZCBvdXQgYWxsIHRoZSBwb3J0cyByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoZQoqICAgICAgICBwb3J0J3MgRWdyZXNzIEZsb29kcyBtb2RlIChzZWUgZ3BydFNldEVncmVzc0Zsb29kIEFQSSkuIFZMQU4gcnVsZXMgYW5kCiogICAgICAgIG90aGVyIHN3aXRjaCBwb2xpY3kgc3RpbGwgYXBwbGllcyB0byB0aGVzZSBCcm9hZGNhc3QgZnJhbWVzLgoqICAgICAgICBXaGVuIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCwgZnJhbWVzIHdpdGggdGhlIEJyb2FkY2FzdCBkZXN0aW5hdGlvbgoqICAgICAgICBhZGRyZXNzIGFyZSBjb25zaWRlcmVkIE11bHRpY2FzdCBmcmFtZXMgYW5kIHdpbGwgYmUgYWZmZWN0ZWQgYnkgcG9ydCdzCiogICAgICAgIEVncmVzcyBGbG9vZHMgbW9kZS4KKgoqIElOUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIHRvIGVuYWJsZSBGbG9vZCBCcm9hZGNhc3QsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRGbG9vZEJDCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfQk9PTCAgICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICAgIGRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0Rmxvb2RCQyBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRkxPT0RfQlJPQURDQVNUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCAxMiwgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRGbG9vZEJDCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgRmxvb2QgQnJvYWRjYXN0LgoqICAgICAgICBXaGVuIEZsb29kIEJyb2FkY2FzdCBpcyBlbmFibGVkLCBmcmFtZXMgd2l0aCB0aGUgQnJvYWRjYXN0IGRlc3RpbmF0aW9uCiogICAgICAgIGFkZHJlc3Mgd2lsbCBmbG9vZCBvdXQgYWxsIHRoZSBwb3J0cyByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoZQoqICAgICAgICBwb3J0J3MgRWdyZXNzIEZsb29kcyBtb2RlIChzZWUgZ3BydFNldEVncmVzc0Zsb29kIEFQSSkuIFZMQU4gcnVsZXMgYW5kCiogICAgICAgIG90aGVyIHN3aXRjaCBwb2xpY3kgc3RpbGwgYXBwbGllcyB0byB0aGVzZSBCcm9hZGNhc3QgZnJhbWVzLgoqICAgICAgICBXaGVuIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCwgZnJhbWVzIHdpdGggdGhlIEJyb2FkY2FzdCBkZXN0aW5hdGlvbgoqICAgICAgICBhZGRyZXNzIGFyZSBjb25zaWRlcmVkIE11bHRpY2FzdCBmcmFtZXMgYW5kIHdpbGwgYmUgYWZmZWN0ZWQgYnkgcG9ydCdzCiogICAgICAgIEVncmVzcyBGbG9vZHMgbW9kZS4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGVuIC0gR1RfVFJVRSBpZiBGbG9vZCBCcm9hZGNhc3QgaXMgZW5hYmxlZCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0Rmxvb2RCQwooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRGbG9vZEJDIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9GTE9PRF9CUk9BRENBU1QpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULDEyLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0UmVtb3ZlMVBUYWcKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBSZW1vdmUgT25lIFByb3ZpZGVyIFRhZy4KKiAgICAgICAgV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgYSBwb3J0IGlzIGNvbmZpZ3VyZWQgYXMgYSBQcm92aWRlciBQb3J0CiogICAgICAgIChzZWUgZ3BydFNldEZyYW1lTW9kZSBBUEkpLCByZWN1cnNpdmUgUHJvdmlkZXIgVGFnIHN0cmlwcGluZyB3aWxsIE5PVCBiZQoqICAgICAgICBwZXJmb3JtZWQuIE9ubHkgdGhlIGZpcnN0IFByb3ZpZGVyIFRhZyBmb3VuZCBvbiB0aGUgZnJhbWUgd2lsbCBiZQoqICAgICAgICBleHRyYWN0ZWQgYW5kIHJlbW92ZWQuIEl0cyBleHRyYWN0ZWQgZGF0YSB3aWxsIGJlIHVzZWQgZm9yIHN3aXRjaGluZy4KKiAgICAgICAgV2hlbiBpdCdzIGRpc2FibGVkIGFuZCBhIHBvcnQgaXMgY29uZmlndXJlZCBhcyBhIFByb3ZpZGVyIFBvcnQsIHJlY3Vyc2l2ZQoqICAgICAgICBQcm92aWRlciBUYWcgc3RyaXBwaW5nIHdpbGwgYmUgcGVyZm9ybWVkLiBUaGUgZmlyc3QgUHJvdmlkZXIgVGFnJ3MgZGF0YQoqICAgICAgICB3aWxsIGJlIGV4dHJhY3RlZCBhbmQgdXNlZCBmb3Igc3dpdGNoaW5nLCBhbmQgdGhlbiBhbGwgc3Vic2VxdWVudCBQcm92aWRlcgoqICAgICAgICBUYWdzIGZvdW5kIGluIHRoZSBmcmFtZSB3aWxsIGFsc28gYmUgcmVtb3ZlZC4gVGhpcyB3aWxsIG9ubHkgb2NjdXIgaWYgdGhlCiogICAgICAgIHBvcnQncyBQb3J0RVR5cGUgKHNlZSBncHJ0U2V0UG9ydEVUeXBlIEFQSSkgaXMgbm90IDB4ODEwMC4KKgoqIElOUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIHRvIGVuYWJsZSBSZW1vdmUgT25lIFByb3ZpZGVyIFRhZywgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFJlbW92ZTFQVGFnCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfQk9PTCAgICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICAgIGRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0UmVtb3ZlMVBUYWcgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1JNX09ORV9QVEFHKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCAxMSwgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0UmVtb3ZlMVBUYWcKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBSZW1vdmUgT25lIFByb3ZpZGVyIFRhZy4KKiAgICAgICAgV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgYSBwb3J0IGlzIGNvbmZpZ3VyZWQgYXMgYSBQcm92aWRlciBQb3J0CiogICAgICAgIChzZWUgZ3BydFNldEZyYW1lTW9kZSBBUEkpLCByZWN1cnNpdmUgUHJvdmlkZXIgVGFnIHN0cmlwcGluZyB3aWxsIE5PVCBiZQoqICAgICAgICBwZXJmb3JtZWQuIE9ubHkgdGhlIGZpcnN0IFByb3ZpZGVyIFRhZyBmb3VuZCBvbiB0aGUgZnJhbWUgd2lsbCBiZQoqICAgICAgICBleHRyYWN0ZWQgYW5kIHJlbW92ZWQuIEl0cyBleHRyYWN0ZWQgZGF0YSB3aWxsIGJlIHVzZWQgZm9yIHN3aXRjaGluZy4KKiAgICAgICAgV2hlbiBpdCdzIGRpc2FibGVkIGFuZCBhIHBvcnQgaXMgY29uZmlndXJlZCBhcyBhIFByb3ZpZGVyIFBvcnQsIHJlY3Vyc2l2ZQoqICAgICAgICBQcm92aWRlciBUYWcgc3RyaXBwaW5nIHdpbGwgYmUgcGVyZm9ybWVkLiBUaGUgZmlyc3QgUHJvdmlkZXIgVGFnJ3MgZGF0YQoqICAgICAgICB3aWxsIGJlIGV4dHJhY3RlZCBhbmQgdXNlZCBmb3Igc3dpdGNoaW5nLCBhbmQgdGhlbiBhbGwgc3Vic2VxdWVudCBQcm92aWRlcgoqICAgICAgICBUYWdzIGZvdW5kIGluIHRoZSBmcmFtZSB3aWxsIGFsc28gYmUgcmVtb3ZlZC4gVGhpcyB3aWxsIG9ubHkgb2NjdXIgaWYgdGhlCiogICAgICAgIHBvcnQncyBQb3J0RVR5cGUgKHNlZSBncHJ0U2V0UG9ydEVUeXBlIEFQSSkgaXMgbm90IDB4ODEwMC4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGVuIC0gR1RfVFJVRSBpZiBSZW1vdmUgT25lIFByb3ZpZGVyIFRhZyBpcyBlbmFibGVkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSZW1vdmUxUFRhZwooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgICBkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJlbW92ZTFQVGFnIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9STV9PTkVfUFRBRykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsIDExLCAxLCAmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0VGFnRmxvd0NvbnRyb2wKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBVc2UgYW5kIGdlbmVyYXRlIHNvdXJjZSBwb3J0IEZsb3cgQ29udHJvbCBzdGF0dXMgZm9yIENyb3NzLUNoaXAgRmxvdwoqICAgICAgICBDb250cm9sLgoqICAgICAgICBXaGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCBiaXQgMTcgb2YgdGhlIERTQSBUYWcgRm9yd2FyZCBmcmFtZXMgaXMKKiAgICAgICAgZGVmaW5lZCB0byBiZSBTcmNfRkMgYW5kIGl0IGlzIGFkZGVkIHRvIHRoZXNlIGZyYW1lcyB3aGVuIGdlbmVyYXRlZCBhbmQKKiAgICAgICAgaXQgaXMgaW5zcGVjdGVkIG9uIHRoZXNlIGZyYW1lcyB3aGVuIHJlY2VpdmVkLiBUaGUgUUMgd2lsbCB1c2UgdGhlIFNyY19GQwoqICAgICAgICBiaXQgb24gRFNBIHBvcnRzIGluc3RlYWQgb2YgdGhlIERTQSBwb3J0J3MgRmxvdyBDb250cm9sIG1vZGUgYml0IGZvciB0aGUKKiAgICAgICAgUUMgRmxvdyBDb250cm9sIGFsZ29yaXRobS4KKiAgICAgICAgV2hlbiBpdCBpcyBkaXNhYmxlZCwgYml0IDE3IG9mIHRoZSBEU0EgVGFnIEZvcndhcmQgZnJhbWVzIGlzIGRlZmluZWQgdG8KKiAgICAgICAgYmUgUmVzZXJ2ZWQgYW5kIGl0IHdpbGwgYmUgemVybyBvbiB0aGVzZSBmcmFtZXMgd2hlbiBnZW5lcmF0ZWQgYW5kIGl0CiogICAgICAgIHdpbGwgbm90IGJlIHVzZWQgb24gdGhlc2UgZnJhbWVzIHdoZW4gcmVjZWl2ZWQgKHRoaXMgaXMgYSBiYWNrd2FyZHMKKiAgICAgICAgY29tcGF0aWJpbGl0eSBtb2RlKS4KKgoqIElOUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIHRvIGVuYWJsZSBUYWcgRmxvdyBDb250cm9sLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0VGFnRmxvd0NvbnRyb2wKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9CT09MICAgICAgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgICAgZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNTZXRUYWdGbG93Q29udHJvbCBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfVEFHX0ZMT1dfQ09OVFJPTCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOQUdFTUVOVCwgOSwgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRUYWdGbG93Q29udHJvbAoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFVzZSBhbmQgZ2VuZXJhdGUgc291cmNlIHBvcnQgRmxvdyBDb250cm9sIHN0YXR1cyBmb3IgQ3Jvc3MtQ2hpcCBGbG93CiogICAgICAgIENvbnRyb2wuCiogICAgICAgIFdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIGJpdCAxNyBvZiB0aGUgRFNBIFRhZyBGb3J3YXJkIGZyYW1lcyBpcwoqICAgICAgICBkZWZpbmVkIHRvIGJlIFNyY19GQyBhbmQgaXQgaXMgYWRkZWQgdG8gdGhlc2UgZnJhbWVzIHdoZW4gZ2VuZXJhdGVkIGFuZAoqICAgICAgICBpdCBpcyBpbnNwZWN0ZWQgb24gdGhlc2UgZnJhbWVzIHdoZW4gcmVjZWl2ZWQuIFRoZSBRQyB3aWxsIHVzZSB0aGUgU3JjX0ZDCiogICAgICAgIGJpdCBvbiBEU0EgcG9ydHMgaW5zdGVhZCBvZiB0aGUgRFNBIHBvcnQncyBGbG93IENvbnRyb2wgbW9kZSBiaXQgZm9yIHRoZQoqICAgICAgICBRQyBGbG93IENvbnRyb2wgYWxnb3JpdGhtLgoqICAgICAgICBXaGVuIGl0IGlzIGRpc2FibGVkLCBiaXQgMTcgb2YgdGhlIERTQSBUYWcgRm9yd2FyZCBmcmFtZXMgaXMgZGVmaW5lZCB0bwoqICAgICAgICBiZSBSZXNlcnZlZCBhbmQgaXQgd2lsbCBiZSB6ZXJvIG9uIHRoZXNlIGZyYW1lcyB3aGVuIGdlbmVyYXRlZCBhbmQgaXQKKiAgICAgICAgd2lsbCBub3QgYmUgdXNlZCBvbiB0aGVzZSBmcmFtZXMgd2hlbiByZWNlaXZlZCAodGhpcyBpcyBhIGJhY2t3YXJkcwoqICAgICAgICBjb21wYXRpYmlsaXR5IG1vZGUpLgoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIGlmIFRhZyBGbG93IENvbnRyb2wgaXMgZW5hYmxlZCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0VGFnRmxvd0NvbnRyb2wKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAgICAqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0VGFnRmxvd0NvbnRyb2wgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1RBR19GTE9XX0NPTlRST0wpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULDksMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRBbHdheXNVc2VWVFUKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBBbHdheXMgdXNlIFZUVS4KKiAgICAgICAgV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgVlRVIGhpdCBkYXRhIHdpbGwgYmUgdXNlZCB0byBtYXAgZnJhbWVzCiogICAgICAgIGV2ZW4gaWYgODAyLjFRIGlzIERpc2FibGVkIG9uIHRoZSBwb3J0LgoqICAgICAgICBXaGVuIGl0J3MgZGlzYWJsZWQsIGRhdGEgd2lsbCBiZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBmcmFtZXMgb24gcG9ydHMKKiAgICAgICAgd2hlcmUgODAyLjFRIGlzIERpc2FibGVkLgoqCiogSU5QVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgdG8gdXNlIFZUVSBhbHdheXMsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRBbHdheXNVc2VWVFUKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9CT09MICAgICAgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgICAgZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNTZXRBbHdheXNVc2VWVFUgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0FMV0FZU19VU0VfVlRVKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCA4LCAxLCBkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldEFsd2F5c1VzZVZUVQoqCiogREVTQ1JJUFRJT046CiogICAgICAgIEFsd2F5cyB1c2UgVlRVLgoqICAgICAgICBXaGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCBWVFUgaGl0IGRhdGEgd2lsbCBiZSB1c2VkIHRvIG1hcCBmcmFtZXMKKiAgICAgICAgZXZlbiBpZiA4MDIuMVEgaXMgRGlzYWJsZWQgb24gdGhlIHBvcnQuCiogICAgICAgIFdoZW4gaXQncyBkaXNhYmxlZCwgZGF0YSB3aWxsIGJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGZyYW1lcyBvbiBwb3J0cwoqICAgICAgICB3aGVyZSA4MDIuMVEgaXMgRGlzYWJsZWQuCioKKiBJTlBVVFM6CiogICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgaWYgVlRVIGlzIGFsd2F5cyB1c2VkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRBbHdheXNVc2VWVFUKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAgICAqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0QWx3YXlzVXNlVlRVIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9BTFdBWVNfVVNFX1ZUVSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsOCwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFFWbGFuc09ubHkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICA4MDIuMVEgVkxBTnMgT25seS4KKiAgICAgICAgV2hlbiB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQsIHRoZSBlZ3Jlc3MgbWFwcGluZyBvZiB0aGUgZnJhbWUgaXMKKiAgICAgICAgbGltaXRlZCBieSB0aGUgZnJhbWUncyBWSUQgKHVzaW5nIHRoZSBNZW1iZXJUYWcgZGF0YSBmb3VuZCBpbiB0aGUgVlRVKQoqICAgICAgICB0b2dldGhlciB3aXRoIHRoZSBwb3J0IGJhc2VkIFZMQU5zICh1c2luZyB0aGUgc291cmNlIHBvcnQncyBQb3J0VkxBTlRhYmxlLAoqICAgICAgICBndmxuU2V0UG9ydFZsYW5Qb3J0cyBBUEkpLiBUaGUgdHdvIG1ldGhvZHMgYXJlIGFsd2F5cyB1c2VkIHRvZ2V0aGVyIGluCiogICAgICAgIHRoaXMgbW9kZS4KKiAgICAgICAgV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgdGhlIGVncmVzcyBtYXBwaW5nIG9mIHRoZSBmcmFtZSBpcyBsaW1pdGllZAoqICAgICAgICBieSB0aGUgZnJhbWUncyBWSUQgb25seSwgaWYgdGhlIFZJRCB3YXMgZm91bmQgaW4gdGhlIFZUVS4gSWYgdGhlIGZyYW1lJ3MKKiAgICAgICAgVklEIHdhcyBub3QgZm91bmQgaW4gdGhlIFZUVSB0aGUgZWdyZXNzIG1hcHBpbmcgb2YgdGhlIGZyYW1lIGlzIGxpbWl0ZWQKKiAgICAgICAgYnkgdGhlIHNvdXJjZSBwb3J0J3MgUG9ydFZMQU5UYWJsZSBvbmx5LiBUaGUgdHdvIG1ldGhvZHMgYXJlIG5ldmVyCiogICAgICAgIHVzZWQgdG9nZXRoZXIgaW4gdGhpcyBtb2RlLgoqCiogSU5QVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgdG8gdXNlIDgwMi4xUSBWbGFuIE9ubHkgZmVhdHVyZSwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFFWbGFuc09ubHkKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9CT09MICAgICAgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgICAgZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNTZXRRVmxhbnNPbmx5IENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9RVkxBTl9PTkxZKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TREVUX1BPTEFSSVRZLCAxNSwgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRRVmxhbnNPbmx5CioKKiBERVNDUklQVElPTjoKKiAgICAgICAgODAyLjFRIFZMQU5zIE9ubHkuCiogICAgICAgIFdoZW4gdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkLCB0aGUgZWdyZXNzIG1hcHBpbmcgb2YgdGhlIGZyYW1lIGlzCiogICAgICAgIGxpbWl0ZWQgYnkgdGhlIGZyYW1lJ3MgVklEICh1c2luZyB0aGUgTWVtYmVyVGFnIGRhdGEgZm91bmQgaW4gdGhlIFZUVSkKKiAgICAgICAgdG9nZXRoZXIgd2l0aCB0aGUgcG9ydCBiYXNlZCBWTEFOcyAodXNpbmcgdGhlIHNvdXJjZSBwb3J0J3MgUG9ydFZMQU5UYWJsZSwKKiAgICAgICAgZ3ZsblNldFBvcnRWbGFuUG9ydHMgQVBJKS4gVGhlIHR3byBtZXRob2RzIGFyZSBhbHdheXMgdXNlZCB0b2dldGhlciBpbgoqICAgICAgICB0aGlzIG1vZGUuCiogICAgICAgIFdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIHRoZSBlZ3Jlc3MgbWFwcGluZyBvZiB0aGUgZnJhbWUgaXMgbGltaXRpZWQKKiAgICAgICAgYnkgdGhlIGZyYW1lJ3MgVklEIG9ubHksIGlmIHRoZSBWSUQgd2FzIGZvdW5kIGluIHRoZSBWVFUuIElmIHRoZSBmcmFtZSdzCiogICAgICAgIFZJRCB3YXMgbm90IGZvdW5kIGluIHRoZSBWVFUgdGhlIGVncmVzcyBtYXBwaW5nIG9mIHRoZSBmcmFtZSBpcyBsaW1pdGVkCiogICAgICAgIGJ5IHRoZSBzb3VyY2UgcG9ydCdzIFBvcnRWTEFOVGFibGUgb25seS4gVGhlIHR3byBtZXRob2RzIGFyZSBuZXZlcgoqICAgICAgICB1c2VkIHRvZ2V0aGVyIGluIHRoaXMgbW9kZS4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGVuIC0gR1RfVFJVRSBpZiA4MDIuMVEgVmxhbiBPbmx5IGZlYXR1cmUgaXMgZW5hYmxlZCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0UVZsYW5zT25seQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRRVmxhbnNPbmx5IENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9RVkxBTl9PTkxZKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfU0RFVF9QT0xBUklUWSwxNSwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldDVCaXRQb3J0CioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVXNlIDUgYml0cyBmb3IgUG9ydCBkYXRhIGluIHRoZSBQb3J0IFZMQU4gVGFibGUgKFBWVCkuCiogICAgICAgIFdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIHRoZSA5IGJpdHMgdXNlZCB0byBhY2Nlc3MgdGhlIFBWVCBtZW1vcnkgaXM6CiogICAgICAgICAgICBBZGRyWzg6NV0gPSBTb3VyY2UgRGV2aWNlWzM6MF0gb3IgRGV2aWNlIE51bWJlclszOjBdCiogICAgICAgICAgICBBZGRyWzQ6MF0gPSBTb3VyY2UgUG9ydC9UcnVua1s0OjBdCiogICAgICAgIFdoZW4gaXQncyBkaXNhYmxlZCwgdGhlIDkgYml0cyB1c2VkIHRvIGFjY2VzcyB0aGUgUFZUIG1lbW9yeSBpczoKKiAgICAgICAgICAgIEFkZHJbODo0XSA9IFNvdXJjZSBEZXZpY2VbNDowXSBvciBEZXZpY2UgTnVtYmVyWzQ6MF0KKiAgICAgICAgICAgIEFkZHJbMzowXSA9IFNvdXJjZSBQb3J0L1RydW5rWzM6MF0KKgoqIElOUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIHRvIHVzZSA1IGJpdCBhcyBhIFNvdXJjZSBwb3J0IGluIFBWVCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldDVCaXRQb3J0CigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfQk9PTCAgICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICAgIGRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0NUJpdFBvcnQgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWXzVCSVRfUE9SVCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfU0RFVF9QT0xBUklUWSwgMTQsIDEsIGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0NUJpdFBvcnQKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBVc2UgNSBiaXRzIGZvciBQb3J0IGRhdGEgaW4gdGhlIFBvcnQgVkxBTiBUYWJsZSAoUFZUKS4KKiAgICAgICAgV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgdGhlIDkgYml0cyB1c2VkIHRvIGFjY2VzcyB0aGUgUFZUIG1lbW9yeSBpczoKKiAgICAgICAgICAgIEFkZHJbODo1XSA9IFNvdXJjZSBEZXZpY2VbMzowXSBvciBEZXZpY2UgTnVtYmVyWzM6MF0KKiAgICAgICAgICAgIEFkZHJbNDowXSA9IFNvdXJjZSBQb3J0L1RydW5rWzQ6MF0KKiAgICAgICAgV2hlbiBpdCdzIGRpc2FibGVkLCB0aGUgOSBiaXRzIHVzZWQgdG8gYWNjZXNzIHRoZSBQVlQgbWVtb3J5IGlzOgoqICAgICAgICAgICAgQWRkcls4OjRdID0gU291cmNlIERldmljZVs0OjBdIG9yIERldmljZSBOdW1iZXJbNDowXQoqICAgICAgICAgICAgQWRkclszOjBdID0gU291cmNlIFBvcnQvVHJ1bmtbMzowXQoqCiogSU5QVVRTOgoqICAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICAgZW4gLSBHVF9UUlVFIGlmIDUgYml0IGlzIHVzZWQgYXMgYSBTb3VyY2UgUG9ydCBpbiBQVlQsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldDVCaXRQb3J0CigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9CT09MICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXQ1Qml0UG9ydCBDYWxsZWQuXG4iKSk7CgogICAgLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KICAgIGlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfNUJJVF9QT1JUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfU0RFVF9QT0xBUklUWSwxNCwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKCiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRTREVUUG9sYXJpdHkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgICBTREVUIChTaWduYWwgRGV0ZWN0KSBQb2xhcml0eSBzZWxlY3QgYml0cyBmb3IgZWFjaCBwb3J0LgoqICAgICAgICBCaXQgMTAgaXMgZm9yIFBvcnQgMTAsIGJpdCA5IGlzIGZvciBQb3J0IDksIGV0Yy4gU0RFVCBpcyB1c2VkIHRvIGhlbHAKKiAgICAgICAgZGV0ZXJtaW5lIGxpbmsgb24gZmliZXIgcG9ydHMuIFRoaXMgYml0IGFmZmVjdHMgdGhlIGFjdGl2ZSBsZXZlbCBvZiBhCiogICAgICAgIHBvcnQncyBTREVUIHBpbnMgYXMgZm9sbG93czoKKiAgICAgICAgICAgIDAgPSBTREVUIGlzIGFjdGl2ZSBsb3cuIEEgbG93IGxldmVsIG9uIHRoZSBwb3J0J3MgU0RFVCBwaW4gaXMKKiAgICAgICAgICAgICAgICByZXF1aXJlZCBmb3IgbGluayB0byBvY2N1ci4KKiAgICAgICAgICAgIDEgPSBTREVUIGlzIGFjdGl2ZSBoaWdoLiBBIGhpZ2ggbGV2ZWwgb24gdGhlIHBvcnSScyBTREVUIHBpbiBpcwoqICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvciBsaW5rIHRvIG9jY3VyLgoqICAgICAgICBTREVUIGlzIHVzZWQgd2hlbiB0aGUgcG9ydCBpcyBjb25maWd1cmVkIGFzIGEgZmliZXIgcG9ydC4gSW4gYWxsIG90aGVyCiogICAgICAgIHBvcnQgbW9kZXMgdGhlIFNERVQgcGlucyBhcmUgaWdub3JlZCBhbmQgdGhlc2UgYml0cyBoYXZlIG5vIGVmZmVjdC4KKgoqIElOUFVUUzoKKiAgICAgICAgc2RldFZlYyAtIFNERVQgUG9sYXJpdHkgZm9yIGVhY2ggcG9ydCBpbiBWZWN0b3IgZm9ybWF0CioKKiBPVVRQVVRTOgoqICAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX0JBRF9QQVJBTSAtIGlmIHNkZXRWZWMgaXMgaW52YWxpZAoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFNERVRQb2xhcml0eQooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX1UzMiAgICAgICAgICBzZGV0VmVjCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRTREVUUG9sYXJpdHkgQ2FsbGVkLlxuIikpOwoKICAgIC8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgICBpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NERVRfUE9MQVJJVFkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwogICAgICAgIHJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIGlmICgoR1RfVTE2KXNkZXRWZWMgPiAoKDEgPDwgZGV2LT5udW1PZlBvcnRzKSAtIDEpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfQkFEX1BBUkFNIFxuIikpOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgZGF0YSA9IChHVF9VMTYpR1RfTFBPUlRWRUNfMl9QT1JUVkVDKHNkZXRWZWMpOwoKICAgIGlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9MSU1JVEVEX1NERVQpKQogICAgewogICAgICAgIGlmIChkYXRhICYgKH4weDMwKSkgICAgLyogb25seSBwb3J0IDQgYW5kIDUgb2YgdGhpcyBkZXZpY2Ugc3VwcG9ydCBTREVUICovCiAgICAgICAgewogICAgICAgICAgICBEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSBcbiIpKTsKICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgICAgICB9CiAgICB9CgogICAgLyogU2V0IHRoZSByZWxhdGVkIGJpdHMuICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1NERVRfUE9MQVJJVFksMCxkZXYtPm1heFBvcnRzLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0U0RFVFBvbGFyaXR5CioKKiBERVNDUklQVElPTjoKKiAgICAgICAgU0RFVCAoU2lnbmFsIERldGVjdCkgUG9sYXJpdHkgc2VsZWN0IGJpdHMgZm9yIGVhY2ggcG9ydC4KKiAgICAgICAgQml0IDEwIGlzIGZvciBQb3J0IDEwLCBiaXQgOSBpcyBmb3IgUG9ydCA5LCBldGMuIFNERVQgaXMgdXNlZCB0byBoZWxwCiogICAgICAgIGRldGVybWluZSBsaW5rIG9uIGZpYmVyIHBvcnRzLiBUaGlzIGJpdCBhZmZlY3RzIHRoZSBhY3RpdmUgbGV2ZWwgb2YgYQoqICAgICAgICBwb3J0J3MgU0RFVCBwaW5zIGFzIGZvbGxvd3M6CiogICAgICAgICAgICAwID0gU0RFVCBpcyBhY3RpdmUgbG93LiBBIGxvdyBsZXZlbCBvbiB0aGUgcG9ydCdzIFNERVQgcGluIGlzCiogICAgICAgICAgICAgICAgcmVxdWlyZWQgZm9yIGxpbmsgdG8gb2NjdXIuCiogICAgICAgICAgICAxID0gU0RFVCBpcyBhY3RpdmUgaGlnaC4gQSBoaWdoIGxldmVsIG9uIHRoZSBwb3J0knMgU0RFVCBwaW4gaXMKKiAgICAgICAgICAgICAgICByZXF1aXJlZCBmb3IgbGluayB0byBvY2N1ci4KKiAgICAgICAgU0RFVCBpcyB1c2VkIHdoZW4gdGhlIHBvcnQgaXMgY29uZmlndXJlZCBhcyBhIGZpYmVyIHBvcnQuIEluIGFsbCBvdGhlcgoqICAgICAgICBwb3J0IG1vZGVzIHRoZSBTREVUIHBpbnMgYXJlIGlnbm9yZWQgYW5kIHRoZXNlIGJpdHMgaGF2ZSBubyBlZmZlY3QuCioKKiBJTlBVVFM6CiogICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgICBzZGV0VmVjIC0gU0RFVCBQb2xhcml0eSBmb3IgZWFjaCBwb3J0IGluIFZlY3RvciBmb3JtYXQKKgoqIFJFVFVSTlM6CiogICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqICAgICAgICBHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFNERVRQb2xhcml0eQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfVTMyICAgICAgKnNkZXRWZWMKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0U0RFVFBvbGFyaXR5IENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9TREVUX1BPTEFSSVRZKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgdGhlIHJlbGF0ZWQgYml0cy4gKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfU0RFVF9QT0xBUklUWSwwLGRldi0+bWF4UG9ydHMsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX0xJTUlURURfU0RFVCkpCiAgICB7CiAgICAgICAgZGF0YSAmPSAweDMwOwogICAgfQoKICAgICpzZGV0VmVjID0gR1RfUE9SVFZFQ18yX0xQT1JUVkVDKGRhdGEpOwoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRBUlB3b0JDCioKKiBERVNDUklQVElPTjoKKiAgICAgICBBUlAgZGV0ZWN0aW9uIHdpdGhvdXQgQnJvYWRjYXN0IGNoZWNraW5nLiBXaGVuIGVuYWJsZWQgdGhlIHN3aXRjaCBjb3JlCiogICAgICAgZG9lcyBub3QgY2hlY2sgZm9yIGEgQnRvYWRjYXN0IE1BQyBhZGRyZXNzIGFzIHBhcnQgb2YgdGhlIEFSUCBmcmFtZQoqICAgICAgIGRldGVjdGlvbi4gSXQgb25seSBjaGVja2VzIHRoZSBFdGhlciBUeXBlICgweDA4MDYpLgoqCiogSU5QVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSB0byBlbmFibGUsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRBUlB3b0JDCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOICBHVF9CT09MICAgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBEYXRhIHRvIGJlIHNldCBpbnRvIHRoZSAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAqLwogICAgREJHX0lORk8oKCJzeXNTZXRBUlB3b0JDIENhbGxlZC5cbiIpKTsKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHRoZSBEaXNjYXJkIEV4aXNzaXZlIGJpdC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxMiwxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRBUlB3b0JDCioKKiBERVNDUklQVElPTjoKKiAgICAgICBBUlAgZGV0ZWN0aW9uIHdpdGhvdXQgQnJvYWRjYXN0IGNoZWNraW5nLiBXaGVuIGVuYWJsZWQgdGhlIHN3aXRjaCBjb3JlCiogICAgICAgZG9lcyBub3QgY2hlY2sgZm9yIGEgQnRvYWRjYXN0IE1BQyBhZGRyZXNzIGFzIHBhcnQgb2YgdGhlIEFSUCBmcmFtZQoqICAgICAgIGRldGVjdGlvbi4gSXQgb25seSBjaGVja2VzIHRoZSBFdGhlciBUeXBlICgweDA4MDYpLgoqCiogSU5QVVRTOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSBpZiBlbmFibGVkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgICAgICAgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9CQURfUEFSQU0gICAgLSBvbiBiYWQgcGFyYW1ldGVyCiogICAgICAgR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRBUlB3b0JDCigKICAgIElOICBHVF9RRF9ERVYgICAgICpkZXYsCiAgICBJTiAgR1RfQk9PTCAgICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXRBUlB3b0JDIENhbGxlZC5cbiIpKTsKICAgIGlmKGVuID09IE5VTEwpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCiAgICAvKiBHZXQgdGhlIGJpdC4gKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxMiwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldENMSzEyNUVuCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgQ2xvY2sgMTI1TUh6IEVuYWJsZS4KKiAgICAgICAgV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgdGhlIENMSzEyNSBwaW4gaGFzIGEgZnJlZSBydW5uaW5nIDEyNSBNSHoKKiAgICAgICAgY2xvY2sgb3V0cHV0LgoqICAgICAgICBXaGVuIGl0J3MgZGlzYWJsZWQsIHRoZSBDTEsxMjUgcGluIHdpbGwgYmUgaW4gdHJpLXN0YXRlLgoqCiogSU5QVVRTOgoqICAgICAgICBlbiAtIEdUX1RSVUUgdG8gZW5hYmxlIDEyNSBNSHogY2xvY2ssIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKiAgICAgICAgR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRDTEsxMjVFbgooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0JPT0wgICAgICAgIGVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgICBkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldENMSzEyNUVuIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DTEtfMTI1KSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TREVUX1BPTEFSSVRZLCAxMSwgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRDTEsxMjVFbgoqCiogREVTQ1JJUFRJT046CiogICAgICAgIENsb2NrIDEyNU1IeiBFbmFibGUuCiogICAgICAgIFdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIHRoZSBDTEsxMjUgcGluIGhhcyBhIGZyZWUgcnVubmluZyAxMjUgTUh6CiogICAgICAgIGNsb2NrIG91dHB1dC4KKiAgICAgICAgV2hlbiBpdCdzIGRpc2FibGVkLCB0aGUgQ0xLMTI1IHBpbiB3aWxsIGJlIGluIHRyaS1zdGF0ZS4KKgoqIElOUFVUUzoKKiAgICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgIGVuIC0gR1RfVFJVRSBpZiAxMjVNSHogY2xvY2sgaXMgZW5hYmxlZCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCiogICAgICAgIEdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0Q0xLMTI1RW4KKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAgICAqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldENMSzEyNUVuIENhbGxlZC5cbiIpKTsKCiAgICAvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwogICAgaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DTEtfMTI1KSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfU0RFVF9QT0xBUklUWSwxMSwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKCiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNQb3J0Mkxwb3J0CioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVGhpcyByb3V0aW5lIGNvbnZlcnRzIHBoeXNpY2FsIHBvcnQgbnVtYmVyIHRvIGxvZ2ljYWwgcG9ydCBudW1iZXIuCioKKiBJTlBVVFM6CiogICAgICAgIHBvcnQgLSBwaHlzaWNhbCBwb3J0IG51bWJlcgoqCiogT1VUUFVUUzoKKiAgICAgICAgbHBvcnQgLSBsb2dpY2FsIHBvcnQgbnVtYmVyCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzUG9ydDJMcG9ydAooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBJTiAgR1RfVTMyICAgICAgICAgcG9ydCwKICAgIE9VVCBHVF9MUE9SVCAgICAqbHBvcnQKKQp7CiAgICBEQkdfSU5GTygoImdzeXNQb3J0Mkxwb3J0IENhbGxlZC5cbiIpKTsKCiAgICBpZiAocG9ydCA+IDB4RkYpCiAgICB7CiAgICAgICAgcmV0dXJuIEdUX0ZBSUw7CiAgICB9CgogICAgKmxwb3J0ID0gR1RfUE9SVF8yX0xQT1JUKChHVF9VOClwb3J0KTsKCiAgICBpZiAoKmxwb3J0ID09IEdUX0lOVkFMSURfUE9SVCkKICAgIHsKICAgICAgICByZXR1cm4gR1RfRkFJTDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNMcG9ydDJQb3J0CioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVGhpcyByb3V0aW5lIGNvbnZlcnRzIGxvZ2ljYWwgcG9ydCBudW1iZXIgdG8gcGh5c2ljYWwgcG9ydCBudW1iZXIuCioKKiBJTlBVVFM6CiogICAgICAgIGxwb3J0IC0gbG9naWNhbCBwb3J0IG51bWJlcgoqCiogT1VUUFVUUzoKKiAgICAgICAgcG9ydCAtIHBoeXNpY2FsIHBvcnQgbnVtYmVyCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzTHBvcnQyUG9ydAooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBJTiAgR1RfTFBPUlQgICAgbHBvcnQsCiAgICBPVVQgR1RfVTMyICAgICAgICAgKnBvcnQKKQp7CiAgICBEQkdfSU5GTygoImdzeXNMcG9ydDJQb3J0IENhbGxlZC5cbiIpKTsKCiAgICAqcG9ydCA9IChHVF9VMzIpR1RfTFBPUlRfMl9QT1JUKGxwb3J0KTsKCiAgICBpZiAoKnBvcnQgPT0gR1RfSU5WQUxJRF9QT1JUKQogICAgewogICAgICAgIHJldHVybiBHVF9GQUlMOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNQb3J0dmVjMkxwb3J0dmVjCioKKiBERVNDUklQVElPTjoKKiAgICAgICAgVGhpcyByb3V0aW5lIGNvbnZlcnRzIHBoeXNpY2FsIHBvcnQgdmVjdG9yIHRvIGxvZ2ljYWwgcG9ydCB2ZWN0b3IuCioKKiBJTlBVVFM6CiogICAgICAgIHBvcnR2ZWMgLSBwaHlzaWNhbCBwb3J0IHZlY3RvcgoqCiogT1VUUFVUUzoKKiAgICAgICAgbHBvcnR2ZWMgLSBsb2dpY2FsIHBvcnQgdmVjdG9yCioKKiBSRVRVUk5TOgoqICAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzUG9ydHZlYzJMcG9ydHZlYwooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBJTiAgR1RfVTMyICAgICAgICBwb3J0dmVjLAogICAgT1VUIEdUX1UzMiAgICAgICAgICpscG9ydHZlYwopCnsKICAgIERCR19JTkZPKCgiZ3N5c1BvcnR2ZWMyTHBvcnR2ZWMgQ2FsbGVkLlxuIikpOwoKICAgIGlmIChwb3J0dmVjICYgKH4oKEdUX1UzMilkZXYtPnZhbGlkUG9ydFZlYykpKQogICAgewogICAgICAgIHJldHVybiBHVF9GQUlMOwogICAgfQoKICAgICpscG9ydHZlYyA9IEdUX1BPUlRWRUNfMl9MUE9SVFZFQyhwb3J0dmVjKTsKCiAgICBpZiAoKmxwb3J0dmVjID09IEdUX0lOVkFMSURfUE9SVF9WRUMpCiAgICB7CiAgICAgICAgcmV0dXJuIEdUX0ZBSUw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzTHBvcnR2ZWMyUG9ydHZlYwoqCiogREVTQ1JJUFRJT046CiogICAgICAgIFRoaXMgcm91dGluZSBjb252ZXJ0cyBsb2dpY2FsIHBvcnQgdmVjdG9yIHRvIHBoeXNpY2FsIHBvcnQgdmVjdG9yLgoqCiogSU5QVVRTOgoqICAgICAgICBscG9ydHZlYyAtIGxvZ2ljYWwgcG9ydCB2ZWN0b3IKKgoqIE9VVFBVVFM6CiogICAgICAgIHBvcnR2ZWMgLSBwaHlzaWNhbCBwb3J0IHZlY3RvcgoqCiogUkVUVVJOUzoKKiAgICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0xwb3J0dmVjMlBvcnR2ZWMKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gIEdUX1UzMiAgICAgICAgbHBvcnR2ZWMsCiAgICBPVVQgR1RfVTMyICAgICAgICAgKnBvcnR2ZWMKKQp7CiAgICBEQkdfSU5GTygoImdzeXNMcG9ydHZlYzJQb3J0dmVjIENhbGxlZC5cbiIpKTsKCiAgICAqcG9ydHZlYyA9IEdUX0xQT1JUVkVDXzJfUE9SVFZFQyhscG9ydHZlYyk7CgogICAgaWYgKCpwb3J0dmVjID09IEdUX0lOVkFMSURfUE9SVF9WRUMpCiAgICB7CiAgICAgICAgcmV0dXJuIEdUX0ZBSUw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogSW50ZXJuYWwgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBXcml0ZSB0byBTd2l0Y2ggTUFDL1dvbCBNQUMgUmVnaXN0ZXIKICovCnN0YXRpYyBHVF9TVEFUVVMgd3JpdGVTd2l0Y2hNYWNXb2xSZWcKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VOCAgICAgICAgYmFzZWlkLAogICAgSU4gR1RfRVRIRVJBRERSICptYWMKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgIC8qIHRlbXBvcmFyeSBEYXRhIHN0b3JhZ2UgKi8KICAgIEdUX1UxNiAgICAgICAgICAgIGk7CgogICAgZm9yIChpPTA7IGk8R1RfRVRIRVJORVRfSEVBREVSX1NJWkU7IGkrKykKICAgIHsKICAgICAgICAvKiBXYWl0IHVudGlsIHRoZSBkZXZpY2UgaXMgcmVhZHkuICovCiNpZmRlZiBHVF9STUdNVF9BQ0NFU1MKICAgIHsKICAgICAgSFdfREVWX1JFR19BQ0NFU1MgcmVnQWNjZXNzOwoKICAgICAgcmVnQWNjZXNzLmVudHJpZXMgPSAxOwoKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmNtZCA9IEhXX1JFR19XQUlUX1RJTExfMDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmFkZHIgPSBDQUxDX1NNSV9ERVZfQUREUihkZXYsIDAsIEdMT0JBTDJfUkVHX0FDQ0VTUyk7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5yZWcgPSBRRF9SRUdfU1dJVENIX01BQzsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmRhdGEgPSAxNTsKICAgICAgcmV0VmFsID0gaHdBY2Nlc3NNdWx0aVJlZ3MoZGV2LCAmcmVnQWNjZXNzKTsKICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICB7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgfQogICAgfQojZWxzZQogICAgICAgIGRhdGEgPSAxOwogICAgICAgIHdoaWxlKGRhdGEgPT0gMSkKICAgICAgICB7CiAgICAgICAgICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfU1dJVENIX01BQywxNSwxLCZkYXRhKTsKICAgICAgICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQojZW5kaWYKCiAgICAgICAgZGF0YSA9ICgxIDw8IDE1KSB8ICgoaStiYXNlaWQpIDw8IDgpIHwgbWFjLT5hckV0aGVyW2ldOwoKICAgICAgICByZXRWYWwgPSBod1dyaXRlR2xvYmFsMlJlZyhkZXYsUURfUkVHX1NXSVRDSF9NQUMsZGF0YSk7CiAgICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICAgICAgIHsKICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEdUX09LOwp9CgovKgogKiBSZWFkIGZyb20gU3dpdGNoIE1BQy9Xb0wgTUFDIFJlZ2lzdGVyCiAqLwpzdGF0aWMgR1RfU1RBVFVTIHJlYWRTd2l0Y2hNYWNXb2xSZWcKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfVTggICAgICAgIGJhc2VpZCwKICAgIE9VVCBHVF9FVEhFUkFERFIgKm1hYwopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgLyogdGVtcG9yYXJ5IERhdGEgc3RvcmFnZSAqLwogICAgR1RfVTE2ICAgICAgICAgICAgaTsKCiAgICAvKiBXYWl0IHVudGlsIHRoZSBkZXZpY2UgaXMgcmVhZHkuICovCiNpZmRlZiBHVF9STUdNVF9BQ0NFU1MKICAgIHsKICAgICAgSFdfREVWX1JFR19BQ0NFU1MgcmVnQWNjZXNzOwoKICAgICAgcmVnQWNjZXNzLmVudHJpZXMgPSAxOwoKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmNtZCA9IEhXX1JFR19XQUlUX1RJTExfMDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmFkZHIgPSBDQUxDX1NNSV9ERVZfQUREUihkZXYsIDAsIEdMT0JBTDJfUkVHX0FDQ0VTUyk7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5yZWcgPSBRRF9SRUdfU1dJVENIX01BQzsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmRhdGEgPSAxNTsKICAgICAgcmV0VmFsID0gaHdBY2Nlc3NNdWx0aVJlZ3MoZGV2LCAmcmVnQWNjZXNzKTsKICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICB7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgfQogICAgfQojZWxzZQogICAgZGF0YSA9IDE7CiAgICAgICB3aGlsZShkYXRhID09IDEpCiAgICB7CiAgICAgICAgICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLDE1LDEsJmRhdGEpOwogICAgICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgICB7CiAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgfQogICAgICAgfQojZW5kaWYKCiAgICBmb3IgKGk9MDsgaTxHVF9FVEhFUk5FVF9IRUFERVJfU0laRTsgaSsrKQogICAgewogICAgICAgIGRhdGEgPSAoaStiYXNlaWQpIDw8IDg7CgogICAgICAgIHJldFZhbCA9IGh3V3JpdGVHbG9iYWwyUmVnKGRldixRRF9SRUdfU1dJVENIX01BQyxkYXRhKTsKICAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgICAgICAgewogICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICAgIH0KCiAgICAgICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsUURfUkVHX1NXSVRDSF9NQUMsJmRhdGEpOwogICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgfQoKICAgICAgICBpZiAoKGJhc2VpZCAhPSAweDE2KSAmJiAoaSA9PSAwKSkgIC8qIGJhc2UgaWQgPSAweDE2IGlzIFdvbCBQYXNzd29yZCxhbmQgaXQgaGFzIG5vciBkaWZmQWRkciAqLwogICAgICAgICAgICBtYWMtPmFyRXRoZXJbaV0gPSBkYXRhICYgMHhGRTsgICAgLyogYml0IDAgaXMgZm9yIGRpZmZBZGRyICovCiAgICAgICAgZWxzZQogICAgICAgICAgICBtYWMtPmFyRXRoZXJbaV0gPSBkYXRhICYgMHhGRjsKICAgIH0KCiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKgogKiBXcml0ZSB0byBEaWZmZXJlbnQgTUFDIEFkZHJlc3MgcGVyIHBvcnQgYml0IGluIFN3aXRjaCBNQUMvV29MIFJlZ2lzdGVyCiAqLwpzdGF0aWMgR1RfU1RBVFVTIHdyaXRlRGlmZk1BQ1dvTAooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX1U4ICAgICAgICBiYXNlaWQsCiAgICBJTiBHVF9VMTYgICAgICAgZGlmZkFkZHIKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgIC8qIHRlbXBvcmFyeSBEYXRhIHN0b3JhZ2UgKi8KCiAgICAvKiBXYWl0IHVudGlsIHRoZSBkZXZpY2UgaXMgcmVhZHkuICovCiNpZmRlZiBHVF9STUdNVF9BQ0NFU1MKICAgIHsKICAgICAgSFdfREVWX1JFR19BQ0NFU1MgcmVnQWNjZXNzOwoKICAgICAgcmVnQWNjZXNzLmVudHJpZXMgPSAzOwoKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmNtZCA9IEhXX1JFR19XQUlUX1RJTExfMDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmFkZHIgPSBDQUxDX1NNSV9ERVZfQUREUihkZXYsIDAsIEdMT0JBTDJfUkVHX0FDQ0VTUyk7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFswXS5yZWcgPSBRRF9SRUdfU1dJVENIX01BQzsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLmRhdGEgPSAxNTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmNtZCA9IEhXX1JFR19XUklURTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmFkZHIgPSBDQUxDX1NNSV9ERVZfQUREUihkZXYsIDAsIEdMT0JBTDJfUkVHX0FDQ0VTUyk7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsxXS5yZWcgPSBRRF9SRUdfU1dJVENIX01BQzsKICAgICAgZGF0YSA9IGJhc2VpZDw8ODsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLmRhdGEgPSBkYXRhOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMl0uY21kID0gSFdfUkVHX1JFQUQ7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5hZGRyID0gQ0FMQ19TTUlfREVWX0FERFIoZGV2LCAwLCBHTE9CQUwyX1JFR19BQ0NFU1MpOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMl0ucmVnID0gUURfUkVHX1NXSVRDSF9NQUM7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5kYXRhID0gMDsKICAgICAgcmV0VmFsID0gaHdBY2Nlc3NNdWx0aVJlZ3MoZGV2LCAmcmVnQWNjZXNzKTsKICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICB7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgfQogICAgICBkYXRhID0gcWRMb25nMlNob3J0KHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5kYXRhKTsKICAgIH0KI2Vsc2UKICAgIGRhdGEgPSAxOwogICAgd2hpbGUoZGF0YSA9PSAxKQogICAgewogICAgICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLDE1LDEsJmRhdGEpOwogICAgICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICAgIHsKICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgICB9CiAgICB9CiAgICBkYXRhID0gYmFzZWlkPDw4OwogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgLyogUmVhZCBTd2l0aCBNQUMgUmVnICovCiAgICByZXRWYWwgPSBod1JlYWRHbG9iYWwyUmVnKGRldixRRF9SRUdfU1dJVENIX01BQywmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KI2VuZGlmCgogICAgZGF0YSA9ICgxIDw8IDE1KSB8IChiYXNlaWQ8PDgpIHwgKGRhdGEgJiAweEZFKSB8IChkaWZmQWRkciAmIDB4MSk7CgogICAgLyogV3JpdGUgYmFjayB0byBTd2l0aCBNQUMgUmVnIHdpdGggdXBkYXRlZCBkaWZmQWRkciAqLwogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgcmV0dXJuIEdUX09LOwp9CgovKgogKiBSZWFkIERpZmZlcmVudCBNQUMgQWRkcmVzcyBwZXIgcG9ydCBiaXQgaW4gU3dpdGNoIE1BQy9Xb0wgUmVnaXN0ZXIKICovCnN0YXRpYyBHVF9TVEFUVVMgcmVhZERpZmZNQUNXb0wKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfVTggICAgICAgIGJhc2VpZCwKICAgIE9VVCBHVF9VMTYgICAgICAgICpkaWZmQWRkcgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgLyogdGVtcG9yYXJ5IERhdGEgc3RvcmFnZSAqLwoKICAgIC8qIFdhaXQgdW50aWwgdGhlIGRldmljZSBpcyByZWFkeS4gKi8KI2lmZGVmIEdUX1JNR01UX0FDQ0VTUwogICAgewogICAgICBIV19ERVZfUkVHX0FDQ0VTUyByZWdBY2Nlc3M7CgogICAgICByZWdBY2Nlc3MuZW50cmllcyA9IDM7CgogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uY21kID0gSFdfUkVHX1dBSVRfVElMTF8wOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMMl9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLnJlZyA9IFFEX1JFR19TV0lUQ0hfTUFDOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uZGF0YSA9IDE1OwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0uY21kID0gSFdfUkVHX1dSSVRFOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMMl9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzFdLnJlZyA9IFFEX1JFR19TV0lUQ0hfTUFDOwogICAgICBkYXRhID0gYmFzZWlkPDw4OwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMV0uZGF0YSA9IGRhdGE7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5jbWQgPSBIV19SRUdfUkVBRDsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzJdLmFkZHIgPSBDQUxDX1NNSV9ERVZfQUREUihkZXYsIDAsIEdMT0JBTDJfUkVHX0FDQ0VTUyk7CiAgICAgIHJlZ0FjY2Vzcy5yd19yZWdfbGlzdFsyXS5yZWcgPSBRRF9SRUdfU1dJVENIX01BQzsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzJdLmRhdGEgPSAwOwogICAgICByZXRWYWwgPSBod0FjY2Vzc011bHRpUmVncyhkZXYsICZyZWdBY2Nlc3MpOwogICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgIHsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICB9CiAgICAgIGRhdGEgPSBxZExvbmcyU2hvcnQocmVnQWNjZXNzLnJ3X3JlZ19saXN0WzJdLmRhdGEpOwogICAgfQojZWxzZQogICAgZGF0YSA9IDE7CiAgICAgICB3aGlsZShkYXRhID09IDEpCiAgICB7CiAgICAgICAgICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLDE1LDEsJmRhdGEpOwogICAgICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgICB7CiAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgfQogICAgICAgfQoKICAgIC8qIFdyaXRlIHRvIFN3aXRoIE1BQyBSZWcgZm9yIHJlYWRpbmcgb3BlcmF0aW9uICovCiAgICBkYXRhID0gYmFzZWlkPDw4OwogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsUURfUkVHX1NXSVRDSF9NQUMsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CiNlbmRpZgogICAgKmRpZmZBZGRyID0gZGF0YSAmIDB4MTsKCiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qCiAqIFdyaXRlIHRvIFN3aXRjaCBNQUMvV29ML1dvRiBSZWdpc3RlcgogKi8Kc3RhdGljIEdUX1NUQVRVUyB3cml0ZVN3TWFjV29sV29mUmVnCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfVTggICAgICAgIHBvaW50ZXIsCiAgICBJTiBHVF9VOCAgICAgICAgZGF0YQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUgKi8KICAgIEdUX1UxNiAgICAgICAgICB0bXBEYXRhOyAgICAgLyogdGVtcG9yYXJ5IERhdGEgc3RvcmFnZSAqLwogICAgewogICAgICAgIC8qIFdhaXQgdW50aWwgdGhlIGRldmljZSBpcyByZWFkeS4gKi8KI2lmZGVmIEdUX1JNR01UX0FDQ0VTUwogICAgewogICAgICBIV19ERVZfUkVHX0FDQ0VTUyByZWdBY2Nlc3M7CgogICAgICByZWdBY2Nlc3MuZW50cmllcyA9IDE7CgogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uY21kID0gSFdfUkVHX1dBSVRfVElMTF8wOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMMl9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLnJlZyA9IFFEX1JFR19TV0lUQ0hfTUFDOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uZGF0YSA9IDE1OwogICAgICByZXRWYWwgPSBod0FjY2Vzc011bHRpUmVncyhkZXYsICZyZWdBY2Nlc3MpOwogICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgIHsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICB9CiAgICB9CiNlbHNlCiAgICAgICAgdG1wRGF0YSA9IDE7CiAgICAgICAgd2hpbGUodG1wRGF0YSA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLDE1LDEsJnRtcERhdGEpOwogICAgICAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgoKICAgICAgICB0bXBEYXRhID0gKDEgPDwgMTUpIHwgKHBvaW50ZXIgPDwgOCkgfCBkYXRhOwoKICAgICAgICByZXRWYWwgPSBod1dyaXRlR2xvYmFsMlJlZyhkZXYsUURfUkVHX1NXSVRDSF9NQUMsIHRtcERhdGEpOwogICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBHVF9PSzsKfQoKLyoKICogUmVhZCBmcm9tIFN3aXRjaCBNQUMvV29ML1dvRiBSZWdpc3RlcgogKi8Kc3RhdGljIEdUX1NUQVRVUyByZWFkU3dNYWNXb2xXb2ZSZWcKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VOCAgICAgICAgcG9pbnRlciwKICAgIE9VVCBHVF9VOCAgICAgICAqZGF0YQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUgKi8KICAgIEdUX1UxNiAgICAgICAgICB0bXBEYXRhOyAgICAgLyogdGVtcG9yYXJ5IERhdGEgc3RvcmFnZSAqLwoKICAgIC8qIFdhaXQgdW50aWwgdGhlIGRldmljZSBpcyByZWFkeS4gKi8KI2lmZGVmIEdUX1JNR01UX0FDQ0VTUwogICAgewogICAgICBIV19ERVZfUkVHX0FDQ0VTUyByZWdBY2Nlc3M7CgogICAgICByZWdBY2Nlc3MuZW50cmllcyA9IDE7CgogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uY21kID0gSFdfUkVHX1dBSVRfVElMTF8wOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uYWRkciA9IENBTENfU01JX0RFVl9BRERSKGRldiwgMCwgR0xPQkFMMl9SRUdfQUNDRVNTKTsKICAgICAgcmVnQWNjZXNzLnJ3X3JlZ19saXN0WzBdLnJlZyA9IFFEX1JFR19TV0lUQ0hfTUFDOwogICAgICByZWdBY2Nlc3MucndfcmVnX2xpc3RbMF0uZGF0YSA9IDE1OwogICAgICByZXRWYWwgPSBod0FjY2Vzc011bHRpUmVncyhkZXYsICZyZWdBY2Nlc3MpOwogICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgIHsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICB9CiAgICB9CiNlbHNlCiAgICB0bXBEYXRhID0gMTsKICAgICAgIHdoaWxlKHRtcERhdGEgPT0gMSkKICAgIHsKICAgICAgICAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1NXSVRDSF9NQUMsMTUsMSwmdG1wRGF0YSk7CiAgICAgICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICAgIHsKICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgICB9CiAgICAgICB9CiNlbmRpZgoKICAgIHsKICAgICAgICB0bXBEYXRhID0gcG9pbnRlciA8PCA4OwoKICAgICAgICByZXRWYWwgPSBod1dyaXRlR2xvYmFsMlJlZyhkZXYsUURfUkVHX1NXSVRDSF9NQUMsdG1wRGF0YSk7CiAgICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgICAgICAgIHsKICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgICB9CgogICAgICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLCZ0bXBEYXRhKTsKICAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgICAgICAgewogICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICAgIH0KCiAgICAgICAgKmRhdGEgPSB0bXBEYXRhICYgMHhGRjsKICAgIH0KCiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKgogKiBXcml0ZSB0byBTd2l0Y2ggTUFDIFJlZ2lzdGVyCiAqLwpzdGF0aWMgR1RfU1RBVFVTIHdyaXRlU3dpdGNoTWFjUmVnCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfRVRIRVJBRERSICptYWMKKQp7CiAgICByZXR1cm4gd3JpdGVTd2l0Y2hNYWNXb2xSZWcoZGV2LCAwLCBtYWMpOwp9CgovKgogKiBSZWFkIGZyb20gU3dpdGNoIE1BQyBSZWdpc3RlcgogKi8Kc3RhdGljIEdUX1NUQVRVUyByZWFkU3dpdGNoTWFjUmVnCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9FVEhFUkFERFIgKm1hYwopCnsKICAgIHJldHVybiByZWFkU3dpdGNoTWFjV29sUmVnKGRldiwgMCwgbWFjKTsKfQoKCi8qCiAqIFdyaXRlIHRvIERpZmZlcmVudCBNQUMgQWRkcmVzcyBwZXIgcG9ydCBiaXQgaW4gU3dpdGNoIE1BQyBSZWdpc3RlcgogKi8Kc3RhdGljIEdUX1NUQVRVUyB3cml0ZURpZmZNQUMKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VMTYgICAgICAgZGlmZkFkZHIKKQp7CiAgICByZXR1cm4gd3JpdGVEaWZmTUFDV29MKGRldiwgMCwgZGlmZkFkZHIpOwp9CgovKgogKiBSZWFkIERpZmZlcmVudCBNQUMgQWRkcmVzcyBwZXIgcG9ydCBiaXQgaW4gU3dpdGNoIE1BQyBSZWdpc3RlcgogKi8Kc3RhdGljIEdUX1NUQVRVUyByZWFkRGlmZk1BQwooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfVTE2ICAgICAgICAqZGlmZkFkZHIKKQp7CiAgICByZXR1cm4gcmVhZERpZmZNQUNXb0woZGV2LCAwLCBkaWZmQWRkcik7Cn0K