LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgYWN0aXN5cy5jCiAqIFZlcnNpb246ICAgICAgIDEuMAogKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEFDVGlTWVMgSVItMjIwTCBhbmQgSVItMjIwTCsgCiAqICAgICAgICAgICAgICAgIGRvbmdsZXMKICogU3RhdHVzOiAgICAgICAgQmV0YS4KICogQXV0aG9yczogICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiAoaW5pdGlhbGx5KQogKgkJICBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+IChuZXcgdmVyc2lvbikKICogQ3JlYXRlZCBhdDogICAgV2VkIE9jdCAyMSAyMDowMjozNSAxOTk4CiAqIE1vZGlmaWVkIGF0OiAgIEZyaSBEZWMgMTcgMDk6MTA6NDMgMTk5OQogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIAogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgSmVhbiBUb3VycmlsaGVzCiAqICAgICAgCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKiAgCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICogICAgIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBDaGFuZ2Vsb2cKICoKICogMC44IC0+IDAuOTk5OSAtIEplYW4KICoJbyBOZXcgaW5pdGlhbGlzYXRpb24gcHJvY2VkdXJlIDogbXVjaCBzYWZlciBhbmQgY29ycmVjdAogKglvIE5ldyBwcm9jZWR1cmUgdGhlIGNoYW5nZSBzcGVlZCA6IG11Y2ggZmFzdGVyIGFuZCBzaW1wbGVyCiAqCW8gT3RoZXIgY2xlYW51cHMgJiBjb21tZW50cwogKglUaGFua3MgdG8gTGljaGVuIFdhbmcgQCBBY3Rpc3lzIGZvciBoaXMgZXhjZWxsZW50IGhlbHAuLi4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvdHR5Lmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KCi8qIAogKiBEZWZpbmUgdGhlIHRpbWluZyBvZiB0aGUgcHVsc2VzIHdlIHNlbmQgdG8gdGhlIGRvbmdsZSAodG8gcmVzZXQgaXQsIGFuZAogKiB0byB0b2dnbGUgc3BlZWRzKS4gQmFzaWNhbGx5LCB0aGUgbGltaXQgaGVyZSBpcyB0aGUgcHJvcGFnYXRpb24gc3BlZWQgb2YKICogdGhlIHNpZ25hbHMgdGhyb3VnaCB0aGUgc2VyaWFsIHBvcnQsIHRoZSBkb25nbGUgYmVpbmcgbXVjaCBmYXN0ZXIuICBBbnkKICogc2VyaWFsIHBvcnQgc3VwcG9ydCAxMTUga2Ivcywgc28gd2UgYXJlIHN1cmUgdGhhdCBwdWxzZXMgOC41IHVzIHdpZGUgY2FuCiAqIGdvIHRocm91Z2ggY2xlYW5seSAuIElmIHlvdSBhcmUgb24gdGhlIHdpbGQgc2lkZSwgeW91IGNhbiB0cnkgdG8gbG93ZXIKICogdGhpcyB2YWx1ZSAoQWN0aXN5cyByZWNvbW1lbmRlZCBtZSAyIHVzLCBhbmQgMCB1cyB3b3JrIGZvciBtZSBvbiBhIFAyMzMhKQogKi8KI2RlZmluZSBNSU5fREVMQVkgMTAJLyogMTAgdXMgdG8gYmUgb24gdGhlIGNvbnNlcnZhdGl2ZSBzaWRlICovCgpzdGF0aWMgaW50ICBhY3Rpc3lzX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKc3RhdGljIGludCAgYWN0aXN5c19yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKc3RhdGljIHZvaWQgYWN0aXN5c19vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CnN0YXRpYyB2b2lkIGFjdGlzeXNfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOwoKLyogVGhlc2UgYXJlIHRoZSBiYXVkcmF0ZXMgc3VwcG9ydGVkLCBpbiB0aGUgb3JkZXIgYXZhaWxhYmxlICovCi8qIE5vdGUgOiB0aGUgMjIwTCBkb2Vzbid0IHN1cHBvcnQgMzg0MDAsIGJ1dCB3ZSB3aWxsIGZpeCB0aGF0IGJlbG93ICovCnN0YXRpYyBfX3UzMiBiYXVkX3JhdGVzW10gPSB7IDk2MDAsIDE5MjAwLCA1NzYwMCwgMTE1MjAwLCAzODQwMCB9OwojZGVmaW5lIE1BWF9TUEVFRFMgNQoKc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKCS50eXBlID0gSVJEQV9BQ1RJU1lTX0RPTkdMRSwKCS5vcGVuID0gYWN0aXN5c19vcGVuLAoJLmNsb3NlID0gYWN0aXN5c19jbG9zZSwKCS5yZXNldCA9IGFjdGlzeXNfcmVzZXQsCgkuY2hhbmdlX3NwZWVkID0gYWN0aXN5c19jaGFuZ2Vfc3BlZWQsCgkub3duZXIgPSBUSElTX01PRFVMRSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGVfcGx1cyA9IHsKCS50eXBlID0gSVJEQV9BQ1RJU1lTX1BMVVNfRE9OR0xFLAoJLm9wZW4gPSBhY3Rpc3lzX29wZW4sCgkuY2xvc2UgPSBhY3Rpc3lzX2Nsb3NlLAoJLnJlc2V0ID0gYWN0aXN5c19yZXNldCwKCS5jaGFuZ2Vfc3BlZWQgPSBhY3Rpc3lzX2NoYW5nZV9zcGVlZCwKCS5vd25lciA9IFRISVNfTU9EVUxFLAp9OwoKLyoKICogRnVuY3Rpb24gYWN0aXN5c19jaGFuZ2Vfc3BlZWQgKHRhc2spCiAqCiAqCVRoZXJlIGlzIHR3byBtb2RlbCBvZiBBY3Rpc3lzIGRvbmdsZSB3ZSBhcmUgZGVhbGluZyB3aXRoLAogKiB0aGUgMjIwTCBhbmQgMjIwTCsuIEF0IHRoaXMgcG9pbnQsIG9ubHkgaXJhdHRhY2gga25vd3Mgd2l0aAogKiBraW5kIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgKGl0IHdhcyBhbiBhcmd1bWVudCBvbiBpcmF0dGFjaAogKiBjb21tYW5kIGxpbmUpLgogKglTbywgd2UgcmVnaXN0ZXIgYSBkb25nbGUgb2YgZWFjaCBzb3J0IGFuZCBsZXQgaXJhdHRhY2gKICogcGljayB0aGUgcmlnaHQgb25lLi4uCiAqLwpzdGF0aWMgaW50IF9faW5pdCBhY3Rpc3lzX2luaXQodm9pZCkKewoJaW50IHJldDsKCgkvKiBGaXJzdCwgcmVnaXN0ZXIgYW4gQWN0aXN5cyAyMjBMIGRvbmdsZSAqLwoJcmV0ID0gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOwoJaWYgKHJldCA8IDApCgkJcmV0dXJuIHJldDsKCS8qIE5vdywgcmVnaXN0ZXIgYW4gQWN0aXN5cyAyMjBMKyBkb25nbGUgKi8KCXJldCA9IGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlX3BsdXMpOwoJaWYgKHJldCA8IDApIHsKCQlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKCQlyZXR1cm4gcmV0OwoJfQkKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgYWN0aXN5c19jbGVhbnVwKHZvaWQpCnsKCS8qIFdlIGhhdmUgdG8gcmVtb3ZlIGJvdGggZG9uZ2xlcyAqLwoJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7CglpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlX3BsdXMpOwp9CgpzdGF0aWMgdm9pZCBhY3Rpc3lzX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQp7CgkvKiBQb3dlciBvbiB0aGUgZG9uZ2xlICovCglzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOwoKCS8qIFNldCB0aGUgc3BlZWRzIHdlIGNhbiBhY2NlcHQgKi8KCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CgoJLyogUmVtb3ZlIHN1cHBvcnQgZm9yIDM4NDAwIGlmIHRoaXMgaXMgbm90IGEgMjIwTCsgZG9uZ2xlICovCglpZiAoc2VsZi0+aXNzdWUtPnR5cGUgPT0gSVJEQV9BQ1RJU1lTX0RPTkdMRSkKCQlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IH5JUl8zODQwMDsKCQoJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDdmOyAvKiBOZWVkcyAwLjAxIG1zICovCn0KCnN0YXRpYyB2b2lkIGFjdGlzeXNfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpCnsKCS8qIFBvd2VyIG9mZiB0aGUgZG9uZ2xlICovCglzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGFjdGlzeXNfY2hhbmdlX3NwZWVkICh0YXNrKQogKgogKiAgICBDaGFuZ2Ugc3BlZWQgb2YgdGhlIEFDVGlTWVMgSVItMjIwTCBhbmQgSVItMjIwTCsgdHlwZSBJckRBIGRvbmdsZXMuCiAqICAgIFRvIGN5Y2xlIHRocm91Z2ggdGhlIGF2YWlsYWJsZSBiYXVkIHJhdGVzLCBwdWxzZSBSVFMgbG93IGZvciBhIGZldyB1cy4KICoKICoJRmlyc3QsIHdlIHJlc2V0IHRoZSBkb25nbGUgdG8gYWx3YXlzIHN0YXJ0IGZyb20gYSBrbm93biBzdGF0ZS4KICoJVGhlbiwgd2UgY3ljbGUgdGhyb3VnaCB0aGUgc3BlZWRzIGJ5IHB1bHNpbmcgUlRTIGxvdyBhbmQgdGhlbiB1cC4KICoJVGhlIGRvbmdsZSBhbGxvdyB1cyB0byBwdWxzZSBxdWl0ZSBmYXN0LCBzZSB3ZSBjYW4gc2V0IHNwZWVkIGluIG9uZSBnbywKICogd2hpY2ggaXMgbXVzdCBmYXN0ZXIgKCA8IDEwMCB1cykgYW5kIGxlc3MgY29tcGxleCB0aGFuIHdoYXQgaXMgZm91bmQKICogaW4gc29tZSBvdGhlciBkb25nbGUgZHJpdmVycy4uLgogKglOb3RlIHRoYXQgZXZlbiBpZiB0aGUgbmV3IHNwZWVkIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHNwZWVkLAogKiB3ZSByZWFzc2VydCB0aGUgc3BlZWQuIFRoaXMgbWFrZSBzdXJlIHRoYXQgdGhpbmdzIGFyZSBhbGwgcmlnaHQsCiAqIGFuZCBpdCdzIGZhc3QgYW55d2F5Li4uCiAqCUJ5IHRoZSB3YXksIHRoaXMgZnVuY3Rpb24gd2lsbCB3b3JrIGZvciBib3RoIHR5cGUgb2YgZG9uZ2xlcywKICogYmVjYXVzZSB0aGUgYWRkaXRpb25hbCBzcGVlZCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4uLgogKi8Kc3RhdGljIGludCBhY3Rpc3lzX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQp7Cglkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKCV9fdTMyIHNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsJLyogVGFyZ2V0IHNwZWVkICovCglpbnQgcmV0ID0gMDsKCWludCBpID0gMDsKCiAgICAgICAgSVJEQV9ERUJVRyg0LCAiJXMoKSwgc3BlZWQ9JWQgKHdhcyAlZClcbiIsIF9fRlVOQ1RJT05fXywgc3BlZWQsIAoJCSAgIHNlbGYtPnNwZWVkKTsKCgkvKiBHbyB0byBhIGtub3duIHN0YXRlIGJ5IHJlc2V0aW5nIHRoZSBkb25nbGUgKi8KCgkvKiBSZXNldCB0aGUgZG9uZ2xlIDogc2V0IERUUiBsb3cgZm9yIDEwIHVzICovCglzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBUUlVFKTsKCXVkZWxheShNSU5fREVMQVkpOwoKCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKHdlIGFyZSBub3cgYXQgOTYwMCBiL3MpICovCglzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOwogCgkvKiAKCSAqIE5vdywgd2UgY2FuIHNldCB0aGUgc3BlZWQgcmVxdWVzdGVkLiBTZW5kIFJUUyBwdWxzZXMgdW50aWwgd2UKICAgICAgICAgKiByZWFjaCB0aGUgdGFyZ2V0IHNwZWVkIAoJICovCglmb3IgKGk9MDsgaTxNQVhfU1BFRURTOyBpKyspIHsKCQlpZiAoc3BlZWQgPT0gYmF1ZF9yYXRlc1tpXSkgewoJCQlzZWxmLT5zcGVlZCA9IGJhdWRfcmF0ZXNbaV07CgkJCWJyZWFrOwoJCX0KCQkvKiBNYWtlIHN1cmUgcHJldmlvdXMgcHVsc2UgaXMgZmluaXNoZWQgKi8KCQl1ZGVsYXkoTUlOX0RFTEFZKTsKCgkJLyogU2V0IFJUUyBsb3cgZm9yIDEwIHVzICovCgkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBGQUxTRSk7CgkJdWRlbGF5KE1JTl9ERUxBWSk7CgoJCS8qIFNldCBSVFMgaGlnaCBmb3IgMTAgdXMgKi8KCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOwoJfQoKCS8qIENoZWNrIGlmIGxpZmUgaXMgc3dlZXQuLi4gKi8KCWlmIChpID49IE1BWF9TUEVFRFMpCgkJcmV0ID0gLTE7ICAvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuICovCgoJLyogQmFzdGEgbGF2b3JvLCBvbiBzZSBjYXNzZSBkJ2ljaS4uLiAqLwoJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOwoKCXJldHVybiByZXQ7Cn0KCi8qCiAqIEZ1bmN0aW9uIGFjdGlzeXNfcmVzZXQgKHRhc2spCiAqCiAqICAgICAgUmVzZXQgdGhlIEFjdGlzeXMgdHlwZSBkb25nbGUuIFdhcm5pbmcsIHRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlCiAqICAgICAgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhCiAqCiAqIFdlIG5lZWQgdG8gZG8gdHdvIHRoaW5ncyBpbiB0aGlzIGZ1bmN0aW9uIDoKICoJbyBmaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGUgZG9uZ2xlIGlzIGluIGEgc3RhdGUgd2hlcmUgaXQgY2FuIG9wZXJhdGUKICoJbyBzZWNvbmQgcHV0IHRoZSBkb25nbGUgaW4gYSBrbm93IHN0YXRlCiAqCiAqCVRoZSBkb25nbGUgaXMgcG93ZXJlZCBvZiB0aGUgUlRTIGFuZCBEVFIgbGluZXMuIEluIHRoZSBkb25nbGUsIHRoZXJlCiAqIGlzIGEgYmlnIGNhcGFjaXRvciB0byBhY2NvbW1vZGF0ZSB0aGUgY3VycmVudCBzcGlrZXMuIFRoaXMgY2FwYWNpdG9yCiAqIHRha2VzIGEgbGVhc3QgNTAgbXMgdG8gYmUgY2hhcmdlZC4gSW4gdGhlb3J5LCB0aGUgQmlvcyBzZXQgdGhvc2UgbGluZXMKICogdXAsIHNvIGJ5IHRoZSB0aW1lIHdlIGFycml2ZSBoZXJlIHdlIHNob3VsZCBiZSBzZXQuIEl0IGRvZXNuJ3QgaHVydAogKiB0byBiZSBvbiB0aGUgY29uc2VydmF0aXZlIHNpZGUsIHNvIHdlIHdpbGwgd2FpdC4uLgogKglUaGVuLCB3ZSBzZXQgdGhlIHNwZWVkIHRvIDk2MDAgYi9zIHRvIGdldCBpbiBhIGtub3duIHN0YXRlIChzZWUgaW4KICogY2hhbmdlX3NwZWVkIGZvciBkZXRhaWxzKS4gSXQgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIElyREEgc3RhY2sKICogaGFzIHRyaWVkIHRvIHNldCB0aGUgc3BlZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgb3VyIGZpcnN0IHJldHVybiwKICogc28gYmVmb3JlIHdlIGNhbiBiZSBzdXJlIHRoZSBkb25nbGUgaXMgdXAgYW5kIHJ1bm5pbmcuCiAqLwpzdGF0aWMgaW50IGFjdGlzeXNfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKewoJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CglpbnQgcmV0ID0gMDsKCglJUkRBX0FTU0VSVCh0YXNrICE9IE5VTEwsIHJldHVybiAtMTspOwoKCXNlbGYtPnJlc2V0X3Rhc2sgPSB0YXNrOwoKCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CgkJLyogU2V0IGJvdGggRFRSICYgUlRTIHRvIHBvd2VyIHVwIHRoZSBkb25nbGUgKi8KCQkvKiBJbiB0aGVvcnkgcmVkdW5kYW50IHdpdGggcG93ZXIgdXAgaW4gYWN0aXN5c19vcGVuKCkgKi8KCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOwoJCQoJCS8qIFNsZWVwIDUwIG1zIHRvIG1ha2Ugc3VyZSBjYXBhY2l0b3IgaXMgY2hhcmdlZCAqLwoJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoNTApOwoJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUKTsKCQlicmVhazsKCWNhc2UgSVJEQV9UQVNLX1dBSVQ6CQkJCgkJLyogUmVzZXQgdGhlIGRvbmdsZSA6IHNldCBEVFIgbG93IGZvciAxMCB1cyAqLwoJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOwoJCXVkZWxheShNSU5fREVMQVkpOwoKCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCgkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKCQoJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKCQlzZWxmLT5zcGVlZCA9IDk2MDA7CS8qIFRoYXQncyB0aGUgZGVmYXVsdCAqLwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CgkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CgkJcmV0ID0gLTE7CgkJYnJlYWs7Cgl9CglyZXR1cm4gcmV0Owp9CgpNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+IC0gSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkFDVGlTWVMgSVItMjIwTCBhbmQgSVItMjIwTCsgZG9uZ2xlIGRyaXZlciIpOwkKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTIiKTsgLyogSVJEQV9BQ1RJU1lTX0RPTkdMRSAqLwpNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTMiKTsgLyogSVJEQV9BQ1RJU1lTX1BMVVNfRE9OR0xFICovCgoJCQovKgogKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKICoKICogICAgSW5pdGlhbGl6ZSBBY3Rpc3lzIG1vZHVsZQogKgogKi8KbW9kdWxlX2luaXQoYWN0aXN5c19pbml0KTsKCi8qCiAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQogKgogKiAgICBDbGVhbnVwIEFjdGlzeXMgbW9kdWxlCiAqCiAqLwptb2R1bGVfZXhpdChhY3Rpc3lzX2NsZWFudXApOwo=