LyoKICogKEMpIENvcHlyaWdodCAyMDAwCiAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqCiAqIEhhY2tlZCBmb3IgdGhlIEh5bW9kIGJvYXJkIGJ5IE11cnJheS5KZW5zZW5AY3Npcm8uYXUsIDIwLU9jdC0wMAogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPG1wYzgyNjAuaD4KI2luY2x1ZGUgPG1wYzgyNjBfaXJxLmg+CiNpbmNsdWRlIDxpb3BvcnRzLmg+CiNpbmNsdWRlIDxpMmMuaD4KI2luY2x1ZGUgPGFzbS9pb3Bpbl84MjYwLmg+CgpERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIGltcG9ydHMgZnJvbSBlZXByb20uYyAqLwpleHRlcm4gaW50IGh5bW9kX2VlcHJvbV9yZWFkIChpbnQsIGh5bW9kX2VlcHJvbV90ICopOwpleHRlcm4gdm9pZCBoeW1vZF9lZXByb21fcHJpbnQgKGh5bW9kX2VlcHJvbV90ICopOwoKLyogaW1wb3J0cyBmcm9tIGVudi5jICovCmV4dGVybiB2b2lkIGh5bW9kX2NoZWNrX2VudiAodm9pZCk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBJL08gUG9ydCBjb25maWd1cmF0aW9uIHRhYmxlCiAqCiAqIGlmIGNvbmYgaXMgMSwgdGhlbiB0aGF0IHBvcnQgcGluIHdpbGwgYmUgY29uZmlndXJlZCBhdCBib290IHRpbWUKICogYWNjb3JkaW5nIHRvIHRoZSBmaXZlIHZhbHVlcyBwb2RyL3BkaXIvcHBhci9wc29yL3BkYXQgZm9yIHRoYXQgZW50cnkKICovCgpjb25zdCBpb3BfY29uZl90IGlvcF9jb25mX3RhYls0XVszMl0gPSB7CgoJLyogUG9ydCBBIGNvbmZpZ3VyYXRpb24gKi8KCXsKCQkvKiBjbmYgcGFyIHNvciBkaXIgb2RyIGRhdCAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQQTMxOiBGQ0MxIE1JSSBDT0wgKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDAsICAwICAgfSwJLyogUEEzMDogRkNDMSBNSUkgQ1JTICovCgkJeyAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjk6IEZDQzEgTUlJIFRYX0VSICovCgkJeyAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjg6IEZDQzEgTUlJIFRYX0VOICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMjc6IEZDQzEgTUlJIFJYX0RWICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMjY6IEZDQzEgTUlJIFJYX0VSICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjU6IEZDQzIgTUlJIE1ESU8gKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEyNDogRkNDMiBNSUkgTURDICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjM6IEZDQzMgTUlJIE1ESU8gKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEyMjogRkNDMyBNSUkgTURDICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjE6IEZDQzEgTUlJIFR4RFszXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQTIwOiBGQ0MxIE1JSSBUeERbMl0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEExOTogRkNDMSBNSUkgVHhEWzFdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMTg6IEZDQzEgTUlJIFR4RFswXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQTE3OiBGQ0MxIE1JSSBSeERbM10gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEExNjogRkNDMSBNSUkgUnhEWzJdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMTU6IEZDQzEgTUlJIFJ4RFsxXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQTE0OiBGQ0MxIE1JSSBSeERbMF0gKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEExMzogRkNDMSBNSUkgTURJTyAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQTEyOiBGQ0MxIE1JSSBNREMgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEExMTogU0VMX0NEICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMTA6IEZMQVNIIFNUUzEgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEEwOTogRkxBU0ggU1RTMCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQTA4OiBGTEFTSCB+UEUgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEEwNzogV0FUQ0ggfkhSRVNFVCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMSwgIDAgICB9LAkvKiBQQTA2OiBWQyBET05FICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAxLCAgMCAgIH0sCS8qIFBBMDU6IFZDIElOSVQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEwNDogVkMgflBST0cgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEwMzogVk0gRU5BQkxFICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAxLCAgMCAgIH0sCS8qIFBBMDI6IFZNIERPTkUgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDEsICAwICAgfSwJLyogUEEwMTogVk0gSU5JVCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9CS8qIFBBMDA6IFZNIH5QUk9HICovCgl9LAoKCS8qIFBvcnQgQiBjb25maWd1cmF0aW9uICovCgl7CgkJLyogY25mIHBhciBzb3IgZGlyIG9kciBkYXQgKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIzMTogRkNDMiBNSUkgVFhfRVIgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIzMDogRkNDMiBNSUkgUlhfRFYgKi8KCQl7ICAgMSwgIDEsICAxLCAgMSwgIDAsICAwICAgfSwJLyogUEIyOTogRkNDMiBNSUkgVFhfRU4gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIyODogRkNDMiBNSUkgUlhfRVIgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIyNzogRkNDMiBNSUkgQ09MICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMjY6IEZDQzIgTUlJIENSUyAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjI1OiBGQ0MyIE1JSSBUeERbM10gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIyNDogRkNDMiBNSUkgVHhEWzJdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMjM6IEZDQzIgTUlJIFR4RFsxXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjIyOiBGQ0MyIE1JSSBUeERbMF0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIyMTogRkNDMiBNSUkgUnhEWzBdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMjA6IEZDQzIgTUlJIFJ4RFsxXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjE5OiBGQ0MyIE1JSSBSeERbMl0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIxODogRkNDMiBNSUkgUnhEWzNdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTc6IEZDQzMgTUlJIFJYX0RWICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTY6IEZDQzMgTUlJIFJYX0VSICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMTU6IEZDQzMgTUlJIFRYX0VSICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMTQ6IEZDQzMgTUlJIFRYX0VOICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTM6IEZDQzMgTUlJIENPTCAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjEyOiBGQ0MzIE1JSSBDUlMgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIxMTogRkNDMyBNSUkgUnhEWzNdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTA6IEZDQzMgTUlJIFJ4RFsyXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjA5OiBGQ0MzIE1JSSBSeERbMV0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIwODogRkNDMyBNSUkgUnhEWzBdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMDc6IEZDQzMgTUlJIFR4RFszXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjA2OiBGQ0MzIE1JSSBUeERbMl0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIwNTogRkNDMyBNSUkgVHhEWzFdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMDQ6IEZDQzMgTUlJIFR4RFswXSAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjAzOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjAyOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjAxOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9CS8qIFBCMDA6IHBpbiBkb2Vzbid0IGV4aXN0ICovCgl9LAoKCS8qIFBvcnQgQyBjb25maWd1cmF0aW9uICovCgl7CgkJLyogY25mIHBhciBzb3IgZGlyIG9kciBkYXQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMzMTogTUVaIH5JQUNLICovCgkJeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMzA6ID8gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyOTogQ0xLIFNDQ3ggKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyODogQ0xLNCAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzI3OiBDTEsgU0NDRiAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzI2OiBDTEsgMzJLICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjU6IEJSRzQvQ0xLNyAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzI0OiA/ICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjM6IENMSyBTQ0N4ICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjI6IEZDQzEgTUlJIFJYX0NMSyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzIxOiBGQ0MxIE1JSSBUWF9DTEsgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyMDogQ0xLIFNDQ0YgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxOTogRkNDMiBNSUkgUlhfQ0xLICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMTg6IEZDQzIgTUlJIFRYX0NMSyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzE3OiBGQ0MzIE1JSSBSWF9DTEsgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxNjogRkNDMyBNSUkgVFhfQ0xLICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMTU6IFNDQzEgVUFSVCB+Q1RTICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMTQ6IFNDQzEgVUFSVCB+Q0QgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxMzogU0NDMiBVQVJUIH5DVFMgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxMjogU0NDMiBVQVJUIH5DRCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQzExOiBTQ0MxIFVBUlQgfkRUUiAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQzEwOiBTQ0MxIFVBUlQgfkRTUiAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQzA5OiBTQ0MyIFVBUlQgfkRUUiAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQzA4OiBTQ0MyIFVBUlQgfkRTUiAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzA3OiBURU1QIH5BTEVSVCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzA2OiBGQ0MzIElOVCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzA1OiBGQ0MyIElOVCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzA0OiBGQ0MxIElOVCAqLwoJCXsgICAwLCAgMSwgIDEsICAxLCAgMCwgIDAgICB9LAkvKiBQQzAzOiBTRE1BIElETUEyIH5EQUNLICovCgkJeyAgIDAsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMDI6IFNETUEgSURNQTIgfkRPTkUgKi8KCQl7ICAgMCwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMwMTogU0RNQSBJRE1BMiB+RFJFUSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9CS8qIFBDMDA6IEJSRzcgKi8KCX0sCgoJLyogUG9ydCBEIGNvbmZpZ3VyYXRpb24gKi8KCXsKCQkvKiBjbmYgcGFyIHNvciBkaXIgb2RyIGRhdCAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDMxOiBTQ0MxIFVBUlQgUnhEICovCgkJeyAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCAgIH0sCS8qIFBEMzA6IFNDQzEgVUFSVCBUeEQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEQyOTogU0NDMSBVQVJUIH5SVFMgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQyODogU0NDMiBVQVJUIFJ4RCAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQRDI3OiBTQ0MyIFVBUlQgVHhEICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBEMjY6IFNDQzIgVUFSVCB+UlRTICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMjU6IFNDQzEgVUFSVCB+UkkgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQyNDogU0NDMiBVQVJUIH5SSSAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQRDIzOiBDTEtHRU4gUEQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQyMjogVVNFUjMgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQyMTogVVNFUjIgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQyMDogVVNFUjEgKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDAsICAwICAgfSwJLyogUEQxOTogU1BJIH5TRUwgKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDAsICAwICAgfSwJLyogUEQxODogU1BJIENMSyAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQRDE3OiBTUEkgTU9TSSAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQRDE2OiBTUEkgTUlTTyAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMSwgIDAgICB9LAkvKiBQRDE1OiBJMkMgU0RBICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAxLCAgMCAgIH0sCS8qIFBEMTQ6IEkyQyBTQ0wgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQxMzogVEVNUCB+U1REQlkgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQxMjogRkNDMyB+UkVTRVQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQxMTogRkNDMiB+UkVTRVQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQxMDogRkNDMSB+UkVTRVQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQwOTogUEQ5ICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMDg6IFBEOCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEgICB9LAkvKiBQRDA3OiBQRDcgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQwNjogUEQ2ICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSAgIH0sCS8qIFBEMDU6IFBENSAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEgICB9LAkvKiBQRDA0OiBQRDQgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQwMzogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQwMjogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQwMTogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfQkvKiBQRDAwOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJfQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogQU1JIEZTNjM3NyBDbG9jayBHZW5lcmF0b3IgY29uZmlndXJhdGlvbiB0YWJsZQogKgogKiB0aGUgImZzNjM3N19yZWdzW10iIHRhYmxlIGVudHJpZXMgY29ycmVzcG9uZCB0byBGUzYzNzcgcmVnaXN0ZXJzCiAqIDAgLSAxNSAodG90YWwgb2YgMTYgYnl0ZXMpLgogKgogKiB0aGUgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBGUzYzNzcgdmlhIHRoZSBpMmMgYnVzIHVzaW5nIGFkZHJlc3MgaW4KICogImZzNjM3N19hZGRyIiAoYWRkcmVzcyBpcyA3IGJpdHMgLSBSL1cgYml0IG5vdCBpbmNsdWRlZCkuCiAqCiAqIFRoZSBmczYzNzcgaGFzIGZvdXIgY2xvY2sgb3V0cHV0czogQSwgQiwgQyBhbmQgRC4KICoKICogT3V0cHV0cyBDIGFuZCBEIGNhbiBlYWNoIHByb3ZpZGUgdHdvIGRpZmZlcmVudCBjbG9jayBvdXRwdXRzIEMxL0QxIG9yCiAqIEMyL0QyIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIFNFTF9DRCBpbnB1dCB3aGljaCBpcyBjb25uZWN0ZWQgdG8KICogdGhlIE1QQzgyNjAgSS9PIHBvcnQgcGluIFBBMTEuIFBBMTEgb3V0cHV0IChTRUxfQ0QgaW5wdXQpIGxvdyAob3IgMCkKICogc2VsZWN0cyBDMS9EMSBhbmQgUEExMSBvdXRwdXQgKFNFTF9DRCBpbnB1dCkgaGlnaCAob3IgMSkgc2VsZWN0cyBDMi9EMi4KICoKICogUEExMSBkZWZhdWx0cyB0byBvdXRwdXQgbG93IChvciAwKSBpbiB0aGUgaS9vIHBvcnQgY29uZmlnIHRhYmxlIGFib3ZlLgogKgogKiBPdXRwdXQgQSBwcm92aWRlcyBhIDEwME1IeiBmb3IgdGhlIEhpZ2ggU3BlZWQgU2VyaWFsIGNoaXBzLiBPdXRwdXQgQgogKiBwcm92aWRlcyBhIDMuNjg2NE1IeiBjbG9jayBmb3IgbW9yZSBhY2N1cmF0ZSBhc3luY2hyb25vdXMgc2VyaWFsIGJpdAogKiByYXRlcy4gT3V0cHV0IEMgaXMgcm91dGVkIHRvIHRoZSBtZXp6YW5pbmUgY29ubmVjdG9yIGJ1dCBpcyBjdXJyZW50bHkKICogdW51c2VkIC0gYm90aCBDMSBhbmQgQzIgYXJlIHNldCB0byAxNk1Iei4gT3V0cHV0IEQgaXMgdXNlZCBieSBib3RoIHRoZQogKiBhbHQtaW5wdXQgYW5kIGRpc3BsYXkgbWV6emFuaW5lIGJvYXJkcyBmb3IgdGhlaXIgdmlkZW8gY2hpcHMuIFRoZQogKiBhbHQtaW5wdXQgYm9hcmQgcmVxdWlyZXMgYSBjbG9jayBvZiAyNC41NzZNSHogYW5kIHRoaXMgaXMgYXZhaWxhYmxlIG9uCiAqIEQxIChQQTExPVNFTF9DRD0wKS4gVGhlIGRpc3BsYXkgYm9hcmQgcmVxdWlyZXMgYSBjbG9jayBvZiAyN01IeiBhbmQgdGhpcwogKiBpcyBhdmFpbGFibGUgb24gRDIgKFBBMTE9U0VMX0NEPTEpLgogKgogKiBTbyB0aGUgZGVmYXVsdCBpcyBhIGNsb2NrIHN1aXRhYmxlIGZvciB0aGUgYWx0LWlucHV0IGJvYXJkLiBQQTExIGlzIHRvZ2dsZWQKICogbGF0ZXIgaW4gbWlzY19pbml0X3IoKSwgaWYgYSBkaXNwbGF5IGJvYXJkIGlzIGRldGVjdGVkLgogKi8KCnVjaGFyIGZzNjM3N19hZGRyID0gMHg1YzsKCnVjaGFyIGZzNjM3N19yZWdzWzE2XSA9IHsKCSAxMiwgIDc1LCAgNjQsICAyNSwgMTQ0LCAxMjgsICAyNSwgMTkyLAoJICAwLCAgMTYsIDEzNSwgMTkyLCAyMjQsICA2NCwgIDY0LCAxOTIKfTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIHNwZWNpYWwgYm9hcmQgaW5pdGlhbGlzYXRpb24sIGFmdGVyIGNsb2NrcyBhbmQgdGltZWJhc2UgaGF2ZSBiZWVuCiAqIHNldCB1cCBidXQgYmVmb3JlIGVudmlyb25tZW50IGFuZCBzZXJpYWwgYXJlIGluaXRpYWxpc2VkLgogKgogKiBhZGRlZCBzbyB0aGF0IHZlcnkgZWFybHkgaW5pdGlhbGlzYXRpb25zIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBpMmMKICogZHJpdmVyICh3aGljaCByZXF1aXJlcyB0aGUgY2xvY2tzLCB0byBjYWxjdWxhdGUgdGhlIGRpdmlkZXJzLCBhbmQKICogdGhlIHRpbWViYXNlLCBmb3IgdWRlbGF5KCkpCiAqLwoKaW50CmJvYXJkX3Bvc3RjbGtfaW5pdCAodm9pZCkKewoJaTJjX2luaXQgKENGR19JMkNfU1BFRUQsIENGR19JMkNfU0xBVkUpOwoKCS8qCgkgKiBJbml0aWFsaXNlIHRoZSBGUzYzNzcgY2xvY2sgY2hpcAoJICoKCSAqIHRoZSBzZWNvbmRhcnkgYWRkcmVzcyBpcyB0aGUgcmVnaXN0ZXIgbnVtYmVyIGZyb20gd2hlcmUgdG8KCSAqIHN0YXJ0IHRoZSB3cml0ZSAtIEkgd2FudCB0byB3cml0ZSBhbGwgdGhlIHJlZ2lzdGVycwoJICoKCSAqIGRvbid0IGJvdGhlciBjaGVja2luZyByZXR1cm4gc3RhdHVzIC0gd2UgaGF2ZSBubyBjb25zb2xlIHlldAoJICogdG8gcHJpbnQgaXQgb24sIG5vciBhbnkgUkFNIHRvIHN0b3JlIGl0IGluIC0gaXQgd2lsbCBiZSBvYnZpb3VzCgkgKiBpZiB0aGlzIGRvZXNuJ3Qgd29yawoJICovCgkodm9pZCkgaTJjX3dyaXRlIChmczYzNzdfYWRkciwgMCwgMSwgZnM2Mzc3X3JlZ3MsCgkJCQkJc2l6ZW9mIChmczYzNzdfcmVncykpOwoKCXJldHVybiAoMCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIENoZWNrIEJvYXJkIElkZW50aXR5OiBIYXJkd2lyZWQgdG8gSFlNT0QKICovCgppbnQKY2hlY2tib2FyZCAodm9pZCkKewoJcHV0cyAoIkJvYXJkOiBIWU1PRFxuIik7CglyZXR1cm4gKDApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBtaXNjZWxsYW5lb3VzIChlYXJseSAtIHdoaWxlIHJ1bm5pbmcgaW4gZmxhc2gpIGluaXRpYWxpc2F0aW9ucy4KICovCgojZGVmaW5lIF9OT1RfVVNFRF8JMHhGRkZGRkZGRgoKdWludCB1cG1iX3RhYmxlW10gPSB7CgkvKiBSZWFkIFNpbmdsZSBCZWF0IChSU1MpIC0gb2Zmc2V0IDB4MDAgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogUmVhZCBCdXJzdCAoUkJTKSAtIG9mZnNldCAweDA4ICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogV3JpdGUgU2luZ2xlIEJlYXQgKFdTUykgLSBvZmZzZXQgMHgxOCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBXcml0ZSBCdXJzdCAoV1NTKSAtIG9mZnNldCAweDIwICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogUmVmcmVzaCBUaW1lciAoUFRTKSAtIG9mZnNldCAweDMwICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBFeGNlcHRpb24gQ29uZGl0aW9uIChFWFMpIC0gb2Zmc2V0IDB4M2MgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8KfTsKCnVpbnQgdXBtY190YWJsZVtdID0gewoJLyogUmVhZCBTaW5nbGUgQmVhdCAoUlNTKSAtIG9mZnNldCAweDAwICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFJlYWQgQnVyc3QgKFJCUykgLSBvZmZzZXQgMHgwOCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFdyaXRlIFNpbmdsZSBCZWF0IChXU1MpIC0gb2Zmc2V0IDB4MTggKi8KCTB4RjBFMDAwMDAsIDB4RjBBMDAwMDAsIDB4MDBBMDAwMDAsIDB4MzBBMDAwMDAsCgkweEYwRjQwMDA3LCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogV3JpdGUgQnVyc3QgKFdTUykgLSBvZmZzZXQgMHgyMCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFJlZnJlc2ggVGltZXIgKFBUUykgLSBvZmZzZXQgMHgzMCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogRXhjZXB0aW9uIENvbmRpdGlvbiAoRVhTKSAtIG9mZnNldCAweDNjICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfCn07CgppbnQKbWlzY19pbml0X2YgKHZvaWQpCnsKCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7Cgl2b2xhdGlsZSBtZW1jdGw4MjYwX3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOwoKCXByaW50ZiAoIlVQTXM6ICAiKTsKCgl1cG1jb25maWcgKFVQTUIsIHVwbWJfdGFibGUsIHNpemVvZiB1cG1iX3RhYmxlIC8gc2l6ZW9mIHVwbWJfdGFibGVbMF0pOwoJbWVtY3RsLT5tZW1jX21ibXIgPSBDRkdfTUJNUjsKCgl1cG1jb25maWcgKFVQTUMsIHVwbWNfdGFibGUsIHNpemVvZiB1cG1jX3RhYmxlIC8gc2l6ZW9mIHVwbWNfdGFibGVbMF0pOwoJbWVtY3RsLT5tZW1jX21jbXIgPSBDRkdfTUNNUjsKCglwcmludGYgKCJjb25maWd1cmVkXG4iKTsKCXJldHVybiAoMCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmxvbmcKaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQp7Cgl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOwoJdm9sYXRpbGUgbWVtY3RsODI2MF90ICptZW1jdGwgPSAmaW1tYXAtPmltX21lbWN0bDsKCXZvbGF0aWxlIHVjaGFyIGMgPSAwLCAqcmFtYWRkciA9ICh1Y2hhciAqKSAoQ0ZHX1NEUkFNX0JBU0UgKyAweDgpOwoJdWxvbmcgcHNkbXIgPSBDRkdfUFNETVI7CglpbnQgaTsKCgkvKgoJICogUXVvdGUgZnJvbSA4MjYwIFVNICgxMC40LjIgU0RSQU0gUG93ZXItT24gSW5pdGlhbGl6YXRpb24sIDEwLTM1KToKCSAqCgkgKiAiQXQgc3lzdGVtIHJlc2V0LCBpbml0aWFsaXphdGlvbiBzb2Z0d2FyZSBtdXN0IHNldCB1cCB0aGUKCSAqICBwcm9ncmFtbWFibGUgcGFyYW1ldGVycyBpbiB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgYmFua3MgcmVnaXN0ZXJzCgkgKiAgKE9SeCwgQlJ4LCBQL0xTRE1SKS4gQWZ0ZXIgYWxsIG1lbW9yeSBwYXJhbWV0ZXJzIGFyZSBjb27eZ3VyZWQsCgkgKiAgc3lzdGVtIHNvZnR3YXJlIHNob3VsZCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UKCSAqICBmb3IgZWFjaCBTRFJBTSBkZXZpY2UuCgkgKgoJICogIDEuIElzc3VlIGEgUFJFQ0hBUkdFLUFMTC1CQU5LUyBjb21tYW5kCgkgKiAgMi4gSXNzdWUgZWlnaHQgQ0JSIFJFRlJFU0ggY29tbWFuZHMKCSAqICAzLiBJc3N1ZSBhIE1PREUtU0VUIGNvbW1hbmQgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZSByZWdpc3RlcgoJICoKCSAqICBUaGUgaW5pdGlhbCBjb21tYW5kcyBhcmUgZXhlY3V0ZWQgYnkgc2V0dGluZyBQL0xTRE1SW09QXSBhbmQKCSAqICBhY2Nlc3NpbmcgdGhlIFNEUkFNIHdpdGggYSBzaW5nbGUtYnl0ZSB0cmFuc2FjdGlvbi4iCgkgKgoJICogVGhlIGFwcHJvcHJpYXRlIEJSeC9PUnggcmVnaXN0ZXJzIGhhdmUgYWxyZWFkeSBiZWVuIHNldCB3aGVuIHdlCgkgKiBnZXQgaGVyZS4gVGhlIFNEUkFNIGNhbiBiZSBhY2Nlc3NlZCBhdCB0aGUgYWRkcmVzcyBDRkdfU0RSQU1fQkFTRS4KCSAqLwoKCW1lbWN0bC0+bWVtY19wc3J0ID0gQ0ZHX1BTUlQ7CgltZW1jdGwtPm1lbWNfbXB0cHIgPSBDRkdfTVBUUFI7CgoJbWVtY3RsLT5tZW1jX3BzZG1yID0gcHNkbXIgfCBQU0RNUl9PUF9QUkVBOwoJKnJhbWFkZHIgPSBjOwoKCW1lbWN0bC0+bWVtY19wc2RtciA9IHBzZG1yIHwgUFNETVJfT1BfQ0JSUjsKCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCgkJKnJhbWFkZHIgPSBjOwoKCW1lbWN0bC0+bWVtY19wc2RtciA9IHBzZG1yIHwgUFNETVJfT1BfTVJXOwoJKnJhbWFkZHIgPSBjOwoKCW1lbWN0bC0+bWVtY19wc2RtciA9IHBzZG1yIHwgUFNETVJfT1BfTk9STSB8IFBTRE1SX1JGRU47CgkqcmFtYWRkciA9IGM7CgoJcmV0dXJuIChDRkdfU0RSQU1fU0laRSA8PCAyMCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogbWlzY2VsbGFuZW91cyBpbml0aWFsaXNhdGlvbnMgYWZ0ZXIgcmVsb2NhdGlvbiBpbnRvIHJhbSAobWlzY19pbml0X3IpICAgICAqLwovKgkJCQkJCQkJCSAgICAgKi8KLyogbG9hZHMgdGhlIGRhdGEgaW4gdGhlIG1haW4gYm9hcmQgYW5kIG1lenphbmluZSBib2FyZCBlZXByb21zIGludG8JICAgICAqLwovKiB0aGUgaHltb2QgY29uZmlndXJhdGlvbiBzdHJ1Y3Qgc3RvcmVkIGluIHRoZSBib2FyZCBpbmZvcm1hdGlvbiBhcmVhLgkgICAgICovCi8qCQkJCQkJCQkJICAgICAqLwovKiBpZiB0aGUgY29udGVudHMgb2YgZWl0aGVyIGVlcHJvbSBpcyBpbnZhbGlkLCBwcm9tcHRzIGZvciBhIHNlcmlhbAkgICAgICovCi8qIG51bWJlciAoYW5kIGFuIGV0aGVybmV0IGFkZHJlc3MgaWYgcmVxdWlyZWQpIHRoZW4gZmV0Y2hlcyBhIGZpbGUJICAgICAqLwovKiBjb250YWluaW5nIGluZm9ybWF0aW9uIHRvIGJlIHN0b3JlZCBpbiB0aGUgZWVwcm9tIGZyb20gdGhlIHRmdHAgc2VydmVyICAgICovCi8qICh0aGUgZmlsZSBuYW1lIGlzIGJhc2VkIG9uIHRoZSBzZXJpYWwgbnVtYmVyIGFuZCBhIGJ1aWx0LWluIHBhdGgpCSAgICAgKi8KCmludApsYXN0X3N0YWdlX2luaXQgKHZvaWQpCnsKCWh5bW9kX2NvbmZfdCAqY3AgPSAmZ2QtPmJkLT5iaV9oeW1vZF9jb25mOwoJaW50IHJjOwoKI2lmZGVmIENPTkZJR19CT09UX1JFVFJZX1RJTUUKCS8qCgkgKiB3ZSB1c2UgdGhlIHJlYWRsaW5lICgpIGZ1bmN0aW9uLCBidXQgd2UgYWxzbyB3YW50CgkgKiBjb21tYW5kIHRpbWVvdXQgZW5hYmxlZAoJICovCglpbml0X2NtZF90aW1lb3V0ICgpOwojZW5kaWYKCgltZW1zZXQgKCh2b2lkICopIGNwLCAwLCBzaXplb2YgKCpjcCkpOwoKCS8qIHNldCB1cCBtYWluIGJvYXJkIGNvbmZpZyBpbmZvICovCgoJcmMgPSBoeW1vZF9lZXByb21fcmVhZCAoMCwgJmNwLT5tYWluLmVlcHJvbSk7CgoJcHV0cyAoIkVFUFJPTTptYWluLi4uIik7CglpZiAocmMgPCAwKQoJCXB1dHMgKCJOT1QgUFJFU0VOVFxuIik7CgllbHNlIGlmIChyYyA9PSAwKQoJCXB1dHMgKCJJTlZBTElEXG4iKTsKCWVsc2UgewoJCWNwLT5tYWluLmVlcHJvbS52YWxpZCA9IDE7CgoJCXByaW50ZiAoIk9LICh2ZXIgJXUpXG4iLCBjcC0+bWFpbi5lZXByb20udmVyKTsKCQloeW1vZF9lZXByb21fcHJpbnQgKCZjcC0+bWFpbi5lZXByb20pOwoKCQkvKgoJCSAqIGhhcmQtd2lyZWQgYXNzdW1wdGlvbiBoZXJlOiBhbGwgaHltb2QgbWFpbiBib2FyZHMgd2lsbCBoYXZlCgkJICogb25lIHhpbGlueCBmcGdhLCB3aXRoIHRoZSBpbnRlcnJ1cHQgbGluZSBjb25uZWN0ZWQgdG8gSVJRMgoJCSAqCgkJICogT25lIGRheSwgdGhpcyBtaWdodCBiZSBiYXNlZCBvbiB0aGUgYm9hcmQgdHlwZQoJCSAqLwoKCQljcC0+bWFpbi54bHhbMF0ubW1hcC5wcm9nLmV4aXN0cyA9IDE7CgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucHJvZy5zaXplID0gRlBHQV9NQUlOX0NGR19TSVpFOwoJCWNwLT5tYWluLnhseFswXS5tbWFwLnByb2cuYmFzZSA9IEZQR0FfTUFJTl9DRkdfQkFTRTsKCgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucmVnLmV4aXN0cyA9IDE7CgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucmVnLnNpemUgPSBGUEdBX01BSU5fUkVHX1NJWkU7CgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucmVnLmJhc2UgPSBGUEdBX01BSU5fUkVHX0JBU0U7CgoJCWNwLT5tYWluLnhseFswXS5tbWFwLnBvcnQuZXhpc3RzID0gMTsKCQljcC0+bWFpbi54bHhbMF0ubW1hcC5wb3J0LnNpemUgPSBGUEdBX01BSU5fUE9SVF9TSVpFOwoJCWNwLT5tYWluLnhseFswXS5tbWFwLnBvcnQuYmFzZSA9IEZQR0FfTUFJTl9QT1JUX0JBU0U7CgoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMucHJvZ19waW4ucG9ydCA9IEZQR0FfTUFJTl9QUk9HX1BPUlQ7CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5wcm9nX3Bpbi5waW4gPSBGUEdBX01BSU5fUFJPR19QSU47CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5wcm9nX3Bpbi5mbGFnID0gMTsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmluaXRfcGluLnBvcnQgPSBGUEdBX01BSU5fSU5JVF9QT1JUOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuaW5pdF9waW4ucGluID0gRlBHQV9NQUlOX0lOSVRfUElOOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuaW5pdF9waW4uZmxhZyA9IDE7CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5kb25lX3Bpbi5wb3J0ID0gRlBHQV9NQUlOX0RPTkVfUE9SVDsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmRvbmVfcGluLnBpbiA9IEZQR0FfTUFJTl9ET05FX1BJTjsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmRvbmVfcGluLmZsYWcgPSAxOwojaWZkZWYgRlBHQV9NQUlOX0VOQUJMRV9QT1JUCgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5lbmFibGVfcGluLnBvcnQgPSBGUEdBX01BSU5fRU5BQkxFX1BPUlQ7CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5lbmFibGVfcGluLnBpbiA9IEZQR0FfTUFJTl9FTkFCTEVfUElOOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuZW5hYmxlX3Bpbi5mbGFnID0gMTsKI2VuZGlmCgoJCWNwLT5tYWluLnhseFswXS5pcnEgPSBGUEdBX01BSU5fSVJROwoJfQoKCS8qIHNldCB1cCBtZXp6YW5pbmUgYm9hcmQgY29uZmlnIGluZm8gKi8KCglyYyA9IGh5bW9kX2VlcHJvbV9yZWFkICgxLCAmY3AtPm1lenouZWVwcm9tKTsKCglwdXRzICgiRUVQUk9NOm1lenouLi4iKTsKCWlmIChyYyA8IDApCgkJcHV0cyAoIk5PVCBQUkVTRU5UXG4iKTsKCWVsc2UgaWYgKHJjID09IDApCgkJcHV0cyAoIklOVkFMSURcbiIpOwoJZWxzZSB7CgkJY3AtPm1haW4uZWVwcm9tLnZhbGlkID0gMTsKCgkJcHJpbnRmICgiT0sgKHZlciAldSlcbiIsIGNwLT5tZXp6LmVlcHJvbS52ZXIpOwoJCWh5bW9kX2VlcHJvbV9wcmludCAoJmNwLT5tZXp6LmVlcHJvbSk7Cgl9CgoJY3AtPmNyYyA9IGNyYzMyICgwLCAodW5zaWduZWQgY2hhciAqKWNwLCBvZmZzZXRvZiAoaHltb2RfY29uZl90LCBjcmMpKTsKCgloeW1vZF9jaGVja19lbnYgKCk7CgoJcmV0dXJuICgwKTsKfQoKI2lmZGVmIENPTkZJR19TSE9XX0FDVElWSVRZCnZvaWQgYm9hcmRfc2hvd19hY3Rpdml0eSAodWxvbmcgdGltZWJhc2UpCnsKI2lmZGVmIENGR19IWU1PRF9EQkxFRFMKCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKCXZvbGF0aWxlIGlvcDgyNjBfdCAqaW9wID0gJmltbXItPmltX2lvcG9ydDsKCXN0YXRpYyBpbnQgc2hpZnQgPSAwOwoKCWlmICgodGltZXN0YW1wICUgQ0ZHX0haKSA9PSAwKSB7CgkJaWYgKCsrc2hpZnQgPiAzKQoJCQlzaGlmdCA9IDA7CgkJaW9wLT5pb3BfcGRhdGQgPQoJCQkJKGlvcC0+aW9wX3BkYXRkICYgfjB4MGYwMDAwMDApIHwgKDEgPDwgKDI0ICsgc2hpZnQpKTsKCX0KI2VuZGlmIC8qIENGR19IWU1PRF9EQkxFRFMgKi8KfQoKdm9pZCBzaG93X2FjdGl2aXR5KGludCBhcmcpCnsKfQojZW5kaWYgLyogQ09ORklHX1NIT1dfQUNUSVZJVFkgKi8K