LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmxhbl9jb21tb24uYwogKiBWZXJzaW9uOiAgICAgICAwLjkKICogRGVzY3JpcHRpb246ICAgSXJEQSBMQU4gQWNjZXNzIFByb3RvY29sIEltcGxlbWVudGF0aW9uCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDMxIDIwOjE0OjM3IDE5OTcKICogTW9kaWZpZWQgYXQ6ICAgU3VuIERlYyAyNiAyMTo1MzoxMCAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LAogKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcwogKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgojaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KCiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jb21tb24uaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fcHJvdmlkZXIuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V0aC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZmlsdGVyLmg+CgoKLyoKICogU2VuZCBncmF0dWl0b3VzIEFSUCB3aGVuIGNvbm5lY3RlZCB0byBhIG5ldyBBUCBvciBub3QuIE1heSBiZSBhIGNsZXZlcgogKiB0aGluZyB0byBkbywgYnV0IGZvciBzb21lIHJlYXNvbiB0aGUgbWFjaGluZSBjcmFzaGVzIGlmIHlvdSB1c2UgREhDUC4gU28KICogbGV0cyBub3QgdXNlIGl0IGJ5IGRlZmF1bHQuCiAqLwojdW5kZWYgQ09ORklHX0lSTEFOX1NFTkRfR1JBVFVJVE9VU19BUlAKCi8qIGV4dGVybiBjaGFyIHN5c2N0bF9kZXZuYW1lW107ICovCgovKgogKiAgTWFzdGVyIHN0cnVjdHVyZQogKi8Kc3RhdGljIExJU1RfSEVBRChpcmxhbnMpOwoKc3RhdGljIHZvaWQgKmNrZXk7CnN0YXRpYyB2b2lkICpza2V5OwoKLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8Kc3RhdGljIGludCBldGg7ICAgLyogVXNlICJldGgiIG9yICJpcmxhbiIgbmFtZSBmb3IgZGV2aWNlcyAqLwpzdGF0aWMgaW50IGFjY2VzcyA9IEFDQ0VTU19QRUVSOyAvKiBQRUVSLCBESVJFQ1Qgb3IgSE9TVEVEICovCgojaWZkZWYgQ09ORklHX1BST0NfRlMKc3RhdGljIGNvbnN0IGNoYXIgKmlybGFuX2FjY2Vzc1tdID0gewoJIlVOS05PV04iLAoJIkRJUkVDVCIsCgkiUEVFUiIsCgkiSE9TVEVEIgp9OwoKc3RhdGljIGNvbnN0IGNoYXIgKmlybGFuX21lZGlhW10gPSB7CgkiVU5LTk9XTiIsCgkiODAyLjMiLAoJIjgwMi41Igp9OwoKZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pcmRhOwoKc3RhdGljIGludCBpcmxhbl9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CgpzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcmxhbl9mb3BzID0gewoJLm93bmVyCSA9IFRISVNfTU9EVUxFLAoJLm9wZW4gICAgPSBpcmxhbl9zZXFfb3BlbiwKCS5yZWFkICAgID0gc2VxX3JlYWQsCgkubGxzZWVrICA9IHNlcV9sc2VlaywKCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCn07CgpleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2lyZGE7CiNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwoKc3RhdGljIHN0cnVjdCBpcmxhbl9jYiAqaXJsYW5fb3BlbihfX3UzMiBzYWRkciwgX191MzIgZGFkZHIpOwpzdGF0aWMgdm9pZCBfX2lybGFuX2Nsb3NlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZik7CnN0YXRpYyBpbnQgX19pcmxhbl9pbnNlcnRfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqcGFyYW0sIGludCB0eXBlLAoJCQkJX191OCB2YWx1ZV9ieXRlLCBfX3UxNiB2YWx1ZV9zaG9ydCwKCQkJCV9fdTggKnZhbHVlX2FycmF5LCBfX3UxNiB2YWx1ZV9sZW4pOwpzdGF0aWMgdm9pZCBpcmxhbl9vcGVuX3VuaWNhc3RfYWRkcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpOwpzdGF0aWMgdm9pZCBpcmxhbl9nZXRfdW5pY2FzdF9hZGRyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZik7CnZvaWQgaXJsYW5fY2xvc2VfdHNhcHMoc3RydWN0IGlybGFuX2NiICpzZWxmKTsKCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2luaXQgKHZvaWQpCiAqCiAqICAgIEluaXRpYWxpemUgSXJMQU4gbGF5ZXIKICoKICovCnN0YXRpYyBpbnQgX19pbml0IGlybGFuX2luaXQodm9pZCkKewoJc3RydWN0IGlybGFuX2NiICpuZXc7CglfX3UxNiBoaW50czsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCiNpZmRlZiBDT05GSUdfUFJPQ19GUwoJeyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7Cglwcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoImlybGFuIiwgMCwgcHJvY19pcmRhKTsKCWlmICghcHJvYykgewoJCXByaW50ayhLRVJOX0VSUiAiaXJsYW5faW5pdDogY2FuJ3QgY3JlYXRlIC9wcm9jIGVudHJ5IVxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJcHJvYy0+cHJvY19mb3BzID0gJmlybGFuX2ZvcHM7Cgl9CiNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoJaGludHMgPSBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoU19MQU4pOwoKCS8qIFJlZ2lzdGVyIHdpdGggSXJMTVAgYXMgYSBjbGllbnQgKi8KCWNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9jbGllbnQoaGludHMsICZpcmxhbl9jbGllbnRfZGlzY292ZXJ5X2luZGljYXRpb24sCgkJCQkgICAgIE5VTEwsIE5VTEwpOwoJaWYgKCFja2V5KQoJCWdvdG8gZXJyX2NrZXk7CgoJLyogUmVnaXN0ZXIgd2l0aCBJckxNUCBhcyBhIHNlcnZpY2UgKi8KCXNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKGhpbnRzKTsKCWlmICghc2tleSkKCQlnb3RvIGVycl9za2V5OwoKCS8qIFN0YXJ0IHRoZSBtYXN0ZXIgSXJMQU4gaW5zdGFuY2UgKHRoZSBvbmx5IG9uZSBmb3Igbm93KSAqLwoJbmV3ID0gaXJsYW5fb3BlbihERVZfQUREUl9BTlksIERFVl9BRERSX0FOWSk7CglpZiAoIW5ldykKCQlnb3RvIGVycl9vcGVuOwoKCS8qIFRoZSBtYXN0ZXIgd2lsbCBvbmx5IG9wZW4gaXRzIChsaXN0ZW4pIGNvbnRyb2wgVFNBUCAqLwoJaXJsYW5fcHJvdmlkZXJfb3Blbl9jdHJsX3RzYXAobmV3KTsKCgkvKiBEbyBzb21lIGZhc3QgZGlzY292ZXJ5ISAqLwoJaXJsbXBfZGlzY292ZXJ5X3JlcXVlc3QoRElTQ09WRVJZX0RFRkFVTFRfU0xPVFMpOwoKCXJldHVybiAwOwoKZXJyX29wZW46CglpcmxtcF91bnJlZ2lzdGVyX3NlcnZpY2Uoc2tleSk7CmVycl9za2V5OgoJaXJsbXBfdW5yZWdpc3Rlcl9jbGllbnQoY2tleSk7CmVycl9ja2V5OgojaWZkZWYgQ09ORklHX1BST0NfRlMKCXJlbW92ZV9wcm9jX2VudHJ5KCJpcmxhbiIsIHByb2NfaXJkYSk7CiNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwoKCXJldHVybiAtRU5PTUVNOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgaXJsYW5fY2xlYW51cCh2b2lkKQp7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsICpuZXh0OwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCWlybG1wX3VucmVnaXN0ZXJfY2xpZW50KGNrZXkpOwoJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNrZXkpOwoKI2lmZGVmIENPTkZJR19QUk9DX0ZTCglyZW1vdmVfcHJvY19lbnRyeSgiaXJsYW4iLCBwcm9jX2lyZGEpOwojZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KCgkvKiBDbGVhbnVwIGFueSBsZWZ0b3ZlciBuZXR3b3JrIGRldmljZXMgKi8KCXJ0bmxfbG9jaygpOwoJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlbGYsIG5leHQsICZpcmxhbnMsIGRldl9saXN0KSB7CgkJX19pcmxhbl9jbG9zZShzZWxmKTsKCX0KCXJ0bmxfdW5sb2NrKCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX29wZW4gKHZvaWQpCiAqCiAqICAgIE9wZW4gbmV3IGluc3RhbmNlIG9mIGEgY2xpZW50L3Byb3ZpZGVyLCB3ZSBzaG91bGQgb25seSByZWdpc3RlciB0aGUKICogICAgbmV0d29yayBkZXZpY2UgaWYgdGhpcyBpbnN0YW5jZSBpcyBtZW50IGZvciBhIHBhcnRpY3VsYXIgY2xpZW50L3Byb3ZpZGVyCiAqLwpzdGF0aWMgc3RydWN0IGlybGFuX2NiICppcmxhbl9vcGVuKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkcikKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCgkvKiBDcmVhdGUgbmV0d29yayBkZXZpY2Ugd2l0aCBpcmxhbiAqLwoJZGV2ID0gYWxsb2NfaXJsYW5kZXYoZXRoID8gImV0aCVkIiA6ICJpcmxhbiVkIik7CglpZiAoIWRldikKCQlyZXR1cm4gTlVMTDsKCglzZWxmID0gZGV2LT5wcml2OwoJc2VsZi0+ZGV2ID0gZGV2OwoKCS8qCgkgKiAgSW5pdGlhbGl6ZSBsb2NhbCBkZXZpY2Ugc3RydWN0dXJlCgkgKi8KCXNlbGYtPm1hZ2ljID0gSVJMQU5fTUFHSUM7CglzZWxmLT5zYWRkciA9IHNhZGRyOwoJc2VsZi0+ZGFkZHIgPSBkYWRkcjsKCgkvKiBQcm92aWRlciBhY2Nlc3MgY2FuIG9ubHkgYmUgUEVFUiwgRElSRUNULCBvciBIT1NURUQgKi8KCXNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID0gYWNjZXNzOwoJaWYgKGFjY2VzcyA9PSBBQ0NFU1NfRElSRUNUKSB7CgkJLyoKCQkgKiBTaW5jZSB3ZSBhcmUgZW11bGF0aW5nIGFuIElyTEFOIHNldmVyIHdlIHdpbGwgaGF2ZSB0bwoJCSAqIGdpdmUgb3Vyc2VsZiBhbiBldGhlcm5ldCBhZGRyZXNzIQoJCSAqLwoJCWRldi0+ZGV2X2FkZHJbMF0gPSAweDQwOwoJCWRldi0+ZGV2X2FkZHJbMV0gPSAweDAwOwoJCWRldi0+ZGV2X2FkZHJbMl0gPSAweDAwOwoJCWRldi0+ZGV2X2FkZHJbM10gPSAweDAwOwoJCWdldF9yYW5kb21fYnl0ZXMoZGV2LT5kZXZfYWRkcis0LCAxKTsKCQlnZXRfcmFuZG9tX2J5dGVzKGRldi0+ZGV2X2FkZHIrNSwgMSk7Cgl9CgoJc2VsZi0+bWVkaWEgPSBNRURJQV84MDJfMzsKCXNlbGYtPmRpc2Nvbm5lY3RfcmVhc29uID0gTE1fVVNFUl9SRVFVRVNUOwoJaW5pdF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOwoJaW5pdF90aW1lcigmc2VsZi0+Y2xpZW50LmtpY2tfdGltZXIpOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmc2VsZi0+b3Blbl93YWl0KTsKCglza2JfcXVldWVfaGVhZF9pbml0KCZzZWxmLT5jbGllbnQudHhxKTsKCglpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKCWlybGFuX25leHRfcHJvdmlkZXJfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CgoJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkIVxuIiwKCQkJICAgX19GVU5DVElPTl9fICk7CgkJc2VsZiA9IE5VTEw7CgkJZnJlZV9uZXRkZXYoZGV2KTsKCX0gZWxzZSB7CgkJcnRubF9sb2NrKCk7CgkJbGlzdF9hZGRfcmN1KCZzZWxmLT5kZXZfbGlzdCwgJmlybGFucyk7CgkJcnRubF91bmxvY2soKTsKCX0KCglyZXR1cm4gc2VsZjsKfQovKgogKiBGdW5jdGlvbiBfX2lybGFuX2Nsb3NlIChzZWxmKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyBhbmQgZGVhbGxvY2F0ZXMgdGhlIElyTEFOIGNsaWVudCBpbnN0YW5jZXMuIEJlCiAqICAgIGF3YXJlIHRoYXQgb3RoZXIgZnVuY3Rpb25zIHdoaWNoIGNhbGxzIGNsaWVudF9jbG9zZSgpIG11c3QKICogICAgcmVtb3ZlIHNlbGYgZnJvbSBpcmxhbnMgbGlzdCBmaXJzdC4KICovCnN0YXRpYyB2b2lkIF9faXJsYW5fY2xvc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglBU1NFUlRfUlROTCgpOwoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglkZWxfdGltZXJfc3luYygmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOwoJZGVsX3RpbWVyX3N5bmMoJnNlbGYtPmNsaWVudC5raWNrX3RpbWVyKTsKCgkvKiBDbG9zZSBhbGwgb3BlbiBjb25uZWN0aW9ucyBhbmQgcmVtb3ZlIFRTQVBzICovCglpcmxhbl9jbG9zZV90c2FwcyhzZWxmKTsKCglpZiAoc2VsZi0+Y2xpZW50LmlyaWFwKQoJCWlyaWFwX2Nsb3NlKHNlbGYtPmNsaWVudC5pcmlhcCk7CgoJLyogUmVtb3ZlIGZyYW1lcyBxdWV1ZWQgb24gdGhlIGNvbnRyb2wgY2hhbm5lbCAqLwoJc2tiX3F1ZXVlX3B1cmdlKCZzZWxmLT5jbGllbnQudHhxKTsKCgkvKiBVbnJlZ2lzdGVyIGFuZCBmcmVlIHNlbGYgdmlhIGRlc3RydWN0b3IgKi8KCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHNlbGYtPmRldik7Cn0KCi8qIEZpbmQgYW55IGluc3RhbmNlIG9mIGlybGFuLCB1c2VkIGZvciBjbGllbnQgZGlzY292ZXJ5IHdha2V1cCAqLwpzdHJ1Y3QgaXJsYW5fY2IgKmlybGFuX2dldF9hbnkodm9pZCkKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoKCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNlbGYsICZpcmxhbnMsIGRldl9saXN0KSB7CgkJcmV0dXJuIHNlbGY7Cgl9CglyZXR1cm4gTlVMTDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY29ubmVjdF9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBxb3MsIG1heF9zZHVfc2l6ZSwgc2tiKQogKgogKiAgICBIZXJlIHdlIHJlY2VpdmUgdGhlIGNvbm5lY3QgaW5kaWNhdGlvbiBmb3IgdGhlIGRhdGEgY2hhbm5lbAogKgogKi8Kc3RhdGljIHZvaWQgaXJsYW5fY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAoJCQkJICAgICBfX3UzMiBtYXhfc2R1X3NpemUsCgkJCQkgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAoJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CglzdHJ1Y3QgdHNhcF9jYiAqdHNhcDsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh0c2FwID09IHNlbGYtPnRzYXBfZGF0YSxyZXR1cm47KTsKCglzZWxmLT5tYXhfc2R1X3NpemUgPSBtYXhfc2R1X3NpemU7CglzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CgoJSVJEQV9ERUJVRygwLCAiJXM6IFdlIGFyZSBub3cgY29ubmVjdGVkIVxuIiwgX19GVU5DVElPTl9fKTsKCglkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCgkvKiBJZiB5b3Ugd2FudCB0byBwYXNzIHRoZSBza2IgdG8gKmJvdGgqIHN0YXRlIG1hY2hpbmVzLCB5b3Ugd2lsbAoJICogbmVlZCB0byBza2JfY2xvbmUoKSBpdCwgc28gdGhhdCB5b3UgZG9uJ3QgZnJlZSBpdCB0d2ljZS4KCSAqIEFzIHRoZSBzdGF0ZSBtYWNoaW5lcyBkb24ndCBuZWVkIGl0LCBnaXQgcmlkIG9mIGl0IGhlcmUuLi4KCSAqIEplYW4gSUkgKi8KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoKCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0RBVEFfQ09OTkVDVF9JTkRJQ0FUSU9OLCBOVUxMKTsKCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9EQVRBX0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCk7CgoJaWYgKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSB7CgkJLyoKCQkgKiBEYXRhIGNoYW5uZWwgaXMgb3Blbiwgc28gd2UgYXJlIG5vdyBhbGxvd2VkIHRvCgkJICogY29uZmlndXJlIHRoZSByZW1vdGUgZmlsdGVyCgkJICovCgkJaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzZWxmKTsKCQlpcmxhbl9vcGVuX3VuaWNhc3RfYWRkcihzZWxmKTsKCX0KCS8qIFJlYWR5IHRvIHRyYW5zZmVyIEV0aGVybmV0IGZyYW1lcyAoYXQgbGFzdCkgKi8KCW5ldGlmX3N0YXJ0X3F1ZXVlKHNlbGYtPmRldik7IC8qIENsZWFyIHJlYXNvbiAqLwp9CgpzdGF0aWMgdm9pZCBpcmxhbl9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsCgkJCQkgIF9fdTMyIG1heF9zZHVfc2l6ZSwKCQkJCSAgX191OCBtYXhfaGVhZGVyX3NpemUsCgkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCXNlbGYtPm1heF9zZHVfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKCgkvKiBUT0RPOiB3ZSBjb3VsZCBzZXQgdGhlIE1UVSBkZXBlbmRpbmcgb24gdGhlIG1heF9zZHVfc2l6ZSAqLwoKCUlSREFfREVCVUcoMCwgIiVzOiBXZSBhcmUgbm93IGNvbm5lY3RlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CglkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCgkvKgoJICogRGF0YSBjaGFubmVsIGlzIG9wZW4sIHNvIHdlIGFyZSBub3cgYWxsb3dlZCB0byBjb25maWd1cmUgdGhlIHJlbW90ZQoJICogZmlsdGVyCgkgKi8KCWlybGFuX2dldF91bmljYXN0X2FkZHIoc2VsZik7Cglpcmxhbl9vcGVuX3VuaWNhc3RfYWRkcihzZWxmKTsKCgkvKiBPcGVuIGJyb2FkY2FzdCBhbmQgbXVsdGljYXN0IGZpbHRlciBieSBkZWZhdWx0ICovCglpcmxhbl9zZXRfYnJvYWRjYXN0X2ZpbHRlcihzZWxmLCBUUlVFKTsKCWlybGFuX3NldF9tdWx0aWNhc3RfZmlsdGVyKHNlbGYsIFRSVUUpOwoKCS8qIFJlYWR5IHRvIHRyYW5zZmVyIEV0aGVybmV0IGZyYW1lcyAqLwoJbmV0aWZfc3RhcnRfcXVldWUoc2VsZi0+ZGV2KTsKCXNlbGYtPmRpc2Nvbm5lY3RfcmVhc29uID0gMDsgLyogQ2xlYXIgcmVhc29uICovCiNpZmRlZiBDT05GSUdfSVJMQU5fU0VORF9HUkFUVUlUT1VTX0FSUAoJaXJsYW5fZXRoX3NlbmRfZ3JhdHVpdG91c19hcnAoJnNlbGYtPmRldik7CiNlbmRpZgoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5vcGVuX3dhaXQpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfZGlzY29ubmVjdF9pbmRpY2F0aW9uIChoYW5kbGUpCiAqCiAqICAgIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgSXJUVFAgbGF5ZXIuIEluZGljYXRlcyBhIGRpc2Nvbm5lY3Rpb24gb2YKICogICAgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIChoYW5kbGUpCiAqLwpzdGF0aWMgdm9pZCBpcmxhbl9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsCgkJCQkJdm9pZCAqc2FwLCBMTV9SRUFTT04gcmVhc29uLAoJCQkJCXN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoJc3RydWN0IHRzYXBfY2IgKnRzYXA7CgoJSVJEQV9ERUJVRygwLCAiJXMoKSwgcmVhc29uPSVkXG4iLCBfX0ZVTkNUSU9OX18gLCByZWFzb24pOwoKCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOwoJdHNhcCA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBzYXA7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHRzYXAgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh0c2FwLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CgoJSVJEQV9BU1NFUlQodHNhcCA9PSBzZWxmLT50c2FwX2RhdGEsIHJldHVybjspOwoKCUlSREFfREVCVUcoMiwgIklyTEFOLCBkYXRhIGNoYW5uZWwgZGlzY29ubmVjdGVkIGJ5IHBlZXIhXG4iKTsKCgkvKiBTYXZlIHJlYXNvbiBzbyB3ZSBrbm93IGlmIHdlIHNob3VsZCB0cnkgdG8gcmVjb25uZWN0IG9yIG5vdCAqLwoJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSByZWFzb247CgoJc3dpdGNoIChyZWFzb24pIHsKCWNhc2UgTE1fVVNFUl9SRVFVRVNUOiAvKiBVc2VyIHJlcXVlc3QgKi8KCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVc2VyIHJlcXVlc3RlZFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CgljYXNlIExNX0xBUF9ESVNDT05ORUNUOiAvKiBVbmV4cGVjdGVkIElyTEFQIGRpc2Nvbm5lY3QgKi8KCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmV4cGVjdGVkIElyTEFQIGRpc2Nvbm5lY3RcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJY2FzZSBMTV9DT05ORUNUX0ZBSUxVUkU6IC8qIEZhaWxlZCB0byBlc3RhYmxpc2ggSXJMQVAgY29ubmVjdGlvbiAqLwoJCUlSREFfREVCVUcoMiwgIiVzKCksIElyTEFQIGNvbm5lY3QgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWNhc2UgTE1fTEFQX1JFU0VUOiAgLyogSXJMQVAgcmVzZXQgKi8KCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJckxBUCByZXNldFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CgljYXNlIExNX0lOSVRfRElTQ09OTkVDVDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJckxNUCBjb25uZWN0IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfRVJST1IoIiVzKCksIFVua25vd24gZGlzY29ubmVjdCByZWFzb25cbiIsIF9fRlVOQ1RJT05fXyk7CgkJYnJlYWs7Cgl9CgoJLyogSWYgeW91IHdhbnQgdG8gcGFzcyB0aGUgc2tiIHRvICpib3RoKiBzdGF0ZSBtYWNoaW5lcywgeW91IHdpbGwKCSAqIG5lZWQgdG8gc2tiX2Nsb25lKCkgaXQsIHNvIHRoYXQgeW91IGRvbid0IGZyZWUgaXQgdHdpY2UuCgkgKiBBcyB0aGUgc3RhdGUgbWFjaGluZXMgZG9uJ3QgbmVlZCBpdCwgZ2l0IHJpZCBvZiBpdCBoZXJlLi4uCgkgKiBKZWFuIElJICovCglpZiAodXNlcmRhdGEpCgkJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CgoJaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0xNUF9ESVNDT05ORUNULCBOVUxMKTsKCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0xNUF9ESVNDT05ORUNULCBOVUxMKTsKCgl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPm9wZW5fd2FpdCk7Cn0KCnZvaWQgaXJsYW5fb3Blbl9kYXRhX3RzYXAoc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglzdHJ1Y3QgdHNhcF9jYiAqdHNhcDsKCW5vdGlmeV90IG5vdGlmeTsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCS8qIENoZWNrIGlmIGFscmVhZHkgb3BlbiAqLwoJaWYgKHNlbGYtPnRzYXBfZGF0YSkKCQlyZXR1cm47CgoJaXJkYV9ub3RpZnlfaW5pdCgmbm90aWZ5KTsKCglub3RpZnkuZGF0YV9pbmRpY2F0aW9uICAgICAgID0gaXJsYW5fZXRoX3JlY2VpdmU7Cglub3RpZnkudWRhdGFfaW5kaWNhdGlvbiAgICAgID0gaXJsYW5fZXRoX3JlY2VpdmU7Cglub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uICAgID0gaXJsYW5fY29ubmVjdF9pbmRpY2F0aW9uOwoJbm90aWZ5LmNvbm5lY3RfY29uZmlybSAgICAgICA9IGlybGFuX2Nvbm5lY3RfY29uZmlybTsKCW5vdGlmeS5mbG93X2luZGljYXRpb24gICAgICAgPSBpcmxhbl9ldGhfZmxvd19pbmRpY2F0aW9uOwoJbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IGlybGFuX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKCW5vdGlmeS5pbnN0YW5jZSAgICAgICAgICAgICAgPSBzZWxmOwoJc3RybGNweShub3RpZnkubmFtZSwgIklyTEFOIGRhdGEiLCBzaXplb2Yobm90aWZ5Lm5hbWUpKTsKCgl0c2FwID0gaXJ0dHBfb3Blbl90c2FwKExTQVBfQU5ZLCBERUZBVUxUX0lOSVRJQUxfQ1JFRElULCAmbm90aWZ5KTsKCWlmICghdHNhcCkgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBubyB0c2FwIVxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuOwoJfQoJc2VsZi0+dHNhcF9kYXRhID0gdHNhcDsKCgkvKgoJICogIFRoaXMgaXMgdGhlIGRhdGEgVFNBUCBzZWxlY3RvciB3aGljaCB3ZSB3aWxsIHBhc3MgdG8gdGhlIGNsaWVudAoJICogIHdoZW4gdGhlIGNsaWVudCBhc2sgZm9yIGl0LgoJICovCglzZWxmLT5zdHNhcF9zZWxfZGF0YSA9IHNlbGYtPnRzYXBfZGF0YS0+c3RzYXBfc2VsOwp9Cgp2b2lkIGlybGFuX2Nsb3NlX3RzYXBzKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCgkvKiBEaXNjb25uZWN0IGFuZCBjbG9zZSBhbGwgb3BlbiBUU0FQIGNvbm5lY3Rpb25zICovCglpZiAoc2VsZi0+dHNhcF9kYXRhKSB7CgkJaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXBfZGF0YSwgTlVMTCwgUF9OT1JNQUwpOwoJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+dHNhcF9kYXRhKTsKCQlzZWxmLT50c2FwX2RhdGEgPSBOVUxMOwoJfQoJaWYgKHNlbGYtPmNsaWVudC50c2FwX2N0cmwpIHsKCQlpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCwgTlVMTCwKCQkJCQkgUF9OT1JNQUwpOwoJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCk7CgkJc2VsZi0+Y2xpZW50LnRzYXBfY3RybCA9IE5VTEw7Cgl9CglpZiAoc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsKSB7CgkJaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCwgTlVMTCwKCQkJCQkgUF9OT1JNQUwpOwoJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsKTsKCQlzZWxmLT5wcm92aWRlci50c2FwX2N0cmwgPSBOVUxMOwoJfQoJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSBMTV9VU0VSX1JFUVVFU1Q7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2lhc19yZWdpc3RlciAoc2VsZiwgdHNhcF9zZWwpCiAqCiAqICAgIFJlZ2lzdGVyIHdpdGggTE0tSUFTCiAqCiAqLwp2b2lkIGlybGFuX2lhc19yZWdpc3RlcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIF9fdTggdHNhcF9zZWwpCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CglzdHJ1Y3QgaWFzX3ZhbHVlICpuZXdfdmFsdWU7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCgkvKgoJICogQ2hlY2sgaWYgb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBieSBhIHByZXZpb3VzIHByb3ZpZGVyLgoJICogSWYgdGhhdCBpcyB0aGUgY2FzZSwgd2UganVzdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKCSAqLwoJaWYgKCFpcmlhc19maW5kX29iamVjdCgiSXJMQU4iKSkgewoJCW9iaiA9IGlyaWFzX25ld19vYmplY3QoIklyTEFOIiwgSUFTX0lSTEFOX0lEKTsKCQlpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIob2JqLCAiSXJEQTpUaW55VFA6THNhcFNlbCIsIHRzYXBfc2VsLAoJCQkJCSBJQVNfS0VSTkVMX0FUVFIpOwoJCWlyaWFzX2luc2VydF9vYmplY3Qob2JqKTsKCX0gZWxzZSB7CgkJbmV3X3ZhbHVlID0gaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUodHNhcF9zZWwpOwoJCWlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlKCJJckxBTiIsICJJckRBOlRpbnlUUDpMc2FwU2VsIiwKCQkJCQkgICAgICBuZXdfdmFsdWUpOwoJfQoKCS8qIFJlZ2lzdGVyIFBuUCBvYmplY3Qgb25seSBpZiBub3QgcmVnaXN0ZXJlZCBiZWZvcmUgKi8KCWlmICghaXJpYXNfZmluZF9vYmplY3QoIlBuUCIpKSB7CgkJb2JqID0gaXJpYXNfbmV3X29iamVjdCgiUG5QIiwgSUFTX1BOUF9JRCk7CiNpZiAwCgkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiTmFtZSIsIHN5c2N0bF9kZXZuYW1lLAoJCQkJCUlBU19LRVJORUxfQVRUUik7CiNlbHNlCgkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiTmFtZSIsICJMaW51eCIsIElBU19LRVJORUxfQVRUUik7CiNlbmRpZgoJCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIkRldmljZUlEIiwgIkhXUDE5RjAiLAoJCQkJCUlBU19LRVJORUxfQVRUUik7CgkJaXJpYXNfYWRkX2ludGVnZXJfYXR0cmliKG9iaiwgIkNvbXBDbnQiLCAxLCBJQVNfS0VSTkVMX0FUVFIpOwoJCWlmIChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9PSBBQ0NFU1NfUEVFUikKCQkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiQ29tcCMwMSIsICJQTlA4Mzg5IiwKCQkJCQkJSUFTX0tFUk5FTF9BVFRSKTsKCQllbHNlCgkJCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIkNvbXAjMDEiLCAiUE5QODI5NCIsCgkJCQkJCUlBU19LRVJORUxfQVRUUik7CgoJCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIk1hbnVmYWN0dXJlciIsCgkJCQkJIkxpbnV4LUlyREEgUHJvamVjdCIsIElBU19LRVJORUxfQVRUUik7CgkJaXJpYXNfaW5zZXJ0X29iamVjdChvYmopOwoJfQp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9ydW5fY3RybF90eF9xdWV1ZSAoc2VsZikKICoKICogICAgVHJ5IHRvIHNlbmQgdGhlIG5leHQgY29tbWFuZCBpbiB0aGUgY29udHJvbCB0cmFuc21pdCBxdWV1ZQogKgogKi8KaW50IGlybGFuX3J1bl9jdHJsX3R4X3F1ZXVlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglpZiAoaXJkYV9sb2NrKCZzZWxmLT5jbGllbnQudHhfYnVzeSkgPT0gRkFMU0UpCgkJcmV0dXJuIC1FQlVTWTsKCglza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+Y2xpZW50LnR4cSk7CglpZiAoIXNrYikgewoJCXNlbGYtPmNsaWVudC50eF9idXN5ID0gRkFMU0U7CgkJcmV0dXJuIDA7Cgl9CgoJLyogQ2hlY2sgdGhhdCBpdCdzIHJlYWxseSBwb3NzaWJsZSB0byBzZW5kIGNvbW1hbmRzICovCglpZiAoKHNlbGYtPmNsaWVudC50c2FwX2N0cmwgPT0gTlVMTCkgfHwKCSAgICAoc2VsZi0+Y2xpZW50LnN0YXRlID09IElSTEFOX0lETEUpKQoJewoJCXNlbGYtPmNsaWVudC50eF9idXN5ID0gRkFMU0U7CgkJZGV2X2tmcmVlX3NrYihza2IpOwoJCXJldHVybiAtMTsKCX0KCUlSREFfREVCVUcoMiwgIiVzKCksIHNlbmRpbmcgLi4uXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglyZXR1cm4gaXJ0dHBfZGF0YV9yZXF1ZXN0KHNlbGYtPmNsaWVudC50c2FwX2N0cmwsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0IChzZWxmLCBza2IpCiAqCiAqICAgIFRoaXMgZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGF0IGNvbW1hbmRzIG9uIHRoZSBjb250cm9sIGNoYW5uZWwgaXMgYmVpbmcKICogICAgc2VudCBpbiBhIGNvbW1hbmQvcmVzcG9uc2UgZmFzaGlvbgogKi8Kc3RhdGljIHZvaWQgaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc3RydWN0IGlybGFuX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCgkvKiBRdWV1ZSBjb21tYW5kICovCglza2JfcXVldWVfdGFpbCgmc2VsZi0+Y2xpZW50LnR4cSwgc2tiKTsKCgkvKiBUcnkgdG8gc2VuZCBjb21tYW5kICovCglpcmxhbl9ydW5fY3RybF90eF9xdWV1ZShzZWxmKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fZ2V0X3Byb3ZpZGVyX2luZm8gKHNlbGYpCiAqCiAqICAgIFNlbmQgR2V0IFByb3ZpZGVyIEluZm9ybWF0aW9uIGNvbW1hbmQgdG8gcGVlciBJckxBTiBsYXllcgogKgogKi8Kdm9pZCBpcmxhbl9nZXRfcHJvdmlkZXJfaW5mbyhzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCnsKCXN0cnVjdCBza19idWZmICpza2I7CglfX3U4ICpmcmFtZTsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCXNrYiA9IGFsbG9jX3NrYihJUkxBTl9NQVhfSEVBREVSICsgSVJMQU5fQ01EX0hFQURFUiwKCQkJR0ZQX0FUT01JQyk7CglpZiAoIXNrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dChza2IsIDIpOwoKCWZyYW1lID0gc2tiLT5kYXRhOwoKCWZyYW1lWzBdID0gQ01EX0dFVF9QUk9WSURFUl9JTkZPOwoJZnJhbWVbMV0gPSAweDAwOyAgICAgICAgICAgICAgICAgLyogWmVybyBwYXJhbWV0ZXJzICovCgoJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fb3Blbl9kYXRhX2NoYW5uZWwgKHNlbGYpCiAqCiAqICAgIFNlbmQgYW4gT3BlbiBEYXRhIENvbW1hbmQgdG8gcHJvdmlkZXIKICoKICovCnZvaWQgaXJsYW5fb3Blbl9kYXRhX2NoYW5uZWwoc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglza2IgPSBhbGxvY19za2IoSVJMQU5fTUFYX0hFQURFUiArIElSTEFOX0NNRF9IRUFERVIgKwoJCQlJUkxBTl9TVFJJTkdfUEFSQU1FVEVSX0xFTigiTUVESUEiLCAiODAyLjMiKSArCgkJCUlSTEFOX1NUUklOR19QQVJBTUVURVJfTEVOKCJBQ0NFU1NfVFlQRSIsICJESVJFQ1QiKSwKCQkJR0ZQX0FUT01JQyk7CglpZiAoIXNrYikKCQlyZXR1cm47CgoJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCglmcmFtZSA9IHNrYi0+ZGF0YTsKCgkvKiBCdWlsZCBmcmFtZSAqLwoJZnJhbWVbMF0gPSBDTURfT1BFTl9EQVRBX0NIQU5ORUw7CglmcmFtZVsxXSA9IDB4MDI7IC8qIFR3byBwYXJhbWV0ZXJzICovCgoJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJNRURJQSIsICI4MDIuMyIpOwoJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJBQ0NFU1NfVFlQRSIsICJESVJFQ1QiKTsKCS8qIGlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiTU9ERSIsICJVTlJFTElBQkxFIik7ICovCgovKiAJc2VsZi0+dXNlX3VkYXRhID0gVFJVRTsgKi8KCglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9Cgp2b2lkIGlybGFuX2Nsb3NlX2RhdGFfY2hhbm5lbChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCnsKCXN0cnVjdCBza19idWZmICpza2I7CglfX3U4ICpmcmFtZTsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCS8qIENoZWNrIGlmIHRoZSBUU0FQIGlzIHN0aWxsIHRoZXJlICovCglpZiAoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCA9PSBOVUxMKQoJCXJldHVybjsKCglza2IgPSBhbGxvY19za2IoSVJMQU5fTUFYX0hFQURFUiArIElSTEFOX0NNRF9IRUFERVIgKwoJCQlJUkxBTl9CWVRFX1BBUkFNRVRFUl9MRU4oIkRBVEFfQ0hBTiIpLAoJCQlHRlBfQVRPTUlDKTsKCWlmICghc2tiKQoJCXJldHVybjsKCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dChza2IsIDIpOwoKCWZyYW1lID0gc2tiLT5kYXRhOwoKCS8qIEJ1aWxkIGZyYW1lICovCglmcmFtZVswXSA9IENNRF9DTE9TRV9EQVRBX0NIQU47CglmcmFtZVsxXSA9IDB4MDE7IC8qIE9uZSBwYXJhbWV0ZXIgKi8KCglpcmxhbl9pbnNlcnRfYnl0ZV9wYXJhbShza2IsICJEQVRBX0NIQU4iLCBzZWxmLT5kdHNhcF9zZWxfZGF0YSk7CgoJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fb3Blbl91bmljYXN0X2FkZHIgKHNlbGYpCiAqCiAqICAgIE1ha2UgSXJMQU4gcHJvdmlkZXIgYWNjZXB0IGV0aGVybmV0IGZyYW1lcyBhZGRyZXNzZWQgdG8gdGhlIHVuaWNhc3QKICogICAgYWRkcmVzcy4KICoKICovCnN0YXRpYyB2b2lkIGlybGFuX29wZW5fdW5pY2FzdF9hZGRyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCV9fdTggKmZyYW1lOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJc2tiID0gYWxsb2Nfc2tiKElSTEFOX01BWF9IRUFERVIgKyBJUkxBTl9DTURfSEVBREVSICsKCQkJSVJMQU5fQllURV9QQVJBTUVURVJfTEVOKCJEQVRBX0NIQU4iKSArCgkJCUlSTEFOX1NUUklOR19QQVJBTUVURVJfTEVOKCJGSUxURVJfVFlQRSIsICJESVJFQ1RFRCIpICsKCQkJSVJMQU5fU1RSSU5HX1BBUkFNRVRFUl9MRU4oIkZJTFRFUl9NT0RFIiwgIkZJTFRFUiIpLAoJCQlHRlBfQVRPTUlDKTsKCWlmICghc2tiKQoJCXJldHVybjsKCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCglmcmFtZSA9IHNrYi0+ZGF0YTsKCglmcmFtZVswXSA9IENNRF9GSUxURVJfT1BFUkFUSU9OOwoJZnJhbWVbMV0gPSAweDAzOyAgICAgICAgICAgICAgICAgLyogVGhyZWUgcGFyYW1ldGVycyAqLwoJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiAsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiRElSRUNURUQiKTsKCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiRklMVEVSIik7CgoJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fc2V0X2Jyb2FkY2FzdF9maWx0ZXIgKHNlbGYsIHN0YXR1cykKICoKICogICAgTWFrZSBJckxBTiBwcm92aWRlciBhY2NlcHQgZXRoZXJuZXQgZnJhbWVzIGFkZHJlc3NlZCB0byB0aGUgYnJvYWRjYXN0CiAqICAgIGFkZHJlc3MuIEJlIGNhcmVmdWwgd2l0aCB0aGUgdXNlIG9mIHRoaXMgb25lLCBzaW5jZSB0aGVyZSBtYXkgYmUgYSBsb3QKICogICAgb2YgYnJvYWRjYXN0IHRyYWZmaWMgb3V0IHRoZXJlLiBXZSBjYW4gc3RpbGwgZnVuY3Rpb24gd2l0aG91dCB0aGlzCiAqICAgIG9uZSBidXQgdGhlbiBfd2VfIGhhdmUgdG8gaW5pdGlhdGUgYWxsIGNvbW11bmljYXRpb24gd2l0aCBvdGhlcgogKiAgICBob3N0cywgc2luY2UgQVJQIHJlcXVlc3QgZm9yIHRoaXMgaG9zdCB3aWxsIG5vdCBiZSBhbnN3ZXJlZC4KICovCnZvaWQgaXJsYW5fc2V0X2Jyb2FkY2FzdF9maWx0ZXIoc3RydWN0IGlybGFuX2NiICpzZWxmLCBpbnQgc3RhdHVzKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglza2IgPSBhbGxvY19za2IoSVJMQU5fTUFYX0hFQURFUiArIElSTEFOX0NNRF9IRUFERVIgKwoJCQlJUkxBTl9CWVRFX1BBUkFNRVRFUl9MRU4oIkRBVEFfQ0hBTiIpICsKCQkJSVJMQU5fU1RSSU5HX1BBUkFNRVRFUl9MRU4oIkZJTFRFUl9UWVBFIiwgIkJST0FEQ0FTVCIpICsKCQkJLyogV2UgbWF5IHdhc3RlIG9uZSBieXRlIGhlcmUuLi4qLwoJCQlJUkxBTl9TVFJJTkdfUEFSQU1FVEVSX0xFTigiRklMVEVSX01PREUiLCAiRklMVEVSIiksCgkJCUdGUF9BVE9NSUMpOwoJaWYgKCFza2IpCgkJcmV0dXJuOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLwoJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCglmcmFtZSA9IHNrYi0+ZGF0YTsKCglmcmFtZVswXSA9IENNRF9GSUxURVJfT1BFUkFUSU9OOwoJZnJhbWVbMV0gPSAweDAzOyAgICAgICAgICAgICAgICAgLyogVGhyZWUgcGFyYW1ldGVycyAqLwoJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+ZHRzYXBfc2VsX2RhdGEpOwoJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJCUk9BRENBU1QiKTsKCWlmIChzdGF0dXMpCgkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfTU9ERSIsICJGSUxURVIiKTsKCWVsc2UKCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIk5PTkUiKTsKCglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9zZXRfbXVsdGljYXN0X2ZpbHRlciAoc2VsZiwgc3RhdHVzKQogKgogKiAgICBNYWtlIElyTEFOIHByb3ZpZGVyIGFjY2VwdCBldGhlcm5ldCBmcmFtZXMgYWRkcmVzc2VkIHRvIHRoZSBtdWx0aWNhc3QKICogICAgYWRkcmVzcy4KICoKICovCnZvaWQgaXJsYW5fc2V0X211bHRpY2FzdF9maWx0ZXIoc3RydWN0IGlybGFuX2NiICpzZWxmLCBpbnQgc3RhdHVzKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglza2IgPSBhbGxvY19za2IoSVJMQU5fTUFYX0hFQURFUiArIElSTEFOX0NNRF9IRUFERVIgKwoJCQlJUkxBTl9CWVRFX1BBUkFNRVRFUl9MRU4oIkRBVEFfQ0hBTiIpICsKCQkJSVJMQU5fU1RSSU5HX1BBUkFNRVRFUl9MRU4oIkZJTFRFUl9UWVBFIiwgIk1VTFRJQ0FTVCIpICsKCQkJLyogV2UgbWF5IHdhc3RlIG9uZSBieXRlIGhlcmUuLi4qLwoJCQlJUkxBTl9TVFJJTkdfUEFSQU1FVEVSX0xFTigiRklMVEVSX01PREUiLCAiTk9ORSIpLAoJCQlHRlBfQVRPTUlDKTsKCWlmICghc2tiKQoJCXJldHVybjsKCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHNrYiwgMik7CgoJZnJhbWUgPSBza2ItPmRhdGE7CgoJZnJhbWVbMF0gPSBDTURfRklMVEVSX09QRVJBVElPTjsKCWZyYW1lWzFdID0gMHgwMzsgICAgICAgICAgICAgICAgIC8qIFRocmVlIHBhcmFtZXRlcnMgKi8KCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiTVVMVElDQVNUIik7CglpZiAoc3RhdHVzKQoJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiQUxMIik7CgllbHNlCgkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfTU9ERSIsICJOT05FIik7CgoJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fZ2V0X3VuaWNhc3RfYWRkciAoc2VsZikKICoKICogICAgUmV0cmlldmVzIHRoZSB1bmljYXN0IGFkZHJlc3MgZnJvbSB0aGUgSXJMQU4gcHJvdmlkZXIuIFRoaXMgYWRkcmVzcwogKiAgICB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGRldmljZXMgc3RydWN0dXJlLCBzbyB0aGUgZXRoZXJuZXQgbGF5ZXIKICogICAgY2FuIGNvbnN0cnVjdCBpdHMgcGFja2V0cy4KICoKICovCnN0YXRpYyB2b2lkIGlybGFuX2dldF91bmljYXN0X2FkZHIoc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglza2IgPSBhbGxvY19za2IoSVJMQU5fTUFYX0hFQURFUiArIElSTEFOX0NNRF9IRUFERVIgKwoJCQlJUkxBTl9CWVRFX1BBUkFNRVRFUl9MRU4oIkRBVEFfQ0hBTiIpICsKCQkJSVJMQU5fU1RSSU5HX1BBUkFNRVRFUl9MRU4oIkZJTFRFUl9UWVBFIiwgIkRJUkVDVEVEIikgKwoJCQlJUkxBTl9TVFJJTkdfUEFSQU1FVEVSX0xFTigiRklMVEVSX09QRVJBVElPTiIsCgkJCQkJCSAgICJEWU5BTUlDIiksCgkJCUdGUF9BVE9NSUMpOwoJaWYgKCFza2IpCgkJcmV0dXJuOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLwoJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCglmcmFtZSA9IHNrYi0+ZGF0YTsKCglmcmFtZVswXSA9IENNRF9GSUxURVJfT1BFUkFUSU9OOwoJZnJhbWVbMV0gPSAweDAzOyAgICAgICAgICAgICAgICAgLyogVGhyZWUgcGFyYW1ldGVycyAqLwoJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+ZHRzYXBfc2VsX2RhdGEpOwoJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJESVJFQ1RFRCIpOwoJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfT1BFUkFUSU9OIiwgIkRZTkFNSUMiKTsKCglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9nZXRfbWVkaWFfY2hhciAoc2VsZikKICoKICoKICoKICovCnZvaWQgaXJsYW5fZ2V0X21lZGlhX2NoYXIoc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglza2IgPSBhbGxvY19za2IoSVJMQU5fTUFYX0hFQURFUiArIElSTEFOX0NNRF9IRUFERVIgKwoJCQlJUkxBTl9TVFJJTkdfUEFSQU1FVEVSX0xFTigiTUVESUEiLCAiODAyLjMiKSwKCQkJR0ZQX0FUT01JQyk7CgoJaWYgKCFza2IpCgkJcmV0dXJuOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLwoJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCglmcmFtZSA9IHNrYi0+ZGF0YTsKCgkvKiBCdWlsZCBmcmFtZSAqLwoJZnJhbWVbMF0gPSBDTURfR0VUX01FRElBX0NIQVI7CglmcmFtZVsxXSA9IDB4MDE7IC8qIE9uZSBwYXJhbWV0ZXIgKi8KCglpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIk1FRElBIiwgIjgwMi4zIik7Cglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpbnNlcnRfYnl0ZV9wYXJhbSAoc2tiLCBwYXJhbSwgdmFsdWUpCiAqCiAqICAgIEluc2VydCBieXRlIHBhcmFtZXRlciBpbnRvIGZyYW1lCiAqCiAqLwppbnQgaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqcGFyYW0sIF9fdTggdmFsdWUpCnsKCXJldHVybiBfX2lybGFuX2luc2VydF9wYXJhbShza2IsIHBhcmFtLCBJUkxBTl9CWVRFLCB2YWx1ZSwgMCwgTlVMTCwgMCk7Cn0KCmludCBpcmxhbl9pbnNlcnRfc2hvcnRfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqcGFyYW0sIF9fdTE2IHZhbHVlKQp7CglyZXR1cm4gX19pcmxhbl9pbnNlcnRfcGFyYW0oc2tiLCBwYXJhbSwgSVJMQU5fU0hPUlQsIDAsIHZhbHVlLCBOVUxMLCAwKTsKfQoKLyoKICogRnVuY3Rpb24gaW5zZXJ0X3N0cmluZyAoc2tiLCBwYXJhbSwgdmFsdWUpCiAqCiAqICAgIEluc2VydCBzdHJpbmcgcGFyYW1ldGVyIGludG8gZnJhbWUKICoKICovCmludCBpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnBhcmFtLCBjaGFyICpzdHJpbmcpCnsKCWludCBzdHJpbmdfbGVuID0gc3RybGVuKHN0cmluZyk7CgoJcmV0dXJuIF9faXJsYW5faW5zZXJ0X3BhcmFtKHNrYiwgcGFyYW0sIElSTEFOX0FSUkFZLCAwLCAwLCBzdHJpbmcsCgkJCQkgICAgc3RyaW5nX2xlbik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGluc2VydF9hcnJheV9wYXJhbShza2IsIHBhcmFtLCB2YWx1ZSwgbGVuX3ZhbHVlKQogKgogKiAgICBJbnNlcnQgYXJyYXkgcGFyYW1ldGVyIGludG8gZnJhbWUKICoKICovCmludCBpcmxhbl9pbnNlcnRfYXJyYXlfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqbmFtZSwgX191OCAqYXJyYXksCgkJCSAgICAgX191MTYgYXJyYXlfbGVuKQp7CglyZXR1cm4gX19pcmxhbl9pbnNlcnRfcGFyYW0oc2tiLCBuYW1lLCBJUkxBTl9BUlJBWSwgMCwgMCwgYXJyYXksCgkJCQkgICAgYXJyYXlfbGVuKTsKfQoKLyoKICogRnVuY3Rpb24gaW5zZXJ0X3BhcmFtIChza2IsIHBhcmFtLCB2YWx1ZSwgYnl0ZSkKICoKICogICAgSW5zZXJ0IHBhcmFtZXRlciBhdCBlbmQgb2YgYnVmZmVyLCBzdHJ1Y3R1cmUgb2YgYSBwYXJhbWV0ZXIgaXM6CiAqCiAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqICAgIHwgTmFtZSBMZW5ndGhbMV0gfCBQYXJhbSBOYW1lWzEuLjI1NV0gfCBWYWwgTGVuZ3RoWzJdIHwgVmFsdWVbMC4uMTAxNl18CiAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgaW50IF9faXJsYW5faW5zZXJ0X3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnBhcmFtLCBpbnQgdHlwZSwKCQkJCV9fdTggdmFsdWVfYnl0ZSwgX191MTYgdmFsdWVfc2hvcnQsCgkJCQlfX3U4ICp2YWx1ZV9hcnJheSwgX191MTYgdmFsdWVfbGVuKQp7CglfX3U4ICpmcmFtZTsKCV9fdTggcGFyYW1fbGVuOwoJX19sZTE2IHRtcF9sZTsgLyogVGVtcG9yYXJ5IHZhbHVlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCglpbnQgbj0wOwoKCWlmIChza2IgPT0gTlVMTCkgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBOVUxMIHNrYlxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuIDA7Cgl9CgoJcGFyYW1fbGVuID0gc3RybGVuKHBhcmFtKTsKCXN3aXRjaCAodHlwZSkgewoJY2FzZSBJUkxBTl9CWVRFOgoJCXZhbHVlX2xlbiA9IDE7CgkJYnJlYWs7CgljYXNlIElSTEFOX1NIT1JUOgoJCXZhbHVlX2xlbiA9IDI7CgkJYnJlYWs7CgljYXNlIElSTEFOX0FSUkFZOgoJCUlSREFfQVNTRVJUKHZhbHVlX2FycmF5ICE9IE5VTEwsIHJldHVybiAwOyk7CgkJSVJEQV9BU1NFUlQodmFsdWVfbGVuID4gMCwgcmV0dXJuIDA7KTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBwYXJhbWV0ZXIgdHlwZSFcbiIsIF9fRlVOQ1RJT05fXyApOwoJCXJldHVybiAwOwoJCWJyZWFrOwoJfQoKCS8qIEluc2VydCBhdCBlbmQgb2Ygc2stYnVmZmVyICovCglmcmFtZSA9IHNrYi0+dGFpbDsKCgkvKiBNYWtlIHNwYWNlIGZvciBkYXRhICovCglpZiAoc2tiX3RhaWxyb29tKHNrYikgPCAocGFyYW1fbGVuK3ZhbHVlX2xlbiszKSkgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIE5vIG1vcmUgc3BhY2UgYXQgZW5kIG9mIHNrYlxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuIDA7Cgl9Cglza2JfcHV0KHNrYiwgcGFyYW1fbGVuK3ZhbHVlX2xlbiszKTsKCgkvKiBJbnNlcnQgcGFyYW1ldGVyIGxlbmd0aCAqLwoJZnJhbWVbbisrXSA9IHBhcmFtX2xlbjsKCgkvKiBJbnNlcnQgcGFyYW1ldGVyICovCgltZW1jcHkoZnJhbWUrbiwgcGFyYW0sIHBhcmFtX2xlbik7IG4gKz0gcGFyYW1fbGVuOwoKCS8qIEluc2VydCB2YWx1ZSBsZW5ndGggKDIgYnl0ZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgTFNCIGZpcnN0KSAqLwoJdG1wX2xlID0gY3B1X3RvX2xlMTYodmFsdWVfbGVuKTsKCW1lbWNweShmcmFtZStuLCAmdG1wX2xlLCAyKTsgbiArPSAyOyAvKiBUbyBhdm9pZCBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KCgkvKiBJbnNlcnQgdmFsdWUgKi8KCXN3aXRjaCAodHlwZSkgewoJY2FzZSBJUkxBTl9CWVRFOgoJCWZyYW1lW24rK10gPSB2YWx1ZV9ieXRlOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9TSE9SVDoKCQl0bXBfbGUgPSBjcHVfdG9fbGUxNih2YWx1ZV9zaG9ydCk7CgkJbWVtY3B5KGZyYW1lK24sICZ0bXBfbGUsIDIpOyBuICs9IDI7CgkJYnJlYWs7CgljYXNlIElSTEFOX0FSUkFZOgoJCW1lbWNweShmcmFtZStuLCB2YWx1ZV9hcnJheSwgdmFsdWVfbGVuKTsgbis9dmFsdWVfbGVuOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCX0KCUlSREFfQVNTRVJUKG4gPT0gKHBhcmFtX2xlbit2YWx1ZV9sZW4rMyksIHJldHVybiAwOyk7CgoJcmV0dXJuIHBhcmFtX2xlbit2YWx1ZV9sZW4rMzsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fZXh0cmFjdF9wYXJhbSAoYnVmLCBuYW1lLCB2YWx1ZSwgbGVuKQogKgogKiAgICBFeHRyYWN0cyBhIHNpbmdsZSBwYXJhbWV0ZXIgbmFtZS92YWx1ZSBwYWlyIGZyb20gYnVmZmVyIGFuZCB1cGRhdGVzCiAqICAgIHRoZSBidWZmZXIgcG9pbnRlciB0byBwb2ludCB0byB0aGUgbmV4dCBuYW1lL3ZhbHVlIHBhaXIuCiAqLwppbnQgaXJsYW5fZXh0cmFjdF9wYXJhbShfX3U4ICpidWYsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLCBfX3UxNiAqbGVuKQp7CglfX3U4IG5hbWVfbGVuOwoJX191MTYgdmFsX2xlbjsKCWludCBuPTA7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJLyogZ2V0IGxlbmd0aCBvZiBwYXJhbWV0ZXIgbmFtZSAoMSBieXRlKSAqLwoJbmFtZV9sZW4gPSBidWZbbisrXTsKCglpZiAobmFtZV9sZW4gPiAyNTQpIHsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBuYW1lX2xlbiA+IDI1NFxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuIC1SU1BfSU5WQUxJRF9DT01NQU5EX0ZPUk1BVDsKCX0KCgkvKiBnZXQgcGFyYW1ldGVyIG5hbWUgKi8KCW1lbWNweShuYW1lLCBidWYrbiwgbmFtZV9sZW4pOwoJbmFtZVtuYW1lX2xlbl0gPSAnXDAnOwoJbis9bmFtZV9sZW47CgoJLyoKCSAqICBHZXQgbGVuZ3RoIG9mIHBhcmFtZXRlciB2YWx1ZSAoMiBieXRlcyBpbiBsaXR0bGUgZW5kaWFuCgkgKiAgZm9ybWF0KQoJICovCgltZW1jcHkoJnZhbF9sZW4sIGJ1ZituLCAyKTsgLyogVG8gYXZvaWQgYWxpZ25tZW50IHByb2JsZW1zICovCglsZTE2X3RvX2NwdXMoJnZhbF9sZW4pOyBuKz0yOwoKCWlmICh2YWxfbGVuID4gMTAxNikgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIHBhcmFtZXRlciBsZW5ndGggdG8gbG9uZ1xuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuIC1SU1BfSU5WQUxJRF9DT01NQU5EX0ZPUk1BVDsKCX0KCSpsZW4gPSB2YWxfbGVuOwoKCS8qIGdldCBwYXJhbWV0ZXIgdmFsdWUgKi8KCW1lbWNweSh2YWx1ZSwgYnVmK24sIHZhbF9sZW4pOwoJdmFsdWVbdmFsX2xlbl0gPSAnXDAnOwoJbis9dmFsX2xlbjsKCglJUkRBX0RFQlVHKDQsICJQYXJhbWV0ZXI6ICVzICIsIG5hbWUpOwoJSVJEQV9ERUJVRyg0LCAiVmFsdWU6ICVzXG4iLCB2YWx1ZSk7CgoJcmV0dXJuIG47Cn0KCiNpZmRlZiBDT05GSUdfUFJPQ19GUwoKLyoKICogU3RhcnQgb2YgcmVhZGluZyAvcHJvYyBlbnRyaWVzLgogKiBSZXR1cm4gZW50cnkgYXQgcG9zLAogKglvciBzdGFydF90b2tlbiB0byBpbmRpY2F0ZSBwcmludCBoZWFkZXIgbGluZQogKglvciBOVUxMIGlmIGVuZCBvZiBmaWxlCiAqLwpzdGF0aWMgdm9pZCAqaXJsYW5fc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKewoJaW50IGkgPSAxOwoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoKCXJjdV9yZWFkX2xvY2soKTsKCWlmICgqcG9zID09IDApCgkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlbGYsICZpcmxhbnMsIGRldl9saXN0KSB7CgkJaWYgKCpwb3MgPT0gaSkKCQkJcmV0dXJuIHNlbGY7CgkJKytpOwoJfQoJcmV0dXJuIE5VTEw7Cn0KCi8qIFJldHVybiBlbnRyeSBhZnRlciB2LCBhbmQgaW5jcmVtZW50IHBvcyAqLwpzdGF0aWMgdm9pZCAqaXJsYW5fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICpueHQ7CgoJKysqcG9zOwoJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQoJCW54dCA9IGlybGFucy5uZXh0OwoJZWxzZQoJCW54dCA9ICgoc3RydWN0IGlybGFuX2NiICopdiktPmRldl9saXN0Lm5leHQ7CgoJcmV0dXJuIChueHQgPT0gJmlybGFucykgPyBOVUxMCgkJOiBsaXN0X2VudHJ5KG54dCwgc3RydWN0IGlybGFuX2NiLCBkZXZfbGlzdCk7Cn0KCi8qIEVuZCBvZiByZWFkaW5nIC9wcm9jIGZpbGUgKi8Kc3RhdGljIHZvaWQgaXJsYW5fc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXJjdV9yZWFkX3VubG9jaygpOwp9CgoKLyoKICogU2hvdyBvbmUgZW50cnkgaW4gL3Byb2MgZmlsZS4KICovCnN0YXRpYyBpbnQgaXJsYW5fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKCQlzZXFfcHV0cyhzZXEsICJJckxBTiBpbnN0YW5jZXM6XG4iKTsKCWVsc2UgewoJCXN0cnVjdCBpcmxhbl9jYiAqc2VsZiA9IHY7CgoJCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgkJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOwoKCQlzZXFfcHJpbnRmKHNlcSwiaWZuYW1lOiAlcyxcbiIsCgkJCSAgICAgICBzZWxmLT5kZXYtPm5hbWUpOwoJCXNlcV9wcmludGYoc2VxLCJjbGllbnQgc3RhdGU6ICVzLCAiLAoJCQkgICAgICAgaXJsYW5fc3RhdGVbIHNlbGYtPmNsaWVudC5zdGF0ZV0pOwoJCXNlcV9wcmludGYoc2VxLCJwcm92aWRlciBzdGF0ZTogJXMsXG4iLAoJCQkgICAgICAgaXJsYW5fc3RhdGVbIHNlbGYtPnByb3ZpZGVyLnN0YXRlXSk7CgkJc2VxX3ByaW50ZihzZXEsInNhZGRyOiAlIzA4eCwgIiwKCQkJICAgICAgIHNlbGYtPnNhZGRyKTsKCQlzZXFfcHJpbnRmKHNlcSwiZGFkZHI6ICUjMDh4XG4iLAoJCQkgICAgICAgc2VsZi0+ZGFkZHIpOwoJCXNlcV9wcmludGYoc2VxLCJ2ZXJzaW9uOiAlZC4lZCxcbiIsCgkJCSAgICAgICBzZWxmLT52ZXJzaW9uWzFdLCBzZWxmLT52ZXJzaW9uWzBdKTsKCQlzZXFfcHJpbnRmKHNlcSwiYWNjZXNzIHR5cGU6ICVzXG4iLAoJCQkgICAgICAgaXJsYW5fYWNjZXNzW3NlbGYtPmNsaWVudC5hY2Nlc3NfdHlwZV0pOwoJCXNlcV9wcmludGYoc2VxLCJtZWRpYTogJXNcbiIsCgkJCSAgICAgICBpcmxhbl9tZWRpYVtzZWxmLT5tZWRpYV0pOwoKCQlzZXFfcHJpbnRmKHNlcSwibG9jYWwgZmlsdGVyOlxuIik7CgkJc2VxX3ByaW50ZihzZXEsInJlbW90ZSBmaWx0ZXI6ICIpOwoJCWlybGFuX3ByaW50X2ZpbHRlcihzZXEsIHNlbGYtPmNsaWVudC5maWx0ZXJfdHlwZSk7CgkJc2VxX3ByaW50ZihzZXEsInR4IGJ1c3k6ICVzXG4iLAoJCQkgICAgICAgbmV0aWZfcXVldWVfc3RvcHBlZChzZWxmLT5kZXYpID8gIlRSVUUiIDogIkZBTFNFIik7CgoJCXNlcV9wdXRjKHNlcSwnXG4nKTsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlybGFuX3NlcV9vcHMgPSB7Cgkuc3RhcnQgPSBpcmxhbl9zZXFfc3RhcnQsCgkubmV4dCAgPSBpcmxhbl9zZXFfbmV4dCwKCS5zdG9wICA9IGlybGFuX3NlcV9zdG9wLAoJLnNob3cgID0gaXJsYW5fc2VxX3Nob3csCn07CgpzdGF0aWMgaW50IGlybGFuX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlybGFuX3NlcV9vcHMpOwp9CiNlbmRpZgoKTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlRoZSBMaW51eCBJckRBIExBTiBwcm90b2NvbCIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfcGFyYW0oZXRoLCBib29sLCAwKTsKTU9EVUxFX1BBUk1fREVTQyhldGgsICJOYW1lIGRldmljZXMgZXRoWCAoMCkgb3IgaXJsYW5YICgxKSIpOwptb2R1bGVfcGFyYW0oYWNjZXNzLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGFjY2VzcywgIkFjY2VzcyB0eXBlIERJUkVDVD0xLCBQRUVSPTIsIEhPU1RFRD0zIik7Cgptb2R1bGVfaW5pdChpcmxhbl9pbml0KTsKbW9kdWxlX2V4aXQoaXJsYW5fY2xlYW51cCk7Cgo=