LyoKICoJVmlkZW8gZm9yIExpbnV4IFR3bwogKgogKglBIGdlbmVyaWMgdmlkZW8gZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0KICoJdXNpbmcgYSBzZXQgb2YgZGV2aWNlIHN0cnVjdHVyZXMvdmVjdG9ycyBmb3IgbG93IGxldmVsIG9wZXJhdGlvbnMuCiAqCiAqCVRoaXMgZmlsZSByZXBsYWNlcyB0aGUgdmlkZW9kZXYuYyBmaWxlIHRoYXQgY29tZXMgd2l0aCB0aGUKICoJcmVndWxhciBrZXJuZWwgZGlzdHJpYnV0aW9uLgogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBBdXRob3I6CUJpbGwgRGlya3MgPGJkaXJrc0BwYWNiZWxsLm5ldD4KICoJCWJhc2VkIG9uIGNvZGUgYnkgQWxhbiBDb3gsIDxhbGFuQGN5bXJ1Lm5ldD4KICoKICovCgovKgogKiBWaWRlbyBjYXB0dXJlIGludGVyZmFjZSBmb3IgTGludXgKICoKICoJQSBnZW5lcmljIHZpZGVvIGRldmljZSBpbnRlcmZhY2UgZm9yIHRoZSBMSU5VWCBvcGVyYXRpbmcgc3lzdGVtCiAqCXVzaW5nIGEgc2V0IG9mIGRldmljZSBzdHJ1Y3R1cmVzL3ZlY3RvcnMgZm9yIGxvdyBsZXZlbCBvcGVyYXRpb25zLgogKgogKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogQXV0aG9yOglBbGFuIENveCwgPGFsYW5AcmVkaGF0LmNvbT4KICoKICogRml4ZXM6CiAqLwoKLyoKICogVmlkZW80bGludXggMS8yIGludGVncmF0aW9uIGJ5IEp1c3RpbiBTY2hvZW1hbgogKiA8anVzdGluQHN1bnRpZ2VyLmVlLnVwLmFjLnphPgogKiAyLjQgUFJPQ0ZTIHN1cHBvcnQgcG9ydGVkIGZyb20gMi40IGtlcm5lbHMgYnkKICogIEnxYWtpIEdhcmPtYSBFdHhlYmFycmlhIDxnYXJldHhlQGV1c2thbG5ldC5uZXQ+CiAqIE1ha2VmaWxlIGZpeCBieSAiVy4gTWljaGFlbCBQZXR1bGxvIiA8bWlrZUBmbHluLm9yZz4KICogMi40IGRldmZzIHN1cHBvcnQgcG9ydGVkIGZyb20gMi40IGtlcm5lbHMgYnkKICogIERhbiBNZXJpbGxhdCA8ZGFuQG1lcmlsbGF0Lm9yZz4KICogQWRkZWQgR2VyZCBLbm9ycnMgdjRsMSBlbmhhbmNlbWVudHMgKEp1c3RpbiBTY2hvZW1hbikKICovCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgojaW5jbHVkZSA8bGludXgvbW0uaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vZGl2NjQuaD4KI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KI2RlZmluZSBfX09MRF9WSURJT0NfIC8qIFRvIGFsbG93IGZpeGluZyBvbGQgY2FsbHMqLwojaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KCiNpZmRlZiBDT05GSUdfS01PRAojaW5jbHVkZSA8bGludXgva21vZC5oPgojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19VU1QpIHx8IGRlZmluZWQoQ09ORklHX1VTVF9NT0RVTEUpCiNpbmNsdWRlIDxsaW51eC91c3QuaD4KI2VuZGlmCgoKI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CgpNT0RVTEVfQVVUSE9SKCJCaWxsIERpcmtzLCBKdXN0aW4gU2Nob2VtYW4sIEdlcmQgS25vcnIiKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJtaXNjIGhlbHBlciBmdW5jdGlvbnMgZm9yIHY0bDIgZGV2aWNlIGRyaXZlcnMiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKLyoKICoKICoJViA0IEwgMiAgIEQgUiBJIFYgRSBSICAgSCBFIEwgUCBFIFIgICBBIFAgSQogKgogKi8KCi8qCiAqICBWaWRlbyBTdGFuZGFyZCBPcGVyYXRpb25zIChjb250cmlidXRlZCBieSBNaWNoYWVsIFNjaGltZWspCiAqLwoKCi8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiBhIHY0bDJfc3RhbmRhcmQgc3RydWN0dXJlIGFjY29yZGluZyB0byB0aGUKICAgJ2lkJyBhbmQgJ3RyYW5zbWlzc2lvbicgcGFyYW1ldGVycy4gIFJldHVybnMgbmVnYXRpdmUgb24gZXJyb3IuICAqLwppbnQgdjRsMl92aWRlb19zdGRfY29uc3RydWN0KHN0cnVjdCB2NGwyX3N0YW5kYXJkICp2cywKCQkJICAgICBpbnQgaWQsIGNoYXIgKm5hbWUpCnsKCXUzMiBpbmRleCA9IHZzLT5pbmRleDsKCgltZW1zZXQodnMsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9zdGFuZGFyZCkpOwoJdnMtPmluZGV4ID0gaW5kZXg7Cgl2cy0+aWQgICAgPSBpZDsKCWlmIChpZCAmIFY0TDJfU1REXzUyNV82MCkgewoJCXZzLT5mcmFtZXBlcmlvZC5udW1lcmF0b3IgPSAxMDAxOwoJCXZzLT5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciA9IDMwMDAwOwoJCXZzLT5mcmFtZWxpbmVzID0gNTI1OwoJfSBlbHNlIHsKCQl2cy0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gMTsKCQl2cy0+ZnJhbWVwZXJpb2QuZGVub21pbmF0b3IgPSAyNTsKCQl2cy0+ZnJhbWVsaW5lcyA9IDYyNTsKCX0KCXN0cmxjcHkodnMtPm5hbWUsbmFtZSxzaXplb2YodnMtPm5hbWUpKTsKCXJldHVybiAwOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBwcmlvcml0eSBoYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2RlZmluZSBWNEwyX1BSSU9fVkFMSUQodmFsKSAodmFsID09IFY0TDJfUFJJT1JJVFlfQkFDS0dST1VORCAgIHx8IFwKCQkJICAgICAgdmFsID09IFY0TDJfUFJJT1JJVFlfSU5URVJBQ1RJVkUgIHx8IFwKCQkJICAgICAgdmFsID09IFY0TDJfUFJJT1JJVFlfUkVDT1JEKQoKaW50IHY0bDJfcHJpb19pbml0KHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCkKewoJbWVtc2V0KGdsb2JhbCwwLHNpemVvZigqZ2xvYmFsKSk7CglyZXR1cm4gMDsKfQoKaW50IHY0bDJfcHJpb19jaGFuZ2Uoc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsLAoJCSAgICAgZW51bSB2NGwyX3ByaW9yaXR5IG5ldykKewoJaWYgKCFWNEwyX1BSSU9fVkFMSUQobmV3KSkKCQlyZXR1cm4gLUVJTlZBTDsKCWlmICgqbG9jYWwgPT0gbmV3KQoJCXJldHVybiAwOwoKCWF0b21pY19pbmMoJmdsb2JhbC0+cHJpb3NbbmV3XSk7CglpZiAoVjRMMl9QUklPX1ZBTElEKCpsb2NhbCkpCgkJYXRvbWljX2RlYygmZ2xvYmFsLT5wcmlvc1sqbG9jYWxdKTsKCSpsb2NhbCA9IG5ldzsKCXJldHVybiAwOwp9CgppbnQgdjRsMl9wcmlvX29wZW4oc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsKQp7CglyZXR1cm4gdjRsMl9wcmlvX2NoYW5nZShnbG9iYWwsbG9jYWwsVjRMMl9QUklPUklUWV9ERUZBVUxUKTsKfQoKaW50IHY0bDJfcHJpb19jbG9zZShzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwpCnsKCWlmIChWNEwyX1BSSU9fVkFMSUQoKmxvY2FsKSkKCQlhdG9taWNfZGVjKCZnbG9iYWwtPnByaW9zWypsb2NhbF0pOwoJcmV0dXJuIDA7Cn0KCmVudW0gdjRsMl9wcmlvcml0eSB2NGwyX3ByaW9fbWF4KHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCkKewoJaWYgKGF0b21pY19yZWFkKCZnbG9iYWwtPnByaW9zW1Y0TDJfUFJJT1JJVFlfUkVDT1JEXSkgPiAwKQoJCXJldHVybiBWNEwyX1BSSU9SSVRZX1JFQ09SRDsKCWlmIChhdG9taWNfcmVhZCgmZ2xvYmFsLT5wcmlvc1tWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFXSkgPiAwKQoJCXJldHVybiBWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFOwoJaWYgKGF0b21pY19yZWFkKCZnbG9iYWwtPnByaW9zW1Y0TDJfUFJJT1JJVFlfQkFDS0dST1VORF0pID4gMCkKCQlyZXR1cm4gVjRMMl9QUklPUklUWV9CQUNLR1JPVU5EOwoJcmV0dXJuIFY0TDJfUFJJT1JJVFlfVU5TRVQ7Cn0KCmludCB2NGwyX3ByaW9fY2hlY2soc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsKQp7CglpZiAoKmxvY2FsIDwgdjRsMl9wcmlvX21heChnbG9iYWwpKQoJCXJldHVybiAtRUJVU1k7CglyZXR1cm4gMDsKfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIHNvbWUgYXJyYXlzIGZvciBwcmV0dHktcHJpbnRpbmcgZGVidWcgbWVzc2FnZXMgb2YgZW51bSB0eXBlcyAgICAgICovCgpjaGFyICp2NGwyX2ZpZWxkX25hbWVzW10gPSB7CglbVjRMMl9GSUVMRF9BTlldICAgICAgICA9ICJhbnkiLAoJW1Y0TDJfRklFTERfTk9ORV0gICAgICAgPSAibm9uZSIsCglbVjRMMl9GSUVMRF9UT1BdICAgICAgICA9ICJ0b3AiLAoJW1Y0TDJfRklFTERfQk9UVE9NXSAgICAgPSAiYm90dG9tIiwKCVtWNEwyX0ZJRUxEX0lOVEVSTEFDRURdID0gImludGVybGFjZWQiLAoJW1Y0TDJfRklFTERfU0VRX1RCXSAgICAgPSAic2VxLXRiIiwKCVtWNEwyX0ZJRUxEX1NFUV9CVF0gICAgID0gInNlcS1idCIsCglbVjRMMl9GSUVMRF9BTFRFUk5BVEVdICA9ICJhbHRlcm5hdGUiLAp9OwoKY2hhciAqdjRsMl90eXBlX25hbWVzW10gPSB7CglbVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFXSA9ICJ2aWRlby1jYXAiLAoJW1Y0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWV0gPSAidmlkZW8tb3ZlciIsCglbVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRdICA9ICJ2aWRlby1vdXQiLAoJW1Y0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkVdICAgPSAidmJpLWNhcCIsCglbVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUXSAgICA9ICJ2Ymktb3V0IiwKfTsKCnN0YXRpYyBjaGFyICp2NGwyX21lbW9yeV9uYW1lc1tdID0gewoJW1Y0TDJfTUVNT1JZX01NQVBdICAgID0gIm1tYXAiLAoJW1Y0TDJfTUVNT1JZX1VTRVJQVFJdID0gInVzZXJwdHIiLAoJW1Y0TDJfTUVNT1JZX09WRVJMQVldID0gIm92ZXJsYXkiLAp9OwoKI2RlZmluZSBwcnRfbmFtZXMoYSxhcnIpICgoKGEpPj0wKSYmKChhKTxBUlJBWV9TSVpFKGFycikpKT9hcnJbYV06InVua25vd24iCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogZGVidWcgaGVscCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZkZWYgSEFWRV9WNEwxCnN0YXRpYyBjb25zdCBjaGFyICp2NGwxX2lvY3Rsc1tdID0gewoJW19JT0NfTlIoVklESU9DR0NBUCldICAgICAgID0gIlZJRElPQ0dDQVAiLAoJW19JT0NfTlIoVklESU9DR0NIQU4pXSAgICAgID0gIlZJRElPQ0dDSEFOIiwKCVtfSU9DX05SKFZJRElPQ1NDSEFOKV0gICAgICA9ICJWSURJT0NTQ0hBTiIsCglbX0lPQ19OUihWSURJT0NHVFVORVIpXSAgICAgPSAiVklESU9DR1RVTkVSIiwKCVtfSU9DX05SKFZJRElPQ1NUVU5FUildICAgICA9ICJWSURJT0NTVFVORVIiLAoJW19JT0NfTlIoVklESU9DR1BJQ1QpXSAgICAgID0gIlZJRElPQ0dQSUNUIiwKCVtfSU9DX05SKFZJRElPQ1NQSUNUKV0gICAgICA9ICJWSURJT0NTUElDVCIsCglbX0lPQ19OUihWSURJT0NDQVBUVVJFKV0gICAgPSAiVklESU9DQ0FQVFVSRSIsCglbX0lPQ19OUihWSURJT0NHV0lOKV0gICAgICAgPSAiVklESU9DR1dJTiIsCglbX0lPQ19OUihWSURJT0NTV0lOKV0gICAgICAgPSAiVklESU9DU1dJTiIsCglbX0lPQ19OUihWSURJT0NHRkJVRildICAgICAgPSAiVklESU9DR0ZCVUYiLAoJW19JT0NfTlIoVklESU9DU0ZCVUYpXSAgICAgID0gIlZJRElPQ1NGQlVGIiwKCVtfSU9DX05SKFZJRElPQ0tFWSldICAgICAgICA9ICJWSURJT0NLRVkiLAoJW19JT0NfTlIoVklESU9DR0ZSRVEpXSAgICAgID0gIlZJRElPQ0dGUkVRIiwKCVtfSU9DX05SKFZJRElPQ1NGUkVRKV0gICAgICA9ICJWSURJT0NTRlJFUSIsCglbX0lPQ19OUihWSURJT0NHQVVESU8pXSAgICAgPSAiVklESU9DR0FVRElPIiwKCVtfSU9DX05SKFZJRElPQ1NBVURJTyldICAgICA9ICJWSURJT0NTQVVESU8iLAoJW19JT0NfTlIoVklESU9DU1lOQyldICAgICAgID0gIlZJRElPQ1NZTkMiLAoJW19JT0NfTlIoVklESU9DTUNBUFRVUkUpXSAgID0gIlZJRElPQ01DQVBUVVJFIiwKCVtfSU9DX05SKFZJRElPQ0dNQlVGKV0gICAgICA9ICJWSURJT0NHTUJVRiIsCglbX0lPQ19OUihWSURJT0NHVU5JVCldICAgICAgPSAiVklESU9DR1VOSVQiLAoJW19JT0NfTlIoVklESU9DR0NBUFRVUkUpXSAgID0gIlZJRElPQ0dDQVBUVVJFIiwKCVtfSU9DX05SKFZJRElPQ1NDQVBUVVJFKV0gICA9ICJWSURJT0NTQ0FQVFVSRSIsCglbX0lPQ19OUihWSURJT0NTUExBWU1PREUpXSAgPSAiVklESU9DU1BMQVlNT0RFIiwKCVtfSU9DX05SKFZJRElPQ1NXUklURU1PREUpXSA9ICJWSURJT0NTV1JJVEVNT0RFIiwKCVtfSU9DX05SKFZJRElPQ0dQTEFZSU5GTyldICA9ICJWSURJT0NHUExBWUlORk8iLAoJW19JT0NfTlIoVklESU9DU01JQ1JPQ09ERSldID0gIlZJRElPQ1NNSUNST0NPREUiLAoJW19JT0NfTlIoVklESU9DR1ZCSUZNVCldICAgID0gIlZJRElPQ0dWQklGTVQiLAoJW19JT0NfTlIoVklESU9DU1ZCSUZNVCldICAgID0gIlZJRElPQ1NWQklGTVQiCn07CiNkZWZpbmUgVjRMMV9JT0NUTFMgQVJSQVlfU0laRSh2NGwxX2lvY3RscykKI2VuZGlmCgpzdGF0aWMgY29uc3QgY2hhciAqdjRsMl9pb2N0bHNbXSA9IHsKCVtfSU9DX05SKFZJRElPQ19RVUVSWUNBUCldICAgICAgICAgPSAiVklESU9DX1FVRVJZQ0FQIiwKCVtfSU9DX05SKFZJRElPQ19SRVNFUlZFRCldICAgICAgICAgPSAiVklESU9DX1JFU0VSVkVEIiwKCVtfSU9DX05SKFZJRElPQ19FTlVNX0ZNVCldICAgICAgICAgPSAiVklESU9DX0VOVU1fRk1UIiwKCVtfSU9DX05SKFZJRElPQ19HX0ZNVCldICAgICAgICAgICAgPSAiVklESU9DX0dfRk1UIiwKCVtfSU9DX05SKFZJRElPQ19TX0ZNVCldICAgICAgICAgICAgPSAiVklESU9DX1NfRk1UIiwKCVtfSU9DX05SKFZJRElPQ19HX01QRUdDT01QKV0gICAgICAgPSAiVklESU9DX0dfTVBFR0NPTVAiLAoJW19JT0NfTlIoVklESU9DX1NfTVBFR0NPTVApXSAgICAgICA9ICJWSURJT0NfU19NUEVHQ09NUCIsCglbX0lPQ19OUihWSURJT0NfUkVRQlVGUyldICAgICAgICAgID0gIlZJRElPQ19SRVFCVUZTIiwKCVtfSU9DX05SKFZJRElPQ19RVUVSWUJVRildICAgICAgICAgPSAiVklESU9DX1FVRVJZQlVGIiwKCVtfSU9DX05SKFZJRElPQ19HX0ZCVUYpXSAgICAgICAgICAgPSAiVklESU9DX0dfRkJVRiIsCglbX0lPQ19OUihWSURJT0NfU19GQlVGKV0gICAgICAgICAgID0gIlZJRElPQ19TX0ZCVUYiLAoJW19JT0NfTlIoVklESU9DX09WRVJMQVkpXSAgICAgICAgICA9ICJWSURJT0NfT1ZFUkxBWSIsCglbX0lPQ19OUihWSURJT0NfUUJVRildICAgICAgICAgICAgID0gIlZJRElPQ19RQlVGIiwKCVtfSU9DX05SKFZJRElPQ19EUUJVRildICAgICAgICAgICAgPSAiVklESU9DX0RRQlVGIiwKCVtfSU9DX05SKFZJRElPQ19TVFJFQU1PTildICAgICAgICAgPSAiVklESU9DX1NUUkVBTU9OIiwKCVtfSU9DX05SKFZJRElPQ19TVFJFQU1PRkYpXSAgICAgICAgPSAiVklESU9DX1NUUkVBTU9GRiIsCglbX0lPQ19OUihWSURJT0NfR19QQVJNKV0gICAgICAgICAgID0gIlZJRElPQ19HX1BBUk0iLAoJW19JT0NfTlIoVklESU9DX1NfUEFSTSldICAgICAgICAgICA9ICJWSURJT0NfU19QQVJNIiwKCVtfSU9DX05SKFZJRElPQ19HX1NURCldICAgICAgICAgICAgPSAiVklESU9DX0dfU1REIiwKCVtfSU9DX05SKFZJRElPQ19TX1NURCldICAgICAgICAgICAgPSAiVklESU9DX1NfU1REIiwKCVtfSU9DX05SKFZJRElPQ19FTlVNU1REKV0gICAgICAgICAgPSAiVklESU9DX0VOVU1TVEQiLAoJW19JT0NfTlIoVklESU9DX0VOVU1JTlBVVCldICAgICAgICA9ICJWSURJT0NfRU5VTUlOUFVUIiwKCVtfSU9DX05SKFZJRElPQ19HX0NUUkwpXSAgICAgICAgICAgPSAiVklESU9DX0dfQ1RSTCIsCglbX0lPQ19OUihWSURJT0NfU19DVFJMKV0gICAgICAgICAgID0gIlZJRElPQ19TX0NUUkwiLAoJW19JT0NfTlIoVklESU9DX0dfVFVORVIpXSAgICAgICAgICA9ICJWSURJT0NfR19UVU5FUiIsCglbX0lPQ19OUihWSURJT0NfU19UVU5FUildICAgICAgICAgID0gIlZJRElPQ19TX1RVTkVSIiwKCVtfSU9DX05SKFZJRElPQ19HX0FVRElPKV0gICAgICAgICAgPSAiVklESU9DX0dfQVVESU8iLAoJW19JT0NfTlIoVklESU9DX1NfQVVESU8pXSAgICAgICAgICA9ICJWSURJT0NfU19BVURJTyIsCglbX0lPQ19OUihWSURJT0NfUVVFUllDVFJMKV0gICAgICAgID0gIlZJRElPQ19RVUVSWUNUUkwiLAoJW19JT0NfTlIoVklESU9DX1FVRVJZTUVOVSldICAgICAgICA9ICJWSURJT0NfUVVFUllNRU5VIiwKCVtfSU9DX05SKFZJRElPQ19HX0lOUFVUKV0gICAgICAgICAgPSAiVklESU9DX0dfSU5QVVQiLAoJW19JT0NfTlIoVklESU9DX1NfSU5QVVQpXSAgICAgICAgICA9ICJWSURJT0NfU19JTlBVVCIsCglbX0lPQ19OUihWSURJT0NfR19PVVRQVVQpXSAgICAgICAgID0gIlZJRElPQ19HX09VVFBVVCIsCglbX0lPQ19OUihWSURJT0NfU19PVVRQVVQpXSAgICAgICAgID0gIlZJRElPQ19TX09VVFBVVCIsCglbX0lPQ19OUihWSURJT0NfRU5VTU9VVFBVVCldICAgICAgID0gIlZJRElPQ19FTlVNT1VUUFVUIiwKCVtfSU9DX05SKFZJRElPQ19HX0FVRE9VVCldICAgICAgICAgPSAiVklESU9DX0dfQVVET1VUIiwKCVtfSU9DX05SKFZJRElPQ19TX0FVRE9VVCldICAgICAgICAgPSAiVklESU9DX1NfQVVET1VUIiwKCVtfSU9DX05SKFZJRElPQ19HX01PRFVMQVRPUildICAgICAgPSAiVklESU9DX0dfTU9EVUxBVE9SIiwKCVtfSU9DX05SKFZJRElPQ19TX01PRFVMQVRPUildICAgICAgPSAiVklESU9DX1NfTU9EVUxBVE9SIiwKCVtfSU9DX05SKFZJRElPQ19HX0ZSRVFVRU5DWSldICAgICAgPSAiVklESU9DX0dfRlJFUVVFTkNZIiwKCVtfSU9DX05SKFZJRElPQ19TX0ZSRVFVRU5DWSldICAgICAgPSAiVklESU9DX1NfRlJFUVVFTkNZIiwKCVtfSU9DX05SKFZJRElPQ19DUk9QQ0FQKV0gICAgICAgICAgPSAiVklESU9DX0NST1BDQVAiLAoJW19JT0NfTlIoVklESU9DX0dfQ1JPUCldICAgICAgICAgICA9ICJWSURJT0NfR19DUk9QIiwKCVtfSU9DX05SKFZJRElPQ19TX0NST1ApXSAgICAgICAgICAgPSAiVklESU9DX1NfQ1JPUCIsCglbX0lPQ19OUihWSURJT0NfR19KUEVHQ09NUCldICAgICAgID0gIlZJRElPQ19HX0pQRUdDT01QIiwKCVtfSU9DX05SKFZJRElPQ19TX0pQRUdDT01QKV0gICAgICAgPSAiVklESU9DX1NfSlBFR0NPTVAiLAoJW19JT0NfTlIoVklESU9DX1FVRVJZU1REKV0gICAgICAgICA9ICJWSURJT0NfUVVFUllTVEQiLAoJW19JT0NfTlIoVklESU9DX1RSWV9GTVQpXSAgICAgICAgICA9ICJWSURJT0NfVFJZX0ZNVCIsCglbX0lPQ19OUihWSURJT0NfRU5VTUFVRElPKV0gICAgICAgID0gIlZJRElPQ19FTlVNQVVESU8iLAoJW19JT0NfTlIoVklESU9DX0VOVU1BVURPVVQpXSAgICAgICA9ICJWSURJT0NfRU5VTUFVRE9VVCIsCglbX0lPQ19OUihWSURJT0NfR19QUklPUklUWSldICAgICAgID0gIlZJRElPQ19HX1BSSU9SSVRZIiwKCVtfSU9DX05SKFZJRElPQ19TX1BSSU9SSVRZKV0gICAgICAgPSAiVklESU9DX1NfUFJJT1JJVFkiLAojaWYgMQoJW19JT0NfTlIoVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVApXSA9ICJWSURJT0NfR19TTElDRURfVkJJX0NBUCIsCiNlbmRpZgoJW19JT0NfTlIoVklESU9DX0xPR19TVEFUVVMpXSAgICAgICA9ICJWSURJT0NfTE9HX1NUQVRVUyIsCglbX0lPQ19OUihWSURJT0NfR19FWFRfQ1RSTFMpXSAgICAgID0gIlZJRElPQ19HX0VYVF9DVFJMUyIsCglbX0lPQ19OUihWSURJT0NfU19FWFRfQ1RSTFMpXSAgICAgID0gIlZJRElPQ19TX0VYVF9DVFJMUyIsCglbX0lPQ19OUihWSURJT0NfVFJZX0VYVF9DVFJMUyldICAgID0gIlZJRElPQ19UUllfRVhUX0NUUkxTIgp9OwojZGVmaW5lIFY0TDJfSU9DVExTIEFSUkFZX1NJWkUodjRsMl9pb2N0bHMpCgpzdGF0aWMgY29uc3QgY2hhciAqdjRsMl9pbnRfaW9jdGxzW10gPSB7CiNpZmRlZiBIQVZFX1ZJREVPX0RFQ09ERVIKCVtfSU9DX05SKERFQ09ERVJfR0VUX0NBUEFCSUxJVElFUyldICAgID0gIkRFQ09ERVJfR0VUX0NBUEFCSUxJVElFUyIsCglbX0lPQ19OUihERUNPREVSX0dFVF9TVEFUVVMpXSAgICAgICAgICA9ICJERUNPREVSX0dFVF9TVEFUVVMiLAoJW19JT0NfTlIoREVDT0RFUl9TRVRfTk9STSldICAgICAgICAgICAgPSAiREVDT0RFUl9TRVRfTk9STSIsCglbX0lPQ19OUihERUNPREVSX1NFVF9JTlBVVCldICAgICAgICAgICA9ICJERUNPREVSX1NFVF9JTlBVVCIsCglbX0lPQ19OUihERUNPREVSX1NFVF9PVVRQVVQpXSAgICAgICAgICA9ICJERUNPREVSX1NFVF9PVVRQVVQiLAoJW19JT0NfTlIoREVDT0RFUl9FTkFCTEVfT1VUUFVUKV0gICAgICAgPSAiREVDT0RFUl9FTkFCTEVfT1VUUFVUIiwKCVtfSU9DX05SKERFQ09ERVJfU0VUX1BJQ1RVUkUpXSAgICAgICAgID0gIkRFQ09ERVJfU0VUX1BJQ1RVUkUiLAoJW19JT0NfTlIoREVDT0RFUl9TRVRfR1BJTyldICAgICAgICAgICAgPSAiREVDT0RFUl9TRVRfR1BJTyIsCglbX0lPQ19OUihERUNPREVSX0lOSVQpXSAgICAgICAgICAgICAgICA9ICJERUNPREVSX0lOSVQiLAoJW19JT0NfTlIoREVDT0RFUl9TRVRfVkJJX0JZUEFTUyldICAgICAgPSAiREVDT0RFUl9TRVRfVkJJX0JZUEFTUyIsCglbX0lPQ19OUihERUNPREVSX0RVTVApXSAgICAgICAgICAgICAgICA9ICJERUNPREVSX0RVTVAiLAojZW5kaWYKCVtfSU9DX05SKEFVRENfU0VUX1JBRElPKV0gICAgICAgICAgICAgID0gIkFVRENfU0VUX1JBRElPIiwKCglbX0lPQ19OUihUVU5FUl9TRVRfVFlQRV9BRERSKV0gICAgICAgICA9ICJUVU5FUl9TRVRfVFlQRV9BRERSIiwKCVtfSU9DX05SKFRVTkVSX1NFVF9TVEFOREJZKV0gICAgICAgICAgID0gIlRVTkVSX1NFVF9TVEFOREJZIiwKCVtfSU9DX05SKFREQTk4ODdfU0VUX0NPTkZJRyldICAgICAgICAgID0gIlREQTk4ODdfU0VUX0NPTkZJRyIsCgoJW19JT0NfTlIoVklESU9DX0lOVF9TX1RVTkVSX01PREUpXSAgICAgPSAiVklESU9DX0lOVF9TX1RVTkVSX01PREUiLAoJW19JT0NfTlIoVklESU9DX0lOVF9TX1JFR0lTVEVSKV0gICAgICAgPSAiVklESU9DX0lOVF9TX1JFR0lTVEVSIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfR19SRUdJU1RFUildICAgICAgID0gIlZJRElPQ19JTlRfR19SRUdJU1RFUiIsCglbX0lPQ19OUihWSURJT0NfSU5UX1JFU0VUKV0gICAgICAgICAgICA9ICJWSURJT0NfSU5UX1JFU0VUIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUSldID0gIlZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUSIsCglbX0lPQ19OUihWSURJT0NfSU5UX0RFQ09ERV9WQklfTElORSldICA9ICJWSURJT0NfSU5UX0RFQ09ERV9WQklfTElORSIsCglbX0lPQ19OUihWSURJT0NfSU5UX1NfVkJJX0RBVEEpXSAgICAgICA9ICJWSURJT0NfSU5UX1NfVkJJX0RBVEEiLAoJW19JT0NfTlIoVklESU9DX0lOVF9HX1ZCSV9EQVRBKV0gICAgICAgPSAiVklESU9DX0lOVF9HX1ZCSV9EQVRBIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfR19DSElQX0lERU5UKV0gICAgID0gIlZJRElPQ19JTlRfR19DSElQX0lERU5UIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfSTJTX0NMT0NLX0ZSRVEpXSAgID0gIlZJRElPQ19JTlRfSTJTX0NMT0NLX0ZSRVEiLAoJW19JT0NfTlIoVklESU9DX0lOVF9TX1NUQU5EQlkpXSAgICAgICAgPSAiVklESU9DX0lOVF9TX1NUQU5EQlkiLAoJW19JT0NfTlIoVklESU9DX0lOVF9TX0FVRElPX1JPVVRJTkcpXSAgPSAiVklESU9DX0lOVF9TX0FVRElPX1JPVVRJTkciLAoJW19JT0NfTlIoVklESU9DX0lOVF9HX0FVRElPX1JPVVRJTkcpXSAgPSAiVklESU9DX0lOVF9HX0FVRElPX1JPVVRJTkciLAoJW19JT0NfTlIoVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkcpXSAgPSAiVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkciLAoJW19JT0NfTlIoVklESU9DX0lOVF9HX1ZJREVPX1JPVVRJTkcpXSAgPSAiVklESU9DX0lOVF9HX1ZJREVPX1JPVVRJTkciLAoJW19JT0NfTlIoVklESU9DX0lOVF9TX0NSWVNUQUxfRlJFUSldICAgPSAiVklESU9DX0lOVF9TX0NSWVNUQUxfRlJFUSIKfTsKI2RlZmluZSBWNEwyX0lOVF9JT0NUTFMgQVJSQVlfU0laRSh2NGwyX2ludF9pb2N0bHMpCgpzdGF0aWMgdm9pZCB2NGxfcHJpbnRfcGl4X2ZtdCAoY2hhciAqcywgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqZm10KQp7CglwcmludGsgKCIlczogd2lkdGg9JWQsIGhlaWdodD0lZCwgZm9ybWF0PSVkLCBmaWVsZD0lcywgIgoJCSJieXRlc3BlcmxpbmU9JWQgc2l6ZWltYWdlPSVkLCBjb2xvcnNwYWNlPSVkXG4iLCBzLAoJCWZtdC0+d2lkdGgsZm10LT5oZWlnaHQsZm10LT5waXhlbGZvcm1hdCwKCQlwcnRfbmFtZXMoZm10LT5maWVsZCx2NGwyX2ZpZWxkX25hbWVzKSwKCQlmbXQtPmJ5dGVzcGVybGluZSxmbXQtPnNpemVpbWFnZSxmbXQtPmNvbG9yc3BhY2UpOwp9OwoKLyogQ29tbW9uIGlvY3RsIGRlYnVnIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5CiAgIGV4dGVybmFsIGlvY3RsIG1lc3NhZ2VzIGFzIHdlbGwgYXMgaW50ZXJuYWwgVjRMIGlvY3RsICovCnZvaWQgdjRsX3ByaW50a19pb2N0bCh1bnNpZ25lZCBpbnQgY21kKQp7CgljaGFyICpkaXI7CgoJc3dpdGNoIChfSU9DX0RJUihjbWQpKSB7CgljYXNlIF9JT0NfTk9ORTogICAgICAgICAgICAgIGRpciA9ICItLSI7IGJyZWFrOwoJY2FzZSBfSU9DX1JFQUQ6ICAgICAgICAgICAgICBkaXIgPSAici0iOyBicmVhazsKCWNhc2UgX0lPQ19XUklURTogICAgICAgICAgICAgZGlyID0gIi13IjsgYnJlYWs7CgljYXNlIF9JT0NfUkVBRCB8IF9JT0NfV1JJVEU6IGRpciA9ICJydyI7IGJyZWFrOwoJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICBkaXIgPSAiKkVSUioiOyBicmVhazsKCX0KCXN3aXRjaCAoX0lPQ19UWVBFKGNtZCkpIHsKCWNhc2UgJ2QnOgoJCXByaW50aygidjRsMl9pbnQgaW9jdGwgJXMsIGRpcj0lcyAoMHglMDh4KVxuIiwKCQkgICAgICAgKF9JT0NfTlIoY21kKSA8IFY0TDJfSU5UX0lPQ1RMUykgPwoJCSAgICAgICB2NGwyX2ludF9pb2N0bHNbX0lPQ19OUihjbWQpXSA6ICJVTktOT1dOIiwgZGlyLCBjbWQpOwoJCWJyZWFrOwojaWZkZWYgSEFWRV9WNEwxCgljYXNlICd2JzoKCQlwcmludGsoInY0bDEgaW9jdGwgJXMsIGRpcj0lcyAoMHglMDh4KVxuIiwKCQkgICAgICAgKF9JT0NfTlIoY21kKSA8IFY0TDFfSU9DVExTKSA/CgkJICAgICAgIHY0bDFfaW9jdGxzW19JT0NfTlIoY21kKV0gOiAiVU5LTk9XTiIsIGRpciwgY21kKTsKCQlicmVhazsKI2VuZGlmCgljYXNlICdWJzoKCQlwcmludGsoInY0bDIgaW9jdGwgJXMsIGRpcj0lcyAoMHglMDh4KVxuIiwKCQkgICAgICAgKF9JT0NfTlIoY21kKSA8IFY0TDJfSU9DVExTKSA/CgkJICAgICAgIHY0bDJfaW9jdGxzW19JT0NfTlIoY21kKV0gOiAiVU5LTk9XTiIsIGRpciwgY21kKTsKCQlicmVhazsKCglkZWZhdWx0OgoJCXByaW50aygidW5rbm93biBpb2N0bCAnJWMnLCBkaXI9JXMsICMlZCAoMHglMDh4KVxuIiwKCQkgICAgICAgX0lPQ19UWVBFKGNtZCksIGRpciwgX0lPQ19OUihjbWQpLCBjbWQpOwoJfQp9CgovKiBDb21tb24gaW9jdGwgZGVidWcgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkKICAgZXh0ZXJuYWwgaW9jdGwgbWVzc2FnZXMgYXMgd2VsbCBhcyBpbnRlcm5hbCBWNEwgaW9jdGwgYW5kIGl0cwogICBhcmd1bWVudHMgKi8Kdm9pZCB2NGxfcHJpbnRrX2lvY3RsX2FyZyhjaGFyICpzLHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKewoJcHJpbnRrKHMpOwoJcHJpbnRrKCI6ICIpOwoJdjRsX3ByaW50a19pb2N0bChjbWQpOwoJc3dpdGNoIChjbWQpIHsKCWNhc2UgVklESU9DX0lOVF9HX0NISVBfSURFTlQ6Cgl7CgkJZW51bSB2NGwyX2NoaXBfaWRlbnQgICpwPWFyZzsKCQlwcmludGsgKCIlczogY2hpcCBpZGVudD0lZFxuIiwgcywgKnApOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19QUklPUklUWToKCWNhc2UgVklESU9DX1NfUFJJT1JJVFk6Cgl7CgkJZW51bSB2NGwyX3ByaW9yaXR5ICpwPWFyZzsKCQlwcmludGsgKCIlczogcHJpb3JpdHk9JWRcbiIsIHMsICpwKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0lOVF9TX1RVTkVSX01PREU6Cgl7CgkJZW51bSB2NGwyX3R1bmVyX3R5cGUgKnA9YXJnOwoJCXByaW50ayAoIiVzOiB0dW5lciB0eXBlPSVkXG4iLCBzLCAqcCk7CgkJYnJlYWs7Cgl9CgljYXNlIERFQ09ERVJfU0VUX1ZCSV9CWVBBU1M6CgljYXNlIERFQ09ERVJfRU5BQkxFX09VVFBVVDoKCWNhc2UgREVDT0RFUl9HRVRfU1RBVFVTOgoJY2FzZSBERUNPREVSX1NFVF9PVVRQVVQ6CgljYXNlIERFQ09ERVJfU0VUX0lOUFVUOgoJY2FzZSBERUNPREVSX1NFVF9HUElPOgoJY2FzZSBERUNPREVSX1NFVF9OT1JNOgoJY2FzZSBWSURJT0NDQVBUVVJFOgoJY2FzZSBWSURJT0NTWU5DOgoJY2FzZSBWSURJT0NTV1JJVEVNT0RFOgoJY2FzZSBUVU5FUl9TRVRfVFlQRV9BRERSOgoJY2FzZSBUVU5FUl9TRVRfU1RBTkRCWToKCWNhc2UgVERBOTg4N19TRVRfQ09ORklHOgojaWZkZWYgX19PTERfVklESU9DXwoJY2FzZSBWSURJT0NfT1ZFUkxBWV9PTEQ6CiNlbmRpZgoJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgoJY2FzZSBWSURJT0NfR19PVVRQVVQ6CgljYXNlIFZJRElPQ19TX09VVFBVVDoKCWNhc2UgVklESU9DX1NUUkVBTU9OOgoJY2FzZSBWSURJT0NfR19JTlBVVDoKCWNhc2UgVklESU9DX09WRVJMQVk6CgljYXNlIFZJRElPQ19TX0lOUFVUOgoJewoJCWludCAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IHZhbHVlPSVkXG4iLCBzLCAqcCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19HX0FVRElPOgoJY2FzZSBWSURJT0NfU19BVURJTzoKCWNhc2UgVklESU9DX0VOVU1BVURJTzoKI2lmZGVmIF9fT0xEX1ZJRElPQ18KCWNhc2UgVklESU9DX0dfQVVESU9fT0xEOgojZW5kaWYKCXsKCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqcD1hcmc7CgoJCXByaW50ayAoIiVzOiBpbmRleD0lZCwgbmFtZT0lcywgY2FwYWJpbGl0eT0lZCwgbW9kZT0lZFxuIiwKCQkJcyxwLT5pbmRleCwgcC0+bmFtZSxwLT5jYXBhYmlsaXR5LCBwLT5tb2RlKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0dfQVVET1VUOgoJY2FzZSBWSURJT0NfU19BVURPVVQ6CgljYXNlIFZJRElPQ19FTlVNQVVET1VUOgojaWZkZWYgX19PTERfVklESU9DXwoJY2FzZSBWSURJT0NfR19BVURPVVRfT0xEOgojZW5kaWYKCXsKCQlzdHJ1Y3QgdjRsMl9hdWRpb291dCAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGluZGV4PSVkLCBuYW1lPSVzLCBjYXBhYmlsaXR5PSVkLCBtb2RlPSVkXG4iLCBzLAoJCQkJcC0+aW5kZXgsIHAtPm5hbWUsIHAtPmNhcGFiaWxpdHkscC0+bW9kZSk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19RQlVGOgoJY2FzZSBWSURJT0NfRFFCVUY6CgljYXNlIFZJRElPQ19RVUVSWUJVRjoKCXsKCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnA9YXJnOwoJCXN0cnVjdCB2NGwyX3RpbWVjb2RlICp0Yz0mcC0+dGltZWNvZGU7CgkJcHJpbnRrICgiJXM6ICUwMmxkOiUwMmQ6JTAyZC4lMDhsZCBpbmRleD0lZCwgdHlwZT0lcywgIgoJCQkiYnl0ZXN1c2VkPSVkLCBmbGFncz0weCUwOHgsICIKCQkJImZpZWxkPSUwZCwgc2VxdWVuY2U9JWQsIG1lbW9yeT0lcywgb2Zmc2V0L3VzZXJwdHI9MHglMDhseFxuIiwKCQkJCXMsCgkJCQkocC0+dGltZXN0YW1wLnR2X3NlYy8zNjAwKSwKCQkJCShpbnQpKHAtPnRpbWVzdGFtcC50dl9zZWMvNjApJTYwLAoJCQkJKGludCkocC0+dGltZXN0YW1wLnR2X3NlYyU2MCksCgkJCQlwLT50aW1lc3RhbXAudHZfdXNlYywKCQkJCXAtPmluZGV4LAoJCQkJcHJ0X25hbWVzKHAtPnR5cGUsdjRsMl90eXBlX25hbWVzKSwKCQkJCXAtPmJ5dGVzdXNlZCxwLT5mbGFncywKCQkJCXAtPmZpZWxkLHAtPnNlcXVlbmNlLAoJCQkJcHJ0X25hbWVzKHAtPm1lbW9yeSx2NGwyX21lbW9yeV9uYW1lcyksCgkJCQlwLT5tLnVzZXJwdHIpOwoJCXByaW50ayAoIiVzOiB0aW1lY29kZT0gJTAyZDolMDJkOiUwMmQgdHlwZT0lZCwgIgoJCQkiZmxhZ3M9MHglMDh4LCBmcmFtZXM9JWQsIHVzZXJiaXRzPTB4JTA4eFxuIiwKCQkJCXMsdGMtPmhvdXJzLHRjLT5taW51dGVzLHRjLT5zZWNvbmRzLAoJCQkJdGMtPnR5cGUsIHRjLT5mbGFncywgdGMtPmZyYW1lcywgKihfX3UzMiAqKSB0Yy0+dXNlcmJpdHMpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfUVVFUllDQVA6Cgl7CgkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGRyaXZlcj0lcywgY2FyZD0lcywgYnVzPSVzLCB2ZXJzaW9uPTB4JTA4eCwgIgoJCQkiY2FwYWJpbGl0aWVzPTB4JTA4eFxuIiwgcywKCQkJCXAtPmRyaXZlcixwLT5jYXJkLHAtPmJ1c19pbmZvLAoJCQkJcC0+dmVyc2lvbiwKCQkJCXAtPmNhcGFiaWxpdGllcyk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19HX0NUUkw6CgljYXNlIFZJRElPQ19TX0NUUkw6CiNpZmRlZiBfX09MRF9WSURJT0NfCgljYXNlIFZJRElPQ19TX0NUUkxfT0xEOgojZW5kaWYKCXsKCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpwPWFyZzsKCQlwcmludGsgKCIlczogaWQ9JWQsIHZhbHVlPSVkXG4iLCBzLCBwLT5pZCwgcC0+dmFsdWUpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19FWFRfQ1RSTFM6CgljYXNlIFZJRElPQ19TX0VYVF9DVFJMUzoKCWNhc2UgVklESU9DX1RSWV9FWFRfQ1RSTFM6Cgl7CgkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpwID0gYXJnOwoJCWludCBpOwoKCQlwcmludGsoIiVzOiBjdHJsX2NsYXNzPSVkLCBjb3VudD0lZFxuIiwgcywgcC0+Y3RybF9jbGFzcywgcC0+Y291bnQpOwoJCWZvciAoaSA9IDA7IGkgPCBwLT5jb3VudDsgaSsrKSB7CgkJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjID0gJnAtPmNvbnRyb2xzW2ldOwoJCQlpZiAoY21kID09IFZJRElPQ19HX0VYVF9DVFJMUykKCQkJCXByaW50aygiJXM6IGlkPSVkXG4iLCBzLCBjLT5pZCk7CgkJCWVsc2UKCQkJCXByaW50aygiJXM6IGlkPSVkLCB2YWx1ZT0lZFxuIiwgcywgYy0+aWQsIGMtPnZhbHVlKTsKCQl9CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19HX0NST1A6CgljYXNlIFZJRElPQ19TX0NST1A6Cgl7CgkJc3RydWN0IHY0bDJfY3JvcCAqcD1hcmc7CgkJLypGSVhNRTogU2hvdWxkIGFsc28gc2hvdyByZWN0IHN0cnVjdHMgKi8KCQlwcmludGsgKCIlczogdHlwZT0lZFxuIiwgcywgcC0+dHlwZSk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19DUk9QQ0FQOgojaWZkZWYgX19PTERfVklESU9DXwoJY2FzZSBWSURJT0NfQ1JPUENBUF9PTEQ6CiNlbmRpZgoJewoJCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKnA9YXJnOwoJCS8qRklYTUU6IFNob3VsZCBhbHNvIHNob3cgcmVjdCBzdHJ1Y3RzICovCgkJcHJpbnRrICgiJXM6IHR5cGU9JWRcbiIsIHMsIHAtPnR5cGUpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfSU5UX0RFQ09ERV9WQklfTElORToKCXsKCQlzdHJ1Y3QgdjRsMl9kZWNvZGVfdmJpX2xpbmUgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBpc19zZWNvbmRfZmllbGQ9JWQsIHB0cj0weCUwOGx4LCBsaW5lPSVkLCAiCgkJCSJ0eXBlPSVkXG4iLCBzLAoJCQkJcC0+aXNfc2Vjb25kX2ZpZWxkLCh1bnNpZ25lZCBsb25nKXAtPnAscC0+bGluZSxwLT50eXBlKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0VOVU1fRk1UOgoJewoJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBpbmRleD0lZCwgdHlwZT0lZCwgZmxhZ3M9JWQsIGRlc2NyaXB0aW9uPSVzLCIKCQkJIiBwaXhlbGZvcm1hdD0lZFxuIiwgcywKCQkJCXAtPmluZGV4LCBwLT50eXBlLCBwLT5mbGFncyxwLT5kZXNjcmlwdGlvbiwKCQkJCXAtPnBpeGVsZm9ybWF0KTsKCgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19HX0ZNVDoKCWNhc2UgVklESU9DX1NfRk1UOgoJY2FzZSBWSURJT0NfVFJZX0ZNVDoKCXsKCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKnA9YXJnOwoJCXByaW50ayAoIiVzOiB0eXBlPSVzXG4iLCBzLAoJCQkJcHJ0X25hbWVzKHAtPnR5cGUsdjRsMl90eXBlX25hbWVzKSk7CgkJc3dpdGNoIChwLT50eXBlKSB7CgkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CgkJCXY0bF9wcmludF9waXhfZm10IChzLCAmcC0+Zm10LnBpeCk7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJCX0KCX0KCWNhc2UgVklESU9DX0dfRkJVRjoKCWNhc2UgVklESU9DX1NfRkJVRjoKCXsKCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGNhcGFiaWxpdHk9JWQsIGZsYWdzPSVkLCBiYXNlPTB4JTA4bHhcbiIsIHMsCgkJCQlwLT5jYXBhYmlsaXR5LHAtPmZsYWdzLCAodW5zaWduZWQgbG9uZylwLT5iYXNlKTsKCQl2NGxfcHJpbnRfcGl4X2ZtdCAocywgJnAtPmZtdCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgoJewoJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IHR1bmVyPSVkLCB0eXBlPSVkLCBmcmVxdWVuY3k9JWRcbiIsIHMsCgkJCQlwLT50dW5lcixwLT50eXBlLHAtPmZyZXF1ZW5jeSk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19FTlVNSU5QVVQ6Cgl7CgkJc3RydWN0IHY0bDJfaW5wdXQgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBpbmRleD0lZCwgbmFtZT0lcywgdHlwZT0lZCwgYXVkaW9zZXQ9JWQsICIKCQkJInR1bmVyPSVkLCBzdGQ9JUxkLCBzdGF0dXM9JWRcbiIsIHMsCgkJCQlwLT5pbmRleCxwLT5uYW1lLHAtPnR5cGUscC0+YXVkaW9zZXQsCgkJCQlwLT50dW5lciwKCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcC0+c3RkLAoJCQkJcC0+c3RhdHVzKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0dfSlBFR0NPTVA6CgljYXNlIFZJRElPQ19TX0pQRUdDT01QOgoJewoJCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IHF1YWxpdHk9JWQsIEFQUG49JWQsIEFQUF9sZW49JWQsIENPTV9sZW49JWQsIgoJCQkiIGpwZWdfbWFya2Vycz0lZFxuIiwgcywKCQkJCXAtPnF1YWxpdHkscC0+QVBQbixwLT5BUFBfbGVuLAoJCQkJcC0+Q09NX2xlbixwLT5qcGVnX21hcmtlcnMpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19NT0RVTEFUT1I6CgljYXNlIFZJRElPQ19TX01PRFVMQVRPUjoKCXsKCQlzdHJ1Y3QgdjRsMl9tb2R1bGF0b3IgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBpbmRleD0lZCwgbmFtZT0lcywgY2FwYWJpbGl0eT0lZCwgcmFuZ2Vsb3c9JWQsIgoJCQkiIHJhbmdlaGlnaD0lZCwgdHhzdWJjaGFucz0lZFxuIiwgcywKCQkJCXAtPmluZGV4LCBwLT5uYW1lLHAtPmNhcGFiaWxpdHkscC0+cmFuZ2Vsb3csCgkJCQlwLT5yYW5nZWhpZ2gscC0+dHhzdWJjaGFucyk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19HX01QRUdDT01QOgoJY2FzZSBWSURJT0NfU19NUEVHQ09NUDoKCXsKCQlzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICpwPWFyZzsKCQkvKkZJWE1FOiBTZXZlcmFsIGZpZWxkcyBub3Qgc2hvd24gKi8KCQlwcmludGsgKCIlczogdHNfcGlkX3BtdD0lZCwgdHNfcGlkX2F1ZGlvPSVkLCB0c19waWRfdmlkZW89JWQsICIKCQkJInRzX3BpZF9wY3I9JWQsIHBzX3NpemU9JWQsIGF1X3NhbXBsZV9yYXRlPSVkLCAiCgkJCSJhdV9wZXNpZD0lYywgdmlfZnJhbWVfcmF0ZT0lZCwgdmlfZnJhbWVzX3Blcl9nb3A9JWQsICIKCQkJInZpX2JmcmFtZXNfY291bnQ9JWQsIHZpX3Blc2lkPSVjXG4iLCBzLAoJCQkJcC0+dHNfcGlkX3BtdCxwLT50c19waWRfYXVkaW8sIHAtPnRzX3BpZF92aWRlbywKCQkJCXAtPnRzX3BpZF9wY3IsIHAtPnBzX3NpemUsIHAtPmF1X3NhbXBsZV9yYXRlLAoJCQkJcC0+YXVfcGVzaWQsIHAtPnZpX2ZyYW1lX3JhdGUsCgkJCQlwLT52aV9mcmFtZXNfcGVyX2dvcCwgcC0+dmlfYmZyYW1lc19jb3VudCwKCQkJCXAtPnZpX3Blc2lkKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0VOVU1PVVRQVVQ6Cgl7CgkJc3RydWN0IHY0bDJfb3V0cHV0ICpwPWFyZzsKCQlwcmludGsgKCIlczogaW5kZXg9JWQsIG5hbWU9JXMsdHlwZT0lZCwgYXVkaW9zZXQ9JWQsICIKCQkJIm1vZHVsYXRvcj0lZCwgc3RkPSVMZFxuIiwKCQkJCXMscC0+aW5kZXgscC0+bmFtZSxwLT50eXBlLHAtPmF1ZGlvc2V0LAoJCQkJcC0+bW9kdWxhdG9yLAoJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwLT5zdGQpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfUVVFUllDVFJMOgoJewoJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGlkPSVkLCB0eXBlPSVkLCBuYW1lPSVzLCBtaW4vbWF4PSVkLyVkLCIKCQkJIiBzdGVwPSVkLCBkZWZhdWx0PSVkLCBmbGFncz0weCUwOHhcbiIsIHMsCgkJCQlwLT5pZCxwLT50eXBlLHAtPm5hbWUscC0+bWluaW11bSxwLT5tYXhpbXVtLAoJCQkJcC0+c3RlcCxwLT5kZWZhdWx0X3ZhbHVlLHAtPmZsYWdzKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX1FVRVJZTUVOVToKCXsKCQlzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBpZD0lZCwgaW5kZXg9JWQsIG5hbWU9JXNcbiIsIHMsCgkJCQlwLT5pZCxwLT5pbmRleCxwLT5uYW1lKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0lOVF9HX1JFR0lTVEVSOgoJY2FzZSBWSURJT0NfSU5UX1NfUkVHSVNURVI6Cgl7CgkJc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBpMmNfaWQ9JWQsIHJlZz0lbHUsIHZhbD0lZFxuIiwgcywKCQkJCXAtPmkyY19pZCxwLT5yZWcscC0+dmFsKTsKCgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19SRVFCVUZTOgoJewoJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpwPWFyZzsKCQlwcmludGsgKCIlczogY291bnQ9JWQsIHR5cGU9JXMsIG1lbW9yeT0lc1xuIiwgcywKCQkJCXAtPmNvdW50LAoJCQkJcHJ0X25hbWVzKHAtPnR5cGUsdjRsMl90eXBlX25hbWVzKSwKCQkJCXBydF9uYW1lcyhwLT5tZW1vcnksdjRsMl9tZW1vcnlfbmFtZXMpKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0lOVF9TX0FVRElPX1JPVVRJTkc6CgljYXNlIFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HOgoJY2FzZSBWSURJT0NfSU5UX0dfQVVESU9fUk9VVElORzoKCWNhc2UgVklESU9DX0lOVF9HX1ZJREVPX1JPVVRJTkc6Cgl7CgkJc3RydWN0IHY0bDJfcm91dGluZyAgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBpbnB1dD0weCV4LCBvdXRwdXQ9MHgleFxuIiwgcywgcC0+aW5wdXQsIHAtPm91dHB1dCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVE6Cgl7CgkJc3RydWN0IHY0bDJfY3J5c3RhbF9mcmVxICpwPWFyZzsKCQlwcmludGsgKCIlczogZnJlcT0ldSwgZmxhZ3M9MHgleFxuIiwgcywgcC0+ZnJlcSwgcC0+ZmxhZ3MpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19TTElDRURfVkJJX0NBUDoKCXsKCQlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2NhcCAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IHNlcnZpY2Vfc2V0PSVkXG4iLCBzLAoJCQkJcC0+c2VydmljZV9zZXQpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfSU5UX1NfVkJJX0RBVEE6CgljYXNlIFZJRElPQ19JTlRfR19WQklfREFUQToKCXsKCQlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEgICpwPWFyZzsKCQlwcmludGsgKCIlczogaWQ9JWQsIGZpZWxkPSVkLCBsaW5lPSVkXG4iLCBzLAoJCQkJcC0+aWQsIHAtPmZpZWxkLCBwLT5saW5lKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0VOVU1TVEQ6Cgl7CgkJc3RydWN0IHY0bDJfc3RhbmRhcmQgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBpbmRleD0lZCwgaWQ9JUxkLCBuYW1lPSVzLCBmcHM9JWQvJWQsICIKCQkJImZyYW1lbGluZXM9JWRcbiIsIHMsIHAtPmluZGV4LAoJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwLT5pZCwgcC0+bmFtZSwKCQkJCXAtPmZyYW1lcGVyaW9kLm51bWVyYXRvciwKCQkJCXAtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yLAoJCQkJcC0+ZnJhbWVsaW5lcyk7CgoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19QQVJNOgoJY2FzZSBWSURJT0NfU19QQVJNOgojaWZkZWYgX19PTERfVklESU9DXwoJY2FzZSBWSURJT0NfU19QQVJNX09MRDoKI2VuZGlmCgl7CgkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IHR5cGU9JWRcbiIsIHMsIHAtPnR5cGUpOwoKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0dfVFVORVI6CgljYXNlIFZJRElPQ19TX1RVTkVSOgoJewoJCXN0cnVjdCB2NGwyX3R1bmVyICpwPWFyZzsKCQlwcmludGsgKCIlczogaW5kZXg9JWQsIG5hbWU9JXMsIHR5cGU9JWQsIGNhcGFiaWxpdHk9JWQsICIKCQkJInJhbmdlbG93PSVkLCByYW5nZWhpZ2g9JWQsIHNpZ25hbD0lZCwgYWZjPSVkLCAiCgkJCSJyeHN1YmNoYW5zPSVkLCBhdWRtb2RlPSVkXG4iLCBzLAoJCQkJcC0+aW5kZXgsIHAtPm5hbWUsIHAtPnR5cGUsCgkJCQlwLT5jYXBhYmlsaXR5LCBwLT5yYW5nZWxvdyxwLT5yYW5nZWhpZ2gsCgkJCQlwLT5yeHN1YmNoYW5zLCBwLT5hdWRtb2RlLCBwLT5zaWduYWwsCgkJCQlwLT5hZmMpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHVkJJRk1UOgoJY2FzZSBWSURJT0NTVkJJRk1UOgoJewoJCXN0cnVjdCB2YmlfZm9ybWF0ICpwPWFyZzsKCQlwcmludGsgKCIlczogc2FtcGxpbmdfcmF0ZT0lZCwgc2FtcGxlc19wZXJfbGluZT0lZCwgIgoJCQkic2FtcGxlX2Zvcm1hdD0lZCwgc3RhcnQ9JWQvJWQsIGNvdW50PSVkLyVkLCBmbGFncz0lZFxuIiwgcywKCQkJCXAtPnNhbXBsaW5nX3JhdGUscC0+c2FtcGxlc19wZXJfbGluZSwKCQkJCXAtPnNhbXBsZV9mb3JtYXQscC0+c3RhcnRbMF0scC0+c3RhcnRbMV0sCgkJCQlwLT5jb3VudFswXSxwLT5jb3VudFsxXSxwLT5mbGFncyk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ0dBVURJTzoKCWNhc2UgVklESU9DU0FVRElPOgoJewoJCXN0cnVjdCB2aWRlb19hdWRpbyAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGF1ZGlvPSVkLCB2b2x1bWU9JWQsIGJhc3M9JWQsIHRyZWJsZT0lZCwgIgoJCQkiZmxhZ3M9JWQsIG5hbWU9JXMsIG1vZGU9JWQsIGJhbGFuY2U9JWQsIHN0ZXA9JWRcbiIsCgkJCQlzLHAtPmF1ZGlvLHAtPnZvbHVtZSxwLT5iYXNzLCBwLT50cmVibGUsCgkJCQlwLT5mbGFncyxwLT5uYW1lLHAtPm1vZGUscC0+YmFsYW5jZSxwLT5zdGVwKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DR0ZCVUY6CgljYXNlIFZJRElPQ1NGQlVGOgoJewoJCXN0cnVjdCB2aWRlb19idWZmZXIgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBiYXNlPSUwOGx4LCBoZWlnaHQ9JWQsIHdpZHRoPSVkLCBkZXB0aD0lZCwgIgoJCQkiYnl0ZXNwZXJsaW5lPSVkXG4iLCBzLAoJCQkJKHVuc2lnbmVkIGxvbmcpIHAtPmJhc2UsIHAtPmhlaWdodCwgcC0+d2lkdGgsCgkJCQlwLT5kZXB0aCxwLT5ieXRlc3BlcmxpbmUpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHQ0FQOgoJewoJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICpwPWFyZzsKCQlwcmludGsgKCIlczogbmFtZT0lcywgdHlwZT0lZCwgY2hhbm5lbHM9JWQsIGF1ZGlvcz0lZCwgIgoJCQkibWF4d2lkdGg9JWQsIG1heGhlaWdodD0lZCwgbWlud2lkdGg9JWQsIG1pbmhlaWdodD0lZFxuIiwKCQkJCXMscC0+bmFtZSxwLT50eXBlLHAtPmNoYW5uZWxzLHAtPmF1ZGlvcywKCQkJCXAtPm1heHdpZHRoLHAtPm1heGhlaWdodCxwLT5taW53aWR0aCwKCQkJCXAtPm1pbmhlaWdodCk7CgoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHQ0FQVFVSRToKCWNhc2UgVklESU9DU0NBUFRVUkU6Cgl7CgkJc3RydWN0IHZpZGVvX2NhcHR1cmUgKnA9YXJnOwoJCXByaW50ayAoIiVzOiB4PSVkLCB5PSVkLCB3aWR0aD0lZCwgaGVpZ2h0PSVkLCBkZWNpbWF0aW9uPSVkLCIKCQkJIiBmbGFncz0lZFxuIiwgcywKCQkJCXAtPngsIHAtPnkscC0+d2lkdGgsIHAtPmhlaWdodCwKCQkJCXAtPmRlY2ltYXRpb24scC0+ZmxhZ3MpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHQ0hBTjoKCWNhc2UgVklESU9DU0NIQU46Cgl7CgkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBjaGFubmVsPSVkLCBuYW1lPSVzLCB0dW5lcnM9JWQsIGZsYWdzPSVkLCAiCgkJCSJ0eXBlPSVkLCBub3JtPSVkXG4iLCBzLAoJCQkJcC0+Y2hhbm5lbCxwLT5uYW1lLHAtPnR1bmVycywKCQkJCXAtPmZsYWdzLHAtPnR5cGUscC0+bm9ybSk7CgoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NTTUlDUk9DT0RFOgoJewoJCXN0cnVjdCB2aWRlb19jb2RlICpwPWFyZzsKCQlwcmludGsgKCIlczogbG9hZHdoYXQ9JXMsIGRhdGFzaXplPSVkXG4iLCBzLAoJCQkJcC0+bG9hZHdoYXQscC0+ZGF0YXNpemUpOwoJCWJyZWFrOwoJfQoJY2FzZSBERUNPREVSX0dFVF9DQVBBQklMSVRJRVM6Cgl7CgkJc3RydWN0IHZpZGVvX2RlY29kZXJfY2FwYWJpbGl0eSAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGZsYWdzPSVkLCBpbnB1dHM9JWQsIG91dHB1dHM9JWRcbiIsIHMsCgkJCQlwLT5mbGFncyxwLT5pbnB1dHMscC0+b3V0cHV0cyk7CgkJYnJlYWs7Cgl9CgljYXNlIERFQ09ERVJfSU5JVDoKCXsKCQlzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9pbml0ICpwPWFyZzsKCQlwcmludGsgKCIlczogbGVuPSVjXG4iLCBzLCBwLT5sZW4pOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHUExBWUlORk86Cgl7CgkJc3RydWN0IHZpZGVvX2luZm8gKnA9YXJnOwoJCXByaW50ayAoIiVzOiBmcmFtZV9jb3VudD0lZCwgaF9zaXplPSVkLCB2X3NpemU9JWQsICIKCQkJInNtcHRlX3RpbWVjb2RlPSVkLCBwaWN0dXJlX3R5cGU9JWQsICIKCQkJInRlbXBvcmFsX3JlZmVyZW5jZT0lZCwgdXNlcl9kYXRhPSVzXG4iLCBzLAoJCQkJcC0+ZnJhbWVfY291bnQsIHAtPmhfc2l6ZSwKCQkJCXAtPnZfc2l6ZSwgcC0+c21wdGVfdGltZWNvZGUsCgkJCQlwLT5waWN0dXJlX3R5cGUsIHAtPnRlbXBvcmFsX3JlZmVyZW5jZSwKCQkJCXAtPnVzZXJfZGF0YSk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ0tFWToKCXsKCQlzdHJ1Y3QgdmlkZW9fa2V5ICpwPWFyZzsKCQlwcmludGsgKCIlczoga2V5PSVzLCBmbGFncz0lZFxuIiwgcywKCQkJCXAtPmtleSwgcC0+ZmxhZ3MpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHTUJVRjoKCXsKCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IHNpemU9JWQsIGZyYW1lcz0lZCwgb2Zmc2V0cz0weCUwOGx4XG4iLCBzLAoJCQkJcC0+c2l6ZSwKCQkJCXAtPmZyYW1lcywKCQkJCSh1bnNpZ25lZCBsb25nKXAtPm9mZnNldHMpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NNQ0FQVFVSRToKCXsKCQlzdHJ1Y3QgdmlkZW9fbW1hcCAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGZyYW1lPSVkLCBoZWlnaHQ9JWQsIHdpZHRoPSVkLCBmb3JtYXQ9JWRcbiIsIHMsCgkJCQlwLT5mcmFtZSwKCQkJCXAtPmhlaWdodCwgcC0+d2lkdGgsCgkJCQlwLT5mb3JtYXQpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHUElDVDoKCWNhc2UgVklESU9DU1BJQ1Q6CgljYXNlIERFQ09ERVJfU0VUX1BJQ1RVUkU6Cgl7CgkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnA9YXJnOwoKCQlwcmludGsgKCIlczogYnJpZ2h0bmVzcz0lZCwgaHVlPSVkLCBjb2xvdXI9JWQsIGNvbnRyYXN0PSVkLCIKCQkJIiB3aGl0ZW5lc3M9JWQsIGRlcHRoPSVkLCBwYWxldHRlPSVkXG4iLCBzLAoJCQkJcC0+YnJpZ2h0bmVzcywgcC0+aHVlLCBwLT5jb2xvdXIsCgkJCQlwLT5jb250cmFzdCwgcC0+d2hpdGVuZXNzLCBwLT5kZXB0aCwKCQkJCXAtPnBhbGV0dGUpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NTUExBWU1PREU6Cgl7CgkJc3RydWN0IHZpZGVvX3BsYXlfbW9kZSAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IG1vZGU9JWQsIHAxPSVkLCBwMj0lZFxuIiwgcywKCQkJCXAtPm1vZGUscC0+cDEscC0+cDIpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHVFVORVI6CgljYXNlIFZJRElPQ1NUVU5FUjoKCXsKCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnA9YXJnOwoJCXByaW50ayAoIiVzOiB0dW5lcj0lZCwgbmFtZT0lcywgcmFuZ2Vsb3c9JWxkLCByYW5nZWhpZ2g9JWxkLCAiCgkJCSJmbGFncz0lZCwgbW9kZT0lZCwgc2lnbmFsPSVkXG4iLCBzLAoJCQkJcC0+dHVuZXIsIHAtPm5hbWUscC0+cmFuZ2Vsb3csIHAtPnJhbmdlaGlnaCwKCQkJCXAtPmZsYWdzLHAtPm1vZGUsIHAtPnNpZ25hbCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ0dVTklUOgoJewoJCXN0cnVjdCB2aWRlb191bml0ICpwPWFyZzsKCQlwcmludGsgKCIlczogdmlkZW89JWQsIHZiaT0lZCwgcmFkaW89JWQsIGF1ZGlvPSVkLCAiCgkJCSJ0ZWxldGV4dD0lZFxuIiwgcywKCQkJCXAtPnZpZGVvLHAtPnZiaSxwLT5yYWRpbyxwLT5hdWRpbyxwLT50ZWxldGV4dCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ0dXSU46CgljYXNlIFZJRElPQ1NXSU46Cgl7CgkJc3RydWN0IHZpZGVvX3dpbmRvdyAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IHg9JWQsIHk9JWQsIHdpZHRoPSVkLCBoZWlnaHQ9JWQsIGNocm9tYWtleT0lZCwiCgkJCSIgZmxhZ3M9JWQsIGNsaXBjb3VudD0lZFxuIiwgcywKCQkJCXAtPngsIHAtPnkscC0+d2lkdGgsIHAtPmhlaWdodCwKCQkJCXAtPmNocm9tYWtleSxwLT5mbGFncywKCQkJCXAtPmNsaXBjb3VudCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUToKCWNhc2UgVklESU9DX0lOVF9JMlNfQ0xPQ0tfRlJFUToKCWNhc2UgVklESU9DX0lOVF9TX1NUQU5EQlk6Cgl7CgkJdTMyICpwPWFyZzsKCgkJcHJpbnRrICgiJXM6IHZhbHVlPSVkXG4iLCBzLCAqcCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ0dGUkVROgoJY2FzZSBWSURJT0NTRlJFUToKCXsKCQl1bnNpZ25lZCBsb25nICpwPWFyZzsKCQlwcmludGsgKCIlczogdmFsdWU9JWx1XG4iLCBzLCAqcCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19HX1NURDoKCWNhc2UgVklESU9DX1NfU1REOgoJY2FzZSBWSURJT0NfUVVFUllTVEQ6Cgl7CgkJdjRsMl9zdGRfaWQgKnA9YXJnOwoKCQlwcmludGsgKCIlczogdmFsdWU9JUx1XG4iLCBzLCAodW5zaWduZWQgbG9uZyBsb25nKSpwKTsKCQlicmVhazsKCX0KCX0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNvbnRyb2wgaGFuZGxpbmcJCQkgICAgICovCgovKiBDaGVjayBmb3IgY29ycmVjdG5lc3Mgb2YgdGhlIGN0cmwncyB2YWx1ZSBiYXNlZCBvbiB0aGUgZGF0YSBmcm9tCiAgIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBhbmQgdGhlIGF2YWlsYWJsZSBtZW51IGl0ZW1zLiBOb3RlIHRoYXQKICAgbWVudV9pdGVtcyBtYXkgYmUgTlVMTCwgaW4gdGhhdCBjYXNlIGl0IGlzIGlnbm9yZWQuICovCmludCB2NGwyX2N0cmxfY2hlY2soc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmN0cmwsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsCgkJY29uc3QgY2hhciAqKm1lbnVfaXRlbXMpCnsKCWlmIChxY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCkKCQlyZXR1cm4gLUVJTlZBTDsKCWlmIChxY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19HUkFCQkVEKQoJCXJldHVybiAtRUJVU1k7CglpZiAocWN0cmwtPnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfQlVUVE9OIHx8CgkgICAgcWN0cmwtPnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjY0IHx8CgkgICAgcWN0cmwtPnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUykKCQlyZXR1cm4gMDsKCWlmIChjdHJsLT52YWx1ZSA8IHFjdHJsLT5taW5pbXVtIHx8IGN0cmwtPnZhbHVlID4gcWN0cmwtPm1heGltdW0pCgkJcmV0dXJuIC1FUkFOR0U7CglpZiAocWN0cmwtPnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfTUVOVSAmJiBtZW51X2l0ZW1zICE9IE5VTEwpIHsKCQlpZiAobWVudV9pdGVtc1tjdHJsLT52YWx1ZV0gPT0gTlVMTCB8fAoJCSAgICBtZW51X2l0ZW1zW2N0cmwtPnZhbHVlXVswXSA9PSAnXDAnKQoJCQlyZXR1cm4gLUVJTlZBTDsKCX0KCXJldHVybiAwOwp9CgovKiBSZXR1cm5zIE5VTEwgb3IgYSBjaGFyYWN0ZXIgcG9pbnRlciBhcnJheSBjb250YWluaW5nIHRoZSBtZW51IGZvcgogICB0aGUgZ2l2ZW4gY29udHJvbCBJRC4gVGhlIHBvaW50ZXIgYXJyYXkgZW5kcyB3aXRoIGEgTlVMTCBwb2ludGVyLgogICBBbiBlbXB0eSBzdHJpbmcgc2lnbmlmaWVzIGEgbWVudSBlbnRyeSB0aGF0IGlzIGludmFsaWQuIFRoaXMgYWxsb3dzCiAgIGRyaXZlcnMgdG8gZGlzYWJsZSBjZXJ0YWluIG9wdGlvbnMgaWYgaXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KY29uc3QgY2hhciAqKnY0bDJfY3RybF9nZXRfbWVudSh1MzIgaWQpCnsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXFbXSA9IHsKCQkiNDQuMSBrSHoiLAoJCSI0OCBrSHoiLAoJCSIzMiBrSHoiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19lbmNvZGluZ1tdID0gewoJCSJMYXllciBJIiwKCQkiTGF5ZXIgSUkiLAoJCSJMYXllciBJSUkiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19sMV9iaXRyYXRlW10gPSB7CgkJIjMyIGticHMiLAoJCSI2NCBrYnBzIiwKCQkiOTYga2JwcyIsCgkJIjEyOCBrYnBzIiwKCQkiMTYwIGticHMiLAoJCSIxOTIga2JwcyIsCgkJIjIyNCBrYnBzIiwKCQkiMjU2IGticHMiLAoJCSIyODgga2JwcyIsCgkJIjMyMCBrYnBzIiwKCQkiMzUyIGticHMiLAoJCSIzODQga2JwcyIsCgkJIjQxNiBrYnBzIiwKCQkiNDQ4IGticHMiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19sMl9iaXRyYXRlW10gPSB7CgkJIjMyIGticHMiLAoJCSI0OCBrYnBzIiwKCQkiNTYga2JwcyIsCgkJIjY0IGticHMiLAoJCSI4MCBrYnBzIiwKCQkiOTYga2JwcyIsCgkJIjExMiBrYnBzIiwKCQkiMTI4IGticHMiLAoJCSIxNjAga2JwcyIsCgkJIjE5MiBrYnBzIiwKCQkiMjI0IGticHMiLAoJCSIyNTYga2JwcyIsCgkJIjMyMCBrYnBzIiwKCQkiMzg0IGticHMiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19sM19iaXRyYXRlW10gPSB7CgkJIjMyIGticHMiLAoJCSI0MCBrYnBzIiwKCQkiNDgga2JwcyIsCgkJIjU2IGticHMiLAoJCSI2NCBrYnBzIiwKCQkiODAga2JwcyIsCgkJIjk2IGticHMiLAoJCSIxMTIga2JwcyIsCgkJIjEyOCBrYnBzIiwKCQkiMTYwIGticHMiLAoJCSIxOTIga2JwcyIsCgkJIjIyNCBrYnBzIiwKCQkiMjU2IGticHMiLAoJCSIzMjAga2JwcyIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX21vZGVbXSA9IHsKCQkiU3RlcmVvIiwKCQkiSm9pbnQgU3RlcmVvIiwKCQkiRHVhbCIsCgkJIk1vbm8iLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19tb2RlX2V4dGVuc2lvbltdID0gewoJCSJCb3VuZCA0IiwKCQkiQm91bmQgOCIsCgkJIkJvdW5kIDEyIiwKCQkiQm91bmQgMTYiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19lbXBoYXNpc1tdID0gewoJCSJObyBFbXBoYXNpcyIsCgkJIjUwLzE1IHVzIiwKCQkiQ0NJVFQgSjE3IiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fY3JjW10gPSB7CgkJIk5vIENSQyIsCgkJIjE2LWJpdCBDUkMiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ192aWRlb19lbmNvZGluZ1tdID0gewoJCSJNUEVHLTEiLAoJCSJNUEVHLTIiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ192aWRlb19hc3BlY3RbXSA9IHsKCQkiMXgxIiwKCQkiNHgzIiwKCQkiMTZ4OSIsCgkJIjIuMjF4MSIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX3ZpZGVvX2JpdHJhdGVfbW9kZVtdID0gewoJCSJWYXJpYWJsZSBCaXRyYXRlIiwKCQkiQ29uc3RhbnQgQml0cmF0ZSIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX3N0cmVhbV90eXBlW10gPSB7CgkJIk1QRUctMiBQcm9ncmFtIFN0cmVhbSIsCgkJIk1QRUctMiBUcmFuc3BvcnQgU3RyZWFtIiwKCQkiTVBFRy0xIFN5c3RlbSBTdHJlYW0iLAoJCSJNUEVHLTIgRFZELWNvbXBhdGlibGUgU3RyZWFtIiwKCQkiTVBFRy0xIFZDRC1jb21wYXRpYmxlIFN0cmVhbSIsCgkJIk1QRUctMiBTVkNELWNvbXBhdGlibGUgU3RyZWFtIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfc3RyZWFtX3ZiaV9mbXRbXSA9IHsKCQkiTm8gVkJJIiwKCQkiVkJJIGluIHByaXZhdGUgcGFja2V0cywgSVZUViBmb3JtYXQiLAoJCU5VTEwKCX07CgoJc3dpdGNoIChpZCkgewoJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROgoJCQlyZXR1cm4gbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxOwoJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKCQkJcmV0dXJuIG1wZWdfYXVkaW9fZW5jb2Rpbmc7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6CgkJCXJldHVybiBtcGVnX2F1ZGlvX2wxX2JpdHJhdGU7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEU6CgkJCXJldHVybiBtcGVnX2F1ZGlvX2wyX2JpdHJhdGU7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6CgkJCXJldHVybiBtcGVnX2F1ZGlvX2wzX2JpdHJhdGU7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CgkJCXJldHVybiBtcGVnX2F1ZGlvX21vZGU7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OOgoJCQlyZXR1cm4gbXBlZ19hdWRpb19tb2RlX2V4dGVuc2lvbjsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CgkJCXJldHVybiBtcGVnX2F1ZGlvX2VtcGhhc2lzOwoJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19DUkM6CgkJCXJldHVybiBtcGVnX2F1ZGlvX2NyYzsKCQljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CgkJCXJldHVybiBtcGVnX3ZpZGVvX2VuY29kaW5nOwoJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CgkJCXJldHVybiBtcGVnX3ZpZGVvX2FzcGVjdDsKCQljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgoJCQlyZXR1cm4gbXBlZ192aWRlb19iaXRyYXRlX21vZGU7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgoJCQlyZXR1cm4gbXBlZ19zdHJlYW1fdHlwZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CgkJCXJldHVybiBtcGVnX3N0cmVhbV92YmlfZm10OwoJCWRlZmF1bHQ6CgkJCXJldHVybiBOVUxMOwoJfQp9CgovKiBGaWxsIGluIGEgc3RydWN0IHY0bDJfcXVlcnljdHJsICovCmludCB2NGwyX2N0cmxfcXVlcnlfZmlsbChzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsLCBzMzIgbWluLCBzMzIgbWF4LCBzMzIgc3RlcCwgczMyIGRlZikKewoJY29uc3QgY2hhciAqbmFtZTsKCglxY3RybC0+ZmxhZ3MgPSAwOwoJc3dpdGNoIChxY3RybC0+aWQpIHsKCS8qIFVTRVIgY29udHJvbHMgKi8KCWNhc2UgVjRMMl9DSURfVVNFUl9DTEFTUzogCW5hbWUgPSAiVXNlciBDb250cm9scyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6IAluYW1lID0gIlZvbHVtZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOiAJbmFtZSA9ICJNdXRlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6IAluYW1lID0gIkJhbGFuY2UiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzogCW5hbWUgPSAiQmFzcyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6IAluYW1lID0gIlRyZWJsZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUzogCW5hbWUgPSAiTG91ZG5lc3MiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzogCW5hbWUgPSAiQnJpZ2h0bmVzcyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDogCW5hbWUgPSAiQ29udHJhc3QiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjogCW5hbWUgPSAiU2F0dXJhdGlvbiI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9IVUU6IAkJbmFtZSA9ICJIdWUiOyBicmVhazsKCgkvKiBNUEVHIGNvbnRyb2xzICovCgljYXNlIFY0TDJfQ0lEX01QRUdfQ0xBU1M6IAkJbmFtZSA9ICJNUEVHIEVuY29kZXIgQ29udHJvbHMiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROiBuYW1lID0gIkF1ZGlvIFNhbXBsaW5nIEZyZXF1ZW5jeSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOiAJbmFtZSA9ICJBdWRpbyBFbmNvZGluZyBMYXllciI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6IAluYW1lID0gIkF1ZGlvIExheWVyIEkgQml0cmF0ZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEU6IAluYW1lID0gIkF1ZGlvIExheWVyIElJIEJpdHJhdGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFOiAJbmFtZSA9ICJBdWRpbyBMYXllciBJSUkgQml0cmF0ZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6IAkJbmFtZSA9ICJBdWRpbyBTdGVyZW8gTW9kZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OOiBuYW1lID0gIkF1ZGlvIFN0ZXJlbyBNb2RlIEV4dGVuc2lvbiI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTOiAJbmFtZSA9ICJBdWRpbyBFbXBoYXNpcyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzogCQluYW1lID0gIkF1ZGlvIENSQyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOiAJbmFtZSA9ICJWaWRlbyBFbmNvZGluZyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDogCW5hbWUgPSAiVmlkZW8gQXNwZWN0IjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVM6IAluYW1lID0gIlZpZGVvIEIgRnJhbWVzIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkU6IAluYW1lID0gIlZpZGVvIEdPUCBTaXplIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6IAluYW1lID0gIlZpZGVvIEdPUCBDbG9zdXJlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fUFVMTERPV046IAluYW1lID0gIlZpZGVvIFB1bGxkb3duIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOiAJbmFtZSA9ICJWaWRlbyBCaXRyYXRlIE1vZGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFOiAJbmFtZSA9ICJWaWRlbyBCaXRyYXRlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLOiAJbmFtZSA9ICJWaWRlbyBQZWFrIEJpdHJhdGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OOiBuYW1lID0gIlZpZGVvIFRlbXBvcmFsIERlY2ltYXRpb24iOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRTogCW5hbWUgPSAiU3RyZWFtIFR5cGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BNVDogCW5hbWUgPSAiU3RyZWFtIFBNVCBQcm9ncmFtIElEIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9BVURJTzogCW5hbWUgPSAiU3RyZWFtIEF1ZGlvIFByb2dyYW0gSUQiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1ZJREVPOiAJbmFtZSA9ICJTdHJlYW0gVmlkZW8gUHJvZ3JhbSBJRCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUENSOiAJbmFtZSA9ICJTdHJlYW0gUENSIFByb2dyYW0gSUQiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX0FVRElPOiBuYW1lID0gIlN0cmVhbSBQRVMgQXVkaW8gSUQiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX1ZJREVPOiBuYW1lID0gIlN0cmVhbSBQRVMgVmlkZW8gSUQiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVkJJX0ZNVDoJbmFtZSA9ICJTdHJlYW0gVkJJIEZvcm1hdCI7IGJyZWFrOwoKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cglzd2l0Y2ggKHFjdHJsLT5pZCkgewoJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgoJY2FzZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUzoKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRToKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTjoKCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU47CgkJbWluID0gMDsKCQltYXggPSBzdGVwID0gMTsKCQlicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CgkJcWN0cmwtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VOwoJCXN0ZXAgPSAxOwoJCWJyZWFrOwoJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0NMQVNTOgoJCXFjdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUzsKCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZOwoJCW1pbiA9IG1heCA9IHN0ZXAgPSBkZWYgPSAwOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI7CgkJYnJlYWs7Cgl9Cglzd2l0Y2ggKHFjdHJsLT5pZCkgewoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgoJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19VUERBVEU7CgkJYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgoJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgoJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKCWNhc2UgVjRMMl9DSURfSFVFOgoJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19TTElERVI7CgkJYnJlYWs7Cgl9CglxY3RybC0+bWluaW11bSA9IG1pbjsKCXFjdHJsLT5tYXhpbXVtID0gbWF4OwoJcWN0cmwtPnN0ZXAgPSBzdGVwOwoJcWN0cmwtPmRlZmF1bHRfdmFsdWUgPSBkZWY7CglxY3RybC0+cmVzZXJ2ZWRbMF0gPSBxY3RybC0+cmVzZXJ2ZWRbMV0gPSAwOwoJc25wcmludGYocWN0cmwtPm5hbWUsIHNpemVvZihxY3RybC0+bmFtZSksIG5hbWUpOwoJcmV0dXJuIDA7Cn0KCi8qIEZpbGwgaW4gYSBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgd2l0aCBzdGFuZGFyZCB2YWx1ZXMgYmFzZWQgb24KICAgdGhlIGNvbnRyb2wgSUQuICovCmludCB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKewoJc3dpdGNoIChxY3RybC0+aWQpIHsKCS8qIFVTRVIgY29udHJvbHMgKi8KCWNhc2UgVjRMMl9DSURfVVNFUl9DTEFTUzoKCWNhc2UgVjRMMl9DSURfTVBFR19DTEFTUzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDAsIDAsIDApOwoJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCA2NTUzNSwgNjU1MzUgLyAxMDAsIDU4ODgwKTsKCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAxLCAxLCAwKTsKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgNjU1MzUsIDY1NTM1IC8gMTAwLCAzMjc2OCk7CgljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDEyOCk7CgljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgoJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMTI3LCAxLCA2NCk7CgljYXNlIFY0TDJfQ0lEX0hVRToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIC0xMjgsIDEyNywgMSwgMCk7CgoJLyogTVBFRyBjb250cm9scyAqLwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDQxMDAsCgkJCQlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV8zMjAwMCwgMSwKCQkJCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ4MDAwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMSwKCQkJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8zLCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzJLLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNDQ4SywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzI1NkspOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzJLLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzg0SywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzIyNEspOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzJLLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzIwSywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzE5MkspOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfU1RFUkVPLAoJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfTU9OTywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19NT0RFX1NURVJFTyk7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzQsCgkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfMTYsIDEsCgkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfNCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX05PTkUsCgkJCQlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfQ0NJVFRfSjE3LCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX05PTkUpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUsCgkJCQlWNEwyX01QRUdfQVVESU9fQ1JDX0NSQzE2LCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0NSQ19OT05FKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xLAoJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMiwgMSwKCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzF4MSwKCQkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMjIxeDEwMCwgMSwKCQkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDMzLCAxLCAyKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDEsIDM0LCAxLCAxMik7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAxLCAxLCAxKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTjoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDEsIDEsIDApOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUiwKCQkJCVY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfQ0JSLCAxLAoJCQkJVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNzAwMDAwMCwgMSwgNjAwMDAwMCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjcwMDAwMDAsIDEsIDgwMDAwMDApOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT046CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDApOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9QUywKCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9TVkNELCAxLAoJCQkJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1BTKTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BNVDoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsICgxIDw8IDE0KSAtIDEsIDEsIDE2KTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX0FVRElPOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgKDEgPDwgMTQpIC0gMSwgMSwgMjYwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1ZJREVPOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgKDEgPDwgMTQpIC0gMSwgMSwgMjU2KTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BDUjoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsICgxIDw8IDE0KSAtIDEsIDEsIDI1OSk7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9BVURJTzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9WSURFTzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX05PTkUsCgkJCQlWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfSVZUViwgMSwKCQkJCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FKTsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCi8qIEZpbGwgaW4gYSBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgYmFzZWQgb24gdGhlIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBhbmQKICAgdGhlIG1lbnUuIFRoZSBxY3RybCBwb2ludGVyIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGl0IGlzIGlnbm9yZWQuICovCmludCB2NGwyX2N0cmxfcXVlcnlfbWVudShzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgKnFtZW51LCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsLAoJICAgICAgIGNvbnN0IGNoYXIgKiptZW51X2l0ZW1zKQp7CglpbnQgaTsKCglpZiAobWVudV9pdGVtcyA9PSBOVUxMIHx8CgkgICAgKHFjdHJsICYmIChxbWVudS0+aW5kZXggPCBxY3RybC0+bWluaW11bSB8fCBxbWVudS0+aW5kZXggPiBxY3RybC0+bWF4aW11bSkpKQoJCXJldHVybiAtRUlOVkFMOwoJZm9yIChpID0gMDsgaSA8IHFtZW51LT5pbmRleCAmJiBtZW51X2l0ZW1zW2ldOyBpKyspIDsKCWlmIChtZW51X2l0ZW1zW2ldID09IE5VTEwgfHwgbWVudV9pdGVtc1tpXVswXSA9PSAnXDAnKQoJCXJldHVybiAtRUlOVkFMOwoJc25wcmludGYocW1lbnUtPm5hbWUsIHNpemVvZihxbWVudS0+bmFtZSksIG1lbnVfaXRlbXNbcW1lbnUtPmluZGV4XSk7CglxbWVudS0+cmVzZXJ2ZWQgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qIGN0cmxfY2xhc3NlcyBwb2ludHMgdG8gYW4gYXJyYXkgb2YgdTMyIHBvaW50ZXJzLCB0aGUgbGFzdCBlbGVtZW50IGlzCiAgIGEgTlVMTCBwb2ludGVyLiBFYWNoIHUzMiBhcnJheSBpcyBhIDAtdGVybWluYXRlZCBhcnJheSBvZiBjb250cm9sIElEcy4KICAgRWFjaCBhcnJheSBtdXN0IGJlIHNvcnRlZCBsb3cgdG8gaGlnaCBhbmQgYmVsb25nIHRvIHRoZSBzYW1lIGNvbnRyb2wKICAgY2xhc3MuIFRoZSBhcnJheSBvZiB1MzIgcG9pbnRlciBtdXN0IGFsc28gYmUgc29ydGVkLCBmcm9tIGxvdyBjbGFzcyBJRHMKICAgdG8gaGlnaCBjbGFzcyBJRHMuCgogICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IElEIHRoYXQgZm9sbG93cyBhZnRlciB0aGUgZ2l2ZW4gSUQuCiAgIFdoZW4gbm8gbW9yZSBjb250cm9scyBhcmUgYXZhaWxhYmxlIDAgaXMgcmV0dXJuZWQuICovCnUzMiB2NGwyX2N0cmxfbmV4dChjb25zdCB1MzIgKiBjb25zdCAqIGN0cmxfY2xhc3NlcywgdTMyIGlkKQp7Cgl1MzIgY3RybF9jbGFzczsKCWNvbnN0IHUzMiAqcGN0cmw7CgoJLyogaWYgbm8gcXVlcnkgaXMgZGVzaXJlZCwgdGhlbiBqdXN0IHJldHVybiB0aGUgY29udHJvbCBJRCAqLwoJaWYgKChpZCAmIFY0TDJfQ1RSTF9GTEFHX05FWFRfQ1RSTCkgPT0gMCkKCQlyZXR1cm4gaWQ7CglpZiAoY3RybF9jbGFzc2VzID09IE5VTEwpCgkJcmV0dXJuIDA7CglpZCAmPSBWNEwyX0NUUkxfSURfTUFTSzsKCWN0cmxfY2xhc3MgPSBWNEwyX0NUUkxfSUQyQ0xBU1MoaWQpOwoJaWQrKzsJLyogc2VsZWN0IG5leHQgY29udHJvbCAqLwoJLyogZmluZCBmaXJzdCBjbGFzcyB0aGF0IG1hdGNoZXMgKG9yIGlzIGdyZWF0ZXIgdGhhbikgdGhlIGNsYXNzIG9mCgkgICB0aGUgSUQgKi8KCXdoaWxlICgqY3RybF9jbGFzc2VzICYmIFY0TDJfQ1RSTF9JRDJDTEFTUygqKmN0cmxfY2xhc3NlcykgPCBjdHJsX2NsYXNzKQoJCWN0cmxfY2xhc3NlcysrOwoJLyogbm8gbW9yZSBjbGFzc2VzICovCglpZiAoKmN0cmxfY2xhc3NlcyA9PSBOVUxMKQoJCXJldHVybiAwOwoJcGN0cmwgPSAqY3RybF9jbGFzc2VzOwoJLyogZmluZCBmaXJzdCBjdHJsIHdpdGhpbiB0aGUgY2xhc3MgdGhhdCBpcyA+PSBJRCAqLwoJd2hpbGUgKCpwY3RybCAmJiAqcGN0cmwgPCBpZCkgcGN0cmwrKzsKCWlmICgqcGN0cmwpCgkJcmV0dXJuICpwY3RybDsKCS8qIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBjb250cm9scyBvZiB0aGUgY3VycmVudCBjbGFzcy4gKi8KCS8qIGNvbnRpbnVlIHdpdGggbmV4dCBjbGFzcyBpZiBhdmFpbGFibGUgKi8KCWN0cmxfY2xhc3NlcysrOwoJaWYgKCpjdHJsX2NsYXNzZXMgPT0gTlVMTCkKCQlyZXR1cm4gMDsKCXJldHVybiAqKmN0cmxfY2xhc3NlczsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCkVYUE9SVF9TWU1CT0wodjRsMl92aWRlb19zdGRfY29uc3RydWN0KTsKCkVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX2luaXQpOwpFWFBPUlRfU1lNQk9MKHY0bDJfcHJpb19jaGFuZ2UpOwpFWFBPUlRfU1lNQk9MKHY0bDJfcHJpb19vcGVuKTsKRVhQT1JUX1NZTUJPTCh2NGwyX3ByaW9fY2xvc2UpOwpFWFBPUlRfU1lNQk9MKHY0bDJfcHJpb19tYXgpOwpFWFBPUlRfU1lNQk9MKHY0bDJfcHJpb19jaGVjayk7CgpFWFBPUlRfU1lNQk9MKHY0bDJfZmllbGRfbmFtZXMpOwpFWFBPUlRfU1lNQk9MKHY0bDJfdHlwZV9uYW1lcyk7CkVYUE9SVF9TWU1CT0wodjRsX3ByaW50a19pb2N0bCk7CkVYUE9SVF9TWU1CT0wodjRsX3ByaW50a19pb2N0bF9hcmcpOwoKRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfbmV4dCk7CkVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2NoZWNrKTsKRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfZ2V0X21lbnUpOwpFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9xdWVyeV9tZW51KTsKRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfcXVlcnlfZmlsbCk7CkVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKTsKCi8qCiAqIExvY2FsIHZhcmlhYmxlczoKICogYy1iYXNpYy1vZmZzZXQ6IDgKICogRW5kOgogKi8K