LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiAoQykgQ29weXJpZ2h0IDIwMDIKICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgogKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8d2F0Y2hkb2cuaD4KI2luY2x1ZGUgPGNvbW1hbmQuaD4KI2luY2x1ZGUgPGRldmljZXMuaD4KI2luY2x1ZGUgPHZlcnNpb24uaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgojaW5jbHVkZSA8bmV0Lmg+CiNpbmNsdWRlIDxpZGUuaD4KI2luY2x1ZGUgPGFzbS91LWJvb3QtaTM4Ni5oPgoKREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgpleHRlcm4gbG9uZyBfaTM4NmJvb3Rfc3RhcnQ7CmV4dGVybiBsb25nIF9pMzg2Ym9vdF9lbmQ7CmV4dGVybiBsb25nIF9pMzg2Ym9vdF9yb21kYXRhX3N0YXJ0OwpleHRlcm4gbG9uZyBfaTM4NmJvb3Rfcm9tZGF0YV9kZXN0OwpleHRlcm4gbG9uZyBfaTM4NmJvb3Rfcm9tZGF0YV9zaXplOwpleHRlcm4gbG9uZyBfaTM4NmJvb3RfYnNzX3N0YXJ0OwpleHRlcm4gbG9uZyBfaTM4NmJvb3RfYnNzX3NpemU7CgpleHRlcm4gbG9uZyBfaTM4NmJvb3RfcmVhbG1vZGU7CmV4dGVybiBsb25nIF9pMzg2Ym9vdF9yZWFsbW9kZV9zaXplOwpleHRlcm4gbG9uZyBfaTM4NmJvb3RfYmlvczsKZXh0ZXJuIGxvbmcgX2kzODZib290X2Jpb3Nfc2l6ZTsKCi8qIFRoZSBzeW1ib2xzIGRlZmluZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQgYmVjb21lcyBwb2ludGVycwogKiB3aGljaCBpcyBzb21ld2hhdCBpbmNvbnZlaWVudCAuLi4gKi8KdWxvbmcgaTM4NmJvb3Rfc3RhcnQgICAgICAgICA9ICh1bG9uZykmX2kzODZib290X3N0YXJ0OyAgICAgICAgIC8qIGNvZGUgc3RhcnQgKGluIGZsYXNoKSBkZWZpbmVkIGluIHN0YXJ0LlMgKi8KdWxvbmcgaTM4NmJvb3RfZW5kICAgICAgICAgICA9ICh1bG9uZykmX2kzODZib290X2VuZDsJICAgICAgICAvKiBjb2RlIGVuZCAoaW4gZmxhc2gpICovCnVsb25nIGkzODZib290X3JvbWRhdGFfc3RhcnQgPSAodWxvbmcpJl9pMzg2Ym9vdF9yb21kYXRhX3N0YXJ0OyAvKiBkYXRhc2VnbWVudCBpbiBmbGFzaCAoYWxzbyBjb2RlK3JvZGF0YSBlbmQpICovCnVsb25nIGkzODZib290X3JvbWRhdGFfZGVzdCAgPSAodWxvbmcpJl9pMzg2Ym9vdF9yb21kYXRhX2Rlc3Q7ICAvKiBkYXRhIGxvY2F0aW9uIHNlZ21lbnQgaW4gcmFtICovCnVsb25nIGkzODZib290X3JvbWRhdGFfc2l6ZSAgPSAodWxvbmcpJl9pMzg2Ym9vdF9yb21kYXRhX3NpemU7ICAvKiBzaXplIG9mIGRhdGEgc2VnbWVudCAqLwp1bG9uZyBpMzg2Ym9vdF9ic3Nfc3RhcnQgICAgID0gKHVsb25nKSZfaTM4NmJvb3RfYnNzX3N0YXJ0OyAgICAgLyogYnNzIHN0YXJ0ICovCnVsb25nIGkzODZib290X2Jzc19zaXplICAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9ic3Nfc2l6ZTsgICAgICAvKiBic3Mgc2l6ZSAqLwoKdWxvbmcgaTM4NmJvb3RfcmVhbG1vZGUgICAgICA9ICh1bG9uZykmX2kzODZib290X3JlYWxtb2RlOyAgICAgIC8qIHN0YXJ0IG9mIHJlYWxtb2RlIGVudHJ5IGNvZGUgKi8KdWxvbmcgaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSA9ICh1bG9uZykmX2kzODZib290X3JlYWxtb2RlX3NpemU7IC8qIHNpemUgb2YgcmVhbG1vZGUgZW50cnkgY29kZSAqLwp1bG9uZyBpMzg2Ym9vdF9iaW9zICAgICAgICAgID0gKHVsb25nKSZfaTM4NmJvb3RfYmlvczsgICAgICAgICAgLyogc3RhcnQgb2YgQklPUyBlbXVsYXRpb24gY29kZSAqLwp1bG9uZyBpMzg2Ym9vdF9iaW9zX3NpemUgICAgID0gKHVsb25nKSZfaTM4NmJvb3RfYmlvc19zaXplOyAgICAgLyogc2l6ZSBvZiBCSU9TIGVtdWxhdGlvbiBjb2RlICovCgoKY29uc3QgY2hhciB2ZXJzaW9uX3N0cmluZ1tdID0KCVVfQk9PVF9WRVJTSU9OIiAoIiBfX0RBVEVfXyAiIC0gIiBfX1RJTUVfXyAiKSI7CgoKLyoKICogQmVnaW4gYW5kIEVuZCBvZiBtZW1vcnkgYXJlYSBmb3IgbWFsbG9jKCksIGFuZCBjdXJyZW50ICJicmsiCiAqLwpzdGF0aWMgdWxvbmcgbWVtX21hbGxvY19zdGFydCA9IDA7CnN0YXRpYyB1bG9uZyBtZW1fbWFsbG9jX2VuZCA9IDA7CnN0YXRpYyB1bG9uZyBtZW1fbWFsbG9jX2JyayA9IDA7CgpzdGF0aWMgaW50IG1lbV9tYWxsb2NfaW5pdCh2b2lkKQp7CgkvKiBzdGFydCBtYWxsb2MgYXJlYSByaWdodCBhZnRlciB0aGUgc3RhY2sgKi8KCW1lbV9tYWxsb2Nfc3RhcnQgPSBpMzg2Ym9vdF9ic3Nfc3RhcnQgKwoJCWkzODZib290X2Jzc19zaXplICsgQ0ZHX1NUQUNLX1NJWkU7CgltZW1fbWFsbG9jX3N0YXJ0ID0gKG1lbV9tYWxsb2Nfc3RhcnQrMykmfjM7CgoJLyogVXNlIGFsbCBhdmFpbGFibGUgUkFNIGZvciBtYWxsb2MoKSAqLwoJbWVtX21hbGxvY19lbmQgPSBnZC0+cmFtX3NpemU7CgoJbWVtX21hbGxvY19icmsgPSBtZW1fbWFsbG9jX3N0YXJ0OwoKCXJldHVybiAwOwp9Cgp2b2lkICpzYnJrIChwdHJkaWZmX3QgaW5jcmVtZW50KQp7Cgl1bG9uZyBvbGQgPSBtZW1fbWFsbG9jX2JyazsKCXVsb25nIG5ldyA9IG9sZCArIGluY3JlbWVudDsKCglpZiAoKG5ldyA8IG1lbV9tYWxsb2Nfc3RhcnQpIHx8IChuZXcgPiBtZW1fbWFsbG9jX2VuZCkpIHsKCQlyZXR1cm4gKE5VTEwpOwoJfQoJbWVtX21hbGxvY19icmsgPSBuZXc7CgoJcmV0dXJuICgodm9pZCAqKSBvbGQpOwp9CgpjaGFyICpzdHJtaHogKGNoYXIgKmJ1ZiwgbG9uZyBoeikKewoJbG9uZyBsLCBuOwoJbG9uZyBtOwoKCW4gPSBoeiAvIDEwMDAwMDBMOwoJbCA9IHNwcmludGYgKGJ1ZiwgIiVsZCIsIG4pOwoJbSA9IChoeiAlIDEwMDAwMDBMKSAvIDEwMDBMOwoJaWYgKG0gIT0gMCkKCQlzcHJpbnRmIChidWYgKyBsLCAiLiUwM2xkIiwgbSk7CglyZXR1cm4gKGJ1Zik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSW5pdCBVdGlsaXRpZXMJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNvbWUgb2YgdGhpcyBjb2RlIHNob3VsZCBiZSBtb3ZlZCBpbnRvIHRoZSBjb3JlIGZ1bmN0aW9ucywKICogb3IgZHJvcHBlZCBjb21wbGV0ZWx5LAogKiBidXQgbGV0J3MgZ2V0IGl0IHdvcmtpbmcgKGFnYWluKSBmaXJzdC4uLgogKi8Kc3RhdGljIGludCBpbml0X2JhdWRyYXRlICh2b2lkKQp7CgljaGFyIHRtcFs2NF07CS8qIGxvbmcgZW5vdWdoIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KCWludCBpID0gZ2V0ZW52X3IoImJhdWRyYXRlIiwgdG1wLCA2NCk7CgoJZ2QtPmJhdWRyYXRlID0gKGkgIT0gMCkKCQkJPyAoaW50KSBzaW1wbGVfc3RydG91bCAodG1wLCBOVUxMLCAxMCkKCQkJOiBDT05GSUdfQkFVRFJBVEU7CgoJcmV0dXJuICgwKTsKfQoKc3RhdGljIGludCBkaXNwbGF5X2Jhbm5lciAodm9pZCkKewoKCXByaW50ZiAoIlxuXG4lc1xuXG4iLCB2ZXJzaW9uX3N0cmluZyk7CglwcmludGYgKCJVLUJvb3QgY29kZTogJTA4bFggLT4gJTA4bFggIGRhdGE6ICUwOGxYIC0+ICUwOGxYXG4iCgkJIiAgICAgICAgQlNTOiAlMDhsWCAtPiAlMDhsWCBzdGFjazogJTA4bFggLT4gJTA4bFhcbiIsCgkJaTM4NmJvb3Rfc3RhcnQsIGkzODZib290X3JvbWRhdGFfc3RhcnQtMSwKCQlpMzg2Ym9vdF9yb21kYXRhX2Rlc3QsIGkzODZib290X3JvbWRhdGFfZGVzdCtpMzg2Ym9vdF9yb21kYXRhX3NpemUtMSwKCQlpMzg2Ym9vdF9ic3Nfc3RhcnQsIGkzODZib290X2Jzc19zdGFydCtpMzg2Ym9vdF9ic3Nfc2l6ZS0xLAoJCWkzODZib290X2Jzc19zdGFydCtpMzg2Ym9vdF9ic3Nfc2l6ZSwKCQlpMzg2Ym9vdF9ic3Nfc3RhcnQraTM4NmJvb3RfYnNzX3NpemUrQ0ZHX1NUQUNLX1NJWkUtMSk7CgoKCXJldHVybiAoMCk7Cn0KCi8qCiAqIFdBUk5JTkc6IHRoaXMgY29kZSBsb29rcyAiY2xlYW5lciIgdGhhbiB0aGUgUG93ZXJQQyB2ZXJzaW9uLCBidXQKICogaGFzIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCB5b3UgZWl0aGVyIGdldCBub3RoaW5nLCBvciBldmVyeXRoaW5nLgogKiBPbiBQb3dlclBDLCB5b3UgbWlnaHQgc2VlICJEUkFNOiAiIGJlZm9yZSB0aGUgc3lzdGVtIGhhbmdzIC0gd2hpY2gKICogZ2l2ZXMgYSBzaW1wbGUgeWV0IGNsZWFyIGluZGljYXRpb24gd2hpY2ggcGFydCBvZiB0aGUKICogaW5pdGlhbGl6YXRpb24gaWYgZmFpbGluZy4KICovCnN0YXRpYyBpbnQgZGlzcGxheV9kcmFtX2NvbmZpZyAodm9pZCkKewoJaW50IGk7CgoJcHV0cyAoIkRSQU0gQ29uZmlndXJhdGlvbjpcbiIpOwoKCWZvciAoaT0wOyBpPENPTkZJR19OUl9EUkFNX0JBTktTOyBpKyspIHsKCQlwcmludGYgKCJCYW5rICMlZDogJTA4bHggIiwgaSwgZ2QtPmJkLT5iaV9kcmFtW2ldLnN0YXJ0KTsKCQlwcmludF9zaXplIChnZC0+YmQtPmJpX2RyYW1baV0uc2l6ZSwgIlxuIik7Cgl9CgoJcmV0dXJuICgwKTsKfQoKc3RhdGljIHZvaWQgZGlzcGxheV9mbGFzaF9jb25maWcgKHVsb25nIHNpemUpCnsKCXB1dHMgKCJGbGFzaDogIik7CglwcmludF9zaXplIChzaXplLCAiXG4iKTsKfQoKCi8qCiAqIEJyZWF0aCBzb21lIGxpZmUgaW50byB0aGUgYm9hcmQuLi4KICoKICogSW5pdGlhbGl6ZSBhbiBTTUMgZm9yIHNlcmlhbCBjb21tcywgYW5kIGNhcnJ5IG91dCBzb21lIGhhcmR3YXJlCiAqIHRlc3RzLgogKgogKiBUaGUgZmlyc3QgcGFydCBvZiBpbml0aWFsaXphdGlvbiBpcyBydW5uaW5nIGZyb20gRmxhc2ggbWVtb3J5OwogKiBpdHMgbWFpbiBwdXJwb3NlIGlzIHRvIGluaXRpYWxpemUgdGhlIFJBTSBzbyB0aGF0IHdlCiAqIGNhbiByZWxvY2F0ZSB0aGUgbW9uaXRvciBjb2RlIHRvIFJBTS4KICovCgovKgogKiBBbGwgYXR0ZW1wdHMgdG8gY29tZSB1cCB3aXRoIGEgImNvbW1vbiIgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UKICogdGhhdCB3b3JrcyBmb3IgYWxsIGJvYXJkcyBhbmQgYXJjaGl0ZWN0dXJlcyBmYWlsZWQ6IHNvbWUgb2YgdGhlCiAqIHJlcXVpcmVtZW50cyBhcmUganVzdCBfdG9vXyBkaWZmZXJlbnQuIFRvIGdldCByaWQgb2YgdGhlIHJlc3VsdGluZwogKiBtZXNzIG9mIGJvYXJkIGRlcGVuZGVuZCAjaWZkZWYnZWQgY29kZSB3ZSBub3cgbWFrZSB0aGUgd2hvbGUKICogaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgY29uZmlndXJhYmxlIHRvIHRoZSB1c2VyLgogKgogKiBUaGUgcmVxdWlyZW1lbnRzIGZvciBhbnkgbmV3IGluaXRhbGl6YXRpb24gZnVuY3Rpb24gaXMgc2ltcGxlOiBpdAogKiByZWNlaXZlcyBhIHBvaW50ZXIgdG8gdGhlICJnbG9iYWwgZGF0YSIgc3RydWN0dXJlIGFzIGl0J3Mgb25seQogKiBhcmd1bWVudCwgYW5kIHJldHVybnMgYW4gaW50ZWdlciByZXR1cm4gY29kZSwgd2hlcmUgMCBtZWFucwogKiAiY29udGludWUiIGFuZCAhPSAwIG1lYW5zICJmYXRhbCBlcnJvciwgaGFuZyB0aGUgc3lzdGVtIi4KICovCnR5cGVkZWYgaW50IChpbml0X2ZuY190KSAodm9pZCk7Cgppbml0X2ZuY190ICppbml0X3NlcXVlbmNlW10gPSB7CgljcHVfaW5pdCwJCS8qIGJhc2ljIGNwdSBkZXBlbmRlbnQgc2V0dXAgKi8KCWJvYXJkX2luaXQsCQkvKiBiYXNpYyBib2FyZCBkZXBlbmRlbnQgc2V0dXAgKi8KCWRyYW1faW5pdCwJCS8qIGNvbmZpZ3VyZSBhdmFpbGFibGUgUkFNIGJhbmtzICovCgltZW1fbWFsbG9jX2luaXQsICAgICAgICAvKiBkZXBlbmRhbnQgb24gZHJhbV9pbml0ICovCglpbnRlcnJ1cHRfaW5pdCwJCS8qIHNldCB1cCBleGNlcHRpb25zICovCgl0aW1lcl9pbml0LAoJc2VyaWFsX2luaXQsCgllbnZfaW5pdCwJCS8qIGluaXRpYWxpemUgZW52aXJvbm1lbnQgKi8KCWluaXRfYmF1ZHJhdGUsCQkvKiBpbml0aWFsemUgYmF1ZHJhdGUgc2V0dGluZ3MgKi8KCXNlcmlhbF9pbml0LAkJLyogc2VyaWFsIGNvbW11bmljYXRpb25zIHNldHVwICovCglkaXNwbGF5X2Jhbm5lciwKCWRpc3BsYXlfZHJhbV9jb25maWcsCgoJTlVMTCwKfTsKCmdkX3QgKmdsb2JhbF9kYXRhOwoKdm9pZCBzdGFydF9pMzg2Ym9vdCAodm9pZCkKewoJY2hhciAqczsKCWludCBpOwoJdWxvbmcgc2l6ZTsKCXN0YXRpYyBnZF90IGdkX2RhdGE7CglzdGF0aWMgYmRfdCBiZF9kYXRhOwoJaW5pdF9mbmNfdCAqKmluaXRfZm5jX3B0cjsKCglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyMSk7CgoJZ2QgPSBnbG9iYWxfZGF0YSA9ICZnZF9kYXRhOwoJLyogY29tcGlsZXIgb3B0aW1pemF0aW9uIGJhcnJpZXIgbmVlZGVkIGZvciBHQ0MgPj0gMy40ICovCglfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjogOiA6Im1lbW9yeSIpOwoKCW1lbXNldCAoZ2QsIDAsIHNpemVvZiAoZ2RfdCkpOwoJZ2QtPmJkID0gJmJkX2RhdGE7CgltZW1zZXQgKGdkLT5iZCwgMCwgc2l6ZW9mIChiZF90KSk7CglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyMik7CgoJZ2QtPmJhdWRyYXRlID0gIENPTkZJR19CQVVEUkFURTsKCglmb3IgKGluaXRfZm5jX3B0ciA9IGluaXRfc2VxdWVuY2UsIGk9MDsgKmluaXRfZm5jX3B0cjsgKytpbml0X2ZuY19wdHIsIGkrKykgewoJCXNob3dfYm9vdF9wcm9ncmVzcygweGExMzB8aSk7CgoJCWlmICgoKmluaXRfZm5jX3B0cikoKSAhPSAwKSB7CgkJCWhhbmcgKCk7CgkJfQoJfQoJc2hvd19ib290X3Byb2dyZXNzKDB4MjMpOwoKCS8qIGNvbmZpZ3VyZSBhdmFpbGFibGUgRkxBU0ggYmFua3MgKi8KCXNpemUgPSBmbGFzaF9pbml0KCk7CglkaXNwbGF5X2ZsYXNoX2NvbmZpZyhzaXplKTsKCXNob3dfYm9vdF9wcm9ncmVzcygweDI0KTsKCglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyNSk7CgoJLyogaW5pdGlhbGl6ZSBlbnZpcm9ubWVudCAqLwoJZW52X3JlbG9jYXRlICgpOwoJc2hvd19ib290X3Byb2dyZXNzKDB4MjYpOwoKCgkvKiBJUCBBZGRyZXNzICovCgliZF9kYXRhLmJpX2lwX2FkZHIgPSBnZXRlbnZfSVBhZGRyICgiaXBhZGRyIik7CgoJLyogTUFDIEFkZHJlc3MgKi8KCXsKCQlpbnQgaTsKCQl1bG9uZyByZWc7CgkJY2hhciAqcywgKmU7CgkJdWNoYXIgdG1wWzY0XTsKCgkJaSA9IGdldGVudl9yICgiZXRoYWRkciIsIHRtcCwgc2l6ZW9mICh0bXApKTsKCQlzID0gKGkgPiAwKSA/IHRtcCA6IE5VTEw7CgoJCWZvciAocmVnID0gMDsgcmVnIDwgNjsgKytyZWcpIHsKCQkJYmRfZGF0YS5iaV9lbmV0YWRkcltyZWddID0gcyA/IHNpbXBsZV9zdHJ0b3VsIChzLCAmZSwgMTYpIDogMDsKCQkJaWYgKHMpCgkJCQlzID0gKCplKSA/IGUgKyAxIDogZTsKCQl9Cgl9CgojaWYgZGVmaW5lZChDT05GSUdfUENJKQoJLyoKCSAqIERvIHBjaSBjb25maWd1cmF0aW9uCgkgKi8KCXBjaV9pbml0KCk7CiNlbmRpZgoKCXNob3dfYm9vdF9wcm9ncmVzcygweDI3KTsKCgoJZGV2aWNlc19pbml0ICgpOwoKCWp1bXB0YWJsZV9pbml0ICgpOwoKCS8qIEluaXRpYWxpemUgdGhlIGNvbnNvbGUgKGFmdGVyIHRoZSByZWxvY2F0aW9uIGFuZCBkZXZpY2VzIGluaXQpICovCgljb25zb2xlX2luaXRfcigpOwoKI2lmZGVmIENPTkZJR19NSVNDX0lOSVRfUgoJLyogbWlzY2VsbGFuZW91cyBwbGF0Zm9ybSBkZXBlbmRlbnQgaW5pdGlhbGlzYXRpb25zICovCgltaXNjX2luaXRfcigpOwojZW5kaWYKCiNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpICYmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCglXQVRDSERPR19SRVNFVCgpOwoJcHV0cyAoIlBDTUNJQToiKTsKCXBjbWNpYV9pbml0KCk7CiNlbmRpZgoKI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCglXQVRDSERPR19SRVNFVCgpOwoJcHV0cygiS0dEQjogICIpOwoJa2dkYl9pbml0KCk7CiNlbmRpZgoKCS8qIGVuYWJsZSBleGNlcHRpb25zICovCgllbmFibGVfaW50ZXJydXB0cygpOwoJc2hvd19ib290X3Byb2dyZXNzKDB4MjgpOwoKCS8qIE11c3QgaGFwcGVuIGFmdGVyIGludGVycnVwdHMgYXJlIGluaXRpYWxpemVkIHNpbmNlCgkgKiBhbiBpcnEgaGFuZGxlciBnZXRzIGluc3RhbGxlZAoJICovCiNpZmRlZiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KCXNlcmlhbF9idWZmZXJlZF9pbml0KCk7CiNlbmRpZgoKI2lmZGVmIENPTkZJR19TVEFUVVNfTEVECglzdGF0dXNfbGVkX3NldCAoU1RBVFVTX0xFRF9CT09ULCBTVEFUVVNfTEVEX0JMSU5LSU5HKTsKI2VuZGlmCgoJdWRlbGF5KDIwKTsKCglzZXRfdGltZXIgKDApOwoKCS8qIEluaXRpYWxpemUgZnJvbSBlbnZpcm9ubWVudCAqLwoJaWYgKChzID0gZ2V0ZW52ICgibG9hZGFkZHIiKSkgIT0gTlVMTCkgewoJCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxNik7Cgl9CiNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCglpZiAoKHMgPSBnZXRlbnYgKCJib290ZmlsZSIpKSAhPSBOVUxMKSB7CgkJY29weV9maWxlbmFtZSAoQm9vdEZpbGUsIHMsIHNpemVvZiAoQm9vdEZpbGUpKTsKCX0KI2VuZGlmIC8qIENGR19DTURfTkVUICovCgoJV0FUQ0hET0dfUkVTRVQoKTsKCiNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCglXQVRDSERPR19SRVNFVCgpOwoJcHV0cygiSURFOiAgICIpOwoJaWRlX2luaXQoKTsKI2VuZGlmIC8qIENGR19DTURfSURFICovCgojaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkKCVdBVENIRE9HX1JFU0VUKCk7CglwdXRzKCJTQ1NJOiAgIik7CglzY3NpX2luaXQoKTsKI2VuZGlmCgojaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQoJV0FUQ0hET0dfUkVTRVQoKTsKCXB1dHMoIkRPQzogICAiKTsKCWRvY19pbml0KCk7CiNlbmRpZgoKI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKI2lmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKCVdBVENIRE9HX1JFU0VUKCk7CglwdXRzKCJOZXQ6ICAgIik7CiNlbmRpZgoJZXRoX2luaXRpYWxpemUoZ2QtPmJkKTsKI2VuZGlmCgojaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiAoMCkKCVdBVENIRE9HX1JFU0VUKCk7CiMgaWZkZWYgREVCVUcKCXB1dHMgKCJSZXNldCBFdGhlcm5ldCBQSFlcbiIpOwojIGVuZGlmCglyZXNldF9waHkoKTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAoJV0FUQ0hET0dfUkVTRVQoKTsKCS8qCgkgKiBTb21lIHBhcnRzIGNhbiBiZSBvbmx5IGluaXRpYWxpemVkIGlmIGFsbCBvdGhlcnMgKGxpa2UKCSAqIEludGVycnVwdHMpIGFyZSB1cCBhbmQgcnVubmluZyAoaS5lLiB0aGUgUEMtc3R5bGUgSVNBCgkgKiBrZXlib2FyZCkuCgkgKi8KCWxhc3Rfc3RhZ2VfaW5pdCgpOwojZW5kaWYKCgojaWZkZWYgQ09ORklHX1BPU1QKCXBvc3RfcnVuIChOVUxMLCBQT1NUX1JBTSB8IHBvc3RfYm9vdG1vZGVfZ2V0KDApKTsKI2VuZGlmCgoKCXNob3dfYm9vdF9wcm9ncmVzcygweDI5KTsKCgkvKiBtYWluX2xvb3AoKSBjYW4gcmV0dXJuIHRvIHJldHJ5IGF1dG9ib290LCBpZiBzbyBqdXN0IHJ1biBpdCBhZ2Fpbi4gKi8KCWZvciAoOzspIHsKCQltYWluX2xvb3AoKTsKCX0KCgkvKiBOT1RSRUFDSEVEIC0gbm8gd2F5IG91dCBvZiBjb21tYW5kIGxvb3AgZXhjZXB0IGJvb3RpbmcgKi8KfQoKdm9pZCBoYW5nICh2b2lkKQp7CglwdXRzICgiIyMjIEVSUk9SICMjIyBQbGVhc2UgUkVTRVQgdGhlIGJvYXJkICMjI1xuIik7Cglmb3IgKDs7KTsKfQo=