LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiAoQykgQ29weXJpZ2h0IDIwMDIKICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgogKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8d2F0Y2hkb2cuaD4KI2luY2x1ZGUgPGNvbW1hbmQuaD4KI2luY2x1ZGUgPGRldmljZXMuaD4KI2luY2x1ZGUgPHZlcnNpb24uaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgojaW5jbHVkZSA8bmV0Lmg+CiNpbmNsdWRlIDxpZGUuaD4KI2luY2x1ZGUgPGFzbS91LWJvb3QtaTM4Ni5oPgoKZXh0ZXJuIGxvbmcgX2kzODZib290X3N0YXJ0OwpleHRlcm4gbG9uZyBfaTM4NmJvb3RfZW5kOwpleHRlcm4gbG9uZyBfaTM4NmJvb3Rfcm9tZGF0YV9zdGFydDsKZXh0ZXJuIGxvbmcgX2kzODZib290X3JvbWRhdGFfZGVzdDsKZXh0ZXJuIGxvbmcgX2kzODZib290X3JvbWRhdGFfc2l6ZTsKZXh0ZXJuIGxvbmcgX2kzODZib290X2Jzc19zdGFydDsKZXh0ZXJuIGxvbmcgX2kzODZib290X2Jzc19zaXplOwoKZXh0ZXJuIGxvbmcgX2kzODZib290X3JlYWxtb2RlOwpleHRlcm4gbG9uZyBfaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZTsKZXh0ZXJuIGxvbmcgX2kzODZib290X2Jpb3M7CmV4dGVybiBsb25nIF9pMzg2Ym9vdF9iaW9zX3NpemU7CgovKiBUaGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0IGJlY29tZXMgcG9pbnRlcnMKICogd2hpY2ggaXMgc29tZXdoYXQgaW5jb252ZWllbnQgLi4uICovCnVsb25nIGkzODZib290X3N0YXJ0ICAgICAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9zdGFydDsgICAgICAgICAvKiBjb2RlIHN0YXJ0IChpbiBmbGFzaCkgZGVmaW5lZCBpbiBzdGFydC5TICovCnVsb25nIGkzODZib290X2VuZCAgICAgICAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9lbmQ7CSAgICAgICAgLyogY29kZSBlbmQgKGluIGZsYXNoKSAqLwp1bG9uZyBpMzg2Ym9vdF9yb21kYXRhX3N0YXJ0ID0gKHVsb25nKSZfaTM4NmJvb3Rfcm9tZGF0YV9zdGFydDsgLyogZGF0YXNlZ21lbnQgaW4gZmxhc2ggKGFsc28gY29kZStyb2RhdGEgZW5kKSAqLwp1bG9uZyBpMzg2Ym9vdF9yb21kYXRhX2Rlc3QgID0gKHVsb25nKSZfaTM4NmJvb3Rfcm9tZGF0YV9kZXN0OyAgLyogZGF0YSBsb2NhdGlvbiBzZWdtZW50IGluIHJhbSAqLwp1bG9uZyBpMzg2Ym9vdF9yb21kYXRhX3NpemUgID0gKHVsb25nKSZfaTM4NmJvb3Rfcm9tZGF0YV9zaXplOyAgLyogc2l6ZSBvZiBkYXRhIHNlZ21lbnQgKi8KdWxvbmcgaTM4NmJvb3RfYnNzX3N0YXJ0ICAgICA9ICh1bG9uZykmX2kzODZib290X2Jzc19zdGFydDsgICAgIC8qIGJzcyBzdGFydCAqLwp1bG9uZyBpMzg2Ym9vdF9ic3Nfc2l6ZSAgICAgID0gKHVsb25nKSZfaTM4NmJvb3RfYnNzX3NpemU7ICAgICAgLyogYnNzIHNpemUgKi8KCnVsb25nIGkzODZib290X3JlYWxtb2RlICAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9yZWFsbW9kZTsgICAgICAvKiBzdGFydCBvZiByZWFsbW9kZSBlbnRyeSBjb2RlICovCnVsb25nIGkzODZib290X3JlYWxtb2RlX3NpemUgPSAodWxvbmcpJl9pMzg2Ym9vdF9yZWFsbW9kZV9zaXplOyAvKiBzaXplIG9mIHJlYWxtb2RlIGVudHJ5IGNvZGUgKi8KdWxvbmcgaTM4NmJvb3RfYmlvcyAgICAgICAgICA9ICh1bG9uZykmX2kzODZib290X2Jpb3M7ICAgICAgICAgIC8qIHN0YXJ0IG9mIEJJT1MgZW11bGF0aW9uIGNvZGUgKi8KdWxvbmcgaTM4NmJvb3RfYmlvc19zaXplICAgICA9ICh1bG9uZykmX2kzODZib290X2Jpb3Nfc2l6ZTsgICAgIC8qIHNpemUgb2YgQklPUyBlbXVsYXRpb24gY29kZSAqLwoKCmNvbnN0IGNoYXIgdmVyc2lvbl9zdHJpbmdbXSA9CglVX0JPT1RfVkVSU0lPTiIgKCIgX19EQVRFX18gIiAtICIgX19USU1FX18gIikiOwoKCi8qCiAqIEJlZ2luIGFuZCBFbmQgb2YgbWVtb3J5IGFyZWEgZm9yIG1hbGxvYygpLCBhbmQgY3VycmVudCAiYnJrIgogKi8Kc3RhdGljIHVsb25nIG1lbV9tYWxsb2Nfc3RhcnQgPSAwOwpzdGF0aWMgdWxvbmcgbWVtX21hbGxvY19lbmQgPSAwOwpzdGF0aWMgdWxvbmcgbWVtX21hbGxvY19icmsgPSAwOwoKc3RhdGljIGludCBtZW1fbWFsbG9jX2luaXQodm9pZCkKewoJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgoJLyogc3RhcnQgbWFsbG9jIGFyZWEgcmlnaHQgYWZ0ZXIgdGhlIHN0YWNrICovCgltZW1fbWFsbG9jX3N0YXJ0ID0gaTM4NmJvb3RfYnNzX3N0YXJ0ICsKCQlpMzg2Ym9vdF9ic3Nfc2l6ZSArIENGR19TVEFDS19TSVpFOwoJbWVtX21hbGxvY19zdGFydCA9IChtZW1fbWFsbG9jX3N0YXJ0KzMpJn4zOwoKCS8qIFVzZSBhbGwgYXZhaWxhYmxlIFJBTSBmb3IgbWFsbG9jKCkgKi8KCW1lbV9tYWxsb2NfZW5kID0gZ2QtPnJhbV9zaXplOwoKCW1lbV9tYWxsb2NfYnJrID0gbWVtX21hbGxvY19zdGFydDsKCglyZXR1cm4gMDsKfQoKdm9pZCAqc2JyayAocHRyZGlmZl90IGluY3JlbWVudCkKewoJdWxvbmcgb2xkID0gbWVtX21hbGxvY19icms7Cgl1bG9uZyBuZXcgPSBvbGQgKyBpbmNyZW1lbnQ7CgoJaWYgKChuZXcgPCBtZW1fbWFsbG9jX3N0YXJ0KSB8fCAobmV3ID4gbWVtX21hbGxvY19lbmQpKSB7CgkJcmV0dXJuIChOVUxMKTsKCX0KCW1lbV9tYWxsb2NfYnJrID0gbmV3OwoKCXJldHVybiAoKHZvaWQgKikgb2xkKTsKfQoKY2hhciAqc3RybWh6IChjaGFyICpidWYsIGxvbmcgaHopCnsKCWxvbmcgbCwgbjsKCWxvbmcgbTsKCgluID0gaHogLyAxMDAwMDAwTDsKCWwgPSBzcHJpbnRmIChidWYsICIlbGQiLCBuKTsKCW0gPSAoaHogJSAxMDAwMDAwTCkgLyAxMDAwTDsKCWlmIChtICE9IDApCgkJc3ByaW50ZiAoYnVmICsgbCwgIi4lMDNsZCIsIG0pOwoJcmV0dXJuIChidWYpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEluaXQgVXRpbGl0aWVzCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTb21lIG9mIHRoaXMgY29kZSBzaG91bGQgYmUgbW92ZWQgaW50byB0aGUgY29yZSBmdW5jdGlvbnMsCiAqIG9yIGRyb3BwZWQgY29tcGxldGVseSwKICogYnV0IGxldCdzIGdldCBpdCB3b3JraW5nIChhZ2FpbikgZmlyc3QuLi4KICovCnN0YXRpYyBpbnQgaW5pdF9iYXVkcmF0ZSAodm9pZCkKewoJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgoJY2hhciB0bXBbNjRdOwkvKiBsb25nIGVub3VnaCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCglpbnQgaSA9IGdldGVudl9yKCJiYXVkcmF0ZSIsIHRtcCwgNjQpOwoKCWdkLT5iYXVkcmF0ZSA9IChpICE9IDApCgkJCT8gKGludCkgc2ltcGxlX3N0cnRvdWwgKHRtcCwgTlVMTCwgMTApCgkJCTogQ09ORklHX0JBVURSQVRFOwoKCXJldHVybiAoMCk7Cn0KCnN0YXRpYyBpbnQgZGlzcGxheV9iYW5uZXIgKHZvaWQpCnsKCglwcmludGYgKCJcblxuJXNcblxuIiwgdmVyc2lvbl9zdHJpbmcpOwoJcHJpbnRmICgiVS1Cb290IGNvZGU6ICUwOGxYIC0+ICUwOGxYICBkYXRhOiAlMDhsWCAtPiAlMDhsWFxuIgoJCSIgICAgICAgIEJTUzogJTA4bFggLT4gJTA4bFggc3RhY2s6ICUwOGxYIC0+ICUwOGxYXG4iLAoJCWkzODZib290X3N0YXJ0LCBpMzg2Ym9vdF9yb21kYXRhX3N0YXJ0LTEsCgkJaTM4NmJvb3Rfcm9tZGF0YV9kZXN0LCBpMzg2Ym9vdF9yb21kYXRhX2Rlc3QraTM4NmJvb3Rfcm9tZGF0YV9zaXplLTEsCgkJaTM4NmJvb3RfYnNzX3N0YXJ0LCBpMzg2Ym9vdF9ic3Nfc3RhcnQraTM4NmJvb3RfYnNzX3NpemUtMSwKCQlpMzg2Ym9vdF9ic3Nfc3RhcnQraTM4NmJvb3RfYnNzX3NpemUsCgkJaTM4NmJvb3RfYnNzX3N0YXJ0K2kzODZib290X2Jzc19zaXplK0NGR19TVEFDS19TSVpFLTEpOwoKCglyZXR1cm4gKDApOwp9CgovKgogKiBXQVJOSU5HOiB0aGlzIGNvZGUgbG9va3MgImNsZWFuZXIiIHRoYW4gdGhlIFBvd2VyUEMgdmVyc2lvbiwgYnV0CiAqIGhhcyB0aGUgZGlzYWR2YW50YWdlIHRoYXQgeW91IGVpdGhlciBnZXQgbm90aGluZywgb3IgZXZlcnl0aGluZy4KICogT24gUG93ZXJQQywgeW91IG1pZ2h0IHNlZSAiRFJBTTogIiBiZWZvcmUgdGhlIHN5c3RlbSBoYW5ncyAtIHdoaWNoCiAqIGdpdmVzIGEgc2ltcGxlIHlldCBjbGVhciBpbmRpY2F0aW9uIHdoaWNoIHBhcnQgb2YgdGhlCiAqIGluaXRpYWxpemF0aW9uIGlmIGZhaWxpbmcuCiAqLwpzdGF0aWMgaW50IGRpc3BsYXlfZHJhbV9jb25maWcgKHZvaWQpCnsKCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoJaW50IGk7CgoJcHV0cyAoIkRSQU0gQ29uZmlndXJhdGlvbjpcbiIpOwoKCWZvciAoaT0wOyBpPENPTkZJR19OUl9EUkFNX0JBTktTOyBpKyspIHsKCQlwcmludGYgKCJCYW5rICMlZDogJTA4bHggIiwgaSwgZ2QtPmJkLT5iaV9kcmFtW2ldLnN0YXJ0KTsKCQlwcmludF9zaXplIChnZC0+YmQtPmJpX2RyYW1baV0uc2l6ZSwgIlxuIik7Cgl9CgoJcmV0dXJuICgwKTsKfQoKc3RhdGljIHZvaWQgZGlzcGxheV9mbGFzaF9jb25maWcgKHVsb25nIHNpemUpCnsKCXB1dHMgKCJGbGFzaDogIik7CglwcmludF9zaXplIChzaXplLCAiXG4iKTsKfQoKCi8qCiAqIEJyZWF0aCBzb21lIGxpZmUgaW50byB0aGUgYm9hcmQuLi4KICoKICogSW5pdGlhbGl6ZSBhbiBTTUMgZm9yIHNlcmlhbCBjb21tcywgYW5kIGNhcnJ5IG91dCBzb21lIGhhcmR3YXJlCiAqIHRlc3RzLgogKgogKiBUaGUgZmlyc3QgcGFydCBvZiBpbml0aWFsaXphdGlvbiBpcyBydW5uaW5nIGZyb20gRmxhc2ggbWVtb3J5OwogKiBpdHMgbWFpbiBwdXJwb3NlIGlzIHRvIGluaXRpYWxpemUgdGhlIFJBTSBzbyB0aGF0IHdlCiAqIGNhbiByZWxvY2F0ZSB0aGUgbW9uaXRvciBjb2RlIHRvIFJBTS4KICovCgovKgogKiBBbGwgYXR0ZW1wdHMgdG8gY29tZSB1cCB3aXRoIGEgImNvbW1vbiIgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UKICogdGhhdCB3b3JrcyBmb3IgYWxsIGJvYXJkcyBhbmQgYXJjaGl0ZWN0dXJlcyBmYWlsZWQ6IHNvbWUgb2YgdGhlCiAqIHJlcXVpcmVtZW50cyBhcmUganVzdCBfdG9vXyBkaWZmZXJlbnQuIFRvIGdldCByaWQgb2YgdGhlIHJlc3VsdGluZwogKiBtZXNzIG9mIGJvYXJkIGRlcGVuZGVuZCAjaWZkZWYnZWQgY29kZSB3ZSBub3cgbWFrZSB0aGUgd2hvbGUKICogaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgY29uZmlndXJhYmxlIHRvIHRoZSB1c2VyLgogKgogKiBUaGUgcmVxdWlyZW1lbnRzIGZvciBhbnkgbmV3IGluaXRhbGl6YXRpb24gZnVuY3Rpb24gaXMgc2ltcGxlOiBpdAogKiByZWNlaXZlcyBhIHBvaW50ZXIgdG8gdGhlICJnbG9iYWwgZGF0YSIgc3RydWN0dXJlIGFzIGl0J3Mgb25seQogKiBhcmd1bWVudCwgYW5kIHJldHVybnMgYW4gaW50ZWdlciByZXR1cm4gY29kZSwgd2hlcmUgMCBtZWFucwogKiAiY29udGludWUiIGFuZCAhPSAwIG1lYW5zICJmYXRhbCBlcnJvciwgaGFuZyB0aGUgc3lzdGVtIi4KICovCnR5cGVkZWYgaW50IChpbml0X2ZuY190KSAodm9pZCk7Cgppbml0X2ZuY190ICppbml0X3NlcXVlbmNlW10gPSB7CgljcHVfaW5pdCwJCS8qIGJhc2ljIGNwdSBkZXBlbmRlbnQgc2V0dXAgKi8KCWJvYXJkX2luaXQsCQkvKiBiYXNpYyBib2FyZCBkZXBlbmRlbnQgc2V0dXAgKi8KCWRyYW1faW5pdCwJCS8qIGNvbmZpZ3VyZSBhdmFpbGFibGUgUkFNIGJhbmtzICovCgltZW1fbWFsbG9jX2luaXQsICAgICAgICAvKiBkZXBlbmRhbnQgb24gZHJhbV9pbml0ICovCglpbnRlcnJ1cHRfaW5pdCwJCS8qIHNldCB1cCBleGNlcHRpb25zICovCgl0aW1lcl9pbml0LAoJc2VyaWFsX2luaXQsCgllbnZfaW5pdCwJCS8qIGluaXRpYWxpemUgZW52aXJvbm1lbnQgKi8KCWluaXRfYmF1ZHJhdGUsCQkvKiBpbml0aWFsemUgYmF1ZHJhdGUgc2V0dGluZ3MgKi8KCXNlcmlhbF9pbml0LAkJLyogc2VyaWFsIGNvbW11bmljYXRpb25zIHNldHVwICovCglkaXNwbGF5X2Jhbm5lciwKCWRpc3BsYXlfZHJhbV9jb25maWcsCgoJTlVMTCwKfTsKCmdkX3QgKmdsb2JhbF9kYXRhOwoKdm9pZCBzdGFydF9pMzg2Ym9vdCAodm9pZCkKewoJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgljaGFyICpzOwoJaW50IGk7Cgl1bG9uZyBzaXplOwoJc3RhdGljIGdkX3QgZ2RfZGF0YTsKCXN0YXRpYyBiZF90IGJkX2RhdGE7Cglpbml0X2ZuY190ICoqaW5pdF9mbmNfcHRyOwoKCXNob3dfYm9vdF9wcm9ncmVzcygweDIxKTsKCglnZCA9IGdsb2JhbF9kYXRhID0gJmdkX2RhdGE7CgoJbWVtc2V0IChnZCwgMCwgc2l6ZW9mIChnZF90KSk7CglnZC0+YmQgPSAmYmRfZGF0YTsKCW1lbXNldCAoZ2QtPmJkLCAwLCBzaXplb2YgKGJkX3QpKTsKCXNob3dfYm9vdF9wcm9ncmVzcygweDIyKTsKCglnZC0+YmF1ZHJhdGUgPSAgQ09ORklHX0JBVURSQVRFOwoKCWZvciAoaW5pdF9mbmNfcHRyID0gaW5pdF9zZXF1ZW5jZSwgaT0wOyAqaW5pdF9mbmNfcHRyOyArK2luaXRfZm5jX3B0ciwgaSsrKSB7CgkJc2hvd19ib290X3Byb2dyZXNzKDB4YTEzMHxpKTsKCgkJaWYgKCgqaW5pdF9mbmNfcHRyKSgpICE9IDApIHsKCQkJaGFuZyAoKTsKCQl9Cgl9CglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyMyk7CgoJLyogY29uZmlndXJlIGF2YWlsYWJsZSBGTEFTSCBiYW5rcyAqLwoJc2l6ZSA9IGZsYXNoX2luaXQoKTsKCWRpc3BsYXlfZmxhc2hfY29uZmlnKHNpemUpOwoJc2hvd19ib290X3Byb2dyZXNzKDB4MjQpOwoKCXNob3dfYm9vdF9wcm9ncmVzcygweDI1KTsKCgkvKiBpbml0aWFsaXplIGVudmlyb25tZW50ICovCgllbnZfcmVsb2NhdGUgKCk7CglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyNik7CgoKCS8qIElQIEFkZHJlc3MgKi8KCWJkX2RhdGEuYmlfaXBfYWRkciA9IGdldGVudl9JUGFkZHIgKCJpcGFkZHIiKTsKCgkvKiBNQUMgQWRkcmVzcyAqLwoJewoJCWludCBpOwoJCXVsb25nIHJlZzsKCQljaGFyICpzLCAqZTsKCQl1Y2hhciB0bXBbNjRdOwoKCQlpID0gZ2V0ZW52X3IgKCJldGhhZGRyIiwgdG1wLCBzaXplb2YgKHRtcCkpOwoJCXMgPSAoaSA+IDApID8gdG1wIDogTlVMTDsKCgkJZm9yIChyZWcgPSAwOyByZWcgPCA2OyArK3JlZykgewoJCQliZF9kYXRhLmJpX2VuZXRhZGRyW3JlZ10gPSBzID8gc2ltcGxlX3N0cnRvdWwgKHMsICZlLCAxNikgOiAwOwoJCQlpZiAocykKCQkJCXMgPSAoKmUpID8gZSArIDEgOiBlOwoJCX0KCX0KCiNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCgkvKgoJICogRG8gcGNpIGNvbmZpZ3VyYXRpb24KCSAqLwoJcGNpX2luaXQoKTsKI2VuZGlmCgoJc2hvd19ib290X3Byb2dyZXNzKDB4MjcpOwoKCglkZXZpY2VzX2luaXQgKCk7CgoJanVtcHRhYmxlX2luaXQgKCk7CgoJLyogSW5pdGlhbGl6ZSB0aGUgY29uc29sZSAoYWZ0ZXIgdGhlIHJlbG9jYXRpb24gYW5kIGRldmljZXMgaW5pdCkgKi8KCWNvbnNvbGVfaW5pdF9yKCk7CgojaWZkZWYgQ09ORklHX01JU0NfSU5JVF9SCgkvKiBtaXNjZWxsYW5lb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBpbml0aWFsaXNhdGlvbnMgKi8KCW1pc2NfaW5pdF9yKCk7CiNlbmRpZgoKCiNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmICgwKQoJV0FUQ0hET0dfUkVTRVQoKTsKIyBpZmRlZiBERUJVRwoJcHV0cyAoIlJlc2V0IEV0aGVybmV0IFBIWVxuIik7CiMgZW5kaWYKCXJlc2V0X3BoeSgpOwojZW5kaWYKCiNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpICYmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCglXQVRDSERPR19SRVNFVCgpOwoJcHV0cyAoIlBDTUNJQToiKTsKCXBjbWNpYV9pbml0KCk7CiNlbmRpZgoKI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCglXQVRDSERPR19SRVNFVCgpOwoJcHV0cygiS0dEQjogICIpOwoJa2dkYl9pbml0KCk7CiNlbmRpZgoKCS8qIGVuYWJsZSBleGNlcHRpb25zICovCgllbmFibGVfaW50ZXJydXB0cygpOwoJc2hvd19ib290X3Byb2dyZXNzKDB4MjgpOwoKCS8qIE11c3QgaGFwcGVuIGFmdGVyIGludGVycnVwdHMgYXJlIGluaXRpYWxpemVkIHNpbmNlCgkgKiBhbiBpcnEgaGFuZGxlciBnZXRzIGluc3RhbGxlZAoJICovCiNpZmRlZiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KCXNlcmlhbF9idWZmZXJlZF9pbml0KCk7CiNlbmRpZgoKI2lmZGVmIENPTkZJR19TVEFUVVNfTEVECglzdGF0dXNfbGVkX3NldCAoU1RBVFVTX0xFRF9CT09ULCBTVEFUVVNfTEVEX0JMSU5LSU5HKTsKI2VuZGlmCgoJdWRlbGF5KDIwKTsKCglzZXRfdGltZXIgKDApOwoKCS8qIEluaXRpYWxpemUgZnJvbSBlbnZpcm9ubWVudCAqLwoJaWYgKChzID0gZ2V0ZW52ICgibG9hZGFkZHIiKSkgIT0gTlVMTCkgewoJCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxNik7Cgl9CiNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCglpZiAoKHMgPSBnZXRlbnYgKCJib290ZmlsZSIpKSAhPSBOVUxMKSB7CgkJY29weV9maWxlbmFtZSAoQm9vdEZpbGUsIHMsIHNpemVvZiAoQm9vdEZpbGUpKTsKCX0KI2VuZGlmIC8qIENGR19DTURfTkVUICovCgoJV0FUQ0hET0dfUkVTRVQoKTsKCiNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCglXQVRDSERPR19SRVNFVCgpOwoJcHV0cygiSURFOiAgICIpOwoJaWRlX2luaXQoKTsKI2VuZGlmIC8qIENGR19DTURfSURFICovCgojaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkKCVdBVENIRE9HX1JFU0VUKCk7CglwdXRzKCJTQ1NJOiAgIik7CglzY3NpX2luaXQoKTsKI2VuZGlmCgojaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQoJV0FUQ0hET0dfUkVTRVQoKTsKCXB1dHMoIkRPQzogICAiKTsKCWRvY19pbml0KCk7CiNlbmRpZgoKI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQoJV0FUQ0hET0dfUkVTRVQoKTsKCXB1dHMoIk5ldDogICAiKTsKCWV0aF9pbml0aWFsaXplKGdkLT5iZCk7CiNlbmRpZgoKI2lmZGVmIENPTkZJR19MQVNUX1NUQUdFX0lOSVQKCVdBVENIRE9HX1JFU0VUKCk7CgkvKgoJICogU29tZSBwYXJ0cyBjYW4gYmUgb25seSBpbml0aWFsaXplZCBpZiBhbGwgb3RoZXJzIChsaWtlCgkgKiBJbnRlcnJ1cHRzKSBhcmUgdXAgYW5kIHJ1bm5pbmcgKGkuZS4gdGhlIFBDLXN0eWxlIElTQQoJICoga2V5Ym9hcmQpLgoJICovCglsYXN0X3N0YWdlX2luaXQoKTsKI2VuZGlmCgoKI2lmZGVmIENPTkZJR19QT1NUCglwb3N0X3J1biAoTlVMTCwgUE9TVF9SQU0gfCBwb3N0X2Jvb3Rtb2RlX2dldCgwKSk7CiNlbmRpZgoKCglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyOSk7CgoJLyogbWFpbl9sb29wKCkgY2FuIHJldHVybiB0byByZXRyeSBhdXRvYm9vdCwgaWYgc28ganVzdCBydW4gaXQgYWdhaW4uICovCglmb3IgKDs7KSB7CgkJbWFpbl9sb29wKCk7Cgl9CgoJLyogTk9UUkVBQ0hFRCAtIG5vIHdheSBvdXQgb2YgY29tbWFuZCBsb29wIGV4Y2VwdCBib290aW5nICovCn0KCnZvaWQgaGFuZyAodm9pZCkKewoJcHV0cyAoIiMjIyBFUlJPUiAjIyMgUGxlYXNlIFJFU0VUIHRoZSBib2FyZCAjIyNcbiIpOwoJZm9yICg7Oyk7Cn0K